Installation:
composer require wendelladriel/slidewire
php artisan vendor:publish --provider="WendellAdriel\SlideWire\SlideWireServiceProvider" --tag="slidewire-config"
Publish the config to customize defaults (e.g., themes, transitions).
Create a Presentation:
php artisan make:slidewire MyFirstDeck
This generates:
resources/views/slidewire/my-first-deck.blade.php) for slide content.app/Livewire/Presentations/MyFirstDeck.php) to handle logic.routes/web.php) via the slidewire() helper.First Slide:
Edit resources/views/slidewire/my-first-deck.blade.php:
<slide>
<h1>Hello, SlideWire!</h1>
<p>This is my first interactive presentation.</p>
</slide>
Access it at /my-first-deck (or the route defined in slidewire()).
Use the markdown directive for quick content:
<slide>
@markdown
# Laravel Livewire Integration
SlideWire leverages Livewire for **real-time updates**.
Example:
```php
public function mount() {
$this->data = 'Dynamic content!';
}
```
@endmarkdown
</slide>
Key: No manual HTML—write Markdown, and SlideWire handles syntax highlighting (via Phiki) and theming.
Organize slides into horizontal groups (default) or vertical stacks (for nested content):
<!-- resources/views/slidewire/onboarding.blade.php -->
<slidewire>
<!-- Horizontal slides (default) -->
<slide>
<h2>Step 1: Setup</h2>
@code('php', file: 'setup.php')
</slide>
<!-- Vertical stack (grouped slides) -->
<slide vertical>
<slide>Detail A</slide>
<slide>Detail B</slide>
</slide>
</slidewire>
Pattern: Use vertical for sub-sections (e.g., FAQs, code walkthroughs).
Bind presentation state to Livewire properties:
// app/Livewire/Presentations/MetricsDeck.php
public $quarter = 'Q1';
public function updateQuarter($quarter) {
$this->quarter = $quarter;
$this->emit('slidewire:refresh'); // Force slide re-render
}
<!-- Blade -->
<slide>
<h1>Metrics for {{ $quarter }}</h1>
@foreach($metrics[$quarter] as $metric)
<div>{{ $metric }}</div>
@endforeach
</slide>
Tip: Use wire:model for interactive elements (e.g., dropdowns to switch slides).
Extend SlideWire’s default theme via slidewire.php config:
'theme' => [
'extends' => 'default',
'colors' => [
'primary' => '#2563eb', // Tailwind blue-800
],
],
Pattern: Create a base theme in resources/views/vendor/slidewire/themes/custom.blade.php:
@push('slidewire-styles')
<style>
.custom-slide { background: #f8fafc; }
</style>
@endpush
Configure per-slide or deck-wide timers:
<slide auto-slide="3"> <!-- 3-second delay -->
<h2>Auto-advancing Slide</h2>
</slide>
Global config (slidewire.php):
'auto_slide' => [
'default' => 5, // seconds
'paused_on_interaction' => true,
],
Link to specific slides via URL hashes:
<a href="#/my-deck?slide=3">Jump to Slide 3</a>
Livewire Navigation:
public function navigateToSlide($slideNumber) {
$this->redirect("/my-deck?slide={$slideNumber}");
}
Extend SlideWire’s built-in components (e.g., Code, Diagram):
<diagram type="mermaid">
graph TD;
A[Start] --> B{Decision};
B -->|Yes| C[Result];
</diagram>
Pattern: Create a DiagramComponent in app/Livewire/Components for complex logic.
Livewire State Persistence:
wire:ignore or lazy-load data:
<div wire:ignore>{{ $largeDataset->chunk(10) }}</div>
Markdown Parsing Quirks:
Str::of($markdown)->markdown() or use @code blocks for code.Theme Overrides:
@push('slidewire-styles')
@tailwind base; @tailwind components;
.slidewire-slide { @apply bg-white; }
@endpush
Auto-Slide Conflicts:
auto-slide ignores keyboard/mouse events if not configured.paused_on_interaction: true in slidewire.php.Vertical Slides and Mobile:
data-slidewire-vertical and test with:
document.querySelector('[data-slidewire-vertical]').addEventListener('touchmove', (e) => e.preventDefault());
Slide Context:
Use {{ dd($this->slideContext) }} in Blade to inspect current slide data (e.g., slideNumber, vertical).
Playwright Test Failures:
npx playwright install or stale browser cache.npx playwright install chromium
npx playwright test --debug
Transition Glitches:
<style> .slidewire-transition { transition: none !important; } </style>
Custom Slide Types:
Extend SlideWire\Component\Slide to add logic (e.g., quiz slides):
class QuizSlide extends Slide {
public function render() {
return view('livewire.slidewire.quiz', ['question' => $this->question]);
}
}
Pre-Rendering: Compile slides at build time (e.g., for static sites):
use WendellAdriel\SlideWire\SlideWire;
$slideWire = new SlideWire();
$html = $slideWire->render('my-deck');
file_put_contents('public/decks/my-deck.html', $html);
Database-Backed Decks: Store slide content in a table and hydrate dynamically:
public function getSlides() {
return Slide::where('deck_id', $this->deckId)->orderBy('order')->get();
}
Lazy-Load Images:
<img src="{{ $image->path }}" loading="lazy" alt="...">
Debounce Auto-Slides:
// app/Livewire/Presentations/MyDeck.php
protected $listeners = ['slidewire:auto-slide' => 'debounceAutoSlide'];
public function debounceAutoSlide() {
$this->dispatch('slidewire:pause-auto-slide')->after(1000);
}
Cache Compiled Slides:
// slidewire.php
'cache' => [
'enabled' => env('SLIDEWIRE_CACHE', false),
'ttl' => 60, // minutes
],
How can I help you explore Laravel packages today?