Venom design system

Tokens and components shared by the user app, the wallet simulator and the backoffice. Every screen in this folder is built only from tokens.css and components.css; wave 2 turns each class here into one component.

Colour

Jade is for actions and focus only. Status colours never double as the accent, so a green “Released” badge can never be mistaken for a button. Dark theme is its own set of values, not an inversion; every token is redefined for it.

Surfaces and text

Ground
--bg
Surface
--surface
Surface 2
--surface-2
Sunken
--surface-sunken
Border
--border
Border strong
--border-strong
Text
--text
Text 2
--text-2
Text 3
--text-3

Accent

Accent
--accent
Hover
--accent-hover
Soft
--accent-soft
Accent text
--accent-text
Focus ring
--focus

Status tones

Final, good
--ok
Safe, not final
--info
Money moving
--wait
Needs a look
--warn
Problem
--bad
Inactive
--muted

Networks, assets, chart series

TRON
--net-tron
Ethereum
--net-eth
Venom
--net-venom
USDT
--asset-usdt
USDC
--asset-usdc
Series 1
--series-1
Series 2
--series-2
Series 3
--series-3

Type

System faces only, so no screen makes an external request. Digits are tabular wherever money or times line up. Monospace is reserved for addresses, hashes, references and codes.

38 / bold1,817.00USDT 30 / boldDubai in November 24 / bold

My trips

18 / semi

Hilton Garden Inn Business Bay

16 / semi

Travelling

16 / body

Here are five options for all four of you, 8–15 November.

14 / body

Held in escrow until the booking is confirmed.

13 / small

Returned to this account automatically if it is not.

11 / labelTreasury hot wallets mono 134b2ad832cc3e…7438f82

Space, radius, elevation

Spacing, 4 px grid

4
8
12
16
20
24
32
40
48
64

Radius

xs 4
sm 8
md 12
lg 16
xl 24
pill

Elevation

e-1 · rows, hover
e-2 · composer, raised card
e-3 · sheet, modal, toast

Money

An amount is never shown without its asset, and the network is shown wherever it could be confused. USDT on TRON and USDT on Ethereum are different money. The user app shows cents; any digits beyond the cents stay visible but quiet, so an exact value is never rounded away. The receipt and the backoffice always show the asset's full precision (6 for stablecoins, 2 for USD, 9 for VENOM). Totals the user pays are exact.

1,817.00USDT 1,730.476190USDT 86.523810USDT TRC20 1,730.48USD Duffel +1,607.00USDT 5,080.263161VENOM Venom
₮₮$₮VTRXETHUSD TRC20ERC20TIP-3USD
Flights, 4 travellers
780.95USDT
Hotel, 7 nights
949.53USDT
Service fee 5 %
86.52USDT
Total
1,817.00USDT TRC20

Addresses and hashes

Truncate in the middle, keeping 6 characters at the start and 5 at the end, because that is what people compare against their wallet. Every address and hash has a copy button that copies the full value. Where a person is about to send money, the full address is shown with both ends emphasised, and a known contract carries a verification badge.

TbgxgX…XXdV2 EVM0x1744…8eba1 Venom0:4f928f…384f0 tx4b2ad8…38f82
Venom EscrowVerified escrow contract
TNooagRnjPkp69NyqQj74EtGWhufGMrxFW

Buttons

One primary action per view. A button that moves money names the amount and asset. Destructive actions are outlined red until the confirming step, where they become solid.

Inputs

Amount fields carry the asset code inside the box, so nobody types a bare number. Hints say what a value does, not what it is.

USDT TRC20
The chain refuses any single payment above this.
A Russian international passport number has 9 characters: K and 8 digits.
One-time code

Status badges

Five tones carry meaning: violet money is moving, blue money is safe in escrow but the booking is not final, green final and good, jade money returned, red a problem a person must look at. Moving states pulse.

Booking lifecycle

QuotedAwaiting paymentAwaiting walletEscrowedSupplier orderHotel on requestTicketedReleasedBookedRefundingRefundedFailedQuote expiredCancelledCompleted

Payments and chain

SigningPending12 / 19 confirmationsSettlingPaidConfirmedSettledRejected in walletOver limitUnmatched deposit

Wallet, sessions, allowances

ConnectedDisconnectedActiveExpires in 9 daysRevokedVerified contract

Operations

MatchedBreakResolvedNeeds reviewLow floatRunningScheduledExecutedSkippedReversedComing soon

Cards and chips

Card with header

Action
Order
VT-7K3Q9D
PNR
K7M2QX
Hotel
4471 5528 193
Raised

For the one card that needs to stand apart, such as the payment card in a chat.

