think.studio/nova-text-card
A Laravel Nova card component for displaying custom text content on your dashboard. Add headings, notes, or instructional copy to Nova pages with a simple, configurable text card that's lightweight and easy to register.
Install and register
composer require think.studio/nova-text-card
Because this is a vendor Nova card, there is no nova:card generator step — you register the card class directly:
// app/Providers/NovaServiceProvider.php
public function cards()
{
return [
new \Think\NovaTextCard\NovaTextCard('Some text to render'),
];
}
Where to look first
src/ — the Card subclass. This is the real API surface: its constructor signature tells you what the card accepts (text, title, withMeta payload, width, etc.). Anything the README omits you will find here.resources/js/card.js (and the compiled dist/js/card.js) — the Vue component. This tells you exactly which props/meta keys the frontend reads, which is the source of truth for what "options" actually exist.resources/views/ — if there is a Blade view, it may be publishable/overridable, which is your cheapest customization path.composer.json — check the laravel/nova constraint before you commit to it. This package predates or targets a specific Nova major; a mismatch is the single most common install failure for abandoned Nova cards.First use case
The intended job is a static informational block on a Nova dashboard — release notes, "how to use this admin" copy, an environment banner, or a support contact. Treat it as a presentation-only card: it renders text you hand it, it does not query anything. If you need dynamic content, you compose it yourself (see below).
Resource detail sidebar instead of dashboard
The most common real-world placement is a detail card, not a dashboard card:
// inside a Resource's fields()
TextCard::make()->onlyOnDetail()
or via Nova::resources() / a cards() method on the resource. Verify the card resolves correctly in a three-column detail layout — most simple text cards assume full width and look cramped at 1/3 width.
Injecting content dynamically
Since the card just displays a string, build the string in PHP and pass it in:
(new NovaTextCard())
->withMeta([
'text' => view('admin.support-blurb', [
'onCall' => config('support.on_call'),
])->render(),
]);
Confirm against resources/js/card.js whether the component reads card.text or a meta property — guessing here produces a silently blank card, which is the #1 debugging time-sink with this package.
Multi-language admin
If the card renders a fixed string, don't hardcode English in NovaServiceProvider. Resolve it per request:
new NovaTextCard(__('admin.dashboard.help_text'))
This is also a clean way to make the card useful in a team where Nova is shared across locales.
Per-environment banners
A high-value, low-risk pattern: render a warning banner only when app()->environment() !== 'production', including the env name and current git SHA. Keeps staging from being mistaken for prod without writing a custom card.
Replacing the Vue component
If the package ships a dist/ build you can't rebuild, the pragmatic move is to copy the card class + Vue component into nova-components/TextCard and path-require it. Given the activity level of this package, treat it as a starting point rather than a dependency.
Version compatibility is the main risk. Nova cards are tightly coupled to Nova's major version (Vue 2 vs Vue 3, nova.mix vs the old asset pipeline). Check the laravel/nova constraint in composer.json and the compiled bundle before installing. If the constraint is loose (e.g. *), do not trust it — test on your actual Nova version.
License is NOASSERTION. There is no clear license grant. For an internal admin card the practical risk is low, but if this ships inside a distributed product, get clarity first or reimplement — the card is small enough that rewriting it is likely cheaper than a legal review.
Zero stars, zero dependents, no ecosystem. Plan for abandonment: pin an exact version in composer.json, and expect no upstream fixes. Budget an hour to read the source rather than relying on the README.
Nova's private Composer repo. laravel/nova is a paid, authenticated repository. If composer require fails, it's usually CI or a teammate missing the Nova credentials in auth.json, not this package.
Blank card debugging checklist, in order: (1) is the card registered in cards() and not shadowed by Nova::cards() order, (2) does the Vue component's expected prop name match what you passed, (3) is dist/js/card.js actually published/present, (4) hard-refresh the browser — Nova card bundles are cached aggressively.
XSS. If the component uses v-html to render your text, anything user-influenced (a name, a config value from a DB row) becomes an injection vector in an admin-authenticated context. Keep the input static or sanitize it. If it renders as plain text, you lose formatting — so decide up front which you actually need.
Extension points are limited to what the card exposes: constructor args, withMeta, width(), and visibility helpers (onlyOnDetail, canSee). canSee() is worth using for role-gated help text — restrict operational copy to the roles who need it rather than cluttering every admin's dashboard.
How can I help you explore Laravel packages today?