123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160 |
- import { ARIA_ORIENTATION } from '../../constants/attributes';
- import { TTB } from '../../constants/directions';
- import {
- EVENT_CLICK,
- EVENT_MOUNTED,
- EVENT_MOVE,
- EVENT_NAVIGATION_MOUNTED,
- EVENT_SLIDE_KEYDOWN,
- EVENT_UPDATED,
- } from '../../constants/events';
- import { LOOP } from '../../constants/types';
- import { EventInterface, EventInterfaceObject } from '../../constructors';
- import { Splide } from '../../core/Splide/Splide';
- import { BaseComponent, Components, Options } from '../../types';
- import { apply, empty, includes, isUndefined, prevent, setAttribute } from '../../utils';
- import { normalizeKey } from '../../utils/dom/normalizeKey/normalizeKey';
- import { SlideComponent } from '../Slides/Slide';
- /**
- * The interface for the Sync component.
- *
- * @since 3.0.0
- */
- export interface SyncComponent extends BaseComponent {
- remount(): void;
- }
- /**
- * The keys for triggering the navigation slide.
- *
- * @since 3.0.0
- */
- const TRIGGER_KEYS = [ ' ', 'Enter' ];
- /**
- * The component for syncing multiple sliders.
- *
- * @since 3.0.0
- *
- * @param Splide - A Splide instance.
- * @param Components - A collection of components.
- * @param options - Options.
- *
- * @return A Sync component object.
- */
- export function Sync( Splide: Splide, Components: Components, options: Options ): SyncComponent {
- const { isNavigation, slideFocus } = options;
- /**
- * Stores event objects.
- */
- const events: EventInterfaceObject[] = [];
- /**
- * Called when the component is mounted.
- */
- function mount(): void {
- Splide.splides.forEach( target => {
- if ( ! target.isParent ) {
- sync( Splide, target.splide );
- sync( target.splide, Splide );
- }
- } );
- if ( isNavigation ) {
- navigate();
- }
- }
- /**
- * Destroys the component.
- */
- function destroy(): void {
- events.forEach( event => { event.destroy() } );
- empty( events );
- }
- /**
- * Remounts the component.
- *
- * @internal
- */
- function remount(): void {
- destroy();
- mount();
- }
- /**
- * Syncs the current index with a provided child splide instance.
- *
- * @param splide - A splide instance to sync with.
- * @param target - A target splide instance.
- */
- function sync( splide: Splide, target: Splide ): void {
- const event = EventInterface( splide );
- event.on( EVENT_MOVE, ( index, prev, dest ) => {
- target.go( target.is( LOOP ) ? dest : index );
- } );
- events.push( event );
- }
- /**
- * Makes slides clickable and moves the slider to the index of clicked slide.
- * Note that the direction of `menu` is implicitly `vertical` as default.
- */
- function navigate(): void {
- const event = EventInterface( Splide );
- const { on } = event;
- on( EVENT_CLICK, onClick );
- on( EVENT_SLIDE_KEYDOWN, onKeydown );
- on( [ EVENT_MOUNTED, EVENT_UPDATED ], update );
- events.push( event );
- event.emit( EVENT_NAVIGATION_MOUNTED, Splide.splides );
- }
- /**
- * Update attributes.
- */
- function update(): void {
- setAttribute( Components.Elements.list, ARIA_ORIENTATION, options.direction === TTB ? 'vertical' : '' );
- }
- /**
- * Called when the navigation slide is clicked.
- *
- * @param Slide - A clicked Slide component.
- */
- function onClick( Slide: SlideComponent ): void {
- Splide.go( Slide.index );
- }
- /**
- * Called when any key is pressed on the navigation slide.
- *
- * @param Slide - A Slide component.
- * @param e - A KeyboardEvent object.
- */
- function onKeydown( Slide: SlideComponent, e: KeyboardEvent ): void {
- if ( includes( TRIGGER_KEYS, normalizeKey( e ) ) ) {
- onClick( Slide );
- prevent( e );
- }
- }
- return {
- setup: apply(
- Components.Media.set,
- { slideFocus: isUndefined( slideFocus ) ? isNavigation : slideFocus },
- true
- ),
- mount,
- destroy,
- remount,
- };
- }
|