Files
fiddle/public/index.html
root 7f51af17a3 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
2026-02-26 11:19:14 -06:00

89 lines
3.2 KiB
HTML

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Fiddle</title>
<link rel="stylesheet" href="/css/style.css">
</head>
<body>
<header class="toolbar">
<div class="toolbar-left">
<a href="/" class="logo">Fiddle</a>
<select id="framework-mode">
<option value="html-css-js">HTML / CSS / JS</option>
<option value="typescript">TypeScript</option>
<option value="react">React (JSX)</option>
<option value="react-ts">React + TS</option>
<option value="vue">Vue</option>
<option value="svelte">Svelte</option>
</select>
<input type="text" id="title-input" placeholder="Untitled" spellcheck="false">
<select id="layout-mode">
<option value="default">Default</option>
<option value="top-bottom">Top / Bottom</option>
<option value="editor-only">Editor Only</option>
<option value="preview-only">Preview Only</option>
</select>
<select id="keybinding-mode">
<option value="default">Default</option>
<option value="vim">Vim</option>
<option value="emacs">Emacs</option>
</select>
</div>
<div class="toolbar-right">
<label class="auto-run-toggle" title="Auto-run on change">
<input type="checkbox" id="auto-run-checkbox" checked>
Auto
</label>
<button id="btn-run" title="Run (Ctrl+Enter)">Run</button>
<button id="btn-save" title="Save (Ctrl+S)">Save</button>
<button id="btn-fork" title="Fork">Fork</button>
</div>
</header>
<main class="grid">
<div class="panel panel-editor">
<div class="tab-bar" id="tab-bar"></div>
<div id="editor-area" class="editor-area"></div>
<div id="vim-status-bar" class="vim-status-bar"></div>
</div>
<div class="divider divider-col" id="divider-col"></div>
<div class="panel panel-preview">
<div class="panel-label">Preview</div>
<iframe id="preview-frame" sandbox="allow-scripts allow-same-origin"></iframe>
</div>
<div class="divider divider-row" id="divider-row"></div>
<div class="panel panel-console">
<div class="panel-label">Console <button id="btn-clear-console" class="btn-small">Clear</button></div>
<div id="console-output"></div>
</div>
</main>
<div id="share-toast" class="toast hidden"></div>
<script>
// Monaco AMD loader
const MONACO_CDN = 'https://cdnjs.cloudflare.com/ajax/libs/monaco-editor/0.52.2';
const script = document.createElement('script');
script.src = `${MONACO_CDN}/min/vs/loader.min.js`;
script.onload = () => {
require.config({ paths: { vs: `${MONACO_CDN}/min/vs` } });
// Cross-origin worker proxy
window.MonacoEnvironment = {
getWorkerUrl: function (_workerId, label) {
return `data:text/javascript;charset=utf-8,${encodeURIComponent(`
self.MonacoEnvironment = { baseUrl: '${MONACO_CDN}/min/' };
importScripts('${MONACO_CDN}/min/vs/base/worker/workerMain.js');
`)}`;
}
};
require(['vs/editor/editor.main'], () => {
import('/js/app.js');
});
};
document.head.appendChild(script);
</script>
</body>
</html>