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Початковий індекс групи
initialStoryIndexnumberresumeStoryIndex(initialGroupIndex), інакше 0Початковий індекс історії всередині групи. Явно названий переважає над збереженим; пропустіть — і початкова група відновлюється, як і всі інші.
defaultImageDurationnumber5000Типова тривалість автопереходу для історій-зображень у мілісекундах
resumeStoryIndex(groupIndex: number) => numberundefinedІсторія, на якій відкривається ще не відвідана група; обмежена наявними історіями

Події (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Де відкривається група: історія, на якій її залишили в цій сесії, інакше та, що назве resumeStoryIndex
reportInitialView()() => voidПовідомляє історію, на якій відкрився плеєр, як переглянуту — один раз. Викликайте після монтування, а не під час рендерингу.

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

Переглянуте

createStoriesViewedState(controller, groups) читає ViewedStateController ядра в термінах плеєра — групи, автори, індекси історій, — лишаючи саме сховище про них необізнаним. Повертає StoriesViewedState. Побудуйте сховище з того самого ключа, що й адресний рядок, з відстеженням на групу — і збережений запис читатиметься точно як параметр спільного посилання.

ПараметрТипОпис
controllerViewedStateController<TwoAxisPosition>Сховище ядра, побудоване з того самого ключа, що й адресний рядок, розгорнуте з twoAxisViewedTracking, щоб кожна група мала власний запис
groups() => StoriesGroup<T>[]Читає поточні групи. Гетер, тож стрічка, що довантажується або перевпорядковується після налаштування, вимірюється на момент виклику.

StoriesViewedState

МетодТипОпис
viewedCounts()() => Map<string, number>Переглянуті історії на групу, за id автора — форма, яку StoriesRingList приймає як viewedState
resumeStoryIndex(groupIndex)(number) => numberПерша непереглянута історія або 0, коли групу переглянуто до кінця
markViewed(groupIndex, storyIndex)(number, number) => voidЗаписує історію як переглянуту. Під'єднайте до onStoryViewed.

Приклад

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