Skip to main content
FLEX extends a native Filament Action. The action keeps its form, validation, authorization, submit callback, focus trap, nested actions and close lifecycle. The theme adds presentation and gestures; it does not introduce a second dialog or require a separate JavaScript open/close controller.

A first bottom sheet

Place the returned Action in the same native page/header/table/schema action location you already use. A custom Livewire host needs Filament’s normal action and schema integration; installing this presentation helper does not replace it.

Complete FLEX API

Bottom detents must be a PHP list of 1–8 unique ascending finite numbers, each greater than zero and at most one. The initial index must exist. Empty, duplicate, descending, nonnumeric, infinite or out-of-range values throw an InvalidArgumentException. Use fractions, not pixel values or percentages such as 45. Existing extra modal-window attributes are merged.

Three heights, opened at the middle

The selected detent is a maximum visible height, capped by natural content. A short sheet stays compact instead of expanding into empty space. Long content scrolls when the tallest effective height cannot contain it. Desktop and mobile use the available dynamic viewport; viewport/keyboard changes refit the sheet.

One height and short content

One detent removes intermediate expansion choices. It still caps height to content and viewport; it does not force short content to fill 65% of the screen.

Adaptive content

Native Livewire visibility changes are measured without cloning fields. When content shrinks, height follows the new natural bound. During active dragging, content measurements are deferred until the gesture can settle safely.

Desktop scrolling and pointer gestures

  • Scroll upward over eligible sheet content to expand before scrolling long content. Once expanded, content keeps its native scroll behavior.
  • Drag the grabber/header to move between detents. Release uses movement and velocity; upward overscroll has resistance.
  • Downward content scrolling does not unexpectedly collapse the sheet. A downward dismissal drag uses the native Close button when it is available.
  • Interactive controls and nested scrollable inputs retain their native behavior.
No drag-only explanation is needed on desktop: wheel expansion is supported. Touch content gestures distinguish vertical dragging from horizontal/interactive gestures. These are supported interactions, not a guarantee of identical timing on every browser or physical device.

Keyboard controls

Tab/focus expansion helps reveal lower form controls. Reduced motion removes decorative settling interpolation. The sheet does not take over field shortcuts or native focus trapping.

Native modal options still apply

These are Filament Action methods, not additional Drawer::position() arguments: For a scrolling header/footer:
Omitting Cancel does not automatically forbid Escape, backdrop or Close. Configure each native close affordance deliberately. Native validation failure keeps the same sheet open; nested actions return to their parent through Filament’s modal stack.

Floating side panels

Start/End delegate to Filament’s native slide-over positions; their physical side follows document direction. The ordinary Action::make(...)->slideOver() is also themed. Non-fullscreen panels float with an outside gutter and theme corner radius; smaller screens use a compact gutter. Radius None removes the rounded shape. Detents do not apply to side panels.

Detent events

The window emits a bubbling ft-sheet-detent-change with { index, fraction, height }: index is zero-based, fraction is the configured viewport fraction and height is the effective content-capped height in pixels.
Dispatch the setter on the intended open window element, after enhancement has initialized; it is not a global window command. Invalid indices are ignored. Use native Action mounting for opening/closing. A detent event is presentation state, not saved form data.

FLEX Fields and fallback behavior

The native examples above need only Filament and FLEX Theme. Optional installed FLEX Fields can be used in the action’s schema; their own asset readiness and retry UI remain authoritative. The sheet does not replace them with a timeout. The enhancement loads on activation and cleans up after close/removal. A failed module import leaves the native form and close controls usable. Rebuild/publish the theme runtime when updating the package. Do not manually copy its runtime or edit Filament’s modal templates to obtain bottom-sheet behavior.