Banner and Slider Module
Overview
The banner module manages promotional banners and image sliders for the storefront. Banners can be placed on brand/category pages, within CMS blocks, or embedded via HTML code on external sites. Sliders are ordered collections of slides displayed as carousels.
Models
Banner (banners table)
| Field |
Type |
Description |
id |
BigInteger PK |
|
name |
String(255) |
Internal name |
image_url |
String(500) |
Desktop image |
mobile_image_url |
String(500), nullable |
Responsive mobile image |
alt_text |
String(255), nullable |
Accessibility text |
destination_type |
String(50) |
url, page, product, brand, category |
destination_value |
String(500) |
URL or entity slug |
placement_type |
String(50) |
manual, brand_page, category_page, cms_block |
placement_config |
JSONB, nullable |
Placement-specific config (e.g., {"brand_slug": "acme"}) |
is_active |
Boolean |
Active toggle |
start_date / end_date |
DateTime, nullable |
Schedule window |
channel_id |
BigInteger, nullable |
Channel scope |
embed_code |
Text, nullable |
Auto-generated HTML snippet |
Slider (sliders table)
| Field |
Type |
Description |
id |
BigInteger PK |
|
name |
String(255) |
|
is_active |
Boolean |
|
auto_play |
Boolean |
Auto-advance slides |
interval_ms |
Integer |
Delay between slides (default 5000) |
show_arrows / show_dots |
Boolean |
Navigation controls |
transition |
String(20) |
slide or fade |
Slide (slides table)
| Field |
Type |
Description |
id |
BigInteger PK |
|
slider_id |
FK → sliders |
|
position |
Integer |
Sort order |
image_url, mobile_image_url, alt_text |
|
Same as Banner |
heading, subheading |
|
Optional overlay text |
destination_type, destination_value |
|
Same as Banner |
Services
BannerService: CRUD, list_banners(), get_banners_by_placement(), embed code generation
SliderService: CRUD, add_slide(), update_slide(), remove_slide(), reorder_slides()
GraphQL API
Queries
banners(activeOnly: Boolean) → [BannerType]
banner(id: ID!) → BannerType
bannersByPlacement(placementType: String!, entitySlug: String) → [BannerType]
sliders(activeOnly: Boolean) → [SliderType]
slider(id: ID!) → SliderType
Mutations
createBanner, updateBanner, deleteBanner
createSlider, updateSlider, deleteSlider
addSlide, updateSlide, removeSlide, reorderSlides
Storefront Integration
BlockBanner.svelte — responsive <picture> with tracking data attributes
BlockSlider.svelte — CSS scroll-snap carousel with autoplay, arrows, dots
- Both registered in
BlockRenderer.svelte as banner and slider block types
- Automated placement:
/products route loads banners matching brand/category slug