zoltantorok/filament-drag-and-scroll
Add Shift+drag horizontal scrolling to Filament tables with this zero-config plugin. Just install via composer and call ->dragAndScroll() on your panel. Includes tooltip feedback, per-panel toggling, and 13 built-in translations.
Architecture fit. From a program standpoint this is a presentation-layer dependency with no data plane and no service surface — it adds a fluent ->dragAndScroll() toggle to a Filament Panel and ships a small JS/CSS bundle plus translation strings. There is no migration, no schema change, no queue, no external call, no secret, and no new runtime backend behavior. That matters to a TPM because it means the package cannot fail in a way that corrupts data or takes down the panel; its worst case is "the gesture stops working and users scroll the way they did last week." That is an unusually clean risk shape and is the main reason this is safe to trial rather than something that needs an architecture review board.
Integration feasibility. Effort is measured in minutes: one composer require, one method call per panel, optional ->dragAndScroll(false) to scope it off elsewhere. The real gating factor is not effort, it is prerequisite sequencing: the package hard-requires Filament ^5.0, so it is downstream of a platform upgrade decision the TPM does not own unilaterally. Treat it as a rider on the Filament 5 migration, not a standalone work item. PHP ^8.1 and Laravel ^11–13 align with current baselines and are unlikely to be the blocker.
Technical risk. Ranked as a TPM would triage them:
| Risk | Severity | Why it matters to the plan |
|---|---|---|
| Filament 5 hard floor | High (gating) | No value delivered until the platform upgrade lands; makes this a dependent deliverable, not an independent one |
| Bus factor = 1, 3 stars, 0 dependents | Medium | No community bug surface, no production signal, no vendor SLA. Mitigation is cheap: pin + be ready to own ~50 lines of JS |
| Release provenance (tag dated 2026-08-05) | Medium | Future-dated release metadata is a process smell. Verify the Packagist tag matches the auditable commit before it enters a lockfile — a supply-chain gate, not an engineering judgment call |
| Livewire re-render / SPA navigation | Medium–High | If the handler binds once on DOMContentLoaded without delegation, drag dies after pagination, sort, filter, or SPA nav — a silent regression users won't report as a bug |
| CSP / asset delivery | Medium | Nonce-based CSP panels are the likely breakage case; discoverable only in environments with strict headers |
| Gesture collisions | Low–Medium | Shift+drag overlaps native text selection and potentially row-select/column-reorder; needs preventDefault() scoped to the container only |
| Accessibility claim is partial | Framing risk | Improves one input modality; does not deliver WCAG 2.1.1 keyboard operability. Do not let it be recorded as "accessibility: done" |
Key questions (the TPM's pre-adoption checklist — each has an owner and a gate):
Stack fit. Adopt for internal, desktop-first, data-dense admin panels on Filament 5 — back-office ops, finance, support tooling. Do not adopt for customer-facing surfaces where a UI regression is revenue-exposed, and do not adopt for mobile/tablet-first panels: Shift+drag is a pointer-plus-keyboard gesture with no touch equivalent, so it solves nothing there. The honest framing to stakeholders is "a wide-table usability improvement for our internal tools," not "an accessibility program."
Migration path. Effectively zero-risk and single-commit reversible. Add the dependency, add ->dragAndScroll() to one PanelProvider, ship. Removal is deleting the call and running composer remove — no data migration, no config unwind, no consumer contracts to renegotiate. This reversibility is the strongest argument in the business case and should lead the pitch: the cost of being wrong is measured in minutes, which is exactly the profile of a decision you can delegate rather than escalate.
Compatibility. Pin to an exact version, do not float on ^. Lockfile review must confirm the resolved tag matches the auditable repo commit — this is the supply-chain control for a 3-star, single-maintainer package. Confirm panel bootstrap ordering (the fluent method must be available before the panel is built; a missing or renamed method should fail loudly in CI, not silently no-op). Establish the convention that this toggle is opt-in per panel explicitly rather than globally defaulted, so scope creep is visible in git diff rather than implicit.
Sequencing. Run this as a rider on the Filament 5 upgrade, in this order:
Maintenance. Ongoing cost is near zero by design — there is no config, no migration, no service to babysit. The real maintenance exposure is version-tracking discipline across Filament majors: Filament 6 will almost certainly require a matching package release, and with a bus factor of 1 that release may not arrive. Budget the ownership accordingly: someone on the team must be able to recognize the break and know the fallback. The mitigation is pre-written and cheap — vendor the JS into our theme — so the TPM's job is to make sure that fallback is documented and assigned, not improvised under pressure.
Support. The gesture is deliberately discoverable (tooltip + cursor change), which reduces "how does this work" tickets, but the failure mode is silent: when it breaks after a Livewire re-render, users won't file a bug, they'll just revert to the old frustration. Do not rely on the support queue as your detection mechanism — put a manual smoke check in the release checklist for enabled panels. Update the internal runbook with one line: "Wide-table horizontal scroll is Shift+drag; if it stops working after a Filament update, check for a package release, else vendor the JS."
Scaling. Scales trivially in the technical sense — it's a client-side asset, no server load, no per-user cost, no quota. It scales poorly in the product sense: it is a symptom fix for "we have too many columns," and it will not compound. If table width keeps growing across panels, the higher-leverage investments are column visibility persistence, pinned/frozen key columns, density controls, and responsive column prioritization. Position this as one polish-sprint item with a known ceiling, not a strategic pillar, or you'll be defending a 3-star package as core UX infrastructure in 18 months.
Failure modes (each with a TPM-level response, not an engineering one):
->dragAndScroll(false) without a rollback.Ramp-up. Negligible for engineers — a one-line change with a README that fits on a screen. The ramp-up cost that does exist is organizational, and it's the TPM's to carry: getting a shared, accurate story about what this is (small, reversible, internal-tooling usability win from an early-stage single-maintainer dependency) and what it isn't (accessibility remediation, a fix for column sprawl, a vendor-supported platform component). Get that framing into the decision record at adoption time — it is far cheaper than correcting it later when someone asks why "accessibility" was marked green because a plugin was installed.
How can I help you explore Laravel packages today?