Builds on the v3.0.0 shadcn-vue foundation. One PR: #69.
Highlights
Charts moved from ApexCharts to Unovis. Area, Bar, Donut, Line, plus Sparkline and a shared legend. Chart theming now runs on --vis-* tokens, so charts follow light/dark with the rest of the app instead of carrying their own palette.
Search and the command palette are one surface. The header field advertised Cmd+K, but Cmd+K opened the palette — a different overlay searching a superset of the same data. The header is now a trigger for the palette.
The admin UI reflects the permissions the server enforces. Three controllers check per-action permissions with abort_unless, but no page reflected that, so a view-only admin was shown Edit, Delete, Restore and Save and got a 403 on click.
Login-history bulk delete. The permission, middleware and table support already existed; this adds the route, method and wiring.
Breaking
Components/Charts/Apex*.vueare removed. If you referenced them directly, switch to the Unovis equivalents.apexchartsis no longer a dependency.Components/ui/cardis removed, along withTypesense/Search.vueandTypesense/SearchResults.vue.FederatedSearch.vueremains.- A migration drops the
access-dashboardpermission. It duplicatedview-dashboardand gated no route. Runphp artisan migrate. - Laravel Pint is removed. It and
prettier-plugin-phpwere both configured and disagreed; Pint ran in no CI job or composer script.npm run formatnow covers PHP. FormCheckboxlabels are normal weight and the whole row is a click target — app-wide, not just where it was introduced.
Fixes worth calling out
Five routes pointed at controller methods that don't exist and would 500 on contact — Route::resource(...)->except('show') generating create/edit for roles and permissions, plus admin.user.create, api/dashboard/financial-metrics and notifications/expire. A test was concealing one of them by fetching the route, capturing the status and asserting nothing on it.
The command palette declared aria-modal="true" with nothing trapping Tab, and a role="listbox" its input never pointed at, so arrowing through results was silent to a screen reader. Both fixed, along with focus restore on close.
"Select all" in the role picker applied to the whole permission set while showing a filtered one — filter to five, click it, grant thirty including delete and impersonation.
Full Changelog: v3.0.0...v3.1.0