Charts & Dashboard Widgets
A dashboard analytics toolkit for Blazor — 20 chart types and 7 pre-composed dashboard widgets. Native SVG rendering with zero JavaScript dependencies.
Chart Types
| Chart | Component | Tier |
|---|---|---|
| Line / Area | ArcadiaLineChart<T> | Community (Free) |
| Bar / Column | ArcadiaBarChart<T> | Community (Free) |
| Pie / Donut | ArcadiaPieChart<T> | Community (Free) |
| Scatter / Bubble | ArcadiaScatterChart<T> | Community (Free) |
| Candlestick (OHLC) | ArcadiaCandlestickChart<T> | Pro |
| Radar / Spider | ArcadiaRadarChart<T> | Pro |
| Gauge | ArcadiaGaugeChart | Pro |
| Heatmap | ArcadiaHeatmap<T> | Pro |
| Funnel | ArcadiaFunnelChart<T> | Pro |
| Treemap | ArcadiaTreemapChart<T> | Pro |
| Waterfall | ArcadiaWaterfallChart<T> | Pro |
| Rose / Polar | ArcadiaRoseChart<T> | Pro |
| Range Area | ArcadiaRangeAreaChart<T> | Pro |
| Box Plot | ArcadiaBoxPlot<T> | Pro |
| Sankey | ArcadiaSankeyChart | Pro |
| Chord | ArcadiaChordChart | Pro |
Dashboard Widgets
| Widget | Component | Description |
|---|---|---|
| Sparkline | ArcadiaSparkline | Inline mini chart, no axes |
| KPI Card | ArcadiaKpiCard | Value + delta + sparkline + footer |
| Delta Indicator | ArcadiaDeltaIndicator | Up/down arrow with percentage |
| Progress Bar | ArcadiaProgressBar | Linear progress with thresholds |
| Bar List | ArcadiaBarList<T> | Horizontal bar ranking |
| Tracker | ArcadiaTracker | GitHub-style contribution grid |
| Category Bar | ArcadiaCategoryBar<T> | Segmented horizontal bar |
Live Demo
Interactive demo coming soon
Try locally with: dotnet run --project samples/Arcadia.Demo.ServerShared Parameters
All chart components inherit from ChartBase<T> and share these parameters:
| Parameter | Type | Default | Description |
|---|---|---|---|
Data | IReadOnlyList<T> | — | The data to visualize |
Width | double | 0 | Chart width in pixels (0 = responsive, fills container) |
Height | double | 300 | Chart height in pixels |
Title | string? | null | Chart title |
Subtitle | string? | null | Subtitle below title |
ShowGrid | bool | true | Show grid lines |
ShowLegend | bool | true | Show legend |
LegendPosition | string | ”bottom” | top/bottom/left/right |
AnimateOnLoad | bool | true | Animate on first render |
YAxisMin / YAxisMax | double? | null | Manual axis range |
YAxisFormatString | string? | null | Format (e.g., “C0”, “P1”) |
ShowDataLabels | bool | false | Value labels on data points |
OnPointClick | EventCallback<PointClickEventArgs<T>> | — | Click event with item, data index, and series context |
ShowCrosshair | bool | false | Vertical crosshair on hover (docs) |
Annotations | List<ChartAnnotation>? | null | Data point markers (docs) |
EnableZoom | bool | false | Mouse wheel zoom |
EnablePan | bool | false | Click-drag pan |
ZoomMode | string | ”x” | Zoom direction: x, y, or xy |
Loading | bool | false | Show loading skeleton |
AriaLabel | string? | null | Screen reader label |
FormatProvider | IFormatProvider? | null | Culture for formatting |
Line Chart Only
| Parameter | Type | Default | Description |
|---|---|---|---|
SlidingWindow | int | 0 | Max points for streaming (docs) |
NullHandling | NullHandling | Gap | How to handle missing data: Gap, Connect, Zero |
Series Configuration
var series = new List<SeriesConfig<SalesRecord>>
{
new()
{
Name = "Revenue", // Legend label
Field = d => d.Revenue, // Y-value selector
Color = "primary", // Color name or CSS
StrokeWidth = 2, // Line width
ShowArea = true, // Fill below line
AreaOpacity = 0.15, // Fill opacity
Dashed = false, // Dashed line
ShowPoints = true, // Data point dots
PointRadius = 3, // Dot size
PointShape = "circle", // circle/square/diamond/triangle
CurveType = "linear", // linear/smooth/step
}
};
Color Palettes
7 built-in palettes:
ChartPalette.Default // Theme token colors
ChartPalette.Cool // Blues and greens
ChartPalette.Warm // Reds and oranges
ChartPalette.Monochrome // Grays
ChartPalette.Pastel // Soft colors
ChartPalette.Vibrant // Saturated
ChartPalette.Accessible // Okabe-Ito (color-blind safe)
Accessibility
Every chart automatically includes:
role="figure"andaria-labelon the SVG- Hidden
<table>with all data for screen readers - Animations respect
prefers-reduced-motion
Custom Tooltip Templates
The TooltipTemplate parameter accepts a RenderFragment<T> for fully custom HTML tooltips:
<ArcadiaLineChart TItem="SalesRecord" Data="@data"
XField="@(d => (object)d.Month)" Series="@series"
Height="350" Width="0">
<TooltipTemplate Context="item">
<div style="padding: 8px;">
<strong>@item.Month</strong>
<div>Revenue: $@item.Revenue.ToString("N0")</div>
</div>
</TooltipTemplate>
</ArcadiaLineChart>
Note: Custom tooltip templates require an interactive render mode (Server or WASM). In static SSR, the default text tooltips are used instead.
Real-Time Data (ObservableCollection)
All chart types automatically detect when Data is an ObservableCollection<T> and re-render when items are added, removed, or cleared. No manual StateHasChanged() needed.
Basic Usage
@using System.Collections.ObjectModel
<ArcadiaLineChart TItem="StockTick" Data="@_ticks"
XField="@(d => (object)d.Time)"
Series="@_series"
Height="300"
ShowPoints="false"
AnimateOnLoad="false" />
@code {
private ObservableCollection<StockTick> _ticks = new();
private List<SeriesConfig<StockTick>> _series = new()
{
new() { Name = "Price", Field = d => d.Price }
};
// Adding a tick auto-updates the chart — no StateHasChanged needed
private void AddTick() => _ticks.Add(new StockTick(DateTime.Now, 142.50));
}
Timer-Based Streaming
@implements IDisposable
<ArcadiaLineChart TItem="SensorReading" Data="@_readings"
XField="@(d => (object)d.Timestamp)"
Series="@_series" Height="250" ShowPoints="false" />
@code {
private ObservableCollection<SensorReading> _readings = new();
private System.Threading.Timer? _timer;
protected override void OnInitialized()
{
_timer = new System.Threading.Timer(_ =>
{
InvokeAsync(() =>
{
_readings.Add(new SensorReading(DateTime.Now, ReadSensor()));
if (_readings.Count > 60) _readings.RemoveAt(0);
});
}, null, 0, 1000);
}
public void Dispose() => _timer?.Dispose();
}
SignalR Integration
// In a Blazor Server component
hubConnection.On<SensorReading>("NewReading", reading =>
{
_readings.Add(reading);
if (_readings.Count > 100) _readings.RemoveAt(0);
// Chart updates automatically!
});
Debouncing
Rapid changes (e.g., 100 items added in 50ms) are automatically debounced into a single re-render for optimal performance. The default debounce window is 16ms (one frame at 60fps).