nightkit/nova-element-ui
nightkit/nova-element-ui adds Element UI-style components to Laravel Nova, making it easier to build consistent, polished admin interfaces with familiar form, layout, and input elements. A handy UI toolkit for Nova dashboards and resource screens.
composer require nightkit/nova-element-ui then register the package's service provider in config/app.php (Nova 1.x predates the tool auto-discovery convention — don't assume it registers itself).require it. Check composer.json for the supported Nova constraint, then open resources/js/ and the compiled dist/ bundle. The .vue files there are your real API — there is no published docs site and the README is thin.php artisan nova:card acme/stat-card, then import the Element components you need (el-card, el-progress, el-tag) into the card's resources/js/components/Card.vue instead of hand-rolling markup. That's the lowest-risk integration — a card is isolated, so Element's global CSS leaks less than it would inside a full tool or a resource index override.npm install && npm run dev inside the package/card. If the bundle was committed as a pre-built dist/, you can serve it via Nova::script('nova-element-ui', __DIR__.'/dist/js/tool.js') in the provider's boot() and skip your own webpack step entirely.Serve the bundle from the package provider. The typical shape is a boot() that calls Nova::script() and Nova::style() with paths into dist/, and a tools()/cards() registration. Load it once globally rather than per-component so Element's CSS is fetched a single time.
Register components globally in your tool entrypoint. Because Nova mounts its own Vue root, the practical pattern is:
import { Button, Table, Dialog, Form, FormItem, Input } from 'element-ui'
Vue.component(Button.name, Button)
Vue.component(Table.name, Table)
// ...
Importing named components (rather than Vue.use(ElementUI)) keeps the bundle from doubling in size and avoids clobbering Nova's own registrations.
Use Element for data-dense screens. The package earns its keep on index-style tool pages: el-table with sorting/filtering beats hand-written tables for read-heavy admin views, and el-dialog + el-form gives you validated modals without pulling in another form library. Wrap every one of these in a scoped container class (e.g. .nova-element-scope) and reset within it.
Keep Nova's router as the source of truth. Don't let Element components own navigation. Element's el-menu is tempting for custom sidebars, but push routes through Nova's router-link/$router so breadcrumbs and the resource index stay consistent.
Integrate at the card/tool boundary, not inside Nova's core components. Overriding Index.vue or Detail.vue from Nova's vendor directory breaks on every composer update. Reach for cards, tools, and custom fields instead.
Pair with Laravel for data. The package is pure front-end; expose what Element tables/forms need via a small JSON endpoint in your tool's routes/api.php and hydrate props through the tool's Tool.vue.
composer.json with a repositories VCS entry.element-ui/lib/theme-chalk/button.css) rather than the full index.css, and add a container class guard.npm run production output before shipping.window.Vue and your tool's bundled Vue can diverge, producing "Unknown custom element: <el-...>". Fix by importing components from the same Vue your tool builds against, or expose the instance explicitly in your entrypoint.Nova::style/Nova::script URL first — a 404 there means the publish path or vendor:publish tag is wrong. Then confirm php artisan nova:publish was run after any dist/ rebuild.php artisan nova:publish && php artisan view:clear saves a lot of "why is it still the old CSS" time.element-theme) rather than patching component internals; the package exposes no JS config surface worth relying on.How can I help you explore Laravel packages today?