Welcome to Lumeo.
Core package (~568 KB). Add satellite packages for Charts, DataGrid, Editor, Scheduler, or Gantt as needed.
What Lumeo is
Lumeo is a Blazor component library inspired by shadcn/ui, bringing the same philosophy of beautifully designed, accessible, and composable components to the .NET ecosystem. Built on top of Tailwind CSS v4 and targeting .NET 10, Lumeo gives you a complete set of UI primitives that you own and control — no black-box overrides, no style collisions.
Every component is designed with accessibility and developer experience in mind. Components are fully themeable via CSS variables, work seamlessly in both light and dark mode, and expose a consistent parameter API so you can drop them into any Blazor Server or WebAssembly project.
Design philosophy
Lumeo follows shadcn/ui's naming style rather than the prefixed approach you see in MudBlazor
(<MudCard>) or Ant Design Blazor
(<AntCard>). Components are unprefixed —
<Card>,
<Dialog>,
<Button> — and the library uses C#'s
@namespace Lumeo plus a global using to keep markup clean.
This reads like native HTML, matches the shadcn aesthetic the library is inspired by, and keeps your
.razor files scannable. If a BCL type
collides (e.g. Text,
Link) you can always fully qualify with
Lumeo.Text — the same pattern you'll see throughout these docs.
Slot naming — the Content suffix
Because names are unprefixed, a RenderFragment
slot named Icon would shadow the
<Icon> component inside its own body. The convention
is simple: when a slot name would collide with a component name,
suffix the slot with Content.
Starting in v1.6.0, Icon and
Label slots have been renamed to
IconContent and
LabelContent across ten components:
Alert,
Badge,
EmptyState,
Rating,
Result,
Segmented,
SidebarMenuButton,
StepsItem,
TabsTrigger, and
TimelineItem. The old names remain as
[Obsolete] aliases — existing code keeps working with
a compile-time warning, and the aliases are removed in 2.0.
Naming tip
Other slot names don't collide and stay as-is —ChildContent,
HeaderContent,
EmptyContent,
LoadingTemplate,
TriggerContent,
ToolbarContent,
Actions,
Extra,
Leading,
Trailing,
Prefix,
Suffix,
LeftIcon, and
RightIcon.
Installation
Install the NuGet package into your Blazor project:
Add the packages
Lumeo 2.0 follows the DevExpress / Telerik / Microsoft.Extensions model: a small core package plus opt-in satellites for heavy components. The core stays at ~568 KB instead of ~918 KB — you only pay for what you use.
# Core — always required (~110 components) $ dotnet add package Lumeo # Add satellites only for what you use: $ dotnet add package Lumeo.Charts # Chart and 30+ subtypes $ dotnet add package Lumeo.DataGrid # DataGrid, DataTable, Filter $ dotnet add package Lumeo.Editor # RichTextEditor $ dotnet add package Lumeo.Scheduler # Scheduler $ dotnet add package Lumeo.Gantt # Gantt
Or reference them directly in your .csproj.
All packages share one version (lockstep) — always upgrade them together:
Since v3.7.0: the DataGrid's Excel/PDF export backend (ClosedXML + QuestPDF,
~1.65 MB brotli) lives in a separate assembly bundled inside Lumeo.DataGrid.
On Blazor WebAssembly you can opt-in to lazy-load it — see the
setup guide.
No extra package, same install command.
<ItemGroup> <PackageReference Include="Lumeo" Version="3.12.1" /> <!-- add only the satellites you need: --> <PackageReference Include="Lumeo.Charts" Version="3.12.1" /> <PackageReference Include="Lumeo.DataGrid" Version="3.12.1" /> <PackageReference Include="Lumeo.Editor" Version="3.12.1" /> <PackageReference Include="Lumeo.Scheduler" Version="3.12.1" /> <PackageReference Include="Lumeo.Gantt" Version="3.12.1" /> <PackageReference Include="Lumeo.Motion" Version="3.12.1" /> <PackageReference Include="Lumeo.PdfViewer" Version="3.12.1" /> <PackageReference Include="Lumeo.Maps" Version="3.12.1" /> <PackageReference Include="Lumeo.CodeEditor" Version="3.12.1" /> </ItemGroup>
No extra namespace imports needed
@using Lumeo already covers satellite components — no extra
@using directives are required. The
lumeo add <component> CLI also detects which satellite a component belongs to
and prompts to install it if it isn't referenced yet.
Register services
In your Program.cs, register the Lumeo services.
This registers ToastService,
OverlayService,
ThemeService,
KeyboardShortcutService, and
ComponentInteropService:
builder.Services.AddLumeo();Add global using
Add the namespace to your _Imports.razor so components are available everywhere:
@using Lumeo @using Lumeo.Services
Add providers to your layout
Add <ToastProvider /> and
<OverlayProvider /> to your
MainLayout.razor so toast notifications and programmatic overlays work:
<div class="min-h-screen"> @Body <ToastProvider /> <OverlayProvider /> </div>
Include styles and scripts
Add the following to your
index.html (WebAssembly) or
App.razor/_Host.cshtml (Server). Since
v1.3.0
the package ships a pre-compiled Tailwind utility stylesheet, so no local Tailwind build is required:
<!-- Design tokens: CSS variables + keyframes --> <link rel="stylesheet" href="_content/Lumeo/css/lumeo.css" /> <!-- Pre-compiled Tailwind utilities used by Lumeo components --> <link rel="stylesheet" href="_content/Lumeo/css/lumeo-utilities.css" /> <!-- Theme bootstrap (prevents flash of unstyled content) --> <script src="_content/Lumeo/js/theme.js"></script> <!-- Component interop (loaded on demand) --> <script src="_content/Lumeo/js/components.js" type="module"></script>
Using Tailwind in your own markup?
If you want to write utility classes yourself, keep your Tailwind v4 build and droplumeo-utilities.css —
your own build will emit every utility Lumeo needs plus anything you use on top. See the
README
for the @theme / @source snippet.
(Optional) Configure localization
Built-in English and German translations ship in v1.2.0+. Select a culture via the standard ASP.NET
request-localization middleware, or override specific strings during
AddLumeo:
builder.Services.AddLumeo(opts => { opts.Add("de", "DataGrid.NoData", "Keine Datensätze"); opts.AddMany("fr", new Dictionary<string, string> { ["DataGrid.NoData"] = "Aucune donnée", ["Pagination.Previous"] = "Précédent", }); });
Usage
Once installed, you can start using components directly in your .razor files.
Here is a simple example using the Button component:
<!-- Default button --> <Button>Click me</Button> <!-- Variant and size --> <Button Variant="Button.ButtonVariant.Outline" Size="Button.ButtonSize.Sm"> Save changes </Button> <!-- With click handler --> <Button OnClick="HandleClick">Submit</Button>
Every component accepts Class and AdditionalAttributes
Pass extra Tailwind classes withClass and any remaining
HTML attributes are forwarded to the root element via
AdditionalAttributes.
Theming
Lumeo uses CSS custom properties (variables) for all colors and design tokens. There are no hardcoded hex values or raw HSL colors anywhere in the component library. This means:
-
Dark mode works automatically via variable swaps — no
dark:Tailwind prefixes needed. - You can swap the entire palette by overriding a handful of CSS variables in your own stylesheet.
- Multiple built-in themes are available out of the box.
Open the customizer panel in the top-right of any
docs page (the icon, or press Ctrl + B) to preview every built-in theme against the live page and copy the matching lumeo apply --preset command.
Services
Lumeo ships with 5 scoped services that handle common app concerns. All are registered by
builder.Services.AddLumeo() and can be injected anywhere with
@inject.
ToastService
Show, dismiss, and update toast notifications from C# code. Supports variants (success, error, warning, info), action buttons, persistent toasts, and async promise toasts.
View docs →OverlayService
Open dialogs, sheets, drawers, and alert dialogs programmatically from code. Await results with
ShowDialogAsync<T>().
ThemeService
Switch between light/dark/system mode, change color schemes at runtime, and listen for theme changes with events.
View docs →KeyboardShortcutService
Register global keyboard shortcuts like ctrl+k or
ctrl+shift+p from C# code. Auto-cleanup with IDisposable handles.
ComponentInteropService
Low-level JS interop helpers used by components: scroll locking, focus traps, click-outside detection, clipboard, element positioning, and more. Useful for building custom components.
View docs →Components
Lumeo ships with 75+ components organized into nine categories:
Form
Button, Cascader, Checkbox, Color Picker, Combobox, Date Picker, Date Time Picker, File Upload, Filter, Form, Input, Label, Mention, Number Input, OTP Input, Radio Group, Segmented, Select, Slider, Switch, Tag Input, Textarea, Time Picker, Toggle, Toggle Group.
Browse Form components →Layout
Accordion, Aspect Ratio, Calendar, Card, Carousel, Collapsible, Resizable, Scroll Area, Separator, Tabs.
Browse Layout components →Feedback
Alert, Badge, Empty State, Progress, Result, Skeleton, Spinner, Toast.
Browse Feedback components →Overlay
Alert Dialog, Command, Context Menu, Dialog, Drawer, Dropdown Menu, Hover Card, Popover, Sheet, Tooltip, Tour.
Browse Overlay components →Navigation
Breadcrumb, Menubar, Navigation Menu, Pagination, Sidebar, Steps.
Browse Navigation components →Data Display
Avatar, Chart, Data Grid, Data Table, Descriptions, Image, Rating, Statistic, Table, Timeline.
Browse Data Display components →Utility
Affix, Back To Top, Kbd, Scrollspy, Transfer, Tree View, Watermark.
Browse Utility components →You're ready to build.
Services registered, stylesheets linked, providers mounted. Time to start composing.