Add D-prefixed Blazor wrappers for every daisyUI 5 component

Components/Daisy/ wraps all 69 components in daisyUI's llms.txt, grouped by
daisyUI's categories (Actions, DataDisplay, Navigation, Feedback, DataInput,
Layout, Mockup), with part components where daisyUI has repeating parts (DTab,
DMenuItem, DTimelineItem, ...).
- Each enum maps to whole literal class names in a switch, so Tailwind's scanner
  generates them. Nothing is concatenated.
- Value-holding fields derive from DInputBase<TValue>, Blazor's InputBase, so
  @bind-Value and EditForm validation work. Invalid fields get the component's
  *-error class.
- Open and active state lives in C# (@bind-IsOpen, @bind-Active) and is rendered
  with daisyUI's *-open modifiers. DDropdown adds an outside-click layer and
  Escape. No component uses JS interop.
- The one exception is DCalendar, which wraps the Cally web component, vendored
  as wwwroot/vendor/cally.js (0.9.2, MIT).

/styleguide (not linked) renders every component in all its colours, sizes and
states, with a theme and hue picker that previews without saving.

neo.css follows what the styleguide showed:
- select keeps daisyUI's arrow;
- skeleton-text isn't sunk;
- the phone mockup and dock are raised;
- active menu items and OTP digits are inset;
- a joined accordion is raised as one block.
The primary, secondary and accent colours are deeper, so they still read as
text.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LsXgEaXee4GCU1hwYgPJXw
This commit is contained in:
thepraandClaude Opus 5.5 committed 2026-10-03 12:01:42 +02:00
1 parent 8e03d12a3e
commit 90e4b9200c
127 files changed
+6962 -17

No files matched your search

@@ -0,0 +1,46 @@
@inherits DComponentBase
@* A collapsible submenu of a DMenu: <li><details><summary>. The open state lives in C# (@bind-IsOpen): <details>
renders open from IsOpen, and the summary's click toggles IsOpen with the native toggle prevented, so the browser
and Blazor never fight over it. Escape closes the innermost open one (keydown stops bubbling while it is open). *@
<li @attributes="AdditionalAttributes" class="@Cx(Disabled ? "menu-disabled" : null, Class)">
<details open="@IsOpen" @onkeydown="OnKeyDown" @onkeydown:stopPropagation="IsOpen">
<summary class="@HeaderClass" aria-label="@(IsOpen ? BackText : null)" @onclick="Toggle" @onclick:preventDefault="true">
@Header
</summary>
<ul class="@ContentClass">
@ChildContent
</ul>
</details>
</li>
@code {
[Parameter] public RenderFragment Header { get; set; }
[Parameter] public RenderFragment ChildContent { get; set; }
[Parameter] public bool IsOpen { get; set; }
[Parameter] public EventCallback<bool> IsOpenChanged { get; set; }
[Parameter] public bool Disabled { get; set; }
/// <summary>
/// In a paged menu (DMenu Paged) the open summary turns into a back button reading "Back"; this replaces that text.
/// It is set as the summary's aria-label while open, which is where daisyUI reads it from.
/// </summary>
[Parameter] public string BackText { get; set; }
[Parameter] public string HeaderClass { get; set; }
[Parameter] public string ContentClass { get; set; }
async Task Toggle()
{
if (Disabled)
return;
IsOpen = !IsOpen;
await IsOpenChanged.InvokeAsync(IsOpen);
}
async Task OnKeyDown(KeyboardEventArgs e)
{
if (e.Key != "Escape" || !IsOpen)
return;
IsOpen = false;
await IsOpenChanged.InvokeAsync(false);
}
}