NeoUI.Blazor.Primitives
3.3.0
dotnet add package NeoUI.Blazor.Primitives --version 3.3.0
NuGet\Install-Package NeoUI.Blazor.Primitives -Version 3.3.0
<PackageReference Include="NeoUI.Blazor.Primitives" Version="3.3.0" />
<PackageVersion Include="NeoUI.Blazor.Primitives" Version="3.3.0" />
<PackageReference Include="NeoUI.Blazor.Primitives" />
paket add NeoUI.Blazor.Primitives --version 3.3.0
#r "nuget: NeoUI.Blazor.Primitives, 3.3.0"
#:package NeoUI.Blazor.Primitives@3.3.0
#addin nuget:?package=NeoUI.Blazor.Primitives&version=3.3.0
#tool nuget:?package=NeoUI.Blazor.Primitives&version=3.3.0
NeoUI.Blazor.Primitives
Headless, unstyled Blazor primitive components with full accessibility support. Build your own component library using these composable primitives.
✨ Features
- 🎭 Headless & Unstyled: Complete control over styling - primitives provide behavior, accessibility, and state management without imposing any visual design
- ♿ Accessibility First: Built-in ARIA attributes, keyboard navigation, and screen reader support following WCAG 2.1 AA standards
- 🧩 Composition-Based: Flexible component composition patterns for building complex UIs
- 🎯 .NET 10 Ready: Built for the latest .NET platform with full WebAssembly and Server support
- 🔒 Type-Safe: Full C# type safety with IntelliSense support
- 🔄 State Management: Built-in controlled and uncontrolled state patterns
- ⌨️ Keyboard Navigation: Full keyboard support for all interactive components
- 📦 Zero Dependencies: No CSS or JavaScript required - bring your own styling
📦 Installation
dotnet add package NeoUI.Blazor.Primitives
🚀 Quick Start
Try the Live Demo - Explore all primitives and styled components with interactive examples and full documentation.
📚 Available Primitives
- Accordion: Collapsible content sections with single or multiple item expansion
- Checkbox: Binary selection control with indeterminate state
- Collapsible: Expandable content area with trigger control
- Dialog: Modal dialogs with backdrop and focus management
- Dropdown Menu: Context menus with items, separators, and keyboard shortcuts
- Hover Card: Rich preview cards on hover with delay control
- Label: Accessible labels for form controls with automatic association
- Popover: Floating panels for additional content with positioning
- Radio Group: Mutually exclusive options with keyboard navigation
- Select: Dropdown selection with groups and virtualization support
- Sheet: Side panels that slide in from viewport edges
- Switch: Toggle control for on/off states
- Table: Data table with header, body, rows, cells, and pagination
- Tabs: Tabbed interface with keyboard navigation
- Tooltip: Brief informational popups with hover/focus triggers
🎨 Pre-Styled Components (75+)
Built on top of these primitives, NeoUI.Blazor provides production-ready components with beautiful shadcn/ui design:
Form & Input Components
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
Data Display Components
Avatar, Badge, Card, Data Table, Empty, Grid, Item, Kbd, Progress, Separator, Skeleton, Spinner, Typography
Navigation Components
Accordion, Breadcrumb, Command, Context Menu, Dropdown Menu, Menubar, Navigation Menu, Pagination, Sidebar, Tabs
Overlay Components
Alert Dialog, Dialog, Hover Card, Popover, Sheet, Toast, Tooltip
Feedback Components
Alert
Layout & Display Components
Aspect Ratio, Carousel, Collapsible, Resizable, Scroll Area
Advanced Components
Chart (8 types), Grid, Markdown Editor, Motion (20+ animation presets), Rich Text Editor, Toggle, Toggle Group
Icon Libraries
Lucide Icons (1,640+), Heroicons (1,288), Feather Icons (286)
Want beautiful defaults? Check out the Components README for full documentation.
📖 Primitive API Reference
Accordion
<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 |
Tabs
<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) |
Sheet
<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 |
Popover
<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 |
Tooltip
<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 |
HoverCard
<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 |
Checkbox
<CheckboxPrimitive
@bind-Checked="isChecked"
Indeterminate="@isIndeterminate"
IndeterminateChanged="HandleIndeterminateChange" />
| Parameter | Type | Default | Description |
|---|---|---|---|
Checked |
bool |
false |
Checked state |
Indeterminate |
bool |
false |
Shows partial/mixed state |
Select
<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
<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 |
MultiSelect
<MultiSelect TItem="string" @bind-SelectedItems="selected" Items="options">
<MultiSelectTrigger>
<MultiSelectInput Placeholder="Select items..." />
</MultiSelectTrigger>
<MultiSelectContent>
<MultiSelectSelectAll>Select All</MultiSelectSelectAll>
@foreach (var item in options)
{
<MultiSelectItem Value="item">@item</MultiSelectItem>
}
</MultiSelectContent>
</MultiSelect>
| Parameter | Type | Description |
|---|---|---|
SelectAllState |
SelectAllState |
None, Indeterminate, All |
🚀 Usage Example
@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>
🔄 Controlled vs Uncontrolled
All stateful primitives support both controlled and uncontrolled modes:
Uncontrolled (Component manages its own state)
<DialogPrimitive>
<DialogTriggerPrimitive>Open</DialogTriggerPrimitive>
<DialogPortal>
<DialogOverlay />
<DialogContentPrimitive>
</DialogContentPrimitive>
</DialogPortal>
</DialogPrimitive>
Controlled (Parent component manages state)
<DialogPrimitive @bind-Open="isDialogOpen">
<DialogTriggerPrimitive>Open</DialogTriggerPrimitive>
<DialogPortal>
<DialogOverlay />
<DialogContentPrimitive>
<button @onclick="() => isDialogOpen = false">Close</button>
</DialogContentPrimitive>
</DialogPortal>
</DialogPrimitive>
@code {
private bool isDialogOpen = false;
}
🏗️ Design Philosophy
NeoUI.Blazor.Primitives follows the "headless component" pattern popularized by Radix UI and Headless UI:
- Separation of Concerns: Primitives handle behavior and accessibility; you handle the design
- Composability: Build complex components by composing simple primitives
- No Style Opinions: Zero CSS included - bring your own design system
- Accessibility by Default: ARIA attributes and keyboard navigation built-in
🎯 When to Use
Use NeoUI.Blazor.Primitives when:
- Building a custom design system from scratch
- Need complete control over component styling
- Want to match a specific brand or design language
- Integrating with existing CSS frameworks or design tokens
Consider NeoUI.Blazor when:
- Want beautiful defaults with shadcn/ui design
- Prefer zero-configuration setup with pre-built CSS
- Need to ship quickly without custom styling
📖 Documentation
For full documentation, examples, and API reference, visit:
- Live Demo - Interactive examples and documentation
- GitHub Repository
📄 License
MIT License - see LICENSE file for details
🤝 Contributing
Contributions are welcome! Please feel free to submit a Pull Request.
🙏 Acknowledgments
- Initial Blazor primitives inspiration by Mathew Taylor
- Design patterns inspired by Radix UI and Headless UI
- Built with ❤️ for the Blazor community
📊 Version Information
- Current Version: 1.0.14
- Target Framework: .NET 10
- Package ID: NeoUI.Blazor.Primitives
- Assembly Name: NeoUI.Blazor.Primitives
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net10.0
- Microsoft.AspNetCore.Components.Web (>= 10.0.0)
NuGet packages (1)
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. |
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 3.3.0 | 0 | 3/5/2026 |
| 3.2.0 | 101 | 3/2/2026 |
| 3.0.0 | 114 | 2/28/2026 |
| 3.0.0-rc.1 | 66 | 2/25/2026 |