Build trading UIs
without the baggage.
31 headless web components for trading UIs. Bring your own styles, data, and framework. Every doc example is wired to one live synthetic market feed — pick a scenario, scrub time, watch them all react.
Everything you need. Nothing you don't.
Canvas 2D and requestAnimationFrame. Handles hundreds of WebSocket updates per second without touching the DOM.
sm · md · lg — compact to spacious.--wick-ob-row-height: 28px
--wick-ob-font-size: 12px
import '@wick/theme/glass'Component Library
Build any trading interface.
31 headless primitives — unstyled, composable, ready to drop into any stack. Use only what you need.
Showing 3 of 8 — explore the rest in the playground.
View all 8Showing 3 of 6 — explore the rest in the playground.
View all 6Showing 3 of 2 — explore the rest in the playground.
View all 2Showing 3 of 3 — explore the rest in the playground.
View all 3Showing 3 of 4 — explore the rest in the playground.
View all 4Showing 3 of 4 — explore the rest in the playground.
View all 4Showing 3 of 4 — explore the rest in the playground.
View all 410 Exchange Adapters
adapter.parse(msg)Drop-in adapters normalise raw WebSocket messages from 10 exchanges into Wick types. One interface — everywhere.
Framework Support
Works with your stack
Native Web Components plus framework wrappers for the DX you expect.
import { OrderBook, PriceTicker } from '@wick/react';
function TradingPanel({ bookData, tickerData }) {
return (
<div className="trading-panel">
<PriceTicker data={tickerData} showDetails />
<OrderBook
data={bookData}
depth={15}
showTotal
showDepth
onLevelClick={(d) => placeOrder(d.price)}
/>
</div>
);
}<template>
<div class="trading-panel">
<wick-price-ticker show-details ref="ticker" />
<wick-order-book depth="15" show-total show-depth ref="book" />
</div>
</template>
<script setup>
import { ref, watch } from 'vue'
import '@wick/price-ticker'
import '@wick/order-book'
const props = defineProps(['bookData', 'tickerData'])
const ticker = ref(null)
const book = ref(null)
watch(() => props.tickerData, (data) => { if (ticker.value) ticker.value.data = data })
watch(() => props.bookData, (data) => { if (book.value) book.value.data = data })
</script><script>
import '@wick/order-book';
import '@wick/price-ticker';
export let bookData;
export let tickerData;
let bookEl;
let tickerEl;
$: if (bookEl) bookEl.data = bookData;
$: if (tickerEl) tickerEl.data = tickerData;
</script>
<wick-price-ticker show-details bind:this={tickerEl} />
<wick-order-book depth="15" show-total show-depth bind:this={bookEl} />import { Component, Input, ViewChild, ElementRef } from '@angular/core';
import '@wick/order-book';
import '@wick/price-ticker';
@Component({
selector: 'trading-panel',
template: `
<wick-price-ticker show-details #ticker></wick-price-ticker>
<wick-order-book depth="15" show-total show-depth #book></wick-order-book>
`,
})
export class TradingPanelComponent {
@ViewChild('ticker') ticker!: ElementRef;
@ViewChild('book') book!: ElementRef;
@Input() set tickerData(v: any) { if (this.ticker) this.ticker.nativeElement.data = v; }
@Input() set bookData(v: any) { if (this.book) this.book.nativeElement.data = v; }
}import '@wick/order-book';
import '@wick/price-ticker';
const book = document.querySelector('wick-order-book');
const ticker = document.querySelector('wick-price-ticker');
// Set initial snapshot
book.data = bookData;
ticker.data = tickerData;
// Stream live updates
ws.onmessage = (e) => {
const msg = JSON.parse(e.data);
book.applyDelta(msg.delta);
ticker.data = msg.ticker;
};
// React to level clicks
book.addEventListener('wick-order-book-level-click', (e) => {
placeOrder(e.detail.price, e.detail.side);
});Themes
One component. Three personalities.
Drop in a theme CSS file and every component inherits it. Override any token at the :root or component level.
Dark
Binance / Bybit aestheticHigh-contrast greens on near-black. The standard terminal dark theme — recognisable to any crypto trader.
import '@wick/theme/dark'Glass
GlassmorphismTranslucent surfaces over rich purple gradients. Built for dashboard builders who want visual depth.
import '@wick/theme/glass'Minimal
Linear / Stripe aestheticMonochrome restraint. Near-invisible borders, desaturated accents. Disappears behind your data.
import '@wick/theme/minimal'Ready to ship?
Start building today.
The trading UI community finally has the primitives it deserves. Open source. MIT licensed.