Sunken

For context that sits behind the main content, such as "what Venom remembers".

Held in escrow now1,288.56739.20 USDT-TRC20 · 549.36 USDT-ERC20
2 adultsMaria, 9
  • VI
    Vladislav Ivanov
    K12•••67 · until 30.06.2031
  • TI
    Timur Ivanov · 6
    K55•••78 · until 20.01.2030

Tables

Numbers right-aligned and tabular; a wide table scrolls inside its own frame, never the page. Journal lines put debits and credits in separate columns so a balanced entry is visible at a glance.

AccountAssetDebitCredit
2110 Customer funds in escrowUSDT-TRC201,817.000000
1110 Escrow contractUSDT-TRC201,817.000000
1210 Treasury hot walletUSDT-TRC201,817.000000
2210 Supplier cost to settleUSDT-TRC201,730.476190
4010 Service fee revenueUSDT-TRC2043.261905
2310 Buyback earmarkUSDT-TRC2043.261905
JE-2026-0923-0037 · balancedUSDT-TRC203,634.0000003,634.000000

Alerts and toasts

Breakdown lines show cents. You pay exactly 1,817.000000 USDT on TRC20.
Booked. Tickets for all four and the hotel voucher are in My trips.
Anna's MetaMask has no allowance, so each payment from it is approved in the wallet.
Send USDT on TRON only. A transfer on another network cannot be matched to this trip.
Held in escrow until the booking is confirmed. Returned automatically if it is not.
Address copied
Allowance revoked

Sheets and modals

On phones, anything that asks for a decision about money is a bottom sheet; on desktop, a modal. Both show the amount first and the destination second.

Revoke allowance?

Venom Travel will no longer be able to take payments from TbgxgX…XXdV2 without asking. One transaction, about 6.20 TRX.

Stepper, timeline, meters

  1. Travellers
  2. Wallet
  3. Limits
  1. Signed 14:02:55
  2. In escrow 14:03:52
    19 of 19 confirmations
  3. Airline ticketing
    flydubai usually confirms within a minute
  4. Booked
  1. In escrow 11:45
  2. Fare no longer available 11:46
  3. Refunded from escrow 11:47
    2,253.30 USDT back to the sender
Today1,817.00 of 4,000.00 USDT
2,183.00 USDT left todayResets 00:00 UTC
9:41

Chat pieces

Travel content (options, travellers) and payment content (the pay card) look different on purpose: the pay card belongs to the payment program, which never sees the trip, and the person should see that the money question is asked by a different part of the product.

Yes, all of us
From your profile: 2 adultsMaria, 9Timur, 6
Venom PayPaid within your limits
1,817.00USDTTRC20
Held in escrow until the airline and hotel confirm. 2,183.00 USDT left today.

Tracking and purchases

Every block here is generic: a program sends data for it and never ships markup. Status card is any live item with a route and fact tiles; a changed tile is outlined, an old time stays struck through. Agenda is a timeline keyed by local time; a dashed dot is a suggestion nobody paid for. Choices always end in their money line. Compare puts the attribute above its values on phones so three options fit 360 px.

Status badges added for tracked items

FulfillingCheck-in openOn timeDelayed 25 minChanged by airlineBoardingLandedStagingHealthyDegraded
FZ 982 · todayDelayed 25 min
13:3013:05VKO
4h 55m
Direct
19:2519:00DXB
Gate
A12 was A21
Terminal
A
Checked 11:02 · next check 11:07
  1. 13:41
    Took off
  2. 19:45
    Taxi to the hotel
    Not booked
  3. 20:15
    Hotel check-in
Marmara Pera
Sirkeci Mansion
Georges Galata
Price for both
862.05 USDT
732.90 USDT
1,054.20 USDT

Chat-first frame

The chat is home. Every user screen is one phone-width column (.app › .app-main, at most 720 px) with a compact .app-head; at 1024 px and up an optional .app-aside sits beside it. There is no tab bar and no sidebar: the manual screens live behind .app-menu, and each of them ends in an .ask-bar carrying data-ask-assistant with the screen's context, so the way back into the chat is always the same thing in the same place.

Ask when needed, show where the money is. Account, passports, wallet and limits are cards in the conversation at the moment they are first needed (account, passports, wallet, limits), never a sign-up funnel. A card that hands off to another app shows a .handoff state until it returns.

Header in the chat · header on a manual screen

Wallet & limits

Ask to change a limit

Recap, origin, choice rows, hand-off

Four passports saved · all valid past 10 Jun
Opened from a notification · 09:14
Waiting for TronLink
Approve the connection there
TronLink linked
TbgxgX…XXdV2