SimplEOS is not a generic crypto wallet. It was born from EOS Rio — a block producer team that lived inside the Antelope ecosystem. The wallet reflects that heritage: technically precise, community-rooted, and unapologetically functional. It exists for people who run nodes, vote for producers, stake resources, and interact with smart contracts daily.
- Clarity over decoration — Every pixel serves a purpose. No ornamental gradients, no glassmorphism, no floating 3D coins. This is a tool for managing real assets.
- Layered darkness — Three surface tiers create depth without shadows:
bg-deep(deepest),bg-base(main surfaces),bg-raised(cards, panels). This was SimplEOS v1's signature — evolve it, don't abandon it. - The blue thread — SimplEOS cyan-blue (
#0094d2) is the brand color. It connects every interaction — focused inputs, active navigation, CTAs, links. It's not a decoration, it's a signal that says "you can interact with this." - Typography as data — In a wallet, numbers are content. They deserve dedicated typographic treatment — larger, bolder, and optionally in a distinct typeface for scannability.
- Chain-aware personality — Each chain gets a subtle accent shift. Vaulta keeps the core blue. WAX gets warm amber. Telos gets purple. This isn't just cosmetic — it's a subconscious cue that tells the user which network they're on.
SURFACE LAYERS
--bg-deep: #111218 Deepest layer (sidebar, app chrome)
--bg-base: #1a1b26 Main content background
--bg-raised: #24253a Cards, panels, input backgrounds
--bg-hover: #2d2e45 Hover state on raised surfaces
--bg-active: #33345a Active/pressed state
BORDERS
--border-subtle: #2a2b3d Default borders (cards, dividers)
--border-focus: #0094d2 Focused inputs, selected items
TEXT
--text-bright: #f0f1f5 Headings, balances, primary content
--text-body: #b4b7c9 Body text, descriptions
--text-muted: #6b6f85 Labels, timestamps, hints
--text-disabled: #484b5e Disabled elements
--accent: #0094d2 Primary brand blue (inherited from v1)
--accent-hover: #00a8ef Lighter on hover
--accent-muted: rgba(0, 148, 210, 0.12) Background tint for active states
--positive: #2dd4a8 Incoming transfers, success, confirmations
--negative: #f04438 Errors, failed transactions, warnings
--caution: #f5a623 Pending states, low resources
--info: #8b7cf6 Informational badges, secondary highlights
When the user switches chains, --accent shifts to the chain's identity color. The rest of the palette stays constant.
| Chain | Accent Override | Accent Hover |
|---|---|---|
| Vaulta | #0094d2 |
#00a8ef |
| WAX | #f5a623 |
#fbbf24 |
| Telos | #7c3aed |
#8b5cf6 |
| Ultra | #8b5cf6 |
#a78bfa |
| FIO | #3b82f6 |
#60a5fa |
| Libre | #22c55e |
#4ade80 |
| XPR | #7c3aed |
#8b5cf6 |
This means buttons, active nav indicators, focused inputs, and links all shift subtly when you switch chains — without touching the layout or readability.
| Role | Family | Fallback |
|---|---|---|
| Headlines | Inter | system-ui, -apple-system, sans-serif |
| Body | Inter | system-ui, -apple-system, sans-serif |
| Data/Mono | Space Grotesk | 'SF Mono', monospace |
Why Inter: Clean, legible at all sizes, excellent number rendering, widely cached in browsers.
Why Space Grotesk for data: Geometric, monospaced-feeling but proportional. Account names like igorls.gm, public keys, and token amounts read better in it. It has a technical, crypto-native quality without being cold.
| Token | Size | Weight | Line Height | Usage |
|---|---|---|---|---|
--text-hero |
42px | 700 | 1.1 | Primary balance display |
--text-headline |
24px | 600 | 1.3 | Page titles, section headers |
--text-title |
18px | 600 | 1.4 | Card titles, sub-sections |
--text-body |
14px | 400 | 1.5 | Standard body text |
--text-label |
12px | 500 | 1.4 | Form labels, nav items, badges |
--text-caption |
11px | 400 | 1.4 | Timestamps, hints, fine print |
- Token amounts always use Space Grotesk,
--text-bodyweight 500 - The hero balance uses Inter 700 at 42px for impact
- Account names (12-char Antelope names) use Space Grotesk, 14px, weight 500
- Public keys use Space Grotesk, 13px, weight 400 (truncated with
...in middle) - Always include the token symbol after amounts, in
--text-mutedcolor
┌────────────────────────────────────────────────────────────────┐
│ ┌──────────┐┌─────────────────────────────────────────────────┐│
│ │ ││ ACCOUNT TABS (if multiple accounts) ││
│ │ │├─────────────────────────────────────────────────┤│
│ │ SIDEBAR ││ ││
│ │ (240px) ││ CONTENT AREA ││
│ │ ││ (scrollable) ││
│ │ ││ ││
│ │ ││ ││
│ │ ││ ││
│ │ ││ ││
│ │ CHAIN ││ ││
│ │ SELECTOR ││ ││
│ └──────────┘└─────────────────────────────────────────────────┘│
└────────────────────────────────────────────────────────────────┘
- Sidebar: 240px fixed,
--bg-deepbackground. Never scrolls. - Account tabs: Horizontal tab bar at top of content when >1 account. Each tab shows: account name + balance. Mimics v1's mat-tab-group pattern.
- Content area: Fills remaining space, scrolls vertically. Max content width: 960px centered with auto margins. Padding: 32px.
Base unit: 4px
| Token | Value | Usage |
|---|---|---|
--sp-1 |
4px | Tight gaps (icon-to-label) |
--sp-2 |
8px | Inline spacing, small gaps |
--sp-3 |
12px | Input padding, compact cards |
--sp-4 |
16px | Standard card padding |
--sp-5 |
20px | Section spacing within cards |
--sp-6 |
24px | Between cards/sections |
--sp-8 |
32px | Content area padding |
--sp-10 |
40px | Major section breaks |
--sp-12 |
48px | Page top/bottom breathing room |
| Token | Value | Usage |
|---|---|---|
--radius-sm |
4px | Buttons, badges, small elements |
--radius-md |
8px | Cards, panels, inputs |
--radius-lg |
12px | Modal dialogs, balance cards |
--radius-full |
9999px | Chain icon badges, pills |
The v1 used 5px uniformly. v2 uses a 3-step scale — slightly more rounded for primary surfaces (8px), sharper for small interactive elements (4px). This is subtle but gives a more modern feel without going soft.
STRUCTURE:
┌─────────────────────────┐
│ SimplEOS │ Brand wordmark, Inter 600, 18px
│ │
│ ┌─────────────────────┐│
│ │ igorls.gm ▾ ││ Account name (Space Grotesk, 14px, 500)
│ │ 12,847.3291 EOS ││ Balance (Space Grotesk, 13px, --text-muted)
│ └─────────────────────┘│
│ │
│ ● History ← │ Active: --accent left border (3px), --text-bright
│ Send │ Inactive: --text-muted, no border
│ Resources │
│ Vote / Stake │
│ REX │ Conditionally shown per chain.features
│ Contracts │
│ Settings │
│ About │
│ │
│ ───────────────────── │ Subtle divider (--border-subtle)
│ ┌─────────────────────┐│
│ │ 🔵 Vaulta (EOS) ▾ ││ Chain selector with icon + name
│ └─────────────────────┘│
│ v2.0.0 │ Version, --text-disabled, 11px
└─────────────────────────┘
Active indicator: 3px left border in --accent, not a background fill. This is clean, precise, and carries from v1's design language. The text shifts from --text-muted to --text-bright.
Icons: Lucide, 18px, 1.5px stroke. Positioned 12px left of label. Color matches text state.
Keyboard shortcuts: Display as subtle badge on the right side of each nav item (e.g., Alt+S for Send), visible on hover. Power users from v1 relied on these.
BALANCE TOTAL VALUE (USD)
12,847.3291 EOS $14,132.06
+2.4% last 24h
🔒 Staked 4,200.0000 EOS | 🔓 Unstaked 8,647.3291 EOS
- "BALANCE" label:
--text-label, 12px, uppercase, letter-spacing 1px - Amount: Inter 700, 42px,
--text-bright. The comma-separated format aids scannability. - Symbol suffix: Space Grotesk 500, 24px,
--text-muted - USD card: Separate raised surface on the right. Shows fiat value + 24h change.
- Staked/Unstaked row: 13px,
--text-muted, with lock/unlock icons (Lucide, 14px)
Three horizontal cards in a row:
┌──────────────────┐ ┌──────────────────┐ ┌──────────────────┐
│ CPU 34% used │ │ NET 8% used │ │ RAM 72% used │
│ ████░░░░░░░░░░░░ │ │ █░░░░░░░░░░░░░░░ │ │ ███████████░░░░░ │
│ 12.4ms / 36.2ms │ │ 0.4KB / 5.2KB │ │ 124.3KB / 172.8KB│
│ Staked: 2,100 │ │ Staked: 2,100 │ │ │
└──────────────────┘ └──────────────────┘ └──────────────────┘
- Card background:
--bg-raised - Progress bar: 4px height,
--radius-full- Fill color:
--accentwhen <70%,--cautionwhen 70-85%,--negativewhen >85% - Track color:
--bg-hover
- Fill color:
- Usage text: Space Grotesk, 13px,
--text-body - v1 turned resource bars red at 85% — preserve this behavior exactly.
┌──────────────────────────────────────────────────────────────┐
│ ↓ Received from alice.wam +250.0000 EOS 2h ago │
│ ↑ Sent to bob.gm -100.0000 EOS 5h ago │
│ ✓ Voted for 24 producers 1d ago │
│ 🔒 Staked 500.0000 EOS 2d ago │
│ ↓ Received from carol.wax +75.0000 EOS 3d ago │
└──────────────────────────────────────────────────────────────┘
- Row height: 52px. Clickable — expands to show full transaction details.
- Divider: 1px
--border-subtlebetween rows (v1 pattern). - Icon: 20px, color-coded (green for receive, default for send, blue for vote).
- Description: Inter 400, 14px,
--text-body - Amount: Space Grotesk 500, 14px.
--positivefor incoming,--text-bodyfor outgoing. - Timestamp: 12px,
--text-muted, right-aligned. - Pagination: "Showing 1-12 of 847" with page controls. 12 rows per page (v1 default).
Input Fields
- Background:
--bg-raised - Border: 1px
--border-subtle, radius--radius-md - Padding: 12px 16px
- Font: Inter 400, 14px
- Label: Above input, 12px,
--text-muted, uppercase, letter-spacing 0.5px - Focus: Border shifts to
--accent, subtle glow0 0 0 3px var(--accent-muted) - Error: Border
--negative, error message below in 12px--negative
Buttons
- Primary:
--accentbackground, white text, 14px, 500 weight, uppercase, letter-spacing 1px- Height: 40px, padding 0 24px, radius
--radius-sm - Hover:
--accent-hover, transition 150ms
- Height: 40px, padding 0 24px, radius
- Ghost: Transparent,
--accenttext, 1px--accentborder- Hover:
--accent-mutedbackground
- Hover:
- Danger:
--negativebackground for destructive actions (logout, delete key)
Confirmation Modal (signing transactions)
- Centered overlay, backdrop blur 4px
- Modal background:
--bg-raised, radius--radius-lg - Max width: 480px
- Transaction summary as structured key-value pairs (not raw JSON by default, expandable to JSON)
- Passphrase input field
- Two buttons: Cancel (ghost) | Confirm (primary)
- v1 showed Ricardian contracts in an accordion — preserve this for EOS mainnet
The v1 landing was carefully designed with 4 entry paths. Preserve this structure:
┌──────────────────────────────────────────────────┐
│ │
│ SimplEOS logo (animated) │
│ "Your simple and secure EOS wallet" │
│ │
│ ┌────────────────────────────┐ │
│ │ Select Chain ▾ │ │
│ └────────────────────────────┘ │
│ │
│ ┌──────────────┐ ┌──────────────┐ │
│ │ Import Key │ │ New Account │ │
│ └──────────────┘ └──────────────┘ │
│ ┌──────────────┐ ┌──────────────┐ │
│ │ Import Backup│ │ Check Account│ │
│ └──────────────┘ └──────────────┘ │
│ │
│ Connection status indicator │
└──────────────────────────────────────────────────┘
- Centered layout, no sidebar.
- Logo can use Lottie animation (v1 used
logoanim.json). Or a clean SVG wordmark. - Chain selector with chain icons and names.
- Four action cards: equal size,
--bg-raised, hover lifts slightly. - Connection status at bottom: green dot for connected, spinner for connecting, red for failed with RETRY.
- Full-screen centered,
--bg-deepbackground. - SimplEOS logo or wordmark at top.
- "Enter your passphrase to unlock" in
--text-muted. - Single password input, autofocused.
- Unlock button (primary).
- "Import a key" text link below.
- Failed attempt counter: "Wrong passphrase. X attempts remaining." in
--negative. - After 5 failures: wipe and restart (v1 behavior — keep it).
| Interaction | Duration | Easing |
|---|---|---|
| Hover (buttons, nav) | 150ms | ease |
| Focus ring appear | 100ms | ease-out |
| Route transition | 200ms | ease-in-out (fade) |
| Modal enter | 200ms | ease-out (scale 0.95→1 + fade) |
| Modal exit | 150ms | ease-in |
| Accordion expand | 250ms | ease-in-out |
| Toast slide in | 300ms | ease-out |
| Toast auto-dismiss | 4000ms | — |
Loading states: Skeleton placeholders (pulsing rectangles in --bg-hover), not spinners. Spinners only for connection status on the landing page.
Library: Lucide (MIT, treeshakeable SVG)
Sizes:
- Navigation: 18px
- Inline/body: 16px
- Dense contexts: 14px
- Hero/feature: 24px
Stroke: 1.5px (Lucide default)
Color: Matches adjacent text color. Active state shifts to --accent.
Key icon mappings (from v1, adapted to Lucide names):
| Feature | v1 Icon | v2 Lucide Icon |
|---|---|---|
| History | history | clock |
| Send | paper-plane | arrow-up-right |
| Resources | memory | cpu |
| Vote/Stake | edit/lock | vote |
| REX | exchange-alt | repeat |
| Contracts | puzzle-piece | file-code |
| Settings | cog | settings |
| About | info-circle | info |
| Received | arrow-down | arrow-down-left |
| Sent | arrow-up | arrow-up-right |
| Staked | lock | lock |
| Unstaked | lock-open | lock-open |
- Contrast: All text-on-background pairs meet WCAG AA (4.5:1 minimum).
--text-bright(#f0f1f5) on--bg-base(#1a1b26) = 12.8:1--text-body(#b4b7c9) on--bg-base(#1a1b26) = 7.3:1--text-muted(#6b6f85) on--bg-base(#1a1b26) = 3.8:1 (decorative/non-essential only)
- Focus: Visible focus ring on all interactive elements (2px
--accent, 2px offset). - Keyboard: Full keyboard navigation. Tab order follows visual layout. Escape closes modals.
- Screen readers: ARIA labels on icon-only buttons. Live regions for transaction results.
- Reduced motion: Respect
prefers-reduced-motion— disable transitions and animations.
This is a desktop app (Tauri), not a website. But the window is resizable:
| Window Width | Behavior |
|---|---|
| ≥1280px | Full layout, sidebar + content |
| 960px–1280px | Sidebar collapses to 60px (icons only) |
| <960px | Not supported (min window size is 960×640) |
The sidebar collapse shows only icons (no labels) with tooltips on hover. The chain selector shows only the chain icon. This is a compact mode, not a mobile mode.
| Aspect | v1 | v2 |
|---|---|---|
| Surface colors | #191919 / #272727 / #333333 | #111218 / #1a1b26 / #24253a (cooler, blue-tinted) |
| Accent | #0094d2 | #0094d2 (kept — it IS SimplEOS) |
| Border radius | 5px uniform | 4/8/12px scale |
| Font | Metropolis | Inter + Space Grotesk |
| Shadows | Box shadows on cards | Minimal — surface layering instead |
| Icons | FontAwesome Pro | Lucide (MIT, lighter) |
| Balance size | 46px | 42px (slightly tighter) |
| Transitions | 0.3s | 0.15s (snappier) |
| Component lib | Clarity + Material + PrimeNG | CDK Aria + custom CSS |
| Chain awareness | Same look everywhere | Accent color shifts per chain |
| Keyboard shortcuts | Alt+key (present but hidden) | Alt+key (visible on hover) |
What stayed the same: The blue accent, the 3-tier dark surface layering, the sidebar navigation pattern, the account tabs, the balance-first hierarchy, the transaction confirmation flow, the PIN vs passphrase separation, the 5-attempt lockout, the exchange memo validation, the chain-conditional feature flags, and the overall information architecture.
This spec should be implemented using:
- CSS custom properties in
src/styles.css - Angular CDK (Aria primitives) for dialogs, overlays, a11y
- Lucide Angular for icons
- No external component library
- All styling is custom CSS — full control, no framework fights