stinger-soft/jquery-scrollto-bundle
A Symfony bundle that packages the jQuery ScrollTo plugin, providing smooth animated scrolling to page elements and anchors through Twig templates and the asset pipeline, with configurable duration, easing, and offsets for building fluid in-page navigation.
Architecture fit. The package is a Symfony bundle, not a Laravel package, despite being surfaced in a PHP/Laravel evaluation stream. It does one thing: it registers the legacy jquery.scrollTo browser plugin as a front-end asset so Symfony's templating/asset layer can emit the <script> tag. There is no PHP domain logic, no service, no configuration surface worth speaking of. For a Laravel codebase the architectural fit is effectively zero — Laravel has no bundle/asset-pipeline concept that maps to this, and the package declares no composer.json autoload surface a Laravel app would consume. Even inside Symfony, the bundle targets the Symfony 2/3 + Assetic era; Assetic was removed from the Symfony standard in 4.0, so the bundle's primary reason to exist has evaporated.
Integration feasibility. Low. Nothing blocks a determined engineer from copying the vendored jquery.scrollTo.js out of the package and shipping it through Vite/Mix, but at that point the bundle contributes nothing — you are adopting a 2016-vintage JavaScript file, not a dependency. For a Laravel stack, the correct reading of "integration" is: do not install this; if the scroll behavior is genuinely required, vendor the JS directly and pin it.
Technical risk. High, concentrated in abandonment rather than code correctness. Zero stars, zero dependents, last release 2016-08-10, no maintainer activity for roughly a decade. The underlying jQuery plugin predates ubiquitous native support for Element.scrollIntoView({ behavior: 'smooth' }) and CSS scroll-behavior: smooth, so the capability it provides is now a browser primitive. Additional risks: undeclared compatibility with PHP 8 and Symfony 5/6/7 (composer constraints will likely fail resolution), jQuery 1.x/2.x-era assumptions, and a transitive licensing obligation — the upstream jquery.scrollTo is dual MIT/GPL, which needs a deliberate license decision, not an inherited one. Attack surface is small (static client-side JS), but supply-chain provenance of an unmaintained 2016 asset is still an audit item.
Key questions.
scrollTo behaviors are in use — offset, axis, easing, callbacks — and do any actually exceed native scrollIntoView + scroll-behavior?Stack fit. Poor for Laravel, marginal for modern Symfony. Laravel's asset story is Vite (or Mix on older apps); there is no bundle registry, no Assetic equivalent, and no reason to route a 4 KB jQuery plugin through Composer. The package earns its place only in a Symfony 2/3 application already using Assetic and already depending on jQuery — a shrinking population.
Migration path. Treat this as an extraction, not an installation. Pull jquery.scrollTo.js from the repository, commit it under resources/js/vendor/ with a provenance comment (source URL, commit SHA, license), import it explicitly where needed, and record it in the dependency inventory as a vendored, unmaintained asset. That converts an opaque Composer dependency into a visible, auditable file the team controls.
Compatibility. Two hard gates. First, Composer: the package's symfony/* constraints predate 4.x and will not resolve on current Symfony or PHP 8 without constraint overrides — an override that buys you nothing but a green install. Second, browser: the plugin assumes jQuery is present and bound before invocation, and assumes an era before passive scroll listeners and strict CSP. Inline-script invocation will violate a modern script-src policy; plan for an external module and event delegation.
Sequencing.
offsetTop, axis, duration, easing, onAfter).scrollIntoView plus a CSS offset via scroll-margin-top.smooth-scroll, lenis, or a small in-house helper — rather than resurrecting the 2016 plugin.Maintenance. The defining constraint: there is no upstream. No issue triage, no security response, no compatibility patches. Every future fix is yours, which means the effective cost is "we now own a JavaScript library," not "we added a dependency." Budget accordingly, or avoid ownership entirely by going native. The MIT license on the bundle wrapper does not simplify the upstream dual MIT/GPL question.
Support. None commercially or communally. Internal support burden falls on whichever front-end engineer last touched it; with zero dependents and zero stars, there is no community knowledge base to fall back on, so tribal knowledge is the only documentation.
Scaling. Operationally negligible — it is a static client-side file with no server footprint, no runtime, no data path. It does not affect throughput, deployment size, or infrastructure cost. The scaling concern is organizational: every additional call site deepens the coupling to an unmaintained asset and raises the cost of eventual removal.
Failure modes. Asset not published or path changed after a pipeline migration; Assetic removal breaking the bundle's only function on a Symfony upgrade; Composer resolution failure blocking unrelated dependency updates; jQuery version conflict or double-binding if the app moves to a modern bundler; CSP violations from inline invocation; silent behavioral drift where smooth scrolling is expected but a browser now handles it natively, producing double-animation or ignored easing.
Ramp-up. Trivial technically — an engineer understands the API in under an hour. The hidden cost is the opposite: because the package looks installable and is nearly empty, it invites adoption without scrutiny, and the resulting "why is this here and who owns it" question surfaces two years later during an upgrade. The ramp-up risk is decision hygiene, not skill.
Recommendation. Reject as a dependency for a Laravel stack and deprioritize for Symfony. The functionality is subsumed by native browser APIs; where it is not, vendor the JS with explicit provenance or adopt a maintained library. The opportunity score of 8.32 should be read as "there is a gap here worth closing," not "this package closes it" — the gap is best closed by deleting the dependency class entirely.
How can I help you explore Laravel packages today?