Installation:
composer require wendelladriel/slidewire
php artisan vendor:publish --provider="WendellAdriel\SlideWire\SlideWireServiceProvider" --tag="slidewire-config"
Generate a Deck:
php artisan make:slidewire MyPresentation
This creates:
resources/views/presentations/MyPresentation.blade.php (main deck file)resources/views/presentations/MyPresentation/slides/ (slide templates)config/slidewire.php (configuration)First Use Case:
Edit MyPresentation.blade.php to include slides:
@slidewireDeck
@slidewireSlide(title="Introduction")
<h1>Welcome to SlideWire</h1>
<p>This is your first slide.</p>
@endslidewireSlide
@slidewireSlide(title="Features")
<h2>Key Features</h2>
<ul>
<li>Livewire-powered</li>
<li>Markdown support</li>
<li>Syntax highlighting</li>
</ul>
@endslidewireSlide
@endslidewireDeck
Route the Deck:
Add to routes/web.php:
SlideWire::route('my-presentation', 'MyPresentation');
Visit /my-presentation to see the presentation.
Run Locally:
php artisan serve
resources/views/presentations/ directory after generating a deck.config/slidewire.php for theme, auto-slide, and transition settings.@slidewireCode, @slidewireDiagram, and @slidewireMarkdown.@slidewireDeck and @slidewireSlide directives in a single Blade file.resources/views/presentations/MyPresentation/slides/1.blade.php) and include them:
@slidewireSlide(include="slides/1")
@endslidewireSlide
@slidewireMarkdown for content-heavy slides:
@slidewireMarkdown
# Slide Title
This is **Markdown** content.
```php
<?php
// Code block
?>
```
@endslidewireMarkdown
/my-presentation#slide-2).public function nextSlide()
{
$this->slideNumber++;
$this->emit('slideChanged');
}
Livewire Integration: Pass data to slides via Livewire properties:
@slidewireSlide
<h1>{{ $title }}</h1>
<p>Current slide: {{ $slideNumber }}</p>
@endslidewireSlide
public $title = "Dynamic Slide";
public $slideNumber = 1;
Database-Driven Slides: Fetch slide content from a database and render dynamically:
@foreach($slides as $slide)
@slidewireSlide(title="{{ $slide->title }}")
{!! $slide->content !!}
@endslidewireSlide
@endforeach
config/slidewire.php:
'theme' => 'dark',
Available themes: light, dark, custom.config/slidewire.php:
'themes' => [
'custom' => [
'colors' => [
'primary' => '#3b82f6',
'background' => '#f8fafc',
],
'typography' => [
'font-family' => 'Inter, sans-serif',
],
],
],
public/css/slidewire.css or publish the package assets:
php artisan vendor:publish --provider="WendellAdriel\SlideWire\SlideWireServiceProvider" --tag="slidewire-assets"
config/slidewire.php:
'auto_slide' => [
'enabled' => true,
'interval' => 5, // seconds
],
@slidewireSlide(autoSlideInterval=10)
<!-- Content -->
@endslidewireSlide
@slidewireCode: Syntax-highlighted code blocks.@slidewireDiagram: Mermaid.js diagrams.@slidewireMarkdown: Markdown rendering.@slidewireFragment: Reusable slide fragments.@slidewireCode(language="php")
<?php
// Code snippet
?>
@endslidewireCode
@slidewireVerticalGroup
@slidewireSlide(title="Vertical Slide 1")
<!-- Content -->
@endslidewireSlide
@slidewireSlide(title="Vertical Slide 2")
<!-- Content -->
@endslidewireSlide
@endslidewireVerticalGroup
Route::middleware(['auth'])->group(function () {
SlideWire::route('private-deck', 'PrivateDeck');
});
@slidewireSlide(title="{{ __('slides.intro.title') }}")
{{ __('slides.intro.content') }}
@endslidewireSlide
protected $listeners = ['slideChanged' => 'handleSlideChange'];
public function handleSlideChange()
{
// Custom logic
}
public function test_slide_rendering()
{
$deck = new MyPresentation();
$this->assertStringContainsString('Welcome to SlideWire', $deck->renderSlide(1));
}
public function test_presentation_navigation()
{
$this->browse()
->visit('/my-presentation')
->press('ArrowRight')
->assertSee('Features');
}
@slidewireSlide(lazyLoad=true)
<img src="{{ asset('large-diagram.svg') }}" alt="Diagram">
@endslidewireSlide
// In a service provider
SlideWire::setCacheEnabled(true);
@component('presentations.components.my-component', ['data' => $data])
@endcomponent
public function mount()
{
$this->dispatchBrowserEvent('slidewire:init');
}
@slidewireSlide
@foreach($apiData as $item)
<div>{{ $item->title }}</div>
@endforeach
@endslidewireSlide
config/app.php:
'providers' => [
// ...
Livewire\LivewireServiceProvider::class,
WendellAd
How can I help you explore Laravel packages today?