- Auto-run toggle with localStorage persistence (toolbar checkbox) - Layout selector: default, top/bottom, editor-only, preview-only - Resizable panels via drag dividers with double-click reset - Emmet abbreviation expansion for HTML, CSS, and JSX - Vim and Emacs keybinding modes with lazy-loaded CDN libraries - Shared preferences module for localStorage management - Editor hooks for tab switch and mode change callbacks
30 lines
904 B
JavaScript
30 lines
904 B
JavaScript
let loaded = false;
|
|
|
|
function loadScript(src) {
|
|
return new Promise((resolve, reject) => {
|
|
if (document.querySelector(`script[src="${src}"]`)) { resolve(); return; }
|
|
const savedDefine = window.define;
|
|
window.define = undefined;
|
|
const s = document.createElement('script');
|
|
s.src = src;
|
|
s.onload = () => { window.define = savedDefine; resolve(); };
|
|
s.onerror = () => { window.define = savedDefine; reject(new Error(`Failed to load ${src}`)); };
|
|
document.head.appendChild(s);
|
|
});
|
|
}
|
|
|
|
export async function initEmmet() {
|
|
if (loaded) return;
|
|
try {
|
|
await loadScript('https://unpkg.com/emmet-monaco-es/dist/emmet-monaco.min.js');
|
|
if (window.emmetMonaco) {
|
|
emmetMonaco.emmetHTML(monaco);
|
|
emmetMonaco.emmetCSS(monaco);
|
|
emmetMonaco.emmetJSX(monaco);
|
|
loaded = true;
|
|
}
|
|
} catch (e) {
|
|
console.warn('Emmet load failed:', e.message);
|
|
}
|
|
}
|