Zero Block
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});