Sitecore Component

Medical Quote Slider

An accessible, animated testimonial carousel built for UHealth and Miller School of Medicine's enterprise Sitecore platform.

Client
Miller School of Medicine
Platform
Sitecore CMS
Type
Interactive Component
Scroll to explore

Experience the Component

Interactive quote slider with typewriter expansion effect, touch gestures, and keyboard navigation.

med.miami.edu/component/quote-slider

Built for Healthcare Excellence

Every feature designed with accessibility, performance, and user experience in mind.

Typewriter Animation

Engaging text reveal animation that draws readers into the full quote content, with smooth cursor blinking effect.

WCAG 2.2 Compliant

Full keyboard navigation, ARIA labels, screen reader support, and prefers-reduced-motion respect.

📱

Touch Gestures

Native swipe navigation for mobile devices with intelligent auto-advance pause on interaction.

🔄

Auto-Advance

Smart carousel rotation with viewport detection and user interaction awareness.

📐

Dynamic Height

Container smoothly adapts to content length during expansion with CSS cubic-bezier transitions.

🎯

CMS Isolated

Scoped CSS prevents conflicts with Sitecore's enterprise environment and other page components.

Under the Hood

Performance-optimized vanilla JavaScript with zero dependencies.

Framework
Vanilla JavaScript ES6+
Dependencies
Zero External
Animation
CSS Transitions + JS
Auto-Advance
7s Interval
Typewriter Speed
20ms per character
Touch Threshold
50px swipe distance
Viewport Detection
IntersectionObserver
Accessibility
WCAG 2.2 AA

Code Architecture

Class-based JavaScript with modular event handling and state management.

quote-slider.js
class MedicalQuoteSlider {
    constructor() {
        this.quotes = [...]; // Quote data array
        this.currentSlide = 0;
        this.isExpanded = false;
        this.autoAdvanceInterval = 7000;
        this.init();
    }

    init() {
        this.createSlides();
        this.createNavigation();
        this.bindEvents();
        this.setupIntersectionObserver();
        this.showSlide(0);
    }

    // Dynamic slide generation
    createSlides() {
        const wrapper = document.getElementById('sliderWrapper');
        this.quotes.forEach((quote, index) => {
            const slide = document.createElement('div');
            slide.className = 'slide';
            slide.setAttribute('role', 'tabpanel');
            // ... slide content generation
        });
    }
}