Download the PHP package edumicro/daisyblade without Composer
On this page you can find all versions of the php package edumicro/daisyblade. It is possible to download/install these versions without Composer. Possible dependencies are resolved automatically.
Informations about the package daisyblade
DaisyBlade
Pure Blade + Alpine.js + DaisyUI components for Laravel ERP/CRM interfaces.
No Livewire. No magic. No hidden server roundtrips.
Philosophy
DaisyBlade is the evolution of edumicro/daisylw4, rebuilt without Livewire. The stack is intentionally boring:
- Blade renders structure
- Alpine.js manages local UI state
- Axios handles explicit server calls
- DaisyUI 5 provides the design system
Every server interaction is a plain Laravel controller returning JSON. No protocol overhead, no wire attributes, no object inspector surprises. If something breaks, you know exactly where to look.
Requirements
| Dependency | Version |
|---|---|
| PHP | ^8.2 |
| Laravel | ^11.0 | ^12.0 |
| Alpine.js | ^3.0 |
| DaisyUI | ^5.0 |
| blade-heroicons | ^2.4 |
Installation
The install command will ask whether to publish assets for Vite (recommended) or as a public script tag:
Vite setup
Script tag setup
Component prefix
All components use the dbl prefix:
Component reference
Type 1 — Static (Blade + DaisyUI only)
No JavaScript. Receive props, render HTML.
| Component | Usage |
|---|---|
display.accordion |
DaisyUI accordion (CSS-driven) |
display.avatar |
User avatar with initials fallback |
display.badge |
Status badges with color variants |
display.card |
Content card with optional shadow |
display.chat-bubble |
Chat message bubble |
display.collapse |
DaisyUI collapse panel (CSS-driven) |
display.compare |
Side-by-side property comparison table |
display.diff |
Code diff viewer (line-by-line +/−/~) |
display.hover-3d-card |
CSS 3D tilt card on hover |
display.hover-gallery |
CSS-animated image gallery |
display.kbd |
Keyboard shortcut display |
display.list |
Styled list component |
display.mask |
DaisyUI mask shapes |
display.radial-progress |
Circular progress indicator |
display.resource-details |
Detail view loaded from URL |
display.stat |
KPI card with value, title, trend |
display.status |
Status dot with label |
display.table |
Static HTML table from array data |
display.timeline |
Vertical event timeline |
display.tree |
Recursive tree from nested array |
feedback.alert |
Alert message with type variants |
feedback.loading |
Loading spinner |
feedback.progress |
Linear progress bar |
feedback.skeleton |
Content skeleton placeholder |
feedback.tooltip |
Tooltip wrapper |
form.checkbox |
Checkbox field with label |
form.input |
Text/email/number/date input |
form.radio |
Radio button group |
form.textarea |
Textarea with label |
form.toggle |
Toggle switch |
form.validator |
Inline validation message display |
layout.divider |
Section divider |
layout.footer |
Page footer |
layout.hero |
Hero section |
layout.indicator |
Badge indicator overlay |
layout.join |
DaisyUI join group |
layout.section-wrapper |
Padded section container |
layout.stack |
DaisyUI stack layout |
navigation.breadcrumb |
Breadcrumb trail |
navigation.dock |
Bottom dock navigation |
navigation.steps |
Step indicator |
actions.button |
Button with variants, loading, icon |
actions.fab |
Floating action button |
actions.swap |
Toggle swap element |
components.icon |
Heroicon wrapper |
Type 2 — Interactive local (Alpine, no server calls)
UI state managed by Alpine. No Axios.
| Component | Usage |
|---|---|
actions.modal |
Modal with Alpine open/close |
display.carousel |
Image/content carousel |
display.filters |
Filter bar with Alpine state |
display.node-graph |
Tree graph with event timeline + detail modal |
display.text-rotate |
Animated rotating text |
feedback.toast |
Toast notification |
form.kv-editor |
Key-value editor with auto-inferring type selector |
form.list-editor |
Chip/tag array-of-strings editor |
form.repeater |
Dynamic repeatable field group |
navigation.menu |
Dropdown / nested menu |
navigation.navbar |
Top navigation bar |
navigation.pagination |
Page navigation controls |
navigation.sidebar |
Collapsible sidebar |
navigation.sidebar-tree |
Nested sidebar menu |
layout.app |
Full page layout with slots |
layout.auth |
Auth page layout |
navigation.tabs |
Tab switcher (inline content) |
Type 3 — Interactive remote (Alpine + Axios)
Receive a load-url or action prop. Call plain Laravel controllers returning JSON.
| Component | Usage |
|---|---|
display.data-table |
Paginated, sortable, filterable table |
form.filter |
Filter bar for data-table |
form.select |
Select with remote search |
import.spreadsheet |
Excel/CSV chunked import |
sections.auto-form |
Declarative form from schema array |
sections.tabs |
Tabs with lazy-loaded content |
sections.wizard |
Multi-step form with localStorage resume |
Usage examples
Static badge
KPI stat card
Node graph (Type 2)
Renders a tree of simulation/workflow nodes with per-event color coding and a detail modal. Each node is an array with id, parent (null for roots), label, status, events[], and optional meta{}.
Event badge colours: end → green, abort → amber, fail → red, no termination → ghost. Accumulator events show acc_value inline. Click any node dot or event badge to open the detail modal.
Data table (Type 3)
Toolbar links — export, print, anything
The toolbar prop adds header links that carry the table's current state (page, search,
sort, active filters) to a URL of your choosing:
The component is deliberately format agnostic — it knows nothing about spreadsheets, CSV or
PDF. It hands the state over and the URL decides what to build, so a second format is a second
array entry, not a change here. Each item takes label, url, an optional icon (a full
blade-heroicons component name) and an optional download (defaults to true; set it to
false for a link meant to open in the page, like a printable view).
Your endpoint receives the same query params as load-url, so build the query in one place
and let both the JSON endpoint and the export use it — otherwise the file people download stops
matching what they were looking at.
Declarative form (Type 3)
Repeater field (Type 2)
Each field definition is keyed by key (not name):
The repeater dispatches dbl-repeater-change ({ name, rows }) whenever the rows change, so a
parent can react without reaching into its Alpine scope:
decimal — the field type for localised numbers
<input type="number"> is the wrong element wherever the decimal separator is not a dot. When the
browser cannot parse what was typed it sanitises value to the empty string, so 0,5 reaches the
server as nothing at all — and which browsers do this in which locale is inconsistent, which is
worse than failing outright.
'type' => 'decimal' renders type="text" inputmode="decimal": the numeric keypad still comes up
on mobile, the text arrives intact, and the backend parses it in its own locale.
default — what a new row starts from
Field definitions take default, and it applies to the first row and to every row add()
creates. A default that only reaches the first row is a default the user stops seeing the moment
they add a second one:
attrs — raw HTML attributes
Schema-driven components take arrays, so there is no attribute bag to merge into. attrs is the
array equivalent, available on form.repeater fields and form.fields:
Values are escaped. Attribute names are validated, and on* handlers are refused — event handlers
go through events, which is explicit about executing code.
events — Alpine bindings, per target
events maps a target element to Alpine bindings, merged over the component's own defaults. The
path is the binding spec and the leaf is the expression:
Targets are root, row, add and remove. In scope: rows, add(), remove(index),
notify() — plus index inside a row.
Dotted keys mean the same thing, so a binding can be pasted straight out of the Alpine docs:
The nesting is what makes overriding work. A leaf replaces the branch below it, so passing
['keydown' => ['enter' => 'mine()']] over a default of keydown.enter.prevent leaves one
binding — yours. With flat keys the two would be different keys, both would survive, and both would
fire. Declaring the same binding twice, or a handler and modifiers on the same node, throws.
To extend a default rather than replace it, call it: ['add' => ['click' => 'add(); mine()']].
eventsleaves are executable by design. They are for expressions written by the developer, never for values arriving from outside the application.
Key-value editor (Type 2)
Renders a table of key/value rows with an auto-inferring type selector (num/str/bool/{…}). Serialises to a hidden <input> as JSON.
value accepts a PHP associative array. Types are inferred automatically when the user types; the selector lets them override if needed.
List editor (Type 2)
Chip/tag input for an array of strings. Enter or comma adds a chip; Backspace removes the last one.
Multi-step wizard with localStorage resume
If the user refreshes mid-wizard, their progress is automatically restored from localStorage. The storage key is versioned (product-onboarding_{userId}_v2), so changing schema-version invalidates stale state.
App layout
JSON response contract
All Type 3 components expect controllers to return JSON following this contract:
Laravel's response()->json() + standard validation exceptions handle this automatically if you let them.
Publishing views
To customise any component, publish the views:
Published views in resources/views/vendor/daisyblade/ take precedence over package views. Edit freely — your customisations survive package updates.
Testing
188 tests, 294 assertions. All green.
License
MIT — Eduardo de Vicente / Microvalencia Soluciones Informáticas S.L.
All versions of daisyblade with dependencies
illuminate/support Version ^11.0|^12.0|^13.0
blade-ui-kit/blade-heroicons Version ^2.4