A comprehensive slideshow management plugin with Swiper.js integration for Craft CMS 5.x.
This is a commercial plugin licensed under the Craft License. It will be available on the Craft Plugin Store soon. See LICENSE.md for details.
This plugin is in active development and not yet available on the Craft Plugin Store. Features and APIs may change before the initial public release.
- Slideshow Manager for Craft CMS
Get up and running with Slideshow Manager in 5 minutes:
1. Install the plugin
composer require lindemannrock/craft-slideshow-manager
./craft plugin/install slideshow-manager2. Configure global settings (optional)
- Go to Slideshow Manager → Settings in the Control Panel
- Configure default Swiper behavior (navigation, pagination, autoplay, etc.)
- Set CSS custom properties for styling
3. Add a field to your section
- Go to Settings → Fields
- Create a new "Slideshow Config" field (for per-entry config)
- Add it to your entry type
4. Use in templates
{# Get config from entry field or use global defaults #}
{% set config = entry.slideshowConfig ?? craft.slideshowManager.settings.defaultSwiperConfig %}
{% set sliderId = 'slider-' ~ random() %}
{% set swiperConfig = craft.slideshowManager.buildSwiperConfig(config, sliderId) %}
{% set cssVars = craft.slideshowManager.buildCssVars() %}
{# Build slideshow - CSS/JS auto-loaded by plugin #}
<div class="swiper" id="{{ sliderId }}" style="{{ cssVars }}" data-swiper-config="{{ swiperConfig|json_encode|e('html_attr') }}">
<div class="swiper-wrapper">
{% for slide in entry.slides %}
<div class="swiper-slide">
{{ slide.content }}
</div>
{% endfor %}
</div>
{# Navigation/pagination if enabled #}
{% if config.navigation %}
<div class="swiper-button-prev swiper-button-prev-{{ sliderId }}"></div>
<div class="swiper-button-next swiper-button-next-{{ sliderId }}"></div>
{% endif %}
{% if config.paginationEnabled %}
<div class="swiper-pagination swiper-pagination-{{ sliderId }}"></div>
{% endif %}
</div>
{# Initialize slider - simple one-liner! #}
{{ craft.slideshowManager.initSlider(sliderId) }}That's it! Your slideshow is live. See Usage for more details and Examples for comprehensive use cases.
- Automatic Asset Loading: CSS and JS automatically injected when enabled in settings
- Two Field Types: Slideshow field (Matrix-based) and Config field (per-entry settings)
- Comprehensive Configuration: 30+ Swiper options across 5 organized settings tabs
- Per-Entry Customization: Optional config field for entry-specific slideshow settings
- Responsive Controls: Breakpoint-based configuration with visual UI
- Visibility Management: Control navigation/pagination display per device (mobile/desktop)
- CSS Custom Properties: Full Swiper styling customization via CSS variables
- Config File Overrides: Environment-specific settings
- Helper Methods: Simple template methods for initialization and config transformation
- Integrated Logging: Built-in logging with configurable levels
- Craft CMS 5.0.0 or later
- PHP 8.2 or later
- Logging Library 5.0 or greater (installed automatically as dependency)
cd /path/to/projectcomposer require lindemannrock/craft-slideshow-manager./craft plugin/install slideshow-managercd /path/to/projectddev composer require lindemannrock/craft-slideshow-managerddev craft plugin/install slideshow-managerIn the Control Panel, go to Settings → Plugins and click "Install" for Slideshow Manager.
Note: Frontend assets are pre-built and included. No build step required for installation.
By default, the plugin auto-loads Swiper from CDN. However, you can use your own Swiper installation:
1. Install Swiper via npm:
npm install swiper
# or
yarn add swiper
# or
pnpm add swiper2. Import in your JavaScript:
// Your main JS file (e.g., src/js/app.js)
import Swiper from 'swiper';
import { Navigation, Pagination, Autoplay, EffectFade, EffectCube, EffectCoverflow, EffectCards, Grid } from 'swiper/modules';
// Import Swiper styles
import 'swiper/css';
import 'swiper/css/navigation';
import 'swiper/css/pagination';
import 'swiper/css/effect-fade';
import 'swiper/css/effect-cube';
import 'swiper/css/effect-coverflow';
import 'swiper/css/effect-cards';
import 'swiper/css/grid';
// Configure Swiper to use modules globally
Swiper.use([Navigation, Pagination, Autoplay, EffectFade, EffectCube, EffectCoverflow, EffectCards, Grid]);
// Make Swiper globally available
window.Swiper = Swiper;Note: Only import the modules you need. Available modules include:
Navigation,Pagination,ScrollbarAutoplay,EffectFade,EffectCube,EffectFlip,EffectCoverflow,EffectCards,EffectCreativeGrid,FreeMode,Thumbs,Parallax,ZoomKeyboard,Mousewheel,HashNavigation,History,Controller,A11y,Virtual,Manipulation
See Swiper Modules Documentation for complete details.
3. Disable auto-loading in plugin settings:
Via Control Panel:
- Go to Slideshow Manager → Settings → General
- Disable "Auto Load Swiper CSS"
- Disable "Auto Load Swiper JS"
Or via config file:
// config/slideshow-manager.php
return [
'autoLoadSwiperCss' => false,
'autoLoadSwiperJs' => false,
];4. Use the plugin normally:
The initSlider() helper will use your bundled Swiper installation automatically.
The plugin auto-loads Swiper from CDN when enabled in settings:
- CSS:
https://cdn.jsdelivr.net/npm/swiper@11/swiper-bundle.min.css - JS:
https://cdn.jsdelivr.net/npm/swiper@11/swiper-bundle.min.js
This is the easiest option but may not be ideal for production due to:
- Additional HTTP requests
- No control over caching
- Dependency on external CDN availability
You can use a different CDN or Swiper version by:
- Disabling auto-loading in settings
- Loading Swiper manually in your template:
{# In your layout template #}
<link rel="stylesheet" href="https://unpkg.com/swiper@10/swiper-bundle.min.css">
<script src="https://unpkg.com/swiper@10/swiper-bundle.min.js"></script>Settings can be configured in the Control Panel at Slideshow Manager → Settings, or via a config file.
- Plugin Name: Customize the plugin display name
- Auto Load Swiper CSS: Automatically inject Swiper CSS on frontend pages
- Auto Load Swiper JS: Automatically inject Swiper JS on frontend pages
- Enable Cache: Cache slideshow data for better performance
- Cache Duration: How long to cache data (in seconds)
- Log Level: Logging verbosity (debug, info, warning, error)
- Basic Settings: Navigation, pagination, autoplay, effects, loop
- Layout & Responsive: Slides per view, spacing, grid mode, breakpoints
- Controls: Keyboard, mousewheel, scrollbar, hash navigation
- Advanced: Free mode, lazy loading, parallax, zoom, virtual slides
Create a config/slideshow-manager.php file to override default settings:
cp vendor/lindemannrock/craft-slideshow-manager/src/config.php config/slideshow-manager.php<?php
return [
// Plugin settings
'pluginName' => 'Slideshow',
'autoLoadSwiperCss' => true,
'autoLoadSwiperJs' => true,
'enableCache' => true,
'cacheDuration' => 3600,
'logLevel' => 'error', // debug, info, warning, error
// Default Swiper configuration
'defaultSwiperConfig' => [
// Basic
'loop' => true,
'speed' => 300,
'effect' => 'slide', // slide, fade, cube, coverflow, flip, cards, creative
// Navigation
'navigation' => true,
'navigationVisibility' => 'default', // default, hide-mobile, hide-desktop, mobile-only, desktop-only
// Pagination
'paginationEnabled' => true,
'paginationClickable' => true,
'paginationType' => 'bullets', // bullets, fraction, progressbar
'paginationVisibility' => 'default',
// Autoplay
'autoplayEnabled' => false,
'autoplayDelay' => 3000,
'autoplayDisableOnInteraction' => false,
// Layout
'slidesPerView' => 1,
'spaceBetween' => 0,
'centeredSlides' => false,
// Grid
'gridEnabled' => false,
'gridRows' => 1,
'gridFill' => 'row', // row, column
// Responsive breakpoints
'breakpoints' => [
['width' => 0, 'slidesPerView' => 1, 'spaceBetween' => 0],
['width' => 640, 'slidesPerView' => 1, 'spaceBetween' => 10],
['width' => 768, 'slidesPerView' => 2, 'spaceBetween' => 20],
['width' => 1024, 'slidesPerView' => 3, 'spaceBetween' => 30],
],
// See src/config.php for all available options
],
// Swiper CSS Custom Properties
'swiperCssVars' => [
// Theme
'themeColor' => 'var(--color-brand)',
// Navigation
'navigationColor' => 'var(--color-brand)',
// 'navigationSize' => '44px',
// Pagination
'paginationColor' => 'var(--color-brand)',
// 'paginationBulletSize' => '8px',
// See src/config.php for all available CSS variables
],
];Settings defined in the config file will override CP settings.
<?php
return [
'*' => [
// Global defaults
'logLevel' => 'error',
'enableCache' => true,
],
'dev' => [
// Development - verbose logging
'logLevel' => 'debug',
'cacheDuration' => 3600, // 1 hour
],
'staging' => [
// Staging - moderate logging
'logLevel' => 'info',
'cacheDuration' => 86400, // 1 day
],
'production' => [
// Production - minimal logging
'logLevel' => 'error',
'cacheDuration' => 2592000, // 30 days
],
];See Configuration Documentation for all available options.
The Config field stores per-entry Swiper configuration:
- Go to Settings → Fields
- Create a new field, select "Slideshow Config"
- Add to entry types where custom config is needed
- Configure in entries:
- Navigation (on/off, visibility controls)
- Pagination (on/off, type, visibility controls)
- Autoplay (enabled, delay, disable on interaction)
- Loop, Speed, Effect
- Slides Per View, Spacing, Centered Slides
- Grid Mode
- Responsive Breakpoints
Configure default Swiper settings at Slideshow Manager → Settings:
- General: Plugin name, asset loading, caching, logging
- Basic Settings: Navigation, pagination, autoplay, effects, loop
- Layout & Responsive: Slides display, grid mode, breakpoints
- Controls: Keyboard, mousewheel, scrollbar, hash navigation
- Advanced: Free mode, lazy loading, parallax, zoom, virtual slides
{# Get config (from entry field or global defaults) #}
{% set config = entry.slideshowConfig ?? craft.slideshowManager.settings.defaultSwiperConfig %}
{# Generate unique slider ID #}
{% set sliderId = 'slider-' ~ random() %}
{# Build Swiper config and CSS vars #}
{% set swiperConfig = craft.slideshowManager.buildSwiperConfig(config, sliderId) %}
{% set cssVars = craft.slideshowManager.buildCssVars() %}
{# Render slideshow - CSS/JS auto-loaded if enabled in settings #}
<div class="swiper"
id="{{ sliderId }}"
style="{{ cssVars }}"
data-swiper-config="{{ swiperConfig|json_encode|e('html_attr') }}">
<div class="swiper-wrapper">
{% for slide in entry.slides %}
<div class="swiper-slide">
<img src="{{ slide.image.url }}" alt="{{ slide.image.title }}">
<h3>{{ slide.title }}</h3>
<p>{{ slide.description }}</p>
</div>
{% endfor %}
</div>
{# Navigation buttons (if enabled in config) #}
{% if config.navigation %}
<div class="swiper-button-prev swiper-button-prev-{{ sliderId }}"></div>
<div class="swiper-button-next swiper-button-next-{{ sliderId }}"></div>
{% endif %}
{# Pagination (if enabled in config) #}
{% if config.paginationEnabled %}
<div class="swiper-pagination swiper-pagination-{{ sliderId }}"></div>
{% endif %}
</div>
{# Initialize slider #}
{{ craft.slideshowManager.initSlider(sliderId) }}{# Enable console logging for debugging #}
{{ craft.slideshowManager.initSlider(sliderId, {}, true) }}This outputs initialization details to the browser console.
{# Override config at initialization #}
{{ craft.slideshowManager.initSlider(sliderId, {
speed: 1000,
autoplay: {
delay: 5000,
disableOnInteraction: true
}
}) }}{# Hide navigation on mobile, show on desktop #}
{% if config.navigation %}
<div class="swiper-button-prev swiper-button-prev-{{ sliderId }} {{ craft.slideshowManager.getVisibilityClasses('hide-mobile') }}"></div>
<div class="swiper-button-next swiper-button-next-{{ sliderId }} {{ craft.slideshowManager.getVisibilityClasses('hide-mobile') }}"></div>
{% endif %}Visibility options:
default- Always visiblehide-mobile- Hidden on mobile, visible on desktophide-desktop- Visible on mobile, hidden on desktopmobile-only- Only visible on mobiledesktop-only- Only visible on desktop
Access plugin settings:
{# Get all settings #}
{% set settings = craft.slideshowManager.settings %}
{# Access specific settings #}
{% set defaultConfig = craft.slideshowManager.settings.defaultSwiperConfig %}
{% set pluginName = craft.slideshowManager.settings.pluginName %}
{% set autoLoadCss = craft.slideshowManager.settings.autoLoadSwiperCss %}Returns: Settings model with all plugin configuration
Transforms flat field structure into nested Swiper format:
{% set swiperConfig = craft.slideshowManager.buildSwiperConfig(config, sliderId) %}Parameters:
config(array) - Merged configuration (field + global)sliderId(string) - Unique identifier for this slider
Returns: Array ready for Swiper initialization
Builds inline CSS custom properties for Swiper styling:
{% set cssVars = craft.slideshowManager.buildCssVars() %}
{# Or with custom vars: #}
{% set cssVars = craft.slideshowManager.buildCssVars({
themeColor: '#007bff',
navigationColor: '#0056b3',
paginationColor: '#6c757d'
}) %}Parameters:
cssVars(array|null) - Optional CSS variables (uses settings if null)
Returns: String of CSS custom properties for inline style
Initializes Swiper for a specific slider:
{{ craft.slideshowManager.initSlider(sliderId) }}Parameters:
sliderId(string, required) - The unique slider IDoverrides(array, optional) - Override/extend config at runtimedebug(bool, optional) - Enable console logging
Returns: Empty markup (JS is registered with Craft's view)
Gets CSS classes for navigation/pagination visibility:
{{ craft.slideshowManager.getVisibilityClasses('hide-mobile') }}Parameters:
visibility(string) - Visibility option (default, hide-mobile, hide-desktop, mobile-only, desktop-only)
Returns: CSS classes string
Slideshow Manager supports full Swiper styling customization via CSS custom properties. These can be configured globally in settings or per-slideshow via the buildCssVars() method.
themeColor- Main theme color
navigationSize- Navigation button sizenavigationTopOffset- Top offset for navigationnavigationSidesOffset- Side offset for navigationnavigationColor- Navigation icon colornavigationInactiveColor- Inactive navigation colornavigationBg- Navigation backgroundnavigationBgHover- Navigation background on hovernavigationPadding- Navigation paddingnavigationBorderColor- Navigation border colornavigationBorderColorHover- Navigation border color on hovernavigationShadow- Navigation shadownavigationShadowHover- Navigation shadow on hover
paginationColor- Active pagination colorpaginationBulletSize- Bullet sizepaginationBulletWidth- Bullet widthpaginationBulletHeight- Bullet heightpaginationBulletInactiveColor- Inactive bullet colorpaginationBulletInactiveOpacity- Inactive bullet opacitypaginationBulletOpacity- Active bullet opacitypaginationBulletHorizontalGap- Horizontal gap between bulletspaginationBulletVerticalGap- Vertical gap between bulletspaginationFractionColor- Fraction text colorpaginationProgressbarBgColor- Progressbar backgroundpaginationProgressbarSize- Progressbar sizepaginationLeft- Left positionpaginationRight- Right positionpaginationTop- Top positionpaginationBottom- Bottom position
scrollbarBorderRadius- Scrollbar border radiusscrollbarTop- Top positionscrollbarBottom- Bottom positionscrollbarLeft- Left positionscrollbarRight- Right positionscrollbarSidesOffset- Side offsetscrollbarBgColor- Background colorscrollbarDragBgColor- Drag handle backgroundscrollbarSize- Scrollbar size
thumbActiveColor- Active thumbnail colorslideBgColor- Slide background color
All CSS variables use a fallback pattern for easy customization:
--swiper-theme-color: var(--_swiper-theme-color, #007bff);This allows you to override in your own CSS:
.swiper {
--_swiper-theme-color: var(--color-primary);
--_swiper-navigation-size: 60px;
--_swiper-pagination-color: var(--color-accent);
}The plugin supports all Swiper.js configuration options. Configuration can be set:
- Globally - In plugin settings or config file
- Per-Entry - Using the Slideshow Config field
- At Runtime - Via
initSlider()overrides parameter
See Swiper API Documentation for all available options.
For comprehensive examples covering all features, see docs/examples.md.
Includes examples for:
- Basic slideshow setup
- Custom styling with CSS variables
- Runtime config overrides and debug mode
- Grid mode and different effects (fade, cube, coverflow, cards)
- Responsive visibility controls
- Autoplay configurations
- Responsive breakpoints
- Multiple sliders on one page
- Custom Swiper installation (npm/yarn/pnpm)
- Programmatic control and accessing Swiper instances
- Advanced techniques like thumbnail navigation
Slideshow Manager uses the LindemannRock Logging Library for centralized logging.
- Error: Critical errors only (default)
- Warning: Errors and warnings
- Info: General information
- Debug: Detailed debugging (includes performance metrics, requires devMode)
// config/slideshow-manager.php
return [
'logLevel' => 'error', // error, warning, info, or debug
];Note: Debug level requires Craft's devMode to be enabled. If set to debug with devMode disabled, it automatically falls back to info level.
- Location:
storage/logs/slideshow-manager-YYYY-MM-DD.log - Retention: 30 days (automatic cleanup via Logging Library)
- Format: Structured JSON logs with context data
- Web Interface: View and filter logs in CP at Slideshow Manager → Logs
Access logs through the Control Panel:
- Navigate to Slideshow Manager → Logs
- Filter by date, level, or search terms
- Download log files for external analysis
- View file sizes and entry counts
- Auto-cleanup after 30 days (configurable via Logging Library)
Requires: lindemannrock/logginglibrary plugin (installed automatically as dependency)
See docs/LOGGING.md for detailed logging documentation.
Check browser console:
- Look for JavaScript errors
- Verify Swiper.js is loaded
- Check
data-swiper-configattribute exists
Verify auto-loading is enabled:
- Go to Settings → Slideshow Manager → General
- Ensure "Auto Load Swiper JS" is enabled
Clear caches:
./craft clear-caches/allCheck config:
- Verify
navigationorpaginationEnabledis true in your config - Check visibility settings aren't hiding elements
Check element classes:
- Navigation:
.swiper-button-prev-{{ sliderId }}and.swiper-button-next-{{ sliderId }} - Pagination:
.swiper-pagination-{{ sliderId }}
Verify auto-loading:
- "Auto Load Swiper CSS" must be enabled in settings
Check config:
- CSS vars must be configured in settings or config file
- Use
buildCssVars()in template
Browser support:
- CSS custom properties require modern browsers
- IE11 not supported
Check permissions:
- Verify user has permission to edit entries
Clear caches:
- Clear Craft caches and reload the entry
- Check browser console for errors
Verify Live Preview:
- Field works differently in Live Preview mode
- Save the entry to persist changes
- Documentation: https://github.com/LindemannRock/craft-slideshow-manager
- Issues: https://github.com/LindemannRock/craft-slideshow-manager/issues
- Email: support@lindemannrock.com
This plugin is licensed under the Craft License. See LICENSE.md for details.
Developed by LindemannRock