From 93154aa59753f9330560d673c9908cde912452ec Mon Sep 17 00:00:00 2001 From: YanTM <47182734+YanTM@users.noreply.github.com> Date: Tue, 6 Oct 2026 15:03:53 +0500 Subject: [PATCH 1/2] Add BEAPP practice guide, planner, and local journal --- .gitignore | 4 ++ .nojekyll | 0 API.md | 29 ++++++++++ CHANGELOG.md | 8 +++ LICENSE | 21 ++++++++ README.md | 99 ++++++++++++++++++++++++++++++++++ app.js | 89 ++++++++++++++++++++++++++++++ assets/NOTICE.md | 6 +++ assets/attention.svg | 14 +++++ assets/brand-logo.webp | Bin 0 -> 32808 bytes assets/hero.webp | Bin 0 -> 48592 bytes assets/memory.svg | 15 ++++++ assets/reaction.svg | 12 +++++ assets/thinking.svg | 15 ++++++ guide.md | 119 +++++++++++++++++++++++++++++++++++++++++ index.html | 58 ++++++++++++++++++++ package.json | 31 +++++++++++ planner.js | 102 +++++++++++++++++++++++++++++++++++ style.css | 5 ++ tests/planner.test.cjs | 44 +++++++++++++++ 20 files changed, 671 insertions(+) create mode 100644 .gitignore create mode 100644 .nojekyll create mode 100644 API.md create mode 100644 CHANGELOG.md create mode 100644 LICENSE create mode 100644 README.md create mode 100644 app.js create mode 100644 assets/NOTICE.md create mode 100644 assets/attention.svg create mode 100644 assets/brand-logo.webp create mode 100644 assets/hero.webp create mode 100644 assets/memory.svg create mode 100644 assets/reaction.svg create mode 100644 assets/thinking.svg create mode 100644 guide.md create mode 100644 index.html create mode 100644 package.json create mode 100644 planner.js create mode 100644 style.css create mode 100644 tests/planner.test.cjs diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..15edf1e --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +node_modules/ +*.tgz +qa/ +*.log diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 0000000..e69de29 diff --git a/API.md b/API.md new file mode 100644 index 0000000..6c732d7 --- /dev/null +++ b/API.md @@ -0,0 +1,29 @@ +# Utility API + +Import with require('./planner.js'), or load planner.js as a normal +browser script and use window.BeappPractice. + +| Function | Input | Output | +| --- | --- | --- | +| createSession(options) | minutes: 2, 5, or 8; focus: mixed, memory, attention, reaction, or thinking; optional non-negative integer offset | Session with tasks and timing note | +| createWeek(options) | A real startDate in YYYY-MM-DD format, plus session options | Seven consecutive calendar-day suggestions | +| getTask(id) | A task ID from TASKS | Name, area, official URL, unit, instructions, and result guidance | +| validateResult(result) | {date, task, value, condition, notes?} | Normalized result with its task-specific unit | +| resultsToCsv(results) | Valid manual result objects | CSV text for a journal | +| weekToCsv(week) | Output of createWeek | CSV text for a seven-day plan | + +TASKS and AREAS are frozen catalog exports. +Invalid inputs throw RangeError or TypeError. + +Reaction results must be positive milliseconds. Number-memory digits and +visual-memory cells must be non-negative integers. Accuracy values must be +between 0 and 100. The condition field is required and accepts up to 120 +characters; optional notes accept up to 500 characters. + +For accuracy exercises, copy the percentage shown by the test, or calculate +correct / total * 100 from a completed attempt. Record any other displayed +metric in notes. Never turn a memory level or reaction time into a percentage. + +The utility does not call the BEAPP API, store data, schedule reminders, +diagnose conditions, or assign difficulty levels. +A higher-level app decides when and where to store journal entries. diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..e50cb7f --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,8 @@ +# Changelog + +## 1.0.0 + +- Short sessions and an optional seven-day CSV plan. +- Simple instructions for eight BEAPP exercises. +- Browser-local manual journal and CSV export. +- Zero-dependency planning utility with input validation. diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..9b9064b --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2026 BEAPP Practice Kit contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..66bb0eb --- /dev/null +++ b/README.md @@ -0,0 +1,99 @@ +Brain Exercise App logo + +# BEAPP Practice Kit + +A small companion for [Brain Exercise App](https://brainexerciseapp.com/). +Choose a short session, understand the exercise, and keep a note of your result. + +**[Open the planner and journal](https://yantm.github.io/beapp-practice-kit/)** +· [Read the practical guide](guide.md) +· [Open BEAPP Daily Training](https://brainexerciseapp.com/daily-brain-training/) + +The BEAPP brain character with four skill areas + +## Start in three steps + +1. Choose **2, 5, or 8 minutes**, then a skill area or “A bit of everything.” +2. Open the first exercise on BEAPP. Read its rules and finish an attempt. +3. Copy the result into your manual journal. Include the difficulty, device, + and input method so that your next comparison is useful. + +Times are planning estimates, including reading the instructions. +Finish at a comfortable pace and take a break when you need one. + +Prefer a ready-made session? Open +[Daily Training](https://brainexerciseapp.com/daily-brain-training/). +Want an introduction to the skill areas? Start with +[Brain Check](https://brainexerciseapp.com/brain-check/). + +## What the kit includes + +- A short-session planner with memory, attention, reaction, and thinking choices. +- Plain-English steps for eight exercises. +- A downloadable seven-day CSV plan. Each day is optional. +- A manual browser-local journal with CSV export. +- A zero-dependency JavaScript utility for other small planning tools. + +The exercises run on **brainexerciseapp.com**. This kit stores only the +results you enter yourself. It does not import or change your app history. + +## Use it without installing anything + +Open the live planner above. To use the kit offline, download the +**beapp-practice-kit-v1.0.0.zip** release, unzip it, and open **index.html**. +The planner, instructions, and CSV exports work locally. +Opening an exercise still requires access to BEAPP. + +The kit does not include analytics or send journal entries to a server. +Entries are stored in this browser's local storage. Clearing site data, +changing browsers, or using private browsing can remove access to them. +Export CSV to keep a copy. If storage is unavailable, the page tells you +to export temporary entries before leaving. + +## Read results fairly + +Compare the **same exercise, difficulty, device, and input method**. +Read accuracy alongside speed when both are shown. Record interruptions +or early clicks in your notes. The kit keeps each exercise's units separate +and does not combine them into an overall score. + +Results describe performance in specific tasks. This kit is a planning and +note-taking tool, not a medical assessment or a promise of changes in +everyday abilities. [How BEAPP results are calculated](https://brainexerciseapp.com/how-results-are-calculated/). + +## JavaScript usage + +Node.js 20 or newer is required only for development and the utility API. +No Node.js installation is needed to open the browser kit. + +```js +const { createSession, createWeek, resultsToCsv } = require('./planner.js'); +const session = createSession({ minutes: 5, focus: 'memory' }); +console.log(session.tasks.map(task => task.name)); +const week = createWeek({ startDate: '2026-10-06', minutes: 5, focus: 'mixed' }); +const csv = resultsToCsv([{ + date: '2026-10-06', task: 'reaction', value: 240, + condition: 'same difficulty · laptop · mouse', notes: 'no early clicks' +}]); +``` + +API reference: [API.md](API.md). +Dates use YYYY-MM-DD; the seven-day schedule uses UTC calendar arithmetic. +CSV export quotes text and protects against spreadsheet formula interpretation. + +## Development + +```sh +npm run check +npm test +``` + +Tests cover planning choices, date boundaries, result units, validation, +and CSV handling. Pull requests run the **Quality gate** workflow. +There is no build step and no runtime dependency. + +## License + +New utility code and documentation are MIT licensed. +BEAPP logos, mascot artwork, and skill icons have separate +[brand asset terms](assets/NOTICE.md). diff --git a/app.js b/app.js new file mode 100644 index 0000000..71e5589 --- /dev/null +++ b/app.js @@ -0,0 +1,89 @@ +/* Browser companion: journal entries stay in this browser only. */ +(function(){ + 'use strict'; + const api = window.BeappPractice, $ = id=>document.getElementById(id); + const KEY = 'beapp_practice_kit_journal_v1'; + const today = new Date(); + const date = today.getFullYear()+'-'+String(today.getMonth()+1).padStart(2,'0')+'-'+String(today.getDate()).padStart(2,'0'); + const escape = value=>String(value).replaceAll('&','&').replaceAll('<','<').replaceAll('>','>').replaceAll('"','"').replaceAll("'",'''); + const status = (id,text,error=false)=>{ $(id).textContent=text; $(id).classList.toggle('error',error); }; + function options(){ + const data = new FormData($('plan-form')); + return {minutes:Number(data.get('minutes')),focus:data.get('focus')}; + } + function renderSession(){ + const session = api.createSession(options()); + $('session').innerHTML='

