Click "Block Editor" to enter the edit mode. Use layers, shapes and customize adaptability. Everything is in your hands.
Tilda Publishing
create your own block from scratch
let _lastRange=null;
document.addEventListener('selectionchange',function(){
const el=document.getElementById('noteEditor');if(!el)return;
const sel=window.getSelection();
if(sel.rangeCount>0&&el.contains(sel.anchorNode))_lastRange=sel.getRangeAt(0).cloneRange();
});
function execCmd(c){document.execCommand(c,false,null);saveNote()}
function insertChecklist(){rit('\n☐ ')}
function toggleEmojiPicker(){const p=document.getElementById('emojiPicker');if(!p.innerHTML)p.innerHTML=EMOJIS.map(e=>``).join('');p.style.display=p.style.display==='none'?'flex':'none'}
function pickEmoji(e){rit(e);document.getElementById('emojiPicker').style.display='none'}
function rit(text){const el=document.getElementById('noteEditor');el.focus();if(_lastRange){const s=window.getSelection();s.removeAllRanges();s.addRange(_lastRange)};document.execCommand('insertText',false,text);_lastRange=window.getSelection().rangeCount>0?window.getSelection().getRangeAt(0).cloneRange():null;saveNote()}
function saveNote(){const el=document.getElementById('noteEditor');if(el){S.notes[S.aS]=el.innerHTML;saveState()}}
function renderNotes(){const el=document.getElementById('noteEditor');if(el)el.innerHTML=S.notes[S.aS]||''}
function saveProject(v){S.proj=v;saveState()}
function resetProgress(){if(!confirm('Сбросить весь прогресс?'))return;S.completed=new Set();S.checks={};saveState();renderAll()}
function copyNotes(){var el=document.getElementById("noteEditor");if(!el||!el.innerText.trim())return;navigator.clipboard.writeText(el.innerText).then(function(){var btn=document.querySelector(".notes-head button");if(btn){var old=btn.innerHTML;btn.innerHTML="✓ Скопировано";setTimeout(function(){btn.innerHTML=old},1500)}})}
function clearNotes(){if(!confirm('Очистить все заметки?'))return;S.notes={};saveState();renderAll()}
function renderAll(){renderPhaseTabs();renderStepList();renderContent();renderNotes();renderProgress();const pi=document.getElementById('projName');if(pi&&S.proj)pi.value=S.proj}
document.addEventListener('DOMContentLoaded',renderAll);
// Observer to auto-render HCI tables when they appear
var _hciObs = new MutationObserver(function(){
if(document.getElementById('hciBody1') && !document.getElementById('hciBody1').hasChildNodes()){
hciMode='none';hciSortCol=null;hciSortDir=0;
renderHCI(CASE1_DATA,CASE_SECTIONS,'hciBody1');
}
});
_hciObs.observe(document.body, {childList:true, subtree:true});