Weave 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

Nova Row Laravel Package

64robots/nova-row

64robots/nova-row is a Laravel Nova package that adds a Row field for placing multiple Nova fields side by side, helping build cleaner, more compact resource forms and detail views without custom layout code.

View on GitHub
Deep Wiki
Context7

Getting Started

  1. Confirm it still installs before you plan around it. The package is archived and pinned to an older Nova generation. Check composer.json for its laravel/nova constraint against your installed major (Nova 4/5 changed the field component API and asset pipeline). If it won't resolve, treat the source as a reference implementation rather than a dependency.
  2. Install with composer require 64robots/nova-row (or fork it into packages/ and wire up a path repository if you need to patch it).
  3. Read these first, in order: the README usage snippet, then src/ for the field class (its component(), make() signature, and whether it accepts a fields() array or constructor array), then resources/js/ for the Vue component that actually renders the row — that file tells you what layout options (width, class, etc.) the field really supports, regardless of what the README claims.
  4. First use case: collapsing a run of short, related fields into one visual line on the detail and form views — e.g. City / State / Zip, or First name / Last name — instead of Nova's default stacked full-width fields.

Typical wiring in a resource:

public function fields(NovaRequest $request)
{
    return [
        Row::make('Address', [
            Text::make('City'),
            Text::make('State'),
            Text::make('Postal code'),
        ]),
    ];
}

(Exact namespace and signature vary by version — verify against src/ before copying.)

Implementation Patterns

  • Extract row definitions into methods or a trait. Once you use rows in more than one resource (or on both fields() and fieldsForDetail()-style splits), duplicate array literals drift. A protected function addressRow(): Row helper keeps widths consistent.
  • Treat the row as a layout wrapper, not a data field. Children keep their own rules(), resolveUsing(), fillUsing(), canSee(), and dependsOn(). Attach behavior to the children, not the row.
  • Pair with Panel for two-level layouts: panels for sections, rows for the short fields inside each section. Nova renders panels fine with a row as a child; the reverse (row inside row) is usually unsupported by the Vue component and not worth attempting.
  • Use rows where widths are the problem, not where columns are. A row is the right tool for "three small inputs on one line." If you need true multi-column forms with independent vertical flow, a grid/columns package is a better fit.
  • Authorize at the child level with ->canSee(fn (NovaRequest $r) => $r->user()->can('viewSensitive')) so hiding one input inside a row doesn't require conditionally rebuilding the whole row.
  • Keep relationship fields out unless you've tested them. BelongsTo/MorphTo inside a wrapper can misbehave with viaResource, dependsOn, and searchable selects because the wrapper changes the parent component tree. Verify interactively before committing.
  • Reuse the pattern across detail and index deliberately: the same row on the index view is rarely what you want — see the gotchas below.
  • Integration tip: if the package's component doesn't expose a withMeta-driven option you need (e.g. per-field column widths), the cheapest extension is to subclass the field and point component() at your own compiled Vue component copied from the package's resources/js.

Gotchas and Tips

  • Archived means no Nova upgrades. The Vue mixins (FormField, DetailField) and the Webpack/Mix → Vite asset changes in Nova 4+ will break older field components. Budget for a fork or in-house rewrite, and pin the version ("64robots/nova-row": "x.y.*") so a composer update in CI doesn't silently swap behavior.
  • The row name is not a database column. Passing a real-sounding label (Row::make('Address')) can cause Nova to attempt to resolve/fill an address attribute. If you see unexpected hydration errors or empty values, use a non-attribute label or a layout-only flag (onlyOnForms()/hideFromIndex() equivalents) supported by the version.
  • Index view is the usual failure point. Wrapped fields often don't render on the resource index, or render as empty cells, because the wrapper has no index component. Give the children ->showOnIndex()/->hideFromIndex() explicitly and check the resource index page, not just the detail page.
  • Child sortable() still works, but the column header ordering may look odd because the visible column is the child, not the row. Sorting and indexQuery filtering apply per child field as usual.
  • resolveUsing / fillUsing / default on the row itself generally do not cascade to children. If defaults aren't appearing, set them on each child.
  • Detail view overflow: long text, Textarea, and Markdown fields inside a narrow row column look cramped or clip. Reserve rows for genuinely short inputs; keep long-form fields in their own full-width line.
  • Debugging a blank render: run php artisan nova:publish, confirm the package's service provider is registered (Nova field packages usually autoload via extra.laravel.providers), inspect the field's component() string, and check the browser console for a missing Vue component registration. A "component not found" warning is almost always an asset-publish or Nova-version mismatch, not a PHP error.
  • Extension points, in order of durability: withMeta([...]) if the component reads meta → subclass + custom compiled component → fork the whole package. Anything below the first option dies at your next Nova major upgrade.
  • Have an exit plan. For new work, prefer Nova's built-in layout capabilities or a maintained grid/columns field; keep nova-row only where it's already working and pin it until the resource is refactored.
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.
coleus/frame
thtg88/journalism
filagora/filagora-ai-forums
rlacerda83/query-parser
socialdept/atp-orm
cboxdk/laravel-assistant-client
socialdept/atp-resolver
socialdept/tenant-domains
tautvydasr/blade-class-names
socialdept/color-scales
maherelgamil/controller
coleus/widgets
coleus/table
coleus/users
coleus/music
coleus/health
coleus/calendar
coleus/notes
coleus/support
coleus/settings