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.composer require 64robots/nova-row (or fork it into packages/ and wire up a path repository if you need to patch it).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.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.)
fields() and fieldsForDetail()-style splits), duplicate array literals drift. A protected function addressRow(): Row helper keeps widths consistent.rules(), resolveUsing(), fillUsing(), canSee(), and dependsOn(). Attach behavior to the children, not the row.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.->canSee(fn (NovaRequest $r) => $r->user()->can('viewSensitive')) so hiding one input inside a row doesn't require conditionally rebuilding the whole row.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.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.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.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.->showOnIndex()/->hideFromIndex() explicitly and check the resource index page, not just the detail page.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.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.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.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.nova-row only where it's already working and pin it until the resource is refactored.How can I help you explore Laravel packages today?