Your '+session.minutes+'-minute starting route

Read the rules, finish an attempt, and note the result.

    '+ + session.tasks.map((task,i)=>'
  1. '+String(i+1).padStart(2,'0')+'
    '+task.name+' ↗'+escape(task.steps[0])+'
  2. ').join('')+ + '
Start with '+session.tasks[0].name+' ↗'; + } + function readResults(){ + const raw = localStorage.getItem(KEY); + if (!raw) return []; + const list = JSON.parse(raw); + if (!Array.isArray(list)||list.length>1000) throw new Error('The saved journal could not be read. Your existing data has been left in place.'); + return list.map(api.validateResult); + } + let entries=[]; + function renderResults(){ + $('download-results').disabled=entries.length===0; + $('results').innerHTML=entries.length?entries.slice(-20).reverse().map(row=>{ + const task=api.getTask(row.task); + return '
'+task.name+''+row.value+' '+escape(task.unit)+'
'+escape(row.date)+' · '+escape(row.condition)+''+ + (row.notes?'

'+escape(row.notes)+'

':'')+'
'; + }).join(''):'
Your first result goes here.

Finish one exercise on BEAPP, then copy its result into this journal.

'; + if (entries.length>20) status('storage-status','Showing the latest 20 results. Export CSV includes all '+entries.length+' entries.'); + } + function refreshResults(){ + try {entries=readResults(); status('storage-status',''); renderResults();} + catch(error){status('storage-status',error.message+' Export any unsaved entries before leaving this page.',true);} + } + function updateValue(){ + const task=api.getTask($('result-task').value), input=$('result-value'); + $('value-label').textContent=task.label; + $('value-help').textContent=task.read; + input.min=task.min; input.step=task.integer?'1':'any'; + if (task.max!==undefined) input.max=task.max; else input.removeAttribute('max'); + input.value=''; + } + function download(filename,text){ + const url=URL.createObjectURL(new Blob(['\uFEFF'+text],{type:'text/csv;charset=utf-8'})); + const anchor=document.createElement('a'); + anchor.href=url; anchor.download=filename; document.body.append(anchor); anchor.click(); anchor.remove(); + setTimeout(()=>URL.revokeObjectURL(url),2000); + } + $('week-start').value=date; $('result-date').value=date; + $('result-task').innerHTML=api.TASKS.map(task=>'').join(''); + $('exercise-guide').innerHTML=api.TASKS.map(task=>'

'+task.name+'

'+task.read+'

How to do it
    '+task.steps.map(step=>'
  1. '+escape(step)+'
  2. ').join('')+'

