The third 0.4 prerelease. A component's
Classnow overrides its own classes, dialogs and sheets keep keyboard focus inside,addnever downgrades your NuGet packages, and the CLI templates have been brought in line with the NuGet package, fixing several template bugs on the way. It also adds Razor class library support. It is a prerelease, so installs need--version. Report issues via GitHub Issues.
Classoverrides a component's own classes.Shell.Cnused to join strings, so<Card Class="max-w-lg">on a component that setsmax-w-mdput both on the element and the stylesheet decided. Now, when two classes set the same CSS property under the same variants, the later one (yours) wins, like tailwind-merge:p-4replaces an earlierpx-2, text colour and text size stay separate, and unknown classes are kept. You no longer need the!modifier. The NuGet package and the CLI'sShell.csshare the same code.- Focus stays inside open overlays.
Dialog,AlertDialog,SheetandDrawerkeep Tab and Shift+Tab inside while they're open, and return focus to where it was when they close. The legacy (non-compositional)SheetandDrawerpanels now also take focus and close on Escape. addnever downgrades a NuGet package. It used to set the exact version a component pins, so addingchartto an app on Blazor-ApexCharts 7 moved it back to 6.0.2. Now it reads the project'sPackageReference(orDirectory.Packages.props), adds a missing package or raises an older one, and leaves the same or newer, floating versions and ranges alone.- Razor class libraries.
initrecognises a library shared by several apps and prints what each app needs, with the library's_contentpath, and adds its@usingto a root_Imports.razor. Using ShellUI from a Razor class library has the full setup for Blazor Web App and MAUI Blazor Hybrid hosts.
The CLI templates and the NuGet package had drifted apart. They're reconciled (210 of 217 components identical, the rest differ by design), and a test now compares them. Bugs this fixed:
RadioGroup(template): clicking an item did nothing, because the group never passed itself to its items.RadioGroupItemalso gainsDisabled.ScrollArea(template): long content was clipped instead of scrolling.HeightandMaxHeightnow size the scrolling element.DatePicker(package): day 1 was always drawn under Sunday. It now sits under its real weekday, and the picker opens on the selected month.TimePicker:Stepnow filters the minutes (it was ignored), the picker opens on the current value, and Cancel or an outside click closes it.DateRangePicker(template) closes on an outside click;EmptyState(template) appliesClass.SheetandDrawer: clicks inside the panel no longer reach parent click handlers; the close button shows when onlyDescriptionis set; the templates switch to compositional mode by themselves (noCompositional="true"needed).LabelrendersForas theforattribute;FileUploaduses an inline SVG icon instead of the Material Symbols font;CarouselItemhandles zero slides.Paginationsupports@bind-CurrentPagein both copies and ignores clicks on the current page;Toasthas success and warning variants,Position, auto-dismiss afterDuration(0 keeps it open) and a labelled close button;SkeletonhasVariant(default,circle,text);NavigationMenuItemis a dropdown whenTitleis set and a link or button otherwise.Table,Separator,Slider,Navbar,Checkbox,Switch,Tooltip,SidebarMenuButton,MenubarandThemeToggletemplates now match the package's markup and classes.
- Input variants moved out of the component:
Input.InputVariant.Erroris nowInputVariant.Error, from the newinput-variantstemplate inComponents/UI/Variants(likeButtonVariant).TextareagainsVariant,ReadOnly,OnFocusandOnBlurthroughtextarea-variants. - Stepper parts read the stepper's
ActiveStepinstead of taking aCurrentStepparameter, and the template gains the package's data-drivenStepItemsmode (StepItemcomes from the newstepper-modelstemplate). - ScrollArea drops its
scrollbar-*classes, which needed a Tailwind plugin nobody shipped. - Still working but deprecated:
Pagination.OnPageChange(use@bind-CurrentPage),DatePicker.SelectedDateandTimePicker.SelectedTime(useValue/@bind-Value).
shellui update installs the new input-variants, textarea-variants and stepper-models templates for you, and skips files you've changed since installing them.
- CLI: update the tool, then run
shellui update. Commit first so you can review the changes, and fix anyInput.InputVariantand StepperCurrentStepuses (see above). - NuGet package: update
ShellUI.Componentsto0.4.0-alpha.3. - If you used
Class="…!"to beat a component's own classes, you can drop the!.
# CLI (prerelease: the version is required)
dotnet tool install -g ShellUI.CLI --version 0.4.0-alpha.3
# or upgrade an existing install
dotnet tool update -g ShellUI.CLI --version 0.4.0-alpha.3# NuGet package
dotnet add package ShellUI.Components --version 0.4.0-alpha.3Full Changelog: https://github.com/shellui-dev/shellui/compare/v0.4.0-alpha.2...v0.4.0-alpha.3
The second 0.4 prerelease. It fixes
shellui update, which could leave a project upgraded from 0.3 unable to build, and makesupdatekeep the files you changed. The Tailwind CLI is now downloaded once per machine instead of into every project, and the download survives slow connections. It also fixesremove, the dark theme and the packageTimePicker. It is a prerelease, so installs need--version. Report issues via GitHub Issues.
- Projects no longer hold the binary. The standalone Tailwind CLI (about 110 MB) is downloaded once into
~/.shellui/bin(orSHELLUI_CACHE_DIR), andinitand the build run it from there. A new project went from about 112 MB to 130 KB, and later projects set up offline. A copy in a project's.shellui/binstill takes precedence. The binary is a build tool and never shipped with your app. - Nothing in
.shellui/is committed: it now contains a.gitignoreof*. - Slow connections work. The download streams to a
.partialfile, resumes after a dropped connection, retries, and only gives up after a minute with no data. Before,initgave up after five minutes and left the project uninitialised. The build's own download uses the same cache and retries too. - A failed download no longer stops
init. It finishes the rest of the setup and warns, and the next build tries again; its warning names the URL and where to save the file.
updateinstalls new dependencies. Components gain parts between versions; in 0.4,breadcrumbgainedbreadcrumb-list,-link,-page,-separatorand-ellipsis, andtabsgainedtab-models.updateonly rewrote existing files, so a project updated from 0.3 failed to build (BreadcrumbList,TabItemnot found). It now installs missing dependencies the wayadddoes, with their NuGet packages and_Imports.razorusings.updatekeeps your changes.shellui.jsonnow records a hash of each file the CLI writes.updateskips files you have changed since and says so;--forceoverwrites them. Before,updatewith no names rewrote everything, includingapp-sidebarand the dashboard layouts that apps are meant to edit.removefinds files the way install writes them. It always looked inComponents/UI, so it ignored a customComponentsPath, could not remove dashboard or auth layouts, and reported every name as removed. It now removes layouts too, lists files that still use a removed layout (usuallyRoutes.razor), and counts what it removed.
- Dark theme: the browser drew its own controls (the
<input type="date">calendar, number spinners, scrollbars, autofill,<select>lists) light on a dark page. The themes now setcolor-scheme: in the themeinitandtheme applywrite, and in the package'sshellui-theme.cssandshellui-all.css. - NuGet package
TimePickerthrew aFormatExceptionwheneverValuewas set. It now shows the time. - NuGet package
shellui-theme.csslogged a 404 on every page that linked it directly, because it started with@import "tailwindcss";. The file now holds only the theme;shellui-all.cssis unchanged. - NuGet packages now have the ShellUI icon and show the logo at the top of their README.
- Everything fixed in 0.3.3 and 0.3.4 is included.
- CLI: update the tool, then run
shellui update. Files installed by alpha.1 have no recorded hash, so this first update keepsapp-sidebar,sidebar-accountand the dashboard and auth layouts if they differ from the template, and rewrites the other components. Commit first so you can review the changes. From then on, every file you edit is kept. - Tailwind CLI: the same
shellui updatereplacesBuild/ShellUI.targetsif you haven't edited it, adds.shellui/.gitignore, and deletes the project's copy of the Tailwind CLI when it's the same as the shared one, so the project switches to the shared CLI. An edited targets file is left alone with a note. - Existing
input.css:updatedoesn't rewrite it. Addcolor-scheme: light;inside:rootandcolor-scheme: dark;inside.dark, or runshellui theme applyagain if you use a tweakcn theme. - NuGet package: update
ShellUI.Componentsto0.4.0-alpha.2.
Upgrading from 0.3: see the 0.4.0-alpha.1 notes below, then the steps above.
# CLI (prerelease: the version is required)
dotnet tool install -g ShellUI.CLI --version 0.4.0-alpha.2
# or upgrade an existing install
dotnet tool update -g ShellUI.CLI --version 0.4.0-alpha.2# NuGet package
dotnet add package ShellUI.Components --version 0.4.0-alpha.2Full Changelog: https://github.com/shellui-dev/shellui/compare/v0.4.0-alpha.1...v0.4.0-alpha.2
A patch release that brings the 0.4 prerelease fixes to the stable line.
initno longer downloads the Tailwind CLI into every project,updatekeeps your changes,addnever downgrades a NuGet package, a component'sClassoverrides its own classes, overlays keep keyboard focus inside, and several component bugs are fixed. It also adds Razor class library support.
- One Tailwind CLI per machine.
initused to download the 112 MB Tailwind CLI into every project, hold it in memory and give up after five minutes, so on a slow connection it failed and left the project half set up. The CLI now lives once in~/.shellui/bin(setSHELLUI_CACHE_DIRto move it), andinitand the build both run it from there; a copy in a project's.shellui/binstill wins. Downloads resume after a dropped connection, retry, and only stop after 60 seconds without data. If the download fails,initfinishes everything else and the next build tries again..shellui/gets its own.gitignore, so the folder stays out of git. updatekeeps your changes.shellui.jsonnow records a hash of each file the CLI writes.updateskips files you've changed since and says so (--forceoverwrites them), and installs dependencies a component gained since you added it, the same wayadddoes. Files installed by an earlier CLI have no hash; for those,updatekeepsapp-sidebarand thedashboard-*layouts when they differ from the template.updatemoves existing projects onto the shared Tailwind CLI. It replaces aBuild/ShellUI.targetswritten by an earlier CLI (unless you edited it) and deletes the project's copy of the Tailwind CLI when it is identical to the shared one.removefinds whatinstallwrote. It always looked inComponents/UI, so it ignored a customComponentsPath, couldn't remove the dashboard layouts, and reported every name as removed. It now uses the install path, reports only what it removed, and lists files that still use a removed layout.addnever downgrades a NuGet package. It used to set the exact version a component pins, so addingchartto an app on Blazor-ApexCharts 7 moved it back to 6.0.2. Now it adds a missing package or raises an older one, and leaves the same or newer versions, floating versions and ranges alone (includingDirectory.Packages.props).- Razor class libraries.
initrecognises a library shared by several apps, prints what each app needs with the library's_contentpath, and adds its@usingto a root_Imports.razor. Using ShellUI from a Razor class library covers Blazor Web App and MAUI Blazor Hybrid hosts.
Classoverrides a component's own classes.Shell.Cnused to join strings, soClass="max-w-lg"on a component that setsmax-w-mdput both on the element and the stylesheet decided. Now, when two classes set the same CSS property under the same variants, the later one (yours) wins, like tailwind-merge:p-4replaces an earlierpx-2, text colour and text size stay separate, and unknown classes are kept. You no longer need the!modifier. Runshellui update shellto get it in a CLI project.- Focus stays inside open overlays.
Dialog,AlertDialog,SheetandDrawerkeep Tab and Shift+Tab inside while open and return focus to where it was when they close. The non-compositionalSheetandDrawerpanels now also take focus and close on Escape.
RadioGroup(template): clicking an item did nothing, because the group never passed itself to its items.RadioGroupItemalso gainsDisabled.ScrollArea: long content was clipped instead of scrolling.HeightandMaxHeightnow size the scrolling element. Thescrollbar-*classes, which needed a Tailwind plugin nobody shipped, are gone.DatePicker(package): day 1 was always drawn under Sunday. It now sits under its real weekday, and the picker opens on the selected month.TimePicker:Stepnow filters the minutes (it was ignored), the picker opens on the current value, and Cancel or an outside click closes it.DateRangePicker(template) closes on an outside click;EmptyState(template) appliesClassand extra attributes.SheetandDrawer: clicks inside the panel no longer reach parent click handlers, and theSheetclose button shows when onlyDescriptionis set.Label(package) rendersForas theforattribute;FileUpload(package) uses an inline SVG icon instead of the Material Symbols font;CarouselItem(template) handles zero slides.- Still working but deprecated:
DatePicker.SelectedDateandTimePicker.SelectedTime. UseValue/@bind-Value.
- CLI: update the tool, then run
shellui updatein each project. Commit first so you can review the changes. If the project still has a.shellui/bin/tailwindcssbinary afterwards, you can delete it: the next build downloads the shared copy. - NuGet package: update
ShellUI.Componentsto0.3.5. - If you used
Class="…!"to beat a component's own classes, you can drop the!.
dotnet tool install -g ShellUI.CLI --version 0.3.5
# or upgrade an existing install
dotnet tool update -g ShellUI.CLI --version 0.3.5dotnet add package ShellUI.Components --version 0.3.5Full Changelog: https://github.com/shellui-dev/shellui/compare/v0.3.4...v0.3.5
A patch release with a
TimePickerfix for theShellUI.ComponentsNuGet package and dark-theme fixes for both the package and the CLI.
- NuGet package:
TimePickerthrew aFormatExceptionwheneverValuewas set, because it formatted theTimeSpanwith a date pattern. It now shows the time, the same as the CLI template. - Dark theme: the browser kept drawing its own controls light on a dark page (the
<input type="date">calendar, number spinners, scrollbars, autofill and<select>lists). The themes now setcolor-schemetolightin:rootanddarkin.dark: inshellui-theme.cssandshellui-all.cssin the package, and in the themeshellui initandshellui theme applywrite.
A new test renders every package component that takes a value with a sample value set, so a component that only fails once it has a value fails CI.
- NuGet package: update to
0.3.4. - CLI: update the tool. Existing projects keep their
input.css: addcolor-scheme: light;inside:rootandcolor-scheme: dark;inside.dark, or runshellui theme applyagain if you use a tweakcn theme.
A patch release with fixes for both the
ShellUI.ComponentsNuGet package and the CLI templates.
- NuGet package: linking
shellui-theme.cssdirectly logged a 404 on every page load, because the file started with@import "tailwindcss";and the browser requestedtailwindcssas a URL. The theme file now holds only the theme; the precompiledshellui-all.cssis unchanged. CommandignoredCommandItem.Action: selecting an item only raisedCommandSelected. It now runs the item'sAction, then raisesCommandSelected, the same asCommandPalette.DropdownandPopovernow close on Escape.- CLI
SidebarProviderlogged aJSDisconnectedExceptiontwice on every full page reload, typed URL or closed tab. It now ignores the disconnected circuit when it cleans up.
New tests cover Command running Action and Escape closing Dropdown and Popover.
- NuGet package: update to
0.3.3. - CLI: update the tool, then run
shellui updateto rewrite installed components from the new templates.updateoverwrites the files, so commit or back up any components you customized first.
The first 0.4 prerelease. It adds 14 components, compositional parts for eight existing ones, dashboard and sign-in page blocks, and support for apps that use ASP.NET Core Identity. It is a prerelease, so installs need
--version. Report issues via GitHub Issues.
The CLI now has 93 direct targets, up from 76 in 0.3.
| Target | What it is |
|---|---|
kbd |
Keyboard key hint |
aspect-ratio |
Fixed-ratio container |
button-group |
Joined buttons, horizontal or vertical |
toggle-group |
Single- or multi-select toggles (@bind-Value / @bind-Values) |
input-group |
Input with Prefix / Suffix slots |
number-input |
−/+ input with min, max and step |
stat-card |
KPI tile with a trend badge |
timeline |
Vertical event timeline |
tree-view |
Expandable, selectable tree (@bind-SelectedValue) |
qr-code |
QR code rendered as SVG (adds the QRCoder package) |
image-viewer |
Thumbnail with a zoomable lightbox |
chat, chat-message, chat-input |
AI chat panel, message bubbles with a streaming indicator, and a prompt input (Enter sends, Shift+Enter adds a line) |
Eight more components can be built from parts, shadcn-style. Each mode is opt-in, so existing markup keeps working, and the parts install with their parent.
- AlertDialog:
AlertDialogTrigger,Content,Header,Title,Description,Footer,Action,Cancel. Escape acts as Cancel. - Breadcrumb:
BreadcrumbList,Link,Page,Separator,Ellipsis. - Command:
CommandInput,List,Group,CommandOption,Empty,Separator. The part isCommandOptionbecauseCommandItemis the model. - Form:
FormField,Item,Label,Control,Description,Message, with live validation inside anEditForm. - Menubar:
MenubarMenu,Trigger,Content,Separator. AMenubarItemwith aTitleis a dropdown; without one it is a clickable item. - Pagination:
PaginationContent,Item,Link,Previous,Next,Ellipsis. - Sheet and Drawer:
Header,Title,Description,Footer,Close. CLI templates use them withCompositional="true".
- Dashboard setup in
init:initasks for a layout (sticky headerdashboard-02, scrolling headerdashboard-01, or none), or takes--dashboard 01|02|none. Adding a dashboard wires it in:Routes.razoruses it, the stockMainLayoutandNavMenuare removed when unmodified, the error bar moves toApp.razor, and the sidebar links come from your pages. A custom layout is only replaced after you confirm or pass--replace-layout. - Sample pages restyled: unmodified
dotnet new blazorpages (Home, Counter, Weather, Error, NotFound, Auth) get ShellUI's Tailwind classes, and Home becomes a short guide to themes and components. Edited pages are listed, not changed. - ASP.NET Core Identity apps (
--auth Individual):- The
/Accountpages render statically while the rest of the app is interactive. Before,initmade every page interactive and the Identity pages returned Not Found. - The dashboard sidebar shows Log in and Register, or the signed-in user and Log out.
- New blocks
auth-01(centered card),auth-02(split screen) andauth-03(minimal) give the sign-in, sign-up and recovery pages their own layout and restyle the stock Identity pages for .NET 8, 9 and 10.
- The
- Tailwind CLI: in projects set up by this version, the build downloads the pinned Tailwind CLI when
.shellui/binhas none, for example after a fresh clone, and warns if it can't instead of silently skipping Tailwind. - Terminal:
initshows the ShellUI logo and an animated logo loader;add,updateand theme commands use a compact spinner. Both fall back to plain lines without an interactive terminal.
- Loading is rebuilt with 23 variants, including
logo,snake,wave,typingandshimmer. Its keyframes ship inside the component, so the animations also work with the NuGet package. It followscurrentColor, hasrole="status", and slows down under reduced motion. - Command is rewritten: it filters as you type, supports ↑/↓/Home/End/Enter, optional
Groupheadings and a footer with key hints. Selecting an item now runs itsCommandItem.Action, then raisesCommandSelected; before,Actionwas ignored.CommandPalettegets the same behavior and a bindableIsOpen. - Dropdown and Popover close on Escape.
- The CLI's
SidebarProviderloggedJSDisconnectedExceptiontwice on every page reload. It no longer does. init --tailwind standalone|npmnow skips the Tailwind prompt, which ignored the flag. An unknown value fails beforeinitchanges the project, and--yessays that standalone is the default.shellui updatereported every requested component as updated. It now counts updated, skipped and failed components separately.- Everything fixed in 0.3.1 and 0.3.2 is included.
- Calendar:
SelectedDateChangedis nowEventCallback<DateTime?>, so@bind-SelectedDateworks with aDateTime?field. Handlers that take aDateTimemust take aDateTime?.
- CLI: update the tool to this version, then run
shellui updateto rewrite installed components from the new templates.updateoverwrites the files, so commit or back up any components you customized first.Build/ShellUI.targetsis only written byinit, so projects set up with 0.3 keep the old Tailwind build step. - NuGet package: update
ShellUI.Componentsto0.4.0-alpha.1. If you handleCalendar.SelectedDateChanged, change the handler's parameter toDateTime?.
# CLI (prerelease: the version is required)
dotnet tool install -g ShellUI.CLI --version 0.4.0-alpha.1
# or upgrade an existing install
dotnet tool update -g ShellUI.CLI --version 0.4.0-alpha.1# NuGet package
dotnet add package ShellUI.Components --version 0.4.0-alpha.1Full Changelog: https://github.com/shellui-dev/shellui/compare/v0.3.2...v0.4.0-alpha.1
A patch release with component fixes for both the
ShellUI.ComponentsNuGet package and the CLI templates.
MultiSeriesChartthrew on every render in the NuGet package. It now renders, inside the same card asChart.- NuGet package:
ThemeToggleflipped its icon but did not change the theme, dialogs, sheets and drawers did not lock page scrolling, and close-on-scroll dropdowns stayed open. The package'sshellui.jsnow loads automatically through a Blazor JS initializer, with no<script>tag needed, and includes the functionsThemeToggle,ThemeServiceandFileUploadcall. ThemeTogglekept a list of instances shared by every user on Blazor Server, so one user's toggle tried to re-render other users' components. Toggles now follow the page'sdarkclass, so all toggles on a page stay in sync and start from the page's actual theme.DatePickerandDateRangePicker: the calendar popover has a width, so it is no longer squeezed in a flex row.DataPickerandMultiSelect: option rows are left-aligned, so customOptionTemplates no longer render centered.- Removed leftover files from the Razor class library template (
Component1,ExampleJsInterop,background.png) from the package.
A new test renders every package component and fails on parameter errors like the MultiSeriesChart one.
- NuGet package: update to
0.3.2. - CLI: update the tool, then run
shellui updateto rewrite installed components, includingshellui.js, from the new templates.updateoverwrites the files, so commit or back up any components you customized first.
A patch release for the
ShellUI.ComponentsNuGet package. The CLI and its templates have no changes beyond the version number.
Calendar,Command,DataTable,FileUpload,CarouselContent,CarouselDots,CarouselNextandCarouselPreviouscompiled into theShellUI.Components.Componentsnamespace, so@using ShellUI.Componentsdid not find them. They are now inShellUI.Componentslike every other component, and a test checks that every package component declares that namespace.
Update the package to 0.3.1. If you added @using ShellUI.Components.Components to work around this, remove it: that namespace no longer exists, so the line now fails the build.
The first stable release of the 0.3 line. It builds on .NET 10 and Tailwind CSS 4.3.2 and ships everything from the 0.3.0 alphas and release candidates. A plain
dotnet tool installnow picks it up, so--versionis no longer needed. Report issues via GitHub Issues.
- Blazor on .NET 8, 9 and 10. The CLI needs the .NET 10 SDK, and the components it installs build in projects on .NET 8, 9 and 10; CI now checks all three. The
ShellUI.ComponentsNuGet package targets .NET 10 only. - Tailwind CSS 4.3.2.
shellui initproduces an app that builds and runs. It patchesApp.razor(render mode, theme bootstrap,shellui.js), writes the full theme toinput.css, and wires Tailwind into the build.shellui addresolves everything a component needs: its sub-components, models and variants, NuGet packages (Blazor-ApexCharts,System.Linq.Dynamic.Core), and the@usinglines in_Imports.razor. Typos get a "did you mean" suggestion.- 76 components, including
command-palette,data-picker,multi-select,tag-input,typed-select, and thedonut-chart,radar-chartandradial-chartcharts. - Composable APIs for Select, Dropdown, Popover, ContextMenu, NavigationMenu, Carousel, HoverCard, Accordion and Tabs, installed together with their parent.
- Themes from tweakcn:
shellui theme init | apply | update. - NuGet package with a precompiled
shellui-all.cssbundle and a Tailwind safelist, so it works without a Tailwind build step. - Accessibility: Dialog, Sheet and Drawer take focus on open, close on Escape, and set
role="dialog". Classis accepted everywhere;ClassNamestill works but is deprecated.
See the release candidate sections below for the full list of changes.
-
Adding certain components on their own produced a project that did not build:
avatar,alert,badge,sonner,toggle:shellui addwrote@using ….Components.UI.Variantsto_Imports.razor, but those variants files declare.Components.UI. Imports now follow the namespace each installed file declares.input,alert,badge,toggle: the component files imported that same namespace themselves. The import is removed.chart-series: now installschartand theBlazor-ApexChartspackage.
Every component was installed and built on its own in a fresh app for this release, and a new test checks that each component installs the namespaces and packages it imports.
-
On .NET 8 and 9 projects whose name is not a valid namespace, such as
my-app, installed files gotnamespace my-app.Components.UIand did not build. The template writes<RootNamespace>my-app</RootNamespace>, while the compiler usesmy_app; the CLI now does the same. -
shellui initon .NET 8 left Bootstrap active: the template keeps it inwwwroot/bootstrap/, which was not removed. It is now, and the local Bootstrap<link>is removed fromApp.razor(on .NET 9 and 10 it pointed at deleted files). Bootstrap loaded from a CDN is left alone. -
On Windows the CLI now writes UTF-8, so ✅ no longer prints as
?and the spinner no longer falls back to ASCII. -
A failed
shellui initnow exits with code 1.
- From a 0.3.0 release candidate: update the tool, then run
shellui updateto rewrite the installed components from the new templates.updateoverwrites the files, so commit or back up any components you customized first. - From 0.2.1: install the .NET 10 SDK to run the CLI. Your project can stay on .NET 8 or 9 when you use the CLI; the NuGet package needs .NET 10. Read the rc.1 notes below for what changed in
initand the templates.
# CLI
dotnet tool install -g ShellUI.CLI
# or upgrade an existing install
dotnet tool update -g ShellUI.CLI# NuGet package
dotnet add package ShellUI.ComponentsFull Changelog: https://github.com/shellui-dev/shellui/compare/v0.2.1...v0.3.0
Third release candidate for v0.3.0. It contains only fixes, mostly to what
shellui addinstalls. There are no new components and no breaking changes. If nothing critical comes up during testing, v0.3.0 ships from this code with the suffix dropped. Report issues via GitHub Issues.
- Composable parts are installed.
SelectTrigger,SelectContent,SelectItem,ContextMenuTrigger,ContextMenuContent,ContextMenuOption,NavList,NavItem,NavTrigger,NavContent,CarouselListandCarouselSlidewere empty templates, so composable markup failed to compile aftershellui add. They now ship with their parent component. - The Dropdown, Popover, HoverCard and Accordion parts (
*Trigger,*Content,DropdownItem) were never pulled in by their parent, and the Dropdown, Popover and HoverCard CLI templates didn't support composable use. The CLI templates now match the NuGet package. TabssupportsItems/TabItemsandActiveTabas in the package. ItsTabModels.csnow installs toComponents/UI/Models/instead of a nestedComponents/UI/Components/Models/folder.commandno longer declares its ownCommandItem, which clashed withcommand-palette. It now installs the sharedCommandModels.cs.alert-dialogwas missing itsVariantsusing.shellui addadds the@usinglines that installed components need (.Components.UI.Variantsand.Components.Models) to_Imports.razor.
- Compositional Dropdown, Popover, ContextMenu and NavigationMenu items now open and close without binding
IsOpen. ContextMenu and Dropdown close on an outside click. - A value-based
Carousel(CarouselSlide Value="...") shows its dots and the correct width on first render. HoverCardContentstays open while the pointer is over it.SelectItemmarks the selected option (data-selected,aria-selected), and triggers exposearia-expanded.- Dialog, Sheet and Drawer take focus when they open, close on Escape, and set
role="dialog"andaria-modal. - Keyboard shortcuts such as
Ctrl+Kaccept Ctrl or Cmd, as intended. Before, they required both. Loadinganimations work in CLI projects. Their keyframes ship with the component, and the grid delays no longer depend on the server culture.- Headings focused by Blazor navigation no longer show a focus outline.
- CI runs on
release/**branches and installs every component into a fresh app and builds it, so a template that doesn't compile or a missing dependency fails the build. - New tests fail when a registry entry has empty content, when a hidden part isn't reachable from any installable component, or when a CLI template drifts from its package component.
# CLI (prerelease: the version is required)
dotnet tool install -g ShellUI.CLI --version 0.3.0-rc.3
# or upgrade an existing install
dotnet tool update -g ShellUI.CLI --version 0.3.0-rc.3# NuGet package
dotnet add package ShellUI.Components --version 0.3.0-rc.3Full Changelog: https://github.com/shellui-dev/shellui/compare/v0.3.0-rc.2...v0.3.0-rc.3
Second release candidate for v0.3.0. It moves ShellUI to .NET 10, adds new components, and fixes bugs found in real projects using rc.1. If nothing critical comes up during testing, v0.3.0 ships from this code with the suffix dropped. Report issues via GitHub Issues.
ShellUI.Componentsnow targetsnet10.0(rc.1 targetednet9.0). Projects on .NET 9 should stay on rc.1 until they upgrade.- The
shelluiCLI tool needs the .NET 10 runtime to run. - Tailwind CSS goes from
4.1.18to4.3.2.
- Components:
command-palette,data-picker,multi-select,tag-input,typed-select(#25, #27) - Charts: new
donut-chart,radar-chartandradial-chart, in both the CLI and the NuGet package. All charts are restyled to match shadcn (#26) - DataTable: server-side mode via
DataTableRequest/DataTableResponse(#27) - Sonner: toast variants and per-toast duration (#27)
- Themes:
shellui theme init | apply | updatebake a tweakcn theme intowwwroot/input.cssand record it inshellui.theme.lock(#23, #24) - NuGet package: ships a precompiled
shellui-all.cssbundle and a Tailwind safelist, so it works without a Tailwind build step (#20, #22)
shellui add accordionfailed becauseaccordion-typewas not registered (#29)Tabsgenerated an unterminated string and did not compile (#29)SelectandFileUploadshowed icon names such asexpand_moreas text, because they relied on the Material Symbols font. Both now use inline SVG (#29)DashboardLayout01breadcrumb code did not compile (#29)context-menureferenced aContextMenuItemmodel that was never installed (#29)SidebarInset: wide content no longer pushes the page sideways (#29)- Sidebar mobile detection and Ctrl/Cmd+B now work when components are compiled into a Razor Class Library (#30)
Classis now accepted by the 30 templates and 8 package components that only tookClassName. Before,Class="..."could drop a component's base styling.ClassNamestill works but is deprecatedshellui addexits with 1 when any component, dependency or NuGet package fails.initfails loudly if its base files can't be written, andupdaterecords the new version inshellui.json(#30)- Chart tooltips: pie, donut and radial tooltips showed empty rows, radar charts showed none, and bar/line tooltips lost their x-axis label. CLI-installed charts also used an outdated copy of the chart options (palette, animations, legend). The CLI templates now match the NuGet package
- Overlays close on dismiss, lock body scroll, and clean up asynchronously (#27)
- Stepper highlights the active step correctly
# CLI (prerelease: the version is required)
dotnet tool install -g ShellUI.CLI --version 0.3.0-rc.2
# or upgrade an existing install
dotnet tool update -g ShellUI.CLI --version 0.3.0-rc.2# NuGet package
dotnet add package ShellUI.Components --version 0.3.0-rc.2Full Changelog: https://github.com/shellui-dev/shellui/compare/v0.3.0-rc.1...v0.3.0-rc.2
Release candidate for v0.3.0. Five branches of integration-tested fixes against the alpha series, surfaced from real-world Blazor Server consumer use. If no critical reports come in during the soak window, this code ships as
v0.3.0stable with the suffix dropped — no further code changes. Report issues via GitHub Issues.
shellui init + shellui add now produce a project that compiles and runs end-to-end without manual host patching. Every alpha.3 install-time papercut documented in the integration notes is fixed and guarded by tests + CI:
- Three chart/dashboard templates no longer ship uncompilable C# verbatim strings
SidebarTriggermobile hamburger renders (was an invisible FontAwesome class)ThemeToggleno longer usesevaland no longer crashes during Blazor Server prerendershellui initpatchesApp.razorwith@rendermode, theme bootstrap script, andshellui.jslink tag — and writes the full default theme toinput.cssinstead of just@import "tailwindcss";shellui add data-tableactually installsDataTableModels.csand auto-runsdotnet add package System.Linq.Dynamic.Coreshellui add chartauto-runsdotnet add package Blazor-ApexChartsand the chart tooltip CSS finally renders readable text instead of invisible white-on-white- New
did you mean …?typo suggestion (shellui add datatable→Did you mean 'data-table'?)
Component count corrected across docs: 68 installable top-level components (not the 100 previously claimed; sub-components and variants ship as auto-installed dependencies).
ChartVariants— every JS-attribute quote inside the tooltipCustom = @"..."block now escapes as""x""(the verbatim-string form) instead of bare"x"(which terminated the outer string)PieChart— same class of bug but using\"x\"(which decoded to literal backslashes in rendered HTML); fixed to""x""DashboardLayout02— unterminated empty-string literal inBuildBreadcrumb(segments[0] == ""))→segments[0] == """")))- Live
PieChart.razorin the library had the same backslash bug; fixed to remove visible\"from rendered tooltip HTML
SidebarTrigger—<i class="fa-solid fa-bars-staggered">swapped for inline SVG hamburger. FontAwesome is not a ShellUI dependency, so mobile users on a fresh install previously saw an invisible toggle buttonThemeToggle—JSRuntime.InvokeVoidAsync("eval", …)dropped in favor of theShellUI.addClassToDocument/ShellUI.removeClassFromDocumenthelpers already shipped inshellui.js. No more CSP-blockableeval, no new JS surface areaThemeToggle— localStorage read moved fromOnInitializedAsync(whereIJSRuntimeis unavailable during Blazor Server prerender) toOnAfterRenderAsync(firstRender)InputOTP— sameevalremoval applied; now usesShellUI.focusElementfor digit-to-digit focusThemeService— sameevalcleanup asThemeToggle
- App.razor patching —
<HeadOutlet />→<HeadOutlet @rendermode="InteractiveServer" />, same for<Routes />. Existing@rendermodevalues are preserved (won't overwriteInteractiveAuto/InteractiveWebAssembly) - Theme bootstrap
<script>injected into<head>— readslocalStorage.themeand applies thedarkclass before paint to avoid the light-flash on dark pages <script src="shellui.js">injected before_framework/blazor.web.js(handles both the modern@Assets[...]wrapper and the bare form)wwwroot/index.htmlpatched for Blazor WebAssembly standalone projects (theme bootstrap +shellui.jsonly — no render-mode pattern in WASM)input.cssships the full default theme —:rootlight vars,.darkdark vars,@theme inlinemapping for Tailwind v4,@custom-variant dark,@layer basedefaults, and Loading-component animation keyframes. Previously emitted only@import "tailwindcss";, so any component using theme variables rendered unstyledtailwind.config.js(npm) — dropped the redundanthsl(var(--x))color block; Tailwind v4 reads the palette from@theme inlineininput.css- All patching is idempotent — running
shellui inittwice produces no duplicate scripts or tags
data-table-modelsregistered — the template existed on disk but was missing fromComponentRegistry, so the CLI reportedComponent 'data-table-models' not foundand left the consumer project unable to compile- NuGet auto-install — new
NuGetDependenciesfield onComponentMetadata.data-tabledeclaresSystem.Linq.Dynamic.Core 1.7.1,chartdeclaresBlazor-ApexCharts 6.0.2. The CLI walks the dep graph and runsdotnet add packageonce per unique package after all source files are written - Did-you-mean suggestions — Levenshtein-based hint surfaces close matches when a user mistypes a component name.
shellui add datatable→Did you mean 'data-table'?Hidden sub-components are excluded from suggestions
chart-stylesregistered — the CSS template existed but, likedata-table-models, was never wired into the registry. Hovering a chart point previously showed an invisible white-on-white tooltip because nothing styled the.custom-tooltip-*classes the chart HTML emitschartdepends onchart-styles— the recursive install walk transitively pulls the CSS in for every chart-family component- CSS lands in the right place —
FilePathcorrected from a path that would have buried the file inComponents/UI/wwwroot/css/(unreachable) to../../wwwroot/css/charts.css(project root) <link>auto-injected into App.razor — same idempotent rewriter pattern used forshellui.js. Generic by design: any futurewwwroot/-targeting CSS asset gets the same treatment
docs/RELEASE_NOTES.mdis now the source of truth thatrelease.ymluses as the GitHub Release body — no more drift between the tag description and the file- Component count audit — README, ARCHITECTURE, COMPONENT_ROADMAP, PROJECT_STATUS, COMPARISON, FAQ, QUICKSTART, CLI_SYNTAX, VERSIONING_STRATEGY, and the three package READMEs all now report 68 installable components, with category breakdowns rederived from
ComponentRegistry(Form 17, Layout 12, Navigation 7, Overlay 8, Data Display 13, Feedback 9, Utility 2) - Preview pipeline restored —
actions/configure-pages@v4now passesenablement: trueso the GitHub Pages site is created on first run instead of erroring withHttpError: Not Found
This release adds three independent layers of regression coverage. The previous alpha shipped with zero of these:
TemplateCompileTests(8 tests) — RoslynCSharpSyntaxTree.ParseTextover every fixed template's generated content. Pure-C# templates parse whole content; Razor templates extract the@codeblock via a quote/comment-aware brace-balancing tokenizer. When extraction fails (unterminated string), falls back to a class-wrapped parse filtered to literal-related diagnostic IDs (CS1010, etc.) so the failure message points at the offending lineTemplateSyncTests(3 tests) — for every component that has both a live.razorinsrc/ShellUI.Components/Components/and a CLI template, compares the@codeblocks after normalization (strip comments, blank lines, whitespace). Catches the class of bug that shipped in alpha.3 where someone added a parameter to the liveThemeToggle.razorbut forgot to mirror it in the template.AllowedDriftexception list exists but is emptyInitBootstrapTests(8 tests) — direct tests of the App.razor / index.html rewriter. Covers render-mode injection, theme bootstrap placement, script-tag ordering, idempotency, existing-render-mode preservation, and both the modern@Assets[...]and bare<script src="…">formsNuGetDepsAndSuggestionsTests(15 tests) — Levenshtein matcher,did-you-meanexclusions, NuGet metadata, chart-family transitive dependency proofs, namespace conventionChartStylesTests(10 tests) — registry wiring,FilePathtargets wwwroot, CSS content covers both.custom-tooltip-*and.apexcharts-*classes with theme variables, link injector +ResolveHostStylesheetHrefsemantics, idempotency- CI smoke step — packs the CLI, installs as a global tool,
dotnet new blazor→shellui init→shellui add chart pie-chart dashboard-02 data-table→dotnet build. Asserts the auto-injected pieces (@rendermode, theme bootstrap,shellui.jsscript,charts.csslink, NuGet refs,DataTableModels.cspresence, full theme ininput.css) all appear in the produced files. The previous CI did neither tests-on-PR nor end-to-end scaffolding
Test total: 53 unit tests (was 0). All pass in Release. Drift canary verified by stashing a fix, observing the precise line-level diff in the test output, and restoring.
# CLI (prerelease channel — the suffix is intentional)
dotnet tool install -g ShellUI.CLI --version 0.3.0-rc.1
# or upgrade from any alpha
dotnet tool update -g ShellUI.CLI --version 0.3.0-rc.1
shellui init
shellui add button card dialog# NuGet packages (prerelease channel)
dotnet add package ShellUI.Core --version 0.3.0-rc.1 --prerelease
dotnet add package ShellUI.Components --version 0.3.0-rc.1 --prereleaseIf shellui init runs cleanly and dotnet build succeeds on a fresh dotnet new blazor, you have everything. There are no manual <script> / <link> / @rendermode patches to make.
v0.3.0stable — same code as rc.1 with the suffix dropped, after a soak window. No further alphas planned for the 0.3 linev0.4.0-alpha.1— .NET 10 upgrade. Begins after 0.3.0 ships. TFM bump, package updates, CI matrixv0.4.0and beyond — genericDataPicker<TItem, TKey>(Fix 11 from integration notes), Preview app rewrite, ApexCharts chrome restyle (default legend / axis text Tailwind-styled to match shadcn polish)
See docs/COMPONENT_ROADMAP.md for the longer view.
- Documentation: https://shellui.dev
- GitHub: https://github.com/shellui-dev/shellui
- NuGet: https://www.nuget.org/packages/ShellUI.Components
Full Changelog: https://github.com/shellui-dev/shellui/compare/v0.3.0-alpha.3...v0.3.0-rc.1
Third alpha of v0.3.0 — dashboard sidebar blocks, JS install fixes, and NuGet Core packaging. Report issues via GitHub Issues.
v0.3.0-alpha.3 adds shadcn-style dashboard layout blocks, completes the sidebar component install chain (including JavaScript interop), and fixes NuGet so ShellUI.Components can resolve ShellUI.Core.
- Dashboard layout blocks —
dotnet shellui add dashboard-01(header scrolls, shadcn sidebar-01) anddashboard-02(sticky header, shadcn sidebar-02) shellui-jstemplate — installswwwroot/shellui.jsat init and as a dependency ofcopy-button/file-upload- Blocks demo —
/blockspage with live previews, install commands, andCopyButtonper block DashboardDemoSidebar— isolated demo sidebar content (separate from main app sidebar)
- NuGet:
ShellUI.Corenow published —ShellUI.Coreis packable; release workflow pushes Core + Components sodotnet add package ShellUI.Componentsrestores successfully (was NU1102 when only Core 0.1.0 existed on NuGet) - Dependency auto-install — variant/service templates (
alert-variants,badge-variants,avatar-variants,sonner-variants,sonner-service,toggle-variants) markedIsAvailable = falseso they install only with their parent - Breadcrumb — single
dotnet shellui add breadcrumb;breadcrumb-itemauto-installed - Blazor error UI — hidden until an error occurs (
.showclass) - Init — installs
shellui.jsand reminds you to add<script src="shellui.js"></script>in App.razor or index.html
| Asset | Installed when | CLI usage |
|---|---|---|
shellui-sidebar.js |
sidebar-provider → sidebar-js |
Dynamic import in SidebarProvider |
shellui.js |
init, copy-button, file-upload |
Global ShellUI.*; requires script tag in HTML |
NuGet consumers: both JS files ship as static web assets under _content/ShellUI.Components/.
# CLI
dotnet tool install -g ShellUI.CLI --version 0.3.0-alpha.3
# or
dotnet tool update -g ShellUI.CLI --version 0.3.0-alpha.3
shellui init
shellui add dashboard-01 # or dashboard-02# NuGet (requires ShellUI.Core on NuGet at same version)
dotnet add package ShellUI.Core --version 0.3.0-alpha.3 --prerelease
dotnet add package ShellUI.Components --version 0.3.0-alpha.3 --prereleaseAfter shellui init, add before the Blazor script:
<script src="shellui.js"></script>- Documentation: https://shellui.dev
- GitHub: https://github.com/shellui-dev/shellui
- NuGet: https://www.nuget.org/packages/ShellUI.Components
Full Changelog: https://github.com/shellui-dev/shellui/compare/v0.3.0-alpha.2...v0.3.0-alpha.3
Second alpha of v0.3.0 — fixes CLI registry for Drawer/Sheet compositional subcomponents. Report issues via GitHub Issues.
v0.3.0-alpha.2 fixes the CLI template registry so that Drawer and Sheet correctly ship with their compositional subcomponent pattern introduced in alpha.1.
- Drawer/Sheet templates upgraded to v0.3.0 —
Open/OpenChangedreplacesIsOpen/IsOpenChanged,DrawerSide/SheetSideenums replace string-based side props, explicitCompositionalparameter enables subcomponent mode - Missing subcomponent templates added —
DrawerTrigger,DrawerContent,SheetTrigger,SheetContentwere missing from the registry entirely - Missing variant templates added —
DrawerVariants(withDrawerSideenum) andSheetVariants(withSheetSideenum) now installable - Dependency direction fixed —
shellui add drawernow auto-installs all 4 files (Drawer, DrawerVariants, DrawerTrigger, DrawerContent); same forshellui add sheet
| Command | alpha.1 | alpha.2 |
|---|---|---|
shellui add drawer |
Installed old v0.2.x Drawer only | Installs Drawer + DrawerVariants + DrawerTrigger + DrawerContent |
shellui add sheet |
Installed old v0.2.x Sheet only | Installs Sheet + SheetVariants + SheetTrigger + SheetContent |
- Version bump — 0.3.0-alpha.1 → 0.3.0-alpha.2
- Subcomponent dependency pattern — Follows parent-owns-children convention (same as Dialog, Collapsible, etc.)
# Install CLI (alpha)
dotnet tool install -g ShellUI.CLI --version 0.3.0-alpha.2
# Or upgrade from alpha.1
dotnet tool update -g ShellUI.CLI --version 0.3.0-alpha.2Initialize and add components:
shellui init
shellui add drawer # installs Drawer + DrawerVariants + DrawerTrigger + DrawerContent
shellui add sheet # installs Sheet + SheetVariants + SheetTrigger + SheetContent- Documentation: https://shellui.dev
- GitHub: https://github.com/shellui-dev/shellui
- NuGet: https://www.nuget.org/packages/ShellUI.Components
Full Changelog: https://github.com/shellui-dev/shellui/compare/v0.3.0-alpha.1...v0.3.0-alpha.2
First alpha of v0.3.0 — test thoroughly before stable. Report issues via GitHub Issues.
v0.3.0-alpha.1 includes everything from v0.2.0 (charts, Tailwind 4.x) plus new components and improvements.
Docs essentials:
- Callout / CalloutVariants — Info, warning, tip, danger admonition boxes
- CopyButton — One-click copy to clipboard
- LinkCard — Card-style links for related pages
- PrevNextNav — Previous/Next page navigation for docs
Feedback & Data:
- Sonner / SonnerService / SonnerVariants — Modern toast notifications (shadcn-style)
- Stepper / StepperList / StepperStep / StepperContent — Step-by-step wizard with value-based API
- ChartVariants — Variant styling support for charts
- Version bump — 0.2.0 → 0.3.0-alpha.1 across all packages
- CI/CD — NuGet caching, explicit solution paths, concurrency, pre-release tag support
- Documentation — Tailwind setup guide now generic for Blazor, versioning strategy updated for alpha workflow
- Release workflow — Tag pattern updated to match
v0.3.0-alpha.1-style prereleases
- Stepper — Active-state highlighting may not always reflect current step; documented, shipping as-is
Feature release - Charts & Data Visualization
Built on ApexCharts.Blazor with full ShellUI theme integration:
- Chart - Base chart component with theme-aware styling
- BarChart - Vertical bar charts
- LineChart - Smooth line charts
- AreaChart - Filled area charts
- PieChart - Pie charts with custom tooltips
- MultiSeriesChart - Multiple data series on one chart
- ChartSeries - Flexible series composition
Three built-in color themes via ChartTheme enum:
- Default - Professional blue-based palette (blue, red, green, yellow, purple)
- Colorful - Vibrant multi-color palette with 7 colors
- Monochrome - Slate grays for minimal aesthetic
Charts automatically use your theme's CSS variables:
var(--radius)for border radiusvar(--shadow)for box shadowvar(--border),var(--card),var(--card-foreground)for colors
Fully custom HTML tooltips replacing ApexCharts defaults:
- Compact, shadcn-inspired design
- Proper marker/text alignment via flexbox
- Multi-series support (shows all values at a data point)
- Light/dark mode support via CSS variables
- Separate pie chart tooltip using
seriesIndex
- Fixed version mismatch - Component versions now correctly read from assembly metadata instead of hardcoded fallback
- Fixed Tailwind version in config -
shellui.jsonnow correctly shows Tailwind v4.1.18 for all install methods - Fixed CS1998 warnings - Removed unnecessary
asyncfrom synchronous methods inComponentInstaller
- Tailwind CSS updated to v4.1.18
- Component count: 100 installable (dependencies like *-variants auto-installed)
- X-axis labels - Charts use
XAxisType.Categoryfor proper string label display - Version system - Fallback version now reads
AssemblyInformationalVersionbaked at build time
# Install CLI globally
dotnet tool install -g ShellUI.CLI
# Initialize your project
shellui init
# Add chart components
shellui add chart bar-chart line-chart pie-chart area-chart multi-series-chartOr via NuGet:
dotnet add package ShellUI.ComponentsNote: Charts require the Blazor-ApexCharts NuGet package:
dotnet add package Blazor-ApexCharts- Documentation: https://shellui.dev
- GitHub: https://github.com/shellui-dev/shellui
- NuGet: https://www.nuget.org/packages/ShellUI.Components
Full Changelog: https://github.com/shellui-dev/shellui/compare/v0.1.1...v0.2.0