design: CosmoGenesis wallet UI system + four-tab mockups + glossary

Add the CosmoGenesis design system (extracted from the project's own
website) and the full four-tab IA as live HTML mockups, plus the canonical
UI glossary and the Capacitor build handoff.

- design/cosmo-genesis.css + starfield.ts: tokens (dark spectral sky,
  starfield, parallax, 360deg rotation, acid-glow risk scale), Fraunces +
  JetBrains Mono, mono-for-data rule.
- design/mockups/: Main, Assets hub (MBA|NBA x My/Orbital, My/Market),
  Avalanche (eight-class taxonomy + clickable detail sheets + create
  wizard), Apps (WalletConnect+CashConnect, network switcher, explorers),
  plus Send/Swap/Settings/Activity/Onboarding/Elevation/Asset-detail/Fuse.
- wiki/glossary.md: canonical vocabulary (ASM=Automated Swap Mechanism,
  Orbital, UER, PNV, eight classes, NBA family, risk scale, WC vs CC).
- design/CAPACITOR_HANDOFF.md: file manifest + build prompt for the shell.
- snapshots 0053 (CosmoGenesis four-tab shell) + 0054 (NBA taxonomy
  correction, BCH-logo nav fix, asset-type detail sheets).

.gitignore: add .chipnet-*.json catch-all (covers keys-e/f/g and the
tote/CLOB/oracle/metals test artifacts; superset of the per-file entries).

Leaves the feat/onramp-discover-adr0036 branch's own tracked changes
(onramp, web, shells, decisions.md ADR-0040) untouched.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
walerikus 2026-06-07 00:36:45 +02:00
parent d1bc0f0ae7
commit 87a18adf54
22 changed files with 4223 additions and 0 deletions

49
.gitignore vendored Normal file
View file

@ -0,0 +1,49 @@
node_modules/
dist/
*.log
.env
.env.local
.DS_Store
coverage/
.regtest-data/
wiki/code-map.md
# Chipnet/testnet4 dev wallet — generated by scripts/chipnet-setup.mjs.
# Holds a WIF private key for a testnet-only address. Never commit; never
# fund with real BCH.
.chipnet-keys.json
.chipnet-keys-b.json
.chipnet-keys-c.json
.chipnet-keys-d.json
.chipnet-tokens.json
.chipnet-vulnerable-tokens.json
.chipnet-asm-token.json
.chipnet-asm2-token.json
.chipnet-cap-token.json
.chipnet-t001-token.json
.chipnet-mut-state.json
.chipnet-whitelist-test.json
.chipnet-escalating-test.json
.chipnet-escalating-50pc-test.json
.chipnet-bonding-swap-test.json
.chipnet-escalating-source-swap-test.json
.chipnet-swap-remainder-test.json
.chipnet-denomination-fee-test.json
.chipnet-redeem-safety-test.json
.registry-tokens.json
.deviant/
.chipnet-escrow-test.json
.chipnet-escrow-fee-test.json
.chipnet-escrow-fee-irregular-test.json
.chipnet-escrow-flat-test.json
.chipnet-che-escrow-test.json
.chipnet-che-perside-test.json
.external/
# Catch-all for ALL generated chipnet artifacts & dev key files (keys-e/f/g,
# tote/CLOB/oracle/metals/dra/clob test outputs, etc.). Superset of the
# per-file entries above — these are testnet-only, regenerated by scripts,
# and may hold WIF private keys. Never commit.
.chipnet-*.json

143
design/CAPACITOR_HANDOFF.md Normal file
View file

