Add editor experience features: auto-run, layouts, resizable panels, Emmet, vim/emacs
- 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
This commit is contained in:
29
public/js/emmet.js
Normal file
29
public/js/emmet.js
Normal file
@@ -0,0 +1,29 @@
|
||||
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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user