js/components/modal.js — prieinamas modalas
Kodo stulpelyje — js/components/modal.js. Visas prieinamumas — dviejose funkcijose:
export function openModal(date) {
overlay.classList.remove('hidden');
restoreBackground = hideBackground(overlay); // paslėpk foną
releaseFocus = trapFocus(overlay, { initialFocus: notesInput }); // įvesk + sulaikyk
}
export function closeModal() {
overlay.classList.add('hidden');
restoreBackground?.();
releaseFocus?.(); // grąžina fokusą mygtukui, kuris atidarė
}
Plius Esc uždaro ir fono (backdrop) paspaudimas uždaro:
overlay.addEventListener('click', (e) => { if (e.target === overlay) closeModal(); });
document.addEventListener('keydown', (e) => {
if (e.key === 'Escape' && !overlay.classList.contains('hidden')) closeModal();
});
(Fono paspaudimas: e.target === overlay — jei spustelėta pati perdanga, ne modalas viduje.)
Patvirtinimo dialogas (confirm.js) ir pranešimai (toast.js) — tas pats modelis: confirm.js naudoja tą patį trapFocus; toast.js tiesiog prideda laikiną <div>, kuris pats pranyksta po ~2,6 s.
Žvaigždučių klaviatūra (makeRadioGroup iš a11y.js) — rodyklių klavišai judina, Space/Enter renka:
makeRadioGroup(starsEl, { onSelect: (value) => { draftRating = value; renderStars(); } });
// role="radio", tabIndex valdymas, ArrowLeft/Right → kita žvaigždutė
Patikrink (klaviatūra, ne pele!).
1. Atidaryk modalą → fokusas jau viduje (pastabų lauke).
2. Spausk Tab keliskart → fokusas SUKASI modalo viduje, neišeina.
3. Uždaryk (Esc) → fokusas grįžta į „Edit" mygtuką, iš kurio atėjai.
4. Žvaigždutės: rodyklėmis judini, Space parenki — be pelės.
Spąstai (fokusas pabėga).
openModalužkomentuoktrapFocuseilutę. Atidaryk modalą ir spauskTab— fokusas iškeliaus į navigacijos nuorodas už modalo (matysi fokuso rėmelį ne ten). Klaviatūros vartotojas dabar „dingo" fone. GrąžinktrapFocus— fokusas vėl sukasi viduje. Kiekvienas modalas privalo gaudyti fokusą; be to jis prieinamai sulūžęs, net jei pele atrodo gerai.