harvirsidhu/filament-timepicker
A Filament form field that adds a customizable time picker to Laravel admin panels, making it easy to select and store time values with a clean, user-friendly input.
Architecture fit
harvirsidhu/filament-timepicker is a standalone Filament form field, not a panel plugin. It extends Filament’s Field, ships a Blade view, and registers assets through a package service provider. That is the correct architectural shape for a reusable Filament v4/v5 field.filament/forms rather than filament/filament, so it can be used in full Filament panels and plain Livewire applications that use Filament Forms. This improves fit beyond the typical Filament admin use case.interval(), minTime(), maxTime(), durationFrom(), defaultDuration(), displayFormat(), seconds(), strict(), native(), and timezone(). The two no-op methods (native(), timezone()) are useful compatibility shims for teams migrating from Filament’s built-in TimePicker.Integration feasibility
H:i storage contract is clear and testable. A 3 PM slot stores as 15:00; timezone conversion is not performed by the field. That is appropriate for appointment-style data, but it must be validated against the consuming domain.Technical risk
wire:ignore on the Alpine root, teleported dropdown markup, a data-config bridge for reactive config, imperative panel positioning, and mirrored PHP/JS parsers. These are well documented, but they raise the cost of debugging regressions and make casual modification risky.minTime()/maxTime() and optionally the interval grid, which is good. However, teams must verify that imports, API writes, and programmatic $set() paths are covered by their own validation.Key questions
aria-invalid handling?seconds() display/storage in any current or planned form? If so, verify the UX and validation path.php artisan filament:assets after every package update?Stack fit
Migration path
TimePicker, the migration is mostly a field swap plus behavior review. The package exposes native() and timezone() as no-ops for drop-in parity, but teams should not assume identical edge-case behavior.<input type="time"> or Select-based time fields, the path is: replace the field, set interval(), enforce minTime()/maxTime(), optionally add durationFrom() and defaultDuration(), then validate storage format.H:i. That is a significant advantage: the integration can be isolated to the presentation layer.Compatibility
--gray-* variables, so custom themes should not need an @source line. Still verify styling in the actual theme.php artisan filament:assets after updating; missing this step produces an unstyled dropdown.Sequencing
minTime()/maxTime()/interval() config and both create and edit modes.$set(), imports, Livewire roundtrips, ->live(), and afterStateUpdated() sibling reactivity.filament:assets in the pipeline, verify asset caching, and verify the dropdown is styled in production.Maintenance
wire:ignore, teleported dropdown, data-config updates, and state binding modifiers.Support
data-config bridge are the highest-signal areas.Scaling
Failure modes
wire:ignore/teleport contract was altered, or a framework upgrade changed morph behavior.minTime()/maxTime()/interval() closures do not reach the browser because the data-config bridge was removed or a new reactive option was not added to the JS RECONFIGURABLE list.Ramp-up
How can I help you explore Laravel packages today?