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 Charcounted Fields Laravel Package

elevate-digital/nova-charcounted-fields

A Laravel Nova package that adds character-counted text fields with live counts and length-limit support. Ideal for titles, excerpts, meta descriptions, and other constrained content, helping editors stay within required limits while composing in Nova. Easy to configure and integrate into existing r...

View on GitHub
Deep Wiki
Context7

Technical Evaluation

What it is. A Laravel Nova field package that subclasses Nova's built-in Text and Textarea fields and ships a Vue form component adding a live character counter (and, by convention, client-side maxlength enforcement). It is a presentation-layer convenience, not infrastructure: no migrations, no service provider logic beyond asset registration, no server-side validation, no persistence layer.

Architecture fit. Fit is narrow and well-defined. It only has value inside a Laravel Nova admin panel — Nova is a commercially licensed first-party package, so this dependency is confined to internal tooling and can never be part of a shipped product surface. If the estate has no Nova, or is standardising away from Nova toward Filament/Inertia-built admin, the package has zero applicability and the evaluation ends here. Where Nova is in use, the fit is clean: it is a drop-in field swap (Text::make() → CharCountedText::make()) with no schema or model impact.

Integration feasibility. Mechanically trivial — composer require elevate-digital/nova-charcounted-fields, then substitute the field classes in resources. The real friction is version compatibility, not effort. The dominant risk is Nova major-version drift: Nova 4 moved to Vue 3 and a new asset/build toolchain (nova.mix.js), and Nova 5 continues that line. A field package compiled against Nova 3's Vue 2 components will not render its counter under Nova 4/5 without a rebuild. Composer constraints on laravel/nova will usually surface this as an install failure rather than a runtime one — which is the good outcome.

Technical risk.

  • Maintenance signal is effectively absent. Zero stars, zero dependents, score 0. This is not evidence of poor quality; it is evidence of no signal. No downstream consumers means no one is filing issues, no compatibility patches, and no proof it has been exercised against current Nova. Treat as prototype-grade until proven otherwise.
  • Graceful degradation is the saving grace. Because the field extends Nova's own classes, a broken JS bundle typically degrades to a plain text/textarea input rather than breaking the form. Blast radius is cosmetic.
  • Client-side-only enforcement. A JS maxlength does not protect the database. Without a matching max: validation rule, oversized payloads reach the model and produce truncation or a strict-mode SQL error.
  • Multibyte miscount. JS .length counts UTF-16 code units; emoji and some CJK glyphs count as 2, while PHP mb_strlen counts 1. A counter reading "98/100" can fail a max:100 rule, or vice versa.
  • Build reproducibility. The distributed dist/js/field.js is a committed artifact; if you cannot rebuild it from source against your Nova version, you cannot patch it.

Key questions.

  1. Which Nova major versions does composer.json permit, and does the committed dist bundle match the current Nova toolchain?
  2. What is the licence, and is the JS source complete enough to rebuild locally?
  3. Does it enforce maxlength on the client, and does it expose the limit for reuse in validation rules?
  4. Is the underlying limit a hard cap or a soft warning (i.e. does it silently truncate paste input)?
  5. Who owns this if it breaks after a Nova upgrade — and is the rebuild cost lower than writing the component in-house?
  6. Given a custom Nova field with a counter is roughly a one-to-two-day build, what is the actual saving being purchased here?

Integration Approach

Stack fit. Requires Laravel + Nova with matching major versions; PHP constraint must align with the app's runtime. No database, queue, cache, or API surface — the compatibility matrix is essentially one axis (Nova version) plus one axis (PHP version).

Migration path. Low ceremony, fully reversible:

  1. Spike in a disposable branch: install, swap one resource's field, exercise create/update/detail/index views, and confirm the counter renders.
  2. If the counter fails to render but the field still accepts input, that is the known degradation mode — do not mistake it for a working install.
  3. Pair every field with a server-side max: rule (or Str::length custom rule) sized to the column, and decide explicitly how multibyte input is counted.
  4. Roll out resource-by-resource; there is no data migration and no backfill.

