OakView

A TradingView-style charting Web Component built
on lightweight-charts v5. Drop-in chart with toolbar, drawing
tools, and flexible data provider architecture.
Features
- Simple Integration:
<oak-view> - single tag for full-featured charts
- TradingView UI: Built-in toolbar, symbol search, interval selector, chart types
- Drawing Tools: 21 professional drawing tools (trend lines, Fibonacci, shapes)
- Data Agnostic: Bring your own data provider (REST, WebSocket, CSV)
- Full API Access: Direct access to lightweight-charts v5 API
- Framework Agnostic: Works with React, Vue, Angular, or vanilla JS
- Multiple Layouts: Single, dual, triple, or quad pane layouts
- Theme Support: Light and dark themes
Installation
npm install oakview
Quick Start
<!DOCTYPE html>
<html>
<head>
<script type="module">
import 'oakview';
import { OakViewDataProvider } from 'oakview';
class MyProvider extends OakViewDataProvider {
async initialize() { }
async fetchHistorical(symbol, interval) {
const response = await fetch(`/api/bars/${symbol}/${interval}`);
const data = await response.json();
return data.map(bar => ({
time: bar.timestamp,
open: bar.open,
high: bar.high,
low: bar.low,
close: bar.close,
volume: bar.volume
}));
}
}
const chart = document.getElementById('chart');
const provider = new MyProvider();
await provider.initialize();
chart.setDataProvider(provider);
</script>
</head>
<body>
<oak-view id="chart" symbol="AAPL" theme="dark"></oak-view>
</body>
</html>
Data Providers
OakView uses a flexible data provider system. Implement these methods:
initialize(config) | Yes | Connect to data source |
fetchHistorical(symbol, interval) | Yes | Load OHLCV bars |
subscribe(symbol, interval, callback) | No | Real-time updates |
searchSymbols(query) | No | Symbol search |
getAvailableIntervals(symbol) | No | List timeframes |
Example Providers
Data Format
{
time: 1700000000,
open: 150.00,
high: 152.50,
low: 149.00,
close: 151.75,
volume: 1000000
}
Important: Time must be in Unix seconds. Data must be sorted ascending (oldest first).
API Reference
<oak-view> Attributes
layout | 'single' | 'dual' | 'triple' | 'quad' | 'single' | Pane layout |
symbol | string | 'SYMBOL' | Initial symbol |
theme | 'light' | 'dark' | 'dark' | Color theme |
Layout Methods
const chart = document.getElementById('chart');
chart.setDataProvider(provider);
const pane = chart.getChartAt(0);
const count = chart.getChartCount();
chart.setLayout('dual');
Chart Pane Methods
const pane = chart.getChartAt(0);
pane.setData(bars);
pane.updateRealtime(bar);
const lwChart = pane.getChart();
const series = pane.getSeries();
Events
chart.addEventListener('symbol-change', (e) => {
console.log('Symbol:', e.detail.symbol);
});
chart.addEventListener('interval-change', (e) => {
console.log('Interval:', e.detail.interval);
});
Direct API Access
Access the underlying lightweight-charts v5 API for advanced features:
const pane = chart.getChartAt(0);
const lwChart = pane.getChart();
const series = pane.getSeries();
series.createPriceLine({
price: 150.00,
color: '#FF9800',
title: 'Entry'
});
series.setMarkers([{
time: 1700000000,
position: 'belowBar',
color: '#26a69a',
shape: 'arrowUp',
text: 'BUY'
}]);
lwChart.timeScale().fitContent();
Drawing Tools
21 professional drawing tools organized by category:
- Lines: Trend Line, Horizontal, Vertical, Ray, Arrow, Extended Line
- Fibonacci: Retracement, Parallel Channel
- Shapes: Rectangle, Circle, Triangle, Price Range
- Annotations: Text, Callout, Brush, Highlighter, Path
const pane = chart.getChartAt(0);
pane.setActiveTool('trend-line');
pane.addDrawing('horizontal-line', [
{ time: 1700000000, price: 150 }
], { lineColor: '#ef5350' });
const json = pane.exportDrawings();
pane.importDrawings(json);
Development
npm install
npm run dev
npm run build
npm test
Browser Support
- Chrome/Edge 79+
- Firefox 63+
- Safari 13.1+
Tech Stack
License
MIT