Современная браузерная читалка для книг в форматах FB2 и EPUB. Книга обрабатывается локально и не загружается на сервер.
- Открытие FB2, FB2.ZIP и EPUB 2/3 без DRM через диалог или drag-and-drop.
- Поддержка UTF-8, UTF-16 и распространённых однобайтовых кодировок, включая Windows-1251.
- Чтение адаптивных EPUB с главами, иллюстрациями, внутренними ссылками и сносками.
- Адаптивный режим одной или двух страниц.
- Навигация кнопками, стрелками клавиатуры, Page Up/Page Down и свайпом; кнопки можно скрыть или показывать адаптивно.
- Автоматически скрывающаяся верхняя панель с возвратом по движению мыши или тапу.
- Масштаб текста, светлая/тёмная тема и два режима сносок.
- Обложки и иллюстрации, встроенные в книгу.
- Сохранение настроек и позиции чтения в
localStorage. - Оценка времени до конца книги.
- Vite — разработка и production-сборка.
- TypeScript без UI-фреймворка — интерфейс и доменная логика.
- fflate — распаковка ZIP в браузере.
- Vitest + jsdom — модульные и интеграционные тесты.
- GitHub Actions — проверка тестов и сборки.
Минимальная версия Node.js — 22.22.2. Для локальной разработки рекомендуется Node.js 24.
npm install
npm run devVite выведет локальный адрес приложения. По умолчанию открывается демонстрационная «Анна Каренина»; другую книгу можно выбрать кнопкой в шапке.
npm test
npm run build
npm run previewsrc/
├── book/ общая модель книги и разбиение DOM на части
├── epub/ разбор контейнера EPUB и безопасный DOM-рендеринг
├── fb2/ загрузка, декодирование, разбор и DOM-рендеринг FB2
├── reader/ пагинация и безопасное локальное хранение
├── app.ts пользовательские сценарии и управление интерфейсом
├── settings.ts типы и значения настроек
├── main.ts точка входа
└── style.css адаптивный интерфейс и книжная типографика
books/
├── Anna-Karenina.fb2 демонстрационная книга
├── Anna-Karenina.fb2.zip архивная версия для проверки поддержки ZIP
└── Anna-Karenina.epub книга для проверки поддержки EPUB
FB2 и EPUB преобразуются в DOM напрямую. Для EPUB стили и исполняемое содержимое книги отключаются, внешние ресурсы не загружаются, а внутренние ссылки разрешаются только внутри архива. EPUB с DRM, зашифрованным содержимым или фиксированной вёрсткой отклоняется с понятным сообщением.