beartropy/ui
Beartropy UI is a small Laravel UI package providing ready-made components and helpers to speed up building admin and front-end screens. Drop in common layouts, forms, and UI utilities to get a consistent look fast with minimal setup.
<x-bt-slider name="my-slider" title="Title">Body</x-bt-slider>
Slider → extends BeartropyComponentslider.blade.phpresources/views/presets/slider.php (colors only — ring + hover for close button)x-data for state, x-trap.noscroll for focus trapping$dispatch('open-slider', 'name')| Prop | PHP Type | Default | Blade Attribute |
|---|---|---|---|
| show | bool |
false |
:show="true" |
| name | ?string |
null |
name="settings" |
| color | ?string |
null |
color="blue" |
| title | ?string |
null |
title="Settings" |
| side | string |
'right' |
side="left" |
| backdrop | bool |
true |
:backdrop="false" |
| blur | bool |
true |
:blur="false" |
| maxWidth | string |
'max-w-xl 2xl:max-w-4xl' |
max-width="max-w-3xl" |
| headerPadding | string |
'px-4 py-3 sm:px-6' |
header-padding="p-6" |
| bodyPadding | string |
'p-4' |
body-padding="p-6" |
| static | bool |
false |
:static="true" |
| Slot | Description |
|---|---|
| default | Scrollable body content |
| footer | Sticky bottom bar (rendered only when provided) |
{
show: false, // visibility (entangled with wire:model if set)
sliderName: 'name', // name prop for event matching
_handlers: {}, // stored event listener refs (for cleanup)
}
Three window-level custom events, dispatched with the slider's name as detail:
open-slider → sets show = trueclose-slider → sets show = falsetoggle-slider → toggles showListeners are registered in init() and cleaned up in destroy().
<x-bt-slider wire:model="showSlider" title="Title">...</x-bt-slider>
Uses [@entangle](https://github.com/entangle)() when wire:model is present.
$side determines: position class (left-0/right-0), padding, and translate directiontranslate-x-full → translate-x-0 (right) or -translate-x-full → translate-x-0 (left)sm:duration-700)role="dialog" aria-modal="true" aria-labelledby="{sliderId}-title"id="{sliderId}-title" (unique per slider via name or uniqid)x-trap.noscroll="show" (Alpine focus plugin, bundled with Livewire 3)<span class="sr-only">{{ __('beartropy-ui::ui.close') }}</span>x-on:keydown.escape.window="show = false"colors → {color} → {ring, hover}
ring: focus ring color for close buttonhover: hover color for close button icondiv[x-data][role="dialog"] ← root, z-50, focus trap
├── div.backdrop ← fixed overlay, optional
└── div.fixed.inset-0 ← positioning wrapper
└── div.panel[x-show] ← slide transition
└── div.flex.flex-col ← layout
├── div.header ← title + close button
├── div.body ← scrollable slot content
└── div.footer? ← optional sticky footer
{{-- Event-based with footer --}}
<x-bt-button label="Open" x-data [@click](https://github.com/click)="$dispatch('open-slider', 'form')" />
<x-bt-slider name="form" title="Edit User">
<x-bt-input label="Name" />
<x-slot:footer>
<x-bt-button ghost label="Cancel" x-on:click="$dispatch('close-slider', 'form')" />
<x-bt-button solid primary label="Save" />
</x-slot:footer>
</x-bt-slider>
{{-- Left side, static --}}
<x-bt-slider name="nav" side="left" :static="true" title="Navigation">
Nav links
</x-bt-slider>
{{-- Livewire --}}
<x-bt-slider wire:model="showSettings" title="Settings">
Settings form
</x-bt-slider>
{{-- Custom widths and padding --}}
<x-bt-slider name="wide" max-width="max-w-3xl" body-padding="p-6" title="Wide">
Content
</x-bt-slider>
destroy() to prevent memory leaks in Livewirestatic mode only prevents backdrop click — ESC key still closesshadow-[0_-4px...]) to indicate scrollable content abovex-ref="scrollContainer" exists on body div for potential JS accessx-cloak hides the component until Alpine initializesx-modelable="show" allows external Alpine x-model bindingHow can I help you explore Laravel packages today?