![]() |
VOOZH | about |
dotnet add package NeoUI.Blazor.Primitives --version 4.0.5
NuGet\Install-Package NeoUI.Blazor.Primitives -Version 4.0.5
<PackageReference Include="NeoUI.Blazor.Primitives" Version="4.0.5" />
<PackageVersion Include="NeoUI.Blazor.Primitives" Version="4.0.5" />Directory.Packages.props
<PackageReference Include="NeoUI.Blazor.Primitives" />Project file
paket add NeoUI.Blazor.Primitives --version 4.0.5
#r "nuget: NeoUI.Blazor.Primitives, 4.0.5"
#:package NeoUI.Blazor.Primitives@4.0.5
#addin nuget:?package=NeoUI.Blazor.Primitives&version=4.0.5Install as a Cake Addin
#tool nuget:?package=NeoUI.Blazor.Primitives&version=4.0.5Install as a Cake Tool
Headless, unstyled Blazor primitive components with full accessibility support. Build your own component library using these composable primitives.
dotnet add package NeoUI.Blazor.Primitives
Try the Live Demo - Explore all primitives and styled components with interactive examples and full documentation.
Built on top of these primitives, NeoUI.Blazor provides production-ready components with beautiful shadcn/ui design:
Button, Button Group, Checkbox, Combobox, Date Picker, Field, Input, Input Group, Input OTP, Label, Multi Select, Native Select, Radio Group, Select, Slider, Switch, Textarea, Time Picker
Avatar, Badge, Card, Data Table, Empty, Grid, Item, Kbd, Progress, Separator, Skeleton, Spinner, Typography
Accordion, Breadcrumb, Command, Context Menu, Dropdown Menu, Menubar, Navigation Menu, Pagination, Selection Indicator, Sidebar, Tabs
Alert Dialog, Dialog, Hover Card, Popover, Sheet, Toast, Tooltip
Alert
Aspect Ratio, Carousel, Collapsible, Resizable, Scroll Area, Selection Indicator, Sortable
Chart (12 types), Grid, Markdown Editor, Motion (20+ animation presets), Rich Text Editor, Toggle, Toggle Group
Lucide Icons (1,640+), Heroicons (1,288), Feather Icons (286)
Want beautiful defaults? Check out the for full documentation.
<AccordionPrimitive Type="AccordionType.Single" Collapsible="true" DefaultValue="item-1">
<AccordionItemPrimitive Value="item-1">
<AccordionTriggerPrimitive>Section 1</AccordionTriggerPrimitive>
<AccordionContentPrimitive>Content 1</AccordionContentPrimitive>
</AccordionItemPrimitive>
</AccordionPrimitive>
| Parameter | Type | Default | Values |
|---|---|---|---|
Type |
AccordionType |
Single |
Single (one item open), Multiple (many items open) |
Collapsible |
bool |
false |
When Single, allows closing all items |
<TabsPrimitive
DefaultValue="tab1"
Orientation="TabsOrientation.Horizontal"
ActivationMode="TabsActivationMode.Automatic">
<TabsListPrimitive>
<TabsTriggerPrimitive Value="tab1">Tab 1</TabsTriggerPrimitive>
</TabsListPrimitive>
<TabsContentPrimitive Value="tab1">Content</TabsContentPrimitive>
</TabsPrimitive>
| Parameter | Type | Default | Values |
|---|---|---|---|
Orientation |
TabsOrientation |
Horizontal |
Horizontal, Vertical |
ActivationMode |
TabsActivationMode |
Automatic |
Automatic (on focus), Manual (on click) |
<SheetPrimitive>
<SheetTriggerPrimitive>Open</SheetTriggerPrimitive>
<SheetPortal>
<SheetOverlay />
<SheetContentPrimitive Side="SheetSide.Right">
<SheetTitlePrimitive>Title</SheetTitlePrimitive>
<SheetDescriptionPrimitive>Description</SheetDescriptionPrimitive>
<SheetClosePrimitive>Close</SheetClosePrimitive>
</SheetContentPrimitive>
</SheetPortal>
</SheetPrimitive>
| Parameter | Type | Default | Values |
|---|---|---|---|
Side |
SheetSide |
Right |
Top, Right, Bottom, Left |
<PopoverPrimitive>
<PopoverTriggerPrimitive>Open</PopoverTriggerPrimitive>
<PopoverContentPrimitive Side="PopoverSide.Bottom" Align="PopoverAlign.Center">
Content here
</PopoverContentPrimitive>
</PopoverPrimitive>
| Parameter | Type | Default | Values |
|---|---|---|---|
Side |
PopoverSide |
Bottom |
Top, Right, Bottom, Left |
Align |
PopoverAlign |
Center |
Start, Center, End |
CloseOnEscape |
bool |
true |
Close when Escape key pressed |
CloseOnClickOutside |
bool |
true |
Close when clicking outside |
<TooltipPrimitive DelayDuration="400" HideDelay="0">
<TooltipTriggerPrimitive>Hover me</TooltipTriggerPrimitive>
<TooltipContentPrimitive>Tooltip text</TooltipContentPrimitive>
</TooltipPrimitive>
| Parameter | Type | Default | Description |
|---|---|---|---|
DelayDuration |
int |
400 |
Milliseconds before showing |
HideDelay |
int |
0 |
Milliseconds before hiding |
<HoverCardPrimitive OpenDelay="700" CloseDelay="300">
<HoverCardTriggerPrimitive>Hover for preview</HoverCardTriggerPrimitive>
<HoverCardContentPrimitive>Rich preview content</HoverCardContentPrimitive>
</HoverCardPrimitive>
| Parameter | Type | Default | Description |
|---|---|---|---|
OpenDelay |
int |
700 |
Milliseconds before showing |
CloseDelay |
int |
300 |
Milliseconds before hiding |
<CheckboxPrimitive
@bind-Checked="isChecked"
Indeterminate="@isIndeterminate"
IndeterminateChanged="HandleIndeterminateChange" />
| Parameter | Type | Default | Description |
|---|---|---|---|
Checked |
bool |
false |
Checked state |
Indeterminate |
bool |
false |
Shows partial/mixed state |
<SelectPrimitive TValue="string" @bind-Value="selected" @bind-Open="isOpen">
<SelectTriggerPrimitive>
Choose an option...
</SelectTriggerPrimitive>
<SelectContentPrimitive>
<SelectItemPrimitive Value="@("a")">Option A</SelectItemPrimitive>
<SelectItemPrimitive Value="@("b")">Option B</SelectItemPrimitive>
</SelectContentPrimitive>
</SelectPrimitive>
Select is generic (TValue). Supports both value and open state binding.
<Table TData="Person">
<TableHeader>
<TableRow>
<TableHeaderCell>Name</TableHeaderCell>
<TableHeaderCell>Email</TableHeaderCell>
</TableRow>
</TableHeader>
<TableBody>
@foreach (var person in people)
{
<TableRow>
<TableCell>@person.Name</TableCell>
<TableCell>@person.Email</TableCell>
</TableRow>
}
</TableBody>
</Table>
| Parameter | Type | Default | Values |
|---|---|---|---|
SelectionMode |
SelectionMode |
None |
None, Single, Multiple |
SortDirection |
SortDirection |
None |
None, Ascending, Descending |
<SortablePrimitive TItem="MyItem"
Items="@items"
OnItemsReordered="@(r => items = r)"
GetItemId="@(i => i.Id)">
<SortableContentPrimitive class="flex flex-col gap-2">
@foreach (var item in items)
{
<SortableItemPrimitive @key="@item.Id" Value="@item.Id"
class="flex items-center gap-3 rounded border px-4 py-3">
<SortableItemHandlePrimitive class="cursor-grab" />
<span>@item.Name</span>
</SortableItemPrimitive>
}
</SortableContentPrimitive>
<SortableOverlayPrimitive class="rounded border shadow-lg px-4 py-3" />
</SortablePrimitive>
Cross-list transfer — share a Group name across multiple SortablePrimitive instances. Consumer handles all state mutations via transfer events.
<SortablePrimitive TItem="MyItem" Items="@colA" Group="board"
GetItemId="@(i => i.Id)"
OnItemsReordered="@(r => colA = r)"
OnItemTransferredOut="@(a => colA = colA.Where(i => i.Id != a.ActiveId).ToList())"
OnItemTransferredIn="@(a => { var item = FindItem(a.ActiveId); colA.Insert(a.Index, item); })">
...
</SortablePrimitive>
SortablePrimitive<TItem> parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
Items |
IList<TItem> |
required | Source list |
GetItemId |
Func<TItem, string> |
required | Extracts unique string ID from each item |
Orientation |
SortableOrientation |
Vertical |
Vertical, Horizontal, Grid, Mixed |
Group |
string? |
null |
Shared group name for cross-list DnD. Instances with the same group accept drops from each other. |
OnItemsReordered |
EventCallback<IList<TItem>> |
— | Fired after a same-list reorder. Receives the reordered list. |
OnItemTransferredIn |
EventCallback<SortableTransferArgs> |
— | Fired on the target when an item arrives from a peer. Consumer inserts the item at args.Index. |
OnItemTransferredOut |
EventCallback<SortableTransferArgs> |
— | Fired on the source after the target accepts. Consumer removes args.ActiveId from its list. |
OnCanDrop |
Func<SortableDragQueryArgs, bool>? |
null |
Drop-time guard. Return false to reject; transfer events are not fired. |
OnDragStart |
EventCallback<string> |
— | Fired when a drag begins. Receives the active item ID. |
OnDragEnd |
EventCallback<SortableDragEndArgs> |
— | Fired when a same-list drag ends. |
OnDragCancel |
EventCallback |
— | Fired on Escape or pointer cancel. |
SortableScope<TItem> — exposed via Context="s" on <SortablePrimitive> or <Sortable>.
| Member | Type | Description |
|---|---|---|
RowAttributes |
Func<TItem, Dictionary<string, object>> |
Stamps data-sortable-id on each row. Pass to AdditionalRowAttributes on any table or grid. |
ActiveId |
string? |
ID of the item currently being dragged, or null. |
IsDragging |
bool |
true while a drag is in progress. |
IsItemDragging(TItem) |
bool |
true when the given item is the active drag item. |
SortableItemPrimitive parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
Value |
string |
required | Item ID matching GetItemId output. Add @key="@item.Id" on the element — required for cross-list. |
AsHandle |
bool |
false |
Makes the entire item draggable (no separate handle needed) |
SortableOverlayPrimitive parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
ChildContent |
RenderFragment<string>? |
null |
Custom ghost. Context is the active item ID. Defaults to a JS clone of the source element. |
Note:
MultiSelectis a fully styled component with no separate primitive — use<MultiSelect>directly fromNeoUI.Blazor.
@using NeoUI.Blazor.Primitives
<DialogPrimitive>
<DialogTriggerPrimitive class="my-custom-button-class">
Open Dialog
</DialogTriggerPrimitive>
<DialogPortal>
<DialogOverlay class="my-overlay-styles" />
<DialogContentPrimitive class="my-custom-dialog-styles">
<DialogTitlePrimitive class="my-title-styles">
Custom Styled Dialog
</DialogTitlePrimitive>
<DialogDescriptionPrimitive class="my-description-styles">
This is a fully customizable dialog.
</DialogDescriptionPrimitive>
<p class="my-content-styles">Your content here</p>
<DialogClosePrimitive class="my-close-button">Close</DialogClosePrimitive>
</DialogContentPrimitive>
</DialogPortal>
</DialogPrimitive>
All stateful primitives support both controlled and uncontrolled modes:
<DialogPrimitive>
<DialogTriggerPrimitive>Open</DialogTriggerPrimitive>
<DialogPortal>
<DialogOverlay />
<DialogContentPrimitive>
</DialogContentPrimitive>
</DialogPortal>
</DialogPrimitive>
<DialogPrimitive @bind-Open="isDialogOpen">
<DialogTriggerPrimitive>Open</DialogTriggerPrimitive>
<DialogPortal>
<DialogOverlay />
<DialogContentPrimitive>
<button @onclick="() => isDialogOpen = false">Close</button>
</DialogContentPrimitive>
</DialogPortal>
</DialogPrimitive>
@code {
private bool isDialogOpen = false;
}
NeoUI.Blazor.Primitives follows the "headless component" pattern popularized by Radix UI and Headless UI:
Use NeoUI.Blazor.Primitives when:
Consider NeoUI.Blazor when:
For full documentation, examples, and API reference, visit:
MIT License - see LICENSE file for details
Contributions are welcome! Please feel free to submit a Pull Request.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net10.0 net10.0 is compatible. net10.0-android net10.0-android was computed. net10.0-browser net10.0-browser was computed. net10.0-ios net10.0-ios was computed. net10.0-maccatalyst net10.0-maccatalyst was computed. net10.0-macos net10.0-macos was computed. net10.0-tvos net10.0-tvos was computed. net10.0-windows net10.0-windows was computed. |
Showing the top 1 NuGet packages that depend on NeoUI.Blazor.Primitives:
| Package | Downloads |
|---|---|
|
NeoUI.Blazor
Over 75+ pre-styled Blazor components built with shadcn/ui design and Tailwind CSS with full .NET 10 support. Beautiful defaults that you can customize to match your brand. |
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 4.0.5 | 196 | 5/11/2026 |
| 4.0.2 | 1,463 | 5/5/2026 |
| 4.0.1 | 283 | 4/7/2026 |
| 4.0.0 | 115 | 4/7/2026 |
| 3.9.0 | 130 | 4/3/2026 |
| 3.8.3 | 282 | 3/30/2026 |
| 3.8.2 | 126 | 3/30/2026 |
| 3.8.1 | 149 | 3/28/2026 |
| 3.8.0 | 214 | 3/28/2026 |
| 3.7.2 | 110 | 3/26/2026 |
| 3.6.6 | 267 | 3/20/2026 |
| 3.6.4 | 133 | 3/19/2026 |
| 3.6.3 | 126 | 3/18/2026 |
| 3.6.2 | 128 | 3/17/2026 |
| 3.6.0 | 155 | 3/14/2026 |
| 3.4.0 | 141 | 3/11/2026 |
| 3.3.3 | 142 | 3/9/2026 |
| 3.3.2 | 124 | 3/9/2026 |
| 3.3.0 | 141 | 3/5/2026 |
| 3.2.0 | 141 | 3/2/2026 |