Weave Code
Code Weaver
Helps Laravel developers discover, compare, and choose open-source packages. See popularity, security, maintainers, and scores at a glance to make better decisions.
Feedback
Share your thoughts, report bugs, or suggest improvements.
Subject
Message

Blatui Laravel Package

anousss007/blatui

BlatUI brings shadcn/ui-style, WCAG AA accessible components to the BLAT stack (Blade, Laravel, Alpine, Tailwind). A CLI copies fully themeable, light/dark UI components, blocks, and charts directly into your app so you own and customize the code.

View on GitHub
Deep Wiki
Context7
v1.24.2

Fixed

  • mini-cart and notification-center could push a 320px page sideways. Both panels are w-80 — exactly 320px — so on the narrowest phones they were wider than the viewport once positioned, and the whole page scrolled horizontally. Capped at calc(100vw - 1rem).

Found by a new test layer rather than by a user, which is the point of it.

Testing

Two suites added on top of the five that already drive every component in a real Chromium at every breakpoint:

  • layout — invariants that need no baseline: the page must not scroll sideways, no component may be squashed to a zero dimension, nothing may be stranded off-screen, no text may spill its box. 6,864 checks. Four components still size themselves from their content and overflow a 320px viewport (tabs, navigation-menu, dock, data-table), as upstream shadcn/ui does — they are listed in the suite and printed on every run rather than hidden, and enforced normally from 375px up.
  • visual — a 256-bit perceptual fingerprint of every example block, per component, per width, against a committed baseline of 5,929 entries (518 KB of hashes, not thousands of PNGs). Catches a padding that collapsed, a colour that inverted, a grid that reflowed. The threshold is measured: two runs of the same page differ by 0 bits, the noisiest real case by 5, a 4px padding change by 14.

23,508 checks across seven suites and eleven widths, verified to reproduce bit-for-bit between a laptop and a CI runner.

Full Changelog: https://github.com/anousss007/blatui/compare/v1.24.1...v1.24.2

v1.24.1