Compatibility. Verify the Nova major version first, before any install attempt — this is the single gate. Secondary checks: PHP version, and whether the app's build pipeline needs to recompile the field assets (it does not, if you use the committed dist).

Sequencing. Do not sequence this ahead of anything. It is a cosmetic refinement to be picked up opportunistically alongside other Nova admin work. If a fork or rebuild is required for Nova 4/5, the decision to adopt flips: at that point you are maintaining a private fork of a package nobody else uses, and building the component in-house is the cheaper, better-owned option. My recommendation is rebuild in-house or vendor a copy unless the spike shows a clean, current, licence-permissive package — the dependency buys you roughly a day of work in exchange for an unowned moving part.

Fallback. Native Nova Text::make()->maxlength() plus a help() hint covers enforcement; only the live counter is lost. Confirm with product whether the counter is a genuine UX requirement or a nice-to-have before investing further.

Operational Impact

Maintenance. Effectively zero ongoing cost if Nova versions stay pinned; unbounded cost at the next Nova major upgrade, because the fix is a JS rebuild that upstream may never ship. Budget a standing "verify after Nova upgrade" check in the admin regression suite. Because the package is abandoned-adjacent, assume the team owns the code in practice even if not in name — capture the fork internally if adopted.

Support. No vendor SLA, no issue throughput, no release cadence to track. Internal support burden is limited to the field classes themselves; any bug becomes your bug. Document the source of truth (fork URL, build command) in the repo README so it survives staff turnover.

Scaling. Not a consideration in the conventional sense — the counter is client-side and per-request; no runtime footprint, no load characteristics, no infrastructure change. The only "scaling" concern is organisational: every resource that adopts the field adds another place to update if the component is later replaced.

Failure modes.

  • Silent cosmetic failure: counter stops rendering after a Nova upgrade; field continues to work. Low severity, easy to miss in QA — add an explicit visual check.
  • Validation gap: client cap absent or bypassed, oversized input reaches the database → truncation or strict-mode error on save. Highest-severity mode; mitigate with server-side rules regardless of whether the counter works.
  • Off-by-one on multibyte input: user blocked below the stated limit, or accepted above it. Mitigate by aligning JS and PHP counting or by dropping to a soft warning.
  • Paste truncation: silent data loss if the component hard-truncates on paste. Test explicitly with a large paste.
  • Asset conflict: two Nova field packages registering overlapping components after an upgrade. Rare, resolves by removal.

Ramp-up. Near-zero for a Laravel developer — the API mirrors Nova's own fields, so the learning curve is "swap the class name." The genuine ramp-up cost is institutional: someone must be able to rebuild the JS bundle, which means keeping Node, the Nova build tooling, and the source in a working state. If the team cannot rebuild it, the package is unmaintainable by definition and should not be adopted.

Bottom line. Low opportunity is the correct read. This is a convenience wrapper whose entire value is a character counter, whose differentiation is a day of engineering, and whose ownership and compatibility risk exceed that saving on any Nova 4/5 estate. Verify licence and Nova compatibility if a spike is cheap; otherwise build or vendor the component and keep the dependency count flat.

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.
3mdikram/worldmoneywords
snowsoft/config
itmosoft/laravel-subscriptions
larva/laravel-ai-qwen
diephp/sequences
users-au/socialite-provider
twidpay/twid-logger
mrnewport/laravel-plaid
mrnewport/laravel-repo
mrnewport/laravel-docsign
mrnewport/laravel-stow
mrnewport/laravel-flow
mrnewport/laravel-priceable
mrnewport/laravel-nestedterms
fredmeng/laravel-apidoc-generator
itstructure/laravel-multilingual-tools
pdustdar/elasticsearch
markupai/php-sdk
rlacerda83/lumem-microservice-shipment
uni-method/symfony-lib