font-size 10→12px, 버튼 배경색·테두리 뚜렷하게, ctx-wrap display:none 이중 선언 버그 수정. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
292 lines
21 KiB
HTML
292 lines
21 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="ko">
|
|
<head>
|
|
<meta charset="UTF-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
<title>💻 코드 에디터</title>
|
|
<link rel="preconnect" href="https://fonts.googleapis.com">
|
|
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
|
<link href="https://fonts.googleapis.com/css2?family=Nanum+Gothic:wght@400;700;800&display=swap" rel="stylesheet">
|
|
<link href="https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;500;600&display=swap" rel="stylesheet">
|
|
<link rel="icon" type="image/png" sizes="64x64" href="cherry_logo.png">
|
|
<!-- CodeMirror + xterm (UMD libs loaded before Monaco's AMD loader to avoid anonymous define() clashes) -->
|
|
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/codemirror.min.css">
|
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/codemirror.min.js"></script>
|
|
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/xterm@5.3.0/css/xterm.min.css">
|
|
<script src="https://cdn.jsdelivr.net/npm/xterm@5.3.0/lib/xterm.js"></script>
|
|
<script src="https://cdn.jsdelivr.net/npm/xterm-addon-fit@0.8.0/lib/xterm-addon-fit.js"></script>
|
|
<script src="https://cdn.jsdelivr.net/npm/xterm-addon-web-links@0.9.0/lib/xterm-addon-web-links.js"></script>
|
|
<link rel="stylesheet" href="styles.css">
|
|
<!-- Monaco loader (AMD). Hide define.amd first so any stray UMD lib does not call Monaco's anonymous define(). -->
|
|
<script src="https://cdn.jsdelivr.net/npm/monaco-editor@0.45.0/min/vs/loader.js"></script>
|
|
<script>
|
|
try {
|
|
var _t = localStorage.getItem('code-page-theme') || localStorage.getItem('cherryclaw_theme') || 'dark';
|
|
document.documentElement.setAttribute('data-theme', _t);
|
|
} catch (e) {}
|
|
</script>
|
|
<style>
|
|
html, body { height: 100%; }
|
|
:root[data-theme="warm"] {
|
|
--bg:#f5f0e8;--bg-soft:#ede8dc;--panel:#fffdf7;--panel-2:#ede8dc;
|
|
--line:#d6ccbb;--text:#2c2318;--muted:#7a6e5e;--brand:#7c5c2e;--brand2:#a07840;
|
|
}
|
|
.code-theme-btn{background:none;border:1.5px solid var(--line);border-radius:6px;padding:3px 9px;font-size:12px;color:var(--muted);cursor:pointer;transition:.15s;white-space:nowrap;}
|
|
.code-theme-btn.active{border-color:var(--brand);color:var(--brand2);}
|
|
.code-theme-btn:hover{border-color:var(--brand);color:var(--brand2);}
|
|
.code-theme-groups{display:flex;flex-direction:column;gap:5px;margin-top:5px;}
|
|
.code-theme-row{display:flex;align-items:center;gap:5px;}
|
|
.code-theme-row-lbl{font-size:12px;width:52px;flex-shrink:0;color:var(--text);}
|
|
.code-skin-sw{width:20px;height:20px;border-radius:4px;cursor:pointer;border:2px solid var(--line);transition:.15s;box-sizing:border-box;flex-shrink:0;}
|
|
.code-skin-sw.active{border-color:var(--brand) !important;box-shadow:0 0 0 2px var(--brand);transform:scale(1.15);}
|
|
.code-skin-sw:hover{transform:scale(1.1);}
|
|
body { margin: 0; background: var(--bg); color: var(--text); font-family: 'Nanum Gothic', system-ui, sans-serif; display: flex; flex-direction: column; overflow: hidden; }
|
|
.code-page-header { display: flex; align-items: center; gap: 10px; padding: 8px 14px; background: var(--panel); border-bottom: 1px solid var(--line); flex-shrink: 0; }
|
|
.code-page-header h1 { font-size: 14px; font-weight: 700; margin: 0; }
|
|
.code-page-header .sub { font-size: 11px; color: var(--muted); }
|
|
.code-layout { flex: 1; display: flex; min-height: 0; }
|
|
.code-sidebar-wrap { width: 240px; flex-shrink: 0; display: flex; flex-direction: column; border-right: 1px solid var(--line); background: var(--panel); min-height: 0; }
|
|
/* Override the main-app inline display:none / flex on the shared sidebar markup */
|
|
#sidebar-code { display: flex !important; }
|
|
#code-view { flex: 1; min-width: 0; }
|
|
</style>
|
|
</head>
|
|
<body>
|
|
|
|
<div class="code-page-header">
|
|
<span style="font-size:16px">💻</span>
|
|
<h1>코드 에디터</h1>
|
|
<span class="sub" id="code-header-dir">폴더 없음</span>
|
|
<div style="display:flex;gap:4px;margin-left:8px">
|
|
<button class="code-theme-btn" id="ctbtn-dark" onclick="setCodePageTheme('dark')">🌙 다크</button>
|
|
<button class="code-theme-btn" id="ctbtn-light" onclick="setCodePageTheme('light')">☀️ 라이트</button>
|
|
<button class="code-theme-btn" id="ctbtn-warm" onclick="setCodePageTheme('warm')">🌿 웜</button>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="code-layout">
|
|
|
|
<!-- CODE SIDEBAR (mirrors #sidebar-code in index.html) -->
|
|
<div class="code-sidebar-wrap">
|
|
<div id="sidebar-code" style="display:flex;flex-direction:column;flex:1;min-height:0;overflow:hidden">
|
|
<!-- 상단 탭: 파일 | 설정 -->
|
|
<div style="display:flex;border-bottom:1px solid var(--line);flex-shrink:0;background:var(--panel-2)">
|
|
<button class="code-sb-tab active" id="csb-tab-files" onclick="setCodeSbTab('files')">파일</button>
|
|
<button class="code-sb-tab" id="csb-tab-settings"onclick="setCodeSbTab('settings')">설정</button>
|
|
</div>
|
|
|
|
<!-- 파일 탭: 상하 분할 -->
|
|
<div id="csb-files" style="display:flex;flex-direction:column;flex:1;min-height:0">
|
|
<!-- 상단: 파일 트리 -->
|
|
<div style="display:flex;flex-direction:column;flex:1;min-height:0;border-bottom:1px solid var(--line)">
|
|
<div style="display:flex;align-items:center;justify-content:space-between;padding:7px 10px;border-bottom:1px solid var(--line);flex-shrink:0">
|
|
<span id="csb-folder-label" style="font-size:10px;font-weight:700;color:var(--muted);text-transform:uppercase;letter-spacing:.05em">폴더 없음</span>
|
|
<div style="display:flex;gap:4px">
|
|
<button id="code-local-btn" onclick="openLocalFolder()" title="로컬 폴더 열기" style="background:none;border:none;cursor:pointer;color:var(--muted);font-size:14px;line-height:1;padding:0 3px">🖥️</button>
|
|
<button onclick="codeNewFile()" title="새 파일" style="background:none;border:none;cursor:pointer;color:var(--muted);font-size:16px;line-height:1;padding:0 3px">+</button>
|
|
<button onclick="codeSbRefresh()" title="새로고침" style="background:none;border:none;cursor:pointer;color:var(--muted);font-size:13px;line-height:1;padding:0 3px">↺</button>
|
|
</div>
|
|
</div>
|
|
<!-- 프로젝트 선택 -->
|
|
<div id="csb-project-row" style="display:none;align-items:center;gap:5px;padding:5px 8px;border-bottom:1px solid var(--line);flex-shrink:0;background:var(--panel-2)">
|
|
<span style="font-size:11px;flex-shrink:0">📁</span>
|
|
<select id="csb-project-sel" onchange="switchProject(this.value||null)"
|
|
style="flex:1;font-size:11px;padding:3px 5px;background:var(--panel);color:var(--text);border:1px solid var(--line);border-radius:5px;min-width:0;cursor:pointer">
|
|
</select>
|
|
<button onclick="deleteActiveProject()" title="현재 프로젝트 삭제" style="flex-shrink:0;background:none;border:none;color:var(--muted);cursor:pointer;font-size:13px;padding:2px 4px;border-radius:4px;line-height:1" onmouseover="this.style.color='#f87171'" onmouseout="this.style.color='var(--muted)'">🗑</button>
|
|
</div>
|
|
<div id="csb-file-tree" style="flex:1;overflow-y:auto;padding:4px 0">
|
|
<div style="padding:12px;color:var(--muted);font-size:11px;text-align:center">로딩 중...</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- 하단: 모델 설정 패널 -->
|
|
<div style="flex-shrink:0;height:46%;min-height:160px;display:flex;flex-direction:column;overflow:hidden">
|
|
<!-- 모델 선택 -->
|
|
<div style="display:flex;flex-direction:column;flex:1;overflow-y:auto;padding:10px 12px;gap:8px">
|
|
<div>
|
|
<div style="font-size:10px;font-weight:700;color:var(--muted);text-transform:uppercase;letter-spacing:.05em;margin-bottom:5px">Coder AI 모델</div>
|
|
<select id="csb-model-select" onchange="csbModelChanged()"
|
|
style="width:100%;font-size:12px;padding:5px 8px;background:var(--panel-2);color:var(--text);border:1px solid var(--line);border-radius:8px;cursor:pointer">
|
|
</select>
|
|
</div>
|
|
<div id="csb-session-project-row" style="display:none">
|
|
<div style="font-size:10px;font-weight:700;color:var(--muted);text-transform:uppercase;letter-spacing:.05em;margin-bottom:5px">프로젝트</div>
|
|
<select id="csb-session-project-sel" onchange="switchProject(this.value||null)" style="width:100%;font-size:12px;padding:5px 8px;background:var(--panel-2);color:var(--text);border:1px solid var(--line);border-radius:8px;font-family:monospace;cursor:pointer"></select>
|
|
</div>
|
|
<button onclick="codeAiClear()" style="width:100%;padding:7px;border:1px solid var(--line);background:var(--panel-2);color:var(--muted);border-radius:8px;cursor:pointer;font-size:12px">↺ 새 세션</button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- 설정 탭 -->
|
|
<div id="csb-settings" style="display:none;flex-direction:column;flex:1;min-height:0;overflow-y:auto;padding:14px 12px;gap:14px">
|
|
<div>
|
|
<div style="font-size:10px;font-weight:700;color:var(--muted);text-transform:uppercase;letter-spacing:.05em;margin-bottom:6px">터미널 시작 경로</div>
|
|
<div style="display:flex;align-items:center;gap:6px">
|
|
<input type="text" id="csb-termpath" placeholder="/home/kim/projects/mygame"
|
|
style="flex:1;font-size:12px;padding:6px 8px;background:var(--panel-2);color:var(--text);border:1px solid var(--line);border-radius:8px;font-family:'IBM Plex Mono',monospace">
|
|
<button onclick="csbTermPathSave()" style="background:var(--brand);color:#fff;border:none;border-radius:8px;padding:6px 10px;font-size:11px;font-weight:700;cursor:pointer;white-space:nowrap">저장</button>
|
|
</div>
|
|
<div style="font-size:10px;color:var(--muted);margin-top:4px">새 터미널 탭 열면 이 경로로 자동 이동</div>
|
|
</div>
|
|
<div>
|
|
<div style="font-size:10px;font-weight:700;color:var(--muted);text-transform:uppercase;letter-spacing:.05em;margin-bottom:6px">코드 저장 디렉토리</div>
|
|
<div style="display:flex;align-items:center;gap:6px">
|
|
<input type="text" id="csb-codedir" value="code" onchange="csbCodeDirChanged(this.value)"
|
|
style="flex:1;font-size:12px;padding:6px 8px;background:var(--panel-2);color:var(--text);border:1px solid var(--line);border-radius:8px;font-family:'IBM Plex Mono',monospace">
|
|
<button onclick="csbCodeDirSave()" title="저장" style="background:var(--brand);color:#fff;border:none;border-radius:8px;padding:6px 10px;font-size:11px;font-weight:700;cursor:pointer;white-space:nowrap">저장</button>
|
|
</div>
|
|
<div style="font-size:10px;color:var(--muted);margin-top:4px">워크스페이스 하위 폴더 (기본: code)</div>
|
|
</div>
|
|
<div>
|
|
<div style="font-size:10px;font-weight:700;color:var(--muted);text-transform:uppercase;letter-spacing:.05em;margin-bottom:6px">폰트 크기</div>
|
|
<div style="display:flex;align-items:center;gap:8px">
|
|
<input type="range" id="csb-fontsize" min="10" max="22" value="14" oninput="csbFontSize(this.value)"
|
|
style="flex:1;accent-color:var(--brand)">
|
|
<span id="csb-fontsize-label" style="font-size:11px;color:var(--muted);width:24px;text-align:right">14</span>
|
|
</div>
|
|
</div>
|
|
<div>
|
|
<div style="font-size:10px;font-weight:700;color:var(--muted);text-transform:uppercase;letter-spacing:.05em;margin-bottom:6px">줄 바꿈</div>
|
|
<label style="display:flex;align-items:center;gap:8px;cursor:pointer;font-size:12px;color:var(--text)">
|
|
<input type="checkbox" id="csb-wordwrap" checked onchange="csbWordWrap(this.checked)"
|
|
style="accent-color:var(--brand);width:15px;height:15px">
|
|
자동 줄 바꿈
|
|
</label>
|
|
</div>
|
|
<div>
|
|
<div style="font-size:10px;font-weight:700;color:var(--muted);text-transform:uppercase;letter-spacing:.05em;margin-bottom:2px">에디터 테마 <span id="csb-theme-lbl" style="font-weight:400;text-transform:none;letter-spacing:0;color:var(--text)"></span></div>
|
|
<div class="code-skin-grid" id="csb-theme-grid"></div>
|
|
</div>
|
|
<div>
|
|
<div style="font-size:10px;font-weight:700;color:var(--muted);text-transform:uppercase;letter-spacing:.05em;margin-bottom:6px">탭 크기</div>
|
|
<select id="csb-tabsize" onchange="csbTabSize(this.value)"
|
|
style="width:100%;font-size:12px;padding:6px 8px;background:var(--panel-2);color:var(--text);border:1px solid var(--line);border-radius:8px;cursor:pointer">
|
|
<option value="2" selected>2칸</option>
|
|
<option value="4">4칸</option>
|
|
<option value="8">8칸</option>
|
|
</select>
|
|
</div>
|
|
<div>
|
|
<div style="font-size:10px;font-weight:700;color:var(--muted);text-transform:uppercase;letter-spacing:.05em;margin-bottom:6px">미니맵</div>
|
|
<label style="display:flex;align-items:center;gap:8px;cursor:pointer;font-size:12px;color:var(--text)">
|
|
<input type="checkbox" id="csb-minimap" checked onchange="csbMinimap(this.checked)"
|
|
style="accent-color:var(--brand);width:15px;height:15px">
|
|
미니맵 표시
|
|
</label>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- ── Code Editor View (mirrors #code-view in index.html) ─────────────── -->
|
|
<div id="code-view" class="active">
|
|
<!-- File tabs bar -->
|
|
<div class="code-tabs-bar">
|
|
<div id="code-file-tabs" style="display:flex;align-items:stretch"></div>
|
|
<button class="code-new-tab-btn" onclick="codeNewFile()" title="새 파일">+</button>
|
|
<div class="code-toolbar">
|
|
<button id="code-folder-btn" class="code-tool-btn btn-folder" onclick="toggleCodeFolderBrowser(event)" title="파일 탐색기 열기"
|
|
style="gap:4px;display:flex;align-items:center">
|
|
📁 <span>workspace/code/</span> ▾
|
|
</button>
|
|
<button class="code-tool-btn btn-ai" onclick="codeSendSelectionToAI()" title="선택 영역을 AI에게 전송">💬 AI에게 전송</button>
|
|
<div id="code-run-dropdown" style="position:relative;display:inline-flex;align-items:center">
|
|
<button class="code-tool-btn btn-run" onclick="codeRunDefault()" title="실행">
|
|
<span id="code-run-icon">▶</span> <span id="code-run-label">실행</span>
|
|
</button>
|
|
<button class="code-tool-btn btn-run" onclick="codeToggleRunMenu()" title="실행 방법 선택" style="padding:6px 4px;margin-left:-1px;border-left:1px solid rgba(34,197,94,.3)">▾</button>
|
|
<span id="companion-dot" onclick="companionConnect()" style="width:8px;height:8px;border-radius:50%;background:#6b7280;display:inline-block;cursor:pointer;margin-left:6px;flex-shrink:0" title="Python companion 미연결 — 클릭해서 재연결"></span>
|
|
<div id="code-run-menu" style="display:none;position:absolute;top:100%;right:0;z-index:99;min-width:180px;background:#1a2e1a;border:1px solid #2d5a3a;border-radius:6px;box-shadow:0 4px 16px rgba(0,0,0,.5);margin-top:2px;overflow:hidden">
|
|
</div>
|
|
</div>
|
|
<button class="code-tool-btn btn-save" onclick="codeSaveFile()" title="파일 저장 (Ctrl+S)">💾 저장</button>
|
|
<button id="code-term-toggle-btn" class="code-tool-btn" onclick="toggleCodeTerminal()"
|
|
title="터미널 토글 (Ctrl+`)"
|
|
style="background:#111b14;border-color:#2d5a3a;color:#6fcf8a;font-family:'IBM Plex Mono',monospace;font-size:11px">⌨ 터미널</button>
|
|
</div>
|
|
</div>
|
|
<!-- Editor + AI panel -->
|
|
<div class="code-body">
|
|
<div id="code-diff-bar" style="display:none">
|
|
<span id="code-diff-label">🔀 AI 제안 변경 사항</span>
|
|
<span id="code-diff-hunk-info" style="font-size:11px;color:var(--muted)"></span>
|
|
<button id="code-diff-accept" onclick="acceptAllHunks()">✅ 모두 적용</button>
|
|
<button id="code-diff-reject" onclick="rejectAllHunks()">❌ 모두 취소</button>
|
|
</div>
|
|
<div id="code-editor-container"></div>
|
|
<div class="code-vresize" id="code-vresize"></div>
|
|
<div id="code-ai-panel">
|
|
<div class="code-ai-header">
|
|
<span id="code-ai-title">💻 Coder AI</span>
|
|
<div class="code-ai-tech-selector" id="code-ai-tech-selector">
|
|
<button class="code-ai-tech-btn active" data-tech="auto" onclick="setCodeAiTech('auto')">🤖 자동</button>
|
|
<button class="code-ai-tech-btn" data-tech="html" onclick="setCodeAiTech('html')">🌐 HTML</button>
|
|
<button class="code-ai-tech-btn" data-tech="python" onclick="setCodeAiTech('python')">🐍 Python</button>
|
|
<button class="code-ai-tech-btn" data-tech="node" onclick="setCodeAiTech('node')">🟢 Node</button>
|
|
</div>
|
|
</div>
|
|
<div id="code-ai-messages">
|
|
<div class="code-ai-msg thinking">코드를 선택하고 "AI에게 전송"을 누르거나, 아래에 질문을 입력하세요.</div>
|
|
</div>
|
|
<!-- 세션 상태 바 -->
|
|
<div id="code-ai-session-bar" style="display:flex;align-items:center;padding:6px 10px;border-top:1px solid var(--line);background:var(--panel-2);flex-shrink:0;gap:8px">
|
|
<!-- 세션 정보 -->
|
|
<div style="display:flex;align-items:center;gap:6px;min-width:0;flex:1;overflow:hidden">
|
|
<span style="font-size:12px;color:#aaa;flex-shrink:0">세션</span>
|
|
<span id="code-ai-session-bar-project" style="font-size:12px;color:#ddd;font-family:monospace;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-weight:500">(전체)</span>
|
|
<span id="code-ai-session-bar-count" style="font-size:11px;color:#888;flex-shrink:0"></span>
|
|
</div>
|
|
<!-- 컨텍스트 사용량 -->
|
|
<div id="code-ai-ctx-wrap" title="클릭하면 최대값 재확인" onclick="_codeAiCtxMaxFetchedFor='';_fetchModelCtxMax(codeAiModel);" style="display:none;flex-shrink:0;align-items:center;gap:5px;cursor:pointer">
|
|
<span id="code-ai-ctx-label" style="font-size:12px;color:#ccc;white-space:nowrap;font-family:monospace"></span>
|
|
<div style="width:64px;height:6px;background:rgba(255,255,255,.15);border-radius:4px;overflow:hidden;flex-shrink:0">
|
|
<div id="code-ai-ctx-fill" style="height:100%;width:0%;border-radius:4px;transition:width .4s,background .4s"></div>
|
|
</div>
|
|
</div>
|
|
<!-- 새 세션 버튼 -->
|
|
<button onclick="codeAiClear()" title="새 세션 시작" style="flex-shrink:0;background:#1a3025;border:1px solid #3a6a4a;border-radius:6px;color:#8ecfa8;cursor:pointer;padding:4px 10px;font-size:12px;line-height:1.5;white-space:nowrap;font-weight:500">↺ 새 세션</button>
|
|
</div>
|
|
<div class="code-ai-input-row">
|
|
<textarea id="code-ai-input" placeholder="AI에게 질문..." rows="1"
|
|
onkeydown="if(event.key==='Enter'&&!event.shiftKey){event.preventDefault();codeAiSend();}"></textarea>
|
|
<button class="code-tool-btn primary" onclick="codeAiSend()" style="flex-shrink:0;align-self:flex-end">전송</button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<!-- Code editor terminal panel -->
|
|
<div id="code-term-panel" style="display:none;flex-direction:column;flex-shrink:0;height:260px;min-height:80px;border-top:2px solid #1a4a35;background:#0c0c0c;position:relative">
|
|
<div id="code-term-drag" style="position:absolute;top:0;left:0;right:0;height:5px;cursor:ns-resize;z-index:2;transition:background .15s"></div>
|
|
<div style="display:flex;align-items:center;height:28px;background:#0d1f1a;border-bottom:1px solid #1a4a35;flex-shrink:0;overflow-x:auto;padding-left:2px">
|
|
<div id="code-term-tabs" style="display:flex;align-items:stretch;height:100%;flex:1"></div>
|
|
<button onclick="addLocalShell()" id="local-shell-btn" title="로컬 터미널 (companion.py 필요)" style="background:none;border:none;color:#6b7280;cursor:pointer;font-size:12px;padding:0 6px;line-height:1;flex-shrink:0">🖥️</button>
|
|
<button onclick="addCodeTermShell()" title="새 터미널 (+)" style="background:none;border:none;color:#3d6b4f;cursor:pointer;font-size:16px;padding:0 8px;line-height:1;flex-shrink:0">+</button>
|
|
<button onclick="toggleCodeTerminal()" title="닫기" style="background:none;border:none;color:#3d6b4f;cursor:pointer;font-size:14px;padding:0 8px;line-height:1;flex-shrink:0">×</button>
|
|
</div>
|
|
<div id="code-term-container" style="flex:1;min-height:0;position:relative;overflow:hidden"></div>
|
|
<div id="code-terminal-panel" style="position:relative;height:0"></div>
|
|
</div>
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<!-- Code folder browser dropdown (fixed, outside any overflow:hidden container) -->
|
|
<div id="code-folder-dropdown" style="display:none;position:fixed;z-index:9999;
|
|
background:var(--panel);border:1px solid rgba(34,197,94,0.4);border-radius:10px;
|
|
min-width:260px;max-height:320px;overflow-y:auto;
|
|
box-shadow:0 8px 32px rgba(0,0,0,0.35);padding:4px 0">
|
|
<div style="padding:6px 12px;font-size:10px;font-weight:700;color:rgba(34,197,94,0.9);
|
|
border-bottom:1px solid rgba(34,197,94,0.2);display:flex;justify-content:space-between;align-items:center">
|
|
<span id="code-dropdown-dir">📁 폴더 없음</span>
|
|
<span onclick="codeRefreshFolder()" style="cursor:pointer;opacity:0.7;font-size:13px" title="새로고침">↺</span>
|
|
</div>
|
|
<div id="code-folder-list" style="padding:2px 0">
|
|
<div style="padding:8px 12px;color:var(--muted);font-size:11px">로딩 중...</div>
|
|
</div>
|
|
</div>
|
|
|
|
<script src="code.js?v=20260604s"></script>
|
|
</body>
|
|
</html>
|