syncfusion-blazor-range-selectors — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited syncfusion-blazor-range-selectors (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
NuGet: Syncfusion.Blazor.Charts + Syncfusion.Blazor.Themes (or Syncfusion.Blazor.RangeNavigator for individual package) Namespace: Syncfusion.Blazor.Charts
A comprehensive skill for implementing Syncfusion Blazor Range Selector (RangeNavigator) components for data range selection and chart navigation. The Range Selector enables users to select a specific range from a large data collection using draggable thumbs, providing an intuitive way to filter and navigate through time-series or numeric data.
Use this skill immediately when you need to:
The Syncfusion Blazor Range Selector (SfRangeNavigator) is a specialized control designed for data range selection and navigation. It combines:
RangeNavigatorPeriodSelectorSettings, RangeNavigatorPeriods, and RangeNavigatorPeriodRangeNavigatorBorder, RangeNavigatorMargin, RangeNavigatorStyleSettings, RangeNavigatorThumbSettings, and tooltip settingsKey Capabilities:
📄 Read: references/getting-started.md
Start here for installation, setup, and your first range selector. Covers:
#### Range Selection and Values
📄 Read: references/range-configuration.md
Configure range selection behavior and value binding:
#### Series Types
📄 Read: references/series-types.md
Choose and customize series visualization:
#### Data Binding
📄 Read: references/data-binding.md
Configure data sources for the range selector:
#### Period Selector Integration
📄 Read: references/period-selector-integration.md
Add period selector buttons for quick navigation:
#### Axis Customization
📄 Read: references/axis-customization.md
Customize axis, grid, and labels:
#### Visual Customization
📄 Read: references/visual-customization.md
Control appearance, themes, and layout:
#### Export, Events, and Accessibility
📄 Read: references/export-events-accessibility.md
Handle exports, events, and ensure accessibility:
Here's a minimal range selector for time-series data filtering with event handling:
@using Syncfusion.Blazor.Charts
@{
DateTime[] range = SelectedRange as DateTime[] ?? new DateTime[] { DateTime.Now, DateTime.Now };
}
<h3>Stock Price Range Selector</h3>
<p>Selected Range: @range[0].ToShortDateString() to @range[1].ToShortDateString()</p>
<SfRangeNavigator @bind-Value="@SelectedRange"
ValueType="RangeValueType.DateTime"
LabelFormat="MMM-yy"
IntervalType="RangeIntervalType.Months">
<RangeNavigatorEvents Changed="OnRangeChanged"></RangeNavigatorEvents>
<RangeNavigatorRangeTooltipSettings Enable="true"></RangeNavigatorRangeTooltipSettings>
<RangeNavigatorSeriesCollection>
<RangeNavigatorSeries DataSource="@StockData"
XName="Date"
YName="Close"
Type="RangeNavigatorType.Area"
Fill="#3F51B5">
</RangeNavigatorSeries>
</RangeNavigatorSeriesCollection>
</SfRangeNavigator>
@code {
public class StockInfo
{
public DateTime Date { get; set; }
public double Close { get; set; }
}
public object SelectedRange = new DateTime[]
{
new DateTime(2020, 01, 01),
new DateTime(2021, 01, 01)
};
public List<StockInfo> StockData = new List<StockInfo>
{
new StockInfo { Date = new DateTime(2018, 01, 01), Close = 35 },
new StockInfo { Date = new DateTime(2019, 01, 01), Close = 42 },
new StockInfo { Date = new DateTime(2020, 01, 01), Close = 48 },
new StockInfo { Date = new DateTime(2021, 01, 01), Close = 56 },
new StockInfo { Date = new DateTime(2022, 01, 01), Close = 62 }
};
private void OnRangeChanged(ChangedEventArgs args)
{
// Handle range change event
Console.WriteLine($"Range changed: {args.Start} to {args.End}");
}
}What this creates:
Filter stock data with quick period buttons:
@using Syncfusion.Blazor.Charts
<SfRangeNavigator @bind-Value="@SelectedRange"
ValueType="RangeValueType.DateTime"
IntervalType="RangeIntervalType.Months"
LabelFormat="MMM yy">
<RangeNavigatorRangeTooltipSettings Enable="true" DisplayMode="TooltipDisplayMode.Always">
</RangeNavigatorRangeTooltipSettings>
<RangeNavigatorPeriodSelectorSettings>
<RangeNavigatorPeriods>
<RangeNavigatorPeriod Text="1M" Interval="1" IntervalType="RangeIntervalType.Months"></RangeNavigatorPeriod>
<RangeNavigatorPeriod Text="3M" Interval="3" IntervalType="RangeIntervalType.Months"></RangeNavigatorPeriod>
<RangeNavigatorPeriod Text="6M" Interval="6" IntervalType="RangeIntervalType.Months"></RangeNavigatorPeriod>
<RangeNavigatorPeriod Text="YTD"></RangeNavigatorPeriod>
<RangeNavigatorPeriod Text="1Y" Interval="1" IntervalType="RangeIntervalType.Years"></RangeNavigatorPeriod>
<RangeNavigatorPeriod Text="All"></RangeNavigatorPeriod>
</RangeNavigatorPeriods>
</RangeNavigatorPeriodSelectorSettings>
<RangeNavigatorSeriesCollection>
<RangeNavigatorSeries DataSource="@StockData" XName="Date" YName="Close" Type="RangeNavigatorType.Area">
</RangeNavigatorSeries>
</RangeNavigatorSeriesCollection>
</SfRangeNavigator>
@{
DateTime[] range = SelectedRange as DateTime[] ?? new DateTime[] { DateTime.Now, DateTime.Now };
}
<p>Selected Range: @range[0].ToShortDateString() to @range[1].ToShortDateString()</p>
@code {
public object SelectedRange = new DateTime[]
{
new DateTime(2022, 01, 01),
new DateTime(2023, 01, 01)
};
public List<StockInfo> StockData = GetStockData();
private static List<StockInfo> GetStockData()
{
// Sample data generation
var data = new List<StockInfo>();
var startDate = new DateTime(2020, 01, 01);
var random = new Random();
for (int i = 0; i < 100; i++)
{
data.Add(new StockInfo
{
Date = startDate.AddDays(i * 10),
Close = 100 + random.Next(-20, 20)
});
}
return data;
}
public class StockInfo
{
public DateTime Date { get; set; }
public double Close { get; set; }
}
}Synchronize chart data with range selector:
@using Syncfusion.Blazor.Charts
<div class="dashboard-container">
<h3>Sales Dashboard</h3>
<SfRangeNavigator Value="@SelectedRange"
ValueType="RangeValueType.DateTime"
Height="140px">
<RangeNavigatorEvents Changed="OnRangeChanged" />
<RangeNavigatorSeriesCollection>
<RangeNavigatorSeries DataSource="@SalesDetails"
XName="Date"
YName="Revenue"
Type="RangeNavigatorType.Area" />
</RangeNavigatorSeriesCollection>
</SfRangeNavigator>
<SfChart Height="300px">
<ChartPrimaryXAxis ValueType="Syncfusion.Blazor.Charts.ValueType.DateTime"
Minimum="@SelectedRange[0]"
Maximum="@SelectedRange[1]" />
<ChartSeriesCollection>
<ChartSeries DataSource="@FilteredData"
XName="Date"
YName="Revenue"
Type="ChartSeriesType.Column" />
</ChartSeriesCollection>
</SfChart>
</div>
@code {
public DateTime[] SelectedRange =
{
new DateTime(2023, 01, 01),
new DateTime(2023, 06, 30)
};
public List<SalesData> SalesDetails = new();
public List<SalesData> FilteredData = new();
protected override void OnInitialized()
{
SalesDetails = GetSalesData();
ApplyFilter();
}
private void OnRangeChanged(ChangedEventArgs args)
{
if (args.Start is DateTime start && args.End is DateTime end)
{
SelectedRange = new[] { start, end };
ApplyFilter();
}
}
private void ApplyFilter()
{
FilteredData = SalesDetails
.Where(d => d.Date >= SelectedRange[0] && d.Date <= SelectedRange[1])
.ToList();
}
private List<SalesData> GetSalesData()
{
var data = new List<SalesData>();
var random = new Random();
var start = new DateTime(2023, 01, 01);
decimal revenue = 15000;
for (int i = 0; i < 180; i++)
{
revenue += random.Next(-1500, 2000);
data.Add(new SalesData
{
Date = start.AddDays(i),
Revenue = Math.Max(revenue, 5000)
});
}
return data;
}
public class SalesData
{
public DateTime Date { get; set; }
public decimal Revenue { get; set; }
}
}Optimize for large datasets:
@using Syncfusion.Blazor.Charts
<SfRangeNavigator Value="@SelectedRange"
ValueType="RangeValueType.DateTime"
EnableGrouping="true"
GroupBy="RangeIntervalType.Months"
AllowSnapping="true">
<RangeNavigatorRangeTooltipSettings Enable="true"></RangeNavigatorRangeTooltipSettings>
<RangeNavigatorSeriesCollection>
<RangeNavigatorSeries DataSource="@LargeDataset"
XName="Timestamp"
YName="Value"
Type="RangeNavigatorType.Line">
</RangeNavigatorSeries>
</RangeNavigatorSeriesCollection>
</SfRangeNavigator>
@code {
public DateTime[] SelectedRange;
public List<DataPoint> LargeDataset = GenerateLargeDataset(10000);
public class DataPoint
{
public DateTime Timestamp { get; set; }
public double Value { get; set; }
}
private static List<DataPoint> GenerateLargeDataset(int count)
{
// Generate large dataset efficiently
return Enumerable.Range(0, count)
.Select(i => new DataPoint
{
Timestamp = DateTime.Now.AddHours(-count + i),
Value = Math.Sin(i * 0.1) * 100
})
.ToList();
}
}| Property | Type | Description | Default |
|---|---|---|---|
Value | DateTime[] / double[] | Selected range [start, end] | null |
ValueType | RangeValueType | Data type (DateTime, Double, Logarithmic) | Double |
DataSource | object | Data collection for series | null |
IntervalType | RangeIntervalType | Axis interval (Auto, Years, Months, Days, etc.) | Auto |
LabelFormat | string | Label display format | null |
Width | string | Component width | "100%" |
Height | string | Component height | "80px" |
Theme | Theme | Visual theme (Material, Bootstrap5, Fluent, Tailwind, Fabric, HighContrast) | Material |
Interval | int | Axis interval value | 1 |
LogBase | double | Base for logarithmic axis | 10 |
Orientation | Orientation | Horizontal or Vertical | Horizontal |
| Property | Type | Description | Default |
|---|---|---|---|
Type | RangeNavigatorType | Series type (Line, Area, StepLine) | Line |
XName | string | X-axis data field name | null |
YName | string | Y-axis data field name | null |
Fill | string | Series fill color | null |
Width | double | Series line width | 1 |
Opacity | double | Series opacity (0-1) | 1 |
Name | string | Series name/label | null |
| Property | Type | Description | Default |
|---|---|---|---|
EnableGrouping | bool | Enable data grouping | false |
AllowSnapping | bool | Snap thumbs to data points | false |
EnableRtl | bool | Right-to-Left support | false |
TabIndex | int | Tab index for keyboard navigation | 0 |
| Property | Type | Description |
|---|---|---|
RangeNavigatorPeriodSelectorSettings | Component | Period selector configuration (Enabled, Height, Position) |
RangeNavigatorPeriods | Collection | Period button collection container |
RangeNavigatorPeriod | Item | Individual period selector button (Text, Interval, IntervalType, Selected) |
| Property | Type | Description | Default |
|---|---|---|---|
RangeNavigatorRangeTooltipSettings.Enable | bool | Enable/disable tooltip | true |
RangeNavigatorRangeTooltipSettings.DisplayMode | TooltipDisplayMode | Display mode (OnDemand, Always) | OnDemand |
RangeNavigatorRangeTooltipSettings.Format | string | Tooltip content format template | null |
| Property | Type | Description |
|---|---|---|
RangeNavigatorMargin | Component | Margin (Left, Right, Top, Bottom) |
RangeNavigatorBorder | Component | Border (Color, Width, DashArray) |
RangeNavigatorMajorGridLines | Component | Gridlines (Width, Color, DashArray) |
RangeNavigatorMajorTickLines | Component | Tick lines (Width, Color, Height) |
RangeNavigatorLabelStyle | Component | Label styling (Color, FontFamily, Size, FontWeight) |
| Property | Type | Description | Default |
|---|---|---|---|
RangeNavigatorThumbSettings.Type | ThumbType | Thumb shape (Circle, Rectangle) | Circle |
RangeNavigatorThumbSettings.Fill | string | Thumb fill color | "#f3f3f3" |
RangeNavigatorThumbSettings.Size | double | Thumb size in pixels | 15 |
Key events for handling Range Navigator interactions:
| Event | Event Args | Description |
|---|---|---|
Changed | ChangedEventArgs | Fires when range selection changes (start, end, value) |
Loaded | RangeLoadedEventArgs | Fires after component loads completely |
Resizing | RangeResizeEventArgs | Fires while dragging thumbs |
Resized | RangeResizeEventArgs | Fires after thumb drag completes |
Rendering | RangeSelectorRenderEventArgs | Fires before selector renders |
TooltipRender | RangeTooltipRenderEventArgs | Fires before tooltip renders |
LabelRender | RangeLabelRenderEventArgs | Fires when labels render |
Example Event Handler:
private void OnRangeChanged(ChangedEventArgs args)
{
var startValue = args.Start; // DateTime or double
var endValue = args.End; // DateTime or double
var selectedData = args.SelectedData; // Filtered data
StateHasChanged();
}Key methods for programmatic control:
| Method | Return Type | Description |
|---|---|---|
ExportAsync(ExportType, string) | Task | Export as PNG, JPEG, SVG, or PDF |
Print() | Task | Print the Range Navigator |
Refresh() | Task | Refresh/redraw component |
GetVisibleRangeModel() | VisibleRangeModel | Get current visible range |
When implementing a range selector, follow this sequence:
For questions or issues, refer to the troubleshooting sections in each reference file or consult Export, Events, and Accessibility for event handling patterns and accessibility requirements.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.