diff --git a/html/custom-css.ejs b/html/custom-css.ejs index 9ef40dcf..96fa2dad 100644 --- a/html/custom-css.ejs +++ b/html/custom-css.ejs @@ -126,6 +126,21 @@ footer{max-width:1200px;margin:40px auto 50px;padding:0 16px;color:var(--muted);font-size:12px} .btn:focus,.tab:focus{outline:none;box-shadow:var(--ring)} + + + + + +
so Prism can own it
+ targetPre.innerHTML = '';
+ const code = document.createElement('code');
+ code.className = 'language-' + (lang==='css' ? 'css' : 'javascript');
+ code.textContent = text; // never insert HTML here
+ targetPre.appendChild(code);
+ // Highlight
+ if (window.Prism) Prism.highlightElement(code);
}
function makeEditor(edSel, hlSel, lnSel, { lang='css', storageKey, defaultValue='' }){
@@ -348,12 +322,8 @@ document.addEventListener('DOMContentLoaded', () => {
const load = () => {
let saved = localStorage.getItem(storageKey);
if (saved === null) saved = defaultValue;
- // one-time cleanup for old corrupted saves
const cleaned = stripHighlightArtifacts(saved);
- if (cleaned !== saved) {
- localStorage.setItem(storageKey, cleaned);
- saved = cleaned;
- }
+ if (cleaned !== saved) { localStorage.setItem(storageKey, cleaned); saved = cleaned; }
return saved;
};
@@ -364,33 +334,34 @@ document.addEventListener('DOMContentLoaded', () => {
ln.textContent = out;
};
- const render = (text) => {
- setLines(text);
- hl.innerHTML = (lang==='css') ? highlightCSS(text) : highlightJS(text);
- };
+ const render = (text) => { setLines(text); prismRender(hl, lang, text); };
const initial = load();
ed.value = initial; render(initial);
+ // Scroll sync
const syncScroll = () => { hl.scrollTop = ed.scrollTop; hl.scrollLeft = ed.scrollLeft; ln.scrollTop = ed.scrollTop; };
on(ed, 'scroll', syncScroll);
+ // Update
const update = () => render(ed.value);
- on(ed, 'input', debounce(update, 20));
+ on(ed, 'input', debounce(update, 40));
+ // Actions
const save = () => { localStorage.setItem(storageKey, ed.value); toast('Saved'); };
const reset = () => { if (confirm('Clear the editor?')) { ed.value=''; update(); save(); } };
const copy = () => copyText(ed.value);
const exportFile = () => saveFile(storageKey + (lang==='css'?'.css':'.js'), ed.value, 'text/plain');
- return { ed, hl, ln, save, reset, copy, exportFile, render, setLines,
- setWrap:(onwrap)=>{ ed.style.whiteSpace = onwrap?'pre-wrap':'pre'; ed.style.overflowWrap = onwrap?'anywhere':'normal'; },
- format:()=>{ if (lang==='css') ed.value = basicFormatCSS(ed.value); else ed.value = basicFormatJS(ed.value); update(); },
- importFrom:(file)=> new Promise(res=>{
- const r=new FileReader();
- r.onload=()=>{ ed.value=String(r.result||''); update(); res(); };
- r.readAsText(file);
- })
+ return {
+ ed, hl, ln, save, reset, copy, exportFile, render, setLines,
+ setWrap:(onwrap)=>{ ed.style.whiteSpace = onwrap?'pre-wrap':'pre'; ed.style.overflowWrap = onwrap?'anywhere':'normal'; },
+ format:()=>{ if (lang==='css') ed.value = basicFormatCSS(ed.value); else ed.value = basicFormatJS(ed.value); update(); },
+ importFrom:(file)=> new Promise(res=>{
+ const r=new FileReader();
+ r.onload=()=>{ ed.value=String(r.result||''); update(); res(); };
+ r.readAsText(file);
+ })
};
}
@@ -407,7 +378,10 @@ nav { backdrop-filter: blur(16px) saturate(120%); }
*/`
});
- const cssStylePreview = document.createElement('style'); cssStylePreview.id='custom-css-preview'; document.body.appendChild(cssStylePreview);
+ const cssStylePreview = document.createElement('style');
+ cssStylePreview.id='custom-css-preview';
+ document.body.appendChild(cssStylePreview);
+
const applyCssPreview = () => { cssStylePreview.textContent = cssEditor.ed.value || ''; };
applyCssPreview();