javascript:(function(){if(window._heidiTabStop){return;}const EDITOR_SELECTOR='.tiptap.ProseMirror';function getEditor(){return document.querySelector(EDITOR_SELECTOR);}function isEditorActive(editor){const sel=window.getSelection();if(!sel||sel.rangeCount===0)return false;return editor.contains(sel.getRangeAt(0).commonAncestorContainer);}function getTextNodes(root){const walker=document.createTreeWalker(root,NodeFilter.SHOW_TEXT,null);const nodes=[];let node;while((node=walker.nextNode()))nodes.push(node);return nodes;}function buildVirtualString(textNodes){const positions=[];let str='';for(const node of textNodes){positions.push(str.length);str+=node.textContent;}return{str,positions};}function virtualToNodeOffset(textNodes,positions,vpos){for(let i=textNodes.length-1;i>=0;i--){if(vpos>=positions[i])return{node:textNodes[i],offset:vpos-positions[i]};}return{node:textNodes[0],offset:0};}function getCursorVirtualPos(textNodes,positions,useEnd){const sel=window.getSelection();if(!sel||sel.rangeCount===0)return useEnd?Infinity:0;const range=sel.getRangeAt(0);const container=useEnd?range.endContainer:range.startContainer;const offset=useEnd?range.endOffset:range.startOffset;const idx=textNodes.indexOf(container);if(idx>=0)return positions[idx]+offset;return useEnd?0:Infinity;}function findAllBracketPairs(str){const pairs=[];let i=0;while(i<str.length){if(str[i]==='['){let depth=1;let j=i+1;while(j<str.length&&depth>0){if(str[j]==='[')depth++;else if(str[j]===']')depth--;j++;}if(depth===0){pairs.push({open:i,close:j-1});i=j;}else{i++;}}else{i++;}}return pairs;}function applyBracketSelection(textNodes,positions,open,close){const openLoc=virtualToNodeOffset(textNodes,positions,open);const closeLoc=virtualToNodeOffset(textNodes,positions,close);const closeRange=document.createRange();closeRange.setStart(closeLoc.node,closeLoc.offset);closeRange.setEnd(closeLoc.node,closeLoc.offset+1);closeRange.deleteContents();const openRange=document.createRange();openRange.setStart(openLoc.node,openLoc.offset);openRange.setEnd(openLoc.node,openLoc.offset+1);openRange.deleteContents();const sel=window.getSelection();const selRange=document.createRange();selRange.setStart(openLoc.node,openLoc.offset);if(openLoc.node===closeLoc.node){selRange.setEnd(openLoc.node,openLoc.offset+(close-open-1));}else{selRange.setEnd(closeLoc.node,closeLoc.offset);}sel.removeAllRanges();sel.addRange(selRange);}function countBrackets(){const editor=getEditor();if(!editor)return 0;const walker=document.createTreeWalker(editor,NodeFilter.SHOW_TEXT,null);let str='';let node;while((node=walker.nextNode()))str+=node.nodeValue;return findAllBracketPairs(str).length;}function updateBadge(){const b=document.getElementById('_heidiTabBadge');if(!b)return;const n=countBrackets();if(n===0){b.innerHTML='⌨️';b.style.background='#6b78ff';}else{b.innerHTML='⌨️<span style="position:absolute;top:-5px;right:-5px;background:#e53e3e;color:#fff;border-radius:10px;font-size:10px;font-weight:700;min-width:18px;height:18px;display:flex;align-items:center;justify-content:center;padding:0 4px;font-family:system-ui,sans-serif;">'+n+'</span>';}}function rewriteDotTrigger(){const editor=getEditor();if(!editor)return false;const sel=window.getSelection();if(!sel||sel.rangeCount===0)return false;const range=sel.getRangeAt(0);if(!range.collapsed)return false;const container=range.startContainer;if(container.nodeType!==Node.TEXT_NODE)return false;const offset=range.startOffset;const text=container.nodeValue;const before=text.slice(0,offset);const match=before.match(/(\.[a-zA-Z][a-zA-Z0-9]*)$/);if(!match)return false;const trigger=match[1];const triggerStart=offset-trigger.length;container.nodeValue=text.slice(0,triggerStart)+'/'+trigger.slice(1)+text.slice(offset);const newRange=document.createRange();newRange.setStart(container,triggerStart+trigger.length);newRange.collapse(true);sel.removeAllRanges();sel.addRange(newRange);return true;}function showToast(msg,color){const t=document.createElement('div');t.textContent=msg;t.style.cssText='position:fixed;bottom:24px;left:50%;transform:translateX(-50%);background:'+color+';color:#fff;padding:8px 18px;border-radius:20px;font-size:13px;font-family:system-ui,sans-serif;font-weight:600;z-index:99999;box-shadow:0 2px 12px rgba(0,0,0,0.25);opacity:1;transition:opacity 0.5s ease;pointer-events:none;';document.body.appendChild(t);setTimeout(()=>{t.style.opacity='0';setTimeout(()=>t.remove(),500);},2500);}function handleKeydown(e){if(e.key==='Tab'){const editor=getEditor();if(!editor||!isEditorActive(editor))return;const textNodes=getTextNodes(editor);if(textNodes.length===0)return;const{str,positions}=buildVirtualString(textNodes);const pairs=findAllBracketPairs(str);if(pairs.length===0)return;const isShift=e.shiftKey;let targetPair=null;if(!isShift){targetPair=pairs[0];}else{const cursorPos=getCursorVirtualPos(textNodes,positions,false);if(cursorPos<=0){targetPair=pairs[pairs.length-1];}else{for(let i=pairs.length-1;i>=0;i--){if(pairs[i].open<cursorPos){targetPair=pairs[i];break;}}}}if(!targetPair)return;e.preventDefault();e.stopPropagation();applyBracketSelection(textNodes,positions,targetPair.open,targetPair.close);setTimeout(updateBadge,50);}else if(e.key==='Enter'){const editor=getEditor();if(!editor||!isEditorActive(editor))return;const rewritten=rewriteDotTrigger();if(rewritten){e.stopPropagation();}}}function handleCopyClick(e){const btn=e.target.closest('button:has(.lucide-copy)');if(!btn)return;if(countBrackets()>0){e.preventDefault();e.stopPropagation();showToast('⚠️ Unfilled fields remaining -- complete all [ ] before copying','#e53e3e');}}function startObserver(){const editor=getEditor();if(!editor)return;const obs=new MutationObserver(()=>updateBadge());obs.observe(editor,{childList:true,subtree:true,characterData:true});window._heidiTabObserver=obs;}document.addEventListener('keydown',handleKeydown,true);document.addEventListener('click',handleCopyClick,true);function showBadge(){const b=document.createElement('div');b.id='_heidiTabBadge';b.style.cssText='position:fixed;bottom:12px;right:12px;background:#6b78ff;color:#fff;width:32px;height:32px;border-radius:50%;font-size:16px;display:flex;align-items:center;justify-content:center;z-index:99999;box-shadow:0 2px 8px rgba(0,0,0,0.3);cursor:pointer;user-select:none;';b.title='HeidiTab active -- click to deactivate';b.addEventListener('click',()=>{document.removeEventListener('keydown',handleKeydown,true);document.removeEventListener('click',handleCopyClick,true);if(window._heidiTabObserver){window._heidiTabObserver.disconnect();delete window._heidiTabObserver;}b.remove();window._heidiTabStop=false;showToast('⌨️ HeidiTab deactivated','#4a5568');});document.body.appendChild(b);}window._heidiTabStop=true;showToast('⌨️ HeidiTab active','#6b78ff');showBadge();updateBadge();startObserver();})();