Fixed

  • mobileBreakpoint did not actually move the breakpoint (#17, reported by [@cmdevpe](https://github.com/cmdevpe)). 1.24.0 wired the prop to isMobile — which decides what the trigger toggles — but the two panels are painted by CSS, and that was still three static md: classes pinned to 768px. With mobile-breakpoint="1023px" at 900px the trigger flipped openMobile and nothing appeared: the JS said mobile while the CSS kept the rail docked and the drawer hidden.

    The md: classes stay as the no-JS default, so the docked rail still paints with the page instead of popping in after Alpine boots; isMobile overrides them only when the two disagree — which is exactly what a breakpoint other than md means. The drawer is now gated on isMobile itself, so dragging a window past the breakpoint while it is open closes it rather than leaving it floating over the docked rail.

If you set mobile-breakpoint in 1.24.0, it did nothing for any value that would have changed anything. Update.

Full Changelog: https://github.com/anousss007/blatui/compare/v1.24.0...v1.24.1

v1.24.0

Fixed

  • The mobile sidebar drawer never appeared (#16, reported by [@cmdevpe](https://github.com/cmdevpe)). On a viewport below md, tapping <x-ui.sidebar-trigger> dimmed the page and showed nothing. Regression introduced in 1.21.0 — if your app has a mobile sidebar, update.

    twMerge() writes the merged class back into the attribute bag it is called on rather than returning a copy, and sidebar renders a desktop root and a teleported mobile panel from that same bag — so the desktop root's hidden md:block leaked onto the mobile panel and made it display: none below md. The root branches now merge into a copy. Verified in a real browser: the drawer slides in, traps focus, and closes on Escape.

Added

  • mobileBreakpoint on sidebar-provider. The off-canvas drawer was hardwired to (max-width: 767px), so at tablet widths the sidebar could only collapse to the icon rail, never hide:

    <x-ui.sidebar-provider mobile-breakpoint="1023px">
    

    A bare number is read as px; anything else is passed to matchMedia as written. Default unchanged.

Full notes in the CHANGELOG.

Full Changelog: https://github.com/anousss007/blatui/compare/v1.23.0...v1.24.0

v1.23.0

Reported by [@cmdevpe](https://github.com/cmdevpe) (#15) — three gaps that only surface together, once a collapsed sidebar has enough items to scroll.

Added

  • tooltip on sidebar-menu-button. Collapsed to the icon rail a button shows nothing but its icon:

    <x-ui.sidebar-menu-button tooltip="Inbox" href="/inbox">
        <x-lucide-inbox /><span>Inbox</span>
    </x-ui.sidebar-menu-button>
    

    Opt-in per button as in shadcn/ui, shown only while the rail is collapsed on desktop. The nav-main / nav-secondary blocks now pass it, so sidebar-07 demonstrates it. It is a visual affordance: the label <span> stays in the DOM when the button shrinks, so the accessible name never depended on it.

  • state on tooltip-content — the Alpine expression driving visibility, for tooltips living in a scope where open already means something else.

Fixed

  • The collapsed sidebar can be scrolled again. sidebar-content clipped both axes on the icon rail, making the last menu groups unreachable. Its scrollbar is hidden rather than given room, so the rail keeps its width and the size-8 buttons stop being squeezed against the track.
  • collapsed is safe to read from nested Alpine scopes — a plain property synced with x-effect rather than a getter, whose this Alpine resolves against the reading scope.

Full notes in the CHANGELOG.

Full Changelog: https://github.com/anousss007/blatui/compare/v1.22.0...v1.23.0

v1.22.0

Both items come from [@cmdevpe](https://github.com/cmdevpe) running 1.21.0 against a real 181-file install — thanks.

Added

  • blatui:update --ignore-whitespace (#11). If your project runs Pint or Prettier over resources/views, the formatter has rewritten the layout of every component you copied, and all of them read as changed — 21 of 31 in the first real-world run. Those are now counted separately as same content, reformatted, and the flag treats them as up to date.

    php artisan blatui:update --dry-run --ignore-whitespace
    

    The default stays byte-exact. The flag forgives layout only: reordered Tailwind classes or flipped quotes still read as drift, because nothing tells them apart from a real edit.

Changed

  • Geometry that was hardcoded in rem now tracks --spacing (#14) — the switch track height, the calendar day-cell size and both sidebar-provider widths. Identical at Tailwind's default --spacing: .25rem, so nothing moves unless you change the spacing scale.

Full notes in the CHANGELOG.

Full Changelog: https://github.com/anousss007/blatui/compare/v1.21.0...v1.22.0

v1.21.0

Added

  • blatui:update — an update path for the components you already own. It diffs every installed file against the version this release ships and asks before touching anything that differs. --dry-run, --diff, --force, --no-backup; your copy is kept as .bak.

    php artisan blatui:update --dry-run --diff
    
  • closeOnOverlay on dialog-content, sheet-content and drawer-content — a static backdrop for modals that shouldn't be discarded by a stray outside click. Escape and the close button stay wired.

  • The theme editor's Copy CSS now exports the status palette (--success/--warning/--info), --font-heading and the progress-indeterminate animation, which a pasted theme used to lose silently.

Fixed

  • sonner emitted two class attributes, so classes you passed were dropped by the browser.
  • <x-ui.sidebar> discarded its whole attribute bag (class, id, Alpine bindings) in the collapsible branch.
  • A bundled block dependency of a remote registry item landed in components/ui.
  • The MCP server reported its version as dev.

Full notes in the CHANGELOG.

Full Changelog: https://github.com/anousss007/blatui/compare/v1.20.0...v1.21.0

v1.17.1

Fixed

  • qr-code scaling. The SVG bound its viewBox via a plain :viewBox, which the HTML parser lowercases to viewbox — silently ignored since SVG's viewBox is case-sensitive. With no valid viewBox the code rendered at ~1px per module instead of filling size. Now bound with Alpine's .camel modifier (:view-box.camel="viewBox") so it scales to any size, crisp and scannable. Thanks @afiqiqmal for the diagnosis (#9).

Full Changelog: https://github.com/anousss007/blatui/compare/v1.17.0...v1.17.1

v1.15.0

Livewire support — wire:model on every form control

BlatUI components are Blade + Alpine, so they already render inside Livewire. This release wires wire:model through to their value with full two-way binding:

  • Native fields (input, textarea, native select/checkbox) bind directly.
  • Alpine widgets entangle their state via [@entangle](https://github.com/entangle)($attributes->wire('model'))select, combobox, autocomplete, switch, toggle, toggle-group, radio-group, checkbox, slider, rating, knob, number-input, color-picker, date-picker, datetime-picker, time-field, input-otp, tags-input, editable, markdown-editor.
  • Composites forward wire:model to their real input — file-upload (upload target), phone-input, segmented-control, mention-input, rich-text-editor, signature-pad.
  • Respects .live / .blur / .debounce. Fully inert when Livewire isn't installed — plain Blade/Alpine projects are unaffected.

📖 Guide: https://blatui.remix-it.com/docs/livewire

New components (Flux Pro parity)

  • brand — logo/wordmark, optionally linked.
  • profile — avatar + name/description, for account buttons and dropdown triggers.

Notes

  • slider / date-picker / datetime-picker bind a single value in default mode; range modes submit via standard name[...] fields.

Full Changelog: https://github.com/anousss007/blatui/compare/v1.14.1...v1.15.0

v1.3.0

Theme-foundation and component enhancements shipped to consumers.

Added

  • button: xs size + icon size scale (icon-xs / icon-sm / icon-lg).
  • Foundations (app.css): 9 base-color presets (added slate + gray), a new input-style dimension ([data-input-style]: outline / fill / inset), a heading font token (--font-heading) decoupled from the body font, and more [data-font] webfont families.
  • Foundations (blatui-core.js): theme store now persists inputStyle + fontHeading and applies the matching data-* attributes.

Install / update: composer require blatui/blatui

Full Changelog: https://github.com/anousss007/blatui/compare/v1.2.0...v1.3.0

v1.0.0

First release of the BlatUI Composer package — install with composer require blatui/blatui.

Commands

  • php artisan blatui:add <component> — copy a component family (+ deps) into resources/views/components/ui
  • php artisan blatui:list [component] — browse the 55 component families
  • php artisan blatui:init — doctor (packages, theme tokens, Alpine bootstrap)
  • php artisan vendor:publish --tag=blatui-foundations — theme CSS + JS engine

Laravel 11 / 12 / 13 · PHP 8.2+ · auto-discovered · MIT.

Demo & docs: https://github.com/anousss007/blat-ui

Full Changelog: https://github.com/anousss007/blatui/commits/v1.0.0

Weaver

How can I help you explore Laravel packages today?

Conversation history is not saved when not logged in.
Prompt
Add packages to context
No packages found.
calmfox/watch-sylius
damienfern/grpc-symfony-bundle
atoolo/index-bundle
atoolo/genai-bundle
coprotoai/laravel-ticket
davidjln/llm-carbon-bundle
cryonighter/valid-request-bundle
coolms/taxonomy-bundle
coolms/field-bundle
articulate-orm/symfony
aaix/laravel-tall-architect
ephoto/akeneo-connector
emmanuelballery/eb-plantumlbundle
emielburgman/symfony-visitor-beacon
emielburgman/symfony-visit-storage
emielburgman/symfony-security-headers
emielburgman/symfony-log-viewer
emarref/xdebug-bundle
emarref/pubnub-bundle
elriseio/finance-money-bundle