'+escape(task.tip)+'

Try '+task.name+' ↗
').join(''); + $('plan-form').addEventListener('change',renderSession); + $('plan-form').addEventListener('submit',event=>event.preventDefault()); + $('result-task').addEventListener('change',updateValue); + $('download-week').addEventListener('click',()=>{ + try {download('beapp-practice-plan.csv',api.weekToCsv(api.createWeek({startDate:$('week-start').value,...options()})));status('week-status','Your 7-day CSV plan is ready. Each day is optional.');} + catch(error){status('week-status',error.message,true);} + }); + $('print-plan').addEventListener('click',()=>window.print()); + $('result-form').addEventListener('submit',event=>{ + event.preventDefault(); + let row; + try {row=api.validateResult({date:$('result-date').value,task:$('result-task').value,value:$('result-value').value,condition:$('result-condition').value,notes:$('result-notes').value});} + catch(error){status('save-status',error.message,true);return;} + try { + const current=readResults(); + if(current.length>=1000){status('save-status','This journal has 1,000 entries. Export CSV to keep a copy.',true);return;} + const next=[...current,row]; + localStorage.setItem(KEY,JSON.stringify(next)); + entries=next;status('save-status','Saved in this browser.');status('storage-status','');renderResults(); + $('result-value').value='';$('result-notes').value=''; + } catch(error) { + // Preserve an exportable in-memory entry when storage is unavailable. + entries=[...entries,row];renderResults(); + status('save-status','Could not save to browser storage. This entry is temporary: export CSV before leaving or reloading.',true); + } + }); + $('download-results').addEventListener('click',()=>{ + if(entries.length) download('beapp-practice-journal.csv',api.resultsToCsv(entries)); + }); + window.addEventListener('storage',event=>{if(event.key===KEY) refreshResults();}); + renderSession();updateValue();refreshResults(); +})(); diff --git a/assets/NOTICE.md b/assets/NOTICE.md new file mode 100644 index 0000000..2899b54 --- /dev/null +++ b/assets/NOTICE.md @@ -0,0 +1,6 @@ +# BEAPP brand assets + +The logo, mascot illustration, and four skill icons belong to the Brain +Exercise App brand and are included to identify this companion. +The repository's MIT license covers the new utility code and documentation. +It does not grant rights to BEAPP trademarks or brand artwork. diff --git a/assets/attention.svg b/assets/attention.svg new file mode 100644 index 0000000..1786c35 --- /dev/null +++ b/assets/attention.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/assets/brand-logo.webp b/assets/brand-logo.webp new file mode 100644 index 0000000000000000000000000000000000000000..e90e2a53a8f2226643e525b30ae33f4e69be1405 GIT binary patch literal 32808 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 LU(f#Y{{R30O7qnd literal 0 HcmV?d00001 diff --git a/assets/hero.webp b/assets/hero.webp new file mode 100644 index 0000000000000000000000000000000000000000..bb4c487a9c4238d2d61f669f2c7dc3c20f504f0a GIT binary patch literal 48592 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%0DXs9&k5*Y}q{9u#gqkKO0L6U{5H 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 + + + + + + + + + + + + + + \ No newline at end of file diff --git a/assets/reaction.svg b/assets/reaction.svg new file mode 100644 index 0000000..b69be80 --- /dev/null +++ b/assets/reaction.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/assets/thinking.svg b/assets/thinking.svg new file mode 100644 index 0000000..62af600 --- /dev/null +++ b/assets/thinking.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/guide.md b/guide.md new file mode 100644 index 0000000..fd301f5 --- /dev/null +++ b/guide.md @@ -0,0 +1,119 @@ +# A simple first session with BEAPP + +Choose a small task you can finish. Read its rules, finish an attempt, and keep a note of the result. + +## Choose your starting point + +- Have little time? Try one Reaction Time attempt. +- Want to explore memory? Choose Number Memory or Visual Memory. +- Want to work with attention? Choose Stroop or Visual Search. +- Want to try thinking tasks? Choose Pattern Recognition or Mental Rotation. +- Prefer a session chosen for you? Open [Daily Training](https://brainexerciseapp.com/daily-brain-training/). + +[Open the kit planner](https://yantm.github.io/beapp-practice-kit/). Times are estimates; you can stop or take a break. + +## Reaction Time + +1. Wait until the signal changes. +2. Then click or tap as quickly as you can. +3. Finish the attempt and read the result. + +**Watch for:** An early click is a mistake. Keep the same device and input method when comparing attempts. + +**Keep a note:** Write the response time shown by the test. Note early clicks separately. + +[Open Reaction Time](https://brainexerciseapp.com/reaction-time-test/). + +## Number Memory + +1. Look at the number while it is visible. +2. When it disappears, type it from memory. +3. Submit your answer and continue as the test directs. + +**Watch for:** Keep the digits in order. Record the recall result shown at the end. + +**Keep a note:** Write the digits recalled result. Compare the same test and difficulty. + +[Open Number Memory](https://brainexerciseapp.com/number-memory-test/). + +## Stroop Test + +1. Look at the ink color of the word. +2. Choose the answer that matches the ink color. +3. Ignore what the written word says. + +**Watch for:** If “BLUE” is printed in red, choose red. Read accuracy together with speed. + +**Keep a note:** Write correct answers as a percentage. Add the time to your notes if shown. + +[Open Stroop Test](https://brainexerciseapp.com/stroop-test/). + +## Visual Memory + +1. Look at the highlighted cells. +2. Remember their positions after they disappear. +3. Select the cells you remember. + +**Watch for:** Notice the whole pattern. Track incorrect selections as well as the amount recalled. + +**Keep a note:** Write the cells recalled result. Keep difficulty consistent when comparing attempts. + +[Open Visual Memory](https://brainexerciseapp.com/visual-memory-test/). + +## Pattern Recognition + +1. Look at the sequence or pattern. +2. Find what changes from one item to the next. +3. Choose the answer that follows the same rule. + +**Watch for:** Check shape, number, position, and direction. If you miss an answer, revisit the rule. + +**Keep a note:** Write correct answers as a percentage. Note the kind of rule you missed. + +[Open Pattern Recognition](https://brainexerciseapp.com/pattern-recognition-test/). + +## Visual Search + +1. Read the target shown in the instructions. +2. Scan the items on screen for that target. +3. Choose the matching item using the test controls. + +**Watch for:** Follow the current target carefully. Record time alongside accuracy if both are shown. + +**Keep a note:** Write correct answers as a percentage. Keep target difficulty and device consistent. + +[Open Visual Search](https://brainexerciseapp.com/visual-search-test/). + +## Choice Reaction + +1. Read which response belongs to each signal. +2. Wait for the signal to appear. +3. Choose the matching response. + +**Watch for:** The right response matters as well as speed. Note incorrect responses separately. + +**Keep a note:** Write the response time shown. Keep the task and conditions the same. + +[Open Choice Reaction](https://brainexerciseapp.com/choice-reaction-test/). + +## Mental Rotation + +1. Look closely at the reference shape. +2. Imagine turning it without changing its shape. +3. Choose the option that matches after rotation. + +**Watch for:** A mirrored shape is different from a rotated shape. Check the smaller details. + +**Keep a note:** Write correct answers as a percentage. Note the shapes that were difficult. + +[Open Mental Rotation](https://brainexerciseapp.com/mental-rotation-test/). + +## Read your result and choose one next step + +Use the same exercise, difficulty, device, and input method when comparing attempts. Read correct answers together with speed when both are shown. An interruption or an early click belongs in your notes. + +Next time, repeat the same task to compare, explore another skill, or use Daily Training. A seven-day plan is a set of optional suggestions, not a requirement to practice every day. + +The kit journal is separate from the app history. Export your journal as CSV to keep a copy. Return to the same browser to review your [BEAPP app progress](https://brainexerciseapp.com/trainer/progress/). + +Results describe performance in specific tasks. They are not a medical assessment or a promise of changes in everyday abilities. [Read how results are calculated](https://brainexerciseapp.com/how-results-are-calculated/). diff --git a/index.html b/index.html new file mode 100644 index 0000000..6324504 --- /dev/null +++ b/index.html @@ -0,0 +1,58 @@ + + + + +BEAPP Practice Kit — Plan a small session + + + + + +
+
+A SMALL STEP YOU CAN FINISH

A little practice.
A clear next step.

+

Choose a short session. Know what to do. Keep a note of your result and come back when it suits you.

+ +

No account needed for this kit · Your journal stays in this browser

+The BEAPP brain character with memory, attention, reaction, and thinking activities
+
+
START WITH WHAT FITS TODAY

Your first session

Pick a little time and a skill area. The plan is a starting suggestion; each exercise opens on BEAPP.

+
+
How much time do you have?
+ + + +
+
What would you like to explore?
+ + + + + +

Time is an estimate, including reading the rules. Finish one attempt at your own pace. Taking a break is fine.

+
+
+
+
KNOW THE TASK FIRST

Simple rules. A useful result.

Start with the rules inside the test. These short notes explain what to watch for and what to write down.

+
COMPARE LIKE WITH LIKE

Your practice journal

Copy the result shown after an attempt. Use the same task, difficulty, device, and input method for a fair comparison.

+

Add one result

+
+

+ + +

+

Saved in this browser

+

This is a separate, manual journal. It does not import or change your BEAPP history. Export a copy before clearing browser data.

+

+
PREFER A READY-MADE SESSION?

Let BEAPP choose the exercises.

Open Daily Training for a session in the app. Return to the same browser to review your app progress.

Open Daily Training ↗
+
A FEW PRACTICAL ANSWERS

Before you start

+
Do I have to practice every day?

No. The 7-day plan offers choices for each day. Skip a day or take a break when you need one. A session you can finish is a useful starting point.

+
Where are my results stored?

Only in local storage in this browser. The kit does not send journal entries to a server. Private browsing or clearing site data may remove them. Use Export CSV to keep a copy.

+
Why is there no overall score?

Reaction time, recall capacity, and correct answers measure different things. Compare the same exercise under similar conditions. Read accuracy together with speed when both are shown.

+
Is this a medical assessment?

No. These results describe performance in particular tasks. This kit is a planning and note-taking tool. It does not diagnose a condition or promise changes in everyday abilities.

+
+
+ diff --git a/package.json b/package.json new file mode 100644 index 0000000..5e1d592 --- /dev/null +++ b/package.json @@ -0,0 +1,31 @@ +{ + "name": "beapp-practice-kit", + "version": "1.0.0", + "description": "An offline-friendly session planner and manual result journal for Brain Exercise App.", + "main": "planner.js", + "scripts": { + "test": "node --test tests/*.test.cjs", + "check": "node --check planner.js && node --check app.js" + }, + "engines": { + "node": ">=20" + }, + "license": "MIT", + "homepage": "https://yantm.github.io/beapp-practice-kit/", + "repository": { + "type": "git", + "url": "https://github.com/YanTM/beapp-practice-kit.git" + }, + "files": [ + "planner.js", + "README.md", + "LICENSE" + ], + "keywords": [ + "brainexerciseapp", + "practice", + "planner", + "memory", + "attention" + ] +} diff --git a/planner.js b/planner.js new file mode 100644 index 0000000..596c11a --- /dev/null +++ b/planner.js @@ -0,0 +1,102 @@ +/* BEAPP Practice Kit — MIT. This module has no network, storage, or telemetry. */ +(function(root, factory) { + 'use strict'; + const api = factory(); + if (typeof module === 'object' && module.exports) module.exports = api; + else root.BeappPractice = api; +})(typeof globalThis === 'object' ? globalThis : this, function() { + 'use strict'; + const TASKS = Object.freeze([ + {id:'reaction',name:'Reaction Time',area:'reaction',path:'/reaction-time-test/',unit:'ms',label:'Response time (ms)',min:0.01, + steps:['Wait until the signal changes.','Then click or tap as quickly as you can.','Finish the attempt and read the result.'], + tip:'An early click is a mistake. Keep the same device and input method when comparing attempts.', + read:'Write the response time shown by the test. Note early clicks separately.'}, + {id:'number_memory',name:'Number Memory',area:'memory',path:'/number-memory-test/',unit:'digits',label:'Digits recalled',min:0,integer:true, + steps:['Look at the number while it is visible.','When it disappears, type it from memory.','Submit your answer and continue as the test directs.'], + tip:'Keep the digits in order. Record the recall result shown at the end.', + read:'Write the digits recalled result. Compare the same test and difficulty.'}, + {id:'stroop',name:'Stroop Test',area:'attention',path:'/stroop-test/',unit:'% correct',label:'Correct answers (%)',min:0,max:100, + steps:['Look at the ink color of the word.','Choose the answer that matches the ink color.','Ignore what the written word says.'], + tip:'If “BLUE” is printed in red, choose red. Read accuracy together with speed.', + read:'Write correct answers as a percentage. Add the time to your notes if shown.'}, + {id:'visual_memory',name:'Visual Memory',area:'memory',path:'/visual-memory-test/',unit:'cells',label:'Cells recalled',min:0,integer:true, + steps:['Look at the highlighted cells.','Remember their positions after they disappear.','Select the cells you remember.'], + tip:'Notice the whole pattern. Track incorrect selections as well as the amount recalled.', + read:'Write the cells recalled result. Keep difficulty consistent when comparing attempts.'}, + {id:'pattern_recognition',name:'Pattern Recognition',area:'thinking',path:'/pattern-recognition-test/',unit:'% correct',label:'Correct answers (%)',min:0,max:100, + steps:['Look at the sequence or pattern.','Find what changes from one item to the next.','Choose the answer that follows the same rule.'], + tip:'Check shape, number, position, and direction. If you miss an answer, revisit the rule.', + read:'Write correct answers as a percentage. Note the kind of rule you missed.'}, + {id:'visual_search',name:'Visual Search',area:'attention',path:'/visual-search-test/',unit:'% correct',label:'Correct answers (%)',min:0,max:100, + steps:['Read the target shown in the instructions.','Scan the items on screen for that target.','Choose the matching item using the test controls.'], + tip:'Follow the current target carefully. Record time alongside accuracy if both are shown.', + read:'Write correct answers as a percentage. Keep target difficulty and device consistent.'}, + {id:'choice_reaction',name:'Choice Reaction',area:'reaction',path:'/choice-reaction-test/',unit:'ms',label:'Response time (ms)',min:0.01, + steps:['Read which response belongs to each signal.','Wait for the signal to appear.','Choose the matching response.'], + tip:'The right response matters as well as speed. Note incorrect responses separately.', + read:'Write the response time shown. Keep the task and conditions the same.'}, + {id:'mental_rotation',name:'Mental Rotation',area:'thinking',path:'/mental-rotation-test/',unit:'% correct',label:'Correct answers (%)',min:0,max:100, + steps:['Look closely at the reference shape.','Imagine turning it without changing its shape.','Choose the option that matches after rotation.'], + tip:'A mirrored shape is different from a rotated shape. Check the smaller details.', + read:'Write correct answers as a percentage. Note the shapes that were difficult.'} + ].map(task=>Object.freeze({...task,steps:Object.freeze(task.steps),url:'https://brainexerciseapp.com'+task.path}))); + const AREAS = Object.freeze(['mixed','memory','attention','reaction','thinking']); + function getTask(id) { + const task = TASKS.find(item=>item.id===id); + if (!task) throw new RangeError('Choose a known exercise.'); + return task; + } + function createSession({minutes=5,focus='mixed',offset=0}={}) { + if (![2,5,8].includes(minutes)) throw new RangeError('Choose 2, 5, or 8 minutes.'); + if (!AREAS.includes(focus)) throw new RangeError('Choose a known skill area.'); + if (!Number.isInteger(offset)||offset<0) throw new RangeError('Offset must be a non-negative integer.'); + const pool = focus==='mixed'?TASKS:TASKS.filter(task=>task.area===focus); + const count = Math.min({2:1,5:2,8:3}[minutes],pool.length); + return {minutes,focus,tasks:Array.from({length:count},(_,i)=>pool[(offset+i)%pool.length]), + note:'Times are a planning guide. Finish one attempt at a comfortable pace; stop when you need a break.'}; + } + function validateDate(value) { + if (typeof value!=='string'||!/^\d{4}-\d{2}-\d{2}$/.test(value)) throw new RangeError('Use a date in YYYY-MM-DD format.'); + const date = new Date(value+'T00:00:00Z'); + if (!Number.isFinite(date.getTime())||date.toISOString().slice(0,10)!==value) throw new RangeError('Choose a real calendar date.'); + return date; + } + function createWeek({startDate,minutes=5,focus='mixed'}={}) { + const start = validateDate(startDate); + return Array.from({length:7},(_,i)=>{ + const date = new Date(start); + date.setUTCDate(date.getUTCDate()+i); + return {date:date.toISOString().slice(0,10),...createSession({minutes,focus,offset:i})}; + }); + } + function validateResult(raw) { + if (!raw||typeof raw!=='object') throw new TypeError('Provide a result.'); + validateDate(raw.date); + const task = getTask(raw.task); + if (!['number','string'].includes(typeof raw.value)||(typeof raw.value==='string'&&!raw.value.trim())) throw new RangeError('Enter a result value.'); + const value = Number(raw.value); + if (!Number.isFinite(value)||valuetask.max)||(task.integer&&!Number.isInteger(value))) throw new RangeError('Enter a valid '+task.label.toLowerCase()+' value.'); + if (typeof raw.condition!=='string'||!raw.condition.trim()||raw.condition.length>120) throw new RangeError('Describe the difficulty, device, and input method (up to 120 characters).'); + if (raw.notes!==undefined&&(typeof raw.notes!=='string'||raw.notes.length>500)) throw new RangeError('Keep notes under 500 characters.'); + return {date:raw.date,task:task.id,value,unit:task.unit,condition:raw.condition.trim(),notes:(raw.notes||'').trim()}; + } + function csvCell(value) { + const text = String(value??''); + // User text must stay text when opened by a spreadsheet. + const safe = /^[\s]*[=+\-@]/.test(text)?"'"+text:text; + return '"'+safe.replaceAll('"','""')+'"'; + } + function toCsv(rows,columns) { + return columns.map(csvCell).join(',')+'\r\n'+rows.map(row=>columns.map(key=>csvCell(row[key])).join(',')).join('\r\n')+'\r\n'; + } + function resultsToCsv(results) { + if (!Array.isArray(results)) throw new TypeError('Provide a result list.'); + return toCsv(results.map(validateResult),['date','task','value','unit','condition','notes']); + } + function weekToCsv(week) { + return toCsv(week.map(day=>({date:day.date,minutes:day.minutes,focus:day.focus, + exercises:day.tasks.map(task=>task.name).join(' / '),links:day.tasks.map(task=>task.url).join(' / ')})), + ['date','minutes','focus','exercises','links']); + } + return Object.freeze({TASKS,AREAS,getTask,createSession,createWeek,validateResult,resultsToCsv,weekToCsv}); +}); diff --git a/style.css b/style.css new file mode 100644 index 0000000..e49a0df --- /dev/null +++ b/style.css @@ -0,0 +1,5 @@ +:root{--bg:#f7f8f3;--ink:#202938;--muted:#667085;--blue:#4f6fed;--border:#e1e6ee;--soft:#ebf0ff;font-family:Inter,-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif;color:var(--ink);background:var(--bg);font-synthesis:none}*{box-sizing:border-box}html{scroll-behavior:smooth;scroll-padding-top:20px}body{margin:0;font-size:15px;line-height:1.6}a{color:#3b58d8;text-decoration:none}a:hover{text-decoration:underline}button,input,textarea,select{font:inherit}button{cursor:pointer}img{max-width:100%;object-fit:contain}h1,h2,h3,p{margin-top:0}h1,h2,h3{line-height:1.12;letter-spacing:-.035em}h1{font-size:clamp(40px,4.4vw,58px);font-weight:850;margin:16px 0 22px}h1 span{color:#3b58d8}h2{font-size:32px;margin:8px 0 0;font-weight:800}h3{font-size:19px;margin-bottom:14px}.wrap{width:min(1120px,calc(100% - 48px));margin:auto}.site-header{display:flex;align-items:center;justify-content:space-between;gap:24px;min-height:100px;border-bottom:1px solid var(--border)}.brand{display:flex;gap:10px;align-items:center;font-weight:750;color:var(--ink);line-height:1.2}.brand:hover{text-decoration:none}.brand small{display:block;color:var(--muted);font-weight:500;font-size:11px;margin-top:5px}.site-header nav{display:flex;align-items:center;gap:24px;font-size:13px;font-weight:700}.button{display:inline-flex;justify-content:center;align-items:center;min-height:44px;padding:11px 19px;border:1px solid #d6dfff;border-radius:12px;background:white;box-shadow:0 3px 0 #dde3f0;font-weight:750;font-size:13px;color:#3b58d8;text-decoration:none;transition:background .2s,transform .2s}.button:hover{background:#f0f3ff;text-decoration:none;transform:translateY(-1px)}.primary{color:white;background:var(--blue);border-color:var(--blue);box-shadow:0 4px 0 #3b58d8,0 7px 14px #4f6fed20}.primary:hover{background:#3b58d8}.hero{display:grid;grid-template-columns:1.05fr 1fr;gap:48px;align-items:center;padding:54px 0 44px}.hero-art{width:100%;height:350px;object-fit:contain}.eyebrow{color:#536387;font-size:10px;letter-spacing:1.3px;font-weight:800}.eyebrow::before{content:"";display:inline-block;width:6px;height:6px;border-radius:50%;background:var(--blue);vertical-align:middle;margin-right:7px}.lead{color:var(--muted);max-width:460px;font-size:16px;line-height:1.7}.actions{display:flex;gap:12px;flex-wrap:wrap}.micro{font-size:12px;color:var(--muted);line-height:1.55;margin:14px 0 0}.section{padding:32px 0;border-top:1px solid var(--border)}.section-heading{display:flex;justify-content:space-between;align-items:center;gap:32px;margin-bottom:22px}.section-heading>p{max-width:420px;font-size:13px;color:var(--muted);margin:0}.card{border:1px solid var(--border);border-radius:20px;padding:24px;background:white;box-shadow:0 3px 0 #dde3ec}.planner-layout{display:grid;grid-template-columns:.95fr 1.05fr;gap:34px}.planner-layout fieldset{padding:0;border:0;margin:0 0 22px}legend{font-weight:750;font-size:13px;margin-bottom:10px}.choices{display:flex;gap:8px}.choices label,.focus-choices label{cursor:pointer;position:relative}.choices input,.focus-choices input{position:absolute;opacity:0;width:1px;height:1px}.choices span{display:block;padding:11px 17px;font-size:12px;font-weight:700;border:1px solid #d6dfff;border-radius:12px;background:#f8faff;box-shadow:0 2px 0 #dce3f1}.choices input:checked+span{color:white;background:var(--blue);border-color:var(--blue);box-shadow:0 3px 0 #3b58d8}.focus-choices{display:flex;gap:8px;flex-wrap:wrap}.focus-choices span{display:flex;align-items:center;gap:6px;padding:7px 11px;border:1px solid var(--border);border-radius:11px;font-size:12px;font-weight:650}.focus-choices img{width:22px;height:22px}.focus-choices input:checked+span{border-color:var(--blue);background:var(--soft);color:#3b58d8}.choices input:focus-visible+span,.focus-choices input:focus-visible+span{outline:3px solid #8ba0ff;outline-offset:3px}.session{background:#f5f7ff;border:1px solid #e7edff;border-radius:16px;padding:20px}.session h3{margin-bottom:5px}.session>p{font-size:12px;color:var(--muted)}.session ol{padding:0;list-style:none;margin:14px 0}.session li{background:white;border:1px solid #e7edff;border-radius:12px;display:flex;gap:10px;padding:11px;margin-bottom:9px}.step-number{flex-shrink:0;color:#536adf;background:var(--soft);width:26px;height:26px;display:grid;place-items:center;border-radius:8px;font-size:11px;font-weight:800}.session li a{font-size:13px;font-weight:750}.session li small{display:block;font-size:11px;color:var(--muted);margin-top:2px}.session .button{width:100%}.week-tools{display:flex;align-items:end;gap:16px;flex-wrap:wrap;margin-top:22px}.week-tools label{font-size:12px;max-width:230px}.text-button{background:none;border:0;padding:5px 0;color:#3b58d8;font-size:12px;font-weight:750}.text-button:disabled{opacity:.4;cursor:default}.exercise-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:16px}.exercise{padding:20px}.exercise img{width:38px;height:38px;margin-bottom:10px}.exercise h3{font-size:17px;margin-bottom:10px}.exercise>p{font-size:12px;color:var(--muted);margin-bottom:10px}.exercise details{border:0;padding:0;box-shadow:none}.exercise summary{font-size:12px;color:#3b58d8;font-weight:750;padding:4px 0}.exercise ol{padding-left:17px;font-size:12px;color:var(--muted)}.exercise li{margin:7px 0}.exercise .tip{background:#f5f7ff;padding:10px;border-radius:10px;font-size:11px;color:var(--muted)}.exercise>a{font-size:12px;font-weight:750;display:inline-block;margin-top:10px}.journal-layout{display:grid;grid-template-columns:1fr 1.05fr;gap:22px}label{display:block;font-size:12px;font-weight:700}input[type=date],input[type=number],input[type=text],select,textarea{width:100%;min-height:42px;border:1px solid #d6dfff;border-radius:10px;background:#f8faff;padding:9px 11px;color:var(--ink);margin:6px 0 12px;font-size:13px;font-weight:400}textarea{resize:vertical}.form-row{display:grid;grid-template-columns:1fr 1.25fr;gap:12px}#value-help{margin:-5px 0 14px}.optional{color:var(--muted);font-weight:400}.list-heading{display:flex;justify-content:space-between;align-items:center;gap:10px}.list-heading h3{margin:0}.journal-list>.micro{margin-bottom:18px}.empty{border-radius:14px;background:#f5f7ff;padding:26px 20px;color:var(--muted);text-align:center}.empty strong{color:var(--ink);display:block;font-size:15px;margin-bottom:6px}.empty p{font-size:12px;margin:0}.result-row{border-top:1px solid var(--border);padding:12px 0}.result-row>div{display:flex;gap:10px;justify-content:space-between;font-size:13px}.result-row small{font-size:11px;color:var(--muted)}.result-row p{font-size:12px;color:var(--muted);margin:6px 0 0;overflow-wrap:anywhere}.status{font-size:12px;color:#536387}.status.error{color:#b42318}.ready{background:var(--soft);display:flex;gap:30px;align-items:center;justify-content:space-between;margin:16px 0 32px;border-color:#dce4ff}.ready h2{font-size:26px}.ready p{font-size:13px;color:var(--muted);max-width:650px;margin:12px 0 0}.ready .button{flex-shrink:0}.faq{padding-bottom:38px}.faq h2{margin-bottom:22px}details{border:1px solid var(--border);background:white;border-radius:12px;padding:0 16px;margin:8px 0}summary{cursor:pointer;font-size:13px;font-weight:700;padding:14px 0}details .answer{color:var(--muted);font-size:13px;animation:reveal .22s ease}details .answer p{margin:0 0 16px}footer{border-top:1px solid var(--border);padding:25px 0 32px;font-size:12px}footer .brand{font-size:12px}footer>div:nth-child(2){display:flex;gap:20px;margin-top:14px}.skip{position:absolute;top:-100px;left:16px;background:white;padding:10px;z-index:5}.skip:focus{top:10px}:focus-visible{outline:3px solid #8ba0ff;outline-offset:3px}@keyframes reveal{from{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:none}} +@media(max-width:950px){.exercise-grid{grid-template-columns:repeat(2,1fr)}.hero{gap:20px}.site-header nav{gap:15px}.site-header nav>a:first-child{display:none}.planner-layout{gap:20px}.choices span{padding:11px 13px}} +@media(max-width:650px){.wrap{width:calc(100% - 32px)}.site-header{min-height:86px;gap:12px}.brand{font-size:13px}.site-header nav>a:not(.button){display:none}.site-header .button{padding:10px;font-size:11px}.hero{grid-template-columns:1fr;padding:32px 0 24px;gap:12px}.hero-art{height:220px;grid-row:2}h1{font-size:40px;letter-spacing:-.045em}.lead{font-size:14px}.section-heading{display:block}.section-heading>p{margin-top:13px}h2{font-size:28px}.planner-layout,.journal-layout{grid-template-columns:1fr}.card{padding:18px}.exercise-grid{gap:12px}.exercise{padding:16px}.exercise h3{font-size:16px}.ready{display:block}.ready .button{margin-top:20px}.form-row{grid-template-columns:1fr}.section{padding:27px 0}.choices{gap:7px}.choices span{padding:10px 13px}.week-tools{gap:12px}} +@media(prefers-reduced-motion:reduce){html{scroll-behavior:auto}*,*::before,*::after{animation:none!important;transition:none!important}} +@media print{body{font-size:12px;background:white}.site-header nav,.hero-art,.actions,.week-tools button,#result-form,.text-button,.ready,.faq,footer{display:none}.wrap{width:100%}.hero{padding:10px 0;display:block}h1{font-size:32px}.section{padding:16px 0}.card{box-shadow:none;break-inside:avoid}.exercise-grid{grid-template-columns:repeat(2,1fr)}.journal-layout{display:block}a{color:var(--ink)}} diff --git a/tests/planner.test.cjs b/tests/planner.test.cjs new file mode 100644 index 0000000..9c8a3ee --- /dev/null +++ b/tests/planner.test.cjs @@ -0,0 +1,44 @@ +const {test}=require('node:test'); +const assert=require('node:assert/strict'); +const api=require('../planner.js'); +const base={date:'2026-10-06',task:'reaction',value:240,condition:'same level · laptop · mouse',notes:''}; +test('every focus and time budget produces valid, distinct exercises',()=>{ + for(const focus of api.AREAS)for(const minutes of [2,5,8]){ + const plan=api.createSession({focus,minutes,offset:19}); + assert.ok(plan.tasks.length>=1&&plan.tasks.length<=3); + assert.equal(new Set(plan.tasks.map(task=>task.id)).size,plan.tasks.length); + if(focus!=='mixed')assert.ok(plan.tasks.every(task=>task.area===focus)); + } + for(const options of [{minutes:0},{minutes:3},{focus:'IQ'},{offset:-1},{offset:1.1}])assert.throws(()=>api.createSession(options)); +}); +test('week dates handle month, year, leap-day, and daylight-saving boundaries',()=>{ + assert.deepEqual(api.createWeek({startDate:'2024-02-27'}).map(day=>day.date),['2024-02-27','2024-02-28','2024-02-29','2024-03-01','2024-03-02','2024-03-03','2024-03-04']); + assert.equal(api.createWeek({startDate:'2026-12-29'})[6].date,'2027-01-04'); + assert.equal(api.createWeek({startDate:'2026-03-27'})[6].date,'2026-04-02'); + for(const startDate of ['2026-02-29','2026-02-30','x','2026-1-01',''])assert.throws(()=>api.createWeek({startDate})); +}); +test('journal preserves task units and rejects missing or impossible values',()=>{ + assert.equal(api.validateResult(base).unit,'ms'); + assert.equal(api.validateResult({...base,task:'stroop',value:0}).unit,'% correct'); + assert.equal(api.validateResult({...base,task:'number_memory',value:4}).unit,'digits'); + for(const value of ['',null,undefined,true,NaN,Infinity,' ',0,-1,{},[]])assert.throws(()=>api.validateResult({...base,value})); + assert.throws(()=>api.validateResult({...base,task:'stroop',value:101})); + assert.throws(()=>api.validateResult({...base,task:'visual_memory',value:2.5})); + assert.throws(()=>api.validateResult({...base,condition:''})); + assert.throws(()=>api.validateResult({...base,date:'2026-02-30'})); + assert.throws(()=>api.validateResult({...base,task:'unknown'})); +}); +test('CSV quotes multiline text and neutralizes spreadsheet formulas',()=>{ + const csv=api.resultsToCsv([{...base,notes:'=HYPERLINK("example")\nsecond line',condition:'+formula'}]); + assert.ok(csv.includes('"\'+formula"')); + assert.ok(csv.includes('"\'=HYPERLINK(""example"")\nsecond line"')); + assert.ok(api.resultsToCsv([]).includes('"date","task","value","unit","condition","notes"')); + assert.equal(api.weekToCsv(api.createWeek({startDate:'2026-10-06'})).trim().split('\r\n').length,8); +}); +test('public links target the BEAPP site, never another project',()=>{ + for(const task of api.TASKS){ + assert.equal(new URL(task.url).origin,'https://brainexerciseapp.com'); + assert.ok(task.steps.length===3); + } + assert.ok(Object.isFrozen(api.TASKS)); +}); From f29c7f717d18e437ed6f339255440202da80bbbc Mon Sep 17 00:00:00 2001 From: Yan Lunin <47182734+YanTM@users.noreply.github.com> Date: Tue, 6 Oct 2026 15:26:09 +0500 Subject: [PATCH 2/2] Add Quality gate for the standalone practice kit --- .github/workflows/quality.yml | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 .github/workflows/quality.yml diff --git a/.github/workflows/quality.yml b/.github/workflows/quality.yml new file mode 100644 index 0000000..ab790f8 --- /dev/null +++ b/.github/workflows/quality.yml @@ -0,0 +1,19 @@ +name: Practice Kit quality +on: + pull_request: + branches: [main] + push: + branches: [main] +permissions: + contents: read +jobs: + quality: + name: Quality gate + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: '22' + - run: npm run check + - run: npm test