@ -0,0 +1,143 @@
# Capacitor shell — build handoff
> Paste the **Prompt** (bottom) into the dedicated Capacitor session, or point that session
> at this file. It is self-contained: it names every file to read and the constraints to
> honor. Authored from the 2026-05-25 design session (ADR-0026, snapshot 0053).
---
## Goal
Scaffold the **real Deviant wallet shell**: a **Capacitor + React (Vite, DOM)** app that
renders the four-tab CosmoGenesis IA over the **existing shared TypeScript core**, running
**in-process, client-side, non-custodially** in the WebView. No fork of the core, no
nodejs-mobile, no IPC bridge — this was proven viable in snapshot 0044 (Capacitor GO) via
the noble crypto shim (ADR-0023).
## Runtime / stack (decided — do not re-litigate)
- **Capacitor + React + Vite.** The desktop browser is the same engine class as the
WebView, so build/verify on desktop first; device/Mac only needed for native plugins.
- **Crypto:** the core uses `@bitauth/libauth`; in the bundle it is replaced by the pure-JS
`@noble` shim — see **`src/crypto/README.md`** for the exact Vite/webpack alias snippet.
A working reference spike (Vite + React + the shim, live chipnet broadcast) lives in
**`spike/cap-web/`** — reuse its bundler config; it is otherwise throwaway.
- **One required core fix:** `dist/verify/canonical.js` (D-3) reads contract artifacts via
`readFileSync` at module-init — the only `fs` touchpoint in the import graph. Replace it
with a bundler-friendly JSON `import` (snapshot 0044). Do this in the core, not a shim.
## Files to read (manifest)
**Design system (the look — authoritative):**
- `design/cosmo-genesis.css` — all tokens (sky gradient, starfield, acid `#d6ff3d` + glow
tiers, ink, the **risk scale** `--risk-safe/--risk-warn/--risk-high`), type, glow utils.
- `design/starfield.ts` — the starfield generator (already a TS module — import it).
- `design/README.md` — how to consume; font `<link>` for Fraunces + JetBrains Mono.
**The screens (layout source of truth — port these to React components):**
- `design/mockups/main-tab.html` — Main (BCH front door, portfolio donut, recent feed +
MBA|Token filter, BCH `₿` tab icon).
- `design/mockups/assets-tab.html` — Assets hub (two-level tabs, risk scale rows, Orbital).
- `design/mockups/avalanche-tab.html` — Avalanche (two-column eight-class taxonomy).
- `design/mockups/avalanche-wizard.html` — the Create wizard (live class derivation).
- `design/mockups/apps-tab.html` — Apps (Connected|Discover, network switcher, WC/CC).
**Spec / vocabulary / decisions:**
- `wiki/wallet-ui-design.md` — **§"CosmoGenesis shell — navigation model (v6, current)"** is
the binding IA + the risk reframe. (Older v5 sections are history.)
- `wiki/glossary.md` — canonical UI copy: ASM=Automated Swap Mechanism, Orbital, UER, PNV,
the 8 classes, the risk scale, WalletConnect vs CashConnect.
- `wiki/decisions.md` — **ADR-0026** (this UI), ADR-0008 (no blessed lists), ADR-0011
(two-knob fee), ADR-0023 (crypto shim), ADR-0025 (PNV/denomination, price discipline).
**Core integration points (wire the UI to these — do not reimplement):**
- `src/wallet/runtime.ts` → `connectWallet(...)` assembles a `DeviantWallet`. `src/web/api.ts`
is the request/response surface the UI should mirror.
- `src/wallet/keystore.ts` → the cross-shell `KeyStore` contract. Implement it as a
**Capacitor secure-storage + biometric plugin** (the shell-specific piece).
- `src/wallet/market.ts` → `routeSwap(source, target, providers)` → `asm | routed |
unavailable` — drives the Orbital (ASM) vs Market (routed) split.
- `src/verify/*` + `src/token/classify.ts` + `src/token/assetClass.ts` → the D-1/D-2/D-3
checks + eight-class classifier that feed the **risk scale** and the asset chips.
## IA to implement (from the v6 nav + mockups)
- **Bottom bar:** `Main · Assets · ⟨FAB⟩ · Avalanche · Apps`. One `TabBar` component;
**active tab = acid glow** (the selected indicator). Main's icon is the BCH `₿` mark
**leaning LEFT** (counter-clockwise, ~16°) — TapSwap-style on the tab (green `₿` on a
dark circle + white outline, acid-glow ring when selected); the larger BCH card badge is
green-filled. Use the official `bitcoin-cash-logo-wt.svg` from bitcoincash.org for both.
Central **FAB** opens a sheet: Send / Receive / Scan QR. Use the **official BCH logo**
(simple-icons `bitcoincash`: green disc, bold white B) for the `₿` mark, not a glyph.
The portfolio donut is a **conic ring** (calm by default, soft even glow on hover);
per-family filtering is via the **clickable legend rows** (BCH/MBA/Tokens → shared
`filterFeed(fam)`), which also drives the Recent labels.
- **Main:** BCH balance + fuel card (Rule 4), portfolio donut (BCH teal / MBA acid / Tokens
violet; glow on hover), recent feed with `Recent · MBA · Token · View all` filter.
- **Assets:** two levels — family `Assets | Tokens`, then `My Assets | Orbital Network` /
`My Tokens | Market`. Orbital = directory of all DEAs (registries + on-chain discovery,
no blessed catalog). Market = routed external DEX (Cauldron/TapSwap).
- **Avalanche:** two-column eight-class taxonomy → Create wizard (backing×mint×supply derive
the class live; rate tier MBA-only; two-knob fee; type-`CREATE` review wall).
- **Apps:** `Connected | Discover` sub-tabs, network switcher (Mainnet/Chipnet/Testnet,
Chipnet default), **dual-protocol** (WalletConnect *and* CashConnect, auto-detect from the
URI, one transaction-preview), user-extensible BCH-app directory.
## Hard constraints (do not violate)
1. **MBAs show PNV (`units × backingRate`), never market "price."** Market price is allowed
only on the **Tokens** tab (no-peg assets). (ADR-0025, spec §4.4.)
2. **Risk scale, not Verified/Unverified.** Automated 🟢 canonical / 🟠 risky / 🔴 high-risk
computed from D-1/D-2/D-3. Canonical is calm (class chip only, no badge); only anomalies
are flagged. **Acid glow only ever marks canonical/safe + actions/selection — never a
risky asset.**
3. **No blessed lists** — ships zero default registries, trusted keys, or "recommended"
apps; everything user-added (ADR-0008).
4. **Tier B raw-BCH co-display (D-4/D-5)** and the graduated-friction B-send ladder
(ADR-0013) carry over from `wallet-ui-design.md`.
5. **Non-custodial**, chipnet default during development.
## Suggested structure
```
shells/app/ # Capacitor + Vite + React
vite.config.ts # noble-shim alias (src/crypto/README.md) + node polyfills
capacitor.config.ts
src/
theme/ # import ../../design/cosmo-genesis.css + starfield.ts
core/ # thin client over src/web/api.ts surface → connectWallet
keystore/CapacitorKeyStore # implements src/wallet/keystore.ts (secure storage + biometric)
components/{TabBar, Fab, RiskBadge, AssetRow, Donut, Segmented, Sheet}
screens/{Main, Assets, Avalanche, AvalancheWizard, Apps, Settings}
connect/{walletconnect, cashconnect} # both protocols
```
---
## Prompt (paste into the Capacitor session)
> You are building the production Deviant BCH wallet shell. Read, in this order:
> `design/CAPACITOR_HANDOFF.md` (this file), `wiki/wallet-ui-design.md` §"CosmoGenesis shell
> (v6)", `wiki/glossary.md`, `design/cosmo-genesis.css`, and the five mockups in
> `design/mockups/`. Then read `src/crypto/README.md`, `src/wallet/{runtime,keystore,market}.ts`,
> `src/web/api.ts`, `src/token/{classify,assetClass}.ts`, and skim `spike/cap-web/`.
>
> Scaffold `shells/app/` as a **Capacitor + Vite + React** app that runs the existing core
> **in-process in the WebView** via the noble crypto shim (alias per `src/crypto/README.md`;
> reuse `spike/cap-web/`'s bundler config). First, fix the one `fs` touchpoint:
> `dist/verify/canonical.js` must load artifacts via a bundler-friendly JSON import, not
> `readFileSync`. Verify a chipnet balance fetch + a plain-BCH self-send broadcast works
> from the browser before building screens.
>
> Then port the five mockups to React components on the CosmoGenesis tokens: the four-tab
> bottom bar + FAB, the Assets two-level hub (My Assets | Orbital Network / My Tokens |
> Market), the Avalanche taxonomy + create wizard, and Apps (Connected | Discover, network
> switcher, **WalletConnect + CashConnect**). Wire assets to `routeSwap` and the
> verify/classify modules. Implement `KeyStore` as a Capacitor secure-storage + biometric
> plugin.
>
> Honor the hard constraints: MBAs show **PNV, never price** (price only on Tokens); the
> **risk scale** (🟢 canonical / 🟠 risky / 🔴 high-risk) replaces Verified/Unverified, and
> **acid glow marks only canonical/safe + selection/actions, never a risky asset**; no
> blessed registries/keys/apps (ADR-0008); non-custodial, chipnet default. Build and verify
> on desktop first; flag anything that needs a device/Mac.

70
design/README.md Normal file
View file

@ -0,0 +1,70 @@
# CosmoGenesis — Deviant design system
The project's own named visual language (v0.1), extracted from the project website
(`Knowledgebase/08_historical_drafts/deviant_website.html`) and extended with the
wallet's verification-state semantics.
## Files
| File | What it is |
|---|---|
| `cosmo-genesis.css` | Design tokens (CSS custom properties) + glow utilities + starfield styles + base type. Import once at the shell root. |
| `starfield.ts` | The starfield dot generator (ported verbatim from the website). Call `generateStars(el)` on the `.stars` container. |
## The system in one screen
- **Sky** — dark layered-gradient background (`--sky-deep` `#050810` → `--sky-mid` →
`--sky-rim`) with faint **spectral-aurora** colour tints, fixed attachment. White
twinkling **starfield** over it, with optional **mouse parallax** — call
`enableParallax(starsEl)` from `starfield.ts` (respects `prefers-reduced-motion`).
- **Acid** — lime `#d6ff3d` with three glow tiers (`--acid-glow / -halo / -dim`). It is
the signature accent and is **reserved for VERIFIED / ASM / primary actions** so the
glow never implies safety where there is none.
- **Type** — `Fraunces` (serif) for display/headings/balances; `JetBrains Mono` for all
**numeric and technical data** (sats, BCH, PNV, addresses, token IDs, labels). Use the
`.mono` / `.data` / `.amount` / `.address` classes — they enable tabular figures.
- **Glow utilities** — `.glow-text`, `.glow-box`, `.accent-bar`, `.acid-dot`.
## Verification-state colors (spec §7)
| Token | State | Use |
|---|---|---|
| `--state-verified` (acid) | DEA/PLA/MCA/MTA-Verified, ASM/Orbital | the only place acid glow appears |
| `--state-unverified` (amber) | `MBA-Unverified` (D-1 fail) | suppress PNV, disable Orbital |
| `--state-warning` (red) | `Warning — Underbacked` (D-2 fail) | per-UTXO peg-deficit |
| `--state-neutral` (muted) | Tier B `Unverified definition` | user-rooted trust |
## Fonts
Load in the shell `<head>`:
```html
<link href="https://fonts.googleapis.com/css2?family=Fraunces:opsz,wght@9..144,300;9..144,400;9..144,500;9..144,600&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet">
```
## Mockups (`mockups/`)
Navigable CosmoGenesis mockups — shared bottom bar (Main · Assets · **△** Avalanche · Apps)
+ central FAB across screens. Class detail sheets render the code as acid-coloured initial
capitals (**P**ermissionless **T**oken **U**nlimited → PTU). Taxonomy per ADR-0027 / ADR-0028.
| File | Screen |
|---|---|
| `main-tab.html` | Main — BCH fuel card, portfolio donut (BCH / MBA / NBA), activity feed |
| `assets-tab.html` | Assets hub — MBA \| NBA × My/Orbital · My/Market · automated risk scale |
| `avalanche-tab.html` | Avalanche — eight-class matrix + clickable per-class & family detail sheets |
| `avalanche-wizard.html` | Create asset — full **6-step** wizard + type-`CREATE` review wall |
| `apps-tab.html` | Apps — Connected \| Discover, WalletConnect + CashConnect, network switcher |
| `send-flow.html` | Send / Receive / Scan (FAB) — D-4/D-5 raw-BCH co-display, ADR-0013 friction ladder |
| `swap-flow.html` | Orbital swap — builder → quote → result, persistent path indicator (ASM) |
| `settings.html` | Settings — security (friction thresholds), Privacy/CashFusion, network, empty-default registries (ADR-0008) |
| `asset-detail.html` | Spectrum asset pane — 7 regions, PNV + raw-BCH, action row, rate & backing |
| `elevation.html` | Elevation B→A — pre-flight integrity panel (T-002 poisoning guard) |
| `activity.html` | Activity — filterable list + underbacked-receipt (T-001 victim) detail |
| `onboarding.html` | Onboarding — Welcome → BCH-fuel concept → seed → network (no tab bar) |
## Provenance
Naming/copy that pairs with these tokens lives in [`../wiki/glossary.md`](../wiki/glossary.md).
The information architecture these styles dress lives in
[`../wiki/wallet-ui-design.md`](../wiki/wallet-ui-design.md).

235
design/cosmo-genesis.css Normal file
View file

@ -0,0 +1,235 @@
/* ============================================================================
CosmoGenesis — Deviant wallet design system (v0.1)
The project's own named visual language, extracted faithfully from
Knowledgebase/08_historical_drafts/deviant_website.html and extended with the
verification-state semantics the wallet needs (spec §7, wiki/wallet-ui-design.md).
Consume from any shell (web / Capacitor / Electron). Import once at the root:
import './design/cosmo-genesis.css';
Pair with the starfield generator in design/starfield.ts.
Fonts (load in <head>):
Fraunces (opsz 9..144, wght 300..600) + JetBrains Mono (wght 400,500)
https://fonts.googleapis.com/css2?family=Fraunces:opsz,wght@9..144,300;9..144,400;9..144,500;9..144,600&family=JetBrains+Mono:wght@400;500&display=swap
============================================================================ */
:root {
/* ---- The sky (backgrounds & surfaces) ------------------------------- */
--sky-deep: #02040a; /* app background, deepest */
--sky-mid: #060912; /* raised surfaces / cards */
--sky-rim: #0c1220; /* card edges / elevated panels */
--sky-cove: #070d1a; /* gradient accent (bottom-left) */
/* Semantic surface aliases (use these in components) */
--bg: var(--sky-deep);
--surface-1: var(--sky-mid);
--surface-2: var(--sky-rim);
--border: rgba(255, 255, 255, 0.06);
--border-strong: rgba(255, 255, 255, 0.12);
/* ---- Starfield ------------------------------------------------------ */
--star-faint: rgba(255, 255, 255, 0.22);
--star-mid: rgba(255, 255, 255, 0.38);
--star-bright: rgba(255, 255, 255, 0.58);
/* ---- Ink (text) ----------------------------------------------------- */
--ink-soft: #b8c2d4;
--ink: #d6dde9;
--ink-bright: #f1f4fa;
--muted: #6a7488;
/* ---- Acid (the signature accent) ------------------------------------ */
--acid: #d6ff3d; /* CTAs, Orbital/ASM, DEA-Verified */
--acid-glow: rgba(214, 255, 61, 0.55);
--acid-halo: rgba(214, 255, 61, 0.22);
--acid-dim: rgba(214, 255, 61, 0.08);
/* ---- Automated risk scale (traffic-light; spec §7 D-1/D-2 → tier) ----- */
/* The wallet classifies every asset automatically; the user never sets it.
Green = canonical/standard (safe) · orange = risky · red = high risk
(e.g. issuer free-minted to self and sells it as a "backed" currency —
the T-001 fake-backing pattern; D-2 catches the missing backing). */
--risk-safe: var(--acid); /* canonical contract (D-1) + fully backed (D-2) */
--risk-safe-glow: var(--acid-glow);
--risk-warn: #ff9f1c; /* risky: non-standard / uncertain backing */
--risk-high: #ff4d4d; /* high risk: fake-backed / underbacked (T-001) */
--risk-neutral: var(--muted); /* informational (e.g. Tier B from a known source) */
--rust-deep: #6b2a1c; /* original website token, retained */
/* legacy aliases (pre-reframe names) — kept until docs migrate fully */
--state-verified: var(--risk-safe);
--state-verified-glow: var(--risk-safe-glow);
--state-unverified: var(--risk-warn);
--state-warning: var(--risk-high);
--state-neutral: var(--risk-neutral);
/* ---- Typography ----------------------------------------------------- */
--font-display: 'Fraunces', Georgia, serif; /* headings, balances, display */
--font-mono: 'JetBrains Mono', ui-monospace, 'SF Mono', monospace;
/* RULE: all numeric/technical data — sats, BCH, PNV, addresses, token IDs,
the D-4 raw-BCH co-display, labels — render in --font-mono. */
/* ---- Motion --------------------------------------------------------- */
--ease-out: cubic-bezier(0.16, 1, 0.3, 1);
}
/* ---- Base ------------------------------------------------------------- */
* { box-sizing: border-box; margin: 0; padding: 0; }
html, body {
background: var(--sky-deep);
color: var(--ink);
font-family: var(--font-display);
font-weight: 400;
font-feature-settings: "ss01", "ss02";
font-synthesis: none;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
min-height: 100vh;
overflow-x: hidden;
}
/* The sky — layered radial gradients, fixed so it doesn't scroll with content */
body {
background: var(--sky-deep); /* deep base stays constant — only the aurora drifts */
position: relative;
}
/* Slowly-rotating sky: aurora + vignette sweep through a full 360° (~200s), so
different areas darken and brighten over time. Oversized so corners never show;
sits behind the starfield (z-index 0) and content (z-index 1). */
body::before {
content: "";
position: fixed;
top: 50%; left: 50%;
width: 160vmax; height: 160vmax;
margin: -80vmax 0 0 -80vmax;
z-index: -1;
pointer-events: none;
background:
radial-gradient(ellipse 26% 22% at 62% 40%, rgba(127,140,255,.11) 0%, transparent 55%), /* violet */
radial-gradient(ellipse 24% 20% at 40% 60%, rgba(10,193,142,.09) 0%, transparent 55%), /* teal */
radial-gradient(ellipse 20% 18% at 52% 50%, rgba(214,255,61,.05) 0%, transparent 50%), /* acid */
radial-gradient(ellipse 22% 18% at 60% 57%, rgba(120,90,200,.07) 0%, transparent 52%), /* indigo */
radial-gradient(ellipse 30% 26% at 47% 42%, var(--sky-rim) 0%, transparent 55%),
radial-gradient(ellipse 26% 22% at 60% 60%, var(--sky-mid) 0%, transparent 50%),
radial-gradient(ellipse 28% 24% at 40% 58%, var(--sky-cove) 0%, transparent 52%);
animation: sky-rotate 200s linear infinite;
}
@keyframes sky-rotate { from { transform: rotate(0deg); } to { transform: rotate(360deg); } }
@media (prefers-reduced-motion: reduce) { body::before { animation: none; } }
/* Monospace utility for all data/numeric content */
.mono,
.data,
.amount,
.address,
.token-id {
font-family: var(--font-mono);
font-feature-settings: "tnum"; /* tabular figures so columns align */
}
/* ---- Starfield (populate .stars via design/starfield.ts) -------------- */
.stars {
position: fixed;
inset: -48px; /* slightly larger than viewport so mouse-parallax never reveals an edge */
pointer-events: none;
z-index: 0;
transition: transform 0.25s ease-out;
will-change: transform;
}
.star {
position: absolute;
background: #fff;
border-radius: 50%;
box-shadow: 0 0 3px rgba(255, 255, 255, 0.55); /* subtle glow → more visible */
animation: twinkle var(--twinkle-duration, 12s) ease-in-out infinite;
animation-delay: var(--twinkle-delay, 0s);
}
@keyframes twinkle {
0%, 100% { opacity: 0.35; }
50% { opacity: 0.85; }
}
/* App content sits above the starfield */
.app, .container { position: relative; z-index: 1; }
/* ---- Glow utilities (the CosmoGenesis signature) ---------------------- */
/* Acid luminescence on text (the "deviation" glow) */
.glow-text {
color: var(--acid);
text-shadow:
0 0 4px var(--acid-glow),
0 0 14px var(--acid-halo),
0 0 32px var(--acid-dim);
}
/* Acid luminescence on a box/element (e.g. primary button, active nav) */
.glow-box {
box-shadow:
0 0 6px var(--acid-glow),
0 0 14px var(--acid-halo);
}
/* Glowing accent bar on the left edge (callouts, the active item, emphasis) */
.accent-bar {
position: relative;
padding-left: 24px;
}
.accent-bar::before {
content: "";
position: absolute;
left: 0; top: 6px; bottom: 6px;
width: 2px;
background: var(--acid);
box-shadow: 0 0 6px var(--acid-glow), 0 0 14px var(--acid-halo);
}
/* The wordmark's glowing acid dot (Deviant•) — reusable as a "live" indicator */
.acid-dot::after {
content: "";
display: inline-block;
width: 5px; height: 5px;
margin-left: 7px;
vertical-align: middle;
transform: translateY(-2px);
background: var(--acid);
border-radius: 50%;
box-shadow: 0 0 6px var(--acid-glow), 0 0 14px var(--acid-halo);
}
/* ---- Primary action ---------------------------------------------------- */
.btn-primary {
font-family: var(--font-mono);
font-size: 12px;
letter-spacing: 0.12em;
text-transform: uppercase;
color: var(--sky-deep);
background: var(--acid);
border: 0;
border-radius: 10px;
padding: 14px 20px;
cursor: pointer;
box-shadow: 0 0 16px var(--acid-halo);
transition: transform 0.4s var(--ease-out), box-shadow 0.4s var(--ease-out);
}
.btn-primary:hover { transform: translateY(-2px); box-shadow: 0 0 24px var(--acid-glow); }
/* ---- Mono labels (nav, chips, section labels) ------------------------- */
.label-mono {
font-family: var(--font-mono);
font-size: 10px;
letter-spacing: 0.22em;
text-transform: uppercase;
color: var(--muted);
}
/* ---- Accessibility ---------------------------------------------------- */
@media (prefers-reduced-motion: reduce) {
.star { animation: none; opacity: 0.4; }
.btn-primary { transition: none; }
}

13
design/index.html Normal file
View file

@ -0,0 +1,13 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<!-- CosmoGenesis mockup gallery entry. Opens the current mockup directly so the
preview screenshot lands on it. Add more mockups under mockups/ over time. -->
<meta http-equiv="refresh" content="0; url=mockups/assets-tab.html">
<title>Deviant · CosmoGenesis mockups</title>
</head>
<body>
<p><a href="mockups/assets-tab.html">Assets tab mockup →</a></p>
</body>
</html>

View file

@ -0,0 +1,130 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Deviant · Activity · CosmoGenesis mockup</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Fraunces:opsz,wght@9..144,300;9..144,400;9..144,500;9..144,600&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet">
<link href="../cosmo-genesis.css" rel="stylesheet">
<style>
body { display:flex; justify-content:center; padding:28px 0; }
.phone { position:relative; z-index:1; width:392px; min-height:840px; background: linear-gradient(180deg, rgba(19,26,42,.55), rgba(10,15,28,.55)); border:1px solid var(--border); border-radius:30px; padding:22px 18px 92px; backdrop-filter: blur(2px); overflow:hidden; }
.scroll { max-height:740px; overflow-y:auto; margin:0 -4px; padding:0 4px; } .scroll::-webkit-scrollbar { width:0; }
.view { display:none; } .view.active { display:block; }
.flow-head { display:flex; align-items:center; gap:12px; margin-bottom:14px; }
.back { font-size:20px; color:var(--ink-soft); cursor:pointer; background:0; border:0; }
.flow-title { font-family:var(--font-display); font-weight:500; font-size:22px; color:var(--ink-bright); }
/* filters */
.filters { display:flex; gap:7px; overflow-x:auto; margin-bottom:14px; padding-bottom:2px; }
.filters::-webkit-scrollbar { height:0; }
.fchip { flex:none; font-family:var(--font-mono); font-size:9px; letter-spacing:.08em; text-transform:uppercase; padding:7px 11px; border-radius:9px; border:1px solid var(--border-strong); background:transparent; color:var(--muted); cursor:pointer; }
.fchip.on { color:var(--acid); border-color:rgba(214,255,61,.45); text-shadow:0 0 6px var(--acid-halo); }
.act { display:flex; align-items:center; gap:12px; padding:13px 4px; border-bottom:1px solid var(--border); cursor:pointer; }
.act .ico { width:32px; height:32px; flex:none; border-radius:9px; display:grid; place-items:center; background:var(--surface-1); color:var(--ink-soft); font-size:14px; }
.act .a-title { font-family:var(--font-display); font-size:14px; color:var(--ink); }
.act .a-sub { font-family:var(--font-mono); font-size:9px; color:var(--muted); margin-top:2px; }
.act .a-amt { margin-left:auto; font-family:var(--font-mono); font-size:12px; color:var(--ink-bright); text-align:right; }
.act .a-amt.in { color:#0ac18e; }
.flag { font-family:var(--font-mono); font-size:8px; letter-spacing:.06em; text-transform:uppercase; color:var(--risk-high); border:1px solid rgba(255,77,77,.4); border-radius:5px; padding:2px 5px; display:inline-block; margin-top:3px; }
/* underbacked detail */
.det-head { font-family:var(--font-display); font-weight:500; font-size:19px; color:var(--ink-bright); margin-bottom:4px; }
.det-sub { font-family:var(--font-mono); font-size:10px; color:var(--risk-high); margin-bottom:16px; }
.deficit { background:rgba(255,77,77,.07); border:1px solid rgba(255,77,77,.3); border-radius:14px; padding:15px; margin-bottom:14px; }
.deficit .drow { display:flex; justify-content:space-between; padding:7px 0; font-family:var(--font-mono); font-size:12px; }
.deficit .drow .k { color:var(--ink-soft); } .deficit .drow .v { color:var(--ink-bright); }
.deficit .drow.bad .v { color:var(--risk-high); }
.deficit .drow.recover { border-top:1px solid rgba(255,77,77,.25); margin-top:4px; padding-top:11px; }
.deficit .drow.recover .v { color:#0ac18e; }
.t001 { font-family:var(--font-mono); font-size:9px; color:var(--risk-high); line-height:1.6; margin-bottom:16px; }
.sec-label { font-family:var(--font-mono); font-size:9px; letter-spacing:.2em; text-transform:uppercase; color:var(--muted); margin:4px 2px 9px; }
.act-foot { display:flex; flex-direction:column; gap:9px; }
.afbtn { font-family:var(--font-mono); font-size:10px; letter-spacing:.08em; text-transform:uppercase; padding:13px; border-radius:11px; background:transparent; color:var(--ink-soft); border:1px solid var(--border-strong); cursor:pointer; text-align:center; }
.meta { font-family:var(--font-mono); font-size:10px; color:var(--muted); margin-top:14px; line-height:1.7; }
.meta .lk { color:var(--acid); }
.tabbar { position:absolute; left:0; right:0; bottom:0; display:flex; justify-content:space-around; align-items:center; padding:14px 10px 18px; border-top:1px solid var(--border); background: linear-gradient(0deg, var(--sky-deep), transparent); border-radius:0 0 30px 30px; }
.tab { display:flex; flex-direction:column; align-items:center; gap:6px; background:0; border:0; cursor:pointer; }
.tab .ico { font-size:17px; color: var(--muted); } .tab .lbl { font-family: var(--font-mono); font-size:8px; letter-spacing:.12em; text-transform:uppercase; color: var(--muted); }
.tab.active .ico { color: var(--acid); } .tab:not(.active) .bch-b { opacity:.6; }
.bch-b { display:inline-grid; place-items:center; line-height:0; border-radius:50%; } .bch-b .bch-logo { width:100%; height:100%; } .bch-b.sm { width:28px; height:28px; }
.fab { position:relative; margin-top:-28px; flex:none; width:58px; height:58px; border-radius:50%; background: var(--acid); color: var(--sky-deep); border:4px solid var(--sky-deep); cursor:pointer; display:grid; place-items:center; font-size:23px; box-shadow: 0 0 18px var(--acid-glow), 0 0 34px var(--acid-halo); }
</style>
</head>
<body>
<div class="stars" aria-hidden="true" id="stars"></div>
<div class="phone">
<!-- LIST -->
<section class="view active" id="v-list">
<div class="scroll">
<div class="flow-head"><div class="flow-title">Activity</div></div>
<div class="filters">
<button class="fchip on">All</button>
<button class="fchip">Received</button>
<button class="fchip">Sent</button>
<button class="fchip">Swap</button>
<button class="fchip">Founder</button>
<button class="fchip">System</button>
<button class="fchip">⚠ Flagged</button>
</div>
<div class="act"><div class="ico">↓</div><div><div class="a-title">Received</div><div class="a-sub">from bchtest:qz9…k4f · 2h ago</div></div><div class="a-amt in">+0.010 BCH</div></div>
<div class="act" data-go="detail"><div class="ico">↓</div><div><div class="a-title">Received MRG</div><div class="a-sub">from bchtest:qr4…9p2 · 6h ago</div><span class="flag">⚠ underbacked</span></div><div class="a-amt">+9,000 MRG</div></div>
<div class="act"><div class="ico">⇄</div><div><div class="a-title">Orbital swap</div><div class="a-sub">50 NOVA → 0.005 BCH · ASM · 1d</div></div><div class="a-amt">atomic</div></div>
<div class="act"><div class="ico">↓</div><div><div class="a-title">Claimed</div><div class="a-sub">Nova reservoir · DEA · 2d</div></div><div class="a-amt in">+120 NOVA</div></div>
<div class="act"><div class="ico">★</div><div><div class="a-title">Avalanche genesis</div><div class="a-sub">Nova · DEA · category 9c2f…a410 · 3d</div></div><div class="a-amt">founder</div></div>
<div class="act"><div class="ico">⚙</div><div><div class="a-title">Definition imported</div><div class="a-sub">ZCoin [B] · 4 rows re-classified · 4d</div></div><div class="a-amt">system</div></div>
<div class="act"><div class="ico">↑</div><div><div class="a-title">Sent</div><div class="a-sub">to bchtest:qp2…7lm · 5d</div></div><div class="a-amt">−5 LMN</div></div>
</div>
</section>
<!-- UNDERBACKED-RECEIPT DETAIL (T-001 victim view) -->
<section class="view" id="v-detail">
<div class="scroll">
<div class="flow-head"><button class="back" data-go="list">←</button><div class="flow-title">Receipt</div></div>
<div class="det-head">Received 9,000 MRG</div>
<div class="det-sub">⚠ High risk — underbacked (T-001 fake-backing)</div>
<div class="deficit">
<div class="drow"><span class="k">Peg requires</span><span class="v">9,000,000 sat</span></div>
<div class="drow bad"><span class="k">UTXO actually carries</span><span class="v">12,000 sat</span></div>
<div class="drow recover"><span class="k">Recoverable (literal BCH)</span><span class="v">12,000 sat only</span></div>
</div>
<div class="t001">This contract claims an MBA backing rate but does not enforce <span style="color:var(--ink-soft)">output[1].value == grossSats</span> — the T-001 signature (V2.7 §7.1). D-2 caught the missing backing; PNV is suppressed. The sender free-minted to self and sold it as "backed." <span style="color:var(--acid)">[ Verification explainer ]</span></div>
<div class="sec-label">Your options</div>
<div class="act-foot">
<button class="afbtn">Exclude from balance</button>
<button class="afbtn">Send back to sender</button>
<button class="afbtn">Move to quarantine address</button>
</div>
<div class="meta">
Sender · bchtest:qr4…9p2<br>
txid · 3b8e…c12a <span class="lk">↗ explorer</span><br>
Verification state recorded at receipt — stays flagged forever.
</div>
</div>
</section>
<nav class="tabbar">
<button class="tab"><span class="ico"><span class="bch-b sm"><svg class="bch-logo" viewBox="0 0 24 24" aria-hidden="true"><circle cx="12" cy="12" r="12" fill="#fff"/><path fill="#0ac18e" d="m10.84 11.22-.688-2.568c.728-.18 2.839-1.051 3.39.506.27 1.682-1.978 1.877-2.702 2.062zm.289 1.313.755 2.829c.868-.228 3.496-.46 3.241-2.351-.433-1.666-3.125-.706-3.996-.478zM24 12c0 6.627-5.373 12-12 12S0 18.627 0 12 5.373 0 12 0s12 5.373 12 12zm-6.341.661c-.183-1.151-1.441-2.095-2.485-2.202.643-.57.969-1.401.57-2.488-.603-1.368-1.989-1.66-3.685-1.377l-.546-2.114-1.285.332.536 2.108c-.338.085-.685.158-1.029.256L9.198 5.08l-1.285.332.545 2.114c-.277.079-2.595.673-2.595.673l.353 1.377s.944-.265.935-.244c.524-.137.771.125.886.372l1.498 5.793c.018.168-.012.454-.372.551.021.012-.935.241-.935.241l.14 1.605s2.296-.588 2.598-.664l.551 2.138 1.285-.332-.551-2.153c.353-.082.697-.168 1.032-.256l.548 2.141 1.285-.332-.551-2.135c1.982-.482 3.38-1.73 3.094-3.64z"/></svg></span></span><span class="lbl">Main</span></button>
<button class="tab"><span class="ico">⬡</span><span class="lbl">Assets</span></button>
<button class="fab" id="fab">⇅</button>
<button class="tab"><span class="ico">△</span><span class="lbl">Avalanche</span></button>
<button class="tab"><span class="ico">⧉</span><span class="lbl">Apps</span></button>
</nav>
</div>
<script>
(function generateStars(){const c=document.getElementById('stars');if(!c)return;const n=window.innerWidth<700?100:180;const f=document.createDocumentFragment();for(let i=0;i<n;i++){const s=document.createElement('div');s.className='star';const r=Math.random();let sz,o,d;if(r<.78){sz=1+Math.random()*.4;o=.18+Math.random()*.22;d=14+Math.random()*8;}else if(r<.95){sz=1.4+Math.random()*.6;o=.32+Math.random()*.22;d=10+Math.random()*6;}else{sz=1.8+Math.random()*.8;o=.45+Math.random()*.25;d=8+Math.random()*5;}s.style.width=sz+'px';s.style.height=sz+'px';s.style.left=Math.random()*100+'%';s.style.top=Math.random()*100+'%';s.style.opacity=o;s.style.setProperty('--twinkle-duration',d+'s');s.style.setProperty('--twinkle-delay',(Math.random()*d)+'s');f.appendChild(s);}c.appendChild(f);})();
function showView(id){document.querySelectorAll('.view').forEach(function(v){v.classList.toggle('active',v.id==='v-'+id);});}
document.querySelectorAll('[data-go]').forEach(function(el){el.addEventListener('click',function(){showView(el.getAttribute('data-go'));});});
document.querySelectorAll('.fchip').forEach(function(f){f.addEventListener('click',function(){document.querySelectorAll('.fchip').forEach(function(x){x.classList.remove('on');});f.classList.add('on');});});
(function(){var map={main:'main-tab.html',assets:'assets-tab.html',avalanche:'avalanche-tab.html',apps:'apps-tab.html'};document.querySelectorAll('.tabbar .tab').forEach(function(t){var el=t.querySelector('.lbl');if(!el)return;var d=map[el.textContent.trim().toLowerCase()];if(d){t.style.cursor='pointer';t.addEventListener('click',function(){location.href=d;});}});})();
</script>
</body>
</html>

View file

@ -0,0 +1,251 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Deviant · Apps · CosmoGenesis mockup</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Fraunces:opsz,wght@9..144,300;9..144,400;9..144,500;9..144,600&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet">
<link href="../cosmo-genesis.css" rel="stylesheet">
<style>
body { display:flex; justify-content:center; padding:28px 0; }
.phone { position:relative; z-index:1; width:392px; min-height:900px; background: linear-gradient(180deg, rgba(19,26,42,.55), rgba(10,15,28,.55)); border:1px solid var(--border); border-radius:30px; padding:22px 18px 92px; backdrop-filter: blur(2px); }
.screen-head { display:flex; align-items:baseline; justify-content:space-between; margin-bottom:18px; }
.screen-title { font-family: var(--font-display); font-weight:500; font-size:27px; color: var(--ink-bright); letter-spacing:-.01em; }
/* sub-tabs */
.segmented { display:flex; gap:6px; margin:2px 2px 16px; padding:4px; background: var(--surface-1); border:1px solid var(--border); border-radius:13px; }
.seg { flex:1; text-align:center; cursor:pointer; border:0; background:transparent; font-family: var(--font-mono); font-size:11px; letter-spacing:.08em; text-transform:uppercase; color: var(--muted); padding:10px 8px; border-radius:9px; transition: color .3s, background .3s; }
.seg.active { color: var(--acid); background: var(--surface-2); text-shadow: 0 0 8px var(--acid-halo); }
.panel.hidden { display:none; }
/* network switcher */
.netbar { display:flex; align-items:center; justify-content:space-between; gap:10px; margin: 0 2px 16px; }
.net-pills { display:flex; gap:7px; }
.net { font-family: var(--font-mono); font-size:10px; letter-spacing:.05em; padding:7px 11px; border-radius:9px; border:1px solid var(--border-strong); background:transparent; color: var(--muted); cursor:pointer; }
.net.active { color: var(--acid); border-color: rgba(214,255,61,.45); text-shadow:0 0 8px var(--acid-halo); }
/* connect hero */
.connect-card { padding:18px; margin-bottom:14px; border-radius:18px; background: var(--surface-1); border:1px solid var(--border); }
.cc-row { display:flex; align-items:center; gap:14px; }
.cc-main { flex:1; min-width:0; }
.cc-title { font-family: var(--font-display); font-weight:500; font-size:18px; color: var(--ink-bright); }
.cc-sub { font-family: var(--font-mono); font-size:10px; color: var(--ink-soft); margin-top:5px; line-height:1.5; }
.btn-acid { flex:none; font-family: var(--font-mono); font-size:11px; letter-spacing:.1em; text-transform:uppercase; padding:13px 16px; border-radius:11px; background: var(--acid); color: var(--sky-deep); border:0; cursor:pointer; box-shadow: 0 0 16px var(--acid-halo); }
.protos { display:flex; gap:8px; margin-top:14px; }
.label-row { display:flex; align-items:center; justify-content:space-between; margin: 20px 4px 11px; }
.cat { margin: 18px 4px 9px; }
/* chips & protocol badges */
.chip { font-family: var(--font-mono); font-size:9px; letter-spacing:.08em; text-transform:uppercase; padding:3px 7px; border-radius:6px; border:1px solid var(--border-strong); color: var(--ink-soft); display:inline-flex; align-items:center; gap:5px; }
.proto.wc { color:#7fb0ff; border-color: rgba(127,176,255,.4); }
.proto.cc { color:#b79bff; border-color: rgba(183,155,255,.4); }
.proto.web { color: var(--muted); }
.live { width:6px; height:6px; border-radius:50%; background: var(--acid); box-shadow:0 0 6px var(--acid-glow); }
/* rows */
.row { display:flex; align-items:center; gap:13px; background: var(--surface-1); border:1px solid var(--border); border-radius:16px; padding:13px 15px; margin-bottom:10px; }
.glyph { width:38px; height:38px; flex:none; border-radius:11px; display:grid; place-items:center; background: var(--surface-2); color: var(--ink-soft); font-family: var(--font-mono); font-size:16px; }
.row-main { flex:1; min-width:0; }
.row-top { display:flex; align-items:center; gap:7px; flex-wrap:wrap; }
.name { font-family: var(--font-display); font-weight:500; font-size:16px; color: var(--ink-bright); }
.row-sub { margin-top:4px; font-family: var(--font-mono); font-size:10px; color: var(--muted); line-height:1.45; }
.mini { flex:none; font-family: var(--font-mono); font-size:10px; letter-spacing:.1em; text-transform:uppercase; padding:8px 13px; border-radius:9px; cursor:pointer; background:transparent; color: var(--ink-soft); border:1px solid var(--border-strong); }
.mini.go { background: var(--acid); color: var(--sky-deep); border-color: var(--acid); box-shadow: 0 0 12px var(--acid-halo); }
.foot-note { font-family: var(--font-mono); font-size:9px; color: var(--muted); line-height:1.5; margin: 16px 4px 0; }
/* bottom bar + fab */
.tabbar { position:absolute; left:0; right:0; bottom:0; display:flex; justify-content:space-around; align-items:center; padding:14px 10px 18px; border-top:1px solid var(--border); background: linear-gradient(0deg, var(--sky-deep), transparent); border-radius:0 0 30px 30px; }
.tab { display:flex; flex-direction:column; align-items:center; gap:6px; background:0; border:0; cursor:pointer; }
.tab .ico { font-size:17px; color: var(--muted); }
.tab .lbl { font-family: var(--font-mono); font-size:8px; letter-spacing:.12em; text-transform:uppercase; color: var(--muted); }
.tab.active .ico { color: var(--acid); text-shadow: 0 0 10px var(--acid-glow); }
.tab.active .lbl { color: var(--ink-bright); }
.bch-b { display:inline-grid; place-items:center; line-height:0; border-radius:50%; }
.bch-b .bch-logo { width:100%; height:100%; display:block; }
.bch-b.sm { width:28px; height:28px; }
.tab:not(.active) .bch-b { opacity:.6; }
.tab.active .bch-b { box-shadow: 0 0 12px var(--acid-glow), 0 0 20px var(--acid-halo); }
.fab { position:relative; margin-top:-28px; flex:none; width:58px; height:58px; border-radius:50%; background: var(--acid); color: var(--sky-deep); border:4px solid var(--sky-deep); cursor:pointer; display:grid; place-items:center; font-size:23px; box-shadow: 0 0 18px var(--acid-glow), 0 0 34px var(--acid-halo); }
</style>
</head>
<body>
<div class="stars" aria-hidden="true" id="stars"></div>
<div class="phone">
<div class="screen-head">
<div class="screen-title">Apps</div>
<div class="label-mono">Connect · Discover</div>
</div>
<!-- Network switcher (wallet-global; also in Settings) -->
<div class="netbar">
<span class="label-mono">Network</span>
<div class="net-pills">
<button class="net">Mainnet</button>
<button class="net active">Chipnet</button>
<button class="net">Testnet</button>
</div>
</div>
<div class="segmented">
<button class="seg active" data-panel="connected">Connected</button>
<button class="seg" data-panel="discover">Discover</button>
</div>
<div id="panel-connected" class="panel">
<!-- Connect hero: both protocols, auto-detected -->
<div class="connect-card">
<div class="cc-row">
<div class="cc-main">
<div class="cc-title">Connect an app</div>
<div class="cc-sub">Scan a QR or paste a session URI — auto-detects the protocol. One transaction preview before you sign.</div>
</div>
<button class="btn-acid">Scan</button>
</div>
<div class="protos">
<span class="chip proto wc">WalletConnect</span>
<span class="chip proto cc">CashConnect</span>
</div>
</div>
<!-- Active connections -->
<div class="label-row"><div class="label-mono">Active sessions</div><div class="label-mono" style="font-size:9px;">2</div></div>
<div class="row">
<div class="glyph">⌬</div>
<div class="row-main">
<div class="row-top"><span class="name">Cauldron</span><span class="chip proto wc">WC</span><span class="chip"><span class="live"></span>Live</span></div>
<div class="row-sub">AMM DEX · connected 2h ago</div>
</div>
<button class="mini">Disconnect</button>
</div>
<div class="row">
<div class="glyph">◐</div>
<div class="row-main">
<div class="row-top"><span class="name">BCH Guru</span><span class="chip proto cc">CC</span><span class="chip"><span class="live"></span>Live</span></div>
<div class="row-sub">Price-prediction game · connected today</div>
</div>
<button class="mini">Disconnect</button>
</div>
</div><!-- /panel-connected -->
<div id="panel-discover" class="panel hidden">
<!-- Discover directory -->
<!-- Trade/DEX (Cauldron / TapSwap / Fex.cash) moved to Assets → NBA → Market (routed ⚠, ADR-0028). Apps is dApp connectivity only. -->
<div class="cat label-mono">DeFi</div>
<div class="row">
<div class="glyph">⛨</div>
<div class="row-main"><div class="row-top"><span class="name">BCH Bull</span><span class="chip proto web">Web</span></div><div class="row-sub">Hedge & leverage (AnyHedge)</div></div>
<button class="mini">Open</button>
</div>
<div class="cat label-mono">Games</div>
<div class="row">
<div class="glyph">◐</div>
<div class="row-main"><div class="row-top"><span class="name">BCH Guru</span><span class="chip proto cc">CC</span></div><div class="row-sub">Price-prediction game (NFTs)</div></div>
<button class="mini go">Connect</button>
</div>
<div class="cat label-mono">Merchant</div>
<div class="row">
<div class="glyph">▦</div>
<div class="row-main"><div class="row-top"><span class="name">Paytaca POS</span><span class="chip proto web">Web</span></div><div class="row-sub">Point-of-sale register for shops</div></div>
<button class="mini">Open</button>
</div>
<div class="cat label-mono">Tools</div>
<div class="row">
<div class="glyph">✸</div>
<div class="row-main"><div class="row-top"><span class="name">Flipstarter</span><span class="chip proto web">Web</span></div><div class="row-sub">Assurance-contract crowdfunding</div></div>
<button class="mini">Open</button>
</div>
<div class="cat label-mono">Explorers</div>
<div class="row">
<div class="glyph">▦</div>
<div class="row-main"><div class="row-top"><span class="name">BCH Block Explorer</span><span class="chip proto web">Web</span></div><div class="row-sub">bchblockexplorer.com · blocks & transactions</div></div>
<button class="mini">Open</button>
</div>
<div class="row">
<div class="glyph">◎</div>
<div class="row-main"><div class="row-top"><span class="name">Token Explorer</span><span class="chip proto web">Web</span></div><div class="row-sub">tokenexplorer.cash · CashTokens</div></div>
<button class="mini">Open</button>
</div>
<div class="row">
<div class="glyph">⬡</div>
<div class="row-main"><div class="row-top"><span class="name">BCH Explorer</span><span class="chip proto web">Web</span></div><div class="row-sub">bchexplorer.cash · blocks, tx & tokens</div></div>
<button class="mini">Open</button>
</div>
<div class="foot-note">Community-built, external apps — shown for convenience. Deviant endorses none and ships no blessed list (ADR-0008); add or remove your own.</div>
</div><!-- /panel-discover -->
<!-- BOTTOM BAR -->
<nav class="tabbar">
<button class="tab"><span class="ico"><span class="bch-b sm"><svg class="bch-logo" viewBox="0 0 24 24" aria-hidden="true"><circle cx="12" cy="12" r="12" fill="#fff"/><path fill="#0ac18e" d="m10.84 11.22-.688-2.568c.728-.18 2.839-1.051 3.39.506.27 1.682-1.978 1.877-2.702 2.062zm.289 1.313.755 2.829c.868-.228 3.496-.46 3.241-2.351-.433-1.666-3.125-.706-3.996-.478zM24 12c0 6.627-5.373 12-12 12S0 18.627 0 12 5.373 0 12 0s12 5.373 12 12zm-6.341.661c-.183-1.151-1.441-2.095-2.485-2.202.643-.57.969-1.401.57-2.488-.603-1.368-1.989-1.66-3.685-1.377l-.546-2.114-1.285.332.536 2.108c-.338.085-.685.158-1.029.256L9.198 5.08l-1.285.332.545 2.114c-.277.079-2.595.673-2.595.673l.353 1.377s.944-.265.935-.244c.524-.137.771.125.886.372l1.498 5.793c.018.168-.012.454-.372.551.021.012-.935.241-.935.241l.14 1.605s2.296-.588 2.598-.664l.551 2.138 1.285-.332-.551-2.153c.353-.082.697-.168 1.032-.256l.548 2.141 1.285-.332-.551-2.135c1.982-.482 3.38-1.73 3.094-3.64z"/></svg></span></span><span class="lbl">Main</span></button>
<button class="tab"><span class="ico">⬡</span><span class="lbl">Assets</span></button>
<button class="fab" id="fab" aria-label="Send, receive, or scan">⇅</button>
<button class="tab"><span class="ico">△</span><span class="lbl">Avalanche</span></button>
<button class="tab active"><span class="ico">⧉</span><span class="lbl">Apps</span></button>
</nav>
</div>
<script>
(function generateStars() {
const c = document.getElementById('stars'); if (!c) return;
const count = window.innerWidth < 700 ? 100 : 180;
const frag = document.createDocumentFragment();
for (let i = 0; i < count; i++) {
const s = document.createElement('div'); s.className = 'star';
const roll = Math.random(); let size, opacity, dur;
if (roll < 0.78) { size = 1 + Math.random()*0.4; opacity = 0.18 + Math.random()*0.22; dur = 14 + Math.random()*8; }
else if (roll < 0.95) { size = 1.4 + Math.random()*0.6; opacity = 0.32 + Math.random()*0.22; dur = 10 + Math.random()*6; }
else { size = 1.8 + Math.random()*0.8; opacity = 0.45 + Math.random()*0.25; dur = 8 + Math.random()*5; }
s.style.width = size+'px'; s.style.height = size+'px';
s.style.left = Math.random()*100+'%'; s.style.top = Math.random()*100+'%';
s.style.opacity = opacity; s.style.setProperty('--twinkle-duration', dur+'s'); s.style.setProperty('--twinkle-delay', (Math.random()*dur)+'s');
frag.appendChild(s);
}
c.appendChild(frag);
})();
// Sub-tab switching: Connected | Discover
document.querySelectorAll('.seg').forEach(function (s) {
s.addEventListener('click', function () {
document.querySelectorAll('.seg').forEach(function (x) { x.classList.remove('active'); });
s.classList.add('active');
var p = s.getAttribute('data-panel');
document.getElementById('panel-connected').classList.toggle('hidden', p !== 'connected');
document.getElementById('panel-discover').classList.toggle('hidden', p !== 'discover');
});
});
// Network switcher
document.querySelectorAll('.net').forEach(function (n) {
n.addEventListener('click', function () {
document.querySelectorAll('.net').forEach(function (x) { x.classList.remove('active'); });
n.classList.add('active');
});
});
// Bottom-bar navigation between mockup screens
(function () {
var map = { main:'main-tab.html', assets:'assets-tab.html', avalanche:'avalanche-tab.html', apps:'apps-tab.html' };
document.querySelectorAll('.tabbar .tab').forEach(function (t) {
var el = t.querySelector('.lbl'); if (!el) return;
var dest = map[el.textContent.trim().toLowerCase()];
if (dest && !t.classList.contains('active')) {
t.style.cursor = 'pointer';
t.addEventListener('click', function () { location.href = dest; });
}
});
var fab = document.getElementById('fab'); if (fab) fab.addEventListener('click', function () { location.href = 'send-flow.html'; });
})();
</script>
</body>
</html>

View file

@ -0,0 +1,147 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Deviant · Asset detail (Spectrum) · CosmoGenesis mockup</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Fraunces:opsz,wght@9..144,300;9..144,400;9..144,500;9..144,600&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet">
<link href="../cosmo-genesis.css" rel="stylesheet">
<style>
body { display:flex; justify-content:center; padding:28px 0; }
.phone { position:relative; z-index:1; width:392px; min-height:840px; background: linear-gradient(180deg, rgba(19,26,42,.55), rgba(10,15,28,.55)); border:1px solid var(--border); border-radius:30px; padding:22px 18px 92px; backdrop-filter: blur(2px); overflow:hidden; }
.scroll { max-height:740px; overflow-y:auto; margin:0 -4px; padding:0 4px; } .scroll::-webkit-scrollbar { width:0; }
.flow-head { display:flex; align-items:center; gap:12px; margin-bottom:18px; }
.back { font-size:20px; color:var(--ink-soft); cursor:pointer; background:0; border:0; line-height:1; }
.menu { margin-left:auto; color:var(--muted); cursor:pointer; font-size:18px; }
/* ① identity */
.ident { display:flex; align-items:center; gap:14px; margin-bottom:16px; }
.ai { width:50px; height:50px; flex:none; border-radius:14px; display:grid; place-items:center; font-family:var(--font-mono); font-size:17px; color:var(--acid); background:var(--surface-2); box-shadow:0 0 16px var(--acid-dim); }
.an { font-family:var(--font-display); font-weight:500; font-size:23px; color:var(--ink-bright); }
.at { font-family:var(--font-mono); font-size:10px; color:var(--muted); margin-top:3px; }
/* ② chips line */
.chips { display:flex; flex-wrap:wrap; gap:7px; margin-bottom:16px; }
.chip { font-family:var(--font-mono); font-size:9px; letter-spacing:.06em; text-transform:uppercase; padding:4px 8px; border-radius:7px; border:1px solid var(--border-strong); color:var(--ink-soft); }
.chip.tier { color:var(--ink-bright); border-color:var(--ink-soft); }
.chip.ver { color:var(--acid); border-color:rgba(214,255,61,.45); text-shadow:0 0 6px var(--acid-halo); }
.chip.sub { color:var(--muted); }
/* ③ value region */
.value { text-align:center; padding:20px; border-radius:18px; background:var(--surface-1); border:1px solid var(--border); margin-bottom:16px; }
.pnv-label { font-family:var(--font-mono); font-size:9px; letter-spacing:.2em; text-transform:uppercase; color:var(--muted); }
.pnv { font-family:var(--font-mono); font-size:30px; color:var(--ink-bright); margin:8px 0 4px; }
.pnv-bch { font-family:var(--font-mono); font-size:12px; color:var(--acid); }
.pnv-raw { font-family:var(--font-mono); font-size:10px; color:var(--muted); margin-top:6px; }
/* ④ actions */
.actions { display:flex; gap:9px; margin-bottom:18px; }
.act-btn { flex:1; text-align:center; font-family:var(--font-mono); font-size:10px; letter-spacing:.08em; text-transform:uppercase; padding:13px 6px; border-radius:12px; cursor:pointer; background:transparent; color:var(--ink-soft); border:1px solid var(--border-strong); }
.act-btn.primary { background:var(--acid); color:var(--sky-deep); border-color:var(--acid); box-shadow:0 0 14px var(--acid-halo); }
.sec-label { font-family:var(--font-mono); font-size:9px; letter-spacing:.2em; text-transform:uppercase; color:var(--muted); margin:18px 2px 9px; }
.card { background:var(--surface-1); border:1px solid var(--border); border-radius:16px; padding:14px 15px; }
.brow { display:flex; justify-content:space-between; padding:8px 0; border-bottom:1px solid var(--border); font-family:var(--font-mono); font-size:11px; }
.brow:last-child { border-bottom:0; }
.brow .k { color:var(--muted); } .brow .v { color:var(--ink); text-align:right; }
/* ⑥ activity */
.act { display:flex; align-items:center; gap:12px; padding:11px 0; border-bottom:1px solid var(--border); }
.act:last-child { border-bottom:0; }
.act .ico { width:30px; height:30px; flex:none; border-radius:9px; display:grid; place-items:center; background:var(--surface-2); color:var(--ink-soft); font-size:13px; }
.act .a-title { font-family:var(--font-display); font-size:13px; color:var(--ink); }
.act .a-sub { font-family:var(--font-mono); font-size:9px; color:var(--muted); margin-top:2px; }
.act .a-amt { margin-left:auto; font-family:var(--font-mono); font-size:11px; color:var(--ink-bright); }
.act .a-amt.in { color:#0ac18e; }
.tabbar { position:absolute; left:0; right:0; bottom:0; display:flex; justify-content:space-around; align-items:center; padding:14px 10px 18px; border-top:1px solid var(--border); background: linear-gradient(0deg, var(--sky-deep), transparent); border-radius:0 0 30px 30px; }
.tab { display:flex; flex-direction:column; align-items:center; gap:6px; background:0; border:0; cursor:pointer; }
.tab .ico { font-size:17px; color: var(--muted); } .tab .lbl { font-family: var(--font-mono); font-size:8px; letter-spacing:.12em; text-transform:uppercase; color: var(--muted); }
.tab.active .ico { color: var(--acid); } .tab:not(.active) .bch-b { opacity:.6; }
.bch-b { display:inline-grid; place-items:center; line-height:0; border-radius:50%; } .bch-b .bch-logo { width:100%; height:100%; } .bch-b.sm { width:28px; height:28px; }
.fab { position:relative; margin-top:-28px; flex:none; width:58px; height:58px; border-radius:50%; background: var(--acid); color: var(--sky-deep); border:4px solid var(--sky-deep); cursor:pointer; display:grid; place-items:center; font-size:23px; box-shadow: 0 0 18px var(--acid-glow), 0 0 34px var(--acid-halo); }
</style>
</head>
<body>
<div class="stars" aria-hidden="true" id="stars"></div>
<div class="phone">
<div class="scroll">
<div class="flow-head">
<button class="back" data-link="assets">←</button>
<span class="menu">⋯</span>
</div>
<!-- ① identity -->
<div class="ident">
<div class="ai">NV</div>
<div><div class="an">Nova</div><div class="at">NOVA · category 9c2f…a410</div></div>
</div>
<!-- ② tier + asset-type + verification -->
<div class="chips">
<span class="chip tier">[A]</span>
<span class="chip">MBA</span>
<span class="chip">permissionless</span>
<span class="chip">unlimited</span>
<span class="chip sub">DEA</span>
<span class="chip ver">DEA-Verified</span>
</div>
<!-- ③ value region — PNV + raw-BCH co-display -->
<div class="value">
<div class="pnv-label">Protocol Net Value</div>
<div class="pnv">120 NOVA</div>
<div class="pnv-bch">PNV ≈ 0.0120 BCH</div>
<div class="pnv-raw">120 × 10,000 sat = 1,200,000 sat backing · inside the FT UTXOs</div>
</div>
<!-- ④ action row -->
<div class="actions">
<div class="act-btn primary">Swap</div>
<div class="act-btn">Send</div>
<div class="act-btn">Receive</div>
<div class="act-btn">Redeem</div>
</div>
<!-- ⑤ rate & backing breakdown -->
<div class="sec-label">Rate &amp; backing</div>
<div class="card">
<div class="brow"><span class="k">Backing rate</span><span class="v">10,000 sat / unit 🔒</span></div>
<div class="brow"><span class="k">Redeem</span><span class="v">P2PKH spend · no fee (§4.4)</span></div>
<div class="brow"><span class="k">Swap path</span><span class="v" style="color:var(--acid)">✓ ASM · counterparty-free</span></div>
<div class="brow"><span class="k">Mint-side fee</span><span class="v">0.5% (cap 2.0% 🔒)</span></div>
</div>
<!-- ⑥ asset-scoped activity -->
<div class="sec-label">Nova activity</div>
<div class="card">
<div class="act"><div class="ico">↓</div><div><div class="a-title">Claimed</div><div class="a-sub">Nova reservoir · DEA · 2d</div></div><div class="a-amt in">+120 NOVA</div></div>
<div class="act"><div class="ico">⇄</div><div><div class="a-title">Orbital swap</div><div class="a-sub">50 NOVA → 0.005 BCH · ASM · 1d</div></div><div class="a-amt">atomic</div></div>
</div>
<!-- ⑦ asset info -->
<div class="sec-label">Asset info</div>
<div class="card">
<div class="brow"><span class="k">Category ID</span><span class="v" style="color:var(--acid)">9c2f…a410 ↗</span></div>
<div class="brow"><span class="k">Founder</span><span class="v">bchtest:qp2…7lm</span></div>
<div class="brow"><span class="k">BCMR metadata</span><span class="v">present ↗</span></div>
</div>
</div>
<nav class="tabbar">
<button class="tab"><span class="ico"><span class="bch-b sm"><svg class="bch-logo" viewBox="0 0 24 24" aria-hidden="true"><circle cx="12" cy="12" r="12" fill="#fff"/><path fill="#0ac18e" d="m10.84 11.22-.688-2.568c.728-.18 2.839-1.051 3.39.506.27 1.682-1.978 1.877-2.702 2.062zm.289 1.313.755 2.829c.868-.228 3.496-.46 3.241-2.351-.433-1.666-3.125-.706-3.996-.478zM24 12c0 6.627-5.373 12-12 12S0 18.627 0 12 5.373 0 12 0s12 5.373 12 12zm-6.341.661c-.183-1.151-1.441-2.095-2.485-2.202.643-.57.969-1.401.57-2.488-.603-1.368-1.989-1.66-3.685-1.377l-.546-2.114-1.285.332.536 2.108c-.338.085-.685.158-1.029.256L9.198 5.08l-1.285.332.545 2.114c-.277.079-2.595.673-2.595.673l.353 1.377s.944-.265.935-.244c.524-.137.771.125.886.372l1.498 5.793c.018.168-.012.454-.372.551.021.012-.935.241-.935.241l.14 1.605s2.296-.588 2.598-.664l.551 2.138 1.285-.332-.551-2.153c.353-.082.697-.168 1.032-.256l.548 2.141 1.285-.332-.551-2.135c1.982-.482 3.38-1.73 3.094-3.64z"/></svg></span></span><span class="lbl">Main</span></button>
<button class="tab active"><span class="ico">⬡</span><span class="lbl">Assets</span></button>
<button class="fab" id="fab">⇅</button>
<button class="tab"><span class="ico">△</span><span class="lbl">Avalanche</span></button>
<button class="tab"><span class="ico">⧉</span><span class="lbl">Apps</span></button>
</nav>
</div>
<script>
(function generateStars(){const c=document.getElementById('stars');if(!c)return;const n=window.innerWidth<700?100:180;const f=document.createDocumentFragment();for(let i=0;i<n;i++){const s=document.createElement('div');s.className='star';const r=Math.random();let sz,o,d;if(r<.78){sz=1+Math.random()*.4;o=.18+Math.random()*.22;d=14+Math.random()*8;}else if(r<.95){sz=1.4+Math.random()*.6;o=.32+Math.random()*.22;d=10+Math.random()*6;}else{sz=1.8+Math.random()*.8;o=.45+Math.random()*.25;d=8+Math.random()*5;}s.style.width=sz+'px';s.style.height=sz+'px';s.style.left=Math.random()*100+'%';s.style.top=Math.random()*100+'%';s.style.opacity=o;s.style.setProperty('--twinkle-duration',d+'s');s.style.setProperty('--twinkle-delay',(Math.random()*d)+'s');f.appendChild(s);}c.appendChild(f);})();
(function(){var map={main:'main-tab.html',assets:'assets-tab.html',avalanche:'avalanche-tab.html',apps:'apps-tab.html'};document.querySelectorAll('.tabbar .tab').forEach(function(t){var el=t.querySelector('.lbl');if(!el)return;var d=map[el.textContent.trim().toLowerCase()];if(d){t.style.cursor='pointer';t.addEventListener('click',function(){location.href=d;});}});document.querySelectorAll('[data-link="assets"]').forEach(function(b){b.addEventListener('click',function(){location.href='assets-tab.html';});});})();
</script>
</body>
</html>

View file

@ -0,0 +1,467 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Deviant · Assets hub · CosmoGenesis mockup</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Fraunces:opsz,wght@9..144,300;9..144,400;9..144,500;9..144,600&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet">
<link href="../cosmo-genesis.css" rel="stylesheet">
<style>
/* ---- Mockup-only layout (the real shell will be React components) ---- */
body { display: flex; justify-content: center; padding: 28px 0; }
.phone {
position: relative; z-index: 1;
width: 392px; min-height: 840px;
background: linear-gradient(180deg, rgba(19,26,42,.55), rgba(10,15,28,.55));
border: 1px solid var(--border); border-radius: 30px;
padding: 22px 18px 92px; backdrop-filter: blur(2px);
}
.screen-head { display:flex; align-items:baseline; justify-content:space-between; margin-bottom: 18px; }
.screen-title { font-family: var(--font-display); font-weight: 500; font-size: 27px; color: var(--ink-bright); letter-spacing:-.01em; }
/* level 1 — family tabs (underline style) */
.toptabs { display:flex; margin: 2px 2px 16px; border-bottom:1px solid var(--border); }
.toptab {
flex:1; min-width:0; background:0; border:0; cursor:pointer; padding: 2px 6px 12px;
position:relative; transition: color .3s; display:flex; flex-direction:column; gap:5px; text-align:left;
}
.toptab + .toptab { border-left:1px solid var(--border); padding-left:16px; }
.tt-code { font-family: var(--font-display); font-weight:500; font-size:18px; color: var(--muted); line-height:1; }
.tt-desc { font-family: var(--font-mono); font-size:8px; letter-spacing:.06em; text-transform:uppercase; color: var(--muted); line-height:1.35; }
.toptab.active .tt-code { color: var(--ink-bright); }
.toptab.active .tt-desc { color: var(--ink-soft); }
.toptab.active::after {
content:""; position:absolute; left:0; right:0; bottom:-1px; height:2px;
background: var(--acid); box-shadow: 0 0 8px var(--acid-glow), 0 0 14px var(--acid-halo);
}
.family.hidden { display:none; }
/* level 2 — sub tabs (segmented pills) */
.segmented {
display:flex; gap:6px; margin: 2px 2px 16px; padding:4px;
background: var(--surface-1); border:1px solid var(--border); border-radius: 13px;
}
.seg {
flex:1; text-align:center; cursor:pointer; border:0; background:transparent;
font-family: var(--font-mono); font-size: 11px; letter-spacing:.08em; text-transform:uppercase;
color: var(--muted); padding: 10px 8px; border-radius: 9px; transition: color .3s, background .3s;
}
.seg.active { color: var(--acid); background: var(--surface-2); text-shadow: 0 0 8px var(--acid-halo); }
.panel.hidden { display:none; }
.hint { font-family: var(--font-mono); font-size: 9px; letter-spacing:.06em; color: var(--muted); margin: 0 4px 12px; line-height:1.5; }
/* rows */
.row { display:flex; align-items:center; gap:13px; background: var(--surface-1); border:1px solid var(--border); border-radius:16px; padding:14px 15px; margin-bottom:10px; }
.glyph { width:38px; height:38px; flex:none; border-radius:11px; display:grid; place-items:center; background: var(--surface-2); color: var(--ink-soft); font-family: var(--font-mono); font-size:15px; }
.row-main { flex:1; min-width:0; }
.row-top { display:flex; align-items:center; gap:7px; flex-wrap:wrap; }
.name { font-family: var(--font-display); font-weight:500; font-size:16px; color: var(--ink-bright); }
.row-sub { margin-top:5px; font-family: var(--font-mono); font-size:11px; color: var(--ink-soft); line-height:1.45; }
.row-sub .pnv { color: var(--ink); } .row-sub .lit { color: var(--muted); }
.row-right { text-align:right; font-family: var(--font-mono); display:flex; flex-direction:column; align-items:flex-end; gap:4px; }
.units { font-size:15px; color: var(--ink-bright); }
.px { font-size:11px; color: var(--ink-soft); margin-top:4px; }
/* chips */
.chip { font-family: var(--font-mono); font-size:9px; letter-spacing:.08em; text-transform:uppercase; padding:3px 7px; border-radius:6px; border:1px solid var(--border-strong); color: var(--ink-soft); }
.chip.tier { color: var(--ink-bright); }
/* automated risk scale: green safe · orange risky · red high-risk */
.chip.safe { color: var(--risk-safe); border-color: rgba(214,255,61,.35); text-shadow: 0 0 6px var(--acid-halo); }
.chip.risk { color: var(--risk-warn); border-color: rgba(255,159,28,.45); }
.chip.high { color: var(--risk-high); border-color: rgba(255,77,77,.5); text-shadow: 0 0 8px rgba(255,77,77,.3); }
.chip.routed { color: var(--risk-warn); border-color: rgba(255,159,28,.3); }
.row.risky { border-left: 2px solid var(--risk-warn); }
.row.high { border-color: rgba(255,77,77,.4); border-left: 2px solid var(--risk-high); background: rgba(255,77,77,.05); }
/* directory / market action buttons */
.acts { display:flex; gap:8px; flex:none; }
.mini { font-family: var(--font-mono); font-size:10px; letter-spacing:.1em; text-transform:uppercase; padding:8px 12px; border-radius:9px; cursor:pointer; background:transparent; color: var(--ink-soft); border:1px solid var(--border-strong); }
.mini.go { background: var(--acid); color: var(--sky-deep); border-color: var(--acid); box-shadow: 0 0 14px var(--acid-halo); }
.dir-sub { margin-top:5px; font-family: var(--font-mono); font-size:11px; color: var(--muted); }
.dir-sub b { color: var(--acid); font-weight:500; text-shadow: 0 0 6px var(--acid-halo); }
/* bottom tab bar */
.tabbar { position:absolute; left:0; right:0; bottom:0; display:flex; justify-content:space-around; align-items:center; padding:14px 10px 18px; border-top:1px solid var(--border); background: linear-gradient(0deg, var(--sky-deep), transparent); border-radius:0 0 30px 30px; }
.tab { display:flex; flex-direction:column; align-items:center; gap:6px; background:0; border:0; cursor:pointer; }
.tab .ico { font-size:17px; color: var(--muted); }
.tab .lbl { font-family: var(--font-mono); font-size:8px; letter-spacing:.12em; text-transform:uppercase; color: var(--muted); }
.tab.active .ico { color: var(--acid); text-shadow: 0 0 10px var(--acid-glow); }
.tab.active .lbl { color: var(--ink-bright); }
.bch-b { display:inline-grid; place-items:center; line-height:0; border-radius:50%; }
.bch-b .bch-logo { width:100%; height:100%; display:block; }
.bch-b.sm { width:28px; height:28px; }
.tab:not(.active) .bch-b { opacity:.6; }
.tab.active .bch-b { box-shadow: 0 0 12px var(--acid-glow), 0 0 20px var(--acid-halo); }
/* central quick-action button (Send / Receive / Scan) */
.fab {
position: relative; margin-top: -28px; flex:none;
width: 58px; height: 58px; border-radius: 50%;
background: var(--acid); color: var(--sky-deep);
border: 4px solid var(--sky-deep); cursor: pointer;
display:grid; place-items:center; font-size: 23px; line-height:1;
box-shadow: 0 0 18px var(--acid-glow), 0 0 34px var(--acid-halo);
transition: transform .35s var(--ease-out);
}
.fab:hover { transform: translateY(-2px) scale(1.04); }
/* quick-action sheet */
.sheet-backdrop { position:absolute; inset:0; z-index:5; border-radius:30px; display:none; background: rgba(5,8,16,.62); backdrop-filter: blur(2px); }
.sheet-backdrop.open { display:block; }
.sheet { position:absolute; left:14px; right:14px; bottom:98px; z-index:6; display:none; padding:10px; border-radius:18px; background: var(--surface-2); border:1px solid var(--border-strong); box-shadow: 0 -8px 40px rgba(0,0,0,.5); }
.sheet.open { display:block; }
.sheet-item { display:flex; align-items:center; gap:14px; padding:13px; border-radius:12px; cursor:pointer; }
.sheet-item:hover { background: var(--surface-1); }
.sheet-ico { width:40px; height:40px; flex:none; border-radius:11px; display:grid; place-items:center; background: var(--surface-1); color: var(--acid); font-size:18px; text-shadow: 0 0 8px var(--acid-halo); }
.sheet-label { font-family: var(--font-display); font-weight:500; font-size:16px; color: var(--ink-bright); }
.sheet-sub { font-family: var(--font-mono); font-size:10px; color: var(--muted); margin-top:2px; }
</style>
</head>
<body>
<div class="stars" aria-hidden="true" id="stars"></div>
<div class="phone">
<div class="screen-head">
<div class="screen-title">Portfolio</div>
<div class="label-mono" id="subhead">Tier A · MBA</div>
</div>
<!-- LEVEL 1: family tabs -->
<div class="toptabs">
<button class="toptab active" data-family="assets">
<span class="tt-code">MBA</span>
<span class="tt-desc">Mathematically Backed Assets</span>
</button>
<button class="toptab" data-family="tokens">
<span class="tt-code">NBA</span>
<span class="tt-desc">Non-Backed Assets</span>
</button>
</div>
<!-- ================= ASSETS family (MBA) ================= -->
<div id="family-assets" class="family">
<div class="segmented">
<button class="seg active" data-sub="assets-mine">My Assets</button>
<button class="seg" data-sub="assets-orbital">Orbital Network</button>
</div>
<div id="sub-assets-mine" class="panel">
<div class="row">
<div class="glyph">◇</div>
<div class="row-main">
<div class="row-top"><span class="name">Nova</span><span class="chip tier">A</span><span class="chip">DEA</span></div>
<div class="row-sub"><span class="pnv">PNV 1,200,000 sat</span></div>
</div>
<div class="row-right"><span class="chip safe">Canonical</span><div class="units">120 NOVA</div></div>
</div>
<div class="row">
<div class="glyph">◈</div>
<div class="row-main">
<div class="row-top"><span class="name">Lumen</span><span class="chip tier">A</span><span class="chip">PLA</span></div>
<div class="row-sub"><span class="pnv">PNV 400,000 sat</span></div>
</div>
<div class="row-right"><span class="chip safe">Canonical</span><div class="units">40 LMN</div></div>
</div>
<div class="row">
<div class="glyph">◆</div>
<div class="row-main">
<div class="row-top"><span class="name">Arcane</span><span class="chip tier">A</span><span class="chip">MCA</span></div>
<div class="row-sub"><span class="pnv">PNV 850,000 sat</span></div>
</div>
<div class="row-right"><span class="chip safe">Canonical</span><div class="units">75 ARC</div></div>
</div>
<div class="row risky">
<div class="glyph">△</div>
<div class="row-main">
<div class="row-top"><span class="name">Vega</span><span class="chip tier">A</span></div>
<div class="row-sub"><span class="lit">PNV suppressed</span></div>
</div>
<div class="row-right"><span class="chip risk">⚠ Non-canonical</span><div class="units">15 VGA</div></div>
</div>
<div class="row high">
<div class="glyph">⊘</div>
<div class="row-main">
<div class="row-top"><span class="name">Mirage</span><span class="chip tier">A</span></div>
<div class="row-sub"><span class="lit">Free-mint fraud</span></div>
</div>
<div class="row-right"><span class="chip high">⛔ High risk</span><div class="units">9,000 MRG</div></div>
</div>
</div>
<div id="sub-assets-orbital" class="panel hidden">
<div class="hint">Counterparty-free · all existing DEAs from your registries + on-chain discovery</div>
<div class="row">
<div class="glyph">◇</div>
<div class="row-main"><div class="row-top"><span class="name">Helix</span><span class="chip">DEA</span></div><div class="dir-sub">10,000 sat/unit · UER vs Nova <b>1.00</b></div></div>
<div class="acts"><button class="mini">Swap</button><button class="mini go">Mint</button></div>
</div>
<div class="row">
<div class="glyph">✦</div>
<div class="row-main"><div class="row-top"><span class="name">Pulsar</span><span class="chip">DEA</span></div><div class="dir-sub">100,000 sat/unit · UER vs Nova <b>10.0</b></div></div>
<div class="acts"><button class="mini">Swap</button><button class="mini go">Mint</button></div>
</div>
<div class="row">
<div class="glyph">◌</div>
<div class="row-main"><div class="row-top"><span class="name">Quanta</span><span class="chip">DEA</span></div><div class="dir-sub">1,000 sat/unit · UER vs Nova <b>0.10</b></div></div>
<div class="acts"><button class="mini">Swap</button><button class="mini go">Mint</button></div>
</div>
</div>
</div>
<!-- ================= TOKENS family (no peg) ================= -->
<div id="family-tokens" class="family hidden">
<div class="segmented">
<button class="seg active" data-sub="tokens-mine">My NBA</button>
<button class="seg" data-sub="tokens-market">Market</button>
</div>
<div id="sub-tokens-mine" class="panel">
<div class="row">
<div class="glyph">✸</div>
<div class="row-main">
<div class="row-top"><span class="name">Meridian</span><span class="chip">NBA ·MTU</span></div>
<div class="row-sub"><span class="lit">1,234,000 sat · no peg</span></div>
</div>
<div class="row-right"><div class="units">5,000 MRD</div><div class="px">~ 0.041 BCH</div></div>
</div>
<div class="row">
<div class="glyph">❂</div>
<div class="row-main">
<div class="row-top"><span class="name">FestPass</span><span class="chip">NBA ·MTL</span></div>
<div class="row-sub"><span class="lit">675 sat (dust) · membership</span></div>
</div>
<div class="row-right"><div class="units">1 PASS</div></div>
</div>
<div class="row">
<div class="glyph">◍</div>
<div class="row-main">
<div class="row-top"><span class="name">Doge2</span><span class="chip">NBA ·PTU</span></div>
<div class="row-sub"><span class="lit">67,500 sat · no peg</span></div>
</div>
<div class="row-right"><div class="units">100,000 D2</div><div class="px">~ 0.0007 BCH</div></div>
</div>
</div>
<div id="sub-tokens-market" class="panel hidden">
<!-- DEX selector pills -->
<div class="netbar" style="display:flex; gap:6px; margin:0 2px 14px; flex-wrap:wrap;">
<button class="net active" id="dex-cauldron" style="font-family:var(--font-mono);font-size:10px;letter-spacing:.08em;text-transform:uppercase;padding:7px 13px;border-radius:9px;cursor:pointer;border:1px solid var(--acid);background:rgba(214,255,61,.12);color:var(--acid);text-shadow:0 0 6px var(--acid-halo);">Cauldron</button>
<button class="net" id="dex-tapswap" style="font-family:var(--font-mono);font-size:10px;letter-spacing:.08em;text-transform:uppercase;padding:7px 13px;border-radius:9px;cursor:pointer;border:1px solid var(--border-strong);background:transparent;color:var(--ink-soft);">TapSwap ↗</button>
<button class="net" id="dex-fex" style="font-family:var(--font-mono);font-size:10px;letter-spacing:.08em;text-transform:uppercase;padding:7px 13px;border-radius:9px;cursor:pointer;border:1px solid var(--border-strong);background:transparent;color:var(--ink-soft);">Fex.cash ↗</button>
</div>
<!-- ═══ CAULDRON: live integrated market (indexer.riften.net API) ═══ -->
<div id="market-cauldron">
<!-- Market stats bar -->
<div style="display:flex; gap:10px; margin:0 2px 14px; flex-wrap:wrap;">
<div style="flex:1; min-width:80px; background:var(--surface-1); border:1px solid var(--border); border-radius:10px; padding:9px 11px;">
<div style="font-family:var(--font-mono);font-size:8px;letter-spacing:.1em;text-transform:uppercase;color:var(--muted);margin-bottom:3px;">TVL</div>
<div style="font-family:var(--font-mono);font-size:14px;color:var(--ink-bright);">42.7 BCH</div>
</div>
<div style="flex:1; min-width:80px; background:var(--surface-1); border:1px solid var(--border); border-radius:10px; padding:9px 11px;">
<div style="font-family:var(--font-mono);font-size:8px;letter-spacing:.1em;text-transform:uppercase;color:var(--muted);margin-bottom:3px;">24h Vol</div>
<div style="font-family:var(--font-mono);font-size:14px;color:var(--ink-bright);">3.2 BCH</div>
</div>
<div style="flex:1; min-width:80px; background:var(--surface-1); border:1px solid var(--border); border-radius:10px; padding:9px 11px;">
<div style="font-family:var(--font-mono);font-size:8px;letter-spacing:.1em;text-transform:uppercase;color:var(--muted);margin-bottom:3px;">Pools</div>
<div style="font-family:var(--font-mono);font-size:14px;color:var(--ink-bright);">18</div>
</div>
</div>
<!-- Sort / filter row -->
<div style="display:flex; align-items:center; justify-content:space-between; margin:0 2px 10px;">
<div style="font-family:var(--font-mono);font-size:9px;letter-spacing:.08em;text-transform:uppercase;color:var(--muted);">Top pairs by volume</div>
<button style="font-family:var(--font-mono);font-size:9px;letter-spacing:.06em;color:var(--ink-soft);background:0;border:1px solid var(--border);border-radius:7px;padding:4px 9px;cursor:pointer;">Sort ▾</button>
</div>
<!-- Live pair rows (data from /pool/active + /price/current) -->
<div class="row" data-pair="BCH/FURU">
<div class="glyph" style="background:linear-gradient(135deg,#6c3,#3c6);">🐸</div>
<div class="row-main">
<div class="row-top"><span class="name">FURU / BCH</span><span class="chip safe">Live</span></div>
<div class="row-sub">
<span class="pnv">0.00000142 BCH</span>
<span class="lit" style="margin-left:6px;">+12.4%</span>
</div>
<div style="font-family:var(--font-mono);font-size:9px;color:var(--muted);margin-top:3px;">Vol 1.08 BCH · Liq 8.4 BCH</div>
</div>
<div class="acts"><button class="mini go">Swap</button></div>
</div>
<div class="row" data-pair="BCH/NEXUS">
<div class="glyph">◈</div>
<div class="row-main">
<div class="row-top"><span class="name">NEXUS / BCH</span><span class="chip safe">Live</span></div>
<div class="row-sub">
<span class="pnv">0.0000891 BCH</span>
<span class="lit" style="margin-left:6px;">−3.1%</span>
</div>
<div style="font-family:var(--font-mono);font-size:9px;color:var(--muted);margin-top:3px;">Vol 0.72 BCH · Liq 12.1 BCH</div>
</div>
<div class="acts"><button class="mini go">Swap</button></div>
</div>
<div class="row" data-pair="BCH/CLOWN">
<div class="glyph">🤡</div>
<div class="row-main">
<div class="row-top"><span class="name">CLOWN / BCH</span><span class="chip safe">Live</span></div>
<div class="row-sub">
<span class="pnv">0.00000008 BCH</span>
<span class="lit" style="margin-left:6px;">+41.7%</span>
</div>
<div style="font-family:var(--font-mono);font-size:9px;color:var(--muted);margin-top:3px;">Vol 0.54 BCH · Liq 3.9 BCH</div>
</div>
<div class="acts"><button class="mini go">Swap</button></div>
</div>
<div class="row" data-pair="BCH/CATS">
<div class="glyph">🐱</div>
<div class="row-main">
<div class="row-top"><span class="name">CATS / BCH</span><span class="chip safe">Live</span></div>
<div class="row-sub">
<span class="pnv">0.0000034 BCH</span>
<span class="lit" style="margin-left:6px;">−0.8%</span>
</div>
<div style="font-family:var(--font-mono);font-size:9px;color:var(--muted);margin-top:3px;">Vol 0.31 BCH · Liq 5.6 BCH</div>
</div>
<div class="acts"><button class="mini go">Swap</button></div>
</div>
<div style="text-align:center; margin-top:12px;">
<button style="font-family:var(--font-mono);font-size:10px;letter-spacing:.06em;color:var(--acid);background:0;border:1px solid var(--acid);border-radius:9px;padding:8px 18px;cursor:pointer;text-shadow:0 0 6px var(--acid-halo);">View all 18 pools →</button>
</div>
</div>
<!-- ═══ TAPSWAP: redirect-only (no API) ═══ -->
<div id="market-tapswap" style="display:none;">
<div style="background:var(--surface-1);border:1px solid var(--border);border-radius:14px;padding:20px 16px;text-align:center;">
<div style="font-size:28px;margin-bottom:10px;">🛒</div>
<div style="font-family:var(--font-display);font-weight:500;font-size:16px;color:var(--ink-bright);margin-bottom:6px;">TapSwap Marketplace</div>
<div style="font-family:var(--font-mono);font-size:10px;color:var(--muted);line-height:1.6;margin-bottom:14px;">Peer-to-peer token & NFT listings.<br>Offer-based (not AMM) · no public API yet.</div>
<div style="display:flex;gap:8px;justify-content:center;">
<a href="https://tapswap.cash" target="_blank" style="font-family:var(--font-mono);font-size:10px;letter-spacing:.08em;text-transform:uppercase;padding:9px 16px;border-radius:9px;cursor:pointer;background:var(--acid);color:var(--sky-deep);border:0;text-decoration:none;box-shadow:0 0 14px var(--acid-halo);">Open TapSwap ↗</a>
<button style="font-family:var(--font-mono);font-size:10px;letter-spacing:.08em;text-transform:uppercase;padding:9px 16px;border-radius:9px;cursor:pointer;border:1px solid var(--border-strong);background:transparent;color:var(--ink-soft);">WalletConnect</button>
</div>
</div>
</div>
<!-- ═══ FEX.CASH: redirect-only (no API) ═══ -->
<div id="market-fex" style="display:none;">
<div style="background:var(--surface-1);border:1px solid var(--border);border-radius:14px;padding:20px 16px;text-align:center;">
<div style="font-size:28px;margin-bottom:10px;">⚗️</div>
<div style="font-family:var(--font-display);font-weight:500;font-size:16px;color:var(--ink-bright);margin-bottom:6px;">Fex.cash AMM</div>
<div style="font-family:var(--font-mono);font-size:10px;color:var(--muted);line-height:1.6;margin-bottom:14px;">Constant-product AMM pools.<br>Closed-source contracts · no public API yet.</div>
<div style="display:flex;gap:8px;justify-content:center;">
<a href="https://fex.cash" target="_blank" style="font-family:var(--font-mono);font-size:10px;letter-spacing:.08em;text-transform:uppercase;padding:9px 16px;border-radius:9px;cursor:pointer;background:var(--acid);color:var(--sky-deep);border:0;text-decoration:none;box-shadow:0 0 14px var(--acid-halo);">Open Fex.cash ↗</a>
<button style="font-family:var(--font-mono);font-size:10px;letter-spacing:.08em;text-transform:uppercase;padding:9px 16px;border-radius:9px;cursor:pointer;border:1px solid var(--border-strong);background:transparent;color:var(--ink-soft);">WalletConnect</button>
</div>
</div>
</div>
</div>
</div>
<!-- Quick-action sheet (opened by the central button) -->
<div class="sheet-backdrop" id="backdrop"></div>
<div class="sheet" id="sheet">
<div class="sheet-item"><div class="sheet-ico">↑</div><div><div class="sheet-label">Send</div><div class="sheet-sub">BCH or an asset</div></div></div>
<div class="sheet-item"><div class="sheet-ico">↓</div><div><div class="sheet-label">Receive</div><div class="sheet-sub">Show your address / QR</div></div></div>
<div class="sheet-item"><div class="sheet-ico">▣</div><div><div class="sheet-label">Scan QR</div><div class="sheet-sub">Pay or connect a dApp</div></div></div>
</div>
<!-- BOTTOM BAR: Main · Assets · (action) · Avalanche · Apps -->
<nav class="tabbar">
<button class="tab"><span class="ico"><span class="bch-b sm"><svg class="bch-logo" viewBox="0 0 24 24" aria-hidden="true"><circle cx="12" cy="12" r="12" fill="#fff"/><path fill="#0ac18e" d="m10.84 11.22-.688-2.568c.728-.18 2.839-1.051 3.39.506.27 1.682-1.978 1.877-2.702 2.062zm.289 1.313.755 2.829c.868-.228 3.496-.46 3.241-2.351-.433-1.666-3.125-.706-3.996-.478zM24 12c0 6.627-5.373 12-12 12S0 18.627 0 12 5.373 0 12 0s12 5.373 12 12zm-6.341.661c-.183-1.151-1.441-2.095-2.485-2.202.643-.57.969-1.401.57-2.488-.603-1.368-1.989-1.66-3.685-1.377l-.546-2.114-1.285.332.536 2.108c-.338.085-.685.158-1.029.256L9.198 5.08l-1.285.332.545 2.114c-.277.079-2.595.673-2.595.673l.353 1.377s.944-.265.935-.244c.524-.137.771.125.886.372l1.498 5.793c.018.168-.012.454-.372.551.021.012-.935.241-.935.241l.14 1.605s2.296-.588 2.598-.664l.551 2.138 1.285-.332-.551-2.153c.353-.082.697-.168 1.032-.256l.548 2.141 1.285-.332-.551-2.135c1.982-.482 3.38-1.73 3.094-3.64z"/></svg></span></span><span class="lbl">Main</span></button>
<button class="tab active"><span class="ico">⬡</span><span class="lbl">Assets</span></button>
<button class="fab" id="fab" aria-label="Send, receive, or scan">⇅</button>
<button class="tab"><span class="ico">△</span><span class="lbl">Avalanche</span></button>
<button class="tab"><span class="ico">⧉</span><span class="lbl">Apps</span></button>
</nav>
</div>
<script>
/* Inlined plain-JS starfield (React shell imports design/starfield.ts). */
(function generateStars() {
const c = document.getElementById('stars'); if (!c) return;
const count = window.innerWidth < 700 ? 100 : 180;
const frag = document.createDocumentFragment();
for (let i = 0; i < count; i++) {
const s = document.createElement('div'); s.className = 'star';
const roll = Math.random(); let size, opacity, dur;
if (roll < 0.78) { size = 1 + Math.random()*0.4; opacity = 0.18 + Math.random()*0.22; dur = 14 + Math.random()*8; }
else if (roll < 0.95) { size = 1.4 + Math.random()*0.6; opacity = 0.32 + Math.random()*0.22; dur = 10 + Math.random()*6; }
else { size = 1.8 + Math.random()*0.8; opacity = 0.45 + Math.random()*0.25; dur = 8 + Math.random()*5; }
s.style.width = size+'px'; s.style.height = size+'px';
s.style.left = Math.random()*100+'%'; s.style.top = Math.random()*100+'%';
s.style.opacity = opacity; s.style.setProperty('--twinkle-duration', dur+'s');
s.style.setProperty('--twinkle-delay', (Math.random()*dur)+'s');
frag.appendChild(s);
}
c.appendChild(frag);
})();
const subhead = document.getElementById('subhead');
// LEVEL 1: family switching
document.querySelectorAll('.toptab').forEach(function (t) {
t.addEventListener('click', function () {
document.querySelectorAll('.toptab').forEach(function (x) { x.classList.remove('active'); });
t.classList.add('active');
var fam = t.getAttribute('data-family');
document.getElementById('family-assets').classList.toggle('hidden', fam !== 'assets');
document.getElementById('family-tokens').classList.toggle('hidden', fam !== 'tokens');
subhead.textContent = fam === 'assets' ? 'Tier A · MBA' : 'No peg · market';
});
});
// LEVEL 2: sub-tab switching (scoped to the active family)
document.querySelectorAll('.seg').forEach(function (s) {
s.addEventListener('click', function () {
var fam = s.closest('.family');
fam.querySelectorAll('.seg').forEach(function (x) { x.classList.remove('active'); });
s.classList.add('active');
fam.querySelectorAll('.panel').forEach(function (p) { p.classList.add('hidden'); });
document.getElementById('sub-' + s.getAttribute('data-sub')).classList.remove('hidden');
});
});
// DEX pill switching (Cauldron = integrated, TapSwap/Fex = redirect)
(function () {
var pills = document.querySelectorAll('.netbar .net');
var panels = { cauldron: document.getElementById('market-cauldron'), tapswap: document.getElementById('market-tapswap'), fex: document.getElementById('market-fex') };
var activeStyle = 'font-family:var(--font-mono);font-size:10px;letter-spacing:.08em;text-transform:uppercase;padding:7px 13px;border-radius:9px;cursor:pointer;border:1px solid var(--acid);background:rgba(214,255,61,.12);color:var(--acid);text-shadow:0 0 6px var(--acid-halo);';
var inactiveStyle = 'font-family:var(--font-mono);font-size:10px;letter-spacing:.08em;text-transform:uppercase;padding:7px 13px;border-radius:9px;cursor:pointer;border:1px solid var(--border-strong);background:transparent;color:var(--ink-soft);';
pills.forEach(function (p) {
p.addEventListener('click', function () {
pills.forEach(function (x) { x.style.cssText = inactiveStyle; x.classList.remove('active'); });
p.style.cssText = activeStyle; p.classList.add('active');
var key = p.id.replace('dex-', '');
Object.keys(panels).forEach(function (k) { if (panels[k]) panels[k].style.display = k === key ? 'block' : 'none'; });
});
});
})();
// Central quick-action: Send / Receive / Scan QR
var fab = document.getElementById('fab');
var sheet = document.getElementById('sheet');
var backdrop = document.getElementById('backdrop');
function closeSheet() { sheet.classList.remove('open'); backdrop.classList.remove('open'); }
fab.addEventListener('click', function () { sheet.classList.toggle('open'); backdrop.classList.toggle('open'); });
backdrop.addEventListener('click', closeSheet);
document.querySelectorAll('.sheet-item').forEach(function (i) { i.addEventListener('click', function () { location.href = 'send-flow.html'; }); });
// Bottom-bar navigation between mockup screens
(function () {
var map = { main:'main-tab.html', assets:'assets-tab.html', avalanche:'avalanche-tab.html', apps:'apps-tab.html' };
document.querySelectorAll('.tabbar .tab').forEach(function (t) {
var el = t.querySelector('.lbl'); if (!el) return;
var dest = map[el.textContent.trim().toLowerCase()];
if (dest && !t.classList.contains('active')) {
t.style.cursor = 'pointer';
t.addEventListener('click', function () { location.href = dest; });
}
});
})();
</script>
</body>
</html>

View file

@ -0,0 +1,237 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Deviant · Avalanche · CosmoGenesis mockup</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Fraunces:opsz,wght@9..144,300;9..144,400;9..144,500;9..144,600&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet">
<link href="../cosmo-genesis.css" rel="stylesheet">
<style>
body { display:flex; justify-content:center; padding:28px 0; }
.phone { position:relative; z-index:1; width:392px; min-height:860px; background: linear-gradient(180deg, rgba(19,26,42,.55), rgba(10,15,28,.55)); border:1px solid var(--border); border-radius:30px; padding:22px 18px 92px; backdrop-filter: blur(2px); }
.screen-head { display:flex; align-items:baseline; justify-content:space-between; margin-bottom:18px; }
.screen-title { font-family: var(--font-display); font-weight:500; font-size:27px; color: var(--ink-bright); letter-spacing:-.01em; }
/* Create hero */
.create-card { display:flex; align-items:center; gap:14px; padding:18px; margin-bottom:22px; border-radius:18px;
background: linear-gradient(135deg, rgba(214,255,61,.10), rgba(19,26,42,.4)); border:1px solid rgba(214,255,61,.3); box-shadow: 0 0 26px var(--acid-dim); }
.cc-main { flex:1; min-width:0; }
.cc-title { font-family: var(--font-display); font-weight:500; font-size:19px; color: var(--ink-bright); }
.cc-sub { font-family: var(--font-mono); font-size:10px; color: var(--ink-soft); margin-top:6px; line-height:1.5; }
.btn-acid { flex:none; font-family: var(--font-mono); font-size:11px; letter-spacing:.1em; text-transform:uppercase; padding:13px 16px; border-radius:11px; background: var(--acid); color: var(--sky-deep); border:0; cursor:pointer; box-shadow: 0 0 16px var(--acid-halo); }
.label-row { display:flex; align-items:center; justify-content:space-between; margin: 22px 4px 12px; }
/* purpose presets */
.presets { display:grid; grid-template-columns:1fr 1fr; gap:10px; }
.preset { background: var(--surface-1); border:1px solid var(--border); border-radius:14px; padding:13px; cursor:pointer; transition: border-color .3s, transform .3s; }
.preset:hover { border-color: rgba(214,255,61,.35); transform: translateY(-2px); }
.p-name { font-family: var(--font-display); font-weight:500; font-size:15px; color: var(--ink-bright); }
.p-axes { font-family: var(--font-mono); font-size:9px; color: var(--muted); margin-top:6px; letter-spacing:.03em; line-height:1.4; }
.p-class { margin-top:9px; }
.p-code { font-family: var(--font-mono); font-size:13px; letter-spacing:.12em; color: var(--ink-bright); margin-bottom:7px; }
.tax-group { display:flex; align-items:baseline; gap:9px; margin:22px 4px 12px; }
.tax-group .gname { font-family: var(--font-display); font-weight:500; font-size:15px; color: var(--ink-bright); }
.tax-group .gnote { font-family: var(--font-mono); font-size:9px; letter-spacing:.05em; color: var(--muted); }
.dot { width:7px; height:7px; border-radius:50%; align-self:center; }
.dot.backed { background: var(--acid); box-shadow:0 0 6px var(--acid-glow); }
.dot.nopeg { background: var(--muted); }
/* two-column taxonomy: MBA left, Token right */
.tax-cols { display:grid; grid-template-columns:1fr 1fr; gap:12px; margin-top:6px; }
.col-head { display:flex; align-items:center; gap:7px; margin:14px 2px 3px; cursor:pointer; }
.col-head .info { font-size:11px; color:var(--muted); }
.col-head:hover .gname, .col-head:hover .info { color:var(--acid); }
.col-head .gname { font-family:var(--font-display); font-weight:500; font-size:15px; color:var(--ink-bright); }
.col-note { font-family:var(--font-mono); font-size:8px; letter-spacing:.05em; color:var(--muted); margin:0 2px 11px; }
.tax-col .preset { margin-bottom:10px; min-height:112px; }
/* asset-type detail sheet */
/* contained panel over the taxonomy cards — not full-page */
.detail { position:absolute; left:16px; right:16px; top:204px; bottom:102px; z-index:20; display:none; overflow-y:auto;
padding:18px 18px 20px; border-radius:18px; background: var(--sky-mid);
border:1px solid rgba(214,255,61,.32); box-shadow: 0 14px 44px rgba(0,0,0,.6), 0 0 16px var(--acid-dim); }
.detail.open { display:block; }
.detail-close { position:absolute; top:18px; right:20px; font-size:18px; color:var(--muted); cursor:pointer; }
.detail-code { display:none; }
.detail-name { font-family:var(--font-display); font-weight:500; font-size:23px; color:var(--ink-bright); margin-top:2px; letter-spacing:-.005em; }
.detail-name .cap { color:var(--acid); text-shadow:0 0 8px var(--acid-halo); }
.detail-chips { display:flex; gap:7px; flex-wrap:wrap; margin:14px 0 4px; }
.dchip { font-family:var(--font-mono); font-size:9px; letter-spacing:.06em; text-transform:uppercase; padding:4px 8px; border-radius:7px; border:1px solid var(--border-strong); color:var(--ink-soft); }
.dchip.asm { color:var(--acid); border-color:rgba(214,255,61,.4); text-shadow:0 0 6px var(--acid-halo); }
.detail h4 { font-family:var(--font-mono); font-size:10px; letter-spacing:.18em; text-transform:uppercase; color:var(--muted); margin:20px 0 8px; }
.detail p, .detail li { font-family:var(--font-display); font-weight:300; font-size:14px; color:var(--ink-soft); line-height:1.6; }
.detail ul { margin:0; padding-left:18px; }
/* chips */
.chip { font-family: var(--font-mono); font-size:9px; letter-spacing:.08em; text-transform:uppercase; padding:3px 7px; border-radius:6px; border:1px solid var(--border-strong); color: var(--ink-soft); display:inline-block; }
.chip.cls { color: var(--ink-bright); border-color: rgba(255,255,255,.18); }
.chip.safe { color: var(--risk-safe); border-color: rgba(214,255,61,.35); text-shadow: 0 0 6px var(--acid-halo); }
.chip.warn { color: var(--risk-warn); border-color: rgba(255,159,28,.45); }
/* founder dashboard rows */
.row { display:flex; align-items:center; gap:13px; background: var(--surface-1); border:1px solid var(--border); border-radius:16px; padding:14px 15px; margin-bottom:10px; }
.glyph { width:38px; height:38px; flex:none; border-radius:11px; display:grid; place-items:center; background: var(--surface-2); color: var(--ink-soft); font-family: var(--font-mono); font-size:15px; }
.row-main { flex:1; min-width:0; }
.row-top { display:flex; align-items:center; gap:7px; flex-wrap:wrap; }
.name { font-family: var(--font-display); font-weight:500; font-size:16px; color: var(--ink-bright); }
.row-sub { margin-top:5px; font-family: var(--font-mono); font-size:10px; color: var(--ink-soft); line-height:1.5; }
.row-sub .lock { color: var(--muted); }
.row-state { font-family: var(--font-mono); font-size:9px; letter-spacing:.08em; text-transform:uppercase; text-align:right; }
.row-state.ok { color: var(--risk-safe); text-shadow: 0 0 6px var(--acid-halo); }
.row-state.warn { color: var(--risk-warn); }
/* bottom bar + fab + sheet */
.tabbar { position:absolute; left:0; right:0; bottom:0; display:flex; justify-content:space-around; align-items:center; padding:14px 10px 18px; border-top:1px solid var(--border); background: linear-gradient(0deg, var(--sky-deep), transparent); border-radius:0 0 30px 30px; }
.tab { display:flex; flex-direction:column; align-items:center; gap:6px; background:0; border:0; cursor:pointer; }
.tab .ico { font-size:17px; color: var(--muted); }
.tab .lbl { font-family: var(--font-mono); font-size:8px; letter-spacing:.12em; text-transform:uppercase; color: var(--muted); }
.tab.active .ico { color: var(--acid); text-shadow: 0 0 10px var(--acid-glow); }
.tab.active .lbl { color: var(--ink-bright); }
.bch-b { display:inline-grid; place-items:center; line-height:0; border-radius:50%; }
.bch-b .bch-logo { width:100%; height:100%; display:block; }
.bch-b.sm { width:28px; height:28px; }
.tab:not(.active) .bch-b { opacity:.6; }
.tab.active .bch-b { box-shadow: 0 0 12px var(--acid-glow), 0 0 20px var(--acid-halo); }
.fab { position:relative; margin-top:-28px; flex:none; width:58px; height:58px; border-radius:50%; background: var(--acid); color: var(--sky-deep); border:4px solid var(--sky-deep); cursor:pointer; display:grid; place-items:center; font-size:23px; box-shadow: 0 0 18px var(--acid-glow), 0 0 34px var(--acid-halo); }
</style>
</head>
<body>
<div class="stars" aria-hidden="true" id="stars"></div>
<div class="phone">
<div class="screen-head">
<div class="screen-title">Avalanche</div>
<div class="label-mono">Create · Issue</div>
</div>
<!-- Create hero -->
<div class="create-card">
<div class="cc-main">
<div class="cc-title">Create a new asset</div>
<div class="cc-sub">6 steps · immutable at genesis 🔒<br>no admin · no recall · no backdoor</div>
</div>
<button class="btn-acid">Start</button>
</div>
<!-- Asset taxonomy — MBA (left) vs Token (right) -->
<div class="tax-cols">
<div class="tax-col">
<div class="col-head"><span class="dot backed"></span><span class="gname">MBA</span><span class="info">ⓘ</span></div>
<div class="col-note">Mathematically Backed · fixed rate · PNV floor</div>
<div class="preset" data-class="DEA"><div class="p-code">DEA</div><div class="p-name">Hard-Backed</div><div class="p-axes">permissionless · unlimited</div></div>
<div class="preset" data-class="PLA"><div class="p-code">PLA</div><div class="p-name">Commodity</div><div class="p-axes">permissionless · limited</div></div>
<div class="preset" data-class="MCA"><div class="p-code">MCA</div><div class="p-name">Bond</div><div class="p-axes">managed · unlimited</div></div>
<div class="preset" data-class="MTA"><div class="p-code">MTA</div><div class="p-name">Tranche</div><div class="p-axes">managed · limited</div></div>
</div>
<div class="tax-col">
<div class="col-head"><span class="dot nopeg"></span><span class="gname">NBA</span><span class="info">ⓘ</span></div>
<div class="col-note">Non-Backed · no peg · incl. tokens & PoW coins</div>
<div class="preset" data-class="PTU"><div class="p-code">PTU</div><div class="p-name">Game currency</div><div class="p-axes">permissionless · unlimited</div></div>
<div class="preset" data-class="PTL"><div class="p-code">PTL</div><div class="p-name">Mineable Coin</div><div class="p-axes">permissionless · limited</div></div>
<div class="preset" data-class="MTU"><div class="p-code">MTU</div><div class="p-name">Meme / Tokens</div><div class="p-axes">managed · unlimited</div></div>
<div class="preset" data-class="MTL"><div class="p-code">MTL</div><div class="p-name">NFT / Collectibles</div><div class="p-axes">managed · limited</div></div>
</div>
</div>
<!-- Quick-action sheet -->
<div class="sheet-backdrop" id="backdrop" style="position:absolute;inset:0;z-index:5;border-radius:30px;display:none;background:rgba(5,8,16,.62);backdrop-filter:blur(2px);"></div>
<!-- Asset-type detail sheet -->
<div class="detail" id="detail">
<span class="detail-close" id="detailClose">✕</span>
<div class="detail-code" id="dCode"></div>
<div class="detail-name" id="dName"></div>
<div class="detail-chips" id="dChips"></div>
<h4>What it is</h4>
<p id="dDef"></p>
<h4>Use cases</h4>
<ul id="dUse"></ul>
<h4>Examples / real-world peer</h4>
<p id="dEx"></p>
</div>
<!-- BOTTOM BAR -->
<nav class="tabbar">
<button class="tab"><span class="ico"><span class="bch-b sm"><svg class="bch-logo" viewBox="0 0 24 24" aria-hidden="true"><circle cx="12" cy="12" r="12" fill="#fff"/><path fill="#0ac18e" d="m10.84 11.22-.688-2.568c.728-.18 2.839-1.051 3.39.506.27 1.682-1.978 1.877-2.702 2.062zm.289 1.313.755 2.829c.868-.228 3.496-.46 3.241-2.351-.433-1.666-3.125-.706-3.996-.478zM24 12c0 6.627-5.373 12-12 12S0 18.627 0 12 5.373 0 12 0s12 5.373 12 12zm-6.341.661c-.183-1.151-1.441-2.095-2.485-2.202.643-.57.969-1.401.57-2.488-.603-1.368-1.989-1.66-3.685-1.377l-.546-2.114-1.285.332.536 2.108c-.338.085-.685.158-1.029.256L9.198 5.08l-1.285.332.545 2.114c-.277.079-2.595.673-2.595.673l.353 1.377s.944-.265.935-.244c.524-.137.771.125.886.372l1.498 5.793c.018.168-.012.454-.372.551.021.012-.935.241-.935.241l.14 1.605s2.296-.588 2.598-.664l.551 2.138 1.285-.332-.551-2.153c.353-.082.697-.168 1.032-.256l.548 2.141 1.285-.332-.551-2.135c1.982-.482 3.38-1.73 3.094-3.64z"/></svg></span></span><span class="lbl">Main</span></button>
<button class="tab"><span class="ico">⬡</span><span class="lbl">Assets</span></button>
<button class="fab" id="fab" aria-label="Send, receive, or scan">⇅</button>
<button class="tab active"><span class="ico">△</span><span class="lbl">Avalanche</span></button>
<button class="tab"><span class="ico">⧉</span><span class="lbl">Apps</span></button>
</nav>
</div>
<script>
(function generateStars() {
const c = document.getElementById('stars'); if (!c) return;
const count = window.innerWidth < 700 ? 100 : 180;
const frag = document.createDocumentFragment();
for (let i = 0; i < count; i++) {
const s = document.createElement('div'); s.className = 'star';
const roll = Math.random(); let size, opacity, dur;
if (roll < 0.78) { size = 1 + Math.random()*0.4; opacity = 0.18 + Math.random()*0.22; dur = 14 + Math.random()*8; }
else if (roll < 0.95) { size = 1.4 + Math.random()*0.6; opacity = 0.32 + Math.random()*0.22; dur = 10 + Math.random()*6; }
else { size = 1.8 + Math.random()*0.8; opacity = 0.45 + Math.random()*0.25; dur = 8 + Math.random()*5; }
s.style.width = size+'px'; s.style.height = size+'px';
s.style.left = Math.random()*100+'%'; s.style.top = Math.random()*100+'%';
s.style.opacity = opacity; s.style.setProperty('--twinkle-duration', dur+'s'); s.style.setProperty('--twinkle-delay', (Math.random()*dur)+'s');
frag.appendChild(s);
}
c.appendChild(frag);
})();
// Asset-type detail sheet (click a class card)
var DATA = {
MBA:{n:'Mathematically Backed Assets',chips:['Family','BCH-backed','fixed rate','redeemable'],def:'The backed family. Every unit carries a protocol-enforced backing rate to BCH, set at genesis and immutable — a fixed, redeemable claim on locked BCH. Redemption is the contract itself: no custodian, no off-switch, no institutional layer. This is the strict-enforcement category (Layer 2b).',use:['DEA — hard backed','PLA — capped commodity','MCA — bond (rolling issuance)','MTA — tranche (capped slice)'],ex:'Replaces soft custodial backing (USDT, gold certificates) with a consensus invariant — the category empty in the existing world.'},
NBA:{n:'Non-Backed Assets',chips:['Family','no backing','market-priced'],def:'Casual assets with no backing mechanism — the contract locks no BCH at a fixed rate and there is no protocol redemption. Value is set entirely by the market: exchanges, issuer reputation and traded liquidity. Tokens, memecoins, collectibles and PoW-style coins all live here.',use:['PTU — game currency · non-convertible VC (open-mint, uncapped)','PTL — mineable coin (capped, Bitcoin-style)','MTU — tokens / memecoins (incl. fiat &amp; stablecoins; issuer-minted, uncapped)','MTL — NFT / collectibles (capped, issuer-minted)'],ex:'Conventional tokens whose price is set on exchanges; memecoins; PoW coins.'},
DEA:{n:'Deviant Equilibrium Asset',fam:'MBA',mint:'permissionless',sup:'unlimited',asm:1,asmt:'Orbital / ASM eligible',def:'A counterparty-free backed currency — every unit carries its BCH backing inside its own UTXO, redeemable by your own spend. The contract replaces counterparty, market-maker and liquidity provider at once.',use:['Everyday / platform currencies','Game currencies','Loyalty & rewards points'],ex:'Novel — no traditional peer. Backed directly by BCH held in the unit itself, not by an external market peg or a custodian who could default — arguably the hardest backing any currency has ever carried.'},
PLA:{n:'Permissionless Limited Asset',fam:'MBA',mint:'permissionless',sup:'limited',asm:1,asmt:'Orbital / ASM (until depleted)',def:'Backed like a DEA but with a capped reservoir. Once minted out the ASM goes inert, yet the BCH floor (PNV) stays redeemable forever.',use:['Capped, BCH-backed reserve assets','Backed claims with a hard floor + supply cap','Fixed-supply backed currencies'],ex:'Like a capped certificate backed by a reserve — NOT raw gold/silver themselves (those are unbacked direct value → PTL). PLA shares the permissionless-extraction pattern but adds the BCH redemption floor metal lacks.'},
MCA:{n:'Managed Certificate Asset',fam:'MBA',mint:'managed',sup:'unlimited',asm:0,asmt:'No ASM (managed mint)',def:'Issuer-gated, uncapped issuance with a protocol-enforced BCH floor and redemption — a rolling backed program (bond / reserve-note style). The genuinely-backed instrument the existing world only approximates: every unit is redeemable by consensus, not by trusting an off-chain reserve.',use:['Rolling / perpetual bond programs','Issuer-backed reserve notes','A properly-backed stablecoin (reserves enforced on-chain)'],ex:'Closest peer: a bond program or reserve note. NOT today\'s USDT / USDC — their reserves sit off-chain and unenforced, so by the consensus-backing test those are NBA → MTU.'},
MTA:{n:'Managed Tranche Asset',fam:'MBA',mint:'managed',sup:'limited',asm:0,asmt:'No ASM (managed mint)',def:'Issuer-gated and hard-capped, with a protocol-enforced BCH floor — a single fixed slice (tranche) of backed issuance.',use:['Fixed tranches & structured slices','Notes & bills (T-notes / T-bills — fixed-term, capped)','Numbered backed editions','Closed, capped reserve series'],ex:'A closed-end fund share, an ETF tranche, a fixed bond series, Treasury notes & bills — capped, backed, issuer-gated.'},
PTU:{n:'Permissionless Token Unlimited',fam:'NBA',mint:'permissionless',sup:'unlimited',asm:0,asmt:'No peg · market-priced',def:'A Non-Convertible Virtual Currency — usable only inside one platform / ecosystem and not convertible to real money. Open-mint (tap to mint): anyone mints by spending into the covenant, no exclusive issuer, uncapped, no backing.',use:['In-game currencies earned by play (anyone)','Tap-to-mint / faucet tokens (click to claim)','Open community / play-to-earn currencies','Collateralized-debt stablecoins (MakerDAO / DAI) — permissionless mint; token unbacked (ADR-0033)'],ex:'Currencies anyone earns just by playing or clicking — MMORPG gold (RuneScape GP, WoW gold), arcade redemption tickets, faucet / tap-to-earn tokens. All open to anyone, inflationary (uncapped), and not officially cashable out. The convertible outlier here is a collateralized-debt stablecoin (MakerDAO / DAI): permissionless to mint, but the collateral backs the debt vault, not the token — the token itself is unbacked and market-priced (ADR-0033).'},
PTL:{n:'Permissionless Token Limited',fam:'NBA',mint:'permissionless',sup:'limited',asm:0,asmt:'No peg · market-priced',def:'Open-mint but hard-capped, no backing floor and no exclusive operator — permissionless issuance up to a fixed total; value is market-set.',use:['Capped-supply mined coins (Bitcoin-style)','Tokenised commodities / barter goods — gold, silver (no issuer)','Permissionless capped mint events (no exclusive operator)'],ex:'Bitcoin, gold, silver, barter goods — direct-value Layer-1 assets: mined/extracted by anyone, finite, unbacked. A claim BACKED BY such value (a gold certificate, promissory note) is the backed type → that maps to an MBA, not here.'},
MTU:{n:'Managed Token Unlimited',fam:'NBA',mint:'managed',sup:'unlimited',asm:0,asmt:'No peg · market-priced',def:'Issuer-controlled, uncapped, no protocol backing — a team mints supply exclusively; the default CashToken / ERC-20 shape. Real-world fiat money and "stablecoins" also sit here: the on-chain mint input is ~zero (a tx fee) yet the claim can be worth billions, and whether a bank truly holds the reserves is off-chain and disputable — not consensus-backed.',use:['Issuer-minted memecoins (SHIB / PEPE — the common case)','Project / governance / utility tokens','Fiat money &amp; custodial "stablecoins" — USDC / USDT (backing off-chain, unenforced)'],ex:'Most memecoins and ERC-20 tokens; USDT / USDC and central-bank fiat — value rests on issuer trust, not a redeemable on-chain floor. Collateralized-debt stablecoins (MakerDAO / DAI) are permissionless-mint, so they classify as PTU, not here (ADR-0033).'},
MTL:{n:'Managed Token Limited',fam:'NBA',mint:'managed',sup:'limited',asm:0,asmt:'No peg · market-priced',def:'Issuer-controlled and capped, no backing — a creator mints a fixed supply. For credentials, collections and capped memecoins.',use:['Fixed NFT collections & numbered editions','Collectibles (scarce, creator-dropped)','Event tickets, memberships & credentials','Capped-supply memecoins'],ex:'Concert tickets, membership passes, fixed-supply meme/collectible tokens.'}
};
var detail = document.getElementById('detail');
function openDetail(code) {
var d = DATA[code]; if (!d) return;
document.getElementById('dName').innerHTML = d.n.replace(/[A-Z]/g, function (m) { return '<span class="cap">' + m + '</span>'; });
var chips, asmIdx = -1;
if (d.chips) { chips = d.chips; } else { chips = [d.fam, d.mint, d.sup, d.asmt]; asmIdx = 3; }
document.getElementById('dChips').innerHTML = chips.map(function (c, i) {
return '<span class="dchip' + ((i === asmIdx && d.asm) ? ' asm' : '') + '">' + c + '</span>';
}).join('');
document.getElementById('dDef').textContent = d.def;
document.getElementById('dUse').innerHTML = d.use.map(function (u) { return '<li>' + u + '</li>'; }).join('');
document.getElementById('dEx').textContent = d.ex;
detail.classList.add('open');
}
document.querySelectorAll('.preset[data-class]').forEach(function (p) {
p.addEventListener('click', function () { openDetail(p.getAttribute('data-class')); });
});
document.getElementById('detailClose').addEventListener('click', function () { detail.classList.remove('open'); });
// Family headers (MBA / NBA) → generalized category description
document.querySelectorAll('.col-head').forEach(function (h) {
var g = h.querySelector('.gname'); if (!g) return;
h.addEventListener('click', function () { openDetail(g.textContent.trim()); });
});
// Bottom-bar navigation between mockup screens
(function () {
var map = { main:'main-tab.html', assets:'assets-tab.html', avalanche:'avalanche-tab.html', apps:'apps-tab.html' };
document.querySelectorAll('.tabbar .tab').forEach(function (t) {
var el = t.querySelector('.lbl'); if (!el) return;
var dest = map[el.textContent.trim().toLowerCase()];
if (dest && !t.classList.contains('active')) {
t.style.cursor = 'pointer';
t.addEventListener('click', function () { location.href = dest; });
}
});
var fab = document.getElementById('fab'); if (fab) fab.addEventListener('click', function () { location.href = 'send-flow.html'; });
var start = document.querySelector('.create-card .btn-acid'); if (start) start.addEventListener('click', function () { location.href = 'avalanche-wizard.html'; });
})();
</script>
</body>
</html>

View file

@ -0,0 +1,799 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Deviant · Avalanche Create Wizard · CosmoGenesis mockup</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Fraunces:opsz,wght@9..144,300;9..144,400;9..144,500;9..144,600&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet">
<link href="../cosmo-genesis.css" rel="stylesheet">
<style>
body { display:flex; justify-content:center; padding:28px 0; }
.phone { position:relative; z-index:1; width:392px; min-height:840px; background: linear-gradient(180deg, rgba(19,26,42,.55), rgba(10,15,28,.55)); border:1px solid var(--border); border-radius:30px; padding:22px 18px 96px; backdrop-filter: blur(2px); overflow:hidden; }
.wiz-head { display:flex; align-items:center; justify-content:space-between; margin-bottom:16px; }
.wiz-title { font-family: var(--font-display); font-weight:500; font-size:22px; color: var(--ink-bright); }
.wiz-close { font-size:18px; color: var(--muted); cursor:pointer; }
.stepper { margin-bottom:6px; }
.steps { display:flex; gap:5px; margin-bottom:8px; }
.step { flex:1; height:3px; border-radius:2px; background: var(--surface-2); }
.step.done { background: rgba(214,255,61,.45); }
.step.now { background: var(--acid); box-shadow:0 0 8px var(--acid-halo); }
.step-label { font-family: var(--font-mono); font-size:10px; letter-spacing:.16em; text-transform:uppercase; color: var(--muted); }
.step-label b { color: var(--ink); }
.q { font-family: var(--font-display); font-weight:500; font-size:19px; color: var(--ink-bright); margin: 18px 2px 14px; }
.wstep { display:none; } .wstep.active { display:block; }
/* tier cards (step 1) */
.tier-card { display:flex; align-items:flex-start; gap:14px; padding:18px 16px; border-radius:16px; background:var(--surface-1); border:2px solid var(--border); margin-bottom:12px; cursor:pointer; transition:border-color .25s, box-shadow .25s; }
.tier-card.on { border-color:var(--acid); box-shadow:0 0 18px var(--acid-dim); }
.tier-card .tc-icon { width:44px; height:44px; flex:none; border-radius:12px; display:grid; place-items:center; font-size:20px; }
.tier-card.on .tc-icon { background: rgba(214,255,61,.12); color:var(--acid); text-shadow:0 0 8px var(--acid-halo); }
.tier-card:not(.on) .tc-icon { background:var(--surface-2); color:var(--muted); }
.tc-title { font-family:var(--font-display); font-weight:500; font-size:16px; color:var(--ink-bright); }
.tc-sub { font-family:var(--font-mono); font-size:10px; color:var(--muted); margin-top:4px; line-height:1.5; }
.tc-badge { margin-left:auto; font-family:var(--font-mono); font-size:10px; letter-spacing:.08em; padding:4px 10px; border-radius:7px; flex:none; }
.tier-card.on .tc-badge { color:var(--acid); border:1px solid rgba(214,255,61,.35); text-shadow:0 0 6px var(--acid-halo); }
.tier-card:not(.on) .tc-badge { color:var(--muted); border:1px solid var(--border-strong); }
/* purpose preset cards (step 3 for tier A) */
.pcard { display:flex; align-items:center; gap:12px; padding:13px 14px; border-radius:13px; background:var(--surface-1); border:1px solid var(--border); margin-bottom:9px; cursor:pointer; transition:border-color .2s; }
.pcard.on { border-color:var(--acid); box-shadow:0 0 12px var(--acid-dim); }
.pcard .pi { width:34px; height:34px; flex:none; border-radius:9px; display:grid; place-items:center; font-size:16px; background:var(--surface-2); color:var(--acid); }
.pcard .pt { font-family:var(--font-display); font-weight:500; font-size:14px; color:var(--ink-bright); }
.pcard .ps { font-family:var(--font-mono); font-size:8px; color:var(--muted); margin-top:2px; line-height:1.4; }
.pcard .pd { margin-left:auto; font-family:var(--font-mono); font-size:9px; color:var(--ink-soft); padding:3px 7px; border:1px solid var(--border-strong); border-radius:6px; flex:none; }
/* fields */
.field { margin-bottom:15px; }
.flabel { font-family:var(--font-mono); font-size:10px; letter-spacing:.18em; text-transform:uppercase; color:var(--muted); margin:0 2px 7px; display:flex; gap:6px; align-items:center; }
.input { width:100%; background:var(--surface-1); border:1px solid var(--border-strong); border-radius:11px; padding:12px 13px; color:var(--ink-bright); font-family:var(--font-mono); font-size:13px; box-sizing:border-box; }
.input::placeholder { color:var(--muted); }
.row2 { display:flex; gap:11px; } .row2 .field { flex:1; }
/* parameter toggles */
.axis { margin-bottom:14px; }
.axis-label { display:flex; align-items:center; gap:7px; font-family: var(--font-mono); font-size:10px; letter-spacing:.14em; text-transform:uppercase; color: var(--muted); margin: 0 2px 7px; }
.lock { color: var(--muted); }
.tog { display:flex; gap:6px; padding:4px; background: var(--surface-1); border:1px solid var(--border); border-radius:13px; border-left:3px solid transparent; transition: border-left-color .8s ease, box-shadow .8s ease; overflow:visible; position:relative; }
.opt { flex:1; text-align:center; cursor:pointer; border:0; background:transparent; font-family: var(--font-mono); font-size:11px; letter-spacing:.06em; text-transform:uppercase; color: var(--ink-soft); padding:11px 8px; border-radius:9px; transition: color .8s ease, background .8s ease, box-shadow .8s ease; }
.opt.on { color: var(--sky-deep); }
/* DEA alignment — slow left-edge-only pulse */
@keyframes leftPulse {
0%, 100% { opacity: .5; }
50% { opacity: 1; }
}
.tog .left-glow { position:absolute; left:-2px; top:10%; bottom:10%; width:4px; border-radius:3px; pointer-events:none; transition: opacity .8s ease, background .8s ease, box-shadow .8s ease; }
.tog .left-glow.pulse { animation: leftPulse 3.5s ease-in-out infinite; }
/* divider label */
.or-label { font-family:var(--font-mono); font-size:9px; letter-spacing:.12em; text-transform:uppercase; color:var(--muted); margin:12px 2px 8px; display:flex; align-items:center; gap:10px; }
.or-label::before, .or-label::after { content:''; flex:1; height:1px; background:var(--border); }
.derived { margin:16px 0 0; padding:16px; border-radius:16px; background: linear-gradient(135deg, rgba(214,255,61,.08), rgba(19,26,42,.4)); border:1px solid rgba(214,255,61,.25); }
.d-row { display:flex; align-items:baseline; gap:12px; }
.d-code { font-family: var(--font-mono); font-size:28px; letter-spacing:.06em; color: var(--acid); text-shadow:0 0 14px var(--acid-halo); }
.d-name { font-family: var(--font-display); font-weight:500; font-size:15px; color: var(--ink-bright); }
.d-axes { font-family: var(--font-mono); font-size:10px; color: var(--ink-soft); margin-top:7px; letter-spacing:.04em; }
.d-asm { display:inline-block; margin-top:9px; font-family: var(--font-mono); font-size:9px; letter-spacing:.08em; text-transform:uppercase; padding:4px 9px; border-radius:7px; border:1px solid var(--border-strong); color: var(--ink-soft); }
.d-asm.elig { color: var(--acid); border-color: rgba(214,255,61,.4); text-shadow:0 0 6px var(--acid-halo); }
.d-peer { display:inline-block; margin-top:6px; font-family:var(--font-mono); font-size:10px; letter-spacing:.06em; color:var(--ink-bright); padding:3px 9px; border-radius:7px; background:rgba(214,255,61,.08); border:1px solid rgba(214,255,61,.2); }
.d-detail { margin-top:14px; padding-top:12px; border-top:1px solid rgba(214,255,61,.12); }
.d-def { font-family:var(--font-mono); font-size:10px; color:var(--ink-soft); line-height:1.6; }
.d-uses-label { font-family:var(--font-mono); font-size:10px; letter-spacing:.14em; text-transform:uppercase; color:var(--muted); margin:12px 0 6px; }
.d-uses { margin:0; padding:0 0 0 14px; font-family:var(--font-mono); font-size:10px; color:var(--ink-soft); line-height:1.7; }
.d-uses li { margin-bottom:2px; }
.d-uses li::marker { color:var(--acid); }
.d-ex { margin-top:10px; font-family:var(--font-mono); font-size:10px; color:var(--muted); line-height:1.5; font-style:italic; }
/* rate tier */
.chips { display:flex; flex-wrap:wrap; gap:7px; }
.rchip { font-family: var(--font-mono); font-size:11px; padding:8px 11px; border-radius:9px; border:1px solid var(--border-strong); background:transparent; color: var(--ink-soft); cursor:pointer; }
.rchip.on { color: var(--sky-deep); background: var(--acid); border-color: var(--acid); box-shadow:0 0 10px var(--acid-halo); }
.na-note { padding:16px; border-radius:14px; background:var(--surface-1); border:1px dashed var(--border-strong); font-family:var(--font-mono); font-size:11px; color:var(--muted); line-height:1.6; }
/* sliders */
.slider-wrap { margin-bottom:18px; }
.slider-top { display:flex; justify-content:space-between; font-family:var(--font-mono); font-size:11px; color:var(--ink); margin-bottom:8px; }
.slider-top .val { color:var(--acid); }
input[type=range] { width:100%; accent-color:var(--acid); }
.perm-note { font-family: var(--font-mono); font-size:10px; color: var(--muted); margin: 14px 2px 0; line-height:1.5; }
/* fee toggle overrides — not colored by A3 derive() */
.fee-tog .opt { color: var(--ink-soft); }
.fee-tog .opt.on { background: var(--acid); color: var(--sky-deep); box-shadow: 0 0 12px var(--acid-dim); }
.fee-tog .opt.locked { color: var(--muted); }
/* premium gate */
.opt.locked { opacity:.45; cursor:not-allowed; position:relative; }
.opt.locked:hover { opacity:.55; }
.premium-badge { display:inline-block; font-family:var(--font-mono); font-size:8px; font-weight:700; letter-spacing:1px; padding:2px 6px; border-radius:4px; background:linear-gradient(135deg,#f0c040,#e8a020); color:#1a1a2e; margin-left:6px; vertical-align:middle; text-shadow:none; }
/* escalating fee triggers */
.fee-tog { margin-bottom:4px; }
.esc-triggers { display:flex; flex-direction:column; gap:8px; margin-bottom:14px; }
.esc-trig { display:flex; align-items:flex-start; gap:10px; padding:10px 12px; border-radius:12px; background:var(--surface-1); border:1px solid var(--border); cursor:pointer; transition:border-color .3s, box-shadow .3s; }
.esc-trig.on { border-color:var(--acid); box-shadow:0 0 12px var(--acid-dim); }
.esc-trig .trig-icon { font-size:16px; flex:none; width:24px; text-align:center; color:var(--muted); transition:color .3s; }
.esc-trig.on .trig-icon { color:var(--acid); text-shadow:0 0 8px var(--acid-halo); }
.esc-trig .trig-name { font-family:var(--font-body); font-size:12px; font-weight:600; color:var(--ink); }
.esc-trig .trig-desc { display:block; font-family:var(--font-mono); font-size:10px; color:var(--muted); line-height:1.4; margin-top:2px; }
.trig-params { margin-top:12px; }
.esc-formula { font-family:var(--font-mono); font-size:10px; color:var(--acid); background:rgba(214,255,61,.06); border:1px solid rgba(214,255,61,.15); border-radius:8px; padding:8px 12px; margin-top:4px; letter-spacing:.3px; }
/* review wall */
.warn-banner { display:flex; gap:10px; padding:13px 14px; border-radius:13px; background:rgba(240,192,64,.07); border:1px solid rgba(240,192,64,.3); font-family:var(--font-mono); font-size:10px; color:#f0c040; line-height:1.5; margin-bottom:14px; }
.warn-banner.info { background:rgba(214,255,61,.04); border-color:rgba(214,255,61,.2); color:var(--ink-soft); }
.rev-row { display:flex; justify-content:space-between; gap:12px; padding:10px 2px; border-bottom:1px solid var(--border); font-family:var(--font-mono); font-size:11px; }
.rev-row .k { color:var(--muted); display:flex; gap:6px; align-items:center; } .rev-row .v { color:var(--ink); text-align:right; }
.mark { font-size:10px; } .mark.lock { color:var(--risk-warn); } .mark.edit { color:#0ac18e; }
.confirm-field { margin-top:16px; }
.wiz-foot { position:absolute; left:0; right:0; bottom:0; display:flex; gap:12px; padding:16px 18px 22px; border-top:1px solid var(--border); background: linear-gradient(0deg, var(--sky-deep), transparent); border-radius:0 0 30px 30px; }
.btn-ghost { flex:1; font-family: var(--font-mono); font-size:11px; letter-spacing:.1em; text-transform:uppercase; padding:14px; border-radius:11px; background:transparent; color: var(--ink-soft); border:1px solid var(--border-strong); cursor:pointer; }
.btn-acid { flex:2; font-family: var(--font-mono); font-size:11px; letter-spacing:.1em; text-transform:uppercase; padding:14px; border-radius:11px; background: var(--acid); color: var(--sky-deep); border:0; cursor:pointer; box-shadow:0 0 16px var(--acid-halo); }
.btn-acid.disabled { background:var(--surface-2); color:var(--muted); box-shadow:none; cursor:not-allowed; }
</style>
</head>
<body>
<div class="stars" aria-hidden="true" id="stars"></div>
<div class="phone">
<div class="wiz-head">
<div class="wiz-title">Create asset</div>
<div class="wiz-close">✕</div>
</div>
<div class="stepper">
<div class="steps" id="bars"></div>
<div class="step-label" id="stepLabel"></div>
</div>
<!-- ═══════════════════════════════════════════════════════ -->
<!-- STEP 1 — TIER (shared by both flows) -->
<!-- ═══════════════════════════════════════════════════════ -->
<section class="wstep active" data-step="1">
<div class="q">Choose your tier</div>
<div class="tier-card on" data-tier="A">
<div class="tc-icon">⬡</div>
<div>
<div class="tc-title">Tier A · Chain-enforced</div>
<div class="tc-sub">Native CashTokens asset validated by miners.<br>Immutable rules, on-chain backing, global visibility.</div>
</div>
<div class="tc-badge">6 STEPS</div>
</div>
<div class="tier-card" data-tier="B">
<div class="tc-icon">✎</div>
<div>
<div class="tc-title">Tier B · Experiment</div>
<div class="tc-sub">Wallet-convention only, unverified by default.<br>For closed groups, personal testing, prototyping.</div>
</div>
<div class="tc-badge">4 STEPS</div>
</div>
<div class="perm-note">Tier is locked at genesis and can never be changed. A Tier B asset cannot be elevated to Tier A later — you would create a new Tier A asset and migrate.</div>
</section>
<!-- ═══════════════════════════════════════════════════════ -->
<!-- TIER A: STEP 2 — IDENTITY -->
<!-- ═══════════════════════════════════════════════════════ -->
<section class="wstep" data-step="A2">
<div class="q">Identity &amp; metadata</div>
<div class="row2">
<div class="field"><span class="flabel">Name</span><input class="input" value="Nova"></div>
<div class="field"><span class="flabel">Ticker</span><input class="input" value="NOVA"></div>
</div>
<div class="field"><span class="flabel">Description</span><input class="input" value="Counterparty-free platform currency"></div>
<div class="perm-note">Name and ticker are published on-chain via BCMR metadata. Choose carefully — they represent your asset to every wallet that displays it.</div>
</section>
<!-- ═══════════════════════════════════════════════════════ -->
<!-- TIER A: STEP 3 — ASSET TYPE (presets + toggles) -->
<!-- ═══════════════════════════════════════════════════════ -->
<section class="wstep" data-step="A3">
<div class="q">Asset type</div>
<!-- Axis toggles -->
<div class="axis">
<div class="axis-label">Backing <span class="lock">🔒</span></div>
<div class="tog" data-axis="backing">
<button class="opt on" data-v="mba">MBA · backed</button>
<button class="opt" data-v="token">NBA · no peg</button>
</div>
</div>
<div class="axis">
<div class="axis-label">Mint rule <span class="lock">🔒</span></div>
<div class="tog" data-axis="mint">
<button class="opt on" data-v="permissionless">Permissionless</button>
<button class="opt" data-v="managed">Managed</button>
</div>
</div>
<div class="axis">
<div class="axis-label">Supply <span class="lock">🔒</span></div>
<div class="tog" data-axis="supply">
<button class="opt on" data-v="unlimited">Unlimited</button>
<button class="opt" data-v="limited">Limited</button>
</div>
</div>
<!-- Derived class — full detail panel -->
<div class="derived">
<div class="d-row"><span class="d-code" id="dCode">DEA</span><span class="d-name" id="dName">Deviant Equilibrium Asset</span></div>
<div class="d-peer" id="dPeer">Hard-Backed</div>
<div class="d-axes" id="dAxes">permissionless · fixed rate · unlimited</div>
<div class="d-asm elig" id="dAsm">✦ Orbital / ASM eligible</div>
<div class="d-detail" id="dDetail">
<div class="d-def" id="dDef"></div>
<div class="d-uses-label">Use cases</div>
<ul class="d-uses" id="dUses"></ul>
<div class="d-ex" id="dExWiz"></div>
</div>
</div>
</section>
<!-- ═══════════════════════════════════════════════════════ -->
<!-- TIER A: STEP 4 — RATE TIER -->
<!-- ═══════════════════════════════════════════════════════ -->
<section class="wstep" data-step="A4">
<div class="q">Backing rate</div>
<div id="rateBox">
<div class="axis-label">Sats per unit <span class="lock">🔒</span></div>
<div class="chips">
<button class="rchip">1,000</button>
<button class="rchip on">10,000</button>
<button class="rchip">100,000</button>
<button class="rchip">1,000,000</button>
<button class="rchip">10,000,000</button>
<button class="rchip">100,000,000</button>
<button class="rchip">1 BCH</button>
</div>
<div class="perm-note">Seven fixed tiers (ALLOWED_RATE_TIERS). Sub-1,000 is structurally impossible at the dust limit (V2.7 §5.3). At 10,000 sat/unit a 0.5% mint fee ≈ 50 sat per unit.</div>
</div>
<div class="na-note" id="rateNA" style="display:none">NBA assets carry <b>no backing rate</b> — value is market-set, no peg, no PNV floor. This step is skipped for non-backed types.</div>
</section>
<!-- ═══════════════════════════════════════════════════════ -->
<!-- TIER A: STEP 5 — FOUNDER FEE -->
<!-- ═══════════════════════════════════════════════════════ -->
<section class="wstep" data-step="A5">
<div class="q">Founder fee</div>
<!-- Fee mode toggle -->
<div class="tog fee-tog" data-axis="feeMode">
<button class="opt on" data-v="flat">Flat</button>
<button class="opt locked" data-v="escalating" disabled>Escalating <span class="premium-badge">PRO</span></button>
</div>
<!-- ── Flat fee panel ── -->
<div id="feePanelFlat">
<div class="slider-wrap" style="margin-top:14px">
<div class="slider-top"><span>feeRate <span class="mark lock">🔒</span></span><span class="val" id="feeVal">0.5%</span></div>
<input type="range" id="feeSlider" min="0" max="5" value="0.5" step="0.1">
</div>
</div>
<!-- ── Escalating fee panel ── -->
<div id="feePanelEsc" style="display:none">
<div class="slider-wrap" style="margin-top:14px">
<div class="slider-top"><span>baseFee <span class="mark lock">🔒</span></span><span class="val" id="escBaseVal">0.1%</span></div>
<input type="range" id="escBaseSlider" min="0" max="3" value="0.1" step="0.1">
</div>
<div class="slider-wrap">
<div class="slider-top"><span>maxFee cap <span class="mark lock">🔒</span></span><span class="val" id="escCapVal">5.0%</span></div>
<input type="range" id="escCapSlider" min="0.5" max="5" value="5" step="0.1">
</div>
<!-- Trigger selector -->
<div class="flabel" style="margin-bottom:8px">Escalation trigger <span class="mark lock">🔒</span></div>
<div class="esc-triggers">
<label class="esc-trig on" data-t="supply">
<span class="trig-icon">◈</span>
<span class="trig-name">Supply-based</span>
<span class="trig-desc">Fee rises as more tokens are minted from the reservoir</span>
</label>
<label class="esc-trig" data-t="txcount">
<span class="trig-icon">⧫</span>
<span class="trig-name">Tx-count</span>
<span class="trig-desc">Fee steps up every N mint transactions</span>
</label>
<label class="esc-trig" data-t="blockheight">
<span class="trig-icon">▥</span>
<span class="trig-name">Block height</span>
<span class="trig-desc">Fee grows linearly with elapsed blocks since genesis</span>
</label>
</div>
<!-- Trigger-specific params -->
<div id="trigSupply" class="trig-params">
<div class="slider-wrap">
<div class="slider-top"><span>feeIncrement per 1 M tokens <span class="mark lock">🔒</span></span><span class="val" id="escSupplyStepVal">+0.1%</span></div>
<input type="range" id="escSupplyStep" min="0.01" max="1" value="0.1" step="0.01">
</div>
<div class="esc-formula">fee = 0.1% + (issued ÷ 1M) × 0.1%</div>
</div>
<div id="trigTxcount" class="trig-params" style="display:none">
<div class="slider-wrap">
<div class="slider-top"><span>txThreshold (step every N txs) <span class="mark lock">🔒</span></span><span class="val" id="escTxThreshVal">100</span></div>
<input type="range" id="escTxThresh" min="10" max="1000" value="100" step="10">
</div>
<div class="slider-wrap">
<div class="slider-top"><span>feeStep per threshold <span class="mark lock">🔒</span></span><span class="val" id="escTxStepVal">+0.1%</span></div>
<input type="range" id="escTxStep" min="0.01" max="1" value="0.1" step="0.01">
</div>
<div class="esc-formula">fee = 0.1% + (txCount ÷ 100) × 0.1%</div>
<div class="perm-note" style="color:var(--risk-warn);margin-top:6px">⚠ Requires NFT commitment state — experimental, needs chipnet validation.</div>
</div>
<div id="trigBlockheight" class="trig-params" style="display:none">
<div class="slider-wrap">
<div class="slider-top"><span>blocksPerStep <span class="mark lock">🔒</span></span><span class="val" id="escBlockStepVal">4,320</span></div>
<input type="range" id="escBlockStep" min="144" max="52560" value="4320" step="144">
</div>
<div class="slider-wrap">
<div class="slider-top"><span>feeStep per period <span class="mark lock">🔒</span></span><span class="val" id="escBlockFeeVal">+0.1%</span></div>
<input type="range" id="escBlockFee" min="0.01" max="1" value="0.1" step="0.01">
</div>
<div class="esc-formula">fee = 0.1% + (elapsed ÷ 4,320) × 0.1% (~monthly steps)</div>
</div>
</div>
<div class="field" style="margin-top:14px"><span class="flabel">feeAddress <span class="mark lock">🔒</span></span><input class="input" value="bchtest:qp2…7lm (multisig ok)"></div>
<div class="perm-note"><span class="mark lock">🔒</span> The founder fee formula is set permanently at contract creation — it is encoded into the covenant bytecode. The redeem side carries <b>no fee</b> — redemption is a P2PKH spend (V2.7 §4.4).</div>
</section>
<!-- ═══════════════════════════════════════════════════════ -->
<!-- TIER A: STEP 6 — REVIEW WALL -->
<!-- ═══════════════════════════════════════════════════════ -->
<section class="wstep" data-step="A6">
<div class="q">Review wall</div>
<div class="warn-banner">⚠ This writes immutable on-chain commitments. No admin, no recall, no upgrade path. 🔒 fields can never change.</div>
<div class="rev-row"><span class="k">Name · ticker</span><span class="v" id="rvName">Nova · NOVA</span></div>
<div class="rev-row"><span class="k"><span class="mark lock">🔒</span> Tier</span><span class="v">A · chain-enforced</span></div>
<div class="rev-row"><span class="k"><span class="mark lock">🔒</span> Class</span><span class="v" id="rvClass">DEA — Deviant Equilibrium Asset</span></div>
<div class="rev-row"><span class="k"><span class="mark lock">🔒</span> Backing rate</span><span class="v" id="rvRate">10,000 sat / unit</span></div>
<div class="rev-row"><span class="k"><span class="mark lock">🔒</span> Mint × supply</span><span class="v" id="rvAxes">permissionless · unlimited</span></div>
<div class="rev-row"><span class="k"><span class="mark lock">🔒</span> Founder fee</span><span class="v" id="rvFee">0.5%</span></div>
<div class="rev-row"><span class="k">Genesis cost (BCH fuel)</span><span class="v">~5,400 sat</span></div>
<div class="confirm-field">
<span class="flabel">Type CREATE to confirm — this is irreversible</span>
<input class="input" id="createInputA" placeholder="CREATE" spellcheck="false">
</div>
</section>
<!-- ═══════════════════════════════════════════════════════ -->
<!-- TIER B: STEP 2 — IDENTITY (simpler) -->
<!-- ═══════════════════════════════════════════════════════ -->
<section class="wstep" data-step="B2">
<div class="q">Name your experiment</div>
<div class="row2">
<div class="field"><span class="flabel">Name</span><input class="input" placeholder="e.g. TestCoin"></div>
<div class="field"><span class="flabel">Ticker</span><input class="input" placeholder="e.g. TST"></div>
</div>
<div class="field"><span class="flabel">Description <span style="color:var(--muted);font-weight:400;">(optional)</span></span><input class="input" placeholder="What is this experiment for?"></div>
<div class="perm-note">Tier B assets are local wallet conventions — visible only to wallets that import the same definition. Not broadcast on-chain via BCMR.</div>
</section>
<!-- ═══════════════════════════════════════════════════════ -->
<!-- TIER B: STEP 3 — SIMPLE TYPE (mint + supply only) -->
<!-- ═══════════════════════════════════════════════════════ -->
<section class="wstep" data-step="B3">
<div class="q">Token type</div>
<div class="warn-banner info">ℹ Tier B assets are always NBA (non-backed) — no BCH backing rate, no PNV floor. Value is whatever your group agrees on.</div>
<div class="axis">
<div class="axis-label">Mint rule</div>
<div class="tog" data-axis="b-mint">
<button class="opt on" data-v="permissionless">Permissionless</button>
<button class="opt" data-v="managed">Managed</button>
</div>
</div>
<div class="axis">
<div class="axis-label">Supply</div>
<div class="tog" data-axis="b-supply">
<button class="opt on" data-v="unlimited">Unlimited</button>
<button class="opt" data-v="limited">Limited</button>
</div>
</div>
<div class="derived" id="bDerived">
<div class="d-row"><span class="d-code" id="bCode">PTU</span><span class="d-name" id="bName">Permissionless Token Unlimited</span></div>
<div class="d-axes" id="bAxes">NBA · permissionless · unlimited</div>
<div class="d-asm" id="bAsm">No peg · no ASM</div>
</div>
<div class="perm-note">Tier B tokens don't go through the full Avalanche pipeline — no rate tier, no founder fee. You can start experimenting immediately.</div>
</section>
<!-- ═══════════════════════════════════════════════════════ -->
<!-- TIER B: STEP 4 — REVIEW (lighter) -->
<!-- ═══════════════════════════════════════════════════════ -->
<section class="wstep" data-step="B4">
<div class="q">Review</div>
<div class="warn-banner info">ℹ Tier B is a wallet convention — lightweight, local, no immutable on-chain commitments. You can delete or recreate anytime.</div>
<div class="rev-row"><span class="k">Name · ticker</span><span class="v" id="rvBName">— · —</span></div>
<div class="rev-row"><span class="k">Tier</span><span class="v">B · experiment</span></div>
<div class="rev-row"><span class="k">Class</span><span class="v" id="rvBClass">PTU — Permissionless Token Unlimited</span></div>
<div class="rev-row"><span class="k">Mint × supply</span><span class="v" id="rvBAxes">permissionless · unlimited</span></div>
<div class="rev-row"><span class="k">Backing</span><span class="v">None (NBA)</span></div>
<div class="rev-row"><span class="k">Genesis cost</span><span class="v">~546 sat (dust)</span></div>
<div class="perm-note" style="margin-top:20px;">No CREATE confirmation needed for Tier B — this is a local definition, not an immutable covenant.</div>
</section>
<div class="wiz-foot">
<button class="btn-ghost" id="backBtn">Cancel</button>
<button class="btn-acid" id="nextBtn">Continue</button>
</div>
</div>
<script>
/* ── Starfield ── */
(function generateStars() {
var c = document.getElementById('stars'); if (!c) return;
var count = window.innerWidth < 700 ? 100 : 180;
var frag = document.createDocumentFragment();
for (var i = 0; i < count; i++) {
var s = document.createElement('div'); s.className = 'star';
var roll = Math.random(), size, opacity, dur;
if (roll < 0.78) { size = 1+Math.random()*.4; opacity = .18+Math.random()*.22; dur = 14+Math.random()*8; }
else if (roll < 0.95) { size = 1.4+Math.random()*.6; opacity = .32+Math.random()*.22; dur = 10+Math.random()*6; }
else { size = 1.8+Math.random()*.8; opacity = .45+Math.random()*.25; dur = 8+Math.random()*5; }
s.style.width = size+'px'; s.style.height = size+'px';
s.style.left = Math.random()*100+'%'; s.style.top = Math.random()*100+'%';
s.style.opacity = opacity; s.style.setProperty('--twinkle-duration', dur+'s'); s.style.setProperty('--twinkle-delay', (Math.random()*dur)+'s');
frag.appendChild(s);
}
c.appendChild(frag);
})();
/* ── Flow engine ── */
var tier = 'A';
var sel = { backing:'mba', mint:'permissionless', supply:'unlimited' };
var FLOWS_A_FULL = { steps:['1','A2','A3','A4','A5','A6'], labels:['Tier','Identity','Asset type','Rate tier','Founder fee','Review wall'] };
var FLOWS_A_NBA = { steps:['1','A2','A3','A5','A6'], labels:['Tier','Identity','Asset type','Founder fee','Review wall'] };
var FLOWS_B = { steps:['1','B2','B3','B4'], labels:['Tier','Identity','Token type','Review'] };
var idx = 0;
function flow() {
if (tier === 'B') return FLOWS_B;
return sel.backing === 'token' ? FLOWS_A_NBA : FLOWS_A_FULL;
}
function curStepKey() { return flow().steps[idx]; }
function render() {
var f = flow();
// stepper bars
var barsEl = document.getElementById('bars');
barsEl.innerHTML = '';
for (var i = 0; i < f.steps.length; i++) {
var b = document.createElement('div');
b.className = 'step' + (i < idx ? ' done' : (i === idx ? ' now' : ''));
barsEl.appendChild(b);
}
document.getElementById('stepLabel').innerHTML = 'Step ' + (idx+1) + ' / ' + f.steps.length + ' &middot; <b>' + f.labels[idx] + '</b>';
// show/hide sections
document.querySelectorAll('.wstep').forEach(function (s) {
s.classList.toggle('active', s.getAttribute('data-step') === curStepKey());
});
// footer buttons
document.getElementById('backBtn').textContent = idx === 0 ? 'Cancel' : 'Back';
var next = document.getElementById('nextBtn');
var isLast = idx === f.steps.length - 1;
if (isLast && tier === 'A') {
next.textContent = 'Create asset';
next.classList.toggle('disabled', document.getElementById('createInputA').value.trim().toUpperCase() !== 'CREATE');
} else if (isLast && tier === 'B') {
next.textContent = 'Create experiment';
next.classList.remove('disabled');
} else {
next.textContent = 'Continue';
next.classList.remove('disabled');
}
// fill review on last step
if (isLast) fillReview();
}
document.getElementById('nextBtn').addEventListener('click', function () {
if (idx < flow().steps.length - 1) { idx++; render(); }
});
document.getElementById('backBtn').addEventListener('click', function () {
if (idx > 0) { idx--; render(); }
});
/* ── Tier selection (step 1) ── */
document.querySelectorAll('.tier-card').forEach(function (c) {
c.addEventListener('click', function () {
document.querySelectorAll('.tier-card').forEach(function (x) { x.classList.remove('on'); });
c.classList.add('on');
tier = c.getAttribute('data-tier');
});
});
/* ── Tier A: class derivation ── */
var CLASS = {
'mba|permissionless|unlimited': ['DEA','Deviant Equilibrium Asset', true],
'mba|permissionless|limited': ['PLA','Permissionless Limited Asset', true],
'mba|managed|unlimited': ['MCA','Managed Certificate Asset', false],
'mba|managed|limited': ['MTA','Managed Tranche Asset', false],
'token|permissionless|unlimited':['PTU','Permissionless Token Unlimited', false],
'token|permissionless|limited': ['PTL','Permissionless Token Limited', false],
'token|managed|unlimited': ['MTU','Managed Token Unlimited', false],
'token|managed|limited': ['MTL','Managed Token Limited', false]
};
function curClass() { return CLASS[sel.backing+'|'+sel.mint+'|'+sel.supply]; }
var DETAIL = {
DEA: { peer:'Hard-Backed',
def:'A counterparty-free backed currency — every unit carries its BCH backing inside its own UTXO, redeemable by your own spend. The contract replaces counterparty, market-maker and liquidity provider at once.',
use:['Everyday / platform currencies','Game currencies with real backing','Loyalty & rewards points'],
ex:'Novel — no traditional peer. Backed directly by BCH held in the unit itself, not by an external market peg or a custodian who could default.'
},
PLA: { peer:'Commodity',
def:'Backed like a DEA but with a capped reservoir. Once minted out the ASM goes inert, yet the BCH floor (PNV) stays redeemable forever.',
use:['Capped, BCH-backed reserve assets','Backed claims with a hard floor + supply cap','Fixed-supply backed currencies'],
ex:'Like a capped certificate backed by a reserve — PLA shares the permissionless-extraction pattern but adds the BCH redemption floor.'
},
MCA: { peer:'Bond',
def:'Issuer-gated, uncapped issuance with a protocol-enforced BCH floor and redemption — a rolling backed program (bond / reserve-note style).',
use:['Rolling / perpetual bond programs','Issuer-backed reserve notes','A properly-backed stablecoin (reserves enforced on-chain)'],
ex:'Closest peer: a bond program or reserve note. NOT today\'s USDT / USDC — their reserves sit off-chain and unenforced → those are NBA (MTU).'
},
MTA: { peer:'Tranche',
def:'Issuer-gated and hard-capped, with a protocol-enforced BCH floor — a single fixed slice (tranche) of backed issuance.',
use:['Fixed tranches & structured slices','Notes & bills (T-notes / T-bills)','Numbered backed editions','Closed, capped reserve series'],
ex:'A closed-end fund share, an ETF tranche, a fixed bond series, Treasury notes & bills — capped, backed, issuer-gated.'
},
PTU: { peer:'Game currency',
def:'A Non-Convertible Virtual Currency — usable only inside one platform / ecosystem. Open-mint: anyone mints by spending into the covenant, no exclusive issuer, uncapped, no backing.',
use:['In-game currencies earned by play','Tap-to-mint / faucet tokens','Open community / play-to-earn currencies'],
ex:'MMORPG gold, arcade redemption tickets, faucet / tap-to-earn tokens. All open to anyone, inflationary, and not officially cashable out.'
},
PTL: { peer:'Mineable Coin',
def:'Open-mint but hard-capped, no backing floor and no exclusive operator — permissionless issuance up to a fixed total; value is market-set.',
use:['Capped-supply mined coins (Bitcoin-style)','Tokenised commodities / barter goods','Permissionless capped mint events'],
ex:'Bitcoin, gold, silver, barter goods — direct-value assets: mined/extracted by anyone, finite, unbacked.'
},
MTU: { peer:'Meme / Tokens',
def:'Issuer-controlled, uncapped, no protocol backing — a team mints supply exclusively. Fiat money and "stablecoins" also sit here: backing claimed off-chain, unenforced.',
use:['Issuer-minted memecoins (the common case)','Project / governance / utility tokens','Fiat money & stablecoins (off-chain backing)'],
ex:'Most memecoins and ERC-20 tokens; USDT / USDC and central-bank fiat — value rests on issuer trust, not a redeemable on-chain floor.'
},
MTL: { peer:'NFT / Collectibles',
def:'Issuer-controlled and capped, no backing — a creator mints a fixed supply. For credentials, collections and capped memecoins.',
use:['Fixed NFT collections & numbered editions','Event tickets, memberships & credentials','Capped-supply memecoins'],
ex:'Concert tickets, membership passes, fixed-supply meme/collectible tokens.'
}
};
// Color gradient: each class maps to a hue+saturation+lightness
// MBA+Permissionless = intense acid green → MBA+Managed = teal → NBA = calm sea blue
var COLORS = {
DEA: { h:75, s:95, l:58, glow:.45 }, // acid green — peak
PLA: { h:95, s:80, l:52, glow:.38 }, // lime-green
MCA: { h:120, s:65, l:48, glow:.30 }, // green
MTA: { h:145, s:55, l:46, glow:.25 }, // green-teal
PTU: { h:160, s:50, l:46, glow:.22 }, // teal
PTL: { h:175, s:48, l:45, glow:.19 }, // cyan-teal
MTU: { h:195, s:48, l:50, glow:.16 }, // cyan-blue
MTL: { h:210, s:45, l:50, glow:.14 } // calm blue
};
function hsl(c, a) { return 'hsla('+c.h+','+c.s+'%,'+c.l+'%,'+(a||1)+')'; }
function derive() {
var c = curClass();
var isDEA = c[0] === 'DEA';
var isNBA = sel.backing === 'token';
var col = COLORS[c[0]];
document.getElementById('dCode').textContent = c[0];
document.getElementById('dName').textContent = c[1];
var rateWord = isNBA ? 'no peg' : 'fixed rate';
document.getElementById('dAxes').textContent = sel.mint+' · '+rateWord+' · '+sel.supply;
var asm = document.getElementById('dAsm');
if (c[2]) { asm.className='d-asm elig'; asm.textContent = c[0]==='PLA' ? '✦ Orbital / ASM eligible (until depleted)' : '✦ Orbital / ASM eligible'; }
else { asm.className='d-asm'; asm.textContent = isNBA ? 'No peg · no ASM' : 'No ASM (managed mint)'; }
// fill detail panel
var d = DETAIL[c[0]];
if (d) {
document.getElementById('dPeer').textContent = d.peer;
document.getElementById('dDef').textContent = d.def;
document.getElementById('dUses').innerHTML = d.use.map(function(u){ return '<li>'+u+'</li>'; }).join('');
document.getElementById('dExWiz').textContent = d.ex;
}
// ── Left-side glow on toggle containers ──
var glowColor = hsl(col, col.glow);
var borderColor = hsl(col, col.glow + 0.3);
document.querySelectorAll('[data-step="A3"] .tog').forEach(function (t) {
t.style.borderLeftColor = borderColor;
var glow = t.querySelector('.left-glow');
if (!glow) {
glow = document.createElement('div');
glow.className = 'left-glow';
t.appendChild(glow);
}
glow.style.background = glowColor;
glow.style.boxShadow = '-2px 0 ' + Math.round(10 + col.glow * 20) + 'px ' + glowColor;
glow.classList.toggle('pulse', isDEA);
});
// ── Active toggle button colors (smooth gradient) ──
var btnBg = hsl(col, 1);
var btnGlow = hsl(col, 0.3);
document.querySelectorAll('[data-step="A3"] .opt.on').forEach(function (o) {
o.style.background = btnBg;
o.style.boxShadow = '0 0 12px ' + btnGlow;
});
document.querySelectorAll('[data-step="A3"] .opt:not(.on)').forEach(function (o) {
o.style.background = '';
o.style.boxShadow = '';
});
// ── Derived panel theming ──
var derived = document.querySelector('[data-step="A3"] .derived');
if (derived) {
derived.style.borderColor = hsl(col, 0.3);
derived.style.background = 'linear-gradient(135deg, ' + hsl(col, 0.08) + ', rgba(19,26,42,.4))';
}
document.getElementById('dCode').style.color = hsl(col, 1);
document.getElementById('dCode').style.textShadow = '0 0 14px ' + hsl(col, 0.4);
var peer = document.getElementById('dPeer');
peer.style.background = hsl(col, 0.1);
peer.style.borderColor = hsl(col, 0.25);
peer.style.color = hsl(col, 0.9);
// ASM chip color
var asmEl = document.getElementById('dAsm');
if (c[2]) { asmEl.style.color = hsl(col, 1); asmEl.style.borderColor = hsl(col, 0.4); asmEl.style.textShadow = '0 0 6px ' + hsl(col, 0.3); }
else { asmEl.style.color = ''; asmEl.style.borderColor = ''; asmEl.style.textShadow = ''; }
// rate step adapts
document.getElementById('rateBox').style.display = isNBA ? 'none' : '';
document.getElementById('rateNA').style.display = isNBA ? '' : 'none';
}
// Axis toggle clicks (Tier A step 3)
document.querySelectorAll('[data-step="A3"] .tog[data-axis]').forEach(function (g) {
var axis = g.getAttribute('data-axis');
g.querySelectorAll('.opt').forEach(function (o) {
o.addEventListener('click', function () {
g.querySelectorAll('.opt').forEach(function (x){ x.classList.remove('on'); });
o.classList.add('on');
sel[axis] = o.getAttribute('data-v');
derive();
});
});
});
// Rate chip clicks
document.querySelectorAll('.rchip').forEach(function (r) {
r.addEventListener('click', function () {
document.querySelectorAll('.rchip').forEach(function (x){ x.classList.remove('on'); });
r.classList.add('on');
});
});
/* ── Tier B: class derivation ── */
var bSel = { mint:'permissionless', supply:'unlimited' };
var BCLASS = {
'permissionless|unlimited': ['PTU','Permissionless Token Unlimited'],
'permissionless|limited': ['PTL','Permissionless Token Limited'],
'managed|unlimited': ['MTU','Managed Token Unlimited'],
'managed|limited': ['MTL','Managed Token Limited']
};
function deriveB() {
var c = BCLASS[bSel.mint+'|'+bSel.supply];
document.getElementById('bCode').textContent = c[0];
document.getElementById('bName').textContent = c[1];
document.getElementById('bAxes').textContent = 'NBA · '+bSel.mint+' · '+bSel.supply;
}
document.querySelectorAll('[data-step="B3"] .tog[data-axis]').forEach(function (g) {
var axis = g.getAttribute('data-axis').replace('b-','');
g.querySelectorAll('.opt').forEach(function (o) {
o.addEventListener('click', function () {
g.querySelectorAll('.opt').forEach(function (x){ x.classList.remove('on'); });
o.classList.add('on');
bSel[axis] = o.getAttribute('data-v');
deriveB();
});
});
});
/* ── Fee mode toggle (flat / escalating) ── */
var feeMode = 'flat';
var escTrigger = 'supply';
document.querySelectorAll('.fee-tog .opt').forEach(function (o) {
o.addEventListener('click', function () {
if (o.classList.contains('locked')) return; // premium gate
document.querySelectorAll('.fee-tog .opt').forEach(function (x) { x.classList.remove('on'); });
o.classList.add('on');
feeMode = o.getAttribute('data-v');
document.getElementById('feePanelFlat').style.display = feeMode === 'flat' ? '' : 'none';
document.getElementById('feePanelEsc').style.display = feeMode === 'escalating' ? '' : 'none';
updateEscFormula();
});
});
/* ── Trigger selector ── */
document.querySelectorAll('.esc-trig').forEach(function (t) {
t.addEventListener('click', function () {
document.querySelectorAll('.esc-trig').forEach(function (x) { x.classList.remove('on'); });
t.classList.add('on');
escTrigger = t.getAttribute('data-t');
document.getElementById('trigSupply').style.display = escTrigger === 'supply' ? '' : 'none';
document.getElementById('trigTxcount').style.display = escTrigger === 'txcount' ? '' : 'none';
document.getElementById('trigBlockheight').style.display = escTrigger === 'blockheight' ? '' : 'none';
updateEscFormula();
});
});
/* ── Fee sliders ── */
var feeSlider = document.getElementById('feeSlider');
if (feeSlider) feeSlider.addEventListener('input', function () {
document.getElementById('feeVal').textContent = feeSlider.value + '%';
});
function updateEscFormula() {
var base = document.getElementById('escBaseSlider').value;
var cap = document.getElementById('escCapSlider').value;
document.getElementById('escBaseVal').textContent = base + '%';
document.getElementById('escCapVal').textContent = cap + '%';
if (escTrigger === 'supply') {
var step = document.getElementById('escSupplyStep').value;
document.getElementById('escSupplyStepVal').textContent = '+' + step + '%';
document.querySelector('#trigSupply .esc-formula').textContent = 'fee = ' + base + '% + (issued ÷ 1M) × ' + step + '% capped at ' + cap + '%';
} else if (escTrigger === 'txcount') {
var thresh = document.getElementById('escTxThresh').value;
var txStep = document.getElementById('escTxStep').value;
document.getElementById('escTxThreshVal').textContent = thresh;
document.getElementById('escTxStepVal').textContent = '+' + txStep + '%';
document.querySelector('#trigTxcount .esc-formula').textContent = 'fee = ' + base + '% + (txCount ÷ ' + thresh + ') × ' + txStep + '% capped at ' + cap + '%';
} else {
var blocks = document.getElementById('escBlockStep').value;
var bFee = document.getElementById('escBlockFee').value;
document.getElementById('escBlockStepVal').textContent = Number(blocks).toLocaleString();
document.getElementById('escBlockFeeVal').textContent = '+' + bFee + '%';
var days = Math.round(blocks / 144);
var label = days < 30 ? '~' + days + 'd steps' : '~' + Math.round(days/30) + 'mo steps';
document.querySelector('#trigBlockheight .esc-formula').textContent = 'fee = ' + base + '% + (elapsed ÷ ' + Number(blocks).toLocaleString() + ') × ' + bFee + '% (' + label + ', cap ' + cap + '%)';
}
}
// Wire all escalation sliders
['escBaseSlider','escCapSlider','escSupplyStep','escTxThresh','escTxStep','escBlockStep','escBlockFee'].forEach(function(id) {
var el = document.getElementById(id);
if (el) el.addEventListener('input', updateEscFormula);
});
/* ── Review fill ── */
function feeReviewText() {
if (feeMode === 'flat') return feeSlider.value + '% (flat, immutable)';
var base = document.getElementById('escBaseSlider').value;
var cap = document.getElementById('escCapSlider').value;
var labels = { supply: 'supply-based', txcount: 'tx-count', blockheight: 'block-height' };
return base + '% → ' + cap + '% (' + labels[escTrigger] + ' escalation)';
}
function fillReview() {
if (tier === 'A') {
var c = curClass();
document.getElementById('rvClass').textContent = c[0] + ' — ' + c[1];
var on = document.querySelector('.rchip.on');
document.getElementById('rvRate').textContent = sel.backing==='mba' ? (on ? on.textContent + ' sat / unit' : '—') : 'n/a (NBA · no peg)';
document.getElementById('rvAxes').textContent = sel.mint + ' · ' + sel.supply;
document.getElementById('rvFee').textContent = feeReviewText();
} else {
var bc = BCLASS[bSel.mint+'|'+bSel.supply];
document.getElementById('rvBClass').textContent = bc[0] + ' — ' + bc[1];
document.getElementById('rvBAxes').textContent = bSel.mint + ' · ' + bSel.supply;
}
}
var cInput = document.getElementById('createInputA');
if (cInput) cInput.addEventListener('input', render);
derive(); deriveB(); render();
</script>
</body>
</html>

View file

@ -0,0 +1,97 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Deviant · Elevation B→A · CosmoGenesis mockup</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Fraunces:opsz,wght@9..144,300;9..144,400;9..144,500;9..144,600&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet">
<link href="../cosmo-genesis.css" rel="stylesheet">
<style>
body { display:flex; justify-content:center; padding:28px 0; }
.phone { position:relative; z-index:1; width:392px; min-height:840px; background: linear-gradient(180deg, rgba(19,26,42,.55), rgba(10,15,28,.55)); border:1px solid var(--border); border-radius:30px; padding:22px 18px 92px; backdrop-filter: blur(2px); overflow:hidden; }
.flow-head { display:flex; align-items:center; gap:12px; margin-bottom:8px; }
.back { font-size:20px; color:var(--ink-soft); cursor:pointer; background:0; border:0; }
.flow-title { font-family:var(--font-display); font-weight:500; font-size:21px; color:var(--ink-bright); }
.flow-step { margin-left:auto; font-family:var(--font-mono); font-size:9px; letter-spacing:.12em; color:var(--muted); text-transform:uppercase; }
.lead { font-family:var(--font-mono); font-size:10px; color:var(--ink-soft); line-height:1.6; margin:6px 2px 16px; }
/* B → A transition strip */
.ba { display:flex; align-items:center; gap:12px; margin-bottom:18px; }
.ba .box { flex:1; text-align:center; padding:13px; border-radius:13px; background:var(--surface-1); border:1px solid var(--border-strong); }
.ba .box .tag { font-family:var(--font-mono); font-size:9px; letter-spacing:.16em; text-transform:uppercase; color:var(--muted); }
.ba .box .big { font-family:var(--font-mono); font-size:18px; margin-top:5px; }
.ba .box.b .big { color:var(--risk-warn); } .ba .box.a .big { color:var(--acid); text-shadow:0 0 8px var(--acid-halo); }
.ba .arrow { color:var(--acid); font-size:18px; }
/* pre-flight integrity panel */
.integ { background:var(--surface-1); border:1px solid var(--border); border-radius:16px; padding:16px; margin-bottom:14px; }
.integ-h { font-family:var(--font-mono); font-size:9px; letter-spacing:.18em; text-transform:uppercase; color:var(--muted); margin-bottom:12px; }
.crow { display:flex; justify-content:space-between; padding:7px 0; font-family:var(--font-mono); font-size:11px; }
.crow .k { color:var(--ink-soft); } .crow .v { color:#0ac18e; } .crow .v.warn { color:var(--risk-warn); }
.divider { height:1px; background:var(--border); margin:8px 0; }
.irrev { font-family:var(--font-mono); font-size:9px; color:var(--risk-warn); line-height:1.6; margin-top:6px; }
.keep { font-family:var(--font-mono); font-size:9px; color:var(--muted); line-height:1.6; margin:0 2px 16px; }
.row-btns { display:flex; gap:12px; }
.btn-ghost { flex:1; font-family:var(--font-mono); font-size:11px; letter-spacing:.1em; text-transform:uppercase; padding:14px; border-radius:12px; background:transparent; color:var(--ink-soft); border:1px solid var(--border-strong); cursor:pointer; }
.btn-acid { flex:2; font-family:var(--font-mono); font-size:11px; letter-spacing:.1em; text-transform:uppercase; padding:14px; border-radius:12px; background:var(--acid); color:var(--sky-deep); border:0; cursor:pointer; box-shadow:0 0 16px var(--acid-halo); }
.tabbar { position:absolute; left:0; right:0; bottom:0; display:flex; justify-content:space-around; align-items:center; padding:14px 10px 18px; border-top:1px solid var(--border); background: linear-gradient(0deg, var(--sky-deep), transparent); border-radius:0 0 30px 30px; }
.tab { display:flex; flex-direction:column; align-items:center; gap:6px; background:0; border:0; cursor:pointer; }
.tab .ico { font-size:17px; color: var(--muted); } .tab .lbl { font-family: var(--font-mono); font-size:8px; letter-spacing:.12em; text-transform:uppercase; color: var(--muted); }
.tab.active .ico { color: var(--acid); } .tab:not(.active) .bch-b { opacity:.6; }
.bch-b { display:inline-grid; place-items:center; line-height:0; border-radius:50%; } .bch-b .bch-logo { width:100%; height:100%; } .bch-b.sm { width:28px; height:28px; }
.fab { position:relative; margin-top:-28px; flex:none; width:58px; height:58px; border-radius:50%; background: var(--acid); color: var(--sky-deep); border:4px solid var(--sky-deep); cursor:pointer; display:grid; place-items:center; font-size:23px; box-shadow: 0 0 18px var(--acid-glow), 0 0 34px var(--acid-halo); }
</style>
</head>
<body>
<div class="stars" aria-hidden="true" id="stars"></div>
<div class="phone">
<div class="flow-head">
<button class="back">←</button>
<div class="flow-title">Elevation</div>
<div class="flow-step">B → A</div>
</div>
<div class="lead">Promote your Tier-B definition to a consensus-enforced Tier-A CashTokens asset with the same identity. Integrity is checked before anything is signed (assertEscalationIntegrity, V2.7 §9).</div>
<div class="ba">
<div class="box b"><div class="tag">before</div><div class="big">ZCoin [B]</div></div>
<div class="arrow">→</div>
<div class="box a"><div class="tag">after</div><div class="big">DEA-Verified [A]</div></div>
</div>
<div class="integ">
<div class="integ-h">Pre-flight integrity — holder escalation</div>
<div class="crow"><span class="k">bchSats per unit</span><span class="v">✓ match</span></div>
<div class="crow"><span class="k">rate (10,000 sat / unit)</span><span class="v">✓ match</span></div>
<div class="crow"><span class="k">pkh (your key)</span><span class="v">✓ match</span></div>
<div class="crow"><span class="k">openMint (open)</span><span class="v">✓ match</span></div>
<div class="crow"><span class="k">Canonical A contract</span><span class="v">✓ found on-chain</span></div>
<div class="crow"><span class="k">Founder-fee parameters</span><span class="v">✓ match</span></div>
<div class="divider"></div>
<div class="irrev">⚠ Once escalated, this is irreversible — there is no downgrade path. Catches definition-poisoning (T-002): if your local B definition's rate / bchSats / pkh diverge from the on-chain contract, the flow refuses and prompts re-verification.</div>
</div>
<div class="keep">After a successful escalation your Tier-B definition can be kept for historical reference or removed. Each holder escalates their own holdings — a founder deploying the contract is necessary but not sufficient.</div>
<div class="row-btns">
<button class="btn-ghost">Cancel</button>
<button class="btn-acid">Proceed — claim A FTs</button>
</div>
<nav class="tabbar">
<button class="tab"><span class="ico"><span class="bch-b sm"><svg class="bch-logo" viewBox="0 0 24 24" aria-hidden="true"><circle cx="12" cy="12" r="12" fill="#fff"/><path fill="#0ac18e" d="m10.84 11.22-.688-2.568c.728-.18 2.839-1.051 3.39.506.27 1.682-1.978 1.877-2.702 2.062zm.289 1.313.755 2.829c.868-.228 3.496-.46 3.241-2.351-.433-1.666-3.125-.706-3.996-.478zM24 12c0 6.627-5.373 12-12 12S0 18.627 0 12 5.373 0 12 0s12 5.373 12 12zm-6.341.661c-.183-1.151-1.441-2.095-2.485-2.202.643-.57.969-1.401.57-2.488-.603-1.368-1.989-1.66-3.685-1.377l-.546-2.114-1.285.332.536 2.108c-.338.085-.685.158-1.029.256L9.198 5.08l-1.285.332.545 2.114c-.277.079-2.595.673-2.595.673l.353 1.377s.944-.265.935-.244c.524-.137.771.125.886.372l1.498 5.793c.018.168-.012.454-.372.551.021.012-.935.241-.935.241l.14 1.605s2.296-.588 2.598-.664l.551 2.138 1.285-.332-.551-2.153c.353-.082.697-.168 1.032-.256l.548 2.141 1.285-.332-.551-2.135c1.982-.482 3.38-1.73 3.094-3.64z"/></svg></span></span><span class="lbl">Main</span></button>
<button class="tab active"><span class="ico">⬡</span><span class="lbl">Assets</span></button>
<button class="fab" id="fab">⇅</button>
<button class="tab"><span class="ico">△</span><span class="lbl">Avalanche</span></button>
<button class="tab"><span class="ico">⧉</span><span class="lbl">Apps</span></button>
</nav>
</div>
<script>
(function generateStars(){const c=document.getElementById('stars');if(!c)return;const n=window.innerWidth<700?100:180;const f=document.createDocumentFragment();for(let i=0;i<n;i++){const s=document.createElement('div');s.className='star';const r=Math.random();let sz,o,d;if(r<.78){sz=1+Math.random()*.4;o=.18+Math.random()*.22;d=14+Math.random()*8;}else if(r<.95){sz=1.4+Math.random()*.6;o=.32+Math.random()*.22;d=10+Math.random()*6;}else{sz=1.8+Math.random()*.8;o=.45+Math.random()*.25;d=8+Math.random()*5;}s.style.width=sz+'px';s.style.height=sz+'px';s.style.left=Math.random()*100+'%';s.style.top=Math.random()*100+'%';s.style.opacity=o;s.style.setProperty('--twinkle-duration',d+'s');s.style.setProperty('--twinkle-delay',(Math.random()*d)+'s');f.appendChild(s);}c.appendChild(f);})();
(function(){var map={main:'main-tab.html',assets:'assets-tab.html',avalanche:'avalanche-tab.html',apps:'apps-tab.html'};document.querySelectorAll('.tabbar .tab').forEach(function(t){var el=t.querySelector('.lbl');if(!el)return;var d=map[el.textContent.trim().toLowerCase()];if(d){t.style.cursor='pointer';t.addEventListener('click',function(){location.href=d;});}});})();
</script>
</body>
</html>

View file

@ -0,0 +1,155 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Deviant · CashFusion · CosmoGenesis mockup</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Fraunces:opsz,wght@9..144,300;9..144,400;9..144,500;9..144,600&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet">
<link href="../cosmo-genesis.css" rel="stylesheet">
<style>
body { display:flex; justify-content:center; padding:28px 0; }
.phone { position:relative; z-index:1; width:392px; min-height:840px; background: linear-gradient(180deg, rgba(19,26,42,.55), rgba(10,15,28,.55)); border:1px solid var(--border); border-radius:30px; padding:22px 18px 92px; backdrop-filter: blur(2px); overflow:hidden; }
.view { display:none; } .view.active { display:block; }
.flow-head { display:flex; align-items:center; gap:12px; margin-bottom:16px; }
.back { font-size:20px; color:var(--ink-soft); cursor:pointer; background:0; border:0; }
.flow-title { font-family:var(--font-display); font-weight:500; font-size:21px; color:var(--ink-bright); }
.flow-step { margin-left:auto; font-family:var(--font-mono); font-size:9px; letter-spacing:.12em; color:var(--muted); text-transform:uppercase; }
.lead { font-family:var(--font-mono); font-size:10px; color:var(--ink-soft); line-height:1.6; margin:0 2px 16px; }
.sec-label { font-family:var(--font-mono); font-size:9px; letter-spacing:.2em; text-transform:uppercase; color:var(--muted); margin:6px 2px 9px; }
/* privacy meter */
.meter { background:var(--surface-1); border:1px solid var(--border); border-radius:16px; padding:16px; margin-bottom:16px; text-align:center; }
.meter .lvl { font-family:var(--font-display); font-weight:500; font-size:20px; color:var(--acid); text-shadow:0 0 8px var(--acid-halo); }
.bar { height:6px; border-radius:3px; background:var(--surface-2); margin:12px 0 6px; overflow:hidden; }
.bar > i { display:block; height:100%; width:62%; background:var(--acid); box-shadow:0 0 10px var(--acid-halo); }
.meter .cap { font-family:var(--font-mono); font-size:9px; color:var(--muted); }
/* UTXO list */
.card { background:var(--surface-1); border:1px solid var(--border); border-radius:16px; overflow:hidden; margin-bottom:8px; }
.utxo { display:flex; align-items:center; gap:12px; padding:13px 15px; border-bottom:1px solid var(--border); }
.utxo:last-child { border-bottom:0; }
.utxo .chk { width:18px; height:18px; flex:none; border-radius:5px; border:1px solid var(--border-strong); display:grid; place-items:center; font-size:11px; color:var(--sky-deep); }
.utxo.on .chk { background:var(--acid); border-color:var(--acid); }
.utxo.locked { opacity:.5; }
.utxo .u-amt { font-family:var(--font-mono); font-size:13px; color:var(--ink-bright); }
.utxo .u-sub { font-family:var(--font-mono); font-size:9px; color:var(--muted); margin-top:2px; }
.utxo .tag { margin-left:auto; font-family:var(--font-mono); font-size:8px; letter-spacing:.06em; text-transform:uppercase; padding:3px 7px; border-radius:6px; border:1px solid var(--border-strong); color:var(--ink-soft); }
.utxo .tag.ft { color:var(--risk-warn); border-color:rgba(255,159,28,.4); }
.excl-note { font-family:var(--font-mono); font-size:9px; color:var(--risk-warn); line-height:1.55; margin:4px 2px 16px; }
.params { display:flex; gap:10px; margin-bottom:16px; }
.param { flex:1; background:var(--surface-1); border:1px solid var(--border); border-radius:13px; padding:13px; text-align:center; }
.param .v { font-family:var(--font-mono); font-size:16px; color:var(--ink-bright); }
.param .k { font-family:var(--font-mono); font-size:8px; letter-spacing:.12em; text-transform:uppercase; color:var(--muted); margin-top:4px; }
.auto { display:flex; align-items:center; gap:12px; padding:13px 15px; border-radius:13px; background:var(--surface-1); border:1px solid var(--border); margin-bottom:16px; font-family:var(--font-mono); font-size:11px; color:var(--ink); }
.switch { width:38px; height:22px; border-radius:11px; background:var(--surface-2); border:1px solid var(--border-strong); position:relative; flex:none; cursor:pointer; margin-left:auto; }
.switch.on { background:var(--acid); border-color:var(--acid); box-shadow:0 0 10px var(--acid-halo); }
.switch::after { content:""; position:absolute; top:2px; left:2px; width:16px; height:16px; border-radius:50%; background:var(--muted); transition:transform .25s; }
.switch.on::after { transform:translateX(16px); background:var(--sky-deep); }
.cta { width:100%; font-family:var(--font-mono); font-size:12px; letter-spacing:.12em; text-transform:uppercase; color:var(--sky-deep); background:var(--acid); border:0; border-radius:12px; padding:15px; cursor:pointer; box-shadow:0 0 16px var(--acid-halo); }
/* progress */
.prog-wrap { text-align:center; padding-top:30px; }
.rounds { display:flex; justify-content:center; gap:9px; margin:22px 0; }
.round { width:34px; height:34px; border-radius:50%; display:grid; place-items:center; font-family:var(--font-mono); font-size:11px; border:1px solid var(--border-strong); color:var(--muted); }
.round.done { background:var(--acid); color:var(--sky-deep); border-color:var(--acid); box-shadow:0 0 10px var(--acid-halo); }
.round.now { border-color:var(--acid); color:var(--acid); animation:pulse 1.2s ease-in-out infinite; }
@keyframes pulse { 0%,100%{ box-shadow:0 0 0 var(--acid-halo); } 50%{ box-shadow:0 0 12px var(--acid-glow); } }
.prog-wrap .big { font-family:var(--font-display); font-weight:500; font-size:20px; color:var(--ink-bright); }
.prog-wrap .sub { font-family:var(--font-mono); font-size:10px; color:var(--muted); margin-top:10px; line-height:1.6; }
.tabbar { position:absolute; left:0; right:0; bottom:0; display:flex; justify-content:space-around; align-items:center; padding:14px 10px 18px; border-top:1px solid var(--border); background: linear-gradient(0deg, var(--sky-deep), transparent); border-radius:0 0 30px 30px; }
.tab { display:flex; flex-direction:column; align-items:center; gap:6px; background:0; border:0; cursor:pointer; }
.tab .ico { font-size:17px; color: var(--muted); } .tab .lbl { font-family: var(--font-mono); font-size:8px; letter-spacing:.12em; text-transform:uppercase; color: var(--muted); }
.tab.active .ico { color: var(--acid); } .tab:not(.active) .bch-b { opacity:.6; }
.bch-b { display:inline-grid; place-items:center; line-height:0; border-radius:50%; } .bch-b .bch-logo { width:100%; height:100%; } .bch-b.sm { width:28px; height:28px; }
.fab { position:relative; margin-top:-28px; flex:none; width:58px; height:58px; border-radius:50%; background: var(--acid); color: var(--sky-deep); border:4px solid var(--sky-deep); cursor:pointer; display:grid; place-items:center; font-size:23px; box-shadow: 0 0 18px var(--acid-glow), 0 0 34px var(--acid-halo); }
</style>
</head>
<body>
<div class="stars" aria-hidden="true" id="stars"></div>
<div class="phone">
<!-- CONFIG -->
<section class="view active" id="v-config">
<div class="flow-head">
<button class="back" data-link="main">←</button>
<div class="flow-title">CashFusion</div>
<div class="flow-step">privacy</div>
</div>
<div class="lead">CoinJoin for Bitcoin Cash — your plain BCH is merged with other participants' coins across several rounds, breaking the chain-analysis link between your past and future history.</div>
<div class="meter">
<div class="lvl">Privacy · Fair</div>
<div class="bar"><i></i></div>
<div class="cap">3 of your BCH UTXOs are still linkable to your address book</div>
</div>
<div class="sec-label">Fuse these (plain BCH only)</div>
<div class="card">
<div class="utxo on"><span class="chk">✓</span><div><div class="u-amt">0.0220 BCH</div><div class="u-sub">received · 2h ago</div></div><span class="tag">plain</span></div>
<div class="utxo on"><span class="chk">✓</span><div><div class="u-amt">0.0140 BCH</div><div class="u-sub">change · 4d ago</div></div><span class="tag">plain</span></div>
<div class="utxo on"><span class="chk">✓</span><div><div class="u-amt">0.0040 BCH</div><div class="u-sub">change · 5d ago</div></div><span class="tag">plain</span></div>
<div class="utxo locked"><span class="chk"></span><div><div class="u-amt">120 NOVA</div><div class="u-sub">DEA · backing inside UTXO</div></div><span class="tag ft">FT · excluded</span></div>
</div>
<div class="excl-note">⚠ Token (FT) UTXOs are never fused — spending one as a fusion input would burn the tokens inside it (Rule 4). Only plain BCH participates.</div>
<div class="params">
<div class="param"><div class="v">8</div><div class="k">participants</div></div>
<div class="param"><div class="v">3</div><div class="k">rounds</div></div>
<div class="param"><div class="v">~900 sat</div><div class="k">fee est.</div></div>
</div>
<div class="auto">Auto-fuse idle BCH in the background <span class="switch on"></span></div>
<button class="cta" data-go="progress">Fuse 0.0400 BCH</button>
</section>
<!-- PROGRESS / RESULT -->
<section class="view" id="v-progress">
<div class="flow-head">
<div class="flow-title">Fusing</div>
<div class="flow-step">in progress</div>
</div>
<div class="prog-wrap">
<div class="rounds">
<div class="round done">1</div>
<div class="round now">2</div>
<div class="round">3</div>
</div>
<div class="big">Round 2 of 3</div>
<div class="sub">Negotiating with 8 participants over encrypted relays.<br>You can leave this screen — fusion continues in the background.</div>
</div>
<div class="meter" style="margin-top:24px">
<div class="lvl">Privacy → Strong</div>
<div class="bar"><i style="width:88%"></i></div>
<div class="cap">link to your prior history broken after this fusion</div>
</div>
<button class="cta" data-link="main" style="margin-top:8px">Done — run in background</button>
</section>
<nav class="tabbar">
<button class="tab active"><span class="ico"><span class="bch-b sm"><svg class="bch-logo" viewBox="0 0 24 24" aria-hidden="true"><circle cx="12" cy="12" r="12" fill="#fff"/><path fill="#0ac18e" d="m10.84 11.22-.688-2.568c.728-.18 2.839-1.051 3.39.506.27 1.682-1.978 1.877-2.702 2.062zm.289 1.313.755 2.829c.868-.228 3.496-.46 3.241-2.351-.433-1.666-3.125-.706-3.996-.478zM24 12c0 6.627-5.373 12-12 12S0 18.627 0 12 5.373 0 12 0s12 5.373 12 12zm-6.341.661c-.183-1.151-1.441-2.095-2.485-2.202.643-.57.969-1.401.57-2.488-.603-1.368-1.989-1.66-3.685-1.377l-.546-2.114-1.285.332.536 2.108c-.338.085-.685.158-1.029.256L9.198 5.08l-1.285.332.545 2.114c-.277.079-2.595.673-2.595.673l.353 1.377s.944-.265.935-.244c.524-.137.771.125.886.372l1.498 5.793c.018.168-.012.454-.372.551.021.012-.935.241-.935.241l.14 1.605s2.296-.588 2.598-.664l.551 2.138 1.285-.332-.551-2.153c.353-.082.697-.168 1.032-.256l.548 2.141 1.285-.332-.551-2.135c1.982-.482 3.38-1.73 3.094-3.64z"/></svg></span></span><span class="lbl">Main</span></button>
<button class="tab"><span class="ico">⬡</span><span class="lbl">Assets</span></button>
<button class="fab" id="fab">⇅</button>
<button class="tab"><span class="ico">△</span><span class="lbl">Avalanche</span></button>
<button class="tab"><span class="ico">⧉</span><span class="lbl">Apps</span></button>
</nav>
</div>
<script>
(function generateStars(){const c=document.getElementById('stars');if(!c)return;const n=window.innerWidth<700?100:180;const f=document.createDocumentFragment();for(let i=0;i<n;i++){const s=document.createElement('div');s.className='star';const r=Math.random();let sz,o,d;if(r<.78){sz=1+Math.random()*.4;o=.18+Math.random()*.22;d=14+Math.random()*8;}else if(r<.95){sz=1.4+Math.random()*.6;o=.32+Math.random()*.22;d=10+Math.random()*6;}else{sz=1.8+Math.random()*.8;o=.45+Math.random()*.25;d=8+Math.random()*5;}s.style.width=sz+'px';s.style.height=sz+'px';s.style.left=Math.random()*100+'%';s.style.top=Math.random()*100+'%';s.style.opacity=o;s.style.setProperty('--twinkle-duration',d+'s');s.style.setProperty('--twinkle-delay',(Math.random()*d)+'s');f.appendChild(s);}c.appendChild(f);})();
function showView(id){document.querySelectorAll('.view').forEach(function(v){v.classList.toggle('active',v.id==='v-'+id);});}
document.querySelectorAll('[data-go]').forEach(function(el){el.addEventListener('click',function(){showView(el.getAttribute('data-go'));});});
document.querySelectorAll('.utxo:not(.locked)').forEach(function(u){u.addEventListener('click',function(){u.classList.toggle('on');u.querySelector('.chk').textContent=u.classList.contains('on')?'✓':'';});});
document.querySelectorAll('.switch').forEach(function(s){s.addEventListener('click',function(){s.classList.toggle('on');});});
(function(){var map={main:'main-tab.html',assets:'assets-tab.html',avalanche:'avalanche-tab.html',apps:'apps-tab.html'};document.querySelectorAll('.tabbar .tab').forEach(function(t){var el=t.querySelector('.lbl');if(!el)return;var d=map[el.textContent.trim().toLowerCase()];if(d){t.style.cursor='pointer';t.addEventListener('click',function(){location.href=d;});}});document.querySelectorAll('[data-link="main"]').forEach(function(b){b.addEventListener('click',function(){location.href='main-tab.html';});});})();
</script>
</body>
</html>

View file

@ -0,0 +1,243 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Deviant · Main · CosmoGenesis mockup</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Fraunces:opsz,wght@9..144,300;9..144,400;9..144,500;9..144,600&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet">
<link href="../cosmo-genesis.css" rel="stylesheet">
<style>
body { display:flex; justify-content:center; padding:28px 0; }
.phone { position:relative; z-index:1; width:392px; min-height:840px; background: linear-gradient(180deg, rgba(19,26,42,.55), rgba(10,15,28,.55)); border:1px solid var(--border); border-radius:30px; padding:22px 18px 92px; backdrop-filter: blur(2px); }
/* header / wordmark */
.topbar { display:flex; align-items:center; justify-content:space-between; margin-bottom:22px; }
.wordmark { font-family: var(--font-display); font-weight:500; font-size:22px; color: var(--ink-bright); }
.wordmark::after { content:""; display:inline-block; width:5px; height:5px; margin-left:6px; vertical-align:middle; transform:translateY(-3px); background: var(--acid); border-radius:50%; box-shadow:0 0 6px var(--acid-glow),0 0 14px var(--acid-halo); }
.gear { font-size:18px; color: var(--muted); cursor:pointer; }
/* BCH "B" badge (Bitcoin Cash brand green, distinct from acid) */
.bch-b { display:inline-grid; place-items:center; line-height:0; border-radius:50%; }
.bch-b .bch-logo { width:100%; height:100%; display:block; } /* official BCH logo (simple-icons) */
.bch-b.lg { width:46px; height:46px; box-shadow:0 0 18px rgba(10,193,142,.35); }
.bch-b.sm { width:28px; height:28px; }
/* portfolio donut */
.portfolio { display:flex; align-items:center; gap:20px; margin-bottom:22px; }
.donut { width:128px; height:128px; flex:none; border-radius:50%; position:relative; display:grid; place-items:center;
background: conic-gradient(#0ac18e 0 55%, var(--acid) 55% 82%, #7f8cff 82% 100%); }
.donut::before { content:""; position:absolute; width:96px; height:96px; border-radius:50%; background: var(--sky-deep); }
/* soft even halo, off by default, on hover — a CSS blur (not SVG, so never clipped) */
.donut::after { content:""; position:absolute; inset:-6px; border-radius:50%; z-index:-1;
background: conic-gradient(#0ac18e 0 55%, var(--acid) 55% 82%, #7f8cff 82% 100%);
filter: blur(9px); opacity:0; transition: opacity .4s; }
.donut:hover::after { opacity:.75; }
.d-center { position:relative; z-index:1; text-align:center; }
.d-total { font-family: var(--font-mono); font-size:16px; color: var(--ink-bright); }
.d-label { font-family: var(--font-mono); font-size:8px; letter-spacing:.14em; text-transform:uppercase; color: var(--muted); margin-top:3px; }
.legend { flex:1; }
.leg { display:flex; align-items:center; gap:9px; margin-bottom:11px; font-family: var(--font-mono); font-size:11px; color: var(--ink-soft); }
.leg .sw { width:9px; height:9px; border-radius:3px; flex:none; }
.leg .val { margin-left:auto; color: var(--ink); }
.leg[data-fam] { cursor:pointer; border-radius:7px; transition: background .2s; }
.leg[data-fam]:hover { background: rgba(255,255,255,.04); }
/* MBA — only the dot is acid; text stays neutral. Glow on interaction only. */
.leg .sw { transition: box-shadow .3s; }
.leg.mba:hover .sw { box-shadow: 0 0 9px var(--acid-glow); }
/* BCH card */
.bch-card { background: var(--surface-1); border:1px solid var(--border); border-radius:18px; padding:16px; margin-bottom:18px; }
.bch-head { display:flex; align-items:center; gap:13px; }
.bch-meta { flex:1; }
.bch-name { font-family: var(--font-display); font-weight:500; font-size:17px; color: var(--ink-bright); }
.bch-fuel { font-family: var(--font-mono); font-size:9px; letter-spacing:.06em; color:#0ac18e; margin-top:3px; }
.bch-bal { text-align:right; font-family: var(--font-mono); }
.bch-bal .b { font-size:18px; color: var(--ink-bright); }
.bch-bal .f { font-size:10px; color: var(--muted); margin-top:3px; }
.bch-actions { display:flex; gap:10px; margin-top:15px; }
.bch-actions .mini { flex:1; text-align:center; font-family: var(--font-mono); font-size:10px; letter-spacing:.1em; text-transform:uppercase; padding:11px; border-radius:10px; cursor:pointer; background:transparent; color: var(--ink-soft); border:1px solid var(--border-strong); }
.label-mono { font-family: var(--font-mono); font-size:10px; letter-spacing:.22em; text-transform:uppercase; color: var(--muted); }
.label-row { display:flex; align-items:center; justify-content:space-between; margin: 6px 4px 11px; }
/* activity feed */
.act { display:flex; align-items:center; gap:13px; padding:11px 4px; border-bottom:1px solid var(--border); }
.act:last-child { border-bottom:0; }
.act .ico { width:32px; height:32px; flex:none; border-radius:9px; display:grid; place-items:center; background: var(--surface-1); color: var(--ink-soft); font-size:14px; }
.act .a-main { flex:1; }
.act .a-title { font-family: var(--font-display); font-size:14px; color: var(--ink); }
.act .a-sub { font-family: var(--font-mono); font-size:9px; color: var(--muted); margin-top:2px; }
.act .a-amt { font-family: var(--font-mono); font-size:12px; color: var(--ink-bright); }
.act .a-amt.in { color:#0ac18e; }
/* Recent feed filter — borderless mono labels, evenly spaced, all clickable */
.flab { background:transparent; border:0; padding:0; cursor:pointer; font-family: var(--font-mono); font-size:10px; letter-spacing:.2em; text-transform:uppercase; color: var(--muted); transition: color .3s, text-shadow .3s; }
.flab.active { color: var(--acid); text-shadow:0 0 8px var(--acid-halo); }
/* bottom bar + fab */
.tabbar { position:absolute; left:0; right:0; bottom:0; display:flex; justify-content:space-around; align-items:center; padding:14px 10px 18px; border-top:1px solid var(--border); background: linear-gradient(0deg, var(--sky-deep), transparent); border-radius:0 0 30px 30px; }
.tab { display:flex; flex-direction:column; align-items:center; gap:6px; background:0; border:0; cursor:pointer; }
.tab .ico { font-size:17px; color: var(--muted); }
.tab .lbl { font-family: var(--font-mono); font-size:8px; letter-spacing:.12em; text-transform:uppercase; color: var(--muted); }
/* selected tab = acid glow, universally (matches the central FAB) */
.tab.active .ico { color: var(--acid); text-shadow: 0 0 10px var(--acid-glow), 0 0 20px var(--acid-halo); }
.tab.active .lbl { color: var(--ink-bright); }
.tab:not(.active) .bch-b { opacity:.6; }
.tab.active .bch-b { box-shadow: 0 0 12px var(--acid-glow), 0 0 20px var(--acid-halo); }
.fab { position:relative; margin-top:-28px; flex:none; width:58px; height:58px; border-radius:50%; background: var(--acid); color: var(--sky-deep); border:4px solid var(--sky-deep); cursor:pointer; display:grid; place-items:center; font-size:23px; box-shadow: 0 0 18px var(--acid-glow), 0 0 34px var(--acid-halo); }
</style>
</head>
<body>
<div class="stars" aria-hidden="true" id="stars"></div>
<div class="phone">
<div class="topbar">
<div class="wordmark">Deviant</div>
<div class="gear">⚙</div>
</div>
<!-- Portfolio donut -->
<div class="portfolio">
<div class="donut"><div class="d-center"><div class="d-total">0.0734</div><div class="d-label">BCH total</div></div></div>
<div class="legend">
<div class="leg" data-fam="bch"><span class="sw" style="background:#0ac18e"></span>Bitcoin Cash<span class="val">0.040</span></div>
<div class="leg mba" data-fam="mba"><span class="sw" style="background:var(--acid)"></span>MBA · backed<span class="val">0.020</span></div>
<div class="leg" data-fam="token"><span class="sw" style="background:#7f8cff"></span>NBA · non-backed<span class="val">0.013</span></div>
<div class="leg" style="color:var(--muted);font-size:9px;margin-top:2px;">~ $48.21 · tap to toggle fiat</div>
</div>
</div>
<!-- BCH card: its own card (Rule 4 — asset + fuel) -->
<div class="bch-card">
<div class="bch-head">
<span class="bch-b lg"><svg class="bch-logo" viewBox="0 0 24 24" aria-hidden="true"><circle cx="12" cy="12" r="12" fill="#fff"/><path fill="#0ac18e" d="m10.84 11.22-.688-2.568c.728-.18 2.839-1.051 3.39.506.27 1.682-1.978 1.877-2.702 2.062zm.289 1.313.755 2.829c.868-.228 3.496-.46 3.241-2.351-.433-1.666-3.125-.706-3.996-.478zM24 12c0 6.627-5.373 12-12 12S0 18.627 0 12 5.373 0 12 0s12 5.373 12 12zm-6.341.661c-.183-1.151-1.441-2.095-2.485-2.202.643-.57.969-1.401.57-2.488-.603-1.368-1.989-1.66-3.685-1.377l-.546-2.114-1.285.332.536 2.108c-.338.085-.685.158-1.029.256L9.198 5.08l-1.285.332.545 2.114c-.277.079-2.595.673-2.595.673l.353 1.377s.944-.265.935-.244c.524-.137.771.125.886.372l1.498 5.793c.018.168-.012.454-.372.551.021.012-.935.241-.935.241l.14 1.605s2.296-.588 2.598-.664l.551 2.138 1.285-.332-.551-2.153c.353-.082.697-.168 1.032-.256l.548 2.141 1.285-.332-.551-2.135c1.982-.482 3.38-1.73 3.094-3.64z"/></svg></span>
<div class="bch-meta">
<div class="bch-name">Bitcoin Cash</div>
<div class="bch-fuel">● fuel OK — covers network fees</div>
</div>
<div class="bch-bal"><div class="b">0.0400 BCH</div><div class="f">~ $26.28</div></div>
</div>
<div class="bch-actions">
<button class="mini">Send</button>
<button class="mini">Receive</button>
<button class="mini">Activity</button>
<button class="mini" id="fuseBtn">Fuse</button>
</div>
</div>
<!-- Recent activity -->
<div class="label-row">
<button class="flab active" data-fam="all">Recent</button>
<button class="flab" data-fam="mba">MBA</button>
<button class="flab" data-fam="token">NBA</button>
<button class="flab" data-link="all">View all</button>
</div>
<div class="act" data-fam="bch">
<div class="ico">↓</div>
<div class="a-main"><div class="a-title">Received</div><div class="a-sub">from bchtest:qz9…k4f · 2h ago</div></div>
<div class="a-amt in">+0.010 BCH</div>
</div>
<div class="act" data-fam="mba">
<div class="ico">⇄</div>
<div class="a-main"><div class="a-title">Orbital swap</div><div class="a-sub">50 NOVA → 0.005 BCH · ASM · 1d</div></div>
<div class="a-amt">atomic</div>
</div>
<div class="act" data-fam="mba">
<div class="ico">↓</div>
<div class="a-main"><div class="a-title">Claimed</div><div class="a-sub">Nova reservoir · DEA · 2d</div></div>
<div class="a-amt in">+120 NOVA</div>
</div>
<div class="act" data-fam="mba">
<div class="ico">↑</div>
<div class="a-main"><div class="a-title">Sent</div><div class="a-sub">to bchtest:qp2…7lm · 4d</div></div>
<div class="a-amt">−5 LMN</div>
</div>
<div class="act" data-fam="token">
<div class="ico">↑</div>
<div class="a-main"><div class="a-title">Sent</div><div class="a-sub">Meridian · MTU · 5d</div></div>
<div class="a-amt">−100 MRD</div>
</div>
<!-- BOTTOM BAR -->
<nav class="tabbar">
<button class="tab active"><span class="ico"><span class="bch-b sm"><svg class="bch-logo" viewBox="0 0 24 24" aria-hidden="true"><circle cx="12" cy="12" r="12" fill="#fff"/><path fill="#0ac18e" d="m10.84 11.22-.688-2.568c.728-.18 2.839-1.051 3.39.506.27 1.682-1.978 1.877-2.702 2.062zm.289 1.313.755 2.829c.868-.228 3.496-.46 3.241-2.351-.433-1.666-3.125-.706-3.996-.478zM24 12c0 6.627-5.373 12-12 12S0 18.627 0 12 5.373 0 12 0s12 5.373 12 12zm-6.341.661c-.183-1.151-1.441-2.095-2.485-2.202.643-.57.969-1.401.57-2.488-.603-1.368-1.989-1.66-3.685-1.377l-.546-2.114-1.285.332.536 2.108c-.338.085-.685.158-1.029.256L9.198 5.08l-1.285.332.545 2.114c-.277.079-2.595.673-2.595.673l.353 1.377s.944-.265.935-.244c.524-.137.771.125.886.372l1.498 5.793c.018.168-.012.454-.372.551.021.012-.935.241-.935.241l.14 1.605s2.296-.588 2.598-.664l.551 2.138 1.285-.332-.551-2.153c.353-.082.697-.168 1.032-.256l.548 2.141 1.285-.332-.551-2.135c1.982-.482 3.38-1.73 3.094-3.64z"/></svg></span></span><span class="lbl">Main</span></button>
<button class="tab"><span class="ico">⬡</span><span class="lbl">Assets</span></button>
<button class="fab" id="fab" aria-label="Send, receive, or scan">⇅</button>
<button class="tab"><span class="ico">△</span><span class="lbl">Avalanche</span></button>
<button class="tab"><span class="ico">⧉</span><span class="lbl">Apps</span></button>
</nav>
</div>
<script>
(function generateStars() {
const c = document.getElementById('stars'); if (!c) return;
const count = window.innerWidth < 700 ? 140 : 260;
const frag = document.createDocumentFragment();
for (let i = 0; i < count; i++) {
const s = document.createElement('div'); s.className = 'star';
const roll = Math.random(); let size, opacity, dur;
if (roll < 0.72) { size = 1 + Math.random()*0.7; opacity = 0.32 + Math.random()*0.25; dur = 14 + Math.random()*8; }
else if (roll < 0.93) { size = 1.6 + Math.random()*0.8; opacity = 0.52 + Math.random()*0.26; dur = 10 + Math.random()*6; }
else { size = 2.2 + Math.random()*1.1; opacity = 0.74 + Math.random()*0.26; dur = 8 + Math.random()*5; }
s.style.width = size+'px'; s.style.height = size+'px';
s.style.left = Math.random()*100+'%'; s.style.top = Math.random()*100+'%';
s.style.opacity = opacity; s.style.setProperty('--twinkle-duration', dur+'s'); s.style.setProperty('--twinkle-delay', (Math.random()*dur)+'s');
frag.appendChild(s);
}
c.appendChild(frag);
})();
// Feed filter shared by the Recent labels and the donut segments
function filterFeed(fam) {
document.querySelectorAll('.flab[data-fam]').forEach(function (x) {
x.classList.toggle('active', x.getAttribute('data-fam') === fam);
});
document.querySelectorAll('.act').forEach(function (r) {
r.style.display = (fam === 'all' || r.getAttribute('data-fam') === fam) ? '' : 'none';
});
}
document.querySelectorAll('.flab[data-fam]').forEach(function (b) {
b.addEventListener('click', function () { filterFeed(b.getAttribute('data-fam')); });
});
// Legend rows: click → show that family's transactions
document.querySelectorAll('.leg[data-fam]').forEach(function (l) {
l.addEventListener('click', function () { filterFeed(l.getAttribute('data-fam')); });
});
// View all → reset to the full feed (and would open the Activity screen)
document.querySelectorAll('.flab[data-link]').forEach(function (l) {
l.addEventListener('click', function () { filterFeed('all'); });
});
// Mouse parallax — the starfield drifts with the cursor (à la bch.guru)
(function parallax() {
var layer = document.getElementById('stars');
if (!layer || window.matchMedia('(prefers-reduced-motion: reduce)').matches) return;
window.addEventListener('mousemove', function (e) {
var x = e.clientX / window.innerWidth - 0.5;
var y = e.clientY / window.innerHeight - 0.5;
layer.style.transform = 'translate(' + (-x * 28) + 'px,' + (-y * 28) + 'px)';
});
})();
// Bottom-bar navigation between mockup screens
(function () {
var map = { main:'main-tab.html', assets:'assets-tab.html', avalanche:'avalanche-tab.html', apps:'apps-tab.html' };
document.querySelectorAll('.tabbar .tab').forEach(function (t) {
var el = t.querySelector('.lbl'); if (!el) return;
var dest = map[el.textContent.trim().toLowerCase()];
if (dest && !t.classList.contains('active')) {
t.style.cursor = 'pointer';
t.addEventListener('click', function () { location.href = dest; });
}
});
var gear = document.querySelector('.gear'); if (gear) { gear.style.cursor = 'pointer'; gear.addEventListener('click', function () { location.href = 'settings.html'; }); }
var fab = document.getElementById('fab'); if (fab) fab.addEventListener('click', function () { location.href = 'send-flow.html'; });
var va = document.querySelector('.flab[data-link="all"]'); if (va) va.addEventListener('click', function () { location.href = 'activity.html'; });
var bchSend = document.querySelector('.bch-actions .mini'); if (bchSend) bchSend.addEventListener('click', function () { location.href = 'send-flow.html'; });
var fuseBtn = document.getElementById('fuseBtn'); if (fuseBtn) fuseBtn.addEventListener('click', function () { location.href = 'fuse-flow.html'; });
})();
</script>
</body>
</html>

View file

@ -0,0 +1,107 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Deviant · Onboarding · CosmoGenesis mockup</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Fraunces:opsz,wght@9..144,300;9..144,400;9..144,500;9..144,600&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet">
<link href="../cosmo-genesis.css" rel="stylesheet">
<style>
body { display:flex; justify-content:center; padding:28px 0; }
.phone { position:relative; z-index:1; width:392px; min-height:840px; background: linear-gradient(180deg, rgba(19,26,42,.55), rgba(10,15,28,.55)); border:1px solid var(--border); border-radius:30px; padding:30px 22px; backdrop-filter: blur(2px); overflow:hidden; display:flex; flex-direction:column; }
.view { display:none; flex:1; flex-direction:column; } .view.active { display:flex; }
.wordmark { font-family:var(--font-display); font-weight:500; font-size:30px; color:var(--ink-bright); text-align:center; margin-top:30px; }
.wordmark::after { content:""; display:inline-block; width:8px; height:8px; margin-left:8px; vertical-align:middle; transform:translateY(-6px); background:var(--acid); border-radius:50%; box-shadow:0 0 8px var(--acid-glow),0 0 18px var(--acid-halo); }
.tagline { font-family:var(--font-mono); font-size:11px; color:var(--ink-soft); text-align:center; margin-top:14px; line-height:1.7; }
.ill { width:150px; height:150px; margin:40px auto 10px; border-radius:50%; background:conic-gradient(#0ac18e 0 55%, var(--acid) 55% 82%, #7f8cff 82% 100%); position:relative; display:grid; place-items:center; }
.ill::before { content:""; position:absolute; width:112px; height:112px; border-radius:50%; background:var(--sky-deep); }
.ill span { position:relative; z-index:1; font-family:var(--font-mono); font-size:13px; color:var(--ink-bright); }
.h { font-family:var(--font-display); font-weight:500; font-size:21px; color:var(--ink-bright); margin-bottom:12px; }
.p { font-family:var(--font-mono); font-size:11px; color:var(--ink-soft); line-height:1.75; margin-bottom:14px; }
.callout { padding:14px; border-radius:13px; background:var(--acid-dim); border:1px solid rgba(214,255,61,.3); font-family:var(--font-mono); font-size:10px; color:var(--ink-soft); line-height:1.65; margin-bottom:14px; }
.callout b { color:var(--acid); }
/* seed grid */
.seed { display:grid; grid-template-columns:1fr 1fr; gap:8px; margin:6px 0 14px; }
.word { font-family:var(--font-mono); font-size:11px; color:var(--ink); background:var(--surface-1); border:1px solid var(--border); border-radius:9px; padding:9px 11px; }
.word .n { color:var(--muted); margin-right:7px; }
.seed-warn { font-family:var(--font-mono); font-size:9px; color:var(--risk-warn); line-height:1.6; margin-bottom:14px; }
.spacer { flex:1; }
.cta { width:100%; font-family:var(--font-mono); font-size:12px; letter-spacing:.12em; text-transform:uppercase; color:var(--sky-deep); background:var(--acid); border:0; border-radius:12px; padding:15px; cursor:pointer; box-shadow:0 0 16px var(--acid-halo); }
.ghost { width:100%; font-family:var(--font-mono); font-size:11px; letter-spacing:.1em; text-transform:uppercase; color:var(--ink-soft); background:transparent; border:1px solid var(--border-strong); border-radius:12px; padding:14px; cursor:pointer; margin-top:10px; }
.dots { display:flex; gap:6px; justify-content:center; margin-bottom:16px; }
.dot { width:7px; height:7px; border-radius:50%; background:var(--surface-2); }
.dot.on { background:var(--acid); box-shadow:0 0 8px var(--acid-halo); }
.net { display:flex; align-items:center; justify-content:space-between; padding:13px 15px; border-radius:12px; background:var(--surface-1); border:1px solid var(--border); margin-bottom:10px; font-family:var(--font-mono); font-size:12px; color:var(--ink); }
.net.sel { border-color:var(--acid); } .net .ok { color:#0ac18e; font-size:10px; } .net .rec { color:var(--muted); font-size:9px; }
</style>
</head>
<body>
<div class="stars" aria-hidden="true" id="stars"></div>
<div class="phone">
<!-- WELCOME -->
<section class="view active" id="v-welcome">
<div class="wordmark">Deviant</div>
<div class="tagline">A Bitcoin Cash wallet for backed assets<br>that the chain — not a custodian — enforces.</div>
<div class="ill"><span>BCH · MBA · NBA</span></div>
<div class="spacer"></div>
<button class="cta" data-go="concept">Create wallet</button>
<button class="ghost" data-go="concept">Restore from seed</button>
</section>
<!-- CONCEPT INTRO -->
<section class="view" id="v-concept">
<div class="dots"><span class="dot on"></span><span class="dot"></span><span class="dot"></span></div>
<div class="h">Before you start</div>
<div class="callout"><b>BCH is the fuel.</b> Every transaction needs a small plain-BCH input for the network fee. The wallet keeps you above that floor and warns before a send can fail.</div>
<div class="p"><b style="color:var(--ink-bright)">Two tiers.</b> <b style="color:var(--ink-bright)">A</b> = a native CashTokens asset validated by miners at consensus level. <b style="color:var(--ink-bright)">B</b> = plain BCH your wallet displays through a local definition — for closed, trusting groups only.</div>
<div class="p">Deviant ships <b style="color:var(--ink-bright)">no default registries and no trusted keys</b> — you are the authority (ADR-0008).</div>
<div class="spacer"></div>
<button class="cta" data-go="seed">Got it — create my seed</button>
</section>
<!-- SEED BACKUP -->
<section class="view" id="v-seed">
<div class="dots"><span class="dot"></span><span class="dot on"></span><span class="dot"></span></div>
<div class="h">Back up your seed</div>
<div class="p">24 words. Write them down in order. This is the only way to recover your wallet.</div>
<div class="seed">
<div class="word"><span class="n">1</span>orbit</div><div class="word"><span class="n">2</span>spectral</div>
<div class="word"><span class="n">3</span>ledger</div><div class="word"><span class="n">4</span>nova</div>
<div class="word"><span class="n">5</span>canyon</div><div class="word"><span class="n">6</span>fathom</div>
<div class="word"><span class="n">7</span>ember</div><div class="word"><span class="n">8</span>quartz</div>
<div class="word"><span class="n">9</span>tidal</div><div class="word"><span class="n">10</span>verge</div>
<div class="word"><span class="n">11</span>cinder</div><div class="word"><span class="n">12</span>… +12</div>
</div>
<div class="seed-warn">⚠ No screenshot. The Create flow will not land on Home until you confirm a random subset of these words.</div>
<div class="spacer"></div>
<button class="cta" data-go="network">I've written them down</button>
</section>
<!-- NETWORK + LAND -->
<section class="view" id="v-network">
<div class="dots"><span class="dot"></span><span class="dot"></span><span class="dot on"></span></div>
<div class="h">Choose a network</div>
<div class="net sel"><span>Chipnet <span class="rec">· recommended during development</span></span><span class="ok">● selected</span></div>
<div class="net"><span>Testnet4</span><span>›</span></div>
<div class="net"><span>Mainnet <span class="rec">· real funds</span></span><span>›</span></div>
<div class="callout" style="margin-top:14px">On Home: <b>BCH lives in its own card</b> — it's also the fuel for every other action. Get some before sending tokens.</div>
<div class="spacer"></div>
<button class="cta" data-go="welcome">Enter wallet →</button>
</section>
</div>
<script>
(function generateStars(){const c=document.getElementById('stars');if(!c)return;const n=window.innerWidth<700?120:200;const f=document.createDocumentFragment();for(let i=0;i<n;i++){const s=document.createElement('div');s.className='star';const r=Math.random();let sz,o,d;if(r<.75){sz=1+Math.random()*.6;o=.28+Math.random()*.24;d=14+Math.random()*8;}else if(r<.94){sz=1.5+Math.random()*.7;o=.5+Math.random()*.25;d=10+Math.random()*6;}else{sz=2+Math.random()*1;o=.7+Math.random()*.26;d=8+Math.random()*5;}s.style.width=sz+'px';s.style.height=sz+'px';s.style.left=Math.random()*100+'%';s.style.top=Math.random()*100+'%';s.style.opacity=o;s.style.setProperty('--twinkle-duration',d+'s');s.style.setProperty('--twinkle-delay',(Math.random()*d)+'s');f.appendChild(s);}c.appendChild(f);})();
function showView(id){document.querySelectorAll('.view').forEach(function(v){v.classList.toggle('active',v.id==='v-'+id);});}
document.querySelectorAll('[data-go]').forEach(function(el){el.addEventListener('click',function(){ if(el.getAttribute('data-go')==='welcome'){location.href='main-tab.html';return;} showView(el.getAttribute('data-go'));});});
(function parallax(){var l=document.getElementById('stars');if(!l||window.matchMedia('(prefers-reduced-motion: reduce)').matches)return;window.addEventListener('mousemove',function(e){var x=e.clientX/window.innerWidth-.5,y=e.clientY/window.innerHeight-.5;l.style.transform='translate('+(-x*28)+'px,'+(-y*28)+'px)';});})();
</script>
</body>
</html>

View file

@ -0,0 +1,296 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Deviant · Send / Receive / Scan · CosmoGenesis mockup</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Fraunces:opsz,wght@9..144,300;9..144,400;9..144,500;9..144,600&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet">
<link href="../cosmo-genesis.css" rel="stylesheet">
<style>
body { display:flex; justify-content:center; padding:28px 0; }
.phone { position:relative; z-index:1; width:392px; min-height:840px; background: linear-gradient(180deg, rgba(19,26,42,.55), rgba(10,15,28,.55)); border:1px solid var(--border); border-radius:30px; padding:22px 18px 92px; backdrop-filter: blur(2px); overflow:hidden; }
/* flow header */
.flow-head { display:flex; align-items:center; gap:12px; margin-bottom:20px; }
.back { font-size:20px; color:var(--ink-soft); cursor:pointer; background:0; border:0; line-height:1; }
.flow-title { font-family:var(--font-display); font-weight:500; font-size:21px; color:var(--ink-bright); }
.flow-step { margin-left:auto; font-family:var(--font-mono); font-size:9px; letter-spacing:.12em; color:var(--muted); text-transform:uppercase; }
/* views */
.view { display:none; }
.view.active { display:block; }
/* FAB quick-action sheet */
.qa-grab { width:38px; height:4px; border-radius:2px; background:var(--border-strong); margin:2px auto 22px; }
.qa-title { font-family:var(--font-display); font-weight:500; font-size:23px; color:var(--ink-bright); margin-bottom:4px; }
.qa-sub { font-family:var(--font-mono); font-size:10px; color:var(--muted); margin-bottom:22px; }
.qa { display:flex; align-items:center; gap:15px; padding:17px 16px; border-radius:16px; background:var(--surface-1); border:1px solid var(--border); margin-bottom:12px; cursor:pointer; transition:border-color .25s, transform .25s var(--ease-out); }
.qa:hover { border-color:var(--acid); transform:translateY(-2px); }
.qa .g { width:44px; height:44px; flex:none; border-radius:13px; display:grid; place-items:center; font-size:21px; background:var(--surface-2); color:var(--acid); }
.qa .t { font-family:var(--font-display); font-weight:500; font-size:17px; color:var(--ink-bright); }
.qa .s { font-family:var(--font-mono); font-size:9.5px; color:var(--muted); margin-top:3px; }
/* form fields */
.field { margin-bottom:16px; }
.flabel { font-family:var(--font-mono); font-size:9px; letter-spacing:.2em; text-transform:uppercase; color:var(--muted); margin:0 2px 8px; display:block; }
.input { width:100%; background:var(--surface-1); border:1px solid var(--border-strong); border-radius:12px; padding:13px 14px; color:var(--ink-bright); font-family:var(--font-mono); font-size:13px; }
.input::placeholder { color:var(--muted); }
.hint { font-family:var(--font-mono); font-size:9px; margin:7px 2px 0; line-height:1.5; }
.hint.ok { color:#0ac18e; } .hint.warn { color:var(--risk-warn); }
/* asset chip selector */
.asset-pick { display:flex; align-items:center; gap:12px; padding:13px 14px; border-radius:12px; background:var(--surface-1); border:1px solid var(--border-strong); cursor:pointer; }
.asset-pick .ac { width:34px; height:34px; flex:none; border-radius:10px; display:grid; place-items:center; background:var(--surface-2); font-family:var(--font-mono); font-size:12px; color:var(--ink-soft); }
.asset-pick .an { font-family:var(--font-display); font-weight:500; font-size:15px; color:var(--ink-bright); }
.asset-pick .as { font-family:var(--font-mono); font-size:9px; color:var(--muted); margin-top:2px; }
.asset-pick .chev { margin-left:auto; color:var(--muted); }
.chip { font-family:var(--font-mono); font-size:9px; letter-spacing:.06em; text-transform:uppercase; padding:3px 7px; border-radius:6px; border:1px solid var(--border-strong); color:var(--ink-soft); display:inline-block; }
.chip.b { color:var(--risk-warn); border-color:var(--risk-warn); }
.chip.warn { color:var(--risk-warn); border-color:rgba(255,159,28,.4); }
/* primary action */
.cta { width:100%; font-family:var(--font-mono); font-size:12px; letter-spacing:.12em; text-transform:uppercase; color:var(--sky-deep); background:var(--acid); border:0; border-radius:12px; padding:15px; cursor:pointer; box-shadow:0 0 16px var(--acid-halo); margin-top:6px; }
.cta.disabled { background:var(--surface-2); color:var(--muted); box-shadow:none; cursor:not-allowed; }
/* review rows */
.rev-block { background:var(--surface-1); border:1px solid var(--border); border-radius:16px; padding:15px; margin-bottom:14px; }
.rev-row { display:flex; justify-content:space-between; gap:12px; padding:8px 0; border-bottom:1px solid var(--border); font-family:var(--font-mono); font-size:11px; }
.rev-row:last-child { border-bottom:0; }
.rev-row .k { color:var(--muted); } .rev-row .v { color:var(--ink); text-align:right; }
.rev-note { font-family:var(--font-mono); font-size:9px; color:var(--muted); line-height:1.55; margin-top:8px; }
.sec-label { font-family:var(--font-mono); font-size:9px; letter-spacing:.2em; text-transform:uppercase; color:var(--muted); margin:0 2px 9px; }
/* D-5 raw-BCH co-display */
.d5 { display:flex; align-items:baseline; justify-content:center; gap:10px; padding:14px; border-radius:14px; background:rgba(255,159,28,.06); border:1px solid rgba(255,159,28,.25); margin-bottom:14px; }
.d5 .tok { font-family:var(--font-mono); font-size:18px; color:var(--ink-bright); }
.d5 .eq { color:var(--risk-warn); font-family:var(--font-mono); font-size:13px; }
.d5 .raw { font-family:var(--font-mono); font-size:14px; color:var(--risk-warn); }
/* friction ladder */
.ladder { background:var(--surface-1); border:1px solid rgba(255,159,28,.35); border-radius:16px; padding:15px; margin-bottom:14px; }
.ladder .lh { font-family:var(--font-mono); font-size:9px; letter-spacing:.16em; text-transform:uppercase; color:var(--risk-warn); margin-bottom:10px; }
.lstep { display:flex; gap:10px; align-items:flex-start; padding:7px 0; font-family:var(--font-mono); font-size:10px; color:var(--ink-soft); line-height:1.5; }
.lstep .n { color:var(--risk-warn); flex:none; }
.lstep.done .n { color:#0ac18e; }
.lstep.pending { color:var(--muted); }
.delay { display:flex; align-items:center; gap:9px; margin-top:6px; font-family:var(--font-mono); font-size:10px; color:var(--risk-warn); }
.delay .ring { width:15px; height:15px; border-radius:50%; border:2px solid var(--risk-warn); border-top-color:transparent; animation:spin 1s linear infinite; }
@keyframes spin { to { transform:rotate(360deg); } }
/* receive / scan */
.qr { width:188px; height:188px; margin:6px auto 18px; border-radius:18px; background:
repeating-linear-gradient(0deg, var(--ink-bright) 0 7px, transparent 7px 14px),
repeating-linear-gradient(90deg, var(--ink-bright) 0 7px, transparent 7px 14px);
background-color:#fff; background-blend-mode:multiply; opacity:.92; }
.addr-box { font-family:var(--font-mono); font-size:11px; color:var(--ink); background:var(--surface-1); border:1px solid var(--border); border-radius:12px; padding:13px; text-align:center; word-break:break-all; margin-bottom:14px; }
.row-btns { display:flex; gap:10px; }
.row-btns .ghost { flex:1; text-align:center; font-family:var(--font-mono); font-size:10px; letter-spacing:.1em; text-transform:uppercase; padding:13px; border-radius:11px; cursor:pointer; background:transparent; color:var(--ink-soft); border:1px solid var(--border-strong); }
.scan-frame { position:relative; width:230px; height:230px; margin:14px auto 18px; border-radius:22px; background:var(--surface-2); display:grid; place-items:center; overflow:hidden; }
.scan-frame .corner { position:absolute; width:34px; height:34px; border:3px solid var(--acid); box-shadow:0 0 12px var(--acid-halo); }
.scan-frame .tl { top:14px; left:14px; border-right:0; border-bottom:0; border-radius:8px 0 0 0; }
.scan-frame .tr { top:14px; right:14px; border-left:0; border-bottom:0; border-radius:0 8px 0 0; }
.scan-frame .bl { bottom:14px; left:14px; border-right:0; border-top:0; border-radius:0 0 0 8px; }
.scan-frame .br { bottom:14px; right:14px; border-left:0; border-top:0; border-radius:0 0 8px 0; }
.scan-frame .laser { position:absolute; left:18px; right:18px; height:2px; background:var(--acid); box-shadow:0 0 10px var(--acid-glow); animation:scan 2.4s ease-in-out infinite; }
@keyframes scan { 0%,100%{ top:24px; } 50%{ top:206px; } }
.scan-frame .ico { font-size:34px; color:var(--muted); }
/* bottom bar + fab */
.tabbar { position:absolute; left:0; right:0; bottom:0; display:flex; justify-content:space-around; align-items:center; padding:14px 10px 18px; border-top:1px solid var(--border); background: linear-gradient(0deg, var(--sky-deep), transparent); border-radius:0 0 30px 30px; }
.tab { display:flex; flex-direction:column; align-items:center; gap:6px; background:0; border:0; cursor:pointer; }
.tab .ico { font-size:17px; color: var(--muted); }
.tab .lbl { font-family: var(--font-mono); font-size:8px; letter-spacing:.12em; text-transform:uppercase; color: var(--muted); }
.tab.active .ico { color: var(--acid); text-shadow: 0 0 10px var(--acid-glow), 0 0 20px var(--acid-halo); }
.tab.active .lbl { color: var(--ink-bright); }
.tab:not(.active) .bch-b { opacity:.6; }
.bch-b { display:inline-grid; place-items:center; line-height:0; border-radius:50%; }
.bch-b .bch-logo { width:100%; height:100%; display:block; }
.bch-b.sm { width:28px; height:28px; }
.fab { position:relative; margin-top:-28px; flex:none; width:58px; height:58px; border-radius:50%; background: var(--acid); color: var(--sky-deep); border:4px solid var(--sky-deep); cursor:pointer; display:grid; place-items:center; font-size:23px; box-shadow: 0 0 18px var(--acid-glow), 0 0 34px var(--acid-halo); }
.fab.active { transform:rotate(45deg); }
</style>
</head>
<body>
<div class="stars" aria-hidden="true" id="stars"></div>
<div class="phone">
<!-- ============ FAB quick-action sheet ============ -->
<section class="view active" id="v-actions">
<div class="qa-grab"></div>
<div class="qa-title">Quick actions</div>
<div class="qa-sub">Send / Receive stay verbs — not destinations.</div>
<div class="qa" data-go="send"><div class="g">↑</div><div><div class="t">Send</div><div class="s">Pay BCH or an asset to an address</div></div></div>
<div class="qa" data-go="receive"><div class="g">↓</div><div><div class="t">Receive</div><div class="s">Show your address / QR</div></div></div>
<div class="qa" data-go="scan"><div class="g">⌗</div><div><div class="t">Scan QR</div><div class="s">Read an address, payment or definition</div></div></div>
</section>
<!-- ============ SEND — recipient + amount ============ -->
<section class="view" id="v-send">
<div class="flow-head">
<button class="back" data-go="actions">←</button>
<div class="flow-title">Send</div>
<div class="flow-step">1 / 2 · details</div>
</div>
<div class="field">
<span class="flabel">Asset</span>
<div class="asset-pick" data-go="send">
<div class="ac">ZC</div>
<div><div class="an">ZCoin <span class="chip b">B</span></div><div class="as">wallet-convention token · unverified definition</div></div>
<div class="chev">⌄</div>
</div>
</div>
<div class="field">
<span class="flabel">Recipient</span>
<input class="input" value="bchtest:qz9f8s2m4k…d0k4f" spellcheck="false">
<div class="hint warn">⚠ Token-aware: a legacy (non-token) address may render this FT invisible to the recipient.</div>
</div>
<div class="field">
<span class="flabel">Amount</span>
<input class="input" value="100 ZC">
<div class="hint ok">● fuel OK — plain BCH covers the ~2,000 sat network fee ✓</div>
</div>
<button class="cta" data-go="review">Review →</button>
</section>
<!-- ============ SEND — review (Tier B, >1 BCH → full friction ladder) ============ -->
<section class="view" id="v-review">
<div class="flow-head">
<button class="back" data-go="send">←</button>
<div class="flow-title">Review send</div>
<div class="flow-step">2 / 2 · confirm</div>
</div>
<!-- D-5 mandatory raw-BCH co-display (V2.7 §14) -->
<div class="d5">
<span class="tok">100 ZC</span>
<span class="eq">≡</span>
<span class="raw">1,000,000 sat</span>
</div>
<div class="rev-block">
<div class="rev-row"><span class="k">Network fee (plain BCH ✓)</span><span class="v">~2,000 sat</span></div>
<div class="rev-row"><span class="k">Moves with the asset</span><span class="v">1,000,000 sat (dust 675)</span></div>
<div class="rev-row"><span class="k">Fee inputs</span><span class="v">plain BCH ✓ · Rule 4</span></div>
<div class="rev-note">Tier B is a wallet-convention token. The chain sees only BCH — the recipient's wallet needs the ZCoin definition (ADR-0010) to display it, or they just see plain BCH. <span style="color:var(--acid);cursor:pointer">[ Share definition ]</span></div>
</div>
<!-- ADR-0013 graduated friction ladder (>1 BCH band) -->
<div class="ladder">
<div class="lh">⚠ Unsigned B-token send · 1,000,000 sat → &gt; 1 BCH band</div>
<div class="lstep done"><span class="n">✓</span><span>D-4 raw-BCH shown · D-5 confirmation shown</span></div>
<div class="lstep done"><span class="n">✓</span><span>Typed the BCH amount in literal sats <span class="chip">1000000</span></span></div>
<div class="lstep done"><span class="n">✓</span><span>Acknowledged unverified transfer</span></div>
<div class="lstep"><span class="n">○</span><span>Type the issuer label or <span class="chip warn">UNVERIFIED</span> to release</span></div>
<input class="input" placeholder="type UNVERIFIED" style="margin-top:8px">
<div class="delay"><span class="ring"></span> Broadcast unlocks in 10s — deliberate friction for &gt; 1 BCH</div>
</div>
<div class="rev-note" style="margin:0 2px 12px">Thresholds tunable in Settings → Security. There is no amount above which the send becomes impossible — you are the authority (ADR-0008).</div>
<button class="cta disabled">Confirm &amp; broadcast</button>
</section>
<!-- ============ RECEIVE ============ -->
<section class="view" id="v-receive">
<div class="flow-head">
<button class="back" data-go="actions">←</button>
<div class="flow-title">Receive</div>
<div class="flow-step">BCH · chipnet</div>
</div>
<div class="qr" role="img" aria-label="QR code"></div>
<div class="addr-box">bchtest:qpm4r7x2v9k8h3n6t0sd5wq…7lm</div>
<div class="row-btns">
<button class="ghost">Copy</button>
<button class="ghost">Share</button>
<button class="ghost">Request amount</button>
</div>
<div class="rev-note" style="text-align:center;margin-top:16px">To receive a Tier-A token, any address works — your wallet detects the FT on-chain. For a Tier-B token the sender must also share its definition.</div>
</section>
<!-- ============ SCAN ============ -->
<section class="view" id="v-scan">
<div class="flow-head">
<button class="back" data-go="actions">←</button>
<div class="flow-title">Scan QR</div>
<div class="flow-step">camera</div>
</div>
<div class="scan-frame">
<span class="corner tl"></span><span class="corner tr"></span><span class="corner bl"></span><span class="corner br"></span>
<span class="laser"></span>
<span class="ico">⌗</span>
</div>
<div class="rev-note" style="text-align:center">Point at an address, a payment request, or a Tier-B token definition (ADR-0010).</div>
<div class="row-btns" style="margin-top:16px">
<button class="ghost">Paste from clipboard</button>
<button class="ghost">Upload image</button>
</div>
</section>
<!-- BOTTOM BAR -->
<nav class="tabbar">
<button class="tab"><span class="ico"><span class="bch-b sm"><svg class="bch-logo" viewBox="0 0 24 24" aria-hidden="true"><circle cx="12" cy="12" r="12" fill="#fff"/><path fill="#0ac18e" d="m10.84 11.22-.688-2.568c.728-.18 2.839-1.051 3.39.506.27 1.682-1.978 1.877-2.702 2.062zm.289 1.313.755 2.829c.868-.228 3.496-.46 3.241-2.351-.433-1.666-3.125-.706-3.996-.478zM24 12c0 6.627-5.373 12-12 12S0 18.627 0 12 5.373 0 12 0s12 5.373 12 12zm-6.341.661c-.183-1.151-1.441-2.095-2.485-2.202.643-.57.969-1.401.57-2.488-.603-1.368-1.989-1.66-3.685-1.377l-.546-2.114-1.285.332.536 2.108c-.338.085-.685.158-1.029.256L9.198 5.08l-1.285.332.545 2.114c-.277.079-2.595.673-2.595.673l.353 1.377s.944-.265.935-.244c.524-.137.771.125.886.372l1.498 5.793c.018.168-.012.454-.372.551.021.012-.935.241-.935.241l.14 1.605s2.296-.588 2.598-.664l.551 2.138 1.285-.332-.551-2.153c.353-.082.697-.168 1.032-.256l.548 2.141 1.285-.332-.551-2.135c1.982-.482 3.38-1.73 3.094-3.64z"/></svg></span></span><span class="lbl">Main</span></button>
<button class="tab"><span class="ico">⬡</span><span class="lbl">Assets</span></button>
<button class="fab active" id="fab" data-go="actions" aria-label="Send, receive, or scan">⇅</button>
<button class="tab"><span class="ico">△</span><span class="lbl">Avalanche</span></button>
<button class="tab"><span class="ico">⧉</span><span class="lbl">Apps</span></button>
</nav>
</div>
<script>
(function generateStars() {
const c = document.getElementById('stars'); if (!c) return;
const count = window.innerWidth < 700 ? 140 : 260;
const frag = document.createDocumentFragment();
for (let i = 0; i < count; i++) {
const s = document.createElement('div'); s.className = 'star';
const roll = Math.random(); let size, opacity, dur;
if (roll < 0.72) { size = 1 + Math.random()*0.7; opacity = 0.32 + Math.random()*0.25; dur = 14 + Math.random()*8; }
else if (roll < 0.93) { size = 1.6 + Math.random()*0.8; opacity = 0.52 + Math.random()*0.26; dur = 10 + Math.random()*6; }
else { size = 2.2 + Math.random()*1.1; opacity = 0.74 + Math.random()*0.26; dur = 8 + Math.random()*5; }
s.style.width = size+'px'; s.style.height = size+'px';
s.style.left = Math.random()*100+'%'; s.style.top = Math.random()*100+'%';
s.style.opacity = opacity; s.style.setProperty('--twinkle-duration', dur+'s'); s.style.setProperty('--twinkle-delay', (Math.random()*dur)+'s');
frag.appendChild(s);
}
c.appendChild(frag);
})();
// View switcher (FAB → Send/Receive/Scan; Send → Review; back arrows)
function showView(id) {
document.querySelectorAll('.view').forEach(function (v) { v.classList.toggle('active', v.id === 'v-' + id); });
var fab = document.getElementById('fab');
if (fab) fab.classList.toggle('active', id === 'actions');
}
document.querySelectorAll('[data-go]').forEach(function (el) {
el.addEventListener('click', function () { showView(el.getAttribute('data-go')); });
});
// Mouse parallax
(function parallax() {
var layer = document.getElementById('stars');
if (!layer || window.matchMedia('(prefers-reduced-motion: reduce)').matches) return;
window.addEventListener('mousemove', function (e) {
var x = e.clientX / window.innerWidth - 0.5, y = e.clientY / window.innerHeight - 0.5;
layer.style.transform = 'translate(' + (-x * 28) + 'px,' + (-y * 28) + 'px)';
});
})();
// Bottom-bar navigation between mockup screens
(function () {
var map = { main:'main-tab.html', assets:'assets-tab.html', avalanche:'avalanche-tab.html', apps:'apps-tab.html' };
document.querySelectorAll('.tabbar .tab').forEach(function (t) {
var el = t.querySelector('.lbl'); if (!el) return;
var dest = map[el.textContent.trim().toLowerCase()];
if (dest) { t.style.cursor = 'pointer'; t.addEventListener('click', function () { location.href = dest; }); }
});
})();
</script>
</body>
</html>

View file

@ -0,0 +1,175 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Deviant · Settings · CosmoGenesis mockup</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Fraunces:opsz,wght@9..144,300;9..144,400;9..144,500;9..144,600&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet">
<link href="../cosmo-genesis.css" rel="stylesheet">
<style>
body { display:flex; justify-content:center; padding:28px 0; }
.phone { position:relative; z-index:1; width:392px; min-height:840px; background: linear-gradient(180deg, rgba(19,26,42,.55), rgba(10,15,28,.55)); border:1px solid var(--border); border-radius:30px; padding:22px 18px 92px; backdrop-filter: blur(2px); overflow:hidden; }
.flow-head { display:flex; align-items:center; gap:12px; margin-bottom:20px; }
.back { font-size:20px; color:var(--ink-soft); cursor:pointer; background:0; border:0; line-height:1; }
.flow-title { font-family:var(--font-display); font-weight:500; font-size:22px; color:var(--ink-bright); }
.group { margin-bottom:22px; }
.group-label { font-family:var(--font-mono); font-size:9px; letter-spacing:.2em; text-transform:uppercase; color:var(--muted); margin:0 4px 9px; }
.card { background:var(--surface-1); border:1px solid var(--border); border-radius:16px; overflow:hidden; }
.srow { display:flex; align-items:center; gap:13px; padding:14px 15px; border-bottom:1px solid var(--border); cursor:pointer; }
.srow:last-child { border-bottom:0; }
.srow .si { width:30px; height:30px; flex:none; border-radius:9px; display:grid; place-items:center; font-size:14px; background:var(--surface-2); color:var(--ink-soft); }
.srow .st { font-family:var(--font-display); font-size:14.5px; color:var(--ink-bright); }
.srow .ss { font-family:var(--font-mono); font-size:9px; color:var(--muted); margin-top:2px; line-height:1.4; }
.srow .sv { margin-left:auto; font-family:var(--font-mono); font-size:11px; color:var(--ink-soft); display:flex; align-items:center; gap:8px; }
.srow .chev { color:var(--muted); }
.ok { color:#0ac18e; }
.pill { font-family:var(--font-mono); font-size:8.5px; letter-spacing:.08em; text-transform:uppercase; padding:3px 7px; border-radius:6px; border:1px solid var(--border-strong); color:var(--ink-soft); }
.pill.acid { color:var(--acid); border-color:rgba(214,255,61,.4); }
/* toggle switch */
.switch { width:38px; height:22px; border-radius:11px; background:var(--surface-2); border:1px solid var(--border-strong); position:relative; flex:none; cursor:pointer; transition:background .25s; }
.switch::after { content:""; position:absolute; top:2px; left:2px; width:16px; height:16px; border-radius:50%; background:var(--muted); transition:transform .25s, background .25s; }
.switch.on { background:var(--acid); border-color:var(--acid); box-shadow:0 0 10px var(--acid-halo); }
.switch.on::after { transform:translateX(16px); background:var(--sky-deep); }
/* empty-state callout (ADR-0008 honest posture) */
.empty { padding:15px; border-radius:14px; background:rgba(214,255,61,.05); border:1px dashed rgba(214,255,61,.3); font-family:var(--font-mono); font-size:10px; color:var(--ink-soft); line-height:1.6; }
.empty b { color:var(--ink-bright); }
.add { margin-top:10px; font-family:var(--font-mono); font-size:10px; letter-spacing:.08em; text-transform:uppercase; color:var(--acid); cursor:pointer; }
/* friction-threshold readout */
.thr { padding:13px 15px; font-family:var(--font-mono); font-size:10px; color:var(--ink-soft); line-height:1.7; border-top:1px solid var(--border); }
.thr .t { color:var(--risk-warn); }
/* tabbar */
.tabbar { position:absolute; left:0; right:0; bottom:0; display:flex; justify-content:space-around; align-items:center; padding:14px 10px 18px; border-top:1px solid var(--border); background: linear-gradient(0deg, var(--sky-deep), transparent); border-radius:0 0 30px 30px; }
.tab { display:flex; flex-direction:column; align-items:center; gap:6px; background:0; border:0; cursor:pointer; }
.tab .ico { font-size:17px; color: var(--muted); } .tab .lbl { font-family: var(--font-mono); font-size:8px; letter-spacing:.12em; text-transform:uppercase; color: var(--muted); }
.tab.active .ico { color: var(--acid); text-shadow: 0 0 10px var(--acid-glow), 0 0 20px var(--acid-halo); } .tab.active .lbl { color: var(--ink-bright); }
.tab:not(.active) .bch-b { opacity:.6; }
.bch-b { display:inline-grid; place-items:center; line-height:0; border-radius:50%; } .bch-b .bch-logo { width:100%; height:100%; display:block; } .bch-b.sm { width:28px; height:28px; }
.fab { position:relative; margin-top:-28px; flex:none; width:58px; height:58px; border-radius:50%; background: var(--acid); color: var(--sky-deep); border:4px solid var(--sky-deep); cursor:pointer; display:grid; place-items:center; font-size:23px; box-shadow: 0 0 18px var(--acid-glow), 0 0 34px var(--acid-halo); }
.scroll { max-height:720px; overflow-y:auto; margin:0 -4px; padding:0 4px; }
.scroll::-webkit-scrollbar { width:0; }
</style>
</head>
<body>
<div class="stars" aria-hidden="true" id="stars"></div>
<div class="phone">
<div class="flow-head">
<button class="back" data-link="main">←</button>
<div class="flow-title">Settings</div>
</div>
<div class="scroll">
<!-- SECURITY -->
<div class="group">
<div class="group-label">Security</div>
<div class="card">
<div class="srow"><div class="si">🌱</div><div><div class="st">Seed backup</div><div class="ss">24 words · confirm-backup complete</div></div><div class="sv"><span class="ok">✓ backed up</span></div></div>
<div class="srow"><div class="si">⌘</div><div><div class="st">PIN / biometric</div><div class="ss">Unlock & signing</div></div><div class="sv"><span class="pill">Face ID</span><span class="chev">›</span></div></div>
<div class="srow"><div class="si">⚠</div><div><div class="st">Send friction thresholds</div><div class="ss">Unsigned B-token send ladder (ADR-0013)</div></div><div class="sv"><span class="chev">›</span></div></div>
<div class="thr">
<div>&lt; 100,000 sat — <span class="t">D-4 + D-5 baseline</span></div>
<div>100k – 0.1 BCH — <span class="t">+ type sats</span></div>
<div>0.1 – 1 BCH — <span class="t">+ acknowledge</span></div>
<div>&gt; 1 BCH — <span class="t">+ 10s delay + type UNVERIFIED</span></div>
</div>
</div>
</div>
<!-- PRIVACY -->
<div class="group">
<div class="group-label">Privacy</div>
<div class="card">
<div class="srow"><div class="si">⊜</div><div><div class="st">CashFusion</div><div class="ss">BCH CoinJoin — break chain-analysis links</div></div><div class="sv"><span class="switch on" id="fuseSw"></span></div></div>
<div class="srow"><div class="si">⟲</div><div><div class="st">Auto-fuse idle BCH</div><div class="ss">Fuse plain BCH UTXOs in the background</div></div><div class="sv"><span class="switch" id="autoSw"></span></div></div>
</div>
<div class="empty" style="margin-top:9px">Also available as a <b>Fuse</b> action on the BCH card. Only plain BCH is fused — token (FT) UTXOs are never touched (fusing one would burn the tokens, Rule 4).</div>
</div>
<!-- NETWORK -->
<div class="group">
<div class="group-label">Network</div>
<div class="card">
<div class="srow"><div class="si">◉</div><div><div class="st">Chipnet</div><div class="ss">Recommended while the wallet is in active development</div></div><div class="sv"><span class="ok">● selected</span></div></div>
<div class="srow"><div class="si">○</div><div><div class="st">Testnet4</div></div><div class="sv"><span class="chev">›</span></div></div>
<div class="srow"><div class="si">○</div><div><div class="st">Mainnet</div><div class="ss">Real funds</div></div><div class="sv"><span class="chev">›</span></div></div>
</div>
</div>
<!-- REGISTRIES -->
<div class="group">
<div class="group-label">Registries · Trusted keys</div>
<div class="empty">
Deviant ships <b>no default registries</b> and <b>no default trusted keys</b> (ADR-0008). The wallet never becomes the authority — add your own when ready. Tier-B definitions are unverified until you root them in a key you trust.
<div class="add">+ Add registry &nbsp;·&nbsp; + Add trusted key</div>
</div>
</div>
<!-- ADDRESS BOOK -->
<div class="group">
<div class="group-label">Address book</div>
<div class="card">
<div class="srow"><div class="si">A</div><div><div class="st">Alice (cold)</div><div class="ss">bchtest:qz9…k4f</div></div><div class="sv"><span class="chev">›</span></div></div>
<div class="srow"><div class="si">+</div><div><div class="st">Add address</div></div><div class="sv"><span class="chev">›</span></div></div>
</div>
</div>
<!-- ABOUT -->
<div class="group">
<div class="group-label">About</div>
<div class="card">
<div class="srow"><div class="si">ⓘ</div><div><div class="st">Version</div><div class="ss">Deviant 0.1.0 · spec V2.7</div></div><div class="sv"><span class="chev">›</span></div></div>
<div class="srow"><div class="si">⌥</div><div><div class="st">Tier explainer</div><div class="ss">A chain-enforced · B wallet-convention</div></div><div class="sv"><span class="chev">›</span></div></div>
</div>
</div>
</div>
<!-- BOTTOM BAR -->
<nav class="tabbar">
<button class="tab"><span class="ico"><span class="bch-b sm"><svg class="bch-logo" viewBox="0 0 24 24" aria-hidden="true"><circle cx="12" cy="12" r="12" fill="#fff"/><path fill="#0ac18e" d="m10.84 11.22-.688-2.568c.728-.18 2.839-1.051 3.39.506.27 1.682-1.978 1.877-2.702 2.062zm.289 1.313.755 2.829c.868-.228 3.496-.46 3.241-2.351-.433-1.666-3.125-.706-3.996-.478zM24 12c0 6.627-5.373 12-12 12S0 18.627 0 12 5.373 0 12 0s12 5.373 12 12zm-6.341.661c-.183-1.151-1.441-2.095-2.485-2.202.643-.57.969-1.401.57-2.488-.603-1.368-1.989-1.66-3.685-1.377l-.546-2.114-1.285.332.536 2.108c-.338.085-.685.158-1.029.256L9.198 5.08l-1.285.332.545 2.114c-.277.079-2.595.673-2.595.673l.353 1.377s.944-.265.935-.244c.524-.137.771.125.886.372l1.498 5.793c.018.168-.012.454-.372.551.021.012-.935.241-.935.241l.14 1.605s2.296-.588 2.598-.664l.551 2.138 1.285-.332-.551-2.153c.353-.082.697-.168 1.032-.256l.548 2.141 1.285-.332-.551-2.135c1.982-.482 3.38-1.73 3.094-3.64z"/></svg></span></span><span class="lbl">Main</span></button>
<button class="tab"><span class="ico">⬡</span><span class="lbl">Assets</span></button>
<button class="fab" id="fab" aria-label="Send, receive, or scan">⇅</button>
<button class="tab"><span class="ico">△</span><span class="lbl">Avalanche</span></button>
<button class="tab"><span class="ico">⧉</span><span class="lbl">Apps</span></button>
</nav>
</div>
<script>
(function generateStars() {
const c = document.getElementById('stars'); if (!c) return;
const count = window.innerWidth < 700 ? 100 : 180;
const frag = document.createDocumentFragment();
for (let i = 0; i < count; i++) {
const s = document.createElement('div'); s.className = 'star';
const roll = Math.random(); let size, opacity, dur;
if (roll < 0.78) { size = 1 + Math.random()*0.4; opacity = 0.18 + Math.random()*0.22; dur = 14 + Math.random()*8; }
else if (roll < 0.95) { size = 1.4 + Math.random()*0.6; opacity = 0.32 + Math.random()*0.22; dur = 10 + Math.random()*6; }
else { size = 1.8 + Math.random()*0.8; opacity = 0.45 + Math.random()*0.25; dur = 8 + Math.random()*5; }
s.style.width = size+'px'; s.style.height = size+'px';
s.style.left = Math.random()*100+'%'; s.style.top = Math.random()*100+'%';
s.style.opacity = opacity; s.style.setProperty('--twinkle-duration', dur+'s'); s.style.setProperty('--twinkle-delay', (Math.random()*dur)+'s');
frag.appendChild(s);
}
c.appendChild(frag);
})();
document.querySelectorAll('.switch').forEach(function (s) { s.addEventListener('click', function () { s.classList.toggle('on'); }); });
(function () {
var map = { main:'main-tab.html', assets:'assets-tab.html', avalanche:'avalanche-tab.html', apps:'apps-tab.html' };
document.querySelectorAll('.tabbar .tab').forEach(function (t) {
var el = t.querySelector('.lbl'); if (!el) return;
var dest = map[el.textContent.trim().toLowerCase()];
if (dest) { t.style.cursor='pointer'; t.addEventListener('click', function () { location.href = dest; }); }
});
document.querySelectorAll('[data-link="main"]').forEach(function (b) { b.addEventListener('click', function () { location.href='main-tab.html'; }); });
})();
</script>
</body>
</html>

View file

@ -0,0 +1,203 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Deviant · Orbital swap · CosmoGenesis mockup</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Fraunces:opsz,wght@9..144,300;9..144,400;9..144,500;9..144,600&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet">
<link href="../cosmo-genesis.css" rel="stylesheet">
<style>
body { display:flex; justify-content:center; padding:28px 0; }
.phone { position:relative; z-index:1; width:392px; min-height:840px; background: linear-gradient(180deg, rgba(19,26,42,.55), rgba(10,15,28,.55)); border:1px solid var(--border); border-radius:30px; padding:22px 18px 92px; backdrop-filter: blur(2px); overflow:hidden; }
.flow-head { display:flex; align-items:center; gap:12px; margin-bottom:14px; }
.back { font-size:20px; color:var(--ink-soft); cursor:pointer; background:0; border:0; line-height:1; }
.flow-title { font-family:var(--font-display); font-weight:500; font-size:21px; color:var(--ink-bright); }
.flow-step { margin-left:auto; font-family:var(--font-mono); font-size:9px; letter-spacing:.12em; color:var(--muted); text-transform:uppercase; }
.view { display:none; } .view.active { display:block; }
/* persistent path indicator */
.path { display:flex; align-items:center; gap:9px; padding:11px 14px; border-radius:12px; margin-bottom:16px; font-family:var(--font-mono); font-size:11px; letter-spacing:.04em; }
.path.asm { background:var(--acid-dim); border:1px solid rgba(214,255,61,.4); color:var(--acid); text-shadow:0 0 8px var(--acid-halo); }
.path.routed { background:rgba(255,159,28,.07); border:1px solid rgba(255,159,28,.35); color:var(--risk-warn); }
.path .lead { font-size:13px; }
.path .desc { color:var(--ink-soft); font-size:9.5px; margin-left:auto; text-shadow:none; }
/* asset leg cards (From / To) */
.leg { background:var(--surface-1); border:1px solid var(--border-strong); border-radius:16px; padding:15px; }
.leg .lr { display:flex; align-items:center; gap:12px; }
.leg .ac { width:38px; height:38px; flex:none; border-radius:11px; display:grid; place-items:center; background:var(--surface-2); font-family:var(--font-mono); font-size:13px; color:var(--ink-soft); }
.leg.bch .ac { background:#0ac18e22; }
.leg .an { font-family:var(--font-display); font-weight:500; font-size:16px; color:var(--ink-bright); }
.leg .as { font-family:var(--font-mono); font-size:9px; color:var(--muted); margin-top:2px; }
.leg .chev { margin-left:auto; color:var(--muted); cursor:pointer; }
.leg .amt { font-family:var(--font-mono); font-size:22px; color:var(--ink-bright); margin-top:12px; }
.leg .sub { font-family:var(--font-mono); font-size:10px; color:var(--muted); margin-top:4px; }
.swap-mid { display:grid; place-items:center; margin:-9px 0; position:relative; z-index:2; }
.swap-mid button { width:38px; height:38px; border-radius:50%; background:var(--surface-2); border:1px solid var(--border-strong); color:var(--acid); cursor:pointer; font-size:16px; }
.chip { font-family:var(--font-mono); font-size:9px; letter-spacing:.06em; text-transform:uppercase; padding:3px 7px; border-radius:6px; border:1px solid var(--border-strong); color:var(--ink-soft); display:inline-block; }
.chip.dea { color:var(--acid); border-color:rgba(214,255,61,.4); }
.cta { width:100%; font-family:var(--font-mono); font-size:12px; letter-spacing:.12em; text-transform:uppercase; color:var(--sky-deep); background:var(--acid); border:0; border-radius:12px; padding:15px; cursor:pointer; box-shadow:0 0 16px var(--acid-halo); margin-top:18px; }
.rev-block { background:var(--surface-1); border:1px solid var(--border); border-radius:16px; padding:15px; margin-bottom:14px; }
.rev-row { display:flex; justify-content:space-between; gap:12px; padding:9px 0; border-bottom:1px solid var(--border); font-family:var(--font-mono); font-size:11px; }
.rev-row:last-child { border-bottom:0; }
.rev-row .k { color:var(--muted); } .rev-row .v { color:var(--ink); text-align:right; }
.rev-row .v.free { color:#0ac18e; }
.rev-note { font-family:var(--font-mono); font-size:9px; color:var(--muted); line-height:1.55; margin-top:8px; }
.sec-label { font-family:var(--font-mono); font-size:9px; letter-spacing:.2em; text-transform:uppercase; color:var(--muted); margin:2px 2px 9px; }
/* result */
.result-wrap { text-align:center; padding-top:26px; }
.tick { width:84px; height:84px; margin:0 auto 22px; border-radius:50%; display:grid; place-items:center; font-size:40px; color:var(--sky-deep); background:var(--acid); box-shadow:0 0 24px var(--acid-glow),0 0 48px var(--acid-halo); }
.result-wrap .big { font-family:var(--font-display); font-weight:500; font-size:24px; color:var(--ink-bright); }
.atomic { display:inline-block; margin-top:10px; font-family:var(--font-mono); font-size:11px; letter-spacing:.08em; color:var(--acid); text-shadow:0 0 8px var(--acid-halo); padding:6px 12px; border:1px solid rgba(214,255,61,.4); border-radius:20px; }
.result-wrap .txid { font-family:var(--font-mono); font-size:10px; color:var(--ink-soft); margin-top:22px; word-break:break-all; }
.result-wrap .ex { font-family:var(--font-mono); font-size:10px; color:var(--acid); margin-top:10px; cursor:pointer; }
/* tabbar */
.tabbar { position:absolute; left:0; right:0; bottom:0; display:flex; justify-content:space-around; align-items:center; padding:14px 10px 18px; border-top:1px solid var(--border); background: linear-gradient(0deg, var(--sky-deep), transparent); border-radius:0 0 30px 30px; }
.tab { display:flex; flex-direction:column; align-items:center; gap:6px; background:0; border:0; cursor:pointer; }
.tab .ico { font-size:17px; color: var(--muted); } .tab .lbl { font-family: var(--font-mono); font-size:8px; letter-spacing:.12em; text-transform:uppercase; color: var(--muted); }
.tab.active .ico { color: var(--acid); text-shadow: 0 0 10px var(--acid-glow), 0 0 20px var(--acid-halo); } .tab.active .lbl { color: var(--ink-bright); }
.tab:not(.active) .bch-b { opacity:.6; }
.bch-b { display:inline-grid; place-items:center; line-height:0; border-radius:50%; } .bch-b .bch-logo { width:100%; height:100%; display:block; } .bch-b.sm { width:28px; height:28px; }
.fab { position:relative; margin-top:-28px; flex:none; width:58px; height:58px; border-radius:50%; background: var(--acid); color: var(--sky-deep); border:4px solid var(--sky-deep); cursor:pointer; display:grid; place-items:center; font-size:23px; box-shadow: 0 0 18px var(--acid-glow), 0 0 34px var(--acid-halo); }
</style>
</head>
<body>
<div class="stars" aria-hidden="true" id="stars"></div>
<div class="phone">
<!-- ============ BUILDER ============ -->
<section class="view active" id="v-builder">
<div class="flow-head">
<button class="back" data-go="builder">←</button>
<div class="flow-title">Orbital swap</div>
<div class="flow-step">builder</div>
</div>
<div class="path asm"><span class="lead">✓</span> ASM <span class="desc">atomic · counterparty-free (V2.7 §6)</span></div>
<div class="leg">
<div class="lr">
<div class="ac">NV</div>
<div><div class="an">Nova <span class="chip dea">DEA-Verified</span></div><div class="as">PNV 1,200,000 sat · permissionless · unlimited</div></div>
<div class="chev">⌄</div>
</div>
<div class="amt">120 NOVA</div>
<div class="sub">from · balance 340 NOVA</div>
</div>
<div class="swap-mid"><button>⇅</button></div>
<div class="leg bch">
<div class="lr">
<div class="ac"><span class="bch-b sm"><svg class="bch-logo" viewBox="0 0 24 24" aria-hidden="true"><circle cx="12" cy="12" r="12" fill="#fff"/><path fill="#0ac18e" d="M14.5 9.5c-.3-1.2-1.5-1.6-3-1.4l-.5-2-1.2.3.5 2-1 .25-.5-2-1.2.3.5 2-2 .5.3 1.3s.9-.25.9-.23c.5-.13.7.12.8.36l1.4 5.4c0 .16-.05.42-.4.5 0 0-.9.23-.9.23l.13 1.5s2.1-.55 2.4-.62l.5 2 1.2-.3-.5-2 1-.24.5 2 1.2-.3-.5-2c2-.45 3.2-1.6 2.9-3.4-.17-1-1.3-1.9-2.3-2 .6-.5.9-1.3.5-2.3zm-1.4 4.6c.24 1.8-2.2 1.9-3 2.1l-.7-2.6c.8-.2 3.3-.6 3.7.5zm-.5-3.4c.25 1.5-1.8 1.7-2.5 1.9l-.6-2.4c.7-.17 2.6-1 3.1.5z"/></svg></span></div>
<div><div class="an">Bitcoin Cash</div><div class="as">first-class asset · the fuel for the fee</div></div>
<div class="chev">⌄</div>
</div>
<div class="amt">≈ 0.0120 BCH</div>
<div class="sub">to · redeem at rate · est. before fees</div>
</div>
<div class="rev-note" style="margin:14px 2px 0">Both sides are ASM-eligible, so the swap is one atomic on-chain transaction — no third party, no leg can fail independently. BCH fuel covers the ~3,000 sat network fee ✓</div>
<button class="cta" data-go="quote">Get quote →</button>
</section>
<!-- ============ QUOTE ============ -->
<section class="view" id="v-quote">
<div class="flow-head">
<button class="back" data-go="builder">←</button>
<div class="flow-title">Swap quote</div>
<div class="flow-step">review</div>
</div>
<div class="path asm"><span class="lead">✓</span> ASM <span class="desc">redeem source + mint target · 1 tx</span></div>
<div class="rev-block">
<div class="rev-row"><span class="k">You send</span><span class="v">120 NOVA</span></div>
<div class="rev-row"><span class="k">You receive</span><span class="v">0.01194 BCH</span></div>
<div class="rev-row"><span class="k">Redeem source (P2PKH spend)</span><span class="v free">no fee · V2.7 §4.2</span></div>
<div class="rev-row"><span class="k">Mint-side founder fee (feeBps 0.5%)</span><span class="v">6,000 sat</span></div>
<div class="rev-row"><span class="k">BCH network fee</span><span class="v">~3,000 sat</span></div>
<div class="rev-row"><span class="k">Rounding to target decimals</span><span class="v">−42 sat</span></div>
</div>
<div class="rev-note" style="margin:0 2px 16px">A protocol swap is <b>redeem source + mint target</b>. The only founder fee is the target's mint-side <span class="chip">feeBps</span> — the redeem side has no fee (self-backed UTXO, no contract path). Rounding is shown as its own line, never absorbed silently.</div>
<button class="cta" data-go="result">Confirm swap</button>
</section>
<!-- ============ RESULT ============ -->
<section class="view" id="v-result">
<div class="flow-head">
<div class="flow-title">Swap complete</div>
<div class="flow-step">result</div>
</div>
<div class="result-wrap">
<div class="tick">✓</div>
<div class="big">120 NOVA → 0.01194 BCH</div>
<div class="atomic">atomic · 1 transaction</div>
<div class="txid">txid e7c1a9…4f0b2d</div>
<div class="ex">View on explorer ↗</div>
<div class="rev-note" style="margin-top:24px">Counterparty-free: both legs settled in a single on-chain transaction. Nothing was handed to a third party.</div>
</div>
<button class="cta" data-go="builder">Done</button>
</section>
<!-- BOTTOM BAR -->
<nav class="tabbar">
<button class="tab"><span class="ico"><span class="bch-b sm"><svg class="bch-logo" viewBox="0 0 24 24" aria-hidden="true"><circle cx="12" cy="12" r="12" fill="#fff"/><path fill="#0ac18e" d="m10.84 11.22-.688-2.568c.728-.18 2.839-1.051 3.39.506.27 1.682-1.978 1.877-2.702 2.062zm.289 1.313.755 2.829c.868-.228 3.496-.46 3.241-2.351-.433-1.666-3.125-.706-3.996-.478zM24 12c0 6.627-5.373 12-12 12S0 18.627 0 12 5.373 0 12 0s12 5.373 12 12zm-6.341.661c-.183-1.151-1.441-2.095-2.485-2.202.643-.57.969-1.401.57-2.488-.603-1.368-1.989-1.66-3.685-1.377l-.546-2.114-1.285.332.536 2.108c-.338.085-.685.158-1.029.256L9.198 5.08l-1.285.332.545 2.114c-.277.079-2.595.673-2.595.673l.353 1.377s.944-.265.935-.244c.524-.137.771.125.886.372l1.498 5.793c.018.168-.012.454-.372.551.021.012-.935.241-.935.241l.14 1.605s2.296-.588 2.598-.664l.551 2.138 1.285-.332-.551-2.153c.353-.082.697-.168 1.032-.256l.548 2.141 1.285-.332-.551-2.135c1.982-.482 3.38-1.73 3.094-3.64z"/></svg></span></span><span class="lbl">Main</span></button>
<button class="tab"><span class="ico">⬡</span><span class="lbl">Assets</span></button>
<button class="fab" id="fab" aria-label="Send, receive, or scan">⇅</button>
<button class="tab"><span class="ico">△</span><span class="lbl">Avalanche</span></button>
<button class="tab"><span class="ico">⧉</span><span class="lbl">Apps</span></button>
</nav>
</div>
<script>
(function generateStars() {
const c = document.getElementById('stars'); if (!c) return;
const count = window.innerWidth < 700 ? 140 : 260;
const frag = document.createDocumentFragment();
for (let i = 0; i < count; i++) {
const s = document.createElement('div'); s.className = 'star';
const roll = Math.random(); let size, opacity, dur;
if (roll < 0.72) { size = 1 + Math.random()*0.7; opacity = 0.32 + Math.random()*0.25; dur = 14 + Math.random()*8; }
else if (roll < 0.93) { size = 1.6 + Math.random()*0.8; opacity = 0.52 + Math.random()*0.26; dur = 10 + Math.random()*6; }
else { size = 2.2 + Math.random()*1.1; opacity = 0.74 + Math.random()*0.26; dur = 8 + Math.random()*5; }
s.style.width = size+'px'; s.style.height = size+'px';
s.style.left = Math.random()*100+'%'; s.style.top = Math.random()*100+'%';
s.style.opacity = opacity; s.style.setProperty('--twinkle-duration', dur+'s'); s.style.setProperty('--twinkle-delay', (Math.random()*dur)+'s');
frag.appendChild(s);
}
c.appendChild(frag);
})();
function showView(id) { document.querySelectorAll('.view').forEach(function (v) { v.classList.toggle('active', v.id === 'v-' + id); }); }
document.querySelectorAll('[data-go]').forEach(function (el) { el.addEventListener('click', function () { showView(el.getAttribute('data-go')); }); });
(function parallax() {
var layer = document.getElementById('stars');
if (!layer || window.matchMedia('(prefers-reduced-motion: reduce)').matches) return;
window.addEventListener('mousemove', function (e) {
var x = e.clientX / window.innerWidth - 0.5, y = e.clientY / window.innerHeight - 0.5;
layer.style.transform = 'translate(' + (-x * 28) + 'px,' + (-y * 28) + 'px)';
});
})();
(function () {
var map = { main:'main-tab.html', assets:'assets-tab.html', avalanche:'avalanche-tab.html', apps:'apps-tab.html' };
document.querySelectorAll('.tabbar .tab').forEach(function (t) {
var el = t.querySelector('.lbl'); if (!el) return;
var dest = map[el.textContent.trim().toLowerCase()];
if (dest) { t.style.cursor = 'pointer'; t.addEventListener('click', function () { location.href = dest; }); }
});
})();
</script>
</body>
</html>

76
design/starfield.ts Normal file
View file

@ -0,0 +1,76 @@
/**
* CosmoGenesis starfield generator.
*
* Ported verbatim from the project's website (deviant_website.html) — the same
* distribution (78% tiny/faint, 17% mid, 5% bright) and twinkle timing, so the
* wallet's sky matches the project's own surface exactly.
*
* Usage (any shell): render `<div class="stars" aria-hidden="true" ref={ref} />`
* then call generateStars(ref.current). Respects prefers-reduced-motion via CSS.
*/
export interface StarfieldOptions {
/** Star count on wide viewports. Mobile (<700px) uses ~55% of this. */
count?: number;
}
export function generateStars(
container: HTMLElement | null,
opts: StarfieldOptions = {},
): void {
if (!container) return;
container.replaceChildren(); // idempotent: clear before repopulating
const wide = typeof window !== 'undefined' ? window.innerWidth >= 700 : true;
const count = opts.count ?? (wide ? 260 : 140);
const frag = document.createDocumentFragment();
for (let i = 0; i < count; i++) {
const s = document.createElement('div');
s.className = 'star';
// Most stars are tiny and faint; a few are larger/brighter.
const roll = Math.random();
let size: number, opacity: number, twinkleDur: number;
if (roll < 0.72) {
size = 1 + Math.random() * 0.7;
opacity = 0.32 + Math.random() * 0.25;
twinkleDur = 14 + Math.random() * 8;
} else if (roll < 0.93) {
size = 1.6 + Math.random() * 0.8;
opacity = 0.52 + Math.random() * 0.26;
twinkleDur = 10 + Math.random() * 6;
} else {
size = 2.2 + Math.random() * 1.1;
opacity = 0.74 + Math.random() * 0.26;
twinkleDur = 8 + Math.random() * 5;
}
s.style.width = `${size}px`;
s.style.height = `${size}px`;
s.style.left = `${Math.random() * 100}%`;
s.style.top = `${Math.random() * 100}%`;
s.style.opacity = String(opacity);
s.style.setProperty('--twinkle-duration', `${twinkleDur}s`);
s.style.setProperty('--twinkle-delay', `${Math.random() * twinkleDur}s`);
frag.appendChild(s);
}
container.appendChild(frag);
}
/**
* Mouse-parallax: the starfield layer drifts opposite the cursor (à la bch.guru).
* Respects prefers-reduced-motion. `strength` is the max px drift on each axis.
*/
export function enableParallax(layer: HTMLElement | null, strength = 28): () => void {
if (!layer || typeof window === 'undefined') return () => {};
if (window.matchMedia('(prefers-reduced-motion: reduce)').matches) return () => {};
const onMove = (e: MouseEvent) => {
const x = e.clientX / window.innerWidth - 0.5;
const y = e.clientY / window.innerHeight - 0.5;
layer.style.transform = `translate(${-x * strength}px, ${-y * strength}px)`;
};
window.addEventListener('mousemove', onMove);
return () => window.removeEventListener('mousemove', onMove);
}

View file

@ -0,0 +1,82 @@
# Snapshot 0053: cosmogenesis wallet ui — four-tab shell, risk scale, dual-protocol apps
_Captured 2026-05-25T17:54:12.827Z_
## Git state
- Rev: `(no git)`
- Working tree: clean
## File counts
| Area | Files |
|---|---|
| src/ | 52 |
| contracts/ | 31 |
| test/ | 42 |
## Notes
**Design-only session** — no `src/`, `contracts/`, or `test/` changes; the wallet UI was
designed as live HTML mockups + a design system. Formalised in **ADR-0026**.
### What shipped
- **CosmoGenesis design system** (`design/`) — extracted verbatim from the project's own
website (`Knowledgebase/08_historical_drafts/deviant_website.html`):
- `design/cosmo-genesis.css` — tokens (dark "sky" gradient, white starfield, acid-lime
`#d6ff3d` + glow tiers), Fraunces + JetBrains Mono, the mono-for-data rule, glow
utilities, and the **automated risk scale** (`--risk-safe` acid / `--risk-warn` orange
/ `--risk-high` red; legacy `--state-*` aliases retained).
- `design/starfield.ts` — the twinkle-dot generator, ported from the website.
- `design/README.md` — how any shell consumes it.
- **`wiki/glossary.md`** — canonical UI vocabulary: ASM = **Automated** Swap Mechanism
(corpus "Atomic" is drift), Orbital, UER = Universal Exchange Rate, PNV, all 8 classes
(DEA/PLA/MCA/MTA · PTU/PTL/MTU/MTL with full names), tiers, the **risk scale**, and the
**WalletConnect vs CashConnect** distinction.
- **Four-tab IA mockups** (`design/mockups/{main,assets,avalanche,apps}-tab.html`),
validated live via the preview tools:
- **Main** — BCH front door: balance + fuel card (Rule 4), portfolio donut (BCH teal /
MBA acid / Tokens violet; MBA arc glows acid on hover), recent feed with an
**MBA | Token** filter, Bitcoin-Cash `₿` mark (BCH-green, tilted ~13°) as the Main icon.
- **Assets** — two-level hub: `Assets | Tokens` × (`My Assets | Orbital Network` /
`My Tokens | Market`); Orbital = directory of all DEAs (registries + discovery);
automated risk scale on rows (green Canonical / orange Risky / red High-risk).
- **Avalanche** — eight-class taxonomy as a two-column matrix (MBA left / Token right;
rows = mint×supply) + Create hero; **Create wizard** (`avalanche-wizard.html`):
backing×mint×supply derive the class live (all 8 verified deterministic), 🔒 permanence
marks, MBA-only rate tier, type-`CREATE` review teased.
- **Apps** — `Connected | Discover`, network switcher (Mainnet/Chipnet/Testnet),
**dual-protocol** (WalletConnect + CashConnect, auto-detect), BCH-app directory incl.
explorers (bchblockexplorer.com, tokenexplorer.cash); no blessed list (ADR-0008).
- Central **FAB** (Send / Receive / Scan QR); **acid glow = selected/active + safe**,
never an unverified asset.
- **Docs:** `wallet-ui-design.md` gained a **v6 CosmoGenesis nav section** (v5 retained as
history) + the risk reframe; `decisions.md` gained **ADR-0026**; `wiki/index.md` links
the glossary + design system.
### Deferred / next
- **Scaffold the real Capacitor + React shell** — handoff package written:
**`design/CAPACITOR_HANDOFF.md`** (file manifest + paste-ready prompt for the dedicated
Capacitor session). It covers the noble-shim runtime, the `canonical.js` fs fix, the core
integration points (`runtime`/`keystore`/`market`/`verify`/`classify`), and the hard
constraints. The bottom bar becomes a
single `TabBar` component (icons defined once); the risk-tier mapping (orange-vs-red
severity) is a layer over `src/verify` + `src/token/classify.ts`.
- Per-app connection methods (WC/CC/web) in the Apps directory are **indicative** — verify
per app before shipping. Production Main should embed the official `bitcoin-cash-logo-wt.svg`.
### What surprised
- The theme already existed and is **named** — the project website's footer literally reads
"CosmoGenesis", and the project speaks a full cosmic vocabulary (Environment / Galaxy /
Vessel / Orbital / Elevation / Avalanche / Spectrum). The visual direction is native, not
imposed.
- **CashConnect is the scarce capability** (Cashonize-only; required by BCH Guru) — so
implementing both WalletConnect *and* CashConnect is a genuine differentiator, not parity.
### Caveat
- `scripts/snapshot.mjs` numbers by `existing.length + 1` (flagged since 0040); numbered
`0053` here, which happens to be correct given the current count, but the bug is unfixed.

View file

@ -0,0 +1,69 @@
# Snapshot 0054: nba taxonomy correction + bch-logo nav fix + asset-type detail sheets
_Captured 2026-05-25T19:09:08.829Z_
## Git state
- Rev: `(no git)`
- Working tree: clean
## File counts
| Area | Files |
|---|---|
| src/ | 52 |
| contracts/ | 31 |
| test/ | 42 |
## Notes
**Design + doc-correction session** (continuation of 0053). No `src/` change.
### Taxonomy correction — ADR-0027 (the headline)
A design conversation refining the Avalanche taxonomy surfaced real confusions; corrected
across all docs (the latest framing is authoritative):
- **NBA = Non-Backed Assets** replaces "Token" as the family label (parallel to **MBA =
Mathematically Backed Assets**). Class codes unchanged (PTU/PTL/MTU/MTL · DEA/PLA/MCA/MTA).
- **Direct value vs backed claim.** Gold, silver, barter, BTC, BCH, **PoW coins** are
*direct-value Layer-1* assets — unbacked; they **are** value → **NBA** (PoW: PTU uncapped
/ PTL capped, Bitcoin-style). A *claim backed by* such value (gold certificate, note,
USDT) is the **MBA** category: `MBA : BCH ∷ certificate : gold`.
- **spec §2.4 "PLA peer = gold" corrected** — gold is unbacked (NBA); PLA is the *backed*
analogue sharing only gold's issuance pattern. (The spec's own MBA row already called
Layer-1 gold a substrate, not an MBA — the PLA line now agrees.)
- **Memecoins are managed** (issuer-minted) in the common case → MTU/MTL; only *open-mint*
memecoins are PTU/PTL.
- Docs updated: **`wiki/decisions.md` (ADR-0027)**, **`wiki/glossary.md`**,
**`deviant_technical_spec_v2.7.md`** (PLA line), **`wiki/wallet-ui-design.md`** (matrix note).
### UI fixes / additions (mockups)
- **BCH-logo nav bug fixed.** The official Bitcoin Cash logo (simple-icons path, green
disc + white B, left-lean) is now on the Main tab in **all four** mockups — navigating
away no longer drops the symbol. (Earlier it lived only in `main-tab.html`.)
- **Asset-type detail sheets** (Avalanche) — each of the 8 classes + each **family header
(MBA / NBA)** is clickable, opening a **contained, bordered panel** over the taxonomy
(not full-page) with definition / use-cases / real-world peer.
- **Donut** reverted to the beautiful conic ring (centered total, soft hover glow);
per-family filtering moved to the **clickable legend rows**.
- **Sky**: darker base + spectral aurora + brighter stars + mouse **parallax** + slow
**360° rotation** (`sky-rotate 200s`) — all in shared `cosmo-genesis.css` / `starfield.ts`.
- **Bottom bar** fully navigable across screens; central FAB (Send/Receive/Scan).
### Deferred / open
- **CashFusion** (BCH privacy / CoinJoin) — proposed for **Settings → Privacy** (± a "Fuse"
action on the BCH card); awaiting placement confirmation. Not yet built.
- **Corpus HTML** (`Knowledgebase/02_structural_taxonomy`, `asset-landscape`) still carries
the pre-correction "Token"/gold-peer wording — flagged in ADR-0027 for the next corpus
revision (the archive snapshot was left intact).
- **Scaffold the Capacitor shell** — handoff (`design/CAPACITOR_HANDOFF.md`) current.
### Surprised
- The corpus **agreed with the user** all along: `asset-landscape.md` already classes gold
/ BTC / commodities as Layer-1 *pure assets* (unbacked), and the spec's MBA row says the
same — only the §2.4 PLA-peer line was inconsistent. The "correction" mostly made the
docs agree with themselves.

179
wiki/glossary.md Normal file
View file

@ -0,0 +1,179 @@
# Deviant Glossary
> **Single source of truth for naming and UI copy.** Canonical terms are pinned to the
> authoritative spec (`../deviant_technical_spec_v2.7.md`). The "canonical wording
> re-used verbatim everywhere" rule in [`wallet-ui-design.md`](wallet-ui-design.md) draws
> from this file. Where the knowledgebase corpus diverges, **the spec wins** and the
> divergence is noted here.
## Swap & rate terms
- **ASM — Automated Swap Mechanism.** Counterparty-free swap via `claim()` + P2PKH
redeem (spec §6, glossary). *Atomic by property* — it settles in a single transaction —
which is why the knowledgebase corpus (ABCD reference, corpus directory) sometimes
writes "**Atomic** Swap Mechanism." The canonical expansion is **Automated**. Available
to **DEA** and **PLA** (until supply depleted).
- **Orbital Network.** The **UI name** for the ASM swap interface (spec §9). One of the
four canonical interfaces. Surface "Orbital" to end users — not the acronym "ASM".
- **UER — Universal Exchange Rate.** `UER(A→B) = rateA / rateB` (spec §6.2). A
deterministic function of genesis constants — no oracle, no counterparty. This is the
rate the Orbital swap quote displays.
- **PNV — Protocol Net Value.** `units × backingRate` (spec §4.4). The BCH floor locked
inside each MBA UTXO, redeemable by P2PKH spend. Shown for all MBAs; **never** labelled
"price."
## The four canonical interfaces (spec §9)
| Interface | Verb | Meaning |
|---|---|---|
| **Avalanche** | Create | Issue / deploy an asset. |
| **Spectrum** | Hold | The holder portfolio — what you hold. |
| **Elevation** | Escalate | Promote a Tier B definition to a Tier A on-chain asset. |
| **Orbital Network** | Swap | The ASM swap interface (DEA & PLA-until-depletion). |
## The eight asset classes (spec §2.4)
The taxonomy is three binary axes: **backing (MBA / NBA) × mint (permissionless /
managed) × supply (unlimited / limited)**.
> **Terminology equivalence.** *permissionless mint* **≡** *open mint*, and *managed mint* **≡** *closed mint*. The two pairs are synonyms used interchangeably across the corpus and spec; **permissionless / managed** is the canonical wording (preferred in public-facing and forward-facing materials), while the spec, `architecture.md`, and the asset-taxonomy cells still use *open / closed*. No sweep is planned — the terms are equivalent by definition. (See also the terminology note at the top of `decisions.md`.)
| Class | Name | Mint | Backing | Supply | ASM / Orbital |
|---|---|---|---|---|---|
| **DEA** | Deviant Equilibrium Asset | Permissionless | Fixed | Unlimited | ✅ Full |
| **PLA** | Permissionless Limited Asset | Permissionless | Fixed | Limited | ⚠️ Until supply depleted |
| **MCA** | Managed Certificate Asset | Managed | Fixed | Unlimited | ❌ (bond / reserve note; protocol-backed stablecoin) |
| **MTA** | Managed Tranche Asset | Managed | Fixed | Limited | ❌ |
| **PTU** | Permissionless Token Unlimited | Permissionless | None | Unlimited | ❌ |
| **PTL** | Permissionless Token Limited | Permissionless | None | Limited | ❌ |
| **MTU** | Managed Token Unlimited | Managed | None | Unlimited | ❌ |
| **MTL** | Managed Token Limited | Managed | None | Limited | ❌ |
- **MBA — Mathematically Backed Asset.** The four fixed-rate classes (DEA / PLA / MCA /
MTA): BCH backing locked at genesis, unconditionally redeemable at a fixed rate with no
custodian — "purely based on mathematics" (spec §1).
- **NBA — Non-Backed Assets** (PTU / PTL / MTU / MTL; formerly the "Token family" — see
ADR-0027): no backing rate, no PNV floor; value is whatever a market or use case assigns.
- **Direct value vs backed claim (ADR-0027).** Gold, silver, barter, BTC, BCH and **PoW
coins** are *direct-value Layer-1 assets* — unbacked; they **are** value → NBA (PoW:
PTU uncapped / PTL capped, Bitcoin-style). A *claim backed by* such value (gold
certificate, promissory note, USDT) is the **MBA** category: `MBA : BCH ∷ certificate :
gold`. The spec §2.4 "PLA peer = gold" is thus corrected — gold is unbacked (NBA); PLA
is the *backed* analogue sharing only gold's issuance pattern.
- **Memecoins** are usually issuer-minted (managed) → **MTU / MTL**; only *open-mint*
(community-mintable, no exclusive issuer) memecoins are PTU / PTL.
- **Real-world peer labels (ADR-0028).** MBA: DEA *Hard-Backed* · PLA *Commodity* · MCA
*Bond* (reserve note) · MTA *Tranche* (+ Treasury notes & bills). NBA: PTU *Game
currency* (non-convertible — earned by anyone, open-mint, inflationary) · PTL *Mineable
Coin* (Bitcoin, gold) · MTU *Meme / Tokens* (convertible — memecoins, governance, **and
extant fiat & stablecoins**) · MTL *NFT / Collectibles*.
- **Consensus-backing test (ADR-0028).** MBA membership requires backing to be a
*consensus invariant* (D-2). Real-world **custodial** stablecoins/fiat assert backing that is
off-chain and unenforceable → they are **NBA (MTU)**, not MBA. MCA is the home only for
a *protocol-backed* stablecoin whose reserve is enforced at consensus (Layer 2b).
- **CDP / collateralized stablecoins → PTU, not MTU (ADR-0033).** A collateralized-debt
stablecoin (MakerDAO/DAI) is **permissionless-mint** (anyone locks collateral and mints),
so it splits from custodial stablecoins on the mint axis: **CDP → PTU**, **custodial
(USDC/USDT) → MTU**. Crucially the collateral backs the **debt position (the vault), not
the circulating token** — a holder has no redemption claim on it, so the token is unbacked
and market-priced. Two tools formalise this: the **unilateral-redemption discriminator**
(*can the holder realise base-unit value alone — no market, oracle, or counterparty?*
MBA yes, CDP token no) and the **three-rung backing ladder** (1 intrinsic/unconditional =
MBA · 2 collateralized-debt soft = the CDP vault · 3 unbacked/market-priced = CDP token,
custodial stablecoins, game currencies). **Volatility paradox:** a CDP stablecoin is
*overcollateralized AND the most volatility-exposed* — the MBA makes no peg claim and
so has nothing to break; the CDP advertises a peg that is exactly what a crash threatens
(Black Thursday, Terra). Overcollateralization protects the *system's solvency*, not
the *holder's promised price*.
- **Regularized decomposition** (corpus 02): canonical names map onto
mint (P/M) × supply (U/L) × kind (A/T). Reference only — **UI uses the canonical
three-letter names above.**
## Tiers & trust (spec §3.2; `architecture.md`)
- **Tier A** — native CashTokens, consensus-enforced. The wallet is a **verifier**: it
confirms facts the chain already settled.
- **Tier B** — plain BCH displayed through a local definition; wallet-convention only.
The wallet is an **authority**. Appropriate only for closed, mutually-trusting groups;
**never** for tokens from untrusted parties or high-value use cases.
## Verification (spec §7, §14)
Defense layers (authoritative list in spec §7):
- **D-1** canonical-address check · **D-2** per-UTXO backing · **D-3** pinned bytecode
hash · **D-4** raw-BCH co-display · **D-5** raw-BCH send confirmation · **D-6**
non-authoritative B rendering · **D-7** trusted issuer keys.
Verification states (the verification badge):
- Tier A MBA: `DEA-Verified` / `PLA-Verified` / `MCA-Verified` / `MTA-Verified`,
`MBA-Unverified` (D-1 fails), `Warning — Underbacked` (D-2 fails on ≥1 UTXO — the
T-001 victim signature).
- Tier A Token: no peg badge — the "Token · {class}" label is the whole story.
- Tier B: `Unverified definition` (default), `Verified by <issuer>` (user-trusted key).
## Value-display rule (spec §4.4; `wallet-ui-design.md`)
- **MBAs** → **PNV** (`units × backingRate`), **never price**.
- **Tokens** (no peg) → literal UTXO BCH; live **market price** permitted on the Tokens
tab only.
- **Protocol-backed stablecoin (MCA)** → PNV plus the issuer's off-chain dollar quote,
labelled separately as an issuer claim — never merged with the BCH floor. Extant
stablecoins (USDT / USDC) are *not* MCA — their backing is unenforced → **NBA / MTU**
(ADR-0028).
## CashFusion (Settings → Privacy)
BCH CoinJoin — merges the user's **plain BCH** with other participants' coins over several
rounds (encrypted relays), breaking chain-analysis links between past and future history.
Surfaced in **Settings → Privacy** (enable toggle + *auto-fuse idle BCH*) and as a **Fuse**
action on the BCH card (Main). **Token (FT) UTXOs are never fused** — using one as a fusion
input would burn the tokens inside it (Rule 4); only plain BCH participates. Mock:
`design/mockups/fuse-flow.html` (ADR-0028 session).
## CosmoGenesis (visual system)
The project's **named design language** (v0.1; source `Knowledgebase/08_historical_drafts/deviant_website.html`).
Dark "sky" background, white starfield, acid-lime (`#d6ff3d`) glow accent, **Fraunces**
serif + **JetBrains Mono**. The wallet is described in the project's own words as *"the
CosmoGenesis surface for sending, receiving, and minting."* Tokens live in
[`../design/cosmo-genesis.css`](../design/cosmo-genesis.css).
## Wallet UI risk scale (CosmoGenesis — reframes the verification labels; ADR-0026)
The wallet classifies every asset **automatically** into a three-tier risk scale. This is
the user-facing *presentation* of the D-1/D-2/D-3 checks (spec §7) — the checks are
unchanged; only the labels are. Replaces the "Verified / Unverified" wording in the UI.
- **Canonical / Standard** — 🟢 acid glow. Canonical contract (D-1) + fully backed (D-2).
The calm default; the class chip is the signal, **no badge**.
- **Risky** — 🟠 orange. Non-standard contract / uncertain backing / unknown-source B
definition. PNV suppressed.
- **High risk** — 🔴 red. Detected attack signature (e.g. issuer free-mints to self and
sells it as a "backed" currency; underbacked T-001). Recover only literal BCH.
Acid glow is reserved for the canonical tier **and** for actions (Orbital/ASM, Mint, the
central FAB, the selected tab) — it never marks a risky asset.
## Connection protocols (Apps tab; ADR-0026)
Both ride the WalletConnect v2 transport but speak different RPC dialects:
- **WalletConnect** (the BCH "Pat" spec) — WC v2 + the Paytaca Connector interface. Broad
reach: Cashonize, Zapit, Paytaca; dApps incl. Cauldron, TapSwap, CashTokens Studio.
- **CashConnect** (the "Jim" spec) — WC v2 + CashRPC; libauth templates, automatic UTXO
selection + change. Currently **Cashonize-only**; required by frontier apps (e.g.
**BCH Guru**). The scarce capability → a differentiator.
- **Guidance:** implement **both**, auto-detect from the session URI, one honest
transaction-preview either way; lead with CashConnect as the differentiator.
## Strategic / metaphor lexicon (uncatalogued — mindmap v6; expansions to confirm)
> Not yet integrated into the spec. **Do not use in UI copy until confirmed** — listed
> here only so the vocabulary is tracked.
- **Environment** — the conserved BCH supply (21,000,000; invariant).
- **Galaxy / orbital structure / Vessel** — metaphor for backing locked in a contract;
*"Orbital Network = where orbits meet."*
- **MGC**, **MES (Mathematical Exchange Standard)**, **Mathematical Singularity
Network**, **The Replacement Standard**, **Discovery (vs Design)** — strategic framing
vocabulary; expansions and canonical status pending.