Stories Core

Рушій, на якому працює @reelkit/react-stories-player. Чистий TypeScript, без залежностей від фреймворків. Беріть його, щоб будувати плеєри історій для Angular, Vue чи звичайного JavaScript.

Framework-Agnostic
Чистий TypeScript, жодних залежностей від DOM-фреймворків
Дворівнева навігація
Групи та історії всередині кожної групи
Таймер на requestAnimationFrame
Автоперехід на requestAnimationFrame із паузою та відновленням
Прогрес на Canvas
Сегментована смуга прогресу з рухомим вікном, готова до Retina
Зони дотику
Налаштовне розпізнавання дотиків ліворуч і праворуч
Реактивні сигнали
Побудовано на примітивах сигналів @reelkit/core

Встановлення

bash

Контролер Stories

createStoriesController(config, events?) керує навігацією між групами та історіями. Стежить за станом паузи, запам’ятовує останню переглянуту історію в кожній групі й викликає колбеки на кожному переході.

Конфігурація (StoriesControllerConfig)

ВластивістьТипТипове значенняОпис
groupCountnumberrequiredЗагальна кількість груп історій
storyCountsnumber[]requiredКількість історій у кожній групі
initialGroupIndexnumber0Початковий індекс групи
initialStoryIndexnumber0Початковий індекс історії всередині групи
defaultImageDurationnumber5000Типова тривалість автопереходу для історій-зображень у мілісекундах

Події (StoriesControllerEvents)

EventТипОпис
onStoryChange(groupIndex, storyIndex) => voidСпрацьовує, коли змінюється активна історія
onGroupChange(groupIndex) => voidСпрацьовує, коли змінюється активна група
onStoryViewed(groupIndex, storyIndex) => voidСпрацьовує, коли історія стає видимою
onStoryComplete(groupIndex, storyIndex) => voidСпрацьовує, коли завершується таймер історії (перед переходом)
onComplete() => voidСпрацьовує, коли завершується остання історія останньої групи
onClose() => voidСпрацьовує, коли оверлей має закритися

Стан (реактивні сигнали)

SignalТипОпис
state.activeGroupIndexSignal<number>Індекс поточної активної групи
state.activeStoryIndexSignal<number>Індекс поточної активної історії всередині групи
state.isPausedSignal<boolean>Чи призупинено автоперехід

Методи

МетодТипОпис
nextStory()() => voidПерехід уперед у межах групи; на межі переходить у наступну групу
prevStory()() => voidПерехід назад у межах групи; на межі переходить у попередню групу
nextGroup()() => voidПеремикає на наступну групу, продовжуючи з останньої переглянутої історії
prevGroup()() => voidПеремикає на попередню групу, продовжуючи з останньої переглянутої історії
goToGroup(index)(number) => voidПерехід до конкретної групи за індексом
pause()() => voidПризупиняє автоперехід
resume()() => voidВідновлює автоперехід
onStoryTimerComplete()() => voidВикликається, коли таймер завершується; спрацьовує onStoryComplete, а потім відбувається перехід
getLastStoryIndex(groupIndex)(number) => numberІндекс останньої переглянутої історії групи (0, якщо група ще не відкривалася)

Example

typescript

Контролер таймера

createTimerController(config) керує автопереходом через цикл requestAnimationFrame . Сигнал прогресу (від 0 до 1) живить смугу прогресу. Пауза й відновлення зберігають точну позицію.

Конфігурація (TimerControllerConfig)

ВластивістьТипТипове значенняОпис
durationnumberrequiredТипова тривалість у мілісекундах
onComplete() => voidundefinedВикликається, коли таймер доходить до 100%

State

SignalТипОпис
progressSignal<number>Сигнал прогресу (від 0 до 1)
isRunningSignal<boolean>Чи таймер зараз працює

Методи

МетодТипОпис
start(duration?)(number?) => voidЗапускає (або перезапускає) таймер із необов’язковою заміною тривалості
pause()() => voidЗаморожує прогрес на поточній позиції
resume()() => voidПродовжує із замороженої позиції
reset()() => voidСкидає прогрес до 0 і зупиняє
dispose()() => voidЗвільняє ресурси

Example

typescript

Рендерер прогресу на Canvas

createCanvasProgressRenderer(config?) малює сегментовані смуги прогресу на canvas. Масштабується під дисплеї Retina, вимірює свій контейнер через ResizeObserver і вмикає рухоме вікно, коли сегменти не вміщаються.

Config (CanvasProgressRendererConfig)

ВластивістьТипТипове значенняОпис
gapnumber2Проміжок між сегментами в пікселях
barHeightnumber2Висота смуги в пікселях
minSegmentWidthnumber8Мінімальна ширина сегмента, після якої вмикається рухоме вікно
bgColorstring'rgba(255,255,255,0.3)'Колір тла незаповнених сегментів
fillColorstring'#ffffff'Колір заповнення завершених та активних сегментів

Методи

ЧленТипОпис
attach(canvas)(HTMLCanvasElement) => voidПідключає до елемента canvas; запускає ResizeObserver на батьківському елементі
draw(totalStories, activeIndex, progress)(number, number, number) => voidМалює смугу прогресу для заданого стану
widthnumber (readonly)Поточна виміряна ширина в пікселях CSS
dispose()() => voidПрибирає ResizeObserver і внутрішній стан

Example

typescript

Utility Functions

Чисті функції для розпізнавання зон дотику та обчислень смуги прогресу.

FunctionТипОпис
getTapAction(tapX, containerWidth, splitRatio?)(number, number, number?) => 'prev' | 'next'Визначає за позицією, що спричиняє дотик — 'prev' чи 'next'. Типове значення splitRatio — 0.3.
getSegments(totalStories, activeIndex, progress)(number, number, number) => SegmentState[]Обчислює стан і відсоток заповнення кожного сегмента смуги прогресу
getVisibleWindow(totalStories, activeIndex, progress, containerWidth, minSegmentWidth?, gap?)(number, number, number, number, number?, number?) => VisibleWindowОбчислює видиме рухоме вікно сегментів, коли їх більше, ніж уміщає контейнер

Types

Усі визначення типів, експортовані з @reelkit/stories-core.

typescript