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

ChartComponentTier
Line / AreaArcadiaLineChart<T>Community (Free)
Bar / ColumnArcadiaBarChart<T>Community (Free)
Pie / DonutArcadiaPieChart<T>Community (Free)
Scatter / BubbleArcadiaScatterChart<T>Community (Free)
Candlestick (OHLC)ArcadiaCandlestickChart<T>Pro
Radar / SpiderArcadiaRadarChart<T>Pro
GaugeArcadiaGaugeChartPro
HeatmapArcadiaHeatmap<T>Pro
FunnelArcadiaFunnelChart<T>Pro
TreemapArcadiaTreemapChart<T>Pro
WaterfallArcadiaWaterfallChart<T>Pro
Rose / PolarArcadiaRoseChart<T>Pro
Range AreaArcadiaRangeAreaChart<T>Pro
Box PlotArcadiaBoxPlot<T>Pro
SankeyArcadiaSankeyChartPro
ChordArcadiaChordChartPro

Dashboard Widgets

WidgetComponentDescription
SparklineArcadiaSparklineInline mini chart, no axes
KPI CardArcadiaKpiCardValue + delta + sparkline + footer
Delta IndicatorArcadiaDeltaIndicatorUp/down arrow with percentage
Progress BarArcadiaProgressBarLinear progress with thresholds
Bar ListArcadiaBarList<T>Horizontal bar ranking
TrackerArcadiaTrackerGitHub-style contribution grid
Category BarArcadiaCategoryBar<T>Segmented horizontal bar

Live Demo

Charts & Dashboard Demo Open in new tab ↗
Loading Blazor demo...

Shared Parameters

All chart components inherit from ChartBase<T> and share these parameters:

ParameterTypeDefaultDescription
DataIReadOnlyList<T>The data to visualize
Widthdouble0Chart width in pixels (0 = responsive, fills container)
Heightdouble300Chart height in pixels
Titlestring?nullChart title
Subtitlestring?nullSubtitle below title
ShowGridbooltrueShow grid lines
ShowLegendbooltrueShow legend
LegendPositionstring”bottom”top/bottom/left/right
AnimateOnLoadbooltrueAnimate on first render
YAxisMin / YAxisMaxdouble?nullManual axis range
YAxisFormatStringstring?nullFormat (e.g., “C0”, “P1”)
ShowDataLabelsboolfalseValue labels on data points
OnPointClickEventCallback<PointClickEventArgs<T>>Click event with item, data index, and series context
ShowCrosshairboolfalseVertical crosshair on hover (docs)
AnnotationsList<ChartAnnotation>?nullData point markers (docs)
EnableZoomboolfalseMouse wheel zoom
EnablePanboolfalseClick-drag pan
ZoomModestring”x”Zoom direction: x, y, or xy
LoadingboolfalseShow loading skeleton
AriaLabelstring?nullScreen reader label
FormatProviderIFormatProvider?nullCulture for formatting

Line Chart Only

ParameterTypeDefaultDescription
SlidingWindowint0Max points for streaming (docs)
NullHandlingNullHandlingGapHow 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" and aria-label on 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).