```
20+ presets: `FadeIn`, `FadeOut`, `SlideInLeft`, `SlideInRight`, `SlideInUp`, `SlideInDown`,
`ZoomIn`, `ZoomOut`, `Bounce`, `Pulse`, `Shake`, `Spin`, and more.
### SelectionIndicator
```razor
@* Drop as last child of any selection container *@
@* Underline mode with custom height *@
```
Params: `Selector` (`string`, default `[data-state=active]`), `Hover` (`bool`, default `false`), `Class` (`string?`).
CSS vars: `--si-duration` (350ms), `--si-easing` (spring cubic-bezier), `--si-height` (optional fixed height).
Items in container need `relative z-1` to appear above the indicator.
### HeightAnimation
```razor
Animated height content
```
Animates height from `0` to `auto` when `Visible` changes. Zero JS required. See `components-full.txt` for full reference.
### PageTransition
```razor
@* In MainLayout.razor *@
@Body
```
Fade (+ optional slide-from-bottom) on page navigation. Requires `RenderStateProvider` ancestor. SSR-safe — no animation during prerender.
### RenderStateProvider
```razor
@* Wrap layout body *@
@Body
@* Consume in child components *@
@code {
[CascadingParameter] public AppRenderContext? RenderContext { get; set; }
// RenderContext.IsInteractive, .IsHydrating, .IsEnhancedNavigation
}
```
Cascades `AppRenderContext` to children. Required ancestor for `PageTransition`.
---
## DialogService (Programmatic Dialogs)
```csharp
// Program.cs
builder.Services.AddNeoUIComponents(); // includes IDialogService, ILocalizer
// Localization (3.6.4+) -- override built-in English strings at startup
builder.Services.AddNeoUIComponents(loc =>
{
loc.Set("Combobox.Placeholder", "Waehlen Sie...");
loc.Set("DataTable.Loading", "Laden...");
// 70+ keys -- see /components/localization for full key reference
});
// Option B: subclass DefaultLocalizer for .resx / IStringLocalizer integration
// builder.Services.AddScoped();
```
```razor
@inject IDialogService DialogService
@code {
async Task ShowConfirm()
{
var result = await DialogService.ShowAsync(
title: "Confirm Delete",
parameters: new() { ["Message"] = "Delete this item?" });
if (result.Confirmed)
await DeleteItem();
}
}
```
### DialogHost
```razor
@* In MainLayout.razor — place once *@
@* In a component *@
@inject IDialogService DialogService
@code {
async Task Delete()
{
var result = await DialogService.ShowAsync(new DialogOptions
{
Title = "Delete Item",
Message = "Are you sure?",
Buttons = DialogButtons.YesNo,
Variant = DialogVariant.Destructive,
Icon = "trash-2"
});
if (result == DialogResult.Confirmed)
await DeleteAsync();
}
}
```
`DialogButtons`: `OkOnly` | `OkCancel` | `YesNo` | `YesNoCancel`
`DialogVariant`: `Default` | `Destructive` | `Warning` | `Success` | `Info`
---
## New in 3.5 -- Advanced Components
### Timeline
```razor
@* With custom icons and content *@
Deployment complete2 hours agov3.5.0 deployed to production.
```
Statuses: `Pending` | `Active` | `Completed`
Aligns: `Left` | `Right` | `Alternate`
ConnectorStyles: `Solid` | `Dashed` | `Dotted`
Sizes: `Small` | `Default` | `Large`
---
### TreeView
```razor
@* Multi-select with tri-state checkboxes *@
```
SelectionModes: `None` | `Single` | `Multiple`
---
### DataView
```razor
@p.Name@p.Price.ToString("C")
@p.Name
@* Responsive grid with min column width (3.6.1) -- overrides GridColumns *@
@p.Name
@* Server-side infinite scroll *@
@o.Id
```
SelectionModes: `None` | `Single` | `Multiple`
Layouts: `List` | `Grid`
---
### DynamicForm
```razor
@* Define a schema *@
@code {
private FormSchema _schema = new()
{
Fields =
[
new FormFieldDefinition { Key = "name", Label = "Full Name", Type = FieldType.Text, IsRequired = true },
new FormFieldDefinition { Key = "email", Label = "Email", Type = FieldType.Email, IsRequired = true },
new FormFieldDefinition { Key = "role", Label = "Role", Type = FieldType.Select,
Options = [new("admin","Admin"), new("user","User")] },
]
};
private Dictionary _values = new();
}
```
FieldTypes: `Text` | `Email` | `Password` | `Number` | `Date` | `DateRange` | `Select` | `MultiSelect` |
`Checkbox` | `Switch` | `Slider` | `SliderRange` | `Textarea` | `Rating` | `ColorPicker` |
`TimePicker` | `FileUpload` | `InputOtp` | `MaskedInput` | `CurrencyInput` | `RichText` | `MarkdownEditor`
FormLayouts: `SingleColumn` | `TwoColumn`
---
### TagInput
```razor
@* With async suggestions *@
@code {
private List tags = new();
private async Task> SearchTags(string q) =>
await TagService.SearchAsync(q);
}
```
Variants: `Default` | `Outlined` | `Ghost`
Triggers (flags): `Enter` | `Comma` | `Tab` | `Space` | `Blur`
---
### SplitButton
```razor
Save as DraftSave as TemplateDiscard
@* With variant and icon *@
Deploy to StagingDeploy to Production
@* Independent CSS on each segment (v3.7.1) *@
Publish as Draft
```
New in v3.7.1: `PrimaryClass` (`string?`) and `DropdownClass` (`string?`) for independent per-segment CSS overrides.
---
## New in 3.5 -- New Chart Types
All new charts use `@using NeoUI.Blazor.Charts`.
### CandlestickChart
```razor
```
### FunnelChart
```razor
@* Custom color palette (3.6.3) *@
```
Sorts: `Descending` | `Ascending` | `None`
`Colors` cycles through the array for each segment; `null` = auto `--chart-1…5` palette.
### GaugeChart
```razor
@* Single KPI *@
@* Multi-tile: each Gauge series drives one tile *@
@* Progress ring *@
@code { record Metric(string name, double value); }
```
### HeatmapChart
```razor
@code { record Cell(int hour, int day, int value); }
```
### RadialBarChart
```razor
```
---
## New in 3.8 -- SelectionIndicator + Sortable
### SelectionIndicator
Spring-animated indicator that slides between active items (e.g. tabs, toggle groups).
```razor
AlphaBeta
...
```
Parameters: `Selector` (string, default `[data-state=active]`), `Hover` (bool), `Class` (string?).
CSS variables: `--si-duration`, `--si-easing`, `--si-height`.
Works with: Tabs, ToggleGroup, RadioGroup, Pagination, and any custom markup using `data-state=active`.
### Sortable + Cross-list Drag-and-Drop
```razor
@item.Name
```
Cross-list DnD: share `Group` name across multiple `Sortable` instances.
```razor
@item.Name@item.Name
```
`SortableContent` exposes `data-[state=over]` attribute for visual drag-over feedback.
---
## New in 3.9 -- Mobile Components
### AppBar
Mobile top app bar with optional back button and right-side content slot.
```razor
```
### BottomNav + BottomNavItem
Persistent mobile tab bar pinned to the bottom of the screen.
```razor
```
### NotificationBadge
Wraps any element and overlays a count badge in the top-right corner.
```razor
```
Use `Dot="true"` for a dot indicator without a count. `ShowZero="true"` displays the badge when Count is 0.
### QuantityStepper
Circular +/- quantity control. `DestructiveAtMin` replaces the minus button with a trash icon at the minimum value.
```razor
```
### SectionHeader
Title row with an optional "view all" chevron and separator line.
```razor
```
### ScreenTransition
Animated wrapper for multi-screen navigation. Changing `Key` triggers the entrance animation.
```razor
@* current screen content *@
```
`ScreenTransitionDirection` enum: `None` (no animation) | `Tab` (fade-in) | `Push` (slide from right) | `Pop` (slide from left)
---
## New in 3.9 -- Component Enhancements
- **Carousel:** `DotsPosition` (`CarouselDotsPosition`: Bottom/Top/Left/Right, default Bottom). Drag-click suppression prevents accidental navigation.
- **Drawer:** `DrawerContent` gains `SnapPoints` (float[]?), `SnapIndex` (@bind, int), `ShowHandle` (bool). Bottom direction only.
- **Select:** `Presentation` (`SelectPresentation`: Popover/BottomSheet) -- BottomSheet opens options in a bottom Drawer.
- **Separator:** `LineStyle` (`SeparatorStyle`: Solid/Dashed/Dotted, default Solid).
- **ToggleGroup:** `Scrollable` (bool, false -- horizontal scroll strip), `Required` (bool, false -- prevents deselecting the active item).
- **BadgeIcon:** New sub-component -- renders an icon inside a Badge chip.
```razor
```
- **ScrollArea:** Non-horizontal instances no longer force `width:100%` on the inner container.
---
## New in 4.0 -- AppProvider + Theme v2
### AppProvider
Required wrapper in `MainLayout.razor` (v4.0.0+). Initializes ThemeService, restores the persisted theme from localStorage, and broadcasts the active `StyleVariant` as a CascadingValue to all child components.
```razor
@* MainLayout.razor *@
@Body
```
Theme v2 adds 6 new dimensions on top of base/primary colors: **StyleVariant** (visual style preset), **RadiusPreset** (named radius override), **FontPreset** (font pairing), **MenuColor** (floating surface treatment), **MenuAccent** (hover intensity), and **ThemePreset** (bundles all 8 dimensions). BaseColor expands to 10 values (5 new chromatic neutrals). See `theming.txt` for the complete reference.