Repository navigation
Releases: shipbytes/laravel-ui-kit
Release list
v0.5.2
Fixed
- An unknown nav icon no longer takes down the admin. An
iconin
config/admin.phpthat is not a Heroicons v2 name (a 0.3 app'sgrid, a
typo) threwUnable to locate a class or view for component [heroicon-o-grid],
so every admin page was a 500, including the one where you would fix it. The
sidebar, the phone bar and the More sheet now draw a question-mark icon for
that entry and the rest of the page works. The log gets one warning per request
per name,blade-ui: icon "grid" not found, rendered "question-mark-circle", and
php artisan ui-kit:doctorfails thenav icons are Heroiconsrow naming the
entry (Dashboard => grid) and its v2 name. The sidebar is a published view,
so an existing app picks this up by addingfallback="question-mark-circle"to
the threeds::iconcalls that take$item['icon']in
resources/views/layouts/admin-sidebar.blade.php, or by republishing the core
views (php artisan vendor:publish --tag=ui-kit-views --force, which
overwrites every published core view, so commit first).
Changed
- Requires
shipbytes/blade-ui^1.3, whoseds::icongained the opt-in
fallbackused above. The doctor's nav icon check now asks the design system
(Icons::exists()) instead of looking for svg files, so it resolves aliases
and variants exactly as the sidebar does.
v0.5.1
Fixed
- A changelog entry dated today now shows on
/changelogon SQLite.
ChangelogEntry::published()comparedpublished_atwith today's date as
strings, and the date cast stores2026-10-23 00:00:00, which SQLite (Laravel
12's default database) ranks after2026-10-23. Every entry dated today stayed
hidden until the next day; MySQL and PostgreSQL were not affected. The scope
now useswhereDate. An app on 0.5.0 picks it up by republishing the model
(php artisan ui-kit:install-module changelog, which overwrites the module's
published files, so commit first) or by changingwhere('published_at', …)to
whereDate('published_at', …)inapp/Models/ChangelogEntry.php.
v0.5.0
The user-facing halves of three modules. Until now support-tickets, contacts
and changelog shipped only their admin screens: the ticket queue had no way for
a user to open a ticket, the inbox's reply was saved and never sent, and the
changelog had no reader. Each now has its public or signed-in pages, the mail
that connects the two sides, and doctor rows for what the installer promises.
New routes make it a minor release: "Upgrading from 0.4" at the end has the steps.
Breaking
- Five new routes.
support-ticketsadds/support,/support/createand
/support/{ulid}for signed-in users (support.index,support.create,
support.show);contactsadds/contact(contact) andchangelogadds
/changelog(changelog.public), both open to guests. An app that already
has a route at one of those paths ends up with two, and only one answers:
rename the kit's path inroutes/ui-kit-user.phpand keep its route name,
which the kit's links use. A colliding route name fails the doctor's
no duplicate route namesrow, androute:cache. routes/ui-kit-user.phphas a second group. ARoute::middleware(['web'])
group between/* ui-kit:public-routes-start */and/* ui-kit:public-routes-end */
markers sits above the web + auth one, and modules patch it through the new
public_routesregistry key. The installer never overwrites the file without
--force, so an upgraded app keeps its 0.4 copy: the installer then warns that
it skipped/contactand/changelog, and the doctor's
routes/ui-kit-user.php has the public-routes blockrow fails with the fix.- Support and contacts send mail. A ticket, a reply, a status change and a
contact message now each mail someone (see Added). If you wired mail of your
own after the 0.4 post-install notes, remove it or each one goes out twice.
Added
- Support tickets for users.
/supportlists the signed-in user's own
tickets with a status filter (kept in the query string), status and priority
badges from the model's tone methods and 15 to a page, and an empty state with
a New ticket button./support/createtakes a subject (up to 255), a category
from the newSupportTicket::categories()and a message of 20 to 5,000
characters, then opens the ticket (priority medium, status open, the IP saved)
with that message as its first reply and goes to it./support/{ulid}shows
the thread with a reply box (2 to 5,000 characters, refused while the ticket is
closed or resolved) and Close / Reopen. Limits: five tickets an hour per user,
ten replies an hour per ticket. The pages render in the user shell. App\Policies\SupportTicketPolicy, published and found by Laravel by
name: the owner or an admin may view and update a ticket, only an admin may
delete one.- Mail, as published stubs. Six mailables in
app/Mail/with markdown views
inresources/views/mail/, on Laravel's stock markdown theme with no kit
branding:NewTicketMail(to the admins, reply-to the user, linking the admin
page),TicketReplyMail(both directions;toAdminpicks the readers and the
link),TicketStatusChangedMail(to the owner, old to new),
ContactSubmittedMail(to the admins, reply-to the sender),
ContactConfirmationMail(to the sender, with a copy) andContactReplyMail
("Re: …", the reply above the quoted message). They implementShouldQueueon
the default queue, soQUEUE_CONNECTION=syncsends them during the request.
Every send happens after the row is saved, inside a try/catch that logs
ui-kit: could not send <class>, so a mail that fails never fails the form. - A public contact form at
/contact: name, email, a subject from
ui-kit.contacts.subjects(five neutral labels in the published config), and a
message of 10 to 5,000 characters; a signed-in user's name and email are filled
in. Three messages an hour per IP. It saves the message with the sender's IP,
mails the admins and the sender, and shows a thank-you with a Send another
button. - A public changelog at
/changelog: published entries, newest first, grouped
by month, each with its category badge and its body. The category filter is a
row of links (ds::tabsin navigation mode) with per-category counts from one
query, kept in the query string.ChangelogEntry::categories()lists the
categories. - The user shell works signed out. Guests see Sign in, and Register when the
route exists, in place of the avatar and Log out. Support (signed in) and
Changelog links appear when their routes exist, the way Profile does, marked
aria-currenton their own pages, and wrap onto a second row on a phone. UiKit::admins(): who gets admin mail. The Spatieadminrole when the
User model hashasRole(), elseis_admin;ui-kit.mail.admin_addresses
(UI_KIT_ADMIN_ADDRESSES, comma-separated) replaces that list when set.UiKit::sendMail($recipients, $mailable): one message per recipient, never
throws, returns the first failure for the screen to report.WithSpamProtectionand<x-ui-kit::honeypot />, shared by the contact
and new-ticket forms and usable on forms of your own: a honeypot field
(website, visually hidden,tabindex="-1",autocomplete="off") that fakes
success without saving, andpassesRateLimit(), which counts an attempt only
after validation has passed.- Registry keys
public_routes(patched likeuser_routes, idempotent by
route name, re-applied in update mode) andmail(mailable => view). - Doctor rows:
routes/ui-kit-user.php publishedand its auto-load row,
routes/ui-kit-user.php has the public-routes block(fails only once an
installed module needs it),<module> routes registeredfor every installed
module's admin, user and public routes,<module> mail views publishedfor
support-ticketsandcontacts, andsupport ticket policy published. - The fresh-app CI job smoke-tests
/contact,/changelogand the guest
redirect from/support.
Changed
- The admin ticket screen mails the owner. A reply sends
TicketReplyMail
linking the user's own ticket page and says "Reply sent to …"; a status change
sendsTicketStatusChangedMail. When the mail fails, the screen says the reply
or the status was saved and the email was not. - The inbox reply is sent.
ContactList@submitReplysendsContactReplyMail
and says "Reply sent to …", or "Reply saved, but the email failed: …". - The admin ticket list's category filter reads
SupportTicket::categories(). - The installer copies a module's
Mail/andPolicies/stubs intoapp/. - Post-install notes: the changelog's "optional public feed", the contacts
module's "wire up a public contact form" and "plug in your own ContactReply",
and support-tickets' "ships without Mailables" are gone; both mailing modules
note the queue worker andMAIL_FROM_ADDRESSinstead. Module summaries in
ui-kit:list-modulesdescribe both halves.
Fixed
- A ticket's conversation keeps its order.
SupportTicket::replies()sorted
bycreated_atalone, so two messages written in the same second could show in
either order, on the admin page too. The id now breaks the tie.
Upgrading from 0.4
composer require shipbytes/laravel-ui-kit:^0.5.- Commit first, then re-run the installer in update mode with every installed
module:php artisan ui-kit:install --force --modules=…(the names
ui-kit:list-modulesshows). It republishesroutes/ui-kit-user.phpwith the
public-routes block and patches the modules' lines back in, and publishes the
new components, mailables, views and policy. As before,--forceoverwrites
config/admin.phpandconfig/ui-kit.php, so readgit diffand restore
your own nav entries and values. (Without--force, add
Route::middleware(['web'])->group(function () { /* ui-kit:public-routes-start */ /* ui-kit:public-routes-end */ });
above the auth group inroutes/ui-kit-user.phpyourself and run
php artisan ui-kit:install-module support-tickets contacts changelog, which
re-copies those modules' files.) npm run build.- Set
MAIL_FROM_ADDRESSin.env, and runphp artisan queue:workunless
QUEUE_CONNECTION=sync. Optionally setUI_KIT_ADMIN_ADDRESSESto send
admin mail to a shared mailbox. php artisan ui-kit:doctor. Every row should pass, or skip with a reason.
v0.4.1
A hardening release: no breaking changes. The installer closes five Fortify
endpoints that answered with a 500, keeps a user's two-factor secrets out of
its JSON, and several things that were README instructions now happen on their
own. "Upgrading from 0.4.0" at the end of this entry has the steps.
Security
- Fortify's endpoints the kit does not own are switched off.
views => falseonly removed Fortify's GET pages; it still registeredPOST /register,
POST /forgot-password,POST /reset-password,PUT /user/profile-information
andPUT /user/password. Each resolves an action class (CreatesNewUsers
and friends) that no kit app binds, so each answered with a 500, and an app
that did bindCreatesNewUsersgot a second registration path that skipped
the kit's disposable-email rule and its limiter. The installer now comments
outFeatures::registration(),resetPasswords(),updateProfileInformation()
andupdatePasswords()inconfig/fortify.php(the kit's own pages do all
five jobs) and leavesemailVerification()alone. The patch is idempotent
and lint-checked, and update mode applies it to an existing install. - The two-factor columns are hidden on the User model. The profile module
addsTwoFactorAuthenticatableto the model but never hid its columns, so
toArray()and the JSON of any user carried the encrypted
two_factor_secretandtwo_factor_recovery_codes. The installer adds both
to the model's$hidden, whether that is aprotected $hiddenarray (the
Laravel 12 skeleton), a#[Hidden([...])]attribute (Laravel 13), or
missing. A model that already lists them is left alone, and the result is
lint-checked like the trait patch.
Fixed
- Fortify's
POST /loginno longer 500s for a two-factor user. It
redirects such a user to the routetwo-factor.login, which did not exist:
the kit's page istwo-factor.challenge.routes/auth.phpadds
two-factor.loginas a redirect to the kit's page, which now also accepts
the login Fortify staged in the session (login.id,login.remember), so
that sign-in completes.route('two-factor.challenge')is unchanged. - The installer no longer leaves passkeys on. Fortify's published config
spreadsFeatures::passkeys([...])over three lines, which the 0.4.0 patch
never matched. Each disabled feature's whole call is now commented out. - The profile page's two-factor card honours
confirmPassword. Fortify's
published config sets it, but the card called the actions directly, so
enabling, disabling, showing and regenerating recovery codes never asked for
the password. Without a confirmation insideauth.password_timeout, those
actions now go to the confirm-password page, which returns to the profile. - A failed registration no longer uses up the hourly limit. The register
page counted every submit against its ten per IP per hour before validating,
so a few typos locked the address out. Only a successful registration counts
now. - The 2FA challenge reads secrets with Fortify's encrypter
(Fortify::currentEncrypter()), so an app that set its own with
Fortify::encryptUsing()can sign in. - A failed login fires
Illuminate\Auth\Events\Failed. The login form
checks credentials withvalidate(), which fires no event, so listeners and
audit logs never saw a failed login. - Registering regenerates the session, as signing in already did.
- Avatars are stored under a random 40-character name, not the user's id,
which made every photo on the public disk guessable. The old file is still
deleted on replace, and deleting an account now deletes its photo too. ui-kit:doctorreports correctly when called twice in one process. It
kept the first run's rows and its failure.
Added
- Sidebar badges work without code.
ModuleRegistryhas always declared
theopen_ticketsandunread_contactsbadges, but bound a resolver that
returned nothing. The new default,Shipbytes\UiKit\Support\DefaultBadgeResolver,
countsSupportTicket::open()andContactSubmission::unread()(new scope:
unread and not archived) when those models exist, once per request. A count
that fails, such as a table not yet migrated, is left out instead of failing
every admin page. An app that binds its ownSidebarBadgeResolverstill wins. - The phone bottom bar shows the badges, through the new
badgeprop on
ds::bottom-nav-item. Requiresshipbytes/blade-ui^1.2.3, which caps the
pill at "9+" and reads the full count to screen readers. - The phone "More" sheet ends with Profile (when the profile module is
installed), Back to site and Log out, which a phone could not reach before.
The user shell gains a Profile link (the user's avatar) beside Log out. - Avatars appear across the shells. The generated
UiKitUsertrait gains
avatarUrl(): ?stringwhen the profile module is installed, and the admin
rail, the user list, the user detail page and the user shell show it.
UiKit::avatarUrl($user)returns null without the module, so those views
fall back to initials. - Admin user screens. The user list and detail show an "Admin" badge
(UiKit::isAdmin($user): the Spatieadminrole or theis_admincolumn,
the same test as the user shell). The detail page has a Delete user button,
which the server refuses for admins and for yourself. - The impersonation button is wired in. The user detail page includes
partials.impersonation-buttonwhen it exists, so the README's "add this
line yourself" step is gone. - Resending the verification email is throttled to six a minute per user,
shared between the verify-email page and the profile page, with a message
when the limit is hit. - The register page checks names against letters, spaces, apostrophes,
hyphens and full stops, with a plain message. - Doctor rows:
fortify features limited to two-factor,
two-factor.login route registered,two-factor columns hidden on the User model,sidebar badges resolve,impersonation button wired(with the
impersonation module) andtrusted proxies configured. The last passes when
bootstrap/app.phpcallstrustProxies(, is a skip outside production and
fails in production. Behind an untrusted proxy every visitor shares one IP,
so ten registrations an hour lock out everyone. - Behaviour tests for every auth page (login, register, password reset,
email verification, confirm password, the 2FA challenge), the profile's 2FA
card and avatar, the admin user screens, the shell and the admin ticket
screen: 133 tests, up from 68.
Upgrading from 0.4.0
composer update shipbytes/laravel-ui-kit -W(-Wlets Composer take
shipbytes/blade-uito 1.2.3).- Commit first, then either:
- re-run the installer in update mode with every installed module:
php artisan ui-kit:install --force --modules=…(the names
ui-kit:list-modulesshows). This applies the two security patches and
republishes the changed stubs. As in 0.4.0,--forceoverwrites
config/admin.phpandconfig/ui-kit.php, so readgit diffand
restore your own nav entries and values; or - without
--force, which keeps every file you own and still applies both
security patches (they editconfig/fortify.phpandapp/Models/User.php
in place), then follow the doctor's hints for the rest: the
two-factor.loginroute line inroutes/auth.phpand the impersonation
include on the user detail page.
- re-run the installer in update mode with every installed module:
npm run build.php artisan ui-kit:doctor. Every row should pass, or skip with a reason.
v0.4.0
0.4.0 moves the kit onto the Shipbytes design system (shipbytes/blade-ui).
The layouts, the shared components, the seven auth pages, the profile page and
the nine admin screens are all built from its ds:: components and semantic
tokens; the kit no longer carries a palette, fonts or components of its own.
Every route, route name, wire:model, Livewire method, validation message and
config('ui-kit.copy.*') string is unchanged. What changes is every file the
kit publishes, so an app on 0.3 has to merge: "Upgrading from 0.3" at the
end of this entry lists the steps.
Breaking
- Requires
shipbytes/blade-ui^1.2.2, which Composer installs with the
kit. The design system's contract with an app is three lines of CSS: import
itstokens.css, import itstheme.css, and@sourceits views so Tailwind
keeps the classes its components use. The published
resources/css/ui-kit.csscarries all three, soapp.cssstill imports only
./ui-kit.css. Without the@sourceline everyds::component renders as
unstyled HTML and nothing reports an error. resources/css/ui-kit-theme.cssis gone, and with it thebrand-*
colour ramp and the Poppins (font-boldtext) and Montserrat
(font-booktext) font utilities. The accent is the design system's blue and
the one font is its Inter, which the kit's three layouts load from
fonts.bunny.net. Classes such asbg-brand-600orfont-boldtextin an
app's own views no longer exist. Brand colours are now--ds-*token
overrides inapp.css, after theui-kit.cssimport
(:root { --ds-accent: … }, and.dark { … }for the dark value).- Every published view, and the admin Livewire classes and module models,
are rewritten. The layouts,<x-theme-toggle />, the session status
message, the impersonation ribbon and button, the auth pages, the profile
page and the nine admin screens useds::components and tokens
(bg-surface,text-fg-muted,border-border, …) that switch for dark mode
on their own, with no palette classes ordark:variants. The five
paginating admin components use the new pagination trait (below);
SupportTicket,ContactSubmissionandChangelogEntrygain badge-tone
methods. An app that edited any of these files must merge its edits into
the new ones; re-publishing with--forceand readinggit diffis the
way to do it. - Nav icons are Heroicons v2 names, rendered through
ds::icon, so any
outline icon on heroicons.com works as aniconin
config/admin.php. The kit's own entries are nowsquares-2x2(Dashboard),
users,ticket(Support),document-text(Changelog),envelope
(Contacts) andclock(Activity). Of the 0.3 names,grid,note,chart
andhistoryno longer resolve (usesquares-2x2,document-text,
chart-bar,clock);mailstill works through a design-system alias of
envelope;users,ticket,clockanduser-circleare unchanged. A
name that does not resolve makes every admin page fail withUnable to locate a class or view for component [heroicon-o-…], because the sidebar
renders on every page;ui-kit:doctornames each one. The
layouts/partials/nav-iconspartial and its hand-drawn SVGs are gone. ui-kit.cssnow carries two@sourcelines: the design system's views,
and the kit's own package views invendor/(<x-ui-kit::page-header>and
friends), which are not published either. A 0.3ui-kit.csshas neither.- The installer deletes the Laravel 12 skeleton's Instrument Sans. The
skeleton'sapp.cssends with an@themeblock setting--font-sansto
'Instrument Sans'. It comes after the kit's import, so it beat the design
system's Inter, and since nothing loads Instrument Sans the app rendered in
the system font.ui-kit:install(including a re-run on an existing app)
now deletes that one declaration, and the@themeblock if nothing else is
in it. A font the app chose for itself is left alone. - Admin lists paginate through
Shipbytes\UiKit\Livewire\Concerns\WithDesignSystemPagination. The five
paginating admin components (users, tickets, contacts, changelog, activity)
use it in place of Livewire'sWithPagination, so their pages render with
the design system's Livewire pagination.ui-kit:doctorfails while a
published admin component is still on plainWithPagination.
Added
WithDesignSystemPagination, for an app's own Livewire lists too. It
includesWithPagination; the design system's pagination view calls
gotoPage,previousPageandnextPage, so a page change is a Livewire
update that keeps the component's search and filters. A component that
definespaginationView()orpaginationSimpleView()itself keeps its own:
a class method wins over the trait's.<x-ui-kit::page-header title="…" subtitle="…">, a package component
with an optionalactionsslot that sits right of the title and wraps under
it on a phone. Every admin screen opens with it, and an app's own admin
screens can too.- Doctor rows for the design system, each with a hint that says how to fix
it:design system installed,ui-kit.css imports the design system,
ui-kit.css scans the kit's own views,no leftover ui-kit-theme.css,
app.css does not override the design system font(skipped, with a
reminder to load the font, when the app sets a font of its own there),
nav icons are Heroicons(it lists eachlabel => iconthat doesn't
resolve) andadmin lists paginate with the design system(it names each
published admin component still on plainWithPagination). StubStyleTest: the suite fails when any published view uses a raw palette
class, adark:variant, an inline<svg>or a raw form control instead of
the design system, or a published stylesheet setsaccent-color. It reads
every stub; there is no allowlist.
Changed
- The theme follows the OS until the user picks one. With nothing stored,
the theme store and the no-flash snippet take the initial theme from
prefers-color-scheme(in 0.3 it was always light), and the toggle stores
an explicit choice. Both set exactly one oflight/darkon<html>:
the design system's tokens follow the OS whenever neither class is present,
so a dark-OS user who chose light would otherwise have got dark tokens. - The profile page. The avatar field is a drop zone: the photo shows as a
roundds::avatar(initials when there is none) beside ads::file-upload
labelled "Profile photo", with Save photo, Cancel and Remove under it; the
hover overlay on the old square thumbnail is gone. Account deletion confirms
inds::modal, opened by Alpine state on the form (confirmingDeletion)
instead of theopen-modalwindow event; it stays open with the error shown
after a wrong password and closes with Cancel, the backdrop or Escape. The
two-factor confirm form shows Fortify's "invalid code" message under the
code field rather than below the buttons. - The nine admin screens. Each opens with the page header. Lists are
ds::tablewithds::badgestatuses, ads::empty-staterow when nothing
matches, and the design system's pagination. Filters are selects and a
search field with an icon, and the activity log's filters have visible
labels. The dashboard and the ticket and contact counts are
ds::stat-tiles; flash messages areds::alert. Rows link through a View
(or Open) button in a trailing column, withwire:navigate; the design
system has no whole-row link. In particular:- The ticket list is a table (Subject, From, Status, Priority, Category,
Updated) instead of a list of cards; on a ticket, the Status and Priority
selects share one panel with visible labels. - Contact messages are a table with a select column: each row has a
checkbox labelled "Select" plus the subject for screen readers, the header
has "Select all", and the bulk bar (Mark read, Mark unread, Archive,
Delete) appears when anything is selected. A message opens inds::modal,
driven by the component'sshowModalthrough$wire.entangle(); closing
it with the ✕, the backdrop or Escape callscloseModal()on the server
as the old close button did. - The changelog's Published toggle is
ds::switchbound withwire:model,
saved with the form like every other field, with a line under it saying
so. The old toggle saved nothing on its own either, but looked as if it
did. - The activity log drops its Log column: the log name is a small outline
badge under the event. - Badge tones come from one method per concept on the model:
SupportTicket::statusTone()andpriorityTone(),
ContactSubmission::statusTone(),ChangelogEntry::categoryTone().
- The ticket list is a table (Subject, From, Status, Priority, Category,
- The phone's "More" menu in the admin shell is the design system's bottom
sheet. - The design-system releases behind 1.2.2 fix and add what these screens need:
tone="danger"on ghost and secondary buttons (the avatar's Remove is a
quiet red ghost button), a readonly look fords::input(the
reset-password email looks fixed instead of editable),hideLabelon
ds::checkbox(the contact list's select column), and awire:model
field's id that stays the same from one render to the next, so a live
search keeps focus and keeps what was typed after the first response.
Fixed
- A profile photo never saved on a standard app. The profile module wrote
the file to the public disk and then setavatar_pathwithupdate(),
which a stockUsermodel (whose$fillableis name, email and password)
silently ignores, so the page went straight back to the initials. Remove
had the same bug. Both now useforceFill(). This dates from 0.1; existing
apps need the new profile view. - Dark mode switched off after any
wire:navigatepage change, including
the redirect from the l...
v0.3.0
Changed
-
Breaking: Livewire 4. The kit now requires
livewire/livewire: ^4.4and
no longer uses Volt. The eleven auth and profile pages stay single-file
components at the same paths underresources/views/livewire/…(no ⚡
prefix), now extendingLivewire\Component;routes/auth.phpregisters them
withRoute::livewire()instead ofVolt::route(), with unchanged URLs and
route names. Nothing changes visually. To upgrade a 0.2 app:- If the app's own
composer.jsonrequireslivewire/volt(it normally
arrives through the kit), runcomposer remove livewire/volt --no-update. composer require shipbytes/laravel-ui-kit:^0.3 -W— a^0.2
constraint never picks up 0.3, and-Wlets Composer move Livewire 3 to 4
and drop Volt.- In
routes/auth.php, replaceVolt::route(withRoute::livewire(and
delete theuse Livewire\Volt\Volt;line. - In
resources/views/livewire/**, replaceuse Livewire\Volt\Component;
withuse Livewire\Component;. - If the app has a
VoltServiceProvider, remove it from
bootstrap/providers.phpand deleteapp/Providers/VoltServiceProvider.php. php artisan ui-kit:doctor— every row should pass.
Until steps 3–5 are done the app keeps working through the shim below.
- If the app's own
Added
ui-kit:doctorchecks for the Livewire 4 move:Livewire 4 installed,
routes/auth.php uses Route::livewire,views free of Volt imports(lists
the views underresources/views/livewire/that still import Volt) and
no Volt service provider, each with the repair step as its hint.- A transition shim for apps upgrading from 0.2: when Volt is not installed,
the kit aliasesLivewire\Volt\Volt(route(),mount()) and
Livewire\Volt\Componentonto their Livewire 4 equivalents, so an
unmigratedroutes/auth.phpand its views keep working (and artisan keeps
booting) until the steps above are done. It will be removed in 1.0.
Removed
- The
livewire/voltdependency.
v0.2.2
Added
- Documentation screenshots.
npm run screenshots(scripts/screenshots.mjs)
builds a fresh Laravel 12 app with every module, seeds it deterministically
and photographs each screen in light and dark mode intodocs/images/,
which shipbytes.dev copies at build time.
Fixed
- The impersonation module registers its routes.
lab404/laravel-impersonate
shipsimpersonateandimpersonate.leaveas a router macro the app has to
call; the module now injectsRoute::impersonate();into
routes/ui-kit-user.php(web + auth) at install, so the partials no longer
fail withRoute [impersonate] not definedon a fresh install.ui-kit:doctor
gained animpersonation routes registeredcheck. Apps that added the macro
toroutes/web.phpby hand should remove that line after re-running
ui-kit:install-module impersonation, or the doctor reports duplicate names. ContactSubmissionnow usesHasFactory, soContactSubmission::factory()
works as the README promised.
Full changelog: v0.2.1...v0.2.2