shuvroroy/nova-tabs
A Laravel Nova package that organizes resource fields into clean, navigable tabs, keeping complex forms tidy and easier to scan. Add tab panels to your Nova resources with simple method chaining.
Architecture fit. Nova Tabs is a purely presentational wrapper around Nova's field composition model — it registers a compiled Vue bundle via Nova::script() and renders its children in <div v-show>/<div v-if> containers. There is no config file, no migration, no service class, and no persistence. That is the package's strongest property from a TPM standpoint: the blast radius of adoption is limited to Nova resource fields() methods. It fits cleanly wherever Nova is already the sanctioned admin surface and one or more resources carry 20–30+ fields. It does not fit public-facing UX, permission-aware or conditional workflows that need orchestration, or any admin stack that is not Nova.
Integration feasibility. composer require shuvroroy/nova-tabs:1.1.1 and a handful of fields() edits. Realistic estimate is 1–2 engineering days for a proof of concept on one resource, plus conventions and a regression pass. No data model change, no backfill, no API surface. This is a sprint-sized tactical convenience layer, not a platform decision.
Technical risk. The dominant risk is lifecycle, not functionality:
Key questions.
required fields currently sit in those resources — can they all live in tab one?Stack fit. Laravel + Nova, PHP 8. Verify the package's composer.json constraint against the actual Nova major before anything else; the README shape and the vendored class signature are not guaranteed to agree.
Migration path. There is nothing to migrate. Rollback is removing the dependency and reverting fields() — no migrations, no data changes to unwind. This reversibility is what makes saying yes safe.
Compatibility work, in order of importance:
1.1.1 or a tight ~1.1.1) and commit the lock file. A floating constraint will silently acquire untested code on the next composer update.vendor/shuvroroy/nova-tabs/src/ directly — at this size the source is the documentation. Confirm the Tabs/Tab constructor and withFields() signatures, the service provider's asset registration, and whether the Vue component does anything on submit/error (it does not, per the source assessment).dependsOn, ->hideWhenCreating()) explicitly inside tabs. They follow Nova's standard behavior, but visibility changes on an inactive tab give no visual feedback — keep dependent pairs in the same tab.Tabs inside Tab. Use Nova's Panel::make() as the sanctioned sub-grouping escape hatch.Sequencing.
TabsField adapter that captures our defaults (ordering, fullWidth() conventions, canonical tab names). This converts "we depend on an unmaintained package" into "we depend on a one-file adapter" — swapping to a fork or in-house implementation later becomes a single-file change.Conventions to enforce in code review. Tabs::make() must be the only top-level element in fields(); anything else renders orphaned outside the strip. Extract each tab into a method so diffs stay readable and field shapes can be shared via traits. Keep relation tables in their own fullWidth() tab. Push rarely-edited computed fields into a Meta tab with onlyOnDetail() to keep form requests fast.
Maintenance. Treat this as a frozen dependency, not a maintained one. Ownership must be explicit: a named engineer, a line in the Nova upgrade checklist ("regression-test tabbed resources"), and a small per-major budget of engineering days to validate or patch. The pre-agreed decision path — adopt / fork / replicate internally / defer — should exist before the pilot starts, not be discovered during an upgrade.
Support. The failure modes generate tickets, so instrument them up front:
Scaling. Adoption scales linearly and cheaply — the cost is per-resource fields() edits, not infrastructure. Nova hydrates every field returned from fields() on form requests, so use tabs as an occasion to push expensive computed attributes behind onlyOnDetail(). There is no runtime dependency, no queue, no cache, no external service.
Failure modes, ranked by business impact.
Ramp-up. Low. The API is Nova-native and idiomatic; a Nova-familiar engineer should be productive in half a day, and the two-day pilot estimate absorbs the source-reading and create/detail verification. The organizational ramp-up is the larger cost — agreeing tab names, the required-field convention, and the ownership model is a product conversation, not an engineering one, and skipping it produces five taxonomies and the same problem the feature was meant to solve.
How can I help you explore Laravel packages today?