philperusse/nova-tooltip-field
A Laravel Nova field that adds tooltip support to your resources, letting you show helpful hints and contextual information on hover. Keep forms and detail views clean while giving users quick, customizable guidance exactly where they need it.
Architecture fit. This package is a leaf dependency that extends Laravel Nova's field API — a PHP Field subclass paired with a compiled Vue component that renders an info icon with hover copy beside an admin form input or detail value. It has no persistence, no HTTP surface, no queues, no migrations, and no server-side data handling. For a TPM, that means the integration risk is confined to one surface: an internal, authenticated admin panel. The binding constraint is environmental rather than architectural. The package only exists inside Nova, a commercial closed-source dependency whose custom-field API has broken at every major release (1.x → 2 → 3 → 4 → 5). A field first and last shipped on 2018-11-14 was authored against the Nova 1.x generation — almost certainly pre-Vue 3 and pre-Tailwind. Architecturally it is a tiny, well-bounded artifact sitting on top of a surface that has since been rebuilt underneath it.
Integration feasibility. Cheap to describe, awkward to land. The nominal path is composer require plus one line in a fields() method. The realistic path is resolving Composer constraints against a modern Laravel/PHP/Nova stack, then discovering the shipped asset is a prebuilt 2018 JavaScript bundle with no recoverable build step — which converts "install a package" into "fork and rebuild front-end assets" or "read the source and reimplement." Either outcome is roughly a developer-day. That is not a large absolute cost, but it is engineering time spent to acquire a maintenance liability for a capability the platform now provides natively via Field::help().
Technical risk, ranked by expected impact.
Key questions to close before any commitment.
composer.json install against it at all?Field::help() already satisfy the requirement? Answer first — cheapest possible resolution and may close the ticket outright.Verdict. The underlying need — contextual guidance on complex or risky admin fields such as billing rules, status transitions, regional settings, or deprecated flags — is real and recurring. This artifact is not the vehicle for meeting it. Treat it as a reference implementation for a capability Nova now approximates natively.
Stack fit. Laravel + Nova + Composer, nothing exotic, no transitive weight, no service dependencies. That lightness cuts both ways: trivial to remove and equally trivial to replace. Because there is no lock-in benefit, the usual "adopt to save build time" argument doesn't apply — the build is the smaller cost.
Recommended path: reimplement rather than adopt. Two defensible options, neither of which puts the published package into composer.json:
app/Nova/Fields/ or an internal acme/nova-fields package, strip stale Composer constraints, rebuild against the current Nova toolchain, and own it. The MIT licence makes this clean from an IP standpoint.Default to reimplementation unless source review shows the component is clean and its build step is recoverable. Make the call on inspection, not on the README.
Migration path and compatibility validation. Before committing anything, stand up a sandbox Nova install at exact production parity — same Nova major, Laravel, PHP, and Node toolchain — and record every constraint conflict. Specifically check the Vue major version, the asset manifest format, and whether the field depends on removed Nova mixins or obsolete Nova.booting registration patterns. If the team is genuinely on a legacy Nova 1.x panel with no near-term upgrade, the published package can be pinned and used as-is under an explicit exception that carries a removal date tied to the next admin upgrade.
Sequencing.
Field::help() is insufficient and document the gap concretely. If it's sufficient, close the ticket here — highest-value step in the sequence.resolve and meta, plus a smoke assertion that the component renders.Scope discipline. Keep this to internal admin tooling. It should not appear on a roadmap or be bundled with customer-facing work. At most it is a backlog polish item inside an admin-panel cleanup, prioritized below anything revenue-adjacent.
Maintenance. Effective upstream maintenance is zero, so the full burden transfers internally the day it ships. The realistic line item is recurring work at every Nova major upgrade, since custom fields are among the first things to break and there is no vendor to file an issue with. Attach a reminder to the Nova upgrade calendar and name an owner for the internal field. If the field is adopted as published for a legacy panel, pin the version and record the exception in the dependency register so it surfaces during the next upgrade review.
Support. There is effectively no upstream support channel: one release, no issue triage, no community of dependents to lean on. First-line support therefore lands on the internal team. Document where the field lives in the admin panel so support agents know whether a missing tooltip is a bug or an expected post-upgrade degradation. Set expectations with the ops team that these hints are best-effort and not a validated knowledge base.
Scaling. The package itself has no scaling dimension — it's static copy on an admin form with no read/write load beyond the page render. The scaling concern is organisational: every additional Nova panel or field it's applied to is another surface owned by an unmaintained component. Favor an internally controlled field so breadth of adoption is a deliberate choice rather than a spreading liability.
Failure modes. Ranked and pre-triaged: (1) post-upgrade silent blank — field renders nothing and users misconfigure records; mitigate by a render smoke test and a support runbook; (2) Composer conflict blocking an unrelated dependency update; mitigate by forking or reimplementing; (3) accessibility failure discovered in an audit; mitigate by building keyboard-focusable, screen-reader-labeled markup from the start; (4) touch-device invisibility on tablets used on shop floors or in support; mitigate by supporting click/tap as well as hover. The common thread is that these failures are silent, so a small amount of internal test coverage and a named owner is worth more than the package saves.
Ramp-up. Adoption is easy to describe but demands an owner. The ramp is: (1) a TPM confirms the native-help-text gap is real and scopes it to a specific admin screen, (2) engineering chooses fork vs. reimplement on inspection, (3) a short internal package or field ships with tests, (4) a single resource gets it behind the normal deploy process. Total effort is on the order of a day or two — small enough that the business case rests entirely on the clarity of the requirement, not on the package. The correct TPM posture is to treat this as a UX backlog item with a defined trigger, not a dependency to evaluate.
How can I help you explore Laravel packages today?