digitalazgroup/nova-plain-text-field
A Laravel Nova field for displaying plain, unformatted text in your admin panel. Skip the editor and render clean, readable values in index and detail views—ideal for read-only notes, descriptions, and simple content.
This field fills a narrow but common Nova gap: rendering read-only, non-input text inside a Resource's form and detail views (descriptions, status labels, computed values, section copy) without abusing a Text field or Heading. It is a Nova field, so the integration model is the same as any other field.
composer require digitalazgroup/nova-plain-text-field
src/ and resources/js/ is the authoritative docs. Look for the field class (typically Digitalazgroup\NovaPlainTextField\PlainText or similar) and its Vue component.fields() method of the Resource you want to annotate:
use Digitalazgroup\NovaPlainTextField\PlainText;
public function fields(NovaRequest $request)
{
return [
PlainText::make('Account Status')
->text('Active — billing current'), // or whatever the API exposes
];
}
If the package registers assets through Nova's service provider, no npm step is needed; if it publishes to resources/js/vendor, you must rebuild Nova (npm run dev inside your Nova installation).
Because this is a field, you get all of Nova's field API for free — the value is in how you apply it, not in new methods.
PlainText field above related inputs to explain what a group of fields does, what a status means, or where data comes from.resolveUsing so it reflects live model state:
PlainText::make('Last Synced')
->resolveUsing(fn ($resource) => optional($resource->synced_at)->diffForHumans() ?? 'Never');
->onlyOnDetail(), ->onlyOnForms(), ->hideFromIndex(), ->exceptOnForms(). Use ->onlyOnDetail() for debug/metadata text you don't want in edit forms, and ->onlyOnForms() for helper copy.->canSee(fn ($request) => ...) — useful for surfacing warnings ("Payment method expired") only when the state warrants it.PlainText fields inside a Panel or alongside a Heading to build a coherent "info block" at the top of a detail view without creating a custom card.->hideFromIndex().->readonly()/no input semantics — since it is not an input, ensure you are not relying on it to submit anything. It is display-only by design.Text.make('Label') may or may not read the model attribute named Label. Verify the source: if it does, watch for name collisions with real columns — a PlainText::make('status') would shadow the DB column of the same name. Prefer a distinct display label and static ->text(...) if available.laravel-nova JS mixin and field component contract changed. Before adopting, check composer.json for laravel/nova version constraints and confirm the Vue component still registers (Nova.booting((app) => app.component(...))).composer.json.Nova::script/Nova::style includes the package's assets. If the field disappears, it is almost always canSee logic or a missing asset build.Heading for section titles and a custom card for anything richer. For most teams this package is a stopgap — a 20-line custom Nova field or Vue component often replaces it cleanly, and that is worth weighing given the maintenance risk.How can I help you explore Laravel packages today?