Інтерактивний PWA-застосунок для підготовки з електротехніки: теорія, флешкартки, задачі, квіз, екзамен, аналітика, backup/import прогресу.
- Демо:
https://anton5267.github.io/electro-study-lab/ - План розвитку:
ROADMAP.md - Гайд по контенту:
CONTRIBUTING-CONTENT.md
git clone https://github.com/anton5267/electro-study-lab.git
cd electro-study-lab
npm ci
npm run serveВідкрий: http://127.0.0.1:4173
index.html— головна сторінка застосунку.elektro-lernseite 2.html— сумісний редирект наindex.html.assets/css/main.css— увесь візуальний шар, адаптивність і стилі друку.assets/js/app.js— стан, рендеринг, режими навчання, імпорт та аналітика.assets/js/modules/assessment-state.js— чиста логіка квізу та екзамену: сесії, відповіді, результати і статистика проходжень.assets/js/modules/checklist-state.js— pure-логіка checklist-flow (complete/reset/toggle + index guards) без прив'язки до DOM.assets/js/modules/checklist-control.js— pure-логіка parsing checklist toggle intents ([data-check-index]) без DOM side effects.assets/js/modules/flashcard-state.js— pure-логіка flashcard-flow (next/prev/seen/shuffle) з guard-перевірками індексів і порядку.assets/js/modules/practice-state.js— pure-логіка практичних перевірок (answer evaluation + solved-set transitions) без DOM.assets/js/modules/practice-control.js— pure-логіка parsing намірів для practice input/check/keydown дій у DOM-подіях.assets/js/modules/quiz-control.js— pure-логіка parsing намірів quiz answer дій (click/keyboard) без UI-побічних ефектів.assets/js/modules/theory-control.js— pure-логіка parsing/select action для theory hotspots без DOM-побічних ефектів.assets/js/modules/jump-control.js— pure-логіка parsing jump/review-now actions для spotlight/search/review переходів.assets/js/modules/keyboard-control.js— pure-логіка parsing keyboard-shortcut intents (modal/section/answer/flashcards) без side effects.assets/js/modules/nav-control.js— pure-логіка parsing nav-tab click/keydown intents (section select + focus navigation).assets/js/modules/language-control.js— pure-логіка parsing language-switch intents для.lang-btnбез DOM side effects.assets/js/modules/topic-control.js— pure-логіка parsing topic-filter intents ([data-topic-filter]) з валідацією дозволених тем.assets/js/modules/exam-intro-control.js— pure-логіка parsing exam-intro intents (start/change settings) без DOM side effects.assets/js/modules/exam-control.js— pure-плани exam submit/reset/restore transitions і runtime/keyboard action parsing для orchestration-рівня.assets/js/modules/content.js— базовий двомовний контент і злиття з користувацьким пакетом.assets/js/modules/progress-state.js— чиста логіка backup-payload, імпорту прогресу і нормалізації state під поточний content pack.assets/js/modules/runtime.js— URL-стан, серіалізація і відновлення екзаменаційної сесії.assets/js/modules/exam-preferences.js— pure-константи і нормалізація налаштувань екзамену (тривалість/кількість питань, runtime fallback resolution).assets/js/modules/exam-runtime.js— pure-утиліти runtime-життєвого циклу екзамену (auto-submit, tick action planning, started-state builder, restore action, snapshot).assets/js/modules/exam-session.js— pure-фіналізація екзаменаційної сесії (scoring, review/mastery updates, finished state).assets/js/modules/quiz-session.js— pure-фіналізація квіз-сесії (scoring, review/mastery updates, session label).assets/js/modules/storage.js— ключіlocalStorageі нормалізація статистики.assets/js/modules/study-helpers.js— чисті селектори та похідна навчальна логіка.assets/js/modules/review-planner.js— pure-логіка пріоритезації теми для adaptive review mode і вибору next review-candidate.assets/js/modules/progress-metrics.js— pure-розрахунок прогрес-метрик (completion, accuracy, per-section counters).assets/js/modules/view-plan.js— pure-плани ререндерів для bootstrap/search/topic/progress UI-орchestration.assets/js/modules/templates.js— HTML-шаблони для секцій, карток, квізу, екзамену та аналітики.assets/js/modules/validation.js— схема валідації дляcustom packіbackupімпорту.assets/js/modules/utils.js— спільні утиліти.assets/data/study-pack-template.json— шаблон для імпорту власних тем.assets/data/backup-template.json— шаблон резервної копії прогресу для перевірки/автоматизації імпорту.assets/data/csv-template/— стартові CSV-файли (uk/de) для швидкого batch-створення custom pack.manifest.webmanifest— опис PWA для встановлення.service-worker.js— кешування ресурсів для офлайн-режиму.assets/icons/— іконки застосунку..github/workflows/deploy-pages.yml— CI/CD workflow, який перевіряє застосунок і публікує його на GitHub Pages..github/workflows/quality.yml— CI workflow, який ганяє повнийqualitygate на GitHub Actions..github/workflows/release.yml— workflow для тегівv*, який перевіряє проєкт і збирає GitHub Release з zip-артефактом..github/workflows/gitleaks.yml— workflow для secret scanning наpush,pull_requestі вручну..github/dependabot.yml— автопідтримка npm і GitHub Actions залежностей..gitleaks.toml— конфігурація для секрет-сканераgitleaks.scripts/github/enable-security-analysis.ps1— вмикає GitHub security analysis (secret scanning, push protection, dependabot security updates).scripts/github/apply-branch-protection.ps1— застосовує branch protection (required checks, PR review, no force-push)..github/release.yml— категорії для autogenerated GitHub release notes.CHANGELOG.md— базовий журнал змін і стартова release-нота для поточного стану проєкту.RELEASE-CHECKLIST.md— pre-release чекліст перед створенням git-тегаv*.ROADMAP.md— покроковий план розвитку продукту на 2026 рік.CONTRIBUTING-CONTENT.md— правила та чекліст для додавання нових питань/задач/карток.LICENSE— ліцензія проєкту (MIT).SECURITY.md— політика відповідального security disclosure.scripts/dev-server.mjs— локальний статичний сервер для роботи черезhttp://localhostіз базовими security headers (включно з CSP для HTML), method/path guards, explicitContent-Lengthна200і conditional caching (ETag/Last-Modified/304).scripts/dev-server-helpers.mjs— pure-утиліти локального сервера: path-resolution guards, cache/CSP headers, ETag/conditional validators і централізований CSP-contract для validate/smoke.scripts/package-site.mjs— збірка статичного deploy-пакета вdist/для GitHub Pages або іншого хостингу.scripts/content-workbench.mjs— звіт і quality-gate для контенту: обсяг, покриття по темах, міжмовна парністьUA/DE.scripts/check-size-budget.mjs— size-budget gate для ключових файлів (app.js,content.js,main.css,service-worker.js, total JS).scripts/build-study-pack-from-csv.mjs— генераторcustom packJSON з CSV-файлів для швидкого контент-спринту.- за замовчуванням вимагає ID-парність між
uk/deдляquiz/practice/flashcards.
- за замовчуванням вимагає ID-парність між
scripts/validate-custom-pack.mjs— CLI-перевіркаcustom packJSON перед імпортом у застосунок.scripts/validate-backup-payload.mjs— CLI-перевірка backup JSON перед імпортом прогресу в застосунок.scripts/export-content-to-csv.mjs— експорт поточного базового контенту у CSV (uk/de) для batch-редагування.scripts/audit-accessibility.mjs— headless accessibility і layout audit: axe-core, mobile overflow і print-view checks.scripts/browser-smoke-helpers.mjs— спільні helper-функції для browser smoke-сценаріїв (server wait, section sync, modal close).scripts/http-smoke-helpers.mjs— спільні helper-функції для HTTP smoke-перевірок (header/cache assertions, raw path checks).scripts/smoke-checks.mjs— централізований список HTTP smoke-ресурсів і expected precache-paths для source/dist/validate синхронізації.scripts/smoke-browser.mjs— Playwright smoke-test реальних browser-сценаріїв: share-link, restore exam і import backup.scripts/smoke-dist.mjs— smoke-перевірка вже зібраногоdist/пакета через локальний статичний сервер.scripts/smoke-dist-browser.mjs— headless browser smoke-test уже зібраногоdist/пакета.scripts/smoke-http.mjs— smoke-перевірка основних HTTP-ресурсів через локальний сервер.scripts/visual-regression.mjs— Playwright + pixelmatch regression runner з baseline PNG для desktop/mobile layout.scripts/release-preflight.mjs— pre-release оркестратор: quality/packaging/dist smoke + release-manifest checks перед тегом.scripts/test-runtime.mjs— сценарні тести на URL-state і відновлення екзамену.scripts/test-storage.mjs— сценарні тести ключів localStorage та міграції storage-схеми.scripts/test-dev-server-helpers.mjs— сценарні тести pure-helper логіки локального сервера (path guards, cache/CSP headers, ETag/304 checks).scripts/test-http-smoke-helpers.mjs— сценарні тести helper-асертів HTTP smoke (security/cache/CSP/content-length validators).scripts/test-smoke-checks.mjs— сценарні тести централізованих smoke-check списків і expected precache-paths синхронізації.scripts/test-progress-state.mjs— сценарні тести на backup/export/import і нормалізацію progress state.scripts/test-assessment-state.mjs— сценарні тести на quiz/exam state transitions і статистику сесій.scripts/test-checklist-state.mjs— сценарні тести pure-checklist логіки (complete/reset/toggle + invalid index guards).scripts/test-checklist-control.mjs— сценарні тести pure-parsing логіки checklist toggle intents.scripts/test-flashcard-state.mjs— сценарні тести pure-flashcard логіки (next/prev/seen/shuffle + guard behavior).scripts/test-practice-state.mjs— сценарні тести pure-practice логіки (answer evaluation + solved-set transitions).scripts/test-practice-control.mjs— сценарні тести pure-parsing логіки practice input/check/keydown actions.scripts/test-quiz-control.mjs— сценарні тести pure-parsing логіки quiz answer actions (click/keyboard).scripts/test-theory-control.mjs— сценарні тести pure-parsing/select логіки theory hotspot actions.scripts/test-jump-control.mjs— сценарні тести pure-parsing логіки review-now/jump-section actions.scripts/test-keyboard-control.mjs— сценарні тести pure-parsing логіки keyboard-shortcut intents (modal/section/answer/flashcards).scripts/test-nav-control.mjs— сценарні тести pure-parsing логіки nav-tab click/keydown intents.scripts/test-language-control.mjs— сценарні тести pure-parsing логіки language-switch intents.scripts/test-topic-control.mjs— сценарні тести pure-parsing логіки topic-filter intents.scripts/test-exam-intro-control.mjs— сценарні тести pure-parsing логіки exam-intro start/change intents.scripts/test-exam-control.mjs— сценарні тести pure-планів exam submit/reset/restore transitions і runtime/keyboard action parsing.scripts/test-validation.mjs— тести на коректний і некоректний імпорт даних.scripts/test-review-planner.mjs— сценарні тести adaptive review planner (topic ranking/fallback + next review-candidate selection).scripts/test-view-plan.mjs— тести планувальника ререндерів (view plans + dedupe).scripts/test-progress-metrics.mjs— тести pure-розрахунків прогрес-метрик.scripts/test-exam-runtime.mjs— тести pure-утиліт runtime-циклу екзамену (running/timeout/tick action planning/start-state builder/restore/snapshot).scripts/test-exam-session.mjs— тести pure-фіналізації екзамену (result payload, review/mastery transitions, labels).scripts/test-quiz-session.mjs— тести pure-фіналізації квізу (result payload, review/mastery transitions, session labels).scripts/test-exam-preferences.mjs— тести pure-логіки налаштувань екзамену (options/defaults/normalization + runtime fallback resolution).scripts/test-validate-custom-pack.mjs— тести CLI-валідатора custom-pack JSON (valid/invalid/oversize).scripts/test-validate-backup-payload.mjs— тести CLI-валідатора backup JSON (valid/invalid/oversize).scripts/test-content-workbench.mjs— тести content-gate утиліти (threshold pass/fail + json mode).scripts/test-build-study-pack-from-csv.mjs— тести CSV-builder (header schema, duplicate ids, valid generation).scripts/test-size-budget.mjs— тести size-budget gate (pass/fail/json mode).scripts/test-export-content-to-csv.mjs— тести CSV-експорту базового контенту.scripts/test-content-csv-roundtrip.mjs— інтеграційний roundtrip test: export CSV -> build pack -> валідація обсягів.scripts/validate-app.mjs— локальна технічна перевірка структури, контенту й зв'язків HTML/JS.dist/— згенерований deploy-пакет; створюється скриптомnpm run packageі не комітиться.dist/release.json— manifest збірки: версія, час пакування, git SHA і склад пакета.qa/visual-baselines/— baseline screenshots для візуальної регресії.package.json— мінімальний опис проєкту та команда валідації.
- двомовність
UA / DE - теорія з інтерактивними схемами
- флешкартки з перемішуванням і прогресом
- розрахункові задачі з перевіркою
- квіз з випадковими варіантами
- режим повторення слабких питань
- екзаменаційний режим з таймером
- запам'ятовування останніх налаштувань екзамену (тривалість і кількість питань)
- відновлення незавершеного екзамену після перезавантаження
- чеклист навчання
- локальна аналітика і журнал проходжень
- резервна копія і відновлення прогресу разом із поточним робочим станом та налаштуваннями екзамену
- URL-стан для мови, теми, пошуку та активної секції
- друк / PDF
- імпорт власного JSON-пакета
- встановлення як PWA та офлайн-режим
Проєкт не потребує сторонніх залежностей.
npm run validate— перевірка синтаксису JS, HTML id bindings, CSP baseline, service-worker safety guards, JSON-ресурсів, валідності backup-template і узгодженості базового контентуUA/DE.npm run serve— запуск локального сервера для нормальної роботи PWA / Service Worker.npm run package— збірка deployabledist/пакета з404.htmlі.nojekyll.npm run content:report— друк поточних метрик контенту (теми, теорія, картки, практика, quiz, покриття по темах).npm run content:gate— перевірка контент-порогів і парностіUA/DE; входить уnpm run quality.npm run content:pack:csv— збіркаartifacts/generated-study-pack.jsonіз CSV-шаблонів уassets/data/csv-template/.- порядок рядків між
uk/deможе відрізнятись, але множинаidуquiz/practice/flashcardsмає співпадати. - override (не рекомендовано):
npm run content:pack:csv -- --allow-language-mismatch
- порядок рядків між
npm run content:validate:pack— валідація JSON-пакета перед імпортом.- власний файл:
npm run content:validate:pack -- --file=./path/to/custom-pack.json - machine-readable результат:
npm run content:validate:pack -- --json
- власний файл:
npm run progress:validate:backup— валідація backup JSON перед імпортом прогресу.- за замовчуванням перевіряє
assets/data/backup-template.json - власний файл:
npm run progress:validate:backup -- --file=./path/to/backup.json - machine-readable результат:
npm run progress:validate:backup -- --json
- за замовчуванням перевіряє
npm run content:export:csv— експорт базового пакета у CSV вartifacts/content-csv-export/.- опціонально:
npm run content:export:csv -- --id-prefix=ext-для унікальних id під custom-pack.
- опціонально:
npm run size:check— перевірка size-budget для ключових статичних ресурсів.- попередження low-headroom:
npm run size:check -- --warn-threshold-pct=5
- попередження low-headroom:
npm run audit:a11y— accessibility/layout audit через Playwright і axe-core.npm run smoke:http— базовий HTTP smoke-test по ключових сторінках, модулях, маніфесту, іконках і службових ресурсах.npm run smoke:browser— headless browser smoke-test через Playwright по основних user flows.npm run smoke:dist— перевірка зібраного deployabledist/пакета іrelease.json.npm run smoke:dist:browser— перевірка зібраногоdist/пакета в реальному headless браузері.npm run smoke— повний smoke-прогін: HTTP + browser scenarios.npm run visual:refresh— оновлення baseline screenshot-ів для visual regression.npm run visual:test— pixel-diff перевірка desktop/mobile snapshots проти baseline.npm run release:preflight— pre-release gate перед тегом:quality:quick+ package + dist smoke + release-manifest checks.- повний режим:
npm run release:preflight -- --full-quality - перевірка секції changelog під тег:
npm run release:preflight -- --tag=vX.Y.Z
- повний режим:
npm run quality:quick— швидкий pre-push gate: tests + validate + content gates + backup-template validation + size-budget (без package/smoke/a11y/visual).npm run quality— повний технічний прогін: tests + validate + content gates (content:gate,content:validate:pack) + backup-template validation + package + source smoke + dist smoke + accessibility audit + visual regression.- Пороги
content:gateможна перевизначати через env-перемінні:CONTENT_MIN_TOPICS,CONTENT_MIN_THEORY,CONTENT_MIN_FLASHCARDS,CONTENT_MIN_PRACTICE,CONTENT_MIN_QUIZ,CONTENT_MIN_CHECKLISTCONTENT_MIN_TOPIC_THEORY,CONTENT_MIN_TOPIC_FLASHCARDS,CONTENT_MIN_TOPIC_PRACTICE,CONTENT_MIN_TOPIC_QUIZCONTENT_MIN_COMPLEXITY_QUIZ_MEDIUM,CONTENT_MIN_COMPLEXITY_QUIZ_LONG,CONTENT_MIN_COMPLEXITY_PRACTICE_STRICT,CONTENT_MIN_COMPLEXITY_PRACTICE_RELAXED
- Пороги
size:checkможна перевизначати через env-перемінні:SIZE_MAX_APP_JS,SIZE_MAX_CONTENT_JS,SIZE_MAX_TEMPLATES_JS,SIZE_MAX_SW_JS,SIZE_MAX_MAIN_CSS,SIZE_MAX_TOTAL_JS,SIZE_WARN_THRESHOLD_PCT
- Імпорт
custom packмає guard на розмір колекцій: максимум500елементів на кожну колекцію (theory,flashcards,practiceProblems,quizData,checklistItems) для запобігання перевантаженню застосунку. - Backup-імпорт має strict type-guards для
progressполів: числові індекси вchecklist/seenCards/cardOrder, рядкові id-масиви вpracticeSolved/quizMastered/quizVariantIds/reviewQueue, та коректні answer-map значення вpracticeAnswers/quizAnswers. - GitHub Actions workflow
Qualityзапускає той самийnpm run qualityнаpush,pull_requestі вручну черезworkflow_dispatch. - GitHub Actions workflow
Deploy Pagesзапускаєnpm run quality, окремо перевіряєdist/і публікує його на GitHub Pages. - GitHub Actions workflow
Releaseзапускається на тегахv*, збираєdist/, перевіряє пакет і в браузері, пакує zip-архів і створює GitHub Release. - Для запуску release workflow вручну через git-тег:
git tag v1.0.1git push origin v1.0.1
- GitHub Actions workflow
Secret Scanзапускаєgitleaksнаpush,pull_requestі вручну. - Dependabot щотижня створює PR-оновлення для npm і GitHub Actions.
- GitHub release notes групуються через
.github/release.yml, а ручний changelog лежить уCHANGELOG.md. - Для увімкнення GitHub security analysis:
pwsh scripts/github/enable-security-analysis.ps1
- Для застосування branch protection на
main:pwsh scripts/github/apply-branch-protection.ps1 -Branches @("main")
npm test— сценарні тести для runtime-логіки без браузерних залежностей.
app.jsлишився точкою orchestration: DOM, події, стан і зшивка всіх режимів.progress-state.jsтримає окремо логіку backup/export/import і normalization, щоб не змішувати її з DOM-обробниками.assessment-state.jsтримає окремо assessment-логіку, щобapp.jsне зберігав у собі низькорівневі переходи quiz/exam state.checklist-state.jsтримає ізольований checklist-flow (complete/reset/toggle + index guards), щоб не змішувати ці переходи з DOM-обробниками вapp.js.checklist-control.jsтримає ізольований parsing checklist toggle intents ([data-check-index]), щоб прибрати click-branching зapp.js.flashcard-state.jsтримає ізольований flashcard-flow (next/prev/seen/shuffle + order guards), щоб прибрати ці переходи зapp.js.practice-state.jsтримає ізольовану логіку практичних перевірок (answer evaluation + solved-set transitions), щоб не дублювати цю математику вapp.js.practice-control.jsтримає ізольований parsing practice input/check/keydown actions, щоб прибрати DOM-branching зapp.js.quiz-control.jsтримає ізольований parsing quiz answer actions (click/keyboard), щоб прибрати дубльовані answer-guard перевірки зapp.js.theory-control.jsтримає ізольований parsing/select hotspot actions для theory-карток, щоб прибрати DOM-branching і прямі мутації map зapp.js.jump-control.jsтримає ізольований parsing review-now/jump-section actions з валідацією секцій, щоб прибрати переходи-парсинг зapp.js.keyboard-control.jsтримає ізольований parsing keyboard-shortcut intents (modal/section/answer/flashcards), щоб прибрати умовні гілки парсингу зapp.js.nav-control.jsтримає ізольований parsing nav-tab click/keydown intents (section select + focus navigation), щоб прибрати routing-branching зapp.js.language-control.jsтримає ізольований parsing language-switch intents для.lang-btn, щоб прибрати click-branching зapp.js.topic-control.jsтримає ізольований parsing topic-filter intents ([data-topic-filter]) з валідацією тем, щоб прибрати topic click-branching зapp.js.exam-intro-control.jsтримає ізольований parsing exam-intro start/change intents, щоб прибрати selector-branching зapp.js.study-helpers.jsтримає чисту логіку без доступу до DOM: пошук, фільтрацію, рекомендації, mastery, досягнення.review-planner.jsтримає isolated-логіку адаптивного вибору теми повторення, candidate fallback order і next review-candidate resolution.progress-metrics.jsтримає ізольований розрахунок прогресу, completion і accuracy, щоб не змішувати математику з DOM-рендером.view-plan.jsтримає ізольовані набори view-plan для ререндерів і дедуплікації view-id без прив'язки до DOM.exam-preferences.jsтримає ізольовані константи, нормалізацію exam-intro налаштувань і runtime fallback resolution, щоб поведінку тривалості/кількості питань тестувати окремо.exam-runtime.jsтримає ізольований runtime-контур екзамену (визначення running/timeout, tick action planning, started-state builder, safe snapshot перед фіналізацією, restore action).exam-control.jsтримає ізольовані submit/reset/restore transition plans і runtime/keyboard action parsing для екзамену, щоб зменшити умовну логіку вapp.js.exam-session.jsтримає ізольовану фіналізацію екзамену (score/review/mastery/finished-state), щоб прибрати цю математику зapp.js.quiz-session.jsтримає ізольовану фіналізацію квізу (score/review/mastery/session-label), щоб прибрати цю математику зapp.js.runtime.jsтримає адресний стан, view-state snapshots і серіалізацію/гідратацію екзамену, щоб цю поведінку можна було тестувати окремо.dev-server-helpers.mjsтримає isolated-логіку локального HTTP-сервера (path guards, cache/CSP headers, validators), щоб її можна було тестувати unit-тестами без запуску сервера.validation.jsвідсікає биті імпорти, backup-схеми і некоректний view-state до того, як вони потраплять у застосунок.templates.jsтримає рядкові шаблони інтерфейсу, щобapp.jsне змішував бізнес-логіку з розміткою.storage.jsвідповідає заlocalStorage, key-binding контракти, schema migration bootstrap і нормалізацію даних.content.jsтримає двомовний пакет і правила злиття з користувацьким JSON.
Бери за основу assets/data/study-pack-template.json.
Підтримувані масиви всередині кожної мови:
theoryflashcardspracticeProblemsquizDatachecklistItems
Імпортований контент додається до базового і зберігається локально в браузері.
Для batch-підготовки пакета можна редагувати файли в assets/data/csv-template/ і згенерувати JSON командою:
npm run content:pack:csv
Щоб стартувати не з шаблону, а з актуального базового контенту, експортуй його в CSV:
npm run content:export:csvnpm run content:export:csv -- --id-prefix=ext-
MIT, див. LICENSE.