From 2f5c70ac2931588d7b89ac288c9d7b3c3953d976 Mon Sep 17 00:00:00 2001 From: locphamtran Date: Wed, 19 Aug 2026 14:44:40 +0700 Subject: [PATCH] Fix master volume + VST3FX GUI state restore on save/reload - serializeProjectToSchema now writes master volume_db and mastering gui_open_path/name - deserialize restores masterVolume + masteringSettings.gui_open_path/name - track vst_gui_open_path/name fallback to live state (not just _persistFxGui*) - MasteringModal/FXRackModal reopen effects react to isOpen + restored gui path - openMasterVstGui/openVstGui store gui name for reopen - bridge: /preset capture endpoint + RenderFxJob.captureState for GUI knob state --- app/static/js/app.jsx | 199 +++++++++++++++++++--------- app/static/js/app.precompiled.js | 94 +++++++------ install/daw_vst_bridge.exe | Bin 1701888 -> 1707008 bytes native_bridge/include/RenderFxJob.h | 6 + native_bridge/src/FxGuiServer.cpp | 7 + native_bridge/src/RenderFxJob.cpp | 104 +++++++++++++++ 6 files changed, 308 insertions(+), 102 deletions(-) diff --git a/app/static/js/app.jsx b/app/static/js/app.jsx index 46193b9..4770021 100644 --- a/app/static/js/app.jsx +++ b/app/static/js/app.jsx @@ -11029,8 +11029,10 @@ const serializeTracksList = (tracksList, secondsPerBar) => { synth_engine: t.synth_engine || undefined, midi_channel: t.midiChannel !== undefined ? t.midiChannel : null, fx_chain: (t.fxChain || []).map(m => typeof m === 'string' ? { type: m, active: true } : { type: m.type, active: m.active !== false }), - vst_fx_chain: (t.vstFxChain || []).map(s => ({ type: s.type || 'vst3', path: s.path || '', name: s.name || '', preset_b64: s.preset_b64 || '', bypass: !!s.bypass })), + vst_fx_chain: (t.vstFxChain || []).map(s => ({ type: s.type || 'vst3', path: s.path || '', name: s.name || '', preset_b64: _capturedPresetByPath[s.path] || s.preset_b64 || '', bypass: !!s.bypass })), vst_fx_bypass: !!t.vstFxBypass, + vst_gui_open_path: (t.id === _persistFxGuiTrackId && _persistFxGuiOpen && _persistFxGuiOpen.path) ? _persistFxGuiOpen.path : (t.vstGuiOpenPath || null), + vst_gui_open_name: (t.id === _persistFxGuiTrackId && _persistFxGuiOpen && _persistFxGuiOpen.name) ? _persistFxGuiOpen.name : (t.vstGuiOpenName || null), server_file_id: t.serverFileId || null, items: items }; @@ -11133,11 +11135,13 @@ const deserializeTracksList = (schemaTracks, secondsPerBar, sectionStore, visite fxChain: (t.fx_chain || []).map(m => typeof m === 'string' ? { type: m, active: true } : { type: m.type || m, active: m.active !== false }), vstFxChain: (t.vst_fx_chain || []).map(s => ({ type: s.type || 'vst3', path: s.path || '', name: s.name || '', preset_b64: s.preset_b64 || '', bypass: !!s.bypass })), vstFxBypass: t.vst_fx_bypass !== undefined ? !!t.vst_fx_bypass : false, + vstGuiOpenPath: t.vst_gui_open_path || null, + vstGuiOpenName: t.vst_gui_open_name || null, }; }); }; -const serializeProjectToSchema = (projectId, name, bpmVal, tracksList, subTabsList, sessionTabsList, masteringSettings) => { +const serializeProjectToSchema = (projectId, name, bpmVal, tracksList, subTabsList, sessionTabsList, masteringSettings, masterVolume) => { const secondsPerBar = (60.0 / parseFloat(bpmVal || 120)) * 4; const mainTracks = serializeTracksList(tracksList, secondsPerBar); @@ -11244,10 +11248,10 @@ const serializeProjectToSchema = (projectId, name, bpmVal, tracksList, subTabsLi })(), auto_compute_length: true, tracks: mainTracks, - ...(masteringSettings && Array.isArray(masteringSettings.vstFxChain) && masteringSettings.vstFxChain.length > 0 ? { + ...((masteringSettings && Array.isArray(masteringSettings.vstFxChain) && masteringSettings.vstFxChain.length > 0) || (typeof masterVolume === 'number' && isFinite(masterVolume) && masterVolume !== 0) ? { master: { - fx_chain: masteringSettings.vstFxChain.map(s => ({ type: s.type || 'vst3', path: s.path || '', name: s.name || '', preset_b64: s.preset_b64 || '', bypass: !!s.bypass })), - volume_db: 0, + fx_chain: masteringSettings.vstFxChain.map(s => ({ type: s.type || 'vst3', path: s.path || '', name: s.name || '', preset_b64: _capturedPresetByPath[s.path] || s.preset_b64 || '', bypass: !!s.bypass })), + volume_db: (typeof masterVolume === 'number' && isFinite(masterVolume)) ? masterVolume : 0, mute: false, bypass: !!masteringSettings.vstBypass } @@ -11255,11 +11259,17 @@ const serializeProjectToSchema = (projectId, name, bpmVal, tracksList, subTabsLi }, sub_tabs: subTabs, section_store: sectionStore, - mastering_settings: masteringSettings || null + mastering_settings: masteringSettings ? { + ...masteringSettings, + gui_open_path: (_persistMasterGuiOpen && _persistMasterGuiOpen.path) ? _persistMasterGuiOpen.path : (masteringSettings && masteringSettings.gui_open_path) || null, + gui_open_name: (_persistMasterGuiOpen && _persistMasterGuiOpen.name) ? _persistMasterGuiOpen.name : (masteringSettings && masteringSettings.gui_open_name) || null + } : null }; }; const deserializeProjectFromSchema = (schemaObj) => { + // GUI knob captures are per-project - don't leak presets between projects. + _capturedPresetByPath = {}; const bpmVal = schemaObj.metadata ? schemaObj.metadata.bpm : 120; const secondsPerBar = (60.0 / bpmVal) * 4; @@ -11346,8 +11356,11 @@ const deserializeProjectFromSchema = (schemaObj) => { masteringSettings: { ..._migratedMastering, vstFxChain: _masterFx.map(s => ({ type: s.type || 'vst3', path: s.path || '', name: s.name || '', preset_b64: s.preset_b64 || '', bypass: !!s.bypass })), - vstBypass: !!_masterBus.bypass + vstBypass: !!_masterBus.bypass, + gui_open_path: (schemaObj.mastering_settings && schemaObj.mastering_settings.gui_open_path) ? schemaObj.mastering_settings.gui_open_path : null, + gui_open_name: (schemaObj.mastering_settings && schemaObj.mastering_settings.gui_open_name) ? schemaObj.mastering_settings.gui_open_name : null }, + masterVolume: (typeof _masterBus.volume_db === 'number' && isFinite(_masterBus.volume_db)) ? _masterBus.volume_db : 0, zoom: schemaObj.metadata && schemaObj.metadata.zoom ? parseFloat(schemaObj.metadata.zoom) : 1.0 }; }; @@ -12077,6 +12090,11 @@ const ExportModal = ({ open, onClose, exportSettings, setExportSettings, isExpor // GUI embed state survives FXRackModal unmount so the native window // re-shows automatically when the rack is reopened (close/reopen bug). let _persistFxGuiOpen = null; +// Track id whose rack owns the currently-open embedded GUI (for save). +let _persistFxGuiTrackId = null; +// Latest preset_b64 captured from each plugin's embedded GUI (poll /preset) +// - merged into the project on save so knob tweaks survive reload. +let _capturedPresetByPath = {}; const FXRackModal = ({ track, onUpdateTrack, onClose }) => { const [activeType, setActiveType] = React.useState('eq'); const [addModuleOpen, setAddModuleOpen] = React.useState(false); @@ -12113,21 +12131,41 @@ const FXRackModal = ({ track, onUpdateTrack, onClose }) => { const setVstChain = (next) => { if (onUpdateTrack) onUpdateTrack(track.id, { vstFxChain: next, vstFxBypass: vstBypass }); }; // Embedded VST GUI state (PLAN_MASTERBUS_VST_GUI_EMBED.md Phase 3) const [fxGuiOpen, setFxGuiOpenState] = React.useState(_persistFxGuiOpen); // { path, url } | null - const setFxGuiOpen = (v) => { _persistFxGuiOpen = v; setFxGuiOpenState(v); }; + const setFxGuiOpen = (v) => { _persistFxGuiOpen = v; _persistFxGuiTrackId = v ? (track && track.id) : null; setFxGuiOpenState(v); }; const fxGuiOpenRef = React.useRef(null); fxGuiOpenRef.current = fxGuiOpen; const closeFxGui = () => { const g = fxGuiOpenRef.current; if (g) { try { fetch(g.url + '/hide', { method: 'POST' }).catch(() => {}); } catch (e) {} } setFxGuiOpen(null); + if (onUpdateTrack && track) onUpdateTrack(track.id, { vstGuiOpenPath: null, vstGuiOpenName: null }); }; React.useEffect(() => () => { const g = fxGuiOpenRef.current; if (g) { try { fetch(g.url + '/hide', { method: 'POST' }).catch(() => {}); } catch (e) {} } }, []); + // Capture GUI knob tweaks while the embedded GUI is open (bridge /preset). + React.useEffect(() => { + if (!fxGuiOpen || !fxGuiOpen.url) return; + const iv = setInterval(() => { + fetch(fxGuiOpen.url + '/preset').then(r => r.json()).then(d => { if (d && d.preset_b64) _capturedPresetByPath[fxGuiOpen.path] = d.preset_b64; }).catch(() => {}); + }, 1500); + return () => clearInterval(iv); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [fxGuiOpen]); + // Reopen the saved GUI when the rack is mounted after a project restore. + React.useEffect(() => { + if (!track || !track.vstGuiOpenPath || fxGuiOpen) return; + const s = (track.vstFxChain || []).find(x => x.path === track.vstGuiOpenPath); + if (!s || !window.SonicAPI || !window.SonicAPI.openFxGui) return; + window.SonicAPI.openFxGui({ path: s.path, name: s.name || s.path, embed: true }).then(r => { + if (r && r.embed_url) setFxGuiOpen({ path: s.path, url: r.embed_url }); + }).catch(() => {}); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [track && track.id, track && track.vstGuiOpenPath]); const toggleVst = (idx) => setVstChain(vstChain.map((s, i) => i === idx ? { ...s, bypass: !s.bypass } : s)); - const removeVst = (idx) => { const rem = vstChain[idx]; if (rem && fxGuiOpen && fxGuiOpen.path === rem.path) closeFxGui(); if (idx === activeVstIdx) setActiveVstIdx(-1); setVstChain(vstChain.filter((_, i) => i !== idx)); }; + const removeVst = (idx) => { const rem = vstChain[idx]; if (rem && fxGuiOpen && fxGuiOpen.path === rem.path) closeFxGui(); if (rem) delete _capturedPresetByPath[rem.path]; if (idx === activeVstIdx) setActiveVstIdx(-1); setVstChain(vstChain.filter((_, i) => i !== idx)); }; const moveVst = (idx, dir) => { const j = idx + dir; if (j < 0 || j >= vstChain.length) return; const next = [...vstChain]; const mv = next.splice(idx, 1)[0]; next.splice(j, 0, mv); setVstChain(next); }; - const openVstGui = (s, idx) => { if (!s || !s.path) { window.showToast && window.showToast('Chọn VST FX trước', 'warning'); return; } if (fxGuiOpen) closeFxGui(); if (idx !== undefined) setActiveVstIdx(idx); if (!window.SonicAPI || !window.SonicAPI.openFxGui) { window.showToast && window.showToast('Máy này không hỗ trợ mở GUI VST', 'warning'); return; } window.SonicAPI.openFxGui({ path: s.path, name: s.name || s.path, embed: true }).then(r => { if (r && r.embed_url) setFxGuiOpen({ path: s.path, url: r.embed_url }); else if (r && r.already_running) window.showToast && window.showToast('GUI của plugin này đang mở sẵn (cửa sổ ngoài)', 'info'); else window.showToast && window.showToast('Không mở được GUI embed', 'error'); }).catch(err => window.showToast && window.showToast('Lỗi mở GUI: ' + (err.message || err), 'error')); }; + const openVstGui = (s, idx) => { if (!s || !s.path) { window.showToast && window.showToast('Chọn VST FX trước', 'warning'); return; } if (fxGuiOpen) closeFxGui(); if (idx !== undefined) setActiveVstIdx(idx); if (!window.SonicAPI || !window.SonicAPI.openFxGui) { window.showToast && window.showToast('Máy này không hỗ trợ mở GUI VST', 'warning'); return; } window.SonicAPI.openFxGui({ path: s.path, name: s.name || s.path, embed: true }).then(r => { if (r && r.embed_url) { setFxGuiOpen({ path: s.path, url: r.embed_url, name: s.name || s.path }); if (onUpdateTrack && track) onUpdateTrack(track.id, { vstGuiOpenPath: s.path, vstGuiOpenName: s.name || s.path }); } else if (r && r.already_running) window.showToast && window.showToast('GUI của plugin này đang mở sẵn (cửa sổ ngoài)', 'info'); else window.showToast && window.showToast('Không mở được GUI embed', 'error'); }).catch(err => window.showToast && window.showToast('Lỗi mở GUI: ' + (err.message || err), 'error')); }; const addVst = (path) => { const fx = (fxList || []).find(f => f.path === path); if (!fx) return; const next = [...vstChain, { type: 'vst3', path: fx.path, name: fx.name || fx.id, preset_b64: '', bypass: false }]; setVstChain(next); setActiveVstIdx(next.length - 1); }; - const changeVstPlugin = (idx, path) => { const fx = (fxList || []).find(f => f.path === path); setVstChain(vstChain.map((s, i) => i === idx ? { ...s, path, name: fx ? (fx.name || fx.id) : s.name, preset_b64: '' } : s)); }; + const changeVstPlugin = (idx, path) => { const fx = (fxList || []).find(f => f.path === path); delete _capturedPresetByPath[path]; setVstChain(vstChain.map((s, i) => i === idx ? { ...s, path, name: fx ? (fx.name || fx.id) : s.name, preset_b64: '' } : s)); }; const uploadVstPreset = (idx) => { const inp = document.createElement('input'); inp.type = 'file'; @@ -12665,8 +12703,28 @@ const MasteringModal = ({ isOpen, onClose, masteringSettings, setMasteringSettin if (g) { try { fetch(g.url + '/hide', { method: 'POST' }).catch(() => {}); } catch (e) {} } setMasterGuiOpen(null); setActiveMasterVstPath(null); + setOzState(prev => { const n = { ...(prev || {}) }; delete n.gui_open_path; delete n.gui_open_name; return n; }); }; React.useEffect(() => () => { const g = masterGuiOpenRef.current; if (g) { try { fetch(g.url + '/hide', { method: 'POST' }).catch(() => {}); } catch (e) {} } }, []); + // Capture GUI knob tweaks while the embedded GUI is open (bridge /preset). + React.useEffect(() => { + if (!masterGuiOpen || !masterGuiOpen.url) return; + const iv = setInterval(() => { + fetch(masterGuiOpen.url + '/preset').then(r => r.json()).then(d => { if (d && d.preset_b64) _capturedPresetByPath[masterGuiOpen.path] = d.preset_b64; }).catch(() => {}); + }, 1500); + return () => clearInterval(iv); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [masterGuiOpen]); + // Reopen the saved GUI when the panel is opened after a project restore. + React.useEffect(() => { + if (!isOpen || !ozState || !ozState.gui_open_path || masterGuiOpen) return; + const s = (ozState.vstFxChain || []).find(x => x.path === ozState.gui_open_path); + if (!s || !window.SonicAPI || !window.SonicAPI.openFxGui) return; + window.SonicAPI.openFxGui({ path: s.path, name: ozState.gui_open_name || s.name || s.path, embed: true }).then(r => { + if (r && r.embed_url) setMasterGuiOpen({ path: s.path, url: r.embed_url }); + }).catch(() => {}); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [isOpen, ozState && ozState.gui_open_path]); const setMasterVstChain = (next) => setOzState(prev => ({ ...prev, vstFxChain: next })); // T2.4: push the master VST FX chain to the realtime bridge (live master // mix). v1: master chain only — per-track vstChain stays offline (defer). @@ -12676,12 +12734,12 @@ const MasteringModal = ({ isOpen, onClose, masteringSettings, setMasteringSettin window.NativeBridgeService.setFxChain(JSON.stringify(chain)); }, [ozState.vstFxChain]); const toggleMasterVst = (idx) => setMasterVstChain(masterVstChain.map((s, i) => i === idx ? { ...s, bypass: !s.bypass } : s)); - const removeMasterVst = (idx) => setMasterVstChain(masterVstChain.filter((_, i) => i !== idx)); + const removeMasterVst = (idx) => { const rem = masterVstChain[idx]; if (rem) delete _capturedPresetByPath[rem.path]; setMasterVstChain(masterVstChain.filter((_, i) => i !== idx)); }; const moveMasterVst = (idx, dir) => { const j = idx + dir; if (j < 0 || j >= masterVstChain.length) return; const next = [...masterVstChain]; const mv = next.splice(idx, 1)[0]; next.splice(j, 0, mv); setMasterVstChain(next); }; - const openMasterVstGui = (s) => { if (!s || !s.path) { window.showToast && window.showToast('Chọn VST FX trước', 'warning'); return; } if (masterGuiOpen) closeMasterGui(); if (s.path) setActiveMasterVstPath(s.path); if (!window.SonicAPI || !window.SonicAPI.openFxGui) { window.showToast && window.showToast('Máy này không hỗ trợ mở GUI VST', 'warning'); return; } window.SonicAPI.openFxGui({ path: s.path, name: s.name || s.path, embed: true }).then(r => { if (r && r.embed_url) setMasterGuiOpen({ path: s.path, url: r.embed_url }); else if (r && r.already_running) window.showToast && window.showToast('GUI của plugin này đang mở sẵn (cửa sổ ngoài)', 'info'); else window.showToast && window.showToast('Không mở được GUI embed', 'error'); }).catch(err => window.showToast && window.showToast('Lỗi mở GUI: ' + (err.message || err), 'error')); }; + const openMasterVstGui = (s) => { if (!s || !s.path) { window.showToast && window.showToast('Chọn VST FX trước', 'warning'); return; } if (masterGuiOpen) closeMasterGui(); if (s.path) setActiveMasterVstPath(s.path); if (!window.SonicAPI || !window.SonicAPI.openFxGui) { window.showToast && window.showToast('Máy này không hỗ trợ mở GUI VST', 'warning'); return; } window.SonicAPI.openFxGui({ path: s.path, name: s.name || s.path, embed: true }).then(r => { if (r && r.embed_url) { setMasterGuiOpen({ path: s.path, url: r.embed_url, name: s.name || s.path }); setOzState(prev => ({ ...(prev || {}), gui_open_path: s.path, gui_open_name: s.name || s.path })); } else if (r && r.already_running) window.showToast && window.showToast('GUI của plugin này đang mở sẵn (cửa sổ ngoài)', 'info'); else window.showToast && window.showToast('Không mở được GUI embed', 'error'); }).catch(err => window.showToast && window.showToast('Lỗi mở GUI: ' + (err.message || err), 'error')); }; const addMasterVst = (path) => { const fx = (masterFxList || []).find(f => f.path === path); if (!fx) return; setMasterVstChain([...masterVstChain, { type: 'vst3', path: fx.path, name: fx.name || fx.id, preset_b64: '', bypass: false }]); openMasterVstGui({ path: fx.path, name: fx.name || fx.id }); }; - const changeMasterVstPlugin = (idx, path) => { const fx = (masterFxList || []).find(f => f.path === path); setMasterVstChain(masterVstChain.map((s, i) => i === idx ? { ...s, path, name: fx ? (fx.name || fx.id) : s.name, preset_b64: '' } : s)); }; + const changeMasterVstPlugin = (idx, path) => { const fx = (masterFxList || []).find(f => f.path === path); delete _capturedPresetByPath[path]; setMasterVstChain(masterVstChain.map((s, i) => i === idx ? { ...s, path, name: fx ? (fx.name || fx.id) : s.name, preset_b64: '' } : s)); }; const uploadMasterVstPreset = (idx) => { const inp = document.createElement('input'); inp.type = 'file'; @@ -17946,7 +18004,7 @@ const App = () => { // Render offline toàn project qua native_bridge (VST FX masterbus + track) → WAV. // Dùng cho nút "Nghe thử" trong FX Rack / Mastering — preview = âm export. window.__renderProjectPreview = async () => { - const schema = serializeProjectToSchema(currentProjectId || 'temp_project', projectName || 'Dự án tạm chưa lưu', bpm, tracks, subTabs, sessionTabs, masteringSettings); + const schema = serializeProjectToSchema(currentProjectId || 'temp_project', projectName || 'Dự án tạm chưa lưu', bpm, tracks, subTabs, sessionTabs, masteringSettings, masterVolume); try { const res = await window.SonicAPI.renderProject(schema, 'preview_' + Date.now() + '.wav'); return res; @@ -18169,7 +18227,7 @@ const App = () => { const restoreLastSessionProject = async () => { var pendingWasNull = !window.__pendingSfsProject; loadPendingSfsProject(); - if (!pendingWasNull) return; + if (!pendingWasNull) return true; // da xu li .sfs pending - khong de bang temp var lastId = localStorage.getItem('sonic_project_id'); var lastName = localStorage.getItem('sonic_project_name') || 'Dự án'; @@ -18203,7 +18261,7 @@ const App = () => { } catch (e) { console.warn('restore load error:', e); } } try { - if (!parsed) return; + if (!parsed) return false; var restoredBpm = bpm; var restoredTracks = []; var restoredSessionTabs = []; @@ -18218,6 +18276,7 @@ const App = () => { // Explorer) — áp dụng mới giữ zoom hiện tại/localStorage — hết thu nhỏ. if (result.zoom > 1 && setZoom) setZoom(result.zoom); if (result.masteringSettings) setMasteringSettings(result.masteringSettings); + if (result.masterVolume !== undefined && result.masterVolume !== null) setMasterVolume(result.masterVolume); } else { restoredTracks = (parsed.tracks || []).map(function(t) { var rest = Object.assign({}, t); delete rest.height; @@ -18255,15 +18314,49 @@ const App = () => { if (rt.sections) restoredItemCount += rt.sections.length; }); showToast('Đã khôi phục dự án "' + lastName + '" (' + restoredItemCount + ' items).', 'info'); + return true; } catch(e) { console.warn('restoreLastSessionProject failed:', e); // Stale session id (project deleted / DB reset): clear it so the error // does not repeat on every page load. localStorage.removeItem('sonic_project_id'); localStorage.removeItem('sonic_project_name'); + return false; } }; + // Khoi phuc du an dang lam do tu temp autosave, CHI khi chua co project nao + // duoc restore (restoreLastSessionProject tra false). Goi o ca luong login + // modal (handleAuthSuccess) lan luong auto-login (checkAuthStatus). + const restoreTempProjectIfFresh = async () => { + try { + const tmp = await window.SonicAPI.getTempProject(); + if (tmp && tmp.has_temp && tmp.data_json) { + let proj = tmp.data_json; + if (typeof proj === 'string') { try { proj = JSON.parse(proj); } catch (e) { proj = null; } } + if (proj && proj.main_session) { + const freshStart = !(tracks && tracks.some(t => (t.clips && t.clips.length > 0) || (t.midiItems && t.midiItems.length > 0) || t.buffer)); + if (freshStart) { + const result = deserializeProjectFromSchema(proj); + if (result && result.tracks && result.tracks.length > 0) { + setTracks(result.tracks); + loadAudioBuffersForTracks(result.tracks); + setBpm((result.bpm || 120).toString()); + if (result.sessionTabs && result.sessionTabs.length > 0) setSessionTabs(result.sessionTabs); + if (result.subTabs && result.subTabs.length > 0) setSubTabs(result.subTabs); + if (result.masteringSettings) setMasteringSettings(result.masteringSettings); + if (result.masterVolume !== undefined && result.masterVolume !== null) setMasterVolume(result.masterVolume); + const tmpName = (proj.metadata && proj.metadata.title) || 'Dự án tạm'; + setProjectName(tmpName); + localStorage.setItem('sonic_project_name', tmpName); + showToast('Đã khôi phục dự án đang làm dở từ bản lưu tạm', 'success'); + } + } + } + } + } catch (e) { console.warn('[TempRestore] error:', e); } + }; + useEffect(() => { const checkAuthStatus = async () => { const savedToken = localStorage.getItem('sonic_token'); @@ -18284,7 +18377,10 @@ const App = () => { } else { setIsMandatoryLogin(false); setAuthModalOpen(false); - restoreLastSessionProject(); + (async () => { + const restored = await restoreLastSessionProject(); + if (!restored) await restoreTempProjectIfFresh(); + })(); } } catch (err) { const cached = localStorage.getItem('sonic_user'); @@ -18292,7 +18388,10 @@ const App = () => { try { setCurrentUser(JSON.parse(cached)); } catch (_) { } setIsMandatoryLogin(false); setAuthModalOpen(false); - restoreLastSessionProject(); + (async () => { + const restored = await restoreLastSessionProject(); + if (!restored) await restoreTempProjectIfFresh(); + })(); } else { localStorage.removeItem('sonic_token'); localStorage.removeItem('sonic_user'); @@ -18352,6 +18451,7 @@ const App = () => { carlaBridgeActive: false, carlaBridge: { plugin: '', plugin_path: '', connected: false }, }); } + if (result.masterVolume !== undefined && result.masterVolume !== null) setMasterVolume(result.masterVolume); } else { restoredTracks = (proj.tracks || []).map(t => { const { height: _h, ...rest } = t; @@ -18391,7 +18491,10 @@ const App = () => { } else { setIsMandatoryLogin(false); setAuthModalOpen(false); - restoreLastSessionProject(); + (async () => { + const restored = await restoreLastSessionProject(); + if (!restored) await restoreTempProjectIfFresh(); + })(); const loadPrefs = (p) => { if (!p) return; if (p.showAIPanel !== undefined) setShowAIPanel(p.showAIPanel); @@ -18441,35 +18544,6 @@ const App = () => { setInstrumentSelectorData(data); }).catch(() => {}); } catch (e) { } - // ── Khôi phục dự án đang làm dở (temp autosave) khi load lại app ── - // Yêu cầu: "Khi tắt ứng dụng → tự động lưu temp; khi load lại → tải lại - // dự án đang làm dở." Chỉ restore khi app khởi động với project TRỐNG - // (chưa có clip/midi/audio nào) — không đè lên dự án user đang mở. - try { - const tmp = await window.SonicAPI.getTempProject(); - if (tmp && tmp.has_temp && tmp.data_json) { - let proj = tmp.data_json; - if (typeof proj === 'string') { try { proj = JSON.parse(proj); } catch (e) { proj = null; } } - if (proj && proj.main_session) { - const freshStart = !(tracks && tracks.some(t => (t.clips && t.clips.length > 0) || (t.midiItems && t.midiItems.length > 0) || t.buffer)); - if (freshStart) { - const result = deserializeProjectFromSchema(proj); - if (result && result.tracks && result.tracks.length > 0) { - setTracks(result.tracks); - loadAudioBuffersForTracks(result.tracks); - setBpm((result.bpm || 120).toString()); - if (result.sessionTabs && result.sessionTabs.length > 0) setSessionTabs(result.sessionTabs); - if (result.subTabs && result.subTabs.length > 0) setSubTabs(result.subTabs); - if (result.masteringSettings) setMasteringSettings(result.masteringSettings); - const tmpName = (proj.metadata && proj.metadata.title) || 'Dự án tạm'; - setProjectName(tmpName); - localStorage.setItem('sonic_project_name', tmpName); - showToast('Đã khôi phục dự án đang làm dở từ bản lưu tạm', 'success'); - } - } - } - } - } catch (e) { console.warn('[TempRestore] error:', e); } })(); } }; @@ -18503,9 +18577,9 @@ const App = () => { } : null })); window.SonicStorage.scheduleTempAutoSave(() => { - return serializeProjectToSchema(currentProjectId || 'temp_project', projectName || 'Dự án tạm chưa lưu', bpm, tracks, subTabs, sessionTabs, masteringSettings); + return serializeProjectToSchema(currentProjectId || 'temp_project', projectName || 'Dự án tạm chưa lưu', bpm, tracks, subTabs, sessionTabs, masteringSettings, masterVolume); }); - }, [tracks, subTabs, sessionTabs, masteringSettings]); + }, [tracks, subTabs, sessionTabs, masteringSettings, masterVolume]); // ── Temp autosave SERVER khi tắt ứng dụng (Bug: đóng app mất dự án làm dở) ── // Lưu temp vào thư mục temp của ứng dụng (storage/temp + DB) khi: @@ -18515,7 +18589,7 @@ const App = () => { useEffect(() => { const buildTempPayload = () => { try { - const schemaObj = serializeProjectToSchema(currentProjectId || 'temp_project', projectName || 'Dự án tạm chưa lưu', bpm, tracks, subTabs, sessionTabs, masteringSettings); + const schemaObj = serializeProjectToSchema(currentProjectId || 'temp_project', projectName || 'Dự án tạm chưa lưu', bpm, tracks, subTabs, sessionTabs, masteringSettings, masterVolume); const cid = (window.SonicStorage && window.SonicStorage.getClientId) ? window.SonicStorage.getClientId() : ''; return JSON.stringify({ data_json: JSON.stringify(schemaObj), client_id: cid }); } catch (e) { return null; } @@ -18551,7 +18625,7 @@ const App = () => { window.removeEventListener('pagehide', onUnload); clearInterval(interval); }; - }, [currentProjectId, projectName, bpm, tracks, subTabs, sessionTabs, masteringSettings]); + }, [currentProjectId, projectName, bpm, tracks, subTabs, sessionTabs, masteringSettings, masterVolume]); // ── Realtime sync giữa các client (LAN browser ↔ Tauri standalone) ── // Bug 3: 2 session cùng tài khoản không sync. Poll revision nhẹ 3s; khi @@ -18592,6 +18666,7 @@ const App = () => { // (modal đang chỉnh) — bản đồng bộ từ thiết bị khác // không được revert chain đang sửa (ví dụ vừa xóa VST). if (result.masteringSettings && !masteringModalOpenRef.current) setMasteringSettings(result.masteringSettings); + if (result.masterVolume !== undefined && result.masterVolume !== null) setMasterVolume(result.masterVolume); const tmpName = (proj.metadata && proj.metadata.title) || 'Dự án tạm'; setProjectName(tmpName); localStorage.setItem('sonic_project_name', tmpName); @@ -18622,14 +18697,14 @@ const App = () => { if (currentProjectId.startsWith('local_')) { const finalName = projectName || 'Dự án mới'; const localId = currentProjectId; - const schemaObj = serializeProjectToSchema(localId, finalName, bpm, tracks, subTabs, sessionTabs, masteringSettings); + const schemaObj = serializeProjectToSchema(localId, finalName, bpm, tracks, subTabs, sessionTabs, masteringSettings, masterVolume); const dataStr = JSON.stringify(schemaObj); localStorage.setItem('sonic_local_project_data', dataStr); localStorage.setItem('sonic_project_id', localId); localStorage.setItem('sonic_project_name', finalName); } else if (currentUser && window.SonicAPI) { try { - const schemaObj = serializeProjectToSchema(currentProjectId, projectName, bpm, tracks, subTabs, sessionTabs, masteringSettings); + const schemaObj = serializeProjectToSchema(currentProjectId, projectName, bpm, tracks, subTabs, sessionTabs, masteringSettings, masterVolume); const dataJson = JSON.stringify(schemaObj); window.SonicAPI.updateCloudProject(currentProjectId, projectName || 'Dự án mới', dataJson).catch(() => {}); } catch (e) { @@ -25543,7 +25618,7 @@ const App = () => { try { if (window.SonicStorage) { const nextTracks = (tracks || []).map(t => t.id === trackId ? { ...t, color } : t); - window.SonicStorage.scheduleTempAutoSave(() => serializeProjectToSchema(currentProjectId || 'temp_project', projectName || 'Dự án tạm chưa lưu', bpm, nextTracks, subTabs, sessionTabs, masteringSettings)); + window.SonicStorage.scheduleTempAutoSave(() => serializeProjectToSchema(currentProjectId || 'temp_project', projectName || 'Dự án tạm chưa lưu', bpm, nextTracks, subTabs, sessionTabs, masteringSettings, masterVolume)); if (window.SonicStorage.flushTempAutoSave) window.SonicStorage.flushTempAutoSave(); } } catch (e) {} @@ -26396,7 +26471,7 @@ const App = () => { const handleSaveLocalProject = (name) => { const finalName = name || projectName || 'Dự án mới'; const localId = currentProjectId && currentProjectId.startsWith('local_') ? currentProjectId : 'local_' + Date.now(); - const projectSchemaObj = serializeProjectToSchema(localId, finalName, bpm, tracks, subTabs, sessionTabs, masteringSettings); + const projectSchemaObj = serializeProjectToSchema(localId, finalName, bpm, tracks, subTabs, sessionTabs, masteringSettings, masterVolume); const dataStr = JSON.stringify(projectSchemaObj); localStorage.setItem('sonic_local_project_data', dataStr); localStorage.setItem('sonic_project_id', localId); @@ -26419,7 +26494,7 @@ const App = () => { const handleSaveCloudProject = async (name, existingProjectId) => { const finalName = name || projectName || 'Dự án mới'; var useProjectId = existingProjectId || currentProjectId; - const projectSchemaObj = serializeProjectToSchema(useProjectId || 'project_' + Date.now(), finalName, bpm, tracks, subTabs, sessionTabs, masteringSettings); + const projectSchemaObj = serializeProjectToSchema(useProjectId || 'project_' + Date.now(), finalName, bpm, tracks, subTabs, sessionTabs, masteringSettings, masterVolume); // Diagnostic: count source vs serialized items var srcMidi = 0, srcClip = 0, srcSec = 0; tracks.forEach(function(t) { srcMidi += (t.midiItems||[]).length; srcClip += (t.clips||[]).length; srcSec += (t.sections||[]).length; }); @@ -26482,7 +26557,7 @@ const App = () => { const handleGlobalSave = async () => { try { const finalName = projectName || 'Dự án mới'; - const schemaObj = serializeProjectToSchema(currentProjectId || 'proj_' + Date.now(), finalName, bpm, tracks, subTabs, sessionTabs, masteringSettings); + const schemaObj = serializeProjectToSchema(currentProjectId || 'proj_' + Date.now(), finalName, bpm, tracks, subTabs, sessionTabs, masteringSettings, masterVolume); const dataJson = JSON.stringify(schemaObj); const runtime = (window.SonicRuntime && window.SonicRuntime.capabilities && window.SonicRuntime.capabilities.runtime) || ''; if (runtime === 'desktop' && window.SonicAPI && window.SonicAPI.saveProjectToDisk) { @@ -26520,7 +26595,7 @@ const App = () => { }, []); const handleSaveAsCloud = async (newName) => { - const projectSchemaObj = serializeProjectToSchema('project_' + Date.now(), newName, bpm, tracks, subTabs, sessionTabs, masteringSettings); + const projectSchemaObj = serializeProjectToSchema('project_' + Date.now(), newName, bpm, tracks, subTabs, sessionTabs, masteringSettings, masterVolume); const dataJson = JSON.stringify(projectSchemaObj); try { const res = await window.SonicAPI.saveCloudProject(newName, dataJson); @@ -26540,7 +26615,7 @@ const App = () => { const handleSaveCloud = handleSaveProject; const handleExportSFS = (customName = null) => { const finalName = customName || projectName || 'Dự án SonicForge'; - const projectSchemaObj = serializeProjectToSchema(currentProjectId || 'proj_' + Date.now(), finalName, bpm, tracks, subTabs, sessionTabs, masteringSettings); + const projectSchemaObj = serializeProjectToSchema(currentProjectId || 'proj_' + Date.now(), finalName, bpm, tracks, subTabs, sessionTabs, masteringSettings, masterVolume); window.SonicStorage.exportProjectToSFS(projectSchemaObj); showToast("Đã xuất dự án (.sfs) thành công!", "success"); }; @@ -26563,6 +26638,7 @@ const App = () => { restoredSessionTabs = result.sessionTabs; restoredSubTabs = result.subTabs; if (result.masteringSettings) setMasteringSettings(result.masteringSettings); + if (result.masterVolume !== undefined && result.masterVolume !== null) setMasterVolume(result.masterVolume); } else { restored = (proj.tracks || []).map(t => ({ ...t, @@ -29052,6 +29128,7 @@ STRICT CONSTRAINTS: // Explorer) — áp dụng mới giữ zoom hiện tại/localStorage. if (result.zoom > 1 && setZoom) setZoom(result.zoom); if (result.masteringSettings) setMasteringSettings(result.masteringSettings); + if (result.masterVolume !== undefined && result.masterVolume !== null) setMasterVolume(result.masterVolume); } else { restoredTracks = (parsed.tracks || []).map(function (t) { const rest = Object.assign({}, t); delete rest.height; diff --git a/app/static/js/app.precompiled.js b/app/static/js/app.precompiled.js index a5c1ee7..a4ced23 100644 --- a/app/static/js/app.precompiled.js +++ b/app/static/js/app.precompiled.js @@ -568,7 +568,7 @@ const[loadingBackups,setLoadingBackups]=useState({});// project_id -> bool const[backupMaxCount,setBackupMaxCount]=useState(()=>parseInt(localStorage.getItem('sonic_backup_max_count')||'10'));const[showBackupConfig,setShowBackupConfig]=useState(false);const handleDragStart=e=>{const r=dragRef.current;r.active=true;r.startX=e.clientX;r.startY=e.clientY;r.ofsX=dragOfs.x;r.ofsY=dragOfs.y;const onMove=ev=>{if(!r.active)return;setDragOfs({x:r.ofsX+ev.clientX-r.startX,y:r.ofsY+ev.clientY-r.startY});};const onUp=()=>{r.active=false;document.removeEventListener('mousemove',onMove);document.removeEventListener('mouseup',onUp);};document.addEventListener('mousemove',onMove);document.addEventListener('mouseup',onUp);};useEffect(()=>{if(isOpen){fetchProfile();if(activeTab==='projects')fetchProjects();if(activeTab==='files')fetchFiles();}},[isOpen,activeTab]);const fetchProfile=async()=>{try{const data=await window.SonicAPI.getProfile();setProfile(data);}catch(e){setError(e.message||'Không thể tải thông tin profile');}};const fetchProjects=async()=>{setLoadingProjects(true);try{const data=await window.SonicAPI.listCloudProjects();setProjectsList(data||[]);}catch(e){showToast(e.message||'Không thể tải danh sách dự án','error');}finally{setLoadingProjects(false);}};const fetchFiles=async()=>{setLoadingFiles(true);try{const activeFileIds=tracks.map(t=>t.serverFileId).filter(Boolean);const data=await window.SonicAPI.listMyFiles(activeFileIds);setFilesList(data||[]);}catch(e){showToast(e.message||'Không thể tải danh sách tệp tin','error');}finally{setLoadingFiles(false);}};const fetchBackups=async projectId=>{setLoadingBackups(prev=>({...prev,[projectId]:true}));try{const data=await window.SonicAPI.listBackups(projectId);setBackupsMap(prev=>({...prev,[projectId]:data||[]}));}catch(e){showToast(e.message||'Không thể tải danh sách backup','error');}finally{setLoadingBackups(prev=>({...prev,[projectId]:false}));}};const handleDeleteBackup=async backupId=>{try{await window.SonicAPI.deleteBackup(backupId);setBackupsMap(prev=>{const next={...prev};Object.keys(next).forEach(pid=>{next[pid]=next[pid].filter(b=>b.id!==backupId);});return next;});fetchProjects();showToast('Đã xóa bản backup','info');}catch(e){showToast(e.message||'Lỗi xóa backup','error');}};const handleCleanupBackups=async()=>{try{const res=await window.SonicAPI.cleanupBackups(backupMaxCount);setBackupsMap({});fetchProjects();showToast(`Đã dọn dẹp ${res.deleted} bản backup cũ (giữ lại ${res.keep})`,'info');}catch(e){showToast(e.message||'Lỗi dọn dẹp backup','error');}};const handleOpenProject=async(projectId,projectName)=>{setAppWarningModal({title:"Mở dự án",message:"Bạn có muốn mở dự án này? Các thay đổi chưa lưu trên workspace hiện tại sẽ bị mất.",isAlert:false,onConfirm:async()=>{try{const proj=await window.SonicAPI.getCloudProject(projectId);const parsed=JSON.parse(proj.data_json);let restoredTracks=[];let restoredBpm=bpm;let restoredSessionTabs=[];let restoredSubTabs=[];if(parsed.main_session){const result=deserializeProjectFromSchema(parsed);restoredTracks=result.tracks;restoredBpm=result.bpm;restoredSessionTabs=result.sessionTabs;restoredSubTabs=result.subTabs;if(result.masteringSettings){setMasteringSettings(result.masteringSettings);}else{setMasteringSettings({masterConnected:false,activeModule:'eq',eqActive:true,imagerActive:true,maximizerActive:true,eqLowGain:1.5,eqMid1Gain:-1.0,eqMid2Gain:2.0,eqHighGain:1.8,w1:0,w2:115,w3:135,w4:150,imagerScale:'v2',maxGain:5.4,maxUpward:2.0,maxSoftClip:15,maxTransient:25,ceiling:-0.1,isBypassed:false,chain:DEFAULT_MASTER_CHAIN.map(m=>({...m})),compActive:false,compThreshold:-16,compRatio:3,compMakeup:0,limActive:false,limThreshold:-1.0,excActive:false,excDrive:40,rebalActive:false,rebalMid:0,rebalSide:0});}}else{restoredTracks=(parsed.tracks||[]).map(t=>{const{height:_h,...rest}=t;return{...rest,buffer:null,channelInfo:t.channelInfo||null,clips:t.clips||[],serverFileId:t.serverFileId||null};});}setTracks(restoredTracks);loadAudioBuffersForTracks(restoredTracks).catch(function(err){console.warn('loadAudioBuffersForTracks error:',err);});trackMidiChannelsRef.current={};preloadTrackInstruments(restoredTracks).catch(function(err){console.warn('preloadTrackInstruments error:',err);});setBpm(restoredBpm.toString());setSelectedTrackId(restoredTracks[0]?.id||'1');setProjectName(proj.name);setCurrentProjectId(proj.id);if(restoredSessionTabs.length>0){setSessionTabs(restoredSessionTabs);}if(restoredSubTabs.length>0){setSubTabs(restoredSubTabs);}localStorage.setItem('sonic_project_name',proj.name);localStorage.setItem('sonic_project_id',proj.id);showToast(`Đã nạp dự án "${proj.name}" thành công!`,"success");}catch(e){showToast(e.message||"Lỗi khi nạp dự án","error");}}});};const handleDeleteProject=async(projectId,e)=>{e.stopPropagation();setConfirmModal({title:"Xóa dự án Cloud",message:"Bạn có chắc chắn muốn xóa dự án này khỏi Cloud? Hành động này không thể hoàn tác.",onConfirm:async()=>{try{await window.SonicAPI.deleteCloudProject(projectId);showToast("Đã xóa dự án thành công!","success");fetchProjects();fetchProfile();}catch(err){showToast(err.message||"Lỗi khi xóa dự án","error");}}});};const handleDeleteFile=async fileId=>{if(!confirm(`Bạn có chắc chắn muốn xóa tệp tin ${fileId}?`))return;try{await window.SonicAPI.deleteMyFile(fileId);showToast("Đã xóa tệp tin thành công!","success");fetchFiles();fetchProfile();}catch(err){showToast(err.message||"Lỗi khi xóa tệp tin","error");}};const handleCleanUnusedFiles=async()=>{const unusedFiles=filesList.filter(f=>!f.is_in_use);if(unusedFiles.length===0){showToast("Không có tập tin rác nào để dọn dẹp.","info");return;}if(!confirm(`Bạn có chắc chắn muốn xóa tất cả ${unusedFiles.length} tập tin rác để giải phóng dung lượng?`))return;let successCount=0;for(const file of unusedFiles){try{await window.SonicAPI.deleteMyFile(file.file_id);successCount++;}catch(e){console.error("Lỗi xóa file rác: ",file.file_id,e);}}showToast(`Đã dọn dẹp thành công ${successCount}/${unusedFiles.length} tập tin rác!`,"success");fetchFiles();fetchProfile();};const handleChangePassword=async e=>{e.preventDefault();setMsg('');setError('');setLoading(true);try{const res=await window.SonicAPI.changePassword(oldPassword,newPassword);setMsg(res.message||'Đổi mật khẩu thành công!');setOldPassword('');setNewPassword('');}catch(err){setError(err.message||'Lỗi khi đổi mật khẩu');}finally{setLoading(false);}};const modalStyle={left:`calc(50% + ${dragOfs.x}px)`,top:`calc(50% + ${dragOfs.y}px)`,transform:'translate(-50%, -50%)'};return/*#__PURE__*/React.createElement(React.Fragment,null,/*#__PURE__*/React.createElement("div",{key:"backdrop",className:"fixed inset-0 z-40 bg-black/70 backdrop-blur-sm",onClick:onClose}),confirmModal&&/*#__PURE__*/React.createElement("div",{key:"confirm-overlay",className:"fixed inset-0 z-[60] flex items-center justify-center bg-black/50"},/*#__PURE__*/React.createElement("div",{className:"bg-[#262626] border border-[#383838] rounded-lg shadow-2xl p-5 max-w-sm w-full text-slate-200"},/*#__PURE__*/React.createElement("h4",{className:"text-sm font-bold text-rose-400 mb-2"},confirmModal.title),/*#__PURE__*/React.createElement("p",{className:"text-xs text-slate-300 mb-4"},confirmModal.message),/*#__PURE__*/React.createElement("div",{className:"flex justify-end gap-2"},/*#__PURE__*/React.createElement("button",{onClick:()=>setConfirmModal(null),className:"px-3 py-1.5 bg-zinc-700 hover:bg-zinc-600 text-slate-300 rounded text-xs font-semibold"},confirmModal.cancelText||"Hủy"),/*#__PURE__*/React.createElement("button",{onClick:()=>{const fn=confirmModal.onConfirm;setConfirmModal(null);fn();},className:"px-3 py-1.5 bg-rose-700 hover:bg-rose-600 text-white rounded text-xs font-semibold"},confirmModal.confirmText||"Xác nhận xóa")))),/*#__PURE__*/React.createElement("div",{key:"dialog",className:"fixed z-50 bg-[#262626] border border-[#383838] rounded-xl shadow-2xl w-full max-w-2xl p-6 text-slate-200 flex flex-col max-h-[85vh]",style:modalStyle},/*#__PURE__*/React.createElement("div",{className:"flex justify-between items-center pb-3 border-b border-[#383838] shrink-0 cursor-grab active:cursor-grabbing select-none",onMouseDown:handleDragStart},/*#__PURE__*/React.createElement("h3",{className:"text-md font-bold text-teal-400 flex items-center gap-1.5"},"👤 Hồ Sơ Cá Nhân & Quản Lý Dự Án"),/*#__PURE__*/React.createElement("button",{onClick:onClose,className:"text-slate-400 hover:text-slate-200"},"✕")),/*#__PURE__*/React.createElement("div",{className:"flex gap-2 border-b border-[#383838] py-2 shrink-0 text-xs font-semibold"},[/*#__PURE__*/React.createElement("button",{key:"tab-acc",onClick:()=>setActiveTab('account'),className:`px-3 py-1.5 rounded transition ${activeTab==='account'?'bg-teal-950/60 text-teal-300 border border-teal-800':'text-slate-400 hover:text-slate-200'}`},"Tài Khoản"),/*#__PURE__*/React.createElement("button",{key:"tab-proj",onClick:()=>setActiveTab('projects'),className:`px-3 py-1.5 rounded transition ${activeTab==='projects'?'bg-teal-950/60 text-teal-300 border border-teal-800':'text-slate-400 hover:text-slate-200'}`},"Dự Án Cloud"),/*#__PURE__*/React.createElement("button",{key:"tab-files",onClick:()=>setActiveTab('files'),className:`px-3 py-1.5 rounded transition ${activeTab==='files'?'bg-teal-950/60 text-teal-300 border border-teal-800':'text-slate-400 hover:text-slate-200'}`},"Tập Tin Của Tôi")]),/*#__PURE__*/React.createElement("div",{className:"flex-1 overflow-y-auto pt-4 space-y-4 pr-1 min-h-[300px]"},activeTab==='account'&&profile?[/*#__PURE__*/React.createElement("div",{key:"quota-info",className:"bg-[#1e1e1e] p-4 rounded-lg border border-[#333] grid grid-cols-2 gap-4 text-xs"},[/*#__PURE__*/React.createElement("div",{key:"username"},[/*#__PURE__*/React.createElement("span",{className:"text-slate-500 block"},"Tên người dùng"),/*#__PURE__*/React.createElement("span",{className:"font-bold text-teal-300 text-sm"},profile.username)]),/*#__PURE__*/React.createElement("div",{key:"role"},[/*#__PURE__*/React.createElement("span",{className:"text-slate-500 block"},"Vai trò"),/*#__PURE__*/React.createElement("span",{className:"uppercase font-semibold text-amber-400"},profile.role)]),/*#__PURE__*/React.createElement("div",{key:"email"},[/*#__PURE__*/React.createElement("span",{className:"text-slate-500 block"},"Email"),/*#__PURE__*/React.createElement("span",null,profile.email)]),/*#__PURE__*/React.createElement("div",{key:"quota"},[/*#__PURE__*/React.createElement("span",{className:"text-slate-500 block"},"Dung lượng Quota"),/*#__PURE__*/React.createElement("span",{className:"font-semibold text-slate-200"},`${profile.quota.used_mb} MB / ${profile.quota.storage_limit_mb} MB`)])]),/*#__PURE__*/React.createElement("div",{key:"progress"},[/*#__PURE__*/React.createElement("div",{className:"flex justify-between text-xs mb-1"},[/*#__PURE__*/React.createElement("span",{className:"text-slate-400"},"Tiến trình sử dụng bộ nhớ Server"),/*#__PURE__*/React.createElement("span",{className:"font-bold text-teal-400"},`${(profile.quota.used_mb/profile.quota.storage_limit_mb*100).toFixed(1)}%`)]),/*#__PURE__*/React.createElement("div",{className:"w-full h-2 bg-slate-800 rounded-full overflow-hidden"},[/*#__PURE__*/React.createElement("div",{className:"h-full bg-teal-500 rounded-full transition-all duration-300",style:{width:`${Math.min(100,profile.quota.used_mb/profile.quota.storage_limit_mb*100)}%`}})])]),/*#__PURE__*/React.createElement("form",{key:"pwd-form",onSubmit:handleChangePassword,className:"pt-4 border-t border-[#383838] space-y-3"},[/*#__PURE__*/React.createElement("h4",{className:"text-xs font-bold text-slate-300 uppercase"},"Thay Đổi Mật Khẩu"),msg&&/*#__PURE__*/React.createElement("div",{className:"p-2 bg-emerald-950/60 border border-emerald-700 text-emerald-300 rounded text-xs"},msg),error&&/*#__PURE__*/React.createElement("div",{className:"p-2 bg-red-950/60 border border-red-700 text-red-300 rounded text-xs"},error),/*#__PURE__*/React.createElement("div",{key:"old"},[/*#__PURE__*/React.createElement("label",{className:"block text-xs text-slate-400 mb-1"},"Mật khẩu cũ"),/*#__PURE__*/React.createElement("input",{type:"password",autoComplete:"current-password",required:true,value:oldPassword,onChange:e=>setOldPassword(e.target.value),className:"w-full bg-[#1e1e1e] border border-[#383838] rounded px-3 py-1.5 text-xs focus:outline-none focus:border-teal-500"})]),/*#__PURE__*/React.createElement("div",{key:"new"},[/*#__PURE__*/React.createElement("label",{className:"block text-xs text-slate-400 mb-1"},"Mật khẩu mới"),/*#__PURE__*/React.createElement("input",{type:"password",autoComplete:"new-password",required:true,value:newPassword,onChange:e=>setNewPassword(e.target.value),className:"w-full bg-[#1e1e1e] border border-[#383838] rounded px-3 py-1.5 text-xs focus:outline-none focus:border-teal-500"})]),/*#__PURE__*/React.createElement("button",{type:"submit",disabled:loading,className:"w-full py-1.5 bg-teal-600 hover:bg-teal-500 text-white font-semibold text-xs rounded transition"},loading?'Đang cập nhật...':'Cập Nhật Mật Khẩu')])]:activeTab==='projects'?[loadingProjects?/*#__PURE__*/React.createElement("div",{key:"loading",className:"text-center py-8 text-xs text-zinc-500"},"Đang tải danh sách dự án..."):projectsList.length===0?/*#__PURE__*/React.createElement("div",{key:"empty",className:"text-center py-8 text-xs text-zinc-500"},"Bạn chưa có dự án nào lưu trên Cloud."):/*#__PURE__*/React.createElement(React.Fragment,{key:"list"},[/*#__PURE__*/React.createElement("div",{key:"backup-config-bar",className:"flex items-center justify-between bg-zinc-900/60 p-2 rounded border border-zinc-800 mb-2 text-xs"},[/*#__PURE__*/React.createElement("div",{className:"flex items-center gap-2"},[/*#__PURE__*/React.createElement("span",{className:"text-zinc-400 text-[10px]"},"⚙️ Tự động lưu 5 phút / Backup 30 phút"),/*#__PURE__*/React.createElement("button",{onClick:e=>{e.stopPropagation();setShowBackupConfig(!showBackupConfig);},className:"px-2 py-0.5 bg-zinc-800 hover:bg-zinc-700 text-zinc-300 rounded text-[10px] border border-zinc-700"},showBackupConfig?"ẨN":"CẤU HÌNH")]),/*#__PURE__*/React.createElement("button",{onClick:e=>{e.stopPropagation();handleCleanupBackups();},className:"px-2 py-0.5 bg-amber-800 hover:bg-amber-700 text-amber-200 rounded text-[10px] border border-amber-700"},"🧹 DỌN BACKUP")]),showBackupConfig&&/*#__PURE__*/React.createElement("div",{key:"backup-config-detail",className:"bg-[#18181b] border border-zinc-800 rounded p-3 mb-2 text-xs"},[/*#__PURE__*/React.createElement("div",{className:"flex items-center justify-between mb-2"},[/*#__PURE__*/React.createElement("label",{className:"text-zinc-300 font-semibold"},"Số bản backup tối đa:"),/*#__PURE__*/React.createElement("div",{className:"flex items-center gap-2"},[/*#__PURE__*/React.createElement("input",{type:"range",min:5,max:20,value:backupMaxCount,onChange:e=>{const v=parseInt(e.target.value);setBackupMaxCount(v);localStorage.setItem('sonic_backup_max_count',v.toString());},className:"w-24 accent-amber-500"}),/*#__PURE__*/React.createElement("span",{className:"text-amber-400 font-bold w-6 text-center"},backupMaxCount)])]),/*#__PURE__*/React.createElement("p",{className:"text-[10px] text-zinc-500"},"Mỗi dự án sẽ giữ tối đa số bản backup này. Backup cũ nhất sẽ tự động bị xóa khi vượt quá giới hạn.")]),/*#__PURE__*/React.createElement("div",{className:"space-y-1.5"},projectsList.map(proj=>/*#__PURE__*/React.createElement("div",{key:proj.id},[/*#__PURE__*/React.createElement("div",{onClick:()=>handleOpenProject(proj.id),className:"flex items-center justify-between p-3 bg-[#1e1e1e] hover:bg-zinc-800 rounded border border-zinc-800 transition cursor-pointer text-xs group"},[/*#__PURE__*/React.createElement("div",{key:"meta"},[/*#__PURE__*/React.createElement("div",{className:"font-bold text-slate-200 group-hover:text-teal-400"},proj.name),/*#__PURE__*/React.createElement("div",{className:"text-[10px] text-zinc-500 mt-0.5"},[`Dung lượng: ${proj.size_mb} MB | Cập nhật: ${new Date(proj.updated_at*1000).toLocaleString()}`,proj.backup_count>0&&` | Backup: ${proj.backup_count}`])]),/*#__PURE__*/React.createElement("div",{key:"actions",className:"flex items-center gap-1.5"},[/*#__PURE__*/React.createElement("button",{onClick:e=>{e.stopPropagation();if(expandedBackupId===proj.id){setExpandedBackupId(null);}else{setExpandedBackupId(proj.id);fetchBackups(proj.id);}},className:`px-2 py-1 rounded font-semibold text-[10px] border ${expandedBackupId===proj.id?'bg-amber-800/80 text-amber-200 border-amber-700':'bg-zinc-800 hover:bg-zinc-700 text-zinc-400 border-zinc-700'}`},`Backup (${proj.backup_count})`),/*#__PURE__*/React.createElement("button",{onClick:e=>{e.stopPropagation();handleOpenProject(proj.id);},className:"px-2.5 py-1 bg-teal-800/80 hover:bg-teal-700 text-teal-200 rounded font-semibold text-[10px]"},"MỞ"),/*#__PURE__*/React.createElement("button",{onClick:e=>handleDeleteProject(proj.id,e),className:"px-2 py-1 bg-rose-950/60 hover:bg-rose-900/80 text-rose-300 rounded font-semibold text-[10px]"},"XÓA")])]),expandedBackupId===proj.id&&/*#__PURE__*/React.createElement("div",{key:"backup-list",className:"ml-4 pl-3 border-l-2 border-amber-800/50 bg-[#161618] rounded-b p-2 mb-1"},[loadingBackups[proj.id]?/*#__PURE__*/React.createElement("div",{className:"text-[10px] text-zinc-500 py-2 text-center"},"Đang tải..."):!backupsMap[proj.id]||backupsMap[proj.id].length===0?/*#__PURE__*/React.createElement("div",{className:"text-[10px] text-zinc-500 py-2 text-center"},"Chưa có bản backup nào."):/*#__PURE__*/React.createElement("div",{className:"space-y-1 max-h-48 overflow-y-auto"},backupsMap[proj.id].map(b=>/*#__PURE__*/React.createElement("div",{key:b.id,className:"flex items-center justify-between py-1.5 px-2 bg-[#1e1e22] rounded border border-zinc-800"},[/*#__PURE__*/React.createElement("div",{key:"info",className:"flex-1 min-w-0"},[/*#__PURE__*/React.createElement("div",{className:"text-[10px] text-zinc-300 truncate"},b.name),/*#__PURE__*/React.createElement("div",{className:"text-[9px] text-zinc-500 mt-0.5"},`${b.size_mb} MB | ${new Date(b.created_at*1000).toLocaleString()}`)]),/*#__PURE__*/React.createElement("button",{onClick:e=>{e.stopPropagation();handleDeleteBackup(b.id);},className:"px-1.5 py-0.5 bg-rose-950 hover:bg-rose-900 text-rose-300 rounded text-[9px] border border-rose-900 ml-2 shrink-0"},"XÓA")])))])])))])]:activeTab==='files'?[/*#__PURE__*/React.createElement("div",{key:"cleanup-header",className:"flex items-center justify-between bg-zinc-900/60 p-2.5 rounded border border-zinc-800 text-xs shrink-0 mb-3"},[/*#__PURE__*/React.createElement("span",{className:"text-zinc-400 text-[10px]"},"💡 Các tập tin không dùng trong dự án nào sẽ được đánh dấu 'Không dùng' và có thể xóa để giải phóng dung lượng."),/*#__PURE__*/React.createElement("button",{onClick:handleCleanUnusedFiles,className:"px-2.5 py-1 bg-rose-700 hover:bg-rose-600 text-white rounded font-bold text-[10px] uppercase flex items-center gap-1"},"🧹 Dọn dẹp tệp rác")]),loadingFiles?/*#__PURE__*/React.createElement("div",{key:"loading",className:"text-center py-8 text-xs text-zinc-500"},"Đang tải danh sách tập tin..."):filesList.length===0?/*#__PURE__*/React.createElement("div",{key:"empty",className:"text-center py-8 text-xs text-zinc-500"},"Chưa có tập tin nào tải lên hoặc tạo ra."):/*#__PURE__*/React.createElement("div",{key:"list",className:"space-y-1.5"},[filesList.map(file=>/*#__PURE__*/React.createElement("div",{key:file.file_id,className:"flex items-center justify-between p-3 bg-[#1e1e1e] rounded border border-zinc-800 text-xs"},[/*#__PURE__*/React.createElement("div",{key:"meta",className:"max-w-[70%]"},[/*#__PURE__*/React.createElement("div",{className:"font-semibold text-slate-300 truncate"},file.original_name||file.file_id),/*#__PURE__*/React.createElement("div",{className:"text-[10px] text-zinc-500 mt-0.5"},`Loại: ${file.type} | Dung lượng: ${file.size_mb} MB | Tạo lúc: ${new Date(file.created_at*1000).toLocaleString()}`)]),/*#__PURE__*/React.createElement("div",{key:"actions",className:"flex items-center gap-2"},[file.is_in_use?/*#__PURE__*/React.createElement("span",{className:"px-2 py-0.5 bg-emerald-950 text-emerald-400 border border-emerald-900 rounded text-[9px] uppercase font-bold font-mono"},"Đang dùng"):/*#__PURE__*/React.createElement("span",{className:"px-2 py-0.5 bg-zinc-850 text-zinc-400 border border-zinc-700 rounded text-[9px] uppercase font-bold font-mono"},"Không dùng"),!file.is_in_use&&/*#__PURE__*/React.createElement("button",{onClick:()=>handleDeleteFile(file.file_id),className:"px-2 py-0.5 bg-rose-950 hover:bg-rose-900 text-rose-300 rounded font-semibold text-[10px] border border-rose-900"},"Xóa")])]))])]:null)));};const SaveProjectModal=({isOpen,onClose,onSaveCloud,onSaveLocal,projectName})=>{if(!isOpen)return null;const[name,setName]=useState(projectName||'');const[saveType,setSaveType]=useState(localStorage.getItem('sonic_token')?'cloud':'local');const[cloudProjects,setCloudProjects]=useState([]);const[loading,setLoading]=useState(false);const[selectedExisting,setSelectedExisting]=useState(null);const[confirmOverwriteProject,setConfirmOverwriteProject]=useState(null);React.useEffect(function(){if(!isOpen)return;if(saveType==='cloud'&&window.SonicAPI&&window.SonicAPI.listCloudProjects){setLoading(true);window.SonicAPI.listCloudProjects().then(function(data){setCloudProjects(data||[]);}).catch(function(){setCloudProjects([]);}).finally(function(){setLoading(false);});}},[isOpen,saveType]);const handleSubmit=e=>{e.preventDefault();if(!name.trim())return;var matched=null;for(var i=0;i{if(!isOpen)return null;const[tab,setTab]=useState('cloud');const[projects,setProjects]=useState([]);const[loading,setLoading]=useState(false);React.useEffect(function(){if(!isOpen)return;if(tab==='cloud'){setLoading(true);var api=window.SonicAPI;if(api&&api.listCloudProjects){api.listCloudProjects().then(function(data){setProjects(data||[]);}).catch(function(){setProjects([]);}).finally(function(){setLoading(false);});}else{setLoading(false);}}},[isOpen,tab]);return React.createElement("div",{className:"fixed inset-0 z-50 flex items-center justify-center bg-black/70 backdrop-blur-sm"},React.createElement("div",{className:"bg-[#262626] border border-[#383838] rounded-xl shadow-2xl w-full max-w-lg p-6 text-slate-200"},React.createElement("h3",{className:"text-sm font-bold text-teal-400 mb-4 uppercase"},"Mở dự án"),React.createElement("div",{className:"grid grid-cols-2 gap-2 text-xs mb-4"},[React.createElement("button",{key:"cloud-tab",type:"button",onClick:function(){setTab('cloud');},className:"py-2 rounded border flex flex-col items-center gap-1 font-semibold transition "+(tab==='cloud'?'bg-teal-950/60 border-teal-500 text-teal-300':'bg-zinc-800 border-zinc-700 hover:bg-zinc-750 text-zinc-400')},[React.createElement("span",{key:"t"},"☁️ Cloud"),React.createElement("span",{key:"d",className:"text-[9px] font-normal text-zinc-500"},"Dự án trên server")]),React.createElement("button",{key:"local-tab",type:"button",onClick:function(){setTab('local');},className:"py-2 rounded border flex flex-col items-center gap-1 font-semibold transition "+(tab==='local'?'bg-teal-950/60 border-teal-500 text-teal-300':'bg-zinc-800 border-zinc-700 hover:bg-zinc-750 text-zinc-400')},[React.createElement("span",{key:"t"},"💾 Local"),React.createElement("span",{key:"d",className:"text-[9px] font-normal text-zinc-500"},"Tập tin .sfs trên máy")])]),tab==='cloud'?React.createElement("div",{className:"space-y-1.5 max-h-64 overflow-y-auto"},loading?[React.createElement("div",{key:"l",className:"text-center py-8 text-xs text-zinc-500"},"Đang tải danh sách dự án...")]:projects.length===0?[React.createElement("div",{key:"e",className:"text-center py-8 text-xs text-zinc-500"},"Bạn chưa có dự án nào trên Cloud.")]:projects.map(function(p){return React.createElement("div",{key:p.id,onClick:function(){onOpenCloud(p.id,p.name);},className:"flex items-center justify-between p-3 bg-[#1e1e1e] hover:bg-zinc-800 rounded border border-zinc-800 transition cursor-pointer text-xs group"},[React.createElement("div",{key:"meta"},[React.createElement("div",{className:"font-bold text-slate-200 group-hover:text-teal-400"},p.name),React.createElement("div",{className:"text-[10px] text-zinc-500 mt-0.5"},"Dung lượng: "+(p.size_mb||0)+" MB | Cập nhật: "+new Date((p.updated_at||0)*1000).toLocaleString())]),React.createElement("button",{onClick:function(e){e.stopPropagation();onOpenCloud(p.id,p.name);},className:"px-2.5 py-1 bg-teal-800/80 hover:bg-teal-700 text-teal-200 rounded font-semibold text-[10px]"},"MỞ")]);})):React.createElement("div",{className:"py-4 text-center text-xs text-zinc-400 space-y-3"},[React.createElement("div",{key:"d",className:"text-zinc-500"},"Chọn tệp .sfs để mở dự án từ Local."),React.createElement("button",{key:"b",onClick:function(){onOpenLocal();},className:"px-4 py-2 bg-teal-600 hover:bg-teal-500 text-white rounded font-semibold text-xs transition"},"Chọn tệp .sfs ...")]),React.createElement("div",{className:"flex justify-end gap-2 text-xs mt-4 pt-3 border-t border-zinc-800"},React.createElement("button",{type:"button",onClick:onClose,className:"px-3 py-1.5 bg-zinc-800 hover:bg-zinc-700 text-zinc-300 rounded"},"Hủy"))));};const SaveAsModal=({isOpen,onClose,projectName,onSaveCloud,onSaveLocal})=>{if(!isOpen)return null;const[name,setName]=useState(projectName||'');const[saveType,setSaveType]=useState('cloud');const handleSubmit=e=>{e.preventDefault();if(!name.trim())return;if(saveType==='cloud'){onSaveCloud(name.trim());}else{onSaveLocal(name.trim());}onClose();};return/*#__PURE__*/React.createElement("div",{className:"fixed inset-0 z-50 flex items-center justify-center bg-black/70 backdrop-blur-sm"},/*#__PURE__*/React.createElement("div",{className:"bg-[#262626] border border-[#383838] rounded-xl shadow-2xl w-full max-w-md p-6 text-slate-200"},/*#__PURE__*/React.createElement("h3",{className:"text-sm font-bold text-teal-400 mb-4 uppercase"},"Lưu dưới tên khác (Save As...)"),/*#__PURE__*/React.createElement("form",{onSubmit:handleSubmit,className:"space-y-4"},[/*#__PURE__*/React.createElement("div",{key:"name-block"},[/*#__PURE__*/React.createElement("label",{className:"block text-[10px] text-zinc-400 uppercase font-bold mb-1"},"Tên dự án mới"),/*#__PURE__*/React.createElement("input",{type:"text",placeholder:"Nhập tên mới...",required:true,value:name,onChange:e=>setName(e.target.value),className:"w-full bg-[#1e1e1e] border border-[#383838] rounded px-3 py-1.5 text-xs text-slate-200 focus:outline-none focus:border-teal-500 font-bold",autoFocus:true})]),/*#__PURE__*/React.createElement("div",{key:"type-block"},[/*#__PURE__*/React.createElement("label",{className:"block text-[10px] text-zinc-400 uppercase font-bold mb-1.5"},"Phương thức lưu trữ"),/*#__PURE__*/React.createElement("div",{className:"grid grid-cols-2 gap-2 text-xs"},[/*#__PURE__*/React.createElement("button",{key:"btn-cloud",type:"button",onClick:()=>setSaveType('cloud'),className:`py-2 rounded border flex flex-col items-center gap-1 font-semibold transition ${saveType==='cloud'?'bg-teal-950/60 border-teal-500 text-teal-300':'bg-zinc-800 border-zinc-700 hover:bg-zinc-750 text-zinc-400'}`},[/*#__PURE__*/React.createElement("span",{key:"title"},"☁️ Lưu Cloud"),/*#__PURE__*/React.createElement("span",{key:"desc",className:"text-[9px] font-normal text-zinc-500"},"Lưu lên server cá nhân")]),/*#__PURE__*/React.createElement("button",{key:"btn-local",type:"button",onClick:()=>setSaveType('local'),className:`py-2 rounded border flex flex-col items-center gap-1 font-semibold transition ${saveType==='local'?'bg-teal-950/60 border-teal-500 text-teal-300':'bg-zinc-800 border-zinc-700 hover:bg-zinc-750 text-zinc-400'}`},[/*#__PURE__*/React.createElement("span",{key:"title"},"💾 Tải về máy (.sfs)"),/*#__PURE__*/React.createElement("span",{key:"desc",className:"text-[9px] font-normal text-zinc-500"},"Tải tệp JSON dự án về máy")])])]),/*#__PURE__*/React.createElement("div",{key:"actions",className:"flex justify-end gap-2 text-xs pt-2"},[/*#__PURE__*/React.createElement("button",{key:"cancel",type:"button",onClick:onClose,className:"px-3 py-1.5 bg-zinc-800 hover:bg-zinc-700 text-zinc-300 rounded"},"Hủy"),/*#__PURE__*/React.createElement("button",{key:"save",type:"submit",className:"px-3 py-1.5 bg-teal-600 hover:bg-teal-500 text-white rounded font-semibold"},"Thực hiện lưu")])])));};const SystemManagerModal=({isOpen,onClose})=>{if(!isOpen)return null;const[users,setUsers]=useState([]);const[loading,setLoading]=useState(true);const[msg,setMsg]=useState('');const[error,setError]=useState('');const[editingQuotaUser,setEditingQuotaUser]=useState(null);const[newQuotaMb,setNewQuotaMb]=useState(500);useEffect(()=>{if(isOpen)loadUsers();},[isOpen]);const loadUsers=async()=>{setLoading(true);setError('');try{const data=await window.SonicAPI.listUsers();setUsers(data);}catch(err){setError(err.message||'Không thể tải danh sách người dùng hệ thống');}finally{setLoading(false);}};const handleSaveQuota=async userId=>{try{await window.SonicAPI.updateUserQuota(userId,parseInt(newQuotaMb));setMsg('Đã cập nhật hạn mức Quota thành công!');setEditingQuotaUser(null);loadUsers();}catch(err){setError(err.message||'Lỗi cập nhật Quota');}};const handleToggleRole=async user=>{const nextRole=user.role==='admin'?'standard':'admin';try{await window.SonicAPI.updateUserRole(user.id,nextRole,user.is_active);setMsg(`Đã đổi vai trò người dùng ${user.username} thành ${nextRole}`);loadUsers();}catch(err){setError(err.message||'Lỗi cập nhật vai trò');}};const handleDeleteUser=async userId=>{if(!confirm('Bạn có chắc chắn muốn xóa người dùng này khỏi hệ thống?'))return;try{await window.SonicAPI.deleteUser(userId);setMsg('Đã xóa người dùng thành công');loadUsers();}catch(err){setError(err.message||'Lỗi khi xóa người dùng');}};return/*#__PURE__*/React.createElement("div",{className:"fixed inset-0 z-50 flex items-center justify-center bg-black/70 backdrop-blur-sm"},/*#__PURE__*/React.createElement("div",{className:"bg-[#262626] border border-[#383838] rounded-xl shadow-2xl w-full max-w-4xl p-6 text-slate-200"},/*#__PURE__*/React.createElement("div",{className:"flex justify-between items-center pb-4 border-b border-[#383838]"},/*#__PURE__*/React.createElement("h3",{className:"text-lg font-bold text-amber-400"},"⚙️ Quản Lý Hệ Thống & Phân Quyền Admin"),/*#__PURE__*/React.createElement("button",{onClick:onClose,className:"text-slate-400 hover:text-slate-200"},"✕")),msg&&/*#__PURE__*/React.createElement("div",{className:"mt-3 p-2 bg-emerald-950/60 border border-emerald-700 text-emerald-300 rounded text-xs"},msg),error&&/*#__PURE__*/React.createElement("div",{className:"mt-3 p-2 bg-red-950/60 border border-red-700 text-red-300 rounded text-xs"},error),/*#__PURE__*/React.createElement("div",{className:"mt-4 overflow-x-auto max-h-96 no-scrollbar"},loading?/*#__PURE__*/React.createElement("div",{className:"py-8 text-center text-slate-400 text-xs"},"Đang tải thông tin hệ thống..."):/*#__PURE__*/React.createElement("table",{className:"w-full text-left text-xs border-collapse"},/*#__PURE__*/React.createElement("thead",null,/*#__PURE__*/React.createElement("tr",{className:"border-b border-[#383838] text-slate-400 bg-[#1e1e1e]"},/*#__PURE__*/React.createElement("th",{className:"p-3"},"Tên Người Dùng"),/*#__PURE__*/React.createElement("th",{className:"p-3"},"Email"),/*#__PURE__*/React.createElement("th",{className:"p-3"},"Vai Trò"),/*#__PURE__*/React.createElement("th",{className:"p-3"},"Dung Lượng Sử Dụng"),/*#__PURE__*/React.createElement("th",{className:"p-3"},"Hạn Mức Quota"),/*#__PURE__*/React.createElement("th",{className:"p-3 text-right"},"Thao Tác"))),/*#__PURE__*/React.createElement("tbody",{className:"divide-y divide-[#333]"},users.map(u=>/*#__PURE__*/React.createElement("tr",{key:u.id,className:"hover:bg-[#2e2e2e]"},/*#__PURE__*/React.createElement("td",{className:"p-3 font-semibold text-teal-300"},u.username,u.must_change_password&&/*#__PURE__*/React.createElement("span",{className:"ml-2 text-xs bg-amber-900/60 text-amber-300 px-1.5 py-0.5 rounded"},"Mật khẩu gốc")),/*#__PURE__*/React.createElement("td",{className:"p-3 text-slate-300"},u.email),/*#__PURE__*/React.createElement("td",{className:"p-3 uppercase font-bold text-amber-400"},u.role),/*#__PURE__*/React.createElement("td",{className:"p-3"},u.used_mb," MB"),/*#__PURE__*/React.createElement("td",{className:"p-3"},editingQuotaUser===u.id?/*#__PURE__*/React.createElement("div",{className:"flex items-center space-x-1"},/*#__PURE__*/React.createElement("input",{type:"number",value:newQuotaMb,onChange:e=>setNewQuotaMb(e.target.value),className:"w-16 bg-[#1e1e1e] border border-[#444] rounded px-1 py-0.5 text-xs text-slate-200"}),/*#__PURE__*/React.createElement("span",null,"MB"),/*#__PURE__*/React.createElement("button",{onClick:()=>handleSaveQuota(u.id),className:"px-2 py-0.5 bg-teal-600 rounded text-xs"},"Lưu")):/*#__PURE__*/React.createElement("span",{className:"font-semibold"},u.quota_mb," MB")),/*#__PURE__*/React.createElement("td",{className:"p-3 text-right space-x-2"},/*#__PURE__*/React.createElement("button",{onClick:()=>{setEditingQuotaUser(u.id);setNewQuotaMb(u.quota_mb);},className:"px-2 py-1 bg-slate-700 hover:bg-slate-600 rounded text-xs"},"Sửa Quota"),/*#__PURE__*/React.createElement("button",{onClick:()=>handleToggleRole(u),className:"px-2 py-1 bg-amber-700/60 hover:bg-amber-600 rounded text-xs"},"Đổi Role"),u.role!=='admin'&&/*#__PURE__*/React.createElement("button",{onClick:()=>handleDeleteUser(u.id),className:"px-2 py-1 bg-red-700/60 hover:bg-red-600 rounded text-xs"},"Xóa")))))))));};/* ═══════════════════════════════════════════════════════════════════ ABOUT / HELP / PREFERENCES MODALS (menu Help + Tools → Preferences) ═══════════════════════════════════════════════════════════════════ */const APP_VERSION='1.0.0';// khớp src-tauri/tauri.conf.json -const AboutModal=({isOpen,onClose})=>{if(!isOpen)return null;return/*#__PURE__*/React.createElement("div",{className:"fixed inset-0 z-[9999] flex items-center justify-center bg-black/70 backdrop-blur-sm",onClick:onClose},/*#__PURE__*/React.createElement("div",{className:"bg-[#1e1e24] border border-zinc-700 rounded-xl shadow-2xl w-full max-w-md p-6 text-slate-200",onClick:e=>e.stopPropagation()},/*#__PURE__*/React.createElement("div",{className:"flex items-center gap-3 mb-4"},/*#__PURE__*/React.createElement("img",{src:"/favicon.svg",alt:"SonicForge Studio",className:"w-12 h-12 rounded-lg bg-zinc-900 border border-zinc-700 shadow-lg object-contain p-0.5"}),/*#__PURE__*/React.createElement("div",null,/*#__PURE__*/React.createElement("h2",{className:"text-lg font-bold text-white"},"SonicForge Studio"),/*#__PURE__*/React.createElement("p",{className:"text-xs text-zinc-400"},"Professional DAW \u2014 v",APP_VERSION))),/*#__PURE__*/React.createElement("div",{className:"space-y-2 text-sm"},/*#__PURE__*/React.createElement("p",{className:"text-zinc-300 leading-relaxed"},"Ph\u1EA7n m\u1EC1m s\u1EA3n xu\u1EA5t \xE2m nh\u1EA1c (DAW) \u2014 so\u1EA1n nh\u1EA1c, ghi \xE2m, ch\u1EC9nh s\u1EEDa MIDI/Audio, SoundFont & VST, tr\u1ED9n v\xE0 master."),/*#__PURE__*/React.createElement("div",{className:"pt-2 border-t border-zinc-800 space-y-1 text-xs"},/*#__PURE__*/React.createElement("div",{className:"flex items-center gap-2"},/*#__PURE__*/React.createElement("span",{className:"text-zinc-500 w-20 shrink-0"},"Developer"),/*#__PURE__*/React.createElement("span",{className:"text-cyan-400 font-semibold"},"L\u1ED9c Ph\u1EA1m")),/*#__PURE__*/React.createElement("div",{className:"flex items-center gap-2"},/*#__PURE__*/React.createElement("span",{className:"text-zinc-500 w-20 shrink-0"},"Email"),/*#__PURE__*/React.createElement("a",{href:"mailto:tranloclqd@gmail.com",className:"text-cyan-400 hover:underline"},"tranloclqd@gmail.com")),/*#__PURE__*/React.createElement("div",{className:"flex items-center gap-2"},/*#__PURE__*/React.createElement("span",{className:"text-zinc-500 w-20 shrink-0"},"Version"),/*#__PURE__*/React.createElement("span",{className:"text-zinc-300"},APP_VERSION)),/*#__PURE__*/React.createElement("div",{className:"flex items-center gap-2"},/*#__PURE__*/React.createElement("span",{className:"text-zinc-500 w-20 shrink-0"},"Build"),/*#__PURE__*/React.createElement("span",{className:"text-zinc-300"},"Standalone (Tauri v2 + PyInstaller)")))),/*#__PURE__*/React.createElement("div",{className:"mt-5 flex justify-end"},/*#__PURE__*/React.createElement("button",{onClick:onClose,className:"px-4 py-1.5 bg-cyan-700 hover:bg-cyan-600 rounded text-xs font-bold text-white transition"},"\u0110\xF3ng"))));};const HelpModal=({isOpen,onClose,lang})=>{if(!isOpen)return null;const vi=lang!=='en';const sections=vi?[{title:'🚀 Bắt đầu nhanh',body:'Nhấn phím Cách (Space) để Play/Pause. Nhấn phím / để dừng. Dùng nút Record (●) để ghi âm/MIDI. Tạo track mới từ menu Track hoặc nút "+ Add Track".'},{title:'🎹 MIDI & ARM',body:'Bật nút ARM đỏ trên track để nhận phím từ MIDI keyboard. Vào menu Tools → MIDI Devices để chọn thiết bị. Khi ARM + bấm phím, âm preview phát và VU meter nhảy theo trường độ.'},{title:'🎼 Piano Roll',body:'Nhấp đúp vào MIDI item để mở Piano Roll. Dùng Ctrl+scroll hoặc nút +/− để zoom. Nhấp để vẽ note, kéo để di chuyển, Ctrl+kéo để copy. Phím tắt: C (vẽ), E (tẩy), Space (nghe).'},{title:'🎛️ FX & Master',body:'Chọn track → nút FX để mở FX Rack (thêm EQ, compressor...). Bấm nút PWR ở Master để mở Mastering Panel: EQ 4 băng, compressor, limiter. Mọi thay đổi áp dụng realtime.'},{title:'🧪 SoundFont & VST',body:'Vào Tools → Plugin Manager để quét SoundFont (.sf2/.sf3) và VSTi. Track MIDI dùng SoundFont làm nhạc cụ — chọn instrument từ nút Synth trên track.'},{title:'🤖 AI',body:'Tools → Config AI Providers để cấu hình API (OpenAI, Gemini, Ollama...). Dùng AI Prompt Generator (nút ✨) để sinh MIDI/ý tưởng; AI MIDI Preset Manager để lưu preset.'},{title:'💾 Lưu & Xuất',body:'Ctrl+S lưu project (cloud/temp), Ctrl+Shift+S Save As. Export WAV qua nút Export — chọn vùng, format, bitrate rồi Render.'},{title:'⌨️ Phím tắt',body:'Space: Play/Pause · /: Stop · Ctrl+Z/Y: Undo/Redo · Ctrl+C/X/V: Copy/Cut/Paste · Ctrl+S: Save · Ctrl+N: New · S: Split · Ctrl+E: Edit in new tab · Ctrl+wheel: zoom timeline'}]:[{title:'🚀 Quick start',body:'Press Space to Play/Pause. Press / to stop. Use Record (●) to capture audio/MIDI. Add tracks from the Track menu or the "+ Add Track" button.'},{title:'🎹 MIDI & ARM',body:'Enable the red ARM button on a track to receive keys from a MIDI keyboard. Go to Tools → MIDI Devices to pick your device. When ARM + key press, preview audio plays and the VU meter animates for the note length.'},{title:'🎼 Piano Roll',body:'Double-click a MIDI item to open the Piano Roll. Use Ctrl+scroll or +/− buttons to zoom. Click to draw notes, drag to move, Ctrl+drag to copy. Shortcuts: C (draw), E (erase), Space (listen).'},{title:'🎛️ FX & Master',body:'Select a track → FX button to open the FX Rack (EQ, compressor...). Press the PWR button on the Master to open the Mastering Panel: 4-band EQ, compressor, limiter — all realtime.'},{title:'🧪 SoundFont & VST',body:'Tools → Plugin Manager scans SoundFonts (.sf2/.sf3) and VSTi. MIDI tracks use SoundFonts as instruments — pick one from the Synth button on the track.'},{title:'🤖 AI',body:'Tools → Config AI Providers to set up APIs (OpenAI, Gemini, Ollama...). Use the AI Prompt Generator (✨) to create MIDI/ideas; AI MIDI Preset Manager stores presets.'},{title:'💾 Save & Export',body:'Ctrl+S saves the project (cloud/temp), Ctrl+Shift+S Save As. Export WAV via the Export button — pick range, format, bitrate, then Render.'},{title:'⌨️ Shortcuts',body:'Space: Play/Pause · /: Stop · Ctrl+Z/Y: Undo/Redo · Ctrl+C/X/V: Copy/Cut/Paste · Ctrl+S: Save · Ctrl+N: New · S: Split · Ctrl+E: Edit in new tab · Ctrl+wheel: zoom timeline'}];return/*#__PURE__*/React.createElement("div",{className:"fixed inset-0 z-[9999] flex items-center justify-center bg-black/70 backdrop-blur-sm",onClick:onClose},/*#__PURE__*/React.createElement("div",{className:"bg-[#1e1e24] border border-zinc-700 rounded-xl shadow-2xl w-full max-w-2xl max-h-[85vh] flex flex-col text-slate-200",onClick:e=>e.stopPropagation()},/*#__PURE__*/React.createElement("div",{className:"flex items-center justify-between px-5 py-3 border-b border-zinc-800 shrink-0"},/*#__PURE__*/React.createElement("h2",{className:"text-base font-bold text-white"},vi?'Hướng dẫn sử dụng SonicForge Studio':'SonicForge Studio User Guide'),/*#__PURE__*/React.createElement("button",{onClick:onClose,className:"w-6 h-6 rounded hover:bg-zinc-700 text-zinc-400 hover:text-white text-sm"},"\u2715")),/*#__PURE__*/React.createElement("div",{className:"overflow-y-auto px-5 py-4 space-y-3"},sections.map((s,i)=>/*#__PURE__*/React.createElement("div",{key:i,className:"bg-zinc-900/60 border border-zinc-800 rounded-lg p-3"},/*#__PURE__*/React.createElement("h3",{className:"text-sm font-bold text-cyan-400 mb-1"},s.title),/*#__PURE__*/React.createElement("p",{className:"text-xs text-zinc-300 leading-relaxed"},s.body)))),/*#__PURE__*/React.createElement("div",{className:"px-5 py-3 border-t border-zinc-800 flex justify-end shrink-0"},/*#__PURE__*/React.createElement("button",{onClick:onClose,className:"px-4 py-1.5 bg-cyan-700 hover:bg-cyan-600 rounded text-xs font-bold text-white transition"},vi?'Đóng':'Close'))));};const PreferencesModal=({isOpen,onClose,prefs,onPrefsChange})=>{if(!isOpen)return null;const vi=prefs.language!=='en';const themes=[{id:'dark',name:vi?'Tối (mặc định)':'Dark (default)',swatch:'from-zinc-700 to-zinc-900',ring:'ring-cyan-400'},{id:'midnight',name:vi?'Đêm xanh':'Midnight',swatch:'from-sky-800 to-slate-950',ring:'ring-sky-400'},{id:'forest',name:vi?'Rừng xanh':'Forest',swatch:'from-emerald-700 to-green-950',ring:'ring-emerald-400'},{id:'violet',name:vi?'Tím':'Violet',swatch:'from-violet-700 to-purple-950',ring:'ring-violet-400'},{id:'graphite',name:vi?'Than chì':'Graphite',swatch:'from-zinc-600 to-neutral-900',ring:'ring-zinc-300'}];const set=(k,v)=>onPrefsChange({...prefs,[k]:v});return/*#__PURE__*/React.createElement("div",{className:"fixed inset-0 z-[9999] flex items-center justify-center bg-black/70 backdrop-blur-sm",onClick:onClose},/*#__PURE__*/React.createElement("div",{className:"bg-[#1e1e24] border border-zinc-700 rounded-xl shadow-2xl w-full max-w-md max-h-[85vh] overflow-y-auto p-5 text-slate-200",onClick:e=>e.stopPropagation()},/*#__PURE__*/React.createElement("div",{className:"flex items-center justify-between mb-4"},/*#__PURE__*/React.createElement("h2",{className:"text-base font-bold text-white"},vi?'Tùy chọn (Preferences)':'Preferences'),/*#__PURE__*/React.createElement("button",{onClick:onClose,className:"w-6 h-6 rounded hover:bg-zinc-700 text-zinc-400 hover:text-white text-sm"},"\u2715")),/*#__PURE__*/React.createElement("div",{className:"mb-5"},/*#__PURE__*/React.createElement("h3",{className:"text-xs font-bold text-zinc-400 uppercase tracking-wider mb-2"},vi?'🎨 Chủ đề màu':'🎨 Theme'),/*#__PURE__*/React.createElement("div",{className:"grid grid-cols-1 gap-1.5"},themes.map(th=>/*#__PURE__*/React.createElement("button",{key:th.id,onClick:()=>set('theme',th.id),className:`flex items-center gap-2.5 px-2.5 py-2 rounded-lg border text-xs text-left transition ${prefs.theme===th.id?'border-cyan-500 bg-zinc-800':'border-zinc-700 bg-zinc-900 hover:bg-zinc-800'}`},/*#__PURE__*/React.createElement("span",{className:`w-6 h-6 rounded-md bg-gradient-to-br ${th.swatch} ring-1 ring-black/40 shrink-0 ${prefs.theme===th.id?`ring-2 ${th.ring}`:''}`}),/*#__PURE__*/React.createElement("span",{className:"text-zinc-200"},th.name),prefs.theme===th.id&&/*#__PURE__*/React.createElement("span",{className:"ml-auto text-cyan-400 text-[10px] font-bold"},"\u2713"))))),/*#__PURE__*/React.createElement("div",{className:"mb-5"},/*#__PURE__*/React.createElement("h3",{className:"text-xs font-bold text-zinc-400 uppercase tracking-wider mb-2"},vi?'🌐 Ngôn ngữ':'🌐 Language'),/*#__PURE__*/React.createElement("div",{className:"flex gap-1.5"},[{id:'vi',label:'Tiếng Việt'},{id:'en',label:'English'}].map(l=>/*#__PURE__*/React.createElement("button",{key:l.id,onClick:()=>set('language',l.id),className:`flex-1 px-2 py-1.5 rounded-lg border text-xs font-semibold transition ${prefs.language===l.id?'border-cyan-500 bg-cyan-900/40 text-cyan-300':'border-zinc-700 bg-zinc-900 text-zinc-400 hover:bg-zinc-800'}`},l.label))),/*#__PURE__*/React.createElement("p",{className:"text-[10px] text-zinc-500 mt-1"},vi?'Áp dụng ngay cho menu & hướng dẫn.':'Applies immediately to menus & guide.')),/*#__PURE__*/React.createElement("div",{className:"mb-5"},/*#__PURE__*/React.createElement("h3",{className:"text-xs font-bold text-zinc-400 uppercase tracking-wider mb-2"},vi?'🔠 Cỡ chữ nút bấm':'🔠 Button font size'),/*#__PURE__*/React.createElement("div",{className:"flex gap-1.5"},[{id:'sm',label:vi?'Nhỏ':'Small'},{id:'md',label:vi?'Vừa':'Medium'},{id:'lg',label:vi?'Lớn':'Large'}].map(f=>/*#__PURE__*/React.createElement("button",{key:f.id,onClick:()=>set('buttonFontSize',f.id),className:`flex-1 px-2 py-1.5 rounded-lg border text-xs font-semibold transition ${prefs.buttonFontSize===f.id?'border-cyan-500 bg-cyan-900/40 text-cyan-300':'border-zinc-700 bg-zinc-900 text-zinc-400 hover:bg-zinc-800'}`},f.label)))),/*#__PURE__*/React.createElement("div",{className:"flex justify-end gap-2 pt-2 border-t border-zinc-800"},/*#__PURE__*/React.createElement("button",{onClick:onClose,className:"px-3 py-1.5 bg-zinc-700 hover:bg-zinc-600 rounded text-xs font-bold text-white transition"},vi?'Hủy':'Cancel'),/*#__PURE__*/React.createElement("button",{onClick:onClose,className:"px-4 py-1.5 bg-cyan-700 hover:bg-cyan-600 rounded text-xs font-bold text-white transition"},vi?'Lưu & Đóng':'Save & Close'))));};const AIPresetModal=({isOpen,onClose})=>{if(!isOpen)return null;const mgrRef=React.useRef(null);if(!mgrRef.current)mgrRef.current=new window.PromptTemplateManager();const mgr=mgrRef.current;const[presets,setPresets]=React.useState(()=>[...mgr.getPresets()]);const[search,setSearch]=React.useState('');const[filterCategory,setFilterCategory]=React.useState('ALL');const[showFavoritesOnly,setShowFavoritesOnly]=React.useState(false);const[editingPreset,setEditingPreset]=React.useState(null);const[syncing,setSyncing]=React.useState(false);const[formName,setFormName]=React.useState('');const[formKeywords,setFormKeywords]=React.useState('');const[formCategory,setFormCategory]=React.useState('Orchestral / Film Score');const[formBars,setFormBars]=React.useState(8);const[formBpm,setFormBpm]=React.useState(120);const[formScale,setFormScale]=React.useState('C Minor');const[formTemplate,setFormTemplate]=React.useState('');const[showGeneratorModal,setShowGeneratorModal]=React.useState(false);const[selectedCategory,setSelectedCategory]=React.useState('Orchestral / Film Score');const[isAddingCategory,setIsAddingCategory]=React.useState(false);const[newCategoryValue,setNewCategoryValue]=React.useState('');const[categoriesVersion,setCategoriesVersion]=React.useState(0);const presetCategories=React.useMemo(()=>{const fromPresets=[...new Set(presets.map(p=>p.category).filter(Boolean))];let saved=[];try{const raw=localStorage.getItem('midi_prompt_categories');saved=raw?JSON.parse(raw):[];}catch(e){saved=[];}return[...new Set([...fromPresets,...saved])].sort();},[presets,categoriesVersion]);const addNewCategory=cat=>{const val=(cat||'').trim();if(!val)return;setFormCategory(val);setSelectedCategory(val);try{const raw=localStorage.getItem('midi_prompt_categories');const list=raw?JSON.parse(raw):[];if(!list.includes(val)){list.push(val);localStorage.setItem('midi_prompt_categories',JSON.stringify(list));setCategoriesVersion(v=>v+1);}}catch(e){}};const refreshPresets=()=>{setPresets([...mgr.getPresets()]);};// Sync from backend on mount — merge into local presets, never overwrite +const AboutModal=({isOpen,onClose})=>{if(!isOpen)return null;return/*#__PURE__*/React.createElement("div",{className:"fixed inset-0 z-[9999] flex items-center justify-center bg-black/70 backdrop-blur-sm",onClick:onClose},/*#__PURE__*/React.createElement("div",{className:"bg-[#1e1e24] border border-zinc-700 rounded-xl shadow-2xl w-full max-w-md p-6 text-slate-200",onClick:e=>e.stopPropagation()},/*#__PURE__*/React.createElement("div",{className:"flex items-center gap-3 mb-4"},/*#__PURE__*/React.createElement("img",{src:"/favicon.svg",alt:"SonicForge Studio",className:"w-12 h-12 rounded-lg bg-zinc-900 border border-zinc-700 shadow-lg object-contain p-0.5"}),/*#__PURE__*/React.createElement("div",null,/*#__PURE__*/React.createElement("h2",{className:"text-lg font-bold text-white"},"SonicForge Studio"),/*#__PURE__*/React.createElement("p",{className:"text-xs text-zinc-400"},"Professional DAW — v",APP_VERSION))),/*#__PURE__*/React.createElement("div",{className:"space-y-2 text-sm"},/*#__PURE__*/React.createElement("p",{className:"text-zinc-300 leading-relaxed"},"Phần mềm sản xuất âm nhạc (DAW) — soạn nhạc, ghi âm, chỉnh sửa MIDI/Audio, SoundFont & VST, trộn và master."),/*#__PURE__*/React.createElement("div",{className:"pt-2 border-t border-zinc-800 space-y-1 text-xs"},/*#__PURE__*/React.createElement("div",{className:"flex items-center gap-2"},/*#__PURE__*/React.createElement("span",{className:"text-zinc-500 w-20 shrink-0"},"Developer"),/*#__PURE__*/React.createElement("span",{className:"text-cyan-400 font-semibold"},"Lộc Phạm")),/*#__PURE__*/React.createElement("div",{className:"flex items-center gap-2"},/*#__PURE__*/React.createElement("span",{className:"text-zinc-500 w-20 shrink-0"},"Email"),/*#__PURE__*/React.createElement("a",{href:"mailto:tranloclqd@gmail.com",className:"text-cyan-400 hover:underline"},"tranloclqd@gmail.com")),/*#__PURE__*/React.createElement("div",{className:"flex items-center gap-2"},/*#__PURE__*/React.createElement("span",{className:"text-zinc-500 w-20 shrink-0"},"Version"),/*#__PURE__*/React.createElement("span",{className:"text-zinc-300"},APP_VERSION)),/*#__PURE__*/React.createElement("div",{className:"flex items-center gap-2"},/*#__PURE__*/React.createElement("span",{className:"text-zinc-500 w-20 shrink-0"},"Build"),/*#__PURE__*/React.createElement("span",{className:"text-zinc-300"},"Standalone (Tauri v2 + PyInstaller)")))),/*#__PURE__*/React.createElement("div",{className:"mt-5 flex justify-end"},/*#__PURE__*/React.createElement("button",{onClick:onClose,className:"px-4 py-1.5 bg-cyan-700 hover:bg-cyan-600 rounded text-xs font-bold text-white transition"},"Đóng"))));};const HelpModal=({isOpen,onClose,lang})=>{if(!isOpen)return null;const vi=lang!=='en';const sections=vi?[{title:'🚀 Bắt đầu nhanh',body:'Nhấn phím Cách (Space) để Play/Pause. Nhấn phím / để dừng. Dùng nút Record (●) để ghi âm/MIDI. Tạo track mới từ menu Track hoặc nút "+ Add Track".'},{title:'🎹 MIDI & ARM',body:'Bật nút ARM đỏ trên track để nhận phím từ MIDI keyboard. Vào menu Tools → MIDI Devices để chọn thiết bị. Khi ARM + bấm phím, âm preview phát và VU meter nhảy theo trường độ.'},{title:'🎼 Piano Roll',body:'Nhấp đúp vào MIDI item để mở Piano Roll. Dùng Ctrl+scroll hoặc nút +/− để zoom. Nhấp để vẽ note, kéo để di chuyển, Ctrl+kéo để copy. Phím tắt: C (vẽ), E (tẩy), Space (nghe).'},{title:'🎛️ FX & Master',body:'Chọn track → nút FX để mở FX Rack (thêm EQ, compressor...). Bấm nút PWR ở Master để mở Mastering Panel: EQ 4 băng, compressor, limiter. Mọi thay đổi áp dụng realtime.'},{title:'🧪 SoundFont & VST',body:'Vào Tools → Plugin Manager để quét SoundFont (.sf2/.sf3) và VSTi. Track MIDI dùng SoundFont làm nhạc cụ — chọn instrument từ nút Synth trên track.'},{title:'🤖 AI',body:'Tools → Config AI Providers để cấu hình API (OpenAI, Gemini, Ollama...). Dùng AI Prompt Generator (nút ✨) để sinh MIDI/ý tưởng; AI MIDI Preset Manager để lưu preset.'},{title:'💾 Lưu & Xuất',body:'Ctrl+S lưu project (cloud/temp), Ctrl+Shift+S Save As. Export WAV qua nút Export — chọn vùng, format, bitrate rồi Render.'},{title:'⌨️ Phím tắt',body:'Space: Play/Pause · /: Stop · Ctrl+Z/Y: Undo/Redo · Ctrl+C/X/V: Copy/Cut/Paste · Ctrl+S: Save · Ctrl+N: New · S: Split · Ctrl+E: Edit in new tab · Ctrl+wheel: zoom timeline'}]:[{title:'🚀 Quick start',body:'Press Space to Play/Pause. Press / to stop. Use Record (●) to capture audio/MIDI. Add tracks from the Track menu or the "+ Add Track" button.'},{title:'🎹 MIDI & ARM',body:'Enable the red ARM button on a track to receive keys from a MIDI keyboard. Go to Tools → MIDI Devices to pick your device. When ARM + key press, preview audio plays and the VU meter animates for the note length.'},{title:'🎼 Piano Roll',body:'Double-click a MIDI item to open the Piano Roll. Use Ctrl+scroll or +/− buttons to zoom. Click to draw notes, drag to move, Ctrl+drag to copy. Shortcuts: C (draw), E (erase), Space (listen).'},{title:'🎛️ FX & Master',body:'Select a track → FX button to open the FX Rack (EQ, compressor...). Press the PWR button on the Master to open the Mastering Panel: 4-band EQ, compressor, limiter — all realtime.'},{title:'🧪 SoundFont & VST',body:'Tools → Plugin Manager scans SoundFonts (.sf2/.sf3) and VSTi. MIDI tracks use SoundFonts as instruments — pick one from the Synth button on the track.'},{title:'🤖 AI',body:'Tools → Config AI Providers to set up APIs (OpenAI, Gemini, Ollama...). Use the AI Prompt Generator (✨) to create MIDI/ideas; AI MIDI Preset Manager stores presets.'},{title:'💾 Save & Export',body:'Ctrl+S saves the project (cloud/temp), Ctrl+Shift+S Save As. Export WAV via the Export button — pick range, format, bitrate, then Render.'},{title:'⌨️ Shortcuts',body:'Space: Play/Pause · /: Stop · Ctrl+Z/Y: Undo/Redo · Ctrl+C/X/V: Copy/Cut/Paste · Ctrl+S: Save · Ctrl+N: New · S: Split · Ctrl+E: Edit in new tab · Ctrl+wheel: zoom timeline'}];return/*#__PURE__*/React.createElement("div",{className:"fixed inset-0 z-[9999] flex items-center justify-center bg-black/70 backdrop-blur-sm",onClick:onClose},/*#__PURE__*/React.createElement("div",{className:"bg-[#1e1e24] border border-zinc-700 rounded-xl shadow-2xl w-full max-w-2xl max-h-[85vh] flex flex-col text-slate-200",onClick:e=>e.stopPropagation()},/*#__PURE__*/React.createElement("div",{className:"flex items-center justify-between px-5 py-3 border-b border-zinc-800 shrink-0"},/*#__PURE__*/React.createElement("h2",{className:"text-base font-bold text-white"},vi?'Hướng dẫn sử dụng SonicForge Studio':'SonicForge Studio User Guide'),/*#__PURE__*/React.createElement("button",{onClick:onClose,className:"w-6 h-6 rounded hover:bg-zinc-700 text-zinc-400 hover:text-white text-sm"},"✕")),/*#__PURE__*/React.createElement("div",{className:"overflow-y-auto px-5 py-4 space-y-3"},sections.map((s,i)=>/*#__PURE__*/React.createElement("div",{key:i,className:"bg-zinc-900/60 border border-zinc-800 rounded-lg p-3"},/*#__PURE__*/React.createElement("h3",{className:"text-sm font-bold text-cyan-400 mb-1"},s.title),/*#__PURE__*/React.createElement("p",{className:"text-xs text-zinc-300 leading-relaxed"},s.body)))),/*#__PURE__*/React.createElement("div",{className:"px-5 py-3 border-t border-zinc-800 flex justify-end shrink-0"},/*#__PURE__*/React.createElement("button",{onClick:onClose,className:"px-4 py-1.5 bg-cyan-700 hover:bg-cyan-600 rounded text-xs font-bold text-white transition"},vi?'Đóng':'Close'))));};const PreferencesModal=({isOpen,onClose,prefs,onPrefsChange})=>{if(!isOpen)return null;const vi=prefs.language!=='en';const themes=[{id:'dark',name:vi?'Tối (mặc định)':'Dark (default)',swatch:'from-zinc-700 to-zinc-900',ring:'ring-cyan-400'},{id:'midnight',name:vi?'Đêm xanh':'Midnight',swatch:'from-sky-800 to-slate-950',ring:'ring-sky-400'},{id:'forest',name:vi?'Rừng xanh':'Forest',swatch:'from-emerald-700 to-green-950',ring:'ring-emerald-400'},{id:'violet',name:vi?'Tím':'Violet',swatch:'from-violet-700 to-purple-950',ring:'ring-violet-400'},{id:'graphite',name:vi?'Than chì':'Graphite',swatch:'from-zinc-600 to-neutral-900',ring:'ring-zinc-300'}];const set=(k,v)=>onPrefsChange({...prefs,[k]:v});return/*#__PURE__*/React.createElement("div",{className:"fixed inset-0 z-[9999] flex items-center justify-center bg-black/70 backdrop-blur-sm",onClick:onClose},/*#__PURE__*/React.createElement("div",{className:"bg-[#1e1e24] border border-zinc-700 rounded-xl shadow-2xl w-full max-w-md max-h-[85vh] overflow-y-auto p-5 text-slate-200",onClick:e=>e.stopPropagation()},/*#__PURE__*/React.createElement("div",{className:"flex items-center justify-between mb-4"},/*#__PURE__*/React.createElement("h2",{className:"text-base font-bold text-white"},vi?'Tùy chọn (Preferences)':'Preferences'),/*#__PURE__*/React.createElement("button",{onClick:onClose,className:"w-6 h-6 rounded hover:bg-zinc-700 text-zinc-400 hover:text-white text-sm"},"✕")),/*#__PURE__*/React.createElement("div",{className:"mb-5"},/*#__PURE__*/React.createElement("h3",{className:"text-xs font-bold text-zinc-400 uppercase tracking-wider mb-2"},vi?'🎨 Chủ đề màu':'🎨 Theme'),/*#__PURE__*/React.createElement("div",{className:"grid grid-cols-1 gap-1.5"},themes.map(th=>/*#__PURE__*/React.createElement("button",{key:th.id,onClick:()=>set('theme',th.id),className:`flex items-center gap-2.5 px-2.5 py-2 rounded-lg border text-xs text-left transition ${prefs.theme===th.id?'border-cyan-500 bg-zinc-800':'border-zinc-700 bg-zinc-900 hover:bg-zinc-800'}`},/*#__PURE__*/React.createElement("span",{className:`w-6 h-6 rounded-md bg-gradient-to-br ${th.swatch} ring-1 ring-black/40 shrink-0 ${prefs.theme===th.id?`ring-2 ${th.ring}`:''}`}),/*#__PURE__*/React.createElement("span",{className:"text-zinc-200"},th.name),prefs.theme===th.id&&/*#__PURE__*/React.createElement("span",{className:"ml-auto text-cyan-400 text-[10px] font-bold"},"✓"))))),/*#__PURE__*/React.createElement("div",{className:"mb-5"},/*#__PURE__*/React.createElement("h3",{className:"text-xs font-bold text-zinc-400 uppercase tracking-wider mb-2"},vi?'🌐 Ngôn ngữ':'🌐 Language'),/*#__PURE__*/React.createElement("div",{className:"flex gap-1.5"},[{id:'vi',label:'Tiếng Việt'},{id:'en',label:'English'}].map(l=>/*#__PURE__*/React.createElement("button",{key:l.id,onClick:()=>set('language',l.id),className:`flex-1 px-2 py-1.5 rounded-lg border text-xs font-semibold transition ${prefs.language===l.id?'border-cyan-500 bg-cyan-900/40 text-cyan-300':'border-zinc-700 bg-zinc-900 text-zinc-400 hover:bg-zinc-800'}`},l.label))),/*#__PURE__*/React.createElement("p",{className:"text-[10px] text-zinc-500 mt-1"},vi?'Áp dụng ngay cho menu & hướng dẫn.':'Applies immediately to menus & guide.')),/*#__PURE__*/React.createElement("div",{className:"mb-5"},/*#__PURE__*/React.createElement("h3",{className:"text-xs font-bold text-zinc-400 uppercase tracking-wider mb-2"},vi?'🔠 Cỡ chữ nút bấm':'🔠 Button font size'),/*#__PURE__*/React.createElement("div",{className:"flex gap-1.5"},[{id:'sm',label:vi?'Nhỏ':'Small'},{id:'md',label:vi?'Vừa':'Medium'},{id:'lg',label:vi?'Lớn':'Large'}].map(f=>/*#__PURE__*/React.createElement("button",{key:f.id,onClick:()=>set('buttonFontSize',f.id),className:`flex-1 px-2 py-1.5 rounded-lg border text-xs font-semibold transition ${prefs.buttonFontSize===f.id?'border-cyan-500 bg-cyan-900/40 text-cyan-300':'border-zinc-700 bg-zinc-900 text-zinc-400 hover:bg-zinc-800'}`},f.label)))),/*#__PURE__*/React.createElement("div",{className:"flex justify-end gap-2 pt-2 border-t border-zinc-800"},/*#__PURE__*/React.createElement("button",{onClick:onClose,className:"px-3 py-1.5 bg-zinc-700 hover:bg-zinc-600 rounded text-xs font-bold text-white transition"},vi?'Hủy':'Cancel'),/*#__PURE__*/React.createElement("button",{onClick:onClose,className:"px-4 py-1.5 bg-cyan-700 hover:bg-cyan-600 rounded text-xs font-bold text-white transition"},vi?'Lưu & Đóng':'Save & Close'))));};const AIPresetModal=({isOpen,onClose})=>{if(!isOpen)return null;const mgrRef=React.useRef(null);if(!mgrRef.current)mgrRef.current=new window.PromptTemplateManager();const mgr=mgrRef.current;const[presets,setPresets]=React.useState(()=>[...mgr.getPresets()]);const[search,setSearch]=React.useState('');const[filterCategory,setFilterCategory]=React.useState('ALL');const[showFavoritesOnly,setShowFavoritesOnly]=React.useState(false);const[editingPreset,setEditingPreset]=React.useState(null);const[syncing,setSyncing]=React.useState(false);const[formName,setFormName]=React.useState('');const[formKeywords,setFormKeywords]=React.useState('');const[formCategory,setFormCategory]=React.useState('Orchestral / Film Score');const[formBars,setFormBars]=React.useState(8);const[formBpm,setFormBpm]=React.useState(120);const[formScale,setFormScale]=React.useState('C Minor');const[formTemplate,setFormTemplate]=React.useState('');const[showGeneratorModal,setShowGeneratorModal]=React.useState(false);const[selectedCategory,setSelectedCategory]=React.useState('Orchestral / Film Score');const[isAddingCategory,setIsAddingCategory]=React.useState(false);const[newCategoryValue,setNewCategoryValue]=React.useState('');const[categoriesVersion,setCategoriesVersion]=React.useState(0);const presetCategories=React.useMemo(()=>{const fromPresets=[...new Set(presets.map(p=>p.category).filter(Boolean))];let saved=[];try{const raw=localStorage.getItem('midi_prompt_categories');saved=raw?JSON.parse(raw):[];}catch(e){saved=[];}return[...new Set([...fromPresets,...saved])].sort();},[presets,categoriesVersion]);const addNewCategory=cat=>{const val=(cat||'').trim();if(!val)return;setFormCategory(val);setSelectedCategory(val);try{const raw=localStorage.getItem('midi_prompt_categories');const list=raw?JSON.parse(raw):[];if(!list.includes(val)){list.push(val);localStorage.setItem('midi_prompt_categories',JSON.stringify(list));setCategoriesVersion(v=>v+1);}}catch(e){}};const refreshPresets=()=>{setPresets([...mgr.getPresets()]);};// Sync from backend on mount — merge into local presets, never overwrite React.useEffect(()=>{if(!window.SonicAPI)return;setSyncing(true);window.SonicAPI.getAIPresets().then(data=>{if(!data||!data.presets||data.presets.length===0)return;var existing=mgr.presets;var existingIds=new Set(existing.map(function(p){return p.id;}));var merged=existing.slice();data.presets.forEach(function(bp){if(!existingIds.has(bp.id)){merged.push(bp);existingIds.add(bp.id);}});mgr.presets=merged;setPresets(merged);}).catch(function(){}).finally(function(){setSyncing(false);});},[]);// Listen for GENERATOR_PRESET_DATA from the iframe generator modal React.useEffect(()=>{const handleMessage=event=>{if(event.data&&event.data.type==='GENERATOR_PRESET_DATA'){const d=event.data;setFormName(d.name||'');setFormCategory(d.category||'Orchestral / Film Score');setSelectedCategory(d.category||'Orchestral / Film Score');setFormKeywords(d.keywords||'');setFormBars(parseInt(d.default_bars)||8);setFormBpm(parseInt(d.default_bpm)||120);setFormScale(d.default_scale||'C Minor');setFormTemplate(d.template||'');setEditingPreset('new');setShowGeneratorModal(false);setIsAddingCategory(false);setNewCategoryValue('');refreshPresets();}};window.addEventListener('message',handleMessage);return()=>window.removeEventListener('message',handleMessage);},[]);const savePresets=newPresets=>{setPresets(newPresets);mgr.presets=newPresets;mgr.savePresets();// Sync to backend if available const userDefined=newPresets.filter(p=>p.is_user_defined);if(window.SonicAPI&&userDefined.length>0){userDefined.forEach(p=>{window.SonicAPI.saveAIPreset(p).catch(()=>{});});}};const handleEdit=p=>{setEditingPreset(p);setFormName(p.name);setFormKeywords(p.keywords.join(', '));setFormCategory(p.category);setSelectedCategory(p.category);setFormBars(p.default_bars);setFormBpm(p.default_bpm);setFormScale(p.default_scale);setFormTemplate(p.system_instruction_template);setIsAddingCategory(false);setNewCategoryValue('');};const handleNew=()=>{setEditingPreset('new');setFormName('');setFormKeywords('');setFormCategory('Orchestral / Film Score');setSelectedCategory('Orchestral / Film Score');setFormBars(8);setFormBpm(120);setFormScale('C Minor');setFormTemplate('');setIsAddingCategory(false);setNewCategoryValue('');};const handleNewStructured=()=>{refreshPresets();setShowGeneratorModal(true);};const handleToggleFav=id=>{mgr.toggleFavorite(id);setPresets([...mgr.getPresets()]);const p=mgr.presets.find(x=>x.id===id);if(p&&p.is_user_defined&&window.SonicAPI){window.SonicAPI.saveAIPreset(p).catch(()=>{});}};const handleDelete=id=>{const p=presets.find(x=>x.id===id);if(p&&p.is_user_defined&&window.SonicAPI){window.SonicAPI.deleteAIPreset(id).catch(()=>{});}mgr.deletePreset(id);setPresets([...mgr.getPresets()]);showToast('Đã xóa preset.','info');};const handleSaveForm=e=>{e.preventDefault();if(!formName.trim()||!formTemplate.trim()){showToast('Vui lòng điền đầy đủ tên và mẫu gợi ý.','warning');return;}const keywordsArray=formKeywords.split(',').map(k=>k.trim()).filter(Boolean);const presetObj={id:editingPreset==='new'?'preset_'+Date.now():editingPreset.id,name:formName.trim(),keywords:keywordsArray,category:formCategory,default_bars:parseInt(formBars)||8,default_bpm:parseInt(formBpm)||120,default_scale:formScale,system_instruction_template:formTemplate.trim(),is_user_defined:true,is_favorite:editingPreset==='new'?false:editingPreset.is_favorite||false,created_at:editingPreset==='new'?new Date().toISOString():editingPreset.created_at};mgr.saveUserPreset(presetObj);setPresets([...mgr.getPresets()]);setEditingPreset(null);if(window.SonicAPI){window.SonicAPI.saveAIPreset(presetObj).catch(()=>{});}showToast('Đã lưu preset thành công!','success');};const categories=['ALL','★ Yêu thích','Người dùng',...new Set(presets.map(p=>p.category))];const filtered=presets.filter(p=>{const matchesSearch=p.name.toLowerCase().includes(search.toLowerCase())||p.keywords.some(k=>k.toLowerCase().includes(search.toLowerCase()));let matchesCategory;if(filterCategory==='ALL'){matchesCategory=true;}else if(filterCategory==='★ Yêu thích'){matchesCategory=p.is_favorite;}else if(filterCategory==='Người dùng'){matchesCategory=p.is_user_defined;}else{matchesCategory=p.category===filterCategory;}if(showFavoritesOnly)matchesCategory=matchesCategory&&p.is_favorite;return matchesSearch&&matchesCategory;});return/*#__PURE__*/React.createElement(React.Fragment,null,/*#__PURE__*/React.createElement("div",{className:"fixed inset-0 z-50 flex items-center justify-center bg-black/75 backdrop-blur-sm p-4 animate-fade-in"},/*#__PURE__*/React.createElement("div",{className:"bg-[#18181b] border border-zinc-800 rounded-xl shadow-2xl w-full max-w-4xl max-h-[85vh] flex flex-col overflow-hidden text-zinc-100"},/*#__PURE__*/React.createElement("div",{className:"p-4 border-b border-zinc-800 flex items-center justify-between shrink-0 bg-[#202024]"},/*#__PURE__*/React.createElement("h2",{className:"text-sm font-bold tracking-wider uppercase text-purple-400 flex items-center gap-1.5"},/*#__PURE__*/React.createElement("i",{"data-lucide":"sliders",className:"w-4 h-4"}),"AI Prompt Preset Manager",syncing&&/*#__PURE__*/React.createElement("span",{className:"text-[10px] text-zinc-500 ml-2"},"đang đồng bộ...")),/*#__PURE__*/React.createElement("button",{onClick:()=>{setEditingPreset(null);onClose();},className:"text-zinc-400 hover:text-zinc-200 transition"},/*#__PURE__*/React.createElement("i",{"data-lucide":"x",className:"w-4 h-4"}))),/*#__PURE__*/React.createElement("div",{className:"flex-1 overflow-y-auto p-4 flex gap-4 min-h-0"},!editingPreset?/*#__PURE__*/React.createElement(React.Fragment,null,/*#__PURE__*/React.createElement("div",{className:"flex-1 flex flex-col min-w-0"},/*#__PURE__*/React.createElement("div",{className:"flex items-center gap-2 mb-3 shrink-0"},/*#__PURE__*/React.createElement("input",{type:"text",placeholder:"Tìm kiếm preset hoặc từ khóa...",value:search,onChange:e=>setSearch(e.target.value),className:"flex-1 bg-zinc-900 border border-zinc-700 rounded px-2.5 py-1 text-xs outline-none focus:border-purple-600"}),/*#__PURE__*/React.createElement("select",{value:filterCategory,onChange:e=>setFilterCategory(e.target.value),className:"bg-zinc-900 border border-zinc-700 rounded px-2.5 py-1 text-xs outline-none focus:border-purple-600"},categories.map(c=>/*#__PURE__*/React.createElement("option",{key:c,value:c},c==='ALL'?'Tất cả danh mục':c))),/*#__PURE__*/React.createElement("button",{onClick:()=>setShowFavoritesOnly(!showFavoritesOnly),className:`px-2.5 py-1 rounded text-xs font-bold transition shrink-0 ${showFavoritesOnly?'bg-yellow-700 text-yellow-300':'bg-zinc-800 text-zinc-400 hover:bg-zinc-700'}`,title:"Chỉ hiện yêu thích"},/*#__PURE__*/React.createElement("i",{"data-lucide":"star",className:"w-3.5 h-3.5 inline-block mr-1"}),"★"),/*#__PURE__*/React.createElement("button",{onClick:handleNew,className:"px-3 py-1 bg-purple-700 hover:bg-purple-600 text-white rounded text-xs font-bold flex items-center gap-1.5 shadow transition shrink-0"},/*#__PURE__*/React.createElement("i",{"data-lucide":"plus",className:"w-3.5 h-3.5"}),"Tạo mới")),/*#__PURE__*/React.createElement("div",{className:"flex-1 border border-zinc-800 rounded bg-[#0f0f12] overflow-y-auto"},filtered.length===0?/*#__PURE__*/React.createElement("div",{className:"p-8 text-center text-zinc-500 text-xs italic"},"Không tìm thấy preset nào."):/*#__PURE__*/React.createElement("table",{className:"w-full text-left text-xs border-collapse"},/*#__PURE__*/React.createElement("thead",{className:"bg-[#1f1f23] text-zinc-400 font-bold border-b border-zinc-800"},/*#__PURE__*/React.createElement("tr",null,/*#__PURE__*/React.createElement("th",{className:"p-2.5 w-8"},""),/*#__PURE__*/React.createElement("th",{className:"p-2.5 w-1/4"},"Tên Preset"),/*#__PURE__*/React.createElement("th",{className:"p-2.5 w-1/4"},"Từ khóa kích hoạt"),/*#__PURE__*/React.createElement("th",{className:"p-2.5 w-1/6"},"Số Bar"),/*#__PURE__*/React.createElement("th",{className:"p-2.5 w-1/6"},"BPM"),/*#__PURE__*/React.createElement("th",{className:"p-2.5 w-1/6 text-right"},"Hành động"))),/*#__PURE__*/React.createElement("tbody",null,filtered.map(p=>/*#__PURE__*/React.createElement("tr",{key:p.id,className:"border-b border-zinc-800/50 hover:bg-zinc-850"},/*#__PURE__*/React.createElement("td",{className:"p-2.5 text-center"},/*#__PURE__*/React.createElement("button",{onClick:()=>handleToggleFav(p.id),className:`transition ${p.is_favorite?'text-yellow-400':'text-zinc-600 hover:text-zinc-400'}`,title:p.is_favorite?'Bỏ yêu thích':'Đánh dấu yêu thích'},p.is_favorite?"★":"☆")),/*#__PURE__*/React.createElement("td",{className:"p-2.5 font-semibold text-purple-300"},p.name),/*#__PURE__*/React.createElement("td",{className:"p-2.5 text-zinc-400 font-mono text-[11px] truncate max-w-[150px]"},p.keywords.join(', ')),/*#__PURE__*/React.createElement("td",{className:"p-2.5 text-zinc-400"},p.default_bars," Bars"),/*#__PURE__*/React.createElement("td",{className:"p-2.5 text-zinc-400"},p.default_bpm," BPM"),/*#__PURE__*/React.createElement("td",{className:"p-2.5 text-right flex items-center justify-end gap-1.5 h-full"},/*#__PURE__*/React.createElement("button",{type:"button",onClick:()=>handleEdit(p),className:"px-2 py-0.5 bg-zinc-850 hover:bg-zinc-700 text-zinc-300 rounded border border-zinc-700 text-[10px]"},"Sửa"),p.is_user_defined&&/*#__PURE__*/React.createElement("button",{type:"button",onClick:()=>handleDelete(p.id),className:"px-2 py-0.5 bg-red-950/40 hover:bg-red-800 text-red-400 rounded border border-red-900 text-[10px]"},"Xóa"))))))))):/*#__PURE__*/React.createElement("form",{onSubmit:handleSaveForm,className:"flex-1 flex flex-col gap-3 min-w-0"},/*#__PURE__*/React.createElement("div",{className:"text-xs font-bold text-zinc-400 shrink-0 border-b border-zinc-800 pb-1"},editingPreset==='new'?"TẠO PRESET MỚI":`SỬA PRESET: ${editingPreset.name}`),/*#__PURE__*/React.createElement("div",{className:"grid grid-cols-2 gap-3"},/*#__PURE__*/React.createElement("div",{className:"flex flex-col gap-1"},/*#__PURE__*/React.createElement("label",{className:"text-[10px] uppercase font-bold text-zinc-500"},"Tên Preset"),/*#__PURE__*/React.createElement("input",{type:"text",value:formName,onChange:e=>setFormName(e.target.value),className:"bg-zinc-900 border border-zinc-700 rounded px-2.5 py-1 text-xs outline-none focus:border-purple-600 text-zinc-200"})),/*#__PURE__*/React.createElement("div",{className:"flex flex-col gap-1"},/*#__PURE__*/React.createElement("label",{className:"text-[10px] uppercase font-bold text-zinc-500"},"Danh mục"),isAddingCategory?/*#__PURE__*/React.createElement("div",{className:"flex gap-2"},/*#__PURE__*/React.createElement("input",{type:"text",value:newCategoryValue,onChange:e=>setNewCategoryValue(e.target.value),onBlur:()=>{if(newCategoryValue.trim()){addNewCategory(newCategoryValue.trim());}setIsAddingCategory(false);},onKeyDown:e=>{if(e.key==='Enter'){e.preventDefault();if(newCategoryValue.trim()){addNewCategory(newCategoryValue.trim());}setIsAddingCategory(false);}else if(e.key==='Escape'){setIsAddingCategory(false);}},autoFocus:true,className:"flex-1 bg-zinc-900 border border-zinc-700 rounded px-2.5 py-1 text-xs outline-none focus:border-purple-600 text-zinc-200",placeholder:"Nhập danh mục mới..."})):/*#__PURE__*/React.createElement("select",{value:selectedCategory,onChange:e=>{if(e.target.value==='__add_new__'){setIsAddingCategory(true);setNewCategoryValue('');}else{setSelectedCategory(e.target.value);setFormCategory(e.target.value);}},className:"bg-zinc-900 border border-zinc-700 rounded px-2.5 py-1 text-xs outline-none focus:border-purple-600 text-zinc-200"},presetCategories.map(c=>/*#__PURE__*/React.createElement("option",{key:c,value:c},c)),/*#__PURE__*/React.createElement("option",{value:'__add_new__'},"+ Nhập danh mục mới...")))),/*#__PURE__*/React.createElement("div",{className:"flex flex-col gap-1"},/*#__PURE__*/React.createElement("label",{className:"text-[10px] uppercase font-bold text-zinc-500"},"Từ khóa kích hoạt (ngăn cách bằng dấu phẩy)"),/*#__PURE__*/React.createElement("input",{type:"text",value:formKeywords,onChange:e=>setFormKeywords(e.target.value),placeholder:"Ví dụ: epic orchestra, hoành tráng, nhạc phim epic",className:"bg-zinc-900 border border-zinc-700 rounded px-2.5 py-1 text-xs outline-none focus:border-purple-600 text-zinc-200"})),/*#__PURE__*/React.createElement("div",{className:"grid grid-cols-3 gap-3"},/*#__PURE__*/React.createElement("div",{className:"flex flex-col gap-1"},/*#__PURE__*/React.createElement("label",{className:"text-[10px] uppercase font-bold text-zinc-500"},"Số Bars mặc định"),/*#__PURE__*/React.createElement("input",{type:"number",value:formBars,onChange:e=>setFormBars(e.target.value),className:"bg-zinc-900 border border-zinc-700 rounded px-2.5 py-1 text-xs outline-none focus:border-purple-600 text-zinc-200"})),/*#__PURE__*/React.createElement("div",{className:"flex flex-col gap-1"},/*#__PURE__*/React.createElement("label",{className:"text-[10px] uppercase font-bold text-zinc-500"},"BPM mặc định"),/*#__PURE__*/React.createElement("input",{type:"number",value:formBpm,onChange:e=>setFormBpm(e.target.value),className:"bg-zinc-900 border border-zinc-700 rounded px-2.5 py-1 text-xs outline-none focus:border-purple-600 text-zinc-200"})),/*#__PURE__*/React.createElement("div",{className:"flex flex-col gap-1"},/*#__PURE__*/React.createElement("label",{className:"text-[10px] uppercase font-bold text-zinc-500"},"Âm giai (Scale) mặc định"),/*#__PURE__*/React.createElement("input",{type:"text",value:formScale,onChange:e=>setFormScale(e.target.value),className:"bg-zinc-900 border border-zinc-700 rounded px-2.5 py-1 text-xs outline-none focus:border-purple-600 text-zinc-200"}))),/*#__PURE__*/React.createElement("div",{className:"flex flex-col gap-1 flex-1 min-h-0"},/*#__PURE__*/React.createElement("label",{className:"text-[10px] uppercase font-bold text-zinc-500"},"System Prompt Template / Luật soạn nhạc"),/*#__PURE__*/React.createElement("textarea",{value:formTemplate,onChange:e=>setFormTemplate(e.target.value),rows:6,className:"flex-1 bg-zinc-900 border border-zinc-700 rounded p-2.5 text-xs outline-none focus:border-purple-600 text-zinc-200 font-mono resize-none"})),/*#__PURE__*/React.createElement("div",{className:"flex items-center gap-2 shrink-0 pt-2 border-t border-zinc-800"},/*#__PURE__*/React.createElement("button",{type:"button",onClick:handleNewStructured,className:"px-3 py-1.5 bg-emerald-800 hover:bg-emerald-700 text-emerald-300 border border-emerald-700 rounded text-xs transition"},"Tạo preset với cấu trúc"),/*#__PURE__*/React.createElement("div",{className:"flex-1"}),/*#__PURE__*/React.createElement("button",{type:"button",onClick:()=>setEditingPreset(null),className:"px-3 py-1.5 bg-zinc-800 hover:bg-zinc-700 text-zinc-400 border border-zinc-700 rounded text-xs transition"},"Quay lại"),/*#__PURE__*/React.createElement("button",{type:"submit",className:"px-3 py-1.5 bg-purple-700 hover:bg-purple-600 text-white rounded text-xs font-bold shadow transition"},"Lưu Preset")))),/*#__PURE__*/React.createElement("div",{className:"p-4 border-t border-zinc-800 flex justify-end shrink-0 bg-[#202024]"},/*#__PURE__*/React.createElement("button",{onClick:()=>{setEditingPreset(null);onClose();},className:"px-4 py-1.5 bg-zinc-800 hover:bg-zinc-700 text-zinc-300 border border-zinc-700 rounded text-xs font-bold shadow transition"},"Đóng")))),showGeneratorModal?/*#__PURE__*/React.createElement("div",{className:"fixed inset-0 z-[60] flex items-center justify-center bg-black/80 p-4",onClick:e=>{if(e.target===e.currentTarget){refreshPresets();setShowGeneratorModal(false);}}},/*#__PURE__*/React.createElement("div",{className:"w-full h-full max-w-6xl max-h-[90vh] bg-[#13141a] border border-zinc-800 rounded-2xl shadow-2xl overflow-hidden flex flex-col"},/*#__PURE__*/React.createElement("div",{className:"flex items-center justify-between p-3 border-b border-zinc-800 shrink-0"},/*#__PURE__*/React.createElement("h3",{className:"text-sm font-bold text-purple-400"},"AI Prompt Generator"),/*#__PURE__*/React.createElement("button",{onClick:()=>{refreshPresets();setShowGeneratorModal(false);},className:"text-zinc-400 hover:text-white"},/*#__PURE__*/React.createElement("i",{"data-lucide":"x",className:"w-4 h-4"}))),/*#__PURE__*/React.createElement("iframe",{src:"/ai-prompt-generator",className:"flex-1 w-full border-0 bg-white",title:"AI Prompt Generator"}))):null);};const PianoRollTabEditor=({st,zoom,bpm,viewportWidth,activeTracks,onClose,onUpdateNotes,onSaveNotes,setSubTabs,onPlayPause,onStop,isPlaying,playPreviewNote,showToast,midiDevices,recordingState,recTempMidiNotes,onRecord,selectedMidiInputId,onMidiInputSelect,activeMidiPitches,onInstrumentSelect,onRescheduleMidi,onSeekPlayhead,snapValue,onSnapChange,onRealtimePlay,onCopyNotes,clipboardNotes,onExportMidiAudio})=>{const[activeRollTool,setActiveRollTool]=React.useState('select');const[renderTick,setRenderTick]=React.useState(0);const[ccMode,setCcMode]=React.useState('velocity');const[rollZoom,setRollZoom]=React.useState(()=>{// Persist zoom piano roll qua phiên (localStorage) — user yêu cầu giữ kích @@ -700,19 +700,20 @@ handleSwitchMidiItem(m.id);},className:"flex items-center justify-center flex-1 if(t.clips&&t.clips.length>0){t.clips.forEach(c=>{const durationSec=c.buffer?c.buffer.duration:4.0;const clipFileId=c.serverFileId||t.serverFileId;items.push({id:c.id,name:c.name||"Audio Clip",type:"AUDIO_ITEM",start_bar:c.startTime/secondsPerBar,duration_bars:durationSec/(c.speed||1.0)/secondsPerBar,clip_start_offset_bars:0.0,source_data:{audio_file_url:clipFileId?`/static/audio/uploads/${clipFileId}`:"",sample_rate:c.buffer?c.buffer.sampleRate:44100,channels:c.buffer?c.buffer.numberOfChannels:2,gain:1.0,server_file_id:clipFileId}});});}if(t.midiItems&&t.midiItems.length>0){t.midiItems.forEach(m=>{items.push({id:m.id,name:m.name||"MIDI Item",type:"MIDI_ITEM",start_bar:m.startTime/secondsPerBar,duration_bars:m.duration?m.duration/secondsPerBar:4.0,clip_start_offset_bars:0.0,source_data:{total_buffer_bars:m.duration?m.duration/secondsPerBar:8.0,notes:(m.notes||[]).map(n=>({id:n.id||'note_'+Math.random().toString(36).substr(2,9),pitch:n.pitch||60,start_beat:n.start_beat||0.0,duration_beats:n.duration_beats||1.0,velocity:n.velocity||0.8,pan:n.pan||0.0}))}});});}if(t.sections&&t.sections.length>0){t.sections.forEach(s=>{items.push({id:s.id,name:s.name||"Section Item",type:"SECTION_ITEM",start_bar:s.start/secondsPerBar,duration_bars:s.duration/secondsPerBar,clip_start_offset_bars:0.0,source_data:{// KHÔNG fallback s.id: section item thiếu sectionId (insert thiếu // field) → fallback = chính id item → TỰ TRỎ → block lồng + mất // nội dung. Chỉ dùng sectionId; undefined → deserialize block rỗng. -referenced_section_id:s.sectionId}});});}return{id:t.id,name:t.name,type:trackType,color:t.color||null,volume_db:t.volumeDb||0.0,pan:t.pan||0.0,mute:t.muted||false,solo:t.solo||false,mastering_bypass:t.audioBypass||false,audio_bypass:t.audioBypass||false,midi_bypass:t.midiBypass||false,fx_active:t.fxActive!==false,instrument_id:t.instrumentId||null,instrument_program:t.instrumentProgram!==undefined?t.instrumentProgram:null,instrument_name:t.instrumentName||null,instrument_source:t.instrument_source||(t.synth_engine?t.synth_engine.type:null),soundfont_id:t.soundfont_id||(t.synth_engine?t.synth_engine.soundfont_id:null),soundfont_bank:t.soundfont_bank!==undefined?t.soundfont_bank:t.synth_engine?t.synth_engine.soundfont_bank:null,soundfont_program:t.soundfont_program!==undefined?t.soundfont_program:t.synth_engine?t.synth_engine.soundfont_program:null,synth_engine:t.synth_engine||undefined,midi_channel:t.midiChannel!==undefined?t.midiChannel:null,fx_chain:(t.fxChain||[]).map(m=>typeof m==='string'?{type:m,active:true}:{type:m.type,active:m.active!==false}),vst_fx_chain:(t.vstFxChain||[]).map(s=>({type:s.type||'vst3',path:s.path||'',name:s.name||'',preset_b64:s.preset_b64||'',bypass:!!s.bypass})),vst_fx_bypass:!!t.vstFxBypass,server_file_id:t.serverFileId||null,items:items};});};const deserializeTracksList=(schemaTracks,secondsPerBar,sectionStore,visitedSections,depth)=>{// Guard CHU TRÌNH: SECTION_ITEM trỏ về section đang được deserialize (hoặc +referenced_section_id:s.sectionId}});});}return{id:t.id,name:t.name,type:trackType,color:t.color||null,volume_db:t.volumeDb||0.0,pan:t.pan||0.0,mute:t.muted||false,solo:t.solo||false,mastering_bypass:t.audioBypass||false,audio_bypass:t.audioBypass||false,midi_bypass:t.midiBypass||false,fx_active:t.fxActive!==false,instrument_id:t.instrumentId||null,instrument_program:t.instrumentProgram!==undefined?t.instrumentProgram:null,instrument_name:t.instrumentName||null,instrument_source:t.instrument_source||(t.synth_engine?t.synth_engine.type:null),soundfont_id:t.soundfont_id||(t.synth_engine?t.synth_engine.soundfont_id:null),soundfont_bank:t.soundfont_bank!==undefined?t.soundfont_bank:t.synth_engine?t.synth_engine.soundfont_bank:null,soundfont_program:t.soundfont_program!==undefined?t.soundfont_program:t.synth_engine?t.synth_engine.soundfont_program:null,synth_engine:t.synth_engine||undefined,midi_channel:t.midiChannel!==undefined?t.midiChannel:null,fx_chain:(t.fxChain||[]).map(m=>typeof m==='string'?{type:m,active:true}:{type:m.type,active:m.active!==false}),vst_fx_chain:(t.vstFxChain||[]).map(s=>({type:s.type||'vst3',path:s.path||'',name:s.name||'',preset_b64:_capturedPresetByPath[s.path]||s.preset_b64||'',bypass:!!s.bypass})),vst_fx_bypass:!!t.vstFxBypass,vst_gui_open_path:t.id===_persistFxGuiTrackId&&_persistFxGuiOpen&&_persistFxGuiOpen.path?_persistFxGuiOpen.path:t.vstGuiOpenPath||null,vst_gui_open_name:t.id===_persistFxGuiTrackId&&_persistFxGuiOpen&&_persistFxGuiOpen.name?_persistFxGuiOpen.name:t.vstGuiOpenName||null,server_file_id:t.serverFileId||null,items:items};});};const deserializeTracksList=(schemaTracks,secondsPerBar,sectionStore,visitedSections,depth)=>{// Guard CHU TRÌNH: SECTION_ITEM trỏ về section đang được deserialize (hoặc // chu trình A→B→A) → recursion vô hạn → RangeError: Maximum call stack size // exceeded khi restore project. Visited-set chặn cycle; depth chặn lồng sâu. -const visited=visitedSections||new Set();const curDepth=depth||0;if(curDepth>12)return[];return(schemaTracks||[]).map(t=>{const clips=[];const sections=[];const midiItems=[];(t.items||[]).forEach(item=>{if(item.type==="AUDIO_ITEM"){const src=item.source_data||{};const clipFileId=src.server_file_id||(src.audio_file_url?src.audio_file_url.split('/').pop():null)||null;clips.push({id:item.id,name:item.name,startTime:item.start_bar*secondsPerBar,speed:1.0,duration:item.duration_bars*secondsPerBar,serverFileId:clipFileId});}else if(item.type==="MIDI_ITEM"){const src=item.source_data||{};midiItems.push({id:item.id,name:item.name,parent_track_id:t.id,startTime:item.start_bar*secondsPerBar,duration:item.duration_bars*secondsPerBar,length_bars:item.duration_bars||4,notes:(src.notes||[]).map(n=>({id:n.id,pitch:n.pitch||60,start_beat:n.start_beat||0.0,duration_beats:n.duration_beats||1.0,velocity:n.velocity||0.8,pan:n.pan||0.0}))});}else if(item.type==="SECTION_ITEM"){const src=item.source_data||{};const secId=src.referenced_section_id;const secContainer=sectionStore?sectionStore[secId]:null;const isCycle=secContainer?visited.has(secId):false;sections.push({id:item.id,name:item.name,start:item.start_bar*secondsPerBar,duration:item.duration_bars*secondsPerBar,length_bars:item.duration_bars||4,sectionId:secId,tracks:secContainer&&!isCycle?deserializeTracksList(secContainer.tracks,secondsPerBar,sectionStore,new Set(visited).add(secId),curDepth+1):null});}});return{id:t.id,name:t.name,type:t.type==='MIDI'?'MIDI':t.type==='SECTION'?'SECTION':'audio',volumeDb:t.volume_db||0.0,pan:t.pan||0.0,muted:t.mute||false,solo:t.solo||false,masteringBypass:t.audio_bypass!==undefined?t.audio_bypass:t.mastering_bypass||false,audioBypass:t.audio_bypass!==undefined?t.audio_bypass:t.mastering_bypass||false,midiBypass:t.midi_bypass!==undefined?t.midi_bypass:t.mastering_bypass||false,fxActive:t.fx_active!==undefined?t.fx_active:true,color:t.color||(t.id==='1'?'#0f766e':'#1d4ed8'),startTime:t.start_time||0,height:t.height||140,markers:t.markers||[],serverFileId:t.server_file_id||t.items&&t.items.find(function(i){return i.type==='AUDIO_ITEM';})?.source_data?.server_file_id||t.items&&t.items.find(function(i){return i.type==='AUDIO_ITEM';})?.source_data?.audio_file_url?.split('/').pop()||null,channelInfo:t.channel_info||null,isArmed:t.is_armed||false,monitoringEnabled:t.monitoring_enabled!==false,inputSource:t.input_source?{deviceType:t.input_source.device_type||'NONE',deviceId:t.input_source.device_id||''}:{deviceType:'NONE',deviceId:''},midiChannel:t.midi_channel!=null?t.midi_channel:undefined,is_percussion:t.is_percussion||false,clips:clips,sections:sections,midiItems:midiItems,instrumentId:t.instrumentId!=null?t.instrumentId:t.instrument_id||null,instrumentProgram:t.instrumentProgram!==undefined&&t.instrumentProgram!==null?t.instrumentProgram:t.instrument_program!==null?t.instrument_program:undefined,instrumentName:t.instrument_name||null,instrument_source:t.instrument_source||null,soundfont_id:t.soundfont_id||null,soundfont_bank:t.soundfont_bank!==null?t.soundfont_bank:undefined,soundfont_program:t.soundfont_program!==null?t.soundfont_program:undefined,synth_engine:t.synth_engine||undefined,fxChain:(t.fx_chain||[]).map(m=>typeof m==='string'?{type:m,active:true}:{type:m.type||m,active:m.active!==false}),vstFxChain:(t.vst_fx_chain||[]).map(s=>({type:s.type||'vst3',path:s.path||'',name:s.name||'',preset_b64:s.preset_b64||'',bypass:!!s.bypass})),vstFxBypass:t.vst_fx_bypass!==undefined?!!t.vst_fx_bypass:false};});};const serializeProjectToSchema=(projectId,name,bpmVal,tracksList,subTabsList,sessionTabsList,masteringSettings)=>{const secondsPerBar=60.0/parseFloat(bpmVal||120)*4;const mainTracks=serializeTracksList(tracksList,secondsPerBar);const sectionStore={};// Helper: compute length_bars from tracks content +const visited=visitedSections||new Set();const curDepth=depth||0;if(curDepth>12)return[];return(schemaTracks||[]).map(t=>{const clips=[];const sections=[];const midiItems=[];(t.items||[]).forEach(item=>{if(item.type==="AUDIO_ITEM"){const src=item.source_data||{};const clipFileId=src.server_file_id||(src.audio_file_url?src.audio_file_url.split('/').pop():null)||null;clips.push({id:item.id,name:item.name,startTime:item.start_bar*secondsPerBar,speed:1.0,duration:item.duration_bars*secondsPerBar,serverFileId:clipFileId});}else if(item.type==="MIDI_ITEM"){const src=item.source_data||{};midiItems.push({id:item.id,name:item.name,parent_track_id:t.id,startTime:item.start_bar*secondsPerBar,duration:item.duration_bars*secondsPerBar,length_bars:item.duration_bars||4,notes:(src.notes||[]).map(n=>({id:n.id,pitch:n.pitch||60,start_beat:n.start_beat||0.0,duration_beats:n.duration_beats||1.0,velocity:n.velocity||0.8,pan:n.pan||0.0}))});}else if(item.type==="SECTION_ITEM"){const src=item.source_data||{};const secId=src.referenced_section_id;const secContainer=sectionStore?sectionStore[secId]:null;const isCycle=secContainer?visited.has(secId):false;sections.push({id:item.id,name:item.name,start:item.start_bar*secondsPerBar,duration:item.duration_bars*secondsPerBar,length_bars:item.duration_bars||4,sectionId:secId,tracks:secContainer&&!isCycle?deserializeTracksList(secContainer.tracks,secondsPerBar,sectionStore,new Set(visited).add(secId),curDepth+1):null});}});return{id:t.id,name:t.name,type:t.type==='MIDI'?'MIDI':t.type==='SECTION'?'SECTION':'audio',volumeDb:t.volume_db||0.0,pan:t.pan||0.0,muted:t.mute||false,solo:t.solo||false,masteringBypass:t.audio_bypass!==undefined?t.audio_bypass:t.mastering_bypass||false,audioBypass:t.audio_bypass!==undefined?t.audio_bypass:t.mastering_bypass||false,midiBypass:t.midi_bypass!==undefined?t.midi_bypass:t.mastering_bypass||false,fxActive:t.fx_active!==undefined?t.fx_active:true,color:t.color||(t.id==='1'?'#0f766e':'#1d4ed8'),startTime:t.start_time||0,height:t.height||140,markers:t.markers||[],serverFileId:t.server_file_id||t.items&&t.items.find(function(i){return i.type==='AUDIO_ITEM';})?.source_data?.server_file_id||t.items&&t.items.find(function(i){return i.type==='AUDIO_ITEM';})?.source_data?.audio_file_url?.split('/').pop()||null,channelInfo:t.channel_info||null,isArmed:t.is_armed||false,monitoringEnabled:t.monitoring_enabled!==false,inputSource:t.input_source?{deviceType:t.input_source.device_type||'NONE',deviceId:t.input_source.device_id||''}:{deviceType:'NONE',deviceId:''},midiChannel:t.midi_channel!=null?t.midi_channel:undefined,is_percussion:t.is_percussion||false,clips:clips,sections:sections,midiItems:midiItems,instrumentId:t.instrumentId!=null?t.instrumentId:t.instrument_id||null,instrumentProgram:t.instrumentProgram!==undefined&&t.instrumentProgram!==null?t.instrumentProgram:t.instrument_program!==null?t.instrument_program:undefined,instrumentName:t.instrument_name||null,instrument_source:t.instrument_source||null,soundfont_id:t.soundfont_id||null,soundfont_bank:t.soundfont_bank!==null?t.soundfont_bank:undefined,soundfont_program:t.soundfont_program!==null?t.soundfont_program:undefined,synth_engine:t.synth_engine||undefined,fxChain:(t.fx_chain||[]).map(m=>typeof m==='string'?{type:m,active:true}:{type:m.type||m,active:m.active!==false}),vstFxChain:(t.vst_fx_chain||[]).map(s=>({type:s.type||'vst3',path:s.path||'',name:s.name||'',preset_b64:s.preset_b64||'',bypass:!!s.bypass})),vstFxBypass:t.vst_fx_bypass!==undefined?!!t.vst_fx_bypass:false,vstGuiOpenPath:t.vst_gui_open_path||null,vstGuiOpenName:t.vst_gui_open_name||null};});};const serializeProjectToSchema=(projectId,name,bpmVal,tracksList,subTabsList,sessionTabsList,masteringSettings,masterVolume)=>{const secondsPerBar=60.0/parseFloat(bpmVal||120)*4;const mainTracks=serializeTracksList(tracksList,secondsPerBar);const sectionStore={};// Helper: compute length_bars from tracks content const computeLengthBars=(tracksArr,spb)=>{let maxSec=0;(tracksArr||[]).forEach(tr=>{(tr.clips||[]).forEach(c=>{const end=(c.startTime||0)+(c.buffer?c.buffer.duration/(c.speed||1.0):4);if(end>maxSec)maxSec=end;});(tr.midiItems||[]).forEach(m=>{const end=(m.startTime||0)+(m.duration||4);if(end>maxSec)maxSec=end;});});return Math.ceil((maxSec||4)/spb);};// 1. Populate from sessionTabsList (open tabs) (sessionTabsList||[]).forEach(st=>{const serializedTracks=serializeTracksList(st.tracks,secondsPerBar);sectionStore[st.sectionId]={id:st.sectionId,name:st.name,is_root:false,length_bars:computeLengthBars(st.tracks,secondsPerBar),auto_compute_length:true,tracks:serializedTracks,color:st.color||null};});// 2. Also populate from tracksList (closed tabs saved inside Section items) -const scanForSections=tracks=>{(tracks||[]).forEach(t=>{if(t.sections){t.sections.forEach(s=>{const secId=s.sectionId||s.id;if(s.tracks&&!sectionStore[secId]){sectionStore[secId]={id:secId,name:s.name,is_root:false,length_bars:computeLengthBars(s.tracks,secondsPerBar),auto_compute_length:true,tracks:serializeTracksList(s.tracks,secondsPerBar),color:s.color||null};}if(s.tracks){scanForSections(s.tracks);}});}});};scanForSections(tracksList);const subTabs=(subTabsList||[]).map(st=>{return{id:st.id,label:st.label,type:st.type,track_id:st.trackId,target_id:st.target_id,parent_tab_id:st.parent_tab_id,notes:st.notes||[],duration:st.duration||4,instrument_program:st.instrumentProgram,instrument_name:st.instrumentName,instrument_id:st.instrumentId||st.synth_engine&&st.synth_engine.plugin_id||null,synth_engine:st.synth_engine||null,current_time:st.currentTime||0,color:st.color||null};});return{project_id:projectId||'proj_'+Date.now(),metadata:{title:name||"Dự án mới",bpm:parseFloat(bpmVal||120),time_signature_numerator:4,time_signature_denominator:4,sample_rate:44100,zoom:window.__sfTimelineZoom||window.__currentZoom||1.0},main_session:{id:"main",name:"MAIN SESSION",is_root:true,length_bars:(()=>{let maxBar=16.0;(mainTracks||[]).forEach(t=>{(t.items||[]).forEach(item=>{const end=(item.start_bar||0)+(item.duration_bars||4);if(end>maxBar)maxBar=end;});});return maxBar;})(),auto_compute_length:true,tracks:mainTracks,...(masteringSettings&&Array.isArray(masteringSettings.vstFxChain)&&masteringSettings.vstFxChain.length>0?{master:{fx_chain:masteringSettings.vstFxChain.map(s=>({type:s.type||'vst3',path:s.path||'',name:s.name||'',preset_b64:s.preset_b64||'',bypass:!!s.bypass})),volume_db:0,mute:false,bypass:!!masteringSettings.vstBypass}}:{})},sub_tabs:subTabs,section_store:sectionStore,mastering_settings:masteringSettings||null};};const deserializeProjectFromSchema=schemaObj=>{const bpmVal=schemaObj.metadata?schemaObj.metadata.bpm:120;const secondsPerBar=60.0/bpmVal*4;const sectionStore=schemaObj.section_store||{};const restoredTracks=deserializeTracksList(schemaObj.main_session.tracks,secondsPerBar,sectionStore);const restoredSessionTabs=[];Object.keys(sectionStore).forEach(secId=>{const secContainer=sectionStore[secId];const secTracks=deserializeTracksList(secContainer.tracks,secondsPerBar,sectionStore);restoredSessionTabs.push({id:'session_'+secId,name:secContainer.name,sectionId:secId,tracks:secTracks,length_bars:secContainer.length_bars||16.0,auto_compute_length:secContainer.auto_compute_length!==undefined?secContainer.auto_compute_length:true,color:secContainer.color||null});});const restoredSubTabs=(schemaObj.sub_tabs||[]).map(st=>{return{id:st.id,label:st.label,type:st.type,trackId:st.track_id,target_id:st.target_id,parent_tab_id:st.parent_tab_id,notes:st.notes||[],duration:st.duration||4,instrumentProgram:st.instrument_program,instrumentName:st.instrument_name,instrumentId:st.instrument_id||st.synth_engine&&st.synth_engine.plugin_id||null,synth_engine:st.synth_engine||null,currentTime:st.current_time||0,color:st.color||null};});// Migrate mastering settings saved with the OLD imager width scale +const scanForSections=tracks=>{(tracks||[]).forEach(t=>{if(t.sections){t.sections.forEach(s=>{const secId=s.sectionId||s.id;if(s.tracks&&!sectionStore[secId]){sectionStore[secId]={id:secId,name:s.name,is_root:false,length_bars:computeLengthBars(s.tracks,secondsPerBar),auto_compute_length:true,tracks:serializeTracksList(s.tracks,secondsPerBar),color:s.color||null};}if(s.tracks){scanForSections(s.tracks);}});}});};scanForSections(tracksList);const subTabs=(subTabsList||[]).map(st=>{return{id:st.id,label:st.label,type:st.type,track_id:st.trackId,target_id:st.target_id,parent_tab_id:st.parent_tab_id,notes:st.notes||[],duration:st.duration||4,instrument_program:st.instrumentProgram,instrument_name:st.instrumentName,instrument_id:st.instrumentId||st.synth_engine&&st.synth_engine.plugin_id||null,synth_engine:st.synth_engine||null,current_time:st.currentTime||0,color:st.color||null};});return{project_id:projectId||'proj_'+Date.now(),metadata:{title:name||"Dự án mới",bpm:parseFloat(bpmVal||120),time_signature_numerator:4,time_signature_denominator:4,sample_rate:44100,zoom:window.__sfTimelineZoom||window.__currentZoom||1.0},main_session:{id:"main",name:"MAIN SESSION",is_root:true,length_bars:(()=>{let maxBar=16.0;(mainTracks||[]).forEach(t=>{(t.items||[]).forEach(item=>{const end=(item.start_bar||0)+(item.duration_bars||4);if(end>maxBar)maxBar=end;});});return maxBar;})(),auto_compute_length:true,tracks:mainTracks,...(masteringSettings&&Array.isArray(masteringSettings.vstFxChain)&&masteringSettings.vstFxChain.length>0||typeof masterVolume==='number'&&isFinite(masterVolume)&&masterVolume!==0?{master:{fx_chain:masteringSettings.vstFxChain.map(s=>({type:s.type||'vst3',path:s.path||'',name:s.name||'',preset_b64:_capturedPresetByPath[s.path]||s.preset_b64||'',bypass:!!s.bypass})),volume_db:typeof masterVolume==='number'&&isFinite(masterVolume)?masterVolume:0,mute:false,bypass:!!masteringSettings.vstBypass}}:{})},sub_tabs:subTabs,section_store:sectionStore,mastering_settings:masteringSettings?{...masteringSettings,gui_open_path:_persistMasterGuiOpen&&_persistMasterGuiOpen.path?_persistMasterGuiOpen.path:masteringSettings&&masteringSettings.gui_open_path||null,gui_open_name:_persistMasterGuiOpen&&_persistMasterGuiOpen.name?_persistMasterGuiOpen.name:masteringSettings&&masteringSettings.gui_open_name||null}:null};};const deserializeProjectFromSchema=schemaObj=>{// GUI knob captures are per-project - don't leak presets between projects. +_capturedPresetByPath={};const bpmVal=schemaObj.metadata?schemaObj.metadata.bpm:120;const secondsPerBar=60.0/bpmVal*4;const sectionStore=schemaObj.section_store||{};const restoredTracks=deserializeTracksList(schemaObj.main_session.tracks,secondsPerBar,sectionStore);const restoredSessionTabs=[];Object.keys(sectionStore).forEach(secId=>{const secContainer=sectionStore[secId];const secTracks=deserializeTracksList(secContainer.tracks,secondsPerBar,sectionStore);restoredSessionTabs.push({id:'session_'+secId,name:secContainer.name,sectionId:secId,tracks:secTracks,length_bars:secContainer.length_bars||16.0,auto_compute_length:secContainer.auto_compute_length!==undefined?secContainer.auto_compute_length:true,color:secContainer.color||null});});const restoredSubTabs=(schemaObj.sub_tabs||[]).map(st=>{return{id:st.id,label:st.label,type:st.type,trackId:st.track_id,target_id:st.target_id,parent_tab_id:st.parent_tab_id,notes:st.notes||[],duration:st.duration||4,instrumentProgram:st.instrument_program,instrumentName:st.instrument_name,instrumentId:st.instrument_id||st.synth_engine&&st.synth_engine.plugin_id||null,synth_engine:st.synth_engine||null,currentTime:st.current_time||0,color:st.color||null};});// Migrate mastering settings saved with the OLD imager width scale // (−100..+100, 0 = original width) to the new imager_spec.md scale // (0..200, 0% = MONO, 100% = original, 200% = double width): old value v // meant S × (1 + v/100), which equals the new value (v + 100). Projects // saved after the migration carry `imagerScale: 'v2'` and are kept as-is. const _migrateMasteringSettings=ms=>{if(!ms)return null;const migrated=ms.imagerScale==='v2'?{...ms}:{...ms,w1:(ms.w1??0)+100,w2:(ms.w2??0)+100,w3:(ms.w3??0)+100,w4:(ms.w4??0)+100,imagerScale:'v2'};// mastering_expand.md: extension modules + dynamic chain (default = old chain order) -if(!Array.isArray(migrated.chain)){migrated.chain=DEFAULT_MASTER_CHAIN.map(m=>({...m}));}if(migrated.compActive===undefined)migrated.compActive=false;if(migrated.compThreshold===undefined)migrated.compThreshold=-16;if(migrated.compRatio===undefined)migrated.compRatio=3;if(migrated.compMakeup===undefined)migrated.compMakeup=0;if(migrated.limActive===undefined)migrated.limActive=false;if(migrated.limThreshold===undefined)migrated.limThreshold=-1.0;if(migrated.excActive===undefined)migrated.excActive=false;if(migrated.excDrive===undefined)migrated.excDrive=40;if(migrated.rebalActive===undefined)migrated.rebalActive=false;if(migrated.rebalMid===undefined)migrated.rebalMid=0;if(migrated.rebalSide===undefined)migrated.rebalSide=0;return migrated;};const _migratedMastering=_migrateMasteringSettings(schemaObj.mastering_settings)||{};const _masterBus=schemaObj.main_session&&schemaObj.main_session.master||{};const _masterFx=Array.isArray(_masterBus.fx_chain)?_masterBus.fx_chain:[];return{bpm:bpmVal,tracks:restoredTracks,sessionTabs:restoredSessionTabs,subTabs:restoredSubTabs,masteringSettings:{..._migratedMastering,vstFxChain:_masterFx.map(s=>({type:s.type||'vst3',path:s.path||'',name:s.name||'',preset_b64:s.preset_b64||'',bypass:!!s.bypass})),vstBypass:!!_masterBus.bypass},zoom:schemaObj.metadata&&schemaObj.metadata.zoom?parseFloat(schemaObj.metadata.zoom):1.0};};// ────────────────────────────────────────────── +if(!Array.isArray(migrated.chain)){migrated.chain=DEFAULT_MASTER_CHAIN.map(m=>({...m}));}if(migrated.compActive===undefined)migrated.compActive=false;if(migrated.compThreshold===undefined)migrated.compThreshold=-16;if(migrated.compRatio===undefined)migrated.compRatio=3;if(migrated.compMakeup===undefined)migrated.compMakeup=0;if(migrated.limActive===undefined)migrated.limActive=false;if(migrated.limThreshold===undefined)migrated.limThreshold=-1.0;if(migrated.excActive===undefined)migrated.excActive=false;if(migrated.excDrive===undefined)migrated.excDrive=40;if(migrated.rebalActive===undefined)migrated.rebalActive=false;if(migrated.rebalMid===undefined)migrated.rebalMid=0;if(migrated.rebalSide===undefined)migrated.rebalSide=0;return migrated;};const _migratedMastering=_migrateMasteringSettings(schemaObj.mastering_settings)||{};const _masterBus=schemaObj.main_session&&schemaObj.main_session.master||{};const _masterFx=Array.isArray(_masterBus.fx_chain)?_masterBus.fx_chain:[];return{bpm:bpmVal,tracks:restoredTracks,sessionTabs:restoredSessionTabs,subTabs:restoredSubTabs,masteringSettings:{..._migratedMastering,vstFxChain:_masterFx.map(s=>({type:s.type||'vst3',path:s.path||'',name:s.name||'',preset_b64:s.preset_b64||'',bypass:!!s.bypass})),vstBypass:!!_masterBus.bypass,gui_open_path:schemaObj.mastering_settings&&schemaObj.mastering_settings.gui_open_path?schemaObj.mastering_settings.gui_open_path:null,gui_open_name:schemaObj.mastering_settings&&schemaObj.mastering_settings.gui_open_name?schemaObj.mastering_settings.gui_open_name:null},masterVolume:typeof _masterBus.volume_db==='number'&&isFinite(_masterBus.volume_db)?_masterBus.volume_db:0,zoom:schemaObj.metadata&&schemaObj.metadata.zoom?parseFloat(schemaObj.metadata.zoom):1.0};};// ────────────────────────────────────────────── // MASTERING KNOB COMPONENT (Dynamic pointer events version) // ────────────────────────────────────────────── const MasteringKnob=({param,min,max,value,unit,label,color,onChange,size='small'})=>{const[isDragging,setIsDragging]=React.useState(false);const startYRef=React.useRef(0);const startValRef=React.useRef(0);const handlePointerDown=e=>{e.preventDefault();setIsDragging(true);startYRef.current=e.clientY;startValRef.current=value;e.currentTarget.setPointerCapture(e.pointerId);};const handlePointerMove=e=>{if(!isDragging)return;const deltaY=startYRef.current-e.clientY;let newVal=startValRef.current+deltaY/150*(max-min);newVal=Math.min(max,Math.max(min,newVal));onChange(param,newVal);};const handlePointerUp=e=>{setIsDragging(false);try{e.currentTarget.releasePointerCapture(e.pointerId);}catch(err){}};const pct=(value-min)/(max-min);const angle=-135+pct*270;const isLarge=size==='large';const dialClass=isLarge?'w-20 h-20 border-4 bg-slate-900':'w-10 h-10 border-2 bg-slate-800';const pointerHeight=isLarge?'h-6':'h-3';const valClass=isLarge?'text-xs text-cyan-300 font-bold mt-2 z-10':'text-[9px] text-slate-300 font-mono mt-1 font-bold';return/*#__PURE__*/React.createElement("div",{className:"flex flex-col items-center select-none"},label&&/*#__PURE__*/React.createElement("span",{className:"text-[10px] font-bold text-slate-400 mb-1.5 uppercase tracking-wide"},label),/*#__PURE__*/React.createElement("div",{className:`${dialClass} rounded-full relative flex items-center justify-center cursor-ns-resize shadow-lg`,style:{borderColor:color},onPointerDown:handlePointerDown,onPointerMove:handlePointerMove,onPointerUp:handlePointerUp,onPointerCancel:handlePointerUp},/*#__PURE__*/React.createElement("div",{className:"w-0.5 absolute rounded origin-bottom",style:{backgroundColor:color,height:isLarge?'22px':'12px',top:isLarge?'6px':'4px',transform:`rotate(${angle}deg)`,transformOrigin:'50% 100%'}}),isLarge&&/*#__PURE__*/React.createElement("span",{className:"text-[10px] font-bold text-cyan-300 z-10 bg-slate-950/80 px-1 py-0.5 rounded border border-slate-800"},value>0&&unit==='dB'?'+':'',value.toFixed(1)," ",unit)),!isLarge&&/*#__PURE__*/React.createElement("span",{className:valClass},value>0&&unit==='dB'?'+':'',value.toFixed(1),unit));};// ────────────────────────────────────────────── @@ -737,7 +738,7 @@ const specMods=(spectrumModules?spectrumModules():null)||(getModule?[getModule() const applyAll=applyTo||(fn=>{if(typeof window!=='undefined'&&window.__getTrackFxModule){const a=window.__getTrackFxModule(track.id,'eqpro');if(a)fn(a);}if(typeof window!=='undefined'&&window.__getTrackSfFxModule){const b=window.__getTrackSfFxModule(track.id,'eqpro');if(b)fn(b);}});const onDown=e=>{const cv=canvasRef.current,w=cv.clientWidth,h=cv.clientHeight;const{x,y}=toLocal(e);const s=st.current;let hit=false;for(let i=0;it+1);};const onMove=e=>{const s=st.current;if(s.dragId===null)return;const cv=canvasRef.current,w=cv.clientWidth,h=cv.clientHeight;const{x,y}=toLocal(e);const mx=Math.max(0,Math.min(w,x)),my=Math.max(0,Math.min(h,y));const b=s.bands[s.dragId];if(s.mode==='center'){const f=eqproClamp(parseFloat(eqproXToFreq(mx,w).toFixed(1)),EQPRO_F_MIN,EQPRO_F_MAX);// Filters without a Gain control (highpass/lowpass/notch/bandpass) stay on // the 0 dB axis — only frequency is draggable for them. const g=eqproBandHasGain(b.type)?eqproClamp(parseFloat(eqproYToGain(my,h).toFixed(1)),-EQPRO_MAX_DB,EQPRO_MAX_DB):0;b.freq=f;b.gain=g;applyAll(mm=>mm.setBand(s.dragId,{freq:f,gain:g}));}else if(s.mode==='wing'){const q=eqproWingToQ(Math.abs(mx-eqproFreqToX(b.freq,w)));b.q=q;applyAll(mm=>mm.setBand(s.dragId,{q}));}setTick(t=>t+1);};const onUp=e=>{const s=st.current;if(s.dragId!==null)commit();s.dragId=null;s.mode=null;try{canvasRef.current.releasePointerCapture(e.pointerId);}catch(err){}};const onWheel=e=>{e.preventDefault();const s=st.current;if(s.selected===null)return;const b=s.bands[s.selected];b.q=eqproClamp(parseFloat((b.q+(e.deltaY<0?0.2:-0.2)).toFixed(1)),0.1,18);applyAll(mm=>mm.setBand(s.selected,{q:b.q}));setTick(t=>t+1);};const onDblClick=e=>{const cv=canvasRef.current,w=cv.clientWidth,h=cv.clientHeight;const{x,y}=toLocal(e);const s=st.current;const hitIdx=s.bands.findIndex(b=>Math.hypot(x-eqproFreqToX(b.freq,w),y-eqproGainToY(b.gain,h))<=10);if(hitIdx!==-1){s.bands.splice(hitIdx,1);if(s.selected===hitIdx)s.selected=null;else if(s.selected!==null&&s.selected>hitIdx)s.selected--;}else{if(s.bands.length>=EQPRO_MAX_BANDS)return;s.bands.push({type:'peaking',freq:eqproClamp(parseFloat(eqproXToFreq(x,w).toFixed(1)),EQPRO_F_MIN,EQPRO_F_MAX),gain:eqproClamp(parseFloat(eqproYToGain(y,h).toFixed(1)),-EQPRO_MAX_DB,EQPRO_MAX_DB),q:1.2,active:true});s.selected=s.bands.length-1;}applyAll(mm=>mm.syncBands(s.bands));commit();setTick(t=>t+1);};const sel=st.current.selected!==null?st.current.bands[st.current.selected]:null;const selIdx=st.current.selected;const cvW=canvasRef.current?canvasRef.current.clientWidth:460;const cvH=240;const hudColor=selIdx!==null?EQPRO_BAND_COLORS[selIdx%EQPRO_BAND_COLORS.length]:EQPRO_BAND_COLORS[0];const hudXY=(()=>{if(st.current.hudPos){// Clamp so the HUD always stays inside the canvas area (buttons clickable). -return{hx:Math.max(0,Math.min((canvasRef.current?canvasRef.current.clientWidth:460)-268,st.current.hudPos.hx)),hy:Math.max(0,Math.min((canvasRef.current?canvasRef.current.clientHeight:240)-225,st.current.hudPos.hy))};}if(!sel)return null;const nx=eqproFreqToX(sel.freq,cvW),ny=eqproGainToY(sel.gain,cvH);let hx=nx-130,hy=ny-195;if(hx<8)hx=8;if(hx>cvW-268)hx=cvW-268;if(hy<8)hy=ny+24;return{hx,hy};})();return/*#__PURE__*/React.createElement("div",{className:"space-y-2"},/*#__PURE__*/React.createElement("div",{className:"flex items-center justify-between text-[11px] font-mono"},/*#__PURE__*/React.createElement("div",{className:"flex items-center gap-3"},/*#__PURE__*/React.createElement("span",{className:"text-slate-400"},"Bands: ",/*#__PURE__*/React.createElement("span",{className:"text-teal-300 font-bold"},st.current.bands.length),"/8"),/*#__PURE__*/React.createElement("label",{className:"flex items-center gap-1.5"},/*#__PURE__*/React.createElement("span",{className:"text-slate-400"},"Amount:"),/*#__PURE__*/React.createElement("input",{type:"range",min:0,max:200,value:st.current.amount,onChange:e=>{st.current.amount=parseInt(e.target.value);applyAll(mm=>mm.setAmount(st.current.amount));commit();setTick(t=>t+1);},className:"w-20 h-1 cursor-pointer",style:{accentColor:'#2dd4bf'}}),/*#__PURE__*/React.createElement("span",{className:"text-teal-300 font-bold w-10"},st.current.amount,"%"))),/*#__PURE__*/React.createElement("div",{className:"flex items-center gap-1"},/*#__PURE__*/React.createElement("button",{onClick:()=>{const s=st.current;s.bands=JSON.parse(JSON.stringify(EQPRO_DEFAULT_BANDS));s.selected=null;applyAll(mm=>mm.syncBands(s.bands));commit();setTick(t=>t+1);},className:"px-2 py-1 bg-slate-800 hover:bg-red-900/60 text-slate-300 border border-slate-700 rounded text-[10px]"},"Reset"),/*#__PURE__*/React.createElement("button",{onClick:()=>{const s=st.current;if(s.bands.length>=EQPRO_MAX_BANDS)return;s.bands.push({type:'peaking',freq:1000,gain:0,q:1.0,active:true});s.selected=s.bands.length-1;applyAll(mm=>mm.syncBands(s.bands));commit();setTick(t=>t+1);},className:"px-2 py-1 bg-teal-900/50 hover:bg-teal-800 text-teal-300 border border-teal-700 rounded text-[10px]"},"+ Band"))),/*#__PURE__*/React.createElement("div",{className:"relative"},/*#__PURE__*/React.createElement("canvas",{ref:canvasRef,className:"w-full h-60 block cursor-crosshair rounded-lg border border-slate-800 bg-slate-950",onPointerDown:onDown,onPointerMove:onMove,onPointerUp:onUp,onWheel:onWheel,onDoubleClick:onDblClick}),sel&&hudXY&&/*#__PURE__*/React.createElement("div",{className:"absolute z-10 w-64 rounded-xl p-3 text-[11px] font-mono space-y-2 pointer-events-auto cursor-move",style:{left:hudXY.hx,top:hudXY.hy,background:'rgba(15,23,42,0.94)',border:'1px solid rgba(45,212,191,0.3)',boxShadow:'0 10px 30px rgba(0,0,0,0.8)',backdropFilter:'blur(12px)'},onPointerDown:e=>{const s=st.current;s.dragHud=true;const r=e.currentTarget.getBoundingClientRect();s.hudOffsetX=e.clientX-r.left;s.hudOffsetY=e.clientY-r.top;e.currentTarget.setPointerCapture(e.pointerId);},onPointerMove:e=>{const s=st.current;if(!s.dragHud)return;const cv=canvasRef.current;const w=cv?cv.clientWidth:460;s.hudPos={hx:Math.max(0,Math.min(w-268,e.clientX-s.hudOffsetX-(cv?cv.getBoundingClientRect().left:0))),hy:Math.max(0,e.clientY-s.hudOffsetY-(cv?cv.getBoundingClientRect().top:0))};setTick(t=>t+1);},onPointerUp:e=>{st.current.dragHud=false;try{e.currentTarget.releasePointerCapture(e.pointerId);}catch(err){}}},/*#__PURE__*/React.createElement("div",{className:"flex items-center justify-between border-b border-slate-700/80 pb-1.5"},/*#__PURE__*/React.createElement("div",{className:"flex items-center gap-2"},/*#__PURE__*/React.createElement("span",{className:"w-4 h-4 rounded-full text-slate-950 font-bold flex items-center justify-center text-[10px]",style:{background:hudColor.badge}},selIdx+1),/*#__PURE__*/React.createElement("span",{className:"font-bold text-white uppercase tracking-wider"},"Band ",selIdx+1)),/*#__PURE__*/React.createElement("div",{className:"flex items-center gap-1"},/*#__PURE__*/React.createElement("button",{title:"Bypass band",onClick:()=>{const s=st.current;s.bands[s.selected].active=!s.bands[s.selected].active;applyAll(mm=>mm.setBand(s.selected,{active:s.bands[s.selected].active}));commit();setTick(t=>t+1);},className:`w-5 h-5 rounded flex items-center justify-center text-[10px] ${sel.active?'bg-slate-800 text-slate-400':'bg-amber-600 text-white'}`},/*#__PURE__*/React.createElement("i",{className:"fa-solid fa-power-off"})),/*#__PURE__*/React.createElement("button",{title:"Delete band",onClick:()=>{const s=st.current;s.bands.splice(s.selected,1);s.selected=null;applyAll(mm=>mm.syncBands(s.bands));commit();setTick(t=>t+1);},className:"w-5 h-5 rounded bg-slate-800 hover:bg-red-600 text-slate-400 hover:text-white flex items-center justify-center text-[10px]"},/*#__PURE__*/React.createElement("i",{className:"fa-solid fa-xmark"})))),/*#__PURE__*/React.createElement("div",null,/*#__PURE__*/React.createElement("label",{className:"block text-[9px] text-slate-400 uppercase tracking-widest mb-1"},"Filter Shape"),/*#__PURE__*/React.createElement("select",{value:sel.type,onChange:ev=>{const s=st.current;s.bands[s.selected].type=ev.target.value;applyAll(mm=>mm.setBand(s.selected,{type:ev.target.value}));commit();setTick(t=>t+1);},className:"w-full bg-slate-950 border border-slate-700 text-teal-300 rounded px-2 py-1 text-[11px] outline-none"},['peaking','highpass','lowpass','lowshelf','highshelf','notch','bandpass'].map(t=>/*#__PURE__*/React.createElement("option",{key:t,value:t},t==='peaking'?'Bell / Peaking':t==='highpass'?'Low Cut / High Pass':t==='lowpass'?'High Cut / Low Pass':t==='lowshelf'?'Low Shelf':t==='highshelf'?'High Shelf':t==='notch'?'Notch / Band Stop':'Band Pass')))),/*#__PURE__*/React.createElement("div",{className:"grid grid-cols-3 gap-2 text-center bg-slate-950/80 p-2 rounded-lg border border-slate-800"},/*#__PURE__*/React.createElement("div",null,/*#__PURE__*/React.createElement("div",{className:"text-[9px] text-slate-500"},"FREQ"),/*#__PURE__*/React.createElement("div",{className:"text-teal-300 font-bold text-[11px]"},sel.freq>=1000?(sel.freq/1000).toFixed(2)+' kHz':Math.round(sel.freq)+' Hz')),/*#__PURE__*/React.createElement("div",null,/*#__PURE__*/React.createElement("div",{className:"text-[9px] text-slate-500"},"GAIN"),/*#__PURE__*/React.createElement("div",{className:"text-amber-400 font-bold text-[11px]"},eqproBandHasGain(sel.type)?(sel.gain>0?'+':'')+sel.gain.toFixed(1)+' dB':'0.0 dB')),/*#__PURE__*/React.createElement("div",null,/*#__PURE__*/React.createElement("div",{className:"text-[9px] text-slate-500"},"Q"),/*#__PURE__*/React.createElement("div",{className:"text-purple-400 font-bold text-[11px]"},sel.q.toFixed(1)))),/*#__PURE__*/React.createElement("div",{className:"text-[9px] text-slate-500 text-center"},"Drag center: Freq & Gain \xB7 Wings/Wheel: Q \xB7 Dbl-click: add/delete"))));};const ExportModal=({open,onClose,exportSettings,setExportSettings,isExporting,onExport,onBounce})=>{if(!open)return null;return/*#__PURE__*/React.createElement("div",{className:"fixed inset-0 z-[300] bg-black/70 backdrop-blur-sm flex items-center justify-center p-6",onClick:onClose},/*#__PURE__*/React.createElement("div",{className:"w-full max-w-2xl bg-slate-900 border border-slate-700 rounded-2xl shadow-2xl overflow-hidden",onClick:e=>e.stopPropagation()},/*#__PURE__*/React.createElement("div",{className:"h-9 bg-slate-800/80 border-b border-slate-700 flex items-center justify-between px-3 select-none"},/*#__PURE__*/React.createElement("span",{className:"text-xs font-bold text-cyan-300 font-mono flex items-center gap-1.5"},/*#__PURE__*/React.createElement("i",{"data-lucide":"download-cloud",className:"w-3.5 h-3.5"})," EXPORT"),/*#__PURE__*/React.createElement("button",{onClick:onClose,className:"text-zinc-400 hover:text-white"},/*#__PURE__*/React.createElement("i",{"data-lucide":"x",className:"w-4 h-4"}))),/*#__PURE__*/React.createElement("div",{className:"p-4 max-h-[72vh] overflow-y-auto space-y-3"},/*#__PURE__*/React.createElement("div",{className:"grid grid-cols-2 gap-2"},/*#__PURE__*/React.createElement("div",null,/*#__PURE__*/React.createElement("label",{className:"block text-[7px] text-zinc-500 font-bold uppercase mb-0.5"},"Ngu\u1ED3n"),/*#__PURE__*/React.createElement("select",{value:exportSettings.source,onChange:e=>setExportSettings(p=>({...p,source:e.target.value})),className:"w-full bg-[#141414] border border-zinc-800 rounded px-1 py-0.5 text-xs text-zinc-300 focus:outline-none"},/*#__PURE__*/React.createElement("option",{value:"project"},"Project (Mix)"),/*#__PURE__*/React.createElement("option",{value:"track_mix"},"Track Selection"),/*#__PURE__*/React.createElement("option",{value:"active_clip"},"Active Clip"),/*#__PURE__*/React.createElement("option",{value:"clip_selection"},"Clip Selection"))),/*#__PURE__*/React.createElement("div",null,/*#__PURE__*/React.createElement("label",{className:"block text-[7px] text-zinc-500 font-bold uppercase mb-0.5"},"\u0110\u1ECBnh d\u1EA1ng"),/*#__PURE__*/React.createElement("select",{value:exportSettings.format,onChange:e=>setExportSettings(p=>({...p,format:e.target.value,sampleRate:'44100',bitDepth:'float',quality:'44khz'})),className:"w-full bg-[#141414] border border-zinc-800 rounded px-1 py-0.5 text-xs text-zinc-300 focus:outline-none"},/*#__PURE__*/React.createElement("option",{value:"wav"},"WAV"),/*#__PURE__*/React.createElement("option",{value:"mp3"},"MP3"),/*#__PURE__*/React.createElement("option",{value:"ogg"},"OGG")))),exportSettings.format==='wav'?/*#__PURE__*/React.createElement("div",{className:"grid grid-cols-2 gap-2"},/*#__PURE__*/React.createElement("div",null,/*#__PURE__*/React.createElement("label",{className:"block text-[7px] text-zinc-500 font-bold uppercase mb-0.5"},"SR (Hz)"),/*#__PURE__*/React.createElement("select",{value:exportSettings.sampleRate,onChange:e=>setExportSettings(p=>({...p,sampleRate:e.target.value})),className:"w-full bg-[#141414] border border-zinc-800 rounded px-1 py-0.5 text-xs text-zinc-300 focus:outline-none"},/*#__PURE__*/React.createElement("option",{value:"22500"},"22500"),/*#__PURE__*/React.createElement("option",{value:"44100"},"44100"))),/*#__PURE__*/React.createElement("div",null,/*#__PURE__*/React.createElement("label",{className:"block text-[7px] text-zinc-500 font-bold uppercase mb-0.5"},"Bit"),/*#__PURE__*/React.createElement("select",{value:exportSettings.bitDepth,onChange:e=>setExportSettings(p=>({...p,bitDepth:e.target.value})),className:"w-full bg-[#141414] border border-zinc-800 rounded px-1 py-0.5 text-xs text-zinc-300 focus:outline-none"},/*#__PURE__*/React.createElement("option",{value:"8"},"8"),/*#__PURE__*/React.createElement("option",{value:"16"},"16"),/*#__PURE__*/React.createElement("option",{value:"24"},"24"),/*#__PURE__*/React.createElement("option",{value:"float"},"32 float")))):/*#__PURE__*/React.createElement("div",{className:"grid grid-cols-2 gap-2"},/*#__PURE__*/React.createElement("div",null,/*#__PURE__*/React.createElement("label",{className:"block text-[7px] text-zinc-500 font-bold uppercase mb-0.5"},"Ch\u1EA5t l\u01B0\u1EE3ng"),/*#__PURE__*/React.createElement("select",{value:exportSettings.quality,onChange:e=>setExportSettings(p=>({...p,quality:e.target.value})),className:"w-full bg-[#141414] border border-zinc-800 rounded px-1 py-0.5 text-xs text-zinc-300 focus:outline-none"},/*#__PURE__*/React.createElement("option",{value:"44khz"},"44kHz"),/*#__PURE__*/React.createElement("option",{value:"lossless"},"Lossless"))),/*#__PURE__*/React.createElement("div",null)),/*#__PURE__*/React.createElement("div",{className:"grid grid-cols-2 gap-2"},/*#__PURE__*/React.createElement("div",null,/*#__PURE__*/React.createElement("label",{className:"block text-[7px] text-zinc-500 font-bold uppercase mb-0.5"},"K\xEAnh"),/*#__PURE__*/React.createElement("select",{value:exportSettings.channels,onChange:e=>setExportSettings(p=>({...p,channels:e.target.value})),className:"w-full bg-[#141414] border border-zinc-800 rounded px-1 py-0.5 text-xs text-zinc-300 focus:outline-none"},/*#__PURE__*/React.createElement("option",{value:"mono"},"Mono"),/*#__PURE__*/React.createElement("option",{value:"stereo"},"Stereo"))),/*#__PURE__*/React.createElement("div",null)),/*#__PURE__*/React.createElement("div",{className:"grid grid-cols-2 gap-2 pt-1"},/*#__PURE__*/React.createElement("button",{onClick:onBounce,disabled:isExporting,title:"Bounce realtime \u2014 file WAV \u0111\u1EA7y \u0111\u1EE7 MIDI + FX Rack + Mastering Chain (ch\u1EA1y l\u1EA1i project th\u1EADt)",className:"w-full py-1 bg-fuchsia-800 hover:bg-fuchsia-700 text-zinc-100 font-bold rounded text-xs flex items-center justify-center gap-1"},/*#__PURE__*/React.createElement("i",{"data-lucide":"radio",className:"w-3 h-3"})," ",isExporting?'...':'Bounce MIDI'),/*#__PURE__*/React.createElement("button",{onClick:onExport,disabled:isExporting,className:"w-full py-1 bg-cyan-700 hover:bg-cyan-600 text-zinc-100 font-bold rounded text-xs flex items-center justify-center gap-1"},/*#__PURE__*/React.createElement("i",{"data-lucide":"download-cloud",className:"w-3 h-3"})," ",isExporting?'...':'Export')))));};// --- Embedded VST GUI (PLAN_MASTERBUS_VST_GUI_EMBED.md) -------------------- +return{hx:Math.max(0,Math.min((canvasRef.current?canvasRef.current.clientWidth:460)-268,st.current.hudPos.hx)),hy:Math.max(0,Math.min((canvasRef.current?canvasRef.current.clientHeight:240)-225,st.current.hudPos.hy))};}if(!sel)return null;const nx=eqproFreqToX(sel.freq,cvW),ny=eqproGainToY(sel.gain,cvH);let hx=nx-130,hy=ny-195;if(hx<8)hx=8;if(hx>cvW-268)hx=cvW-268;if(hy<8)hy=ny+24;return{hx,hy};})();return/*#__PURE__*/React.createElement("div",{className:"space-y-2"},/*#__PURE__*/React.createElement("div",{className:"flex items-center justify-between text-[11px] font-mono"},/*#__PURE__*/React.createElement("div",{className:"flex items-center gap-3"},/*#__PURE__*/React.createElement("span",{className:"text-slate-400"},"Bands: ",/*#__PURE__*/React.createElement("span",{className:"text-teal-300 font-bold"},st.current.bands.length),"/8"),/*#__PURE__*/React.createElement("label",{className:"flex items-center gap-1.5"},/*#__PURE__*/React.createElement("span",{className:"text-slate-400"},"Amount:"),/*#__PURE__*/React.createElement("input",{type:"range",min:0,max:200,value:st.current.amount,onChange:e=>{st.current.amount=parseInt(e.target.value);applyAll(mm=>mm.setAmount(st.current.amount));commit();setTick(t=>t+1);},className:"w-20 h-1 cursor-pointer",style:{accentColor:'#2dd4bf'}}),/*#__PURE__*/React.createElement("span",{className:"text-teal-300 font-bold w-10"},st.current.amount,"%"))),/*#__PURE__*/React.createElement("div",{className:"flex items-center gap-1"},/*#__PURE__*/React.createElement("button",{onClick:()=>{const s=st.current;s.bands=JSON.parse(JSON.stringify(EQPRO_DEFAULT_BANDS));s.selected=null;applyAll(mm=>mm.syncBands(s.bands));commit();setTick(t=>t+1);},className:"px-2 py-1 bg-slate-800 hover:bg-red-900/60 text-slate-300 border border-slate-700 rounded text-[10px]"},"Reset"),/*#__PURE__*/React.createElement("button",{onClick:()=>{const s=st.current;if(s.bands.length>=EQPRO_MAX_BANDS)return;s.bands.push({type:'peaking',freq:1000,gain:0,q:1.0,active:true});s.selected=s.bands.length-1;applyAll(mm=>mm.syncBands(s.bands));commit();setTick(t=>t+1);},className:"px-2 py-1 bg-teal-900/50 hover:bg-teal-800 text-teal-300 border border-teal-700 rounded text-[10px]"},"+ Band"))),/*#__PURE__*/React.createElement("div",{className:"relative"},/*#__PURE__*/React.createElement("canvas",{ref:canvasRef,className:"w-full h-60 block cursor-crosshair rounded-lg border border-slate-800 bg-slate-950",onPointerDown:onDown,onPointerMove:onMove,onPointerUp:onUp,onWheel:onWheel,onDoubleClick:onDblClick}),sel&&hudXY&&/*#__PURE__*/React.createElement("div",{className:"absolute z-10 w-64 rounded-xl p-3 text-[11px] font-mono space-y-2 pointer-events-auto cursor-move",style:{left:hudXY.hx,top:hudXY.hy,background:'rgba(15,23,42,0.94)',border:'1px solid rgba(45,212,191,0.3)',boxShadow:'0 10px 30px rgba(0,0,0,0.8)',backdropFilter:'blur(12px)'},onPointerDown:e=>{const s=st.current;s.dragHud=true;const r=e.currentTarget.getBoundingClientRect();s.hudOffsetX=e.clientX-r.left;s.hudOffsetY=e.clientY-r.top;e.currentTarget.setPointerCapture(e.pointerId);},onPointerMove:e=>{const s=st.current;if(!s.dragHud)return;const cv=canvasRef.current;const w=cv?cv.clientWidth:460;s.hudPos={hx:Math.max(0,Math.min(w-268,e.clientX-s.hudOffsetX-(cv?cv.getBoundingClientRect().left:0))),hy:Math.max(0,e.clientY-s.hudOffsetY-(cv?cv.getBoundingClientRect().top:0))};setTick(t=>t+1);},onPointerUp:e=>{st.current.dragHud=false;try{e.currentTarget.releasePointerCapture(e.pointerId);}catch(err){}}},/*#__PURE__*/React.createElement("div",{className:"flex items-center justify-between border-b border-slate-700/80 pb-1.5"},/*#__PURE__*/React.createElement("div",{className:"flex items-center gap-2"},/*#__PURE__*/React.createElement("span",{className:"w-4 h-4 rounded-full text-slate-950 font-bold flex items-center justify-center text-[10px]",style:{background:hudColor.badge}},selIdx+1),/*#__PURE__*/React.createElement("span",{className:"font-bold text-white uppercase tracking-wider"},"Band ",selIdx+1)),/*#__PURE__*/React.createElement("div",{className:"flex items-center gap-1"},/*#__PURE__*/React.createElement("button",{title:"Bypass band",onClick:()=>{const s=st.current;s.bands[s.selected].active=!s.bands[s.selected].active;applyAll(mm=>mm.setBand(s.selected,{active:s.bands[s.selected].active}));commit();setTick(t=>t+1);},className:`w-5 h-5 rounded flex items-center justify-center text-[10px] ${sel.active?'bg-slate-800 text-slate-400':'bg-amber-600 text-white'}`},/*#__PURE__*/React.createElement("i",{className:"fa-solid fa-power-off"})),/*#__PURE__*/React.createElement("button",{title:"Delete band",onClick:()=>{const s=st.current;s.bands.splice(s.selected,1);s.selected=null;applyAll(mm=>mm.syncBands(s.bands));commit();setTick(t=>t+1);},className:"w-5 h-5 rounded bg-slate-800 hover:bg-red-600 text-slate-400 hover:text-white flex items-center justify-center text-[10px]"},/*#__PURE__*/React.createElement("i",{className:"fa-solid fa-xmark"})))),/*#__PURE__*/React.createElement("div",null,/*#__PURE__*/React.createElement("label",{className:"block text-[9px] text-slate-400 uppercase tracking-widest mb-1"},"Filter Shape"),/*#__PURE__*/React.createElement("select",{value:sel.type,onChange:ev=>{const s=st.current;s.bands[s.selected].type=ev.target.value;applyAll(mm=>mm.setBand(s.selected,{type:ev.target.value}));commit();setTick(t=>t+1);},className:"w-full bg-slate-950 border border-slate-700 text-teal-300 rounded px-2 py-1 text-[11px] outline-none"},['peaking','highpass','lowpass','lowshelf','highshelf','notch','bandpass'].map(t=>/*#__PURE__*/React.createElement("option",{key:t,value:t},t==='peaking'?'Bell / Peaking':t==='highpass'?'Low Cut / High Pass':t==='lowpass'?'High Cut / Low Pass':t==='lowshelf'?'Low Shelf':t==='highshelf'?'High Shelf':t==='notch'?'Notch / Band Stop':'Band Pass')))),/*#__PURE__*/React.createElement("div",{className:"grid grid-cols-3 gap-2 text-center bg-slate-950/80 p-2 rounded-lg border border-slate-800"},/*#__PURE__*/React.createElement("div",null,/*#__PURE__*/React.createElement("div",{className:"text-[9px] text-slate-500"},"FREQ"),/*#__PURE__*/React.createElement("div",{className:"text-teal-300 font-bold text-[11px]"},sel.freq>=1000?(sel.freq/1000).toFixed(2)+' kHz':Math.round(sel.freq)+' Hz')),/*#__PURE__*/React.createElement("div",null,/*#__PURE__*/React.createElement("div",{className:"text-[9px] text-slate-500"},"GAIN"),/*#__PURE__*/React.createElement("div",{className:"text-amber-400 font-bold text-[11px]"},eqproBandHasGain(sel.type)?(sel.gain>0?'+':'')+sel.gain.toFixed(1)+' dB':'0.0 dB')),/*#__PURE__*/React.createElement("div",null,/*#__PURE__*/React.createElement("div",{className:"text-[9px] text-slate-500"},"Q"),/*#__PURE__*/React.createElement("div",{className:"text-purple-400 font-bold text-[11px]"},sel.q.toFixed(1)))),/*#__PURE__*/React.createElement("div",{className:"text-[9px] text-slate-500 text-center"},"Drag center: Freq & Gain · Wings/Wheel: Q · Dbl-click: add/delete"))));};const ExportModal=({open,onClose,exportSettings,setExportSettings,isExporting,onExport,onBounce})=>{if(!open)return null;return/*#__PURE__*/React.createElement("div",{className:"fixed inset-0 z-[300] bg-black/70 backdrop-blur-sm flex items-center justify-center p-6",onClick:onClose},/*#__PURE__*/React.createElement("div",{className:"w-full max-w-2xl bg-slate-900 border border-slate-700 rounded-2xl shadow-2xl overflow-hidden",onClick:e=>e.stopPropagation()},/*#__PURE__*/React.createElement("div",{className:"h-9 bg-slate-800/80 border-b border-slate-700 flex items-center justify-between px-3 select-none"},/*#__PURE__*/React.createElement("span",{className:"text-xs font-bold text-cyan-300 font-mono flex items-center gap-1.5"},/*#__PURE__*/React.createElement("i",{"data-lucide":"download-cloud",className:"w-3.5 h-3.5"})," EXPORT"),/*#__PURE__*/React.createElement("button",{onClick:onClose,className:"text-zinc-400 hover:text-white"},/*#__PURE__*/React.createElement("i",{"data-lucide":"x",className:"w-4 h-4"}))),/*#__PURE__*/React.createElement("div",{className:"p-4 max-h-[72vh] overflow-y-auto space-y-3"},/*#__PURE__*/React.createElement("div",{className:"grid grid-cols-2 gap-2"},/*#__PURE__*/React.createElement("div",null,/*#__PURE__*/React.createElement("label",{className:"block text-[7px] text-zinc-500 font-bold uppercase mb-0.5"},"Nguồn"),/*#__PURE__*/React.createElement("select",{value:exportSettings.source,onChange:e=>setExportSettings(p=>({...p,source:e.target.value})),className:"w-full bg-[#141414] border border-zinc-800 rounded px-1 py-0.5 text-xs text-zinc-300 focus:outline-none"},/*#__PURE__*/React.createElement("option",{value:"project"},"Project (Mix)"),/*#__PURE__*/React.createElement("option",{value:"track_mix"},"Track Selection"),/*#__PURE__*/React.createElement("option",{value:"active_clip"},"Active Clip"),/*#__PURE__*/React.createElement("option",{value:"clip_selection"},"Clip Selection"))),/*#__PURE__*/React.createElement("div",null,/*#__PURE__*/React.createElement("label",{className:"block text-[7px] text-zinc-500 font-bold uppercase mb-0.5"},"Định dạng"),/*#__PURE__*/React.createElement("select",{value:exportSettings.format,onChange:e=>setExportSettings(p=>({...p,format:e.target.value,sampleRate:'44100',bitDepth:'float',quality:'44khz'})),className:"w-full bg-[#141414] border border-zinc-800 rounded px-1 py-0.5 text-xs text-zinc-300 focus:outline-none"},/*#__PURE__*/React.createElement("option",{value:"wav"},"WAV"),/*#__PURE__*/React.createElement("option",{value:"mp3"},"MP3"),/*#__PURE__*/React.createElement("option",{value:"ogg"},"OGG")))),exportSettings.format==='wav'?/*#__PURE__*/React.createElement("div",{className:"grid grid-cols-2 gap-2"},/*#__PURE__*/React.createElement("div",null,/*#__PURE__*/React.createElement("label",{className:"block text-[7px] text-zinc-500 font-bold uppercase mb-0.5"},"SR (Hz)"),/*#__PURE__*/React.createElement("select",{value:exportSettings.sampleRate,onChange:e=>setExportSettings(p=>({...p,sampleRate:e.target.value})),className:"w-full bg-[#141414] border border-zinc-800 rounded px-1 py-0.5 text-xs text-zinc-300 focus:outline-none"},/*#__PURE__*/React.createElement("option",{value:"22500"},"22500"),/*#__PURE__*/React.createElement("option",{value:"44100"},"44100"))),/*#__PURE__*/React.createElement("div",null,/*#__PURE__*/React.createElement("label",{className:"block text-[7px] text-zinc-500 font-bold uppercase mb-0.5"},"Bit"),/*#__PURE__*/React.createElement("select",{value:exportSettings.bitDepth,onChange:e=>setExportSettings(p=>({...p,bitDepth:e.target.value})),className:"w-full bg-[#141414] border border-zinc-800 rounded px-1 py-0.5 text-xs text-zinc-300 focus:outline-none"},/*#__PURE__*/React.createElement("option",{value:"8"},"8"),/*#__PURE__*/React.createElement("option",{value:"16"},"16"),/*#__PURE__*/React.createElement("option",{value:"24"},"24"),/*#__PURE__*/React.createElement("option",{value:"float"},"32 float")))):/*#__PURE__*/React.createElement("div",{className:"grid grid-cols-2 gap-2"},/*#__PURE__*/React.createElement("div",null,/*#__PURE__*/React.createElement("label",{className:"block text-[7px] text-zinc-500 font-bold uppercase mb-0.5"},"Chất lượng"),/*#__PURE__*/React.createElement("select",{value:exportSettings.quality,onChange:e=>setExportSettings(p=>({...p,quality:e.target.value})),className:"w-full bg-[#141414] border border-zinc-800 rounded px-1 py-0.5 text-xs text-zinc-300 focus:outline-none"},/*#__PURE__*/React.createElement("option",{value:"44khz"},"44kHz"),/*#__PURE__*/React.createElement("option",{value:"lossless"},"Lossless"))),/*#__PURE__*/React.createElement("div",null)),/*#__PURE__*/React.createElement("div",{className:"grid grid-cols-2 gap-2"},/*#__PURE__*/React.createElement("div",null,/*#__PURE__*/React.createElement("label",{className:"block text-[7px] text-zinc-500 font-bold uppercase mb-0.5"},"Kênh"),/*#__PURE__*/React.createElement("select",{value:exportSettings.channels,onChange:e=>setExportSettings(p=>({...p,channels:e.target.value})),className:"w-full bg-[#141414] border border-zinc-800 rounded px-1 py-0.5 text-xs text-zinc-300 focus:outline-none"},/*#__PURE__*/React.createElement("option",{value:"mono"},"Mono"),/*#__PURE__*/React.createElement("option",{value:"stereo"},"Stereo"))),/*#__PURE__*/React.createElement("div",null)),/*#__PURE__*/React.createElement("div",{className:"grid grid-cols-2 gap-2 pt-1"},/*#__PURE__*/React.createElement("button",{onClick:onBounce,disabled:isExporting,title:"Bounce realtime — file WAV đầy đủ MIDI + FX Rack + Mastering Chain (chạy lại project thật)",className:"w-full py-1 bg-fuchsia-800 hover:bg-fuchsia-700 text-zinc-100 font-bold rounded text-xs flex items-center justify-center gap-1"},/*#__PURE__*/React.createElement("i",{"data-lucide":"radio",className:"w-3 h-3"})," ",isExporting?'...':'Bounce MIDI'),/*#__PURE__*/React.createElement("button",{onClick:onExport,disabled:isExporting,className:"w-full py-1 bg-cyan-700 hover:bg-cyan-600 text-zinc-100 font-bold rounded text-xs flex items-center justify-center gap-1"},/*#__PURE__*/React.createElement("i",{"data-lucide":"download-cloud",className:"w-3 h-3"})," ",isExporting?'...':'Export')))));};// --- Embedded VST GUI (PLAN_MASTERBUS_VST_GUI_EMBED.md) -------------------- // Frame-capture + input relay: hiển thị native GUI qua HTTP /frame (~10fps), // gửi pointer/key về bridge qua /input. Dùng chung MasteringModal + FXRackModal. // url = embed_url từ API fx-gui open (embed:true); onClose khi user đóng; @@ -755,17 +756,24 @@ React.useEffect(()=>{let alive=true;const maybeShow=()=>{const r=screenRectRef.c // re-anchors over the panel on scroll/drag/resize. Idempotent: the // bridge skips SetWindowPos/resize when nothing moved. try{fetch(url+'/show',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({rect:r})}).catch(()=>{});}catch(e){}}};const refresh=()=>{const box=boxRef.current;if(!box)return;const r=box.getBoundingClientRect();if(r.width<4||r.height<4)return;try{const tw=window.__TAURI__&&window.__TAURI__.window;if(tw&&tw.getCurrentWindow){Promise.all([tw.getCurrentWindow().innerPosition(),tw.getCurrentWindow().scaleFactor()]).then(([pos,sf])=>{if(!alive||!boxRef.current)return;const rb=boxRef.current.getBoundingClientRect();screenRectRef.current={x:Math.round(pos.x+rb.left*sf),y:Math.round(pos.y+rb.top*sf),w:Math.round(rb.width*sf),h:Math.round(rb.height*sf)};maybeShow();}).catch(()=>{if(!alive||!boxRef.current)return;const rb=boxRef.current.getBoundingClientRect();screenRectRef.current={x:Math.round((window.screenX||0)+rb.left),y:Math.round((window.screenY||0)+rb.top),w:Math.round(rb.width),h:Math.round(rb.height)};maybeShow();});}else{screenRectRef.current={x:Math.round((window.screenX||0)+r.left),y:Math.round((window.screenY||0)+r.top),w:Math.round(r.width),h:Math.round(r.height)};maybeShow();}}catch(e){}};refresh();const iv=setInterval(refresh,500);return()=>{alive=false;clearInterval(iv);};// eslint-disable-next-line react-hooks/exhaustive-deps -},[url]);const pt=e=>{const box=boxRef.current,img=imgRef.current;if(!box||!img||!img.naturalWidth||!img.naturalHeight)return null;const r=box.getBoundingClientRect();if(r.width===0||r.height===0)return null;return{x:Math.round((e.clientX-r.left)/r.width*img.naturalWidth),y:Math.round((e.clientY-r.top)/r.height*img.naturalHeight)};};const handle=e=>{const p=pt(e);if(!p)return;post({type:e.type==='mousedown'?'mousedown':e.type==='mouseup'?'mouseup':'mousemove',x:p.x,y:p.y,button:e.button,buttons:e.buttons,rect:screenRectRef.current||undefined});};const close=()=>{try{fetch(url+'/close',{method:'POST'}).catch(()=>{});}catch(e){}onClose&&onClose();};return/*#__PURE__*/React.createElement("div",{className:"relative w-full h-full flex flex-col"},/*#__PURE__*/React.createElement("div",{className:"flex items-center justify-between px-3 py-1.5 bg-slate-900/80 border border-slate-800 rounded-t-lg shrink-0"},/*#__PURE__*/React.createElement("span",{className:"text-[10px] text-violet-300 font-mono"},"VST GUI \u2014 nh\xFAng (frame-capture \xB7 ~10fps)"),/*#__PURE__*/React.createElement("div",{className:"flex items-center gap-2"},dead&&/*#__PURE__*/React.createElement("span",{className:"text-[9px] text-red-400 font-mono"},"bridge m\u1EA5t k\u1EBFt n\u1ED1i"),/*#__PURE__*/React.createElement("button",{onClick:close,className:"px-2 py-0.5 bg-red-900/60 hover:bg-red-800 text-red-100 text-[10px] font-semibold rounded transition",title:"\u0110\xF3ng GUI v\xE0 tr\u1EA3 v\u1EC1 graph"},"\u2715 \u0110\xF3ng GUI"))),/*#__PURE__*/React.createElement("div",{ref:boxRef,tabIndex:0,className:"flex-1 relative bg-slate-950 border border-slate-800 rounded-b-lg overflow-hidden outline-none",onMouseDown:handle,onMouseUp:handle,onMouseMove:handle,onMouseLeave:()=>post({type:'mouseup',x:-1,y:-1,button:0}),onWheel:e=>{const p=pt(e);if(p)post({type:'wheel',x:p.x,y:p.y,deltaY:e.deltaY,rect:screenRectRef.current||undefined});},onKeyDown:e=>{e.preventDefault();post({type:'keydown',keyCode:e.keyCode||e.which});},onKeyUp:e=>{e.preventDefault();post({type:'keyup',keyCode:e.keyCode||e.which});}},/*#__PURE__*/React.createElement("img",{ref:imgRef,alt:"VST GUI",className:"w-full h-full object-contain select-none pointer-events-none",draggable:false})));};const vstRow=(s,idx,toggleV,changeV,uploadV,moveV,removeV,fxl,chainLen,openGui,showCarla=true,activeIdx=-1,onSelect=null)=>/*#__PURE__*/React.createElement("div",{key:idx,onClick:()=>onSelect&&onSelect(s,idx),className:`flex items-center gap-2 bg-slate-900/60 border rounded-lg px-2 py-1.5 flex-wrap cursor-pointer transition-all ${activeIdx===idx?'border-teal-400 bg-slate-800/80':'border-slate-800 hover:border-slate-600'}`},/*#__PURE__*/React.createElement("button",{onClick:e=>{e.stopPropagation();toggleV(idx);},className:`w-4 h-4 rounded-full flex items-center justify-center text-[9px] font-bold shrink-0 ${!s.bypass?'bg-teal-500 text-slate-950':'bg-slate-700 text-slate-300'}`,title:s.bypass?'Bypass':'Active'},/*#__PURE__*/React.createElement("i",{"data-lucide":"power",className:"w-2.5 h-2.5"})),/*#__PURE__*/React.createElement("span",{className:"text-[10px] font-bold text-slate-300 font-mono w-6 shrink-0"},idx+1),/*#__PURE__*/React.createElement("select",{value:s.path||'',onClick:e=>e.stopPropagation(),onChange:e=>changeV(idx,e.target.value),className:"flex-1 min-w-[200px] bg-slate-950 border border-slate-700 text-teal-300 rounded px-2 py-1 text-[11px] outline-none focus:border-teal-500"},/*#__PURE__*/React.createElement("option",{value:""},"\u2014 Ch\u1ECDn VST FX \u2014"),(fxl||[]).map(f=>/*#__PURE__*/React.createElement("option",{key:f.path,value:f.path},f.name||f.id))),/*#__PURE__*/React.createElement("span",{className:`text-[9px] font-mono ${s.preset_b64?'text-emerald-400':'text-slate-600'}`},s.preset_b64?'✓ preset':'no preset'),/*#__PURE__*/React.createElement("button",{onClick:e=>{e.stopPropagation();uploadV(idx);},className:"px-2 py-1 bg-slate-800 hover:bg-slate-700 text-slate-300 text-[10px] font-semibold rounded transition",title:"Upload .vstpreset (Save preset)"},"Preset"),openGui&&/*#__PURE__*/React.createElement("button",{onClick:e=>{e.stopPropagation();openGui(s,idx);},disabled:!s.path,className:"px-2 py-1 bg-violet-800 hover:bg-violet-700 disabled:opacity-30 text-violet-100 text-[10px] font-semibold rounded transition",title:"M\u1EDF GUI c\u1EE7a VST (ch\u1EC9nh th\xF4ng s\u1ED1 tr\u1EF1c ti\u1EBFp)"},/*#__PURE__*/React.createElement("i",{"data-lucide":"monitor",className:"w-3 h-3"})," GUI"),showCarla&&/*#__PURE__*/React.createElement("button",{onClick:e=>{e.stopPropagation();if(!s.path){window.showToast&&window.showToast('Chọn VST FX trước','warning');return;}window.SonicAPI.openInCarla(s.name||s.path,s.path).then(r=>{if(r&&r.success)window.showToast&&window.showToast('Đã mở Carla với '+(s.name||s.path)+' — chỉnh âm trong Carla rồi Save preset','success');else window.showToast&&window.showToast('Không mở được Carla','error');}).catch(err=>window.showToast&&window.showToast('Lỗi mở Carla: '+(err.message||err),'error'));},className:"px-2 py-1 bg-teal-800 hover:bg-teal-700 text-teal-100 text-[10px] font-semibold rounded transition",title:"M\u1EDF native GUI trong Carla"},"Carla"),/*#__PURE__*/React.createElement("button",{onClick:e=>{e.stopPropagation();moveV(idx,-1);},disabled:idx===0,className:"w-6 h-6 bg-slate-800 hover:bg-slate-700 text-slate-300 rounded text-xs disabled:opacity-30",title:"L\xEAn"},/*#__PURE__*/React.createElement("i",{"data-lucide":"chevron-up",className:"w-3 h-3"})),/*#__PURE__*/React.createElement("button",{onClick:e=>{e.stopPropagation();moveV(idx,1);},disabled:idx===chainLen-1,className:"w-6 h-6 bg-slate-800 hover:bg-slate-700 text-slate-300 rounded text-xs disabled:opacity-30",title:"Xu\u1ED1ng"},/*#__PURE__*/React.createElement("i",{"data-lucide":"chevron-down",className:"w-3 h-3"})),/*#__PURE__*/React.createElement("button",{onClick:e=>{e.stopPropagation();removeV(idx);},className:"text-slate-600 hover:text-red-400 text-xs px-0.5",title:"X\xF3a slot"},/*#__PURE__*/React.createElement("i",{"data-lucide":"x",className:"w-3 h-3"})));// ── VST FX Plugin Picker (spec vst_fx_panel_integration.md §II) ────────── +},[url]);const pt=e=>{const box=boxRef.current,img=imgRef.current;if(!box||!img||!img.naturalWidth||!img.naturalHeight)return null;const r=box.getBoundingClientRect();if(r.width===0||r.height===0)return null;return{x:Math.round((e.clientX-r.left)/r.width*img.naturalWidth),y:Math.round((e.clientY-r.top)/r.height*img.naturalHeight)};};const handle=e=>{const p=pt(e);if(!p)return;post({type:e.type==='mousedown'?'mousedown':e.type==='mouseup'?'mouseup':'mousemove',x:p.x,y:p.y,button:e.button,buttons:e.buttons,rect:screenRectRef.current||undefined});};const close=()=>{try{fetch(url+'/close',{method:'POST'}).catch(()=>{});}catch(e){}onClose&&onClose();};return/*#__PURE__*/React.createElement("div",{className:"relative w-full h-full flex flex-col"},/*#__PURE__*/React.createElement("div",{className:"flex items-center justify-between px-3 py-1.5 bg-slate-900/80 border border-slate-800 rounded-t-lg shrink-0"},/*#__PURE__*/React.createElement("span",{className:"text-[10px] text-violet-300 font-mono"},"VST GUI — nhúng (frame-capture · ~10fps)"),/*#__PURE__*/React.createElement("div",{className:"flex items-center gap-2"},dead&&/*#__PURE__*/React.createElement("span",{className:"text-[9px] text-red-400 font-mono"},"bridge mất kết nối"),/*#__PURE__*/React.createElement("button",{onClick:close,className:"px-2 py-0.5 bg-red-900/60 hover:bg-red-800 text-red-100 text-[10px] font-semibold rounded transition",title:"Đóng GUI và trả về graph"},"✕ Đóng GUI"))),/*#__PURE__*/React.createElement("div",{ref:boxRef,tabIndex:0,className:"flex-1 relative bg-slate-950 border border-slate-800 rounded-b-lg overflow-hidden outline-none",onMouseDown:handle,onMouseUp:handle,onMouseMove:handle,onMouseLeave:()=>post({type:'mouseup',x:-1,y:-1,button:0}),onWheel:e=>{const p=pt(e);if(p)post({type:'wheel',x:p.x,y:p.y,deltaY:e.deltaY,rect:screenRectRef.current||undefined});},onKeyDown:e=>{e.preventDefault();post({type:'keydown',keyCode:e.keyCode||e.which});},onKeyUp:e=>{e.preventDefault();post({type:'keyup',keyCode:e.keyCode||e.which});}},/*#__PURE__*/React.createElement("img",{ref:imgRef,alt:"VST GUI",className:"w-full h-full object-contain select-none pointer-events-none",draggable:false})));};const vstRow=(s,idx,toggleV,changeV,uploadV,moveV,removeV,fxl,chainLen,openGui,showCarla=true,activeIdx=-1,onSelect=null)=>/*#__PURE__*/React.createElement("div",{key:idx,onClick:()=>onSelect&&onSelect(s,idx),className:`flex items-center gap-2 bg-slate-900/60 border rounded-lg px-2 py-1.5 flex-wrap cursor-pointer transition-all ${activeIdx===idx?'border-teal-400 bg-slate-800/80':'border-slate-800 hover:border-slate-600'}`},/*#__PURE__*/React.createElement("button",{onClick:e=>{e.stopPropagation();toggleV(idx);},className:`w-4 h-4 rounded-full flex items-center justify-center text-[9px] font-bold shrink-0 ${!s.bypass?'bg-teal-500 text-slate-950':'bg-slate-700 text-slate-300'}`,title:s.bypass?'Bypass':'Active'},/*#__PURE__*/React.createElement("i",{"data-lucide":"power",className:"w-2.5 h-2.5"})),/*#__PURE__*/React.createElement("span",{className:"text-[10px] font-bold text-slate-300 font-mono w-6 shrink-0"},idx+1),/*#__PURE__*/React.createElement("select",{value:s.path||'',onClick:e=>e.stopPropagation(),onChange:e=>changeV(idx,e.target.value),className:"flex-1 min-w-[200px] bg-slate-950 border border-slate-700 text-teal-300 rounded px-2 py-1 text-[11px] outline-none focus:border-teal-500"},/*#__PURE__*/React.createElement("option",{value:""},"— Chọn VST FX —"),(fxl||[]).map(f=>/*#__PURE__*/React.createElement("option",{key:f.path,value:f.path},f.name||f.id))),/*#__PURE__*/React.createElement("span",{className:`text-[9px] font-mono ${s.preset_b64?'text-emerald-400':'text-slate-600'}`},s.preset_b64?'✓ preset':'no preset'),/*#__PURE__*/React.createElement("button",{onClick:e=>{e.stopPropagation();uploadV(idx);},className:"px-2 py-1 bg-slate-800 hover:bg-slate-700 text-slate-300 text-[10px] font-semibold rounded transition",title:"Upload .vstpreset (Save preset)"},"Preset"),openGui&&/*#__PURE__*/React.createElement("button",{onClick:e=>{e.stopPropagation();openGui(s,idx);},disabled:!s.path,className:"px-2 py-1 bg-violet-800 hover:bg-violet-700 disabled:opacity-30 text-violet-100 text-[10px] font-semibold rounded transition",title:"Mở GUI của VST (chỉnh thông số trực tiếp)"},/*#__PURE__*/React.createElement("i",{"data-lucide":"monitor",className:"w-3 h-3"})," GUI"),showCarla&&/*#__PURE__*/React.createElement("button",{onClick:e=>{e.stopPropagation();if(!s.path){window.showToast&&window.showToast('Chọn VST FX trước','warning');return;}window.SonicAPI.openInCarla(s.name||s.path,s.path).then(r=>{if(r&&r.success)window.showToast&&window.showToast('Đã mở Carla với '+(s.name||s.path)+' — chỉnh âm trong Carla rồi Save preset','success');else window.showToast&&window.showToast('Không mở được Carla','error');}).catch(err=>window.showToast&&window.showToast('Lỗi mở Carla: '+(err.message||err),'error'));},className:"px-2 py-1 bg-teal-800 hover:bg-teal-700 text-teal-100 text-[10px] font-semibold rounded transition",title:"Mở native GUI trong Carla"},"Carla"),/*#__PURE__*/React.createElement("button",{onClick:e=>{e.stopPropagation();moveV(idx,-1);},disabled:idx===0,className:"w-6 h-6 bg-slate-800 hover:bg-slate-700 text-slate-300 rounded text-xs disabled:opacity-30",title:"Lên"},/*#__PURE__*/React.createElement("i",{"data-lucide":"chevron-up",className:"w-3 h-3"})),/*#__PURE__*/React.createElement("button",{onClick:e=>{e.stopPropagation();moveV(idx,1);},disabled:idx===chainLen-1,className:"w-6 h-6 bg-slate-800 hover:bg-slate-700 text-slate-300 rounded text-xs disabled:opacity-30",title:"Xuống"},/*#__PURE__*/React.createElement("i",{"data-lucide":"chevron-down",className:"w-3 h-3"})),/*#__PURE__*/React.createElement("button",{onClick:e=>{e.stopPropagation();removeV(idx);},className:"text-slate-600 hover:text-red-400 text-xs px-0.5",title:"Xóa slot"},/*#__PURE__*/React.createElement("i",{"data-lucide":"x",className:"w-3 h-3"})));// ── VST FX Plugin Picker (spec vst_fx_panel_integration.md §II) ────────── // Modal chọn VST FX theo category (heuristic từ backend list_fx.category). // Dùng chung FXRackModal + MasteringModal: [+] → picker → chèn VST card. -const VST_FX_CATEGORIES=[{id:'all',label:'Tất cả'},{id:'equalizer',label:'Equalizers / Dynamic EQ'},{id:'reverb_delay',label:'Reverbs & Delays'},{id:'comp_limiter',label:'Compressors & Limiters'},{id:'distortion',label:'Distortion / Saturation'},{id:'utility',label:'Utility'}];const VstPluginPicker=({open,onClose,plugins,onPick})=>{const[cat,setCat]=React.useState('all');React.useEffect(()=>{if(open)setCat('all');},[open]);if(!open)return null;const list=(plugins||[]).filter(p=>cat==='all'||(p.category||'utility')===cat);return/*#__PURE__*/React.createElement("div",{className:"fixed inset-0 z-[125] bg-black/80 backdrop-blur-sm flex items-center justify-center p-4",onClick:onClose},/*#__PURE__*/React.createElement("div",{className:"w-full max-w-2xl bg-slate-900 border border-slate-700 rounded-2xl p-5 space-y-4 shadow-2xl max-h-[80vh] flex flex-col",onClick:e=>e.stopPropagation()},/*#__PURE__*/React.createElement("div",{className:"flex items-center justify-between border-b border-slate-800 pb-3"},/*#__PURE__*/React.createElement("h3",{className:"text-xs font-bold text-white uppercase tracking-wider font-mono"},"CH\u1ECCN VST FX \u2014 PLUGIN PICKER"),/*#__PURE__*/React.createElement("button",{onClick:onClose,className:"text-slate-400 hover:text-white"},/*#__PURE__*/React.createElement("i",{"data-lucide":"x",className:"w-4 h-4"}))),/*#__PURE__*/React.createElement("div",{className:"flex flex-wrap gap-1.5 shrink-0"},VST_FX_CATEGORIES.map(c=>/*#__PURE__*/React.createElement("button",{key:c.id,onClick:()=>setCat(c.id),className:`px-2.5 py-1 rounded text-[10px] font-semibold transition ${cat===c.id?'bg-teal-700 text-white':'bg-slate-800 hover:bg-slate-700 text-slate-300'}`},c.label))),/*#__PURE__*/React.createElement("div",{className:"flex-1 overflow-y-auto oz-scrollbar grid grid-cols-2 gap-2"},list.length===0&&/*#__PURE__*/React.createElement("div",{className:"col-span-2 text-[11px] text-slate-500 font-mono py-10 text-center"},"Kh\xF4ng c\xF3 VST FX trong m\u1EE5c n\xE0y."),list.map(f=>/*#__PURE__*/React.createElement("button",{key:f.path,onClick:()=>{onPick(f);onClose();},className:"p-2 bg-slate-950 hover:bg-slate-800 border border-slate-800 rounded-lg text-left space-y-0.5 transition-colors"},/*#__PURE__*/React.createElement("div",{className:"text-[11px] font-bold text-teal-300 flex items-center gap-1.5"},/*#__PURE__*/React.createElement("i",{"data-lucide":"plug",className:"w-3 h-3"})," ",f.name||f.id),/*#__PURE__*/React.createElement("div",{className:"text-[9px] text-slate-500 font-mono truncate"},f.path))))));};// GUI embed state survives FXRackModal unmount so the native window +const VST_FX_CATEGORIES=[{id:'all',label:'Tất cả'},{id:'equalizer',label:'Equalizers / Dynamic EQ'},{id:'reverb_delay',label:'Reverbs & Delays'},{id:'comp_limiter',label:'Compressors & Limiters'},{id:'distortion',label:'Distortion / Saturation'},{id:'utility',label:'Utility'}];const VstPluginPicker=({open,onClose,plugins,onPick})=>{const[cat,setCat]=React.useState('all');React.useEffect(()=>{if(open)setCat('all');},[open]);if(!open)return null;const list=(plugins||[]).filter(p=>cat==='all'||(p.category||'utility')===cat);return/*#__PURE__*/React.createElement("div",{className:"fixed inset-0 z-[125] bg-black/80 backdrop-blur-sm flex items-center justify-center p-4",onClick:onClose},/*#__PURE__*/React.createElement("div",{className:"w-full max-w-2xl bg-slate-900 border border-slate-700 rounded-2xl p-5 space-y-4 shadow-2xl max-h-[80vh] flex flex-col",onClick:e=>e.stopPropagation()},/*#__PURE__*/React.createElement("div",{className:"flex items-center justify-between border-b border-slate-800 pb-3"},/*#__PURE__*/React.createElement("h3",{className:"text-xs font-bold text-white uppercase tracking-wider font-mono"},"CHỌN VST FX — PLUGIN PICKER"),/*#__PURE__*/React.createElement("button",{onClick:onClose,className:"text-slate-400 hover:text-white"},/*#__PURE__*/React.createElement("i",{"data-lucide":"x",className:"w-4 h-4"}))),/*#__PURE__*/React.createElement("div",{className:"flex flex-wrap gap-1.5 shrink-0"},VST_FX_CATEGORIES.map(c=>/*#__PURE__*/React.createElement("button",{key:c.id,onClick:()=>setCat(c.id),className:`px-2.5 py-1 rounded text-[10px] font-semibold transition ${cat===c.id?'bg-teal-700 text-white':'bg-slate-800 hover:bg-slate-700 text-slate-300'}`},c.label))),/*#__PURE__*/React.createElement("div",{className:"flex-1 overflow-y-auto oz-scrollbar grid grid-cols-2 gap-2"},list.length===0&&/*#__PURE__*/React.createElement("div",{className:"col-span-2 text-[11px] text-slate-500 font-mono py-10 text-center"},"Không có VST FX trong mục này."),list.map(f=>/*#__PURE__*/React.createElement("button",{key:f.path,onClick:()=>{onPick(f);onClose();},className:"p-2 bg-slate-950 hover:bg-slate-800 border border-slate-800 rounded-lg text-left space-y-0.5 transition-colors"},/*#__PURE__*/React.createElement("div",{className:"text-[11px] font-bold text-teal-300 flex items-center gap-1.5"},/*#__PURE__*/React.createElement("i",{"data-lucide":"plug",className:"w-3 h-3"})," ",f.name||f.id),/*#__PURE__*/React.createElement("div",{className:"text-[9px] text-slate-500 font-mono truncate"},f.path))))));};// GUI embed state survives FXRackModal unmount so the native window // re-shows automatically when the rack is reopened (close/reopen bug). -let _persistFxGuiOpen=null;const FXRackModal=({track,onUpdateTrack,onClose})=>{const[activeType,setActiveType]=React.useState('eq');const[addModuleOpen,setAddModuleOpen]=React.useState(false);const dragChainIndexRef=React.useRef(null);// Wave Observer scope state (unified_fx_rack_panel_update.md §III.3) +let _persistFxGuiOpen=null;// Track id whose rack owns the currently-open embedded GUI (for save). +let _persistFxGuiTrackId=null;// Latest preset_b64 captured from each plugin's embedded GUI (poll /preset) +// - merged into the project on save so knob tweaks survive reload. +let _capturedPresetByPath={};const FXRackModal=({track,onUpdateTrack,onClose})=>{const[activeType,setActiveType]=React.useState('eq');const[addModuleOpen,setAddModuleOpen]=React.useState(false);const dragChainIndexRef=React.useRef(null);// Wave Observer scope state (unified_fx_rack_panel_update.md §III.3) const[scopeChannel,setScopeChannel]=React.useState('stereo');const[scopeMode,setScopeMode]=React.useState('waveform');const[scopeDuration,setScopeDuration]=React.useState(2.0);const[scopeZoom,setScopeZoom]=React.useState(0);const[scopePaused,setScopePaused]=React.useState(false);const scopeCanvasRef=React.useRef(null);const scopeMeterLRef=React.useRef(null);const scopeMeterRRef=React.useRef(null);const eqCurveRef=React.useRef(null);const scopeStateRef=React.useRef({L:null,R:null,head:0,len:0,tmpL:null,tmpR:null,freq:null});// VST FX (native_bridge --render-fx) — list VST3 effect plugins + preview const[fxList,setFxList]=React.useState([]);React.useEffect(()=>{if(window.SonicAPI&&window.SonicAPI.listFx){window.SonicAPI.listFx().then(d=>setFxList(d&&d.plugins||[])).catch(()=>setFxList([]));}},[track&&track.id]);const previewAudioRef=React.useRef(null);const[vstBypass,setVstBypass]=React.useState(!!(track&&track.vstFxBypass));const[activeVstIdx,setActiveVstIdx]=React.useState(-1);const[vstPickerOpen,setVstPickerOpen]=React.useState(false);if(!track)return null;const chain=track.fxChain||[];// ── VST FX chain (native_bridge --render-fx, áp dụng khi Export/Offline render) ── const vstChain=track.vstFxChain||[];const setVstChain=next=>{if(onUpdateTrack)onUpdateTrack(track.id,{vstFxChain:next,vstFxBypass:vstBypass});};// Embedded VST GUI state (PLAN_MASTERBUS_VST_GUI_EMBED.md Phase 3) const[fxGuiOpen,setFxGuiOpenState]=React.useState(_persistFxGuiOpen);// { path, url } | null -const setFxGuiOpen=v=>{_persistFxGuiOpen=v;setFxGuiOpenState(v);};const fxGuiOpenRef=React.useRef(null);fxGuiOpenRef.current=fxGuiOpen;const closeFxGui=()=>{const g=fxGuiOpenRef.current;if(g){try{fetch(g.url+'/hide',{method:'POST'}).catch(()=>{});}catch(e){}}setFxGuiOpen(null);};React.useEffect(()=>()=>{const g=fxGuiOpenRef.current;if(g){try{fetch(g.url+'/hide',{method:'POST'}).catch(()=>{});}catch(e){}}},[]);const toggleVst=idx=>setVstChain(vstChain.map((s,i)=>i===idx?{...s,bypass:!s.bypass}:s));const removeVst=idx=>{const rem=vstChain[idx];if(rem&&fxGuiOpen&&fxGuiOpen.path===rem.path)closeFxGui();if(idx===activeVstIdx)setActiveVstIdx(-1);setVstChain(vstChain.filter((_,i)=>i!==idx));};const moveVst=(idx,dir)=>{const j=idx+dir;if(j<0||j>=vstChain.length)return;const next=[...vstChain];const mv=next.splice(idx,1)[0];next.splice(j,0,mv);setVstChain(next);};const openVstGui=(s,idx)=>{if(!s||!s.path){window.showToast&&window.showToast('Chọn VST FX trước','warning');return;}if(fxGuiOpen)closeFxGui();if(idx!==undefined)setActiveVstIdx(idx);if(!window.SonicAPI||!window.SonicAPI.openFxGui){window.showToast&&window.showToast('Máy này không hỗ trợ mở GUI VST','warning');return;}window.SonicAPI.openFxGui({path:s.path,name:s.name||s.path,embed:true}).then(r=>{if(r&&r.embed_url)setFxGuiOpen({path:s.path,url:r.embed_url});else if(r&&r.already_running)window.showToast&&window.showToast('GUI của plugin này đang mở sẵn (cửa sổ ngoài)','info');else window.showToast&&window.showToast('Không mở được GUI embed','error');}).catch(err=>window.showToast&&window.showToast('Lỗi mở GUI: '+(err.message||err),'error'));};const addVst=path=>{const fx=(fxList||[]).find(f=>f.path===path);if(!fx)return;const next=[...vstChain,{type:'vst3',path:fx.path,name:fx.name||fx.id,preset_b64:'',bypass:false}];setVstChain(next);setActiveVstIdx(next.length-1);};const changeVstPlugin=(idx,path)=>{const fx=(fxList||[]).find(f=>f.path===path);setVstChain(vstChain.map((s,i)=>i===idx?{...s,path,name:fx?fx.name||fx.id:s.name,preset_b64:''}:s));};const uploadVstPreset=idx=>{const inp=document.createElement('input');inp.type='file';inp.accept='.vstpreset,.fxp,.fxb,.dspreset';inp.onchange=()=>{const f=inp.files&&inp.files[0];if(!f)return;const reader=new FileReader();reader.onload=()=>{const b64=String(reader.result||'').split(',')[1]||'';setVstChain(vstChain.map((s,i)=>i===idx?{...s,preset_b64:b64}:s));window.showToast&&window.showToast('Đã gắn preset .vstpreset vào slot '+(idx+1),'success');};reader.readAsDataURL(f);};inp.click();};const previewFx=async()=>{try{if(previewAudioRef.current){previewAudioRef.current.pause();previewAudioRef.current=null;}if(!window.__renderProjectPreview){window.showToast&&window.showToast('Không có hàm render preview','warning');return;}window.showToast&&window.showToast('Đang render offline (bridge)...','info');const res=await window.__renderProjectPreview();const au=new Audio((window.API_BASE_URL||'')+res.url);previewAudioRef.current=au;au.onended=()=>{previewAudioRef.current=null;};au.play().then(()=>window.showToast&&window.showToast('Preview offline — âm thật = âm export (VST FX)','success')).catch(()=>{});}catch(e){/* toast ở __renderProjectPreview */}};const setChain=next=>{if(onUpdateTrack)onUpdateTrack(track.id,{fxChain:next});if(window.__rebuildTrackFxGraph)window.__rebuildTrackFxGraph(track.id);};const paramsOf=m=>({...(TRACK_FX_DEFAULTS[m.type]||{}),...(m.params||{})});const setParams=(idx,patch)=>{const next=chain.map((m,i)=>i===idx?{...m,params:{...paramsOf(m),...patch}}:m);setChain(next);};const toggleMod=idx=>{const next=chain.map((m,i)=>i===idx?{...m,active:!(m.active!==false)}:m);setChain(next);};const removeMod=idx=>setChain(chain.filter((_,i)=>i!==idx));const addMod=type=>{const def=TRACK_FX_DEFAULTS[type]||{};// Deep-clone default params so each chain entry owns its data (bands array +const setFxGuiOpen=v=>{_persistFxGuiOpen=v;_persistFxGuiTrackId=v?track&&track.id:null;setFxGuiOpenState(v);};const fxGuiOpenRef=React.useRef(null);fxGuiOpenRef.current=fxGuiOpen;const closeFxGui=()=>{const g=fxGuiOpenRef.current;if(g){try{fetch(g.url+'/hide',{method:'POST'}).catch(()=>{});}catch(e){}}setFxGuiOpen(null);if(onUpdateTrack&&track)onUpdateTrack(track.id,{vstGuiOpenPath:null,vstGuiOpenName:null});};React.useEffect(()=>()=>{const g=fxGuiOpenRef.current;if(g){try{fetch(g.url+'/hide',{method:'POST'}).catch(()=>{});}catch(e){}}},[]);// Capture GUI knob tweaks while the embedded GUI is open (bridge /preset). +React.useEffect(()=>{if(!fxGuiOpen||!fxGuiOpen.url)return;const iv=setInterval(()=>{fetch(fxGuiOpen.url+'/preset').then(r=>r.json()).then(d=>{if(d&&d.preset_b64)_capturedPresetByPath[fxGuiOpen.path]=d.preset_b64;}).catch(()=>{});},1500);return()=>clearInterval(iv);// eslint-disable-next-line react-hooks/exhaustive-deps +},[fxGuiOpen]);// Reopen the saved GUI when the rack is mounted after a project restore. +React.useEffect(()=>{if(!track||!track.vstGuiOpenPath||fxGuiOpen)return;const s=(track.vstFxChain||[]).find(x=>x.path===track.vstGuiOpenPath);if(!s||!window.SonicAPI||!window.SonicAPI.openFxGui)return;window.SonicAPI.openFxGui({path:s.path,name:s.name||s.path,embed:true}).then(r=>{if(r&&r.embed_url)setFxGuiOpen({path:s.path,url:r.embed_url});}).catch(()=>{});// eslint-disable-next-line react-hooks/exhaustive-deps +},[track&&track.id,track&&track.vstGuiOpenPath]);const toggleVst=idx=>setVstChain(vstChain.map((s,i)=>i===idx?{...s,bypass:!s.bypass}:s));const removeVst=idx=>{const rem=vstChain[idx];if(rem&&fxGuiOpen&&fxGuiOpen.path===rem.path)closeFxGui();if(rem)delete _capturedPresetByPath[rem.path];if(idx===activeVstIdx)setActiveVstIdx(-1);setVstChain(vstChain.filter((_,i)=>i!==idx));};const moveVst=(idx,dir)=>{const j=idx+dir;if(j<0||j>=vstChain.length)return;const next=[...vstChain];const mv=next.splice(idx,1)[0];next.splice(j,0,mv);setVstChain(next);};const openVstGui=(s,idx)=>{if(!s||!s.path){window.showToast&&window.showToast('Chọn VST FX trước','warning');return;}if(fxGuiOpen)closeFxGui();if(idx!==undefined)setActiveVstIdx(idx);if(!window.SonicAPI||!window.SonicAPI.openFxGui){window.showToast&&window.showToast('Máy này không hỗ trợ mở GUI VST','warning');return;}window.SonicAPI.openFxGui({path:s.path,name:s.name||s.path,embed:true}).then(r=>{if(r&&r.embed_url){setFxGuiOpen({path:s.path,url:r.embed_url,name:s.name||s.path});if(onUpdateTrack&&track)onUpdateTrack(track.id,{vstGuiOpenPath:s.path,vstGuiOpenName:s.name||s.path});}else if(r&&r.already_running)window.showToast&&window.showToast('GUI của plugin này đang mở sẵn (cửa sổ ngoài)','info');else window.showToast&&window.showToast('Không mở được GUI embed','error');}).catch(err=>window.showToast&&window.showToast('Lỗi mở GUI: '+(err.message||err),'error'));};const addVst=path=>{const fx=(fxList||[]).find(f=>f.path===path);if(!fx)return;const next=[...vstChain,{type:'vst3',path:fx.path,name:fx.name||fx.id,preset_b64:'',bypass:false}];setVstChain(next);setActiveVstIdx(next.length-1);};const changeVstPlugin=(idx,path)=>{const fx=(fxList||[]).find(f=>f.path===path);delete _capturedPresetByPath[path];setVstChain(vstChain.map((s,i)=>i===idx?{...s,path,name:fx?fx.name||fx.id:s.name,preset_b64:''}:s));};const uploadVstPreset=idx=>{const inp=document.createElement('input');inp.type='file';inp.accept='.vstpreset,.fxp,.fxb,.dspreset';inp.onchange=()=>{const f=inp.files&&inp.files[0];if(!f)return;const reader=new FileReader();reader.onload=()=>{const b64=String(reader.result||'').split(',')[1]||'';setVstChain(vstChain.map((s,i)=>i===idx?{...s,preset_b64:b64}:s));window.showToast&&window.showToast('Đã gắn preset .vstpreset vào slot '+(idx+1),'success');};reader.readAsDataURL(f);};inp.click();};const previewFx=async()=>{try{if(previewAudioRef.current){previewAudioRef.current.pause();previewAudioRef.current=null;}if(!window.__renderProjectPreview){window.showToast&&window.showToast('Không có hàm render preview','warning');return;}window.showToast&&window.showToast('Đang render offline (bridge)...','info');const res=await window.__renderProjectPreview();const au=new Audio((window.API_BASE_URL||'')+res.url);previewAudioRef.current=au;au.onended=()=>{previewAudioRef.current=null;};au.play().then(()=>window.showToast&&window.showToast('Preview offline — âm thật = âm export (VST FX)','success')).catch(()=>{});}catch(e){/* toast ở __renderProjectPreview */}};const setChain=next=>{if(onUpdateTrack)onUpdateTrack(track.id,{fxChain:next});if(window.__rebuildTrackFxGraph)window.__rebuildTrackFxGraph(track.id);};const paramsOf=m=>({...(TRACK_FX_DEFAULTS[m.type]||{}),...(m.params||{})});const setParams=(idx,patch)=>{const next=chain.map((m,i)=>i===idx?{...m,params:{...paramsOf(m),...patch}}:m);setChain(next);};const toggleMod=idx=>{const next=chain.map((m,i)=>i===idx?{...m,active:!(m.active!==false)}:m);setChain(next);};const removeMod=idx=>setChain(chain.filter((_,i)=>i!==idx));const addMod=type=>{const def=TRACK_FX_DEFAULTS[type]||{};// Deep-clone default params so each chain entry owns its data (bands array // especially — shared references would corrupt other modules' state). const params=Array.isArray(def.bands)?{...def,bands:JSON.parse(JSON.stringify(def.bands))}:{...def};setChain([...chain,{type,active:true,params}]);setActiveType(type);setAddModuleOpen(false);};const applyPreset=key=>{const preset=TRACK_EQ_PRESETS[key];if(!preset)return;const idx=chain.findIndex(m=>m.type==='eq'&&m.active!==false);if(idx>=0)setParams(idx,{g1:preset.g[0],g2:preset.g[1],g3:preset.g[2],g4:preset.g[3]});};const activeMod=chain.find(m=>m.type===activeType)||chain[chain.length-1]||null;const activeIdx=chain.findIndex(m=>m===activeMod);const ap=activeMod?paramsOf(activeMod):{};const slider=(label,val,min,max,step,color,onChange,fmt)=>/*#__PURE__*/React.createElement("div",{className:"flex flex-col gap-1"},/*#__PURE__*/React.createElement("div",{className:"flex justify-between text-[11px] font-mono"},/*#__PURE__*/React.createElement("span",{style:{color,fontWeight:700}},label),/*#__PURE__*/React.createElement("span",{className:"text-slate-300"},fmt?fmt(val):val)),/*#__PURE__*/React.createElement("input",{type:"range",min:min,max:max,step:step||0.1,value:val,onChange:e=>onChange(parseFloat(e.target.value)),className:"w-full h-1 cursor-pointer",style:{accentColor:color}}));// ── Wave Observer real-time scope render loop ── React.useEffect(()=>{const canvas=scopeCanvasRef.current;if(!canvas||!track)return;const st=scopeStateRef.current;let raf=null;const draw=()=>{raf=requestAnimationFrame(draw);const w=canvas.width,h=canvas.height;const ctx=canvas.getContext('2d');ctx.clearRect(0,0,w,h);// Grid @@ -778,7 +786,7 @@ ctx.strokeStyle='rgba(51, 65, 85, 0.35)';for(let i=1;i<5;i++){const y=i/5*h;ctx. const bands=[{type:'lowshelf',f0:100,gain:ap.g1||0,q:0.7},{type:'peaking',f0:800,gain:ap.g2||0,q:0.7},{type:'peaking',f0:3200,gain:ap.g3||0,q:1.2},{type:'highshelf',f0:10000,gain:ap.g4||0,q:0.7}];const pts=[];const N=120;for(let i=0;i<=N;i++){const f=20*Math.pow(20000/20,i/N);let db=0;bands.forEach(b=>{const lf=Math.log(f/b.f0);if(b.type==='peaking'){db+=b.gain/(1+Math.pow(lf*b.q,2));}else if(b.type==='highshelf'){db+=b.gain/2*(1+2/Math.PI*Math.atan(lf/(1/b.q)));}else{db+=b.gain/2*(1-2/Math.PI*Math.atan(lf/(1/b.q)));}});const x=i/N*w;const y=midY-db/12*(h/2);pts.push([x,y]);}// fill ctx.beginPath();pts.forEach(([x,y],i)=>i===0?ctx.moveTo(x,y):ctx.lineTo(x,y));ctx.lineTo(w,h);ctx.lineTo(0,h);ctx.closePath();ctx.fillStyle='rgba(34, 211, 238, 0.10)';ctx.fill();// curve ctx.beginPath();pts.forEach(([x,y],i)=>i===0?ctx.moveTo(x,y):ctx.lineTo(x,y));ctx.strokeStyle='#22d3ee';ctx.lineWidth=2;ctx.stroke();// dB labels -ctx.fillStyle='#475569';ctx.font='9px monospace';ctx.fillText('+12 dB',4,midY-h/2+10);ctx.fillText('0 dB',4,midY+3);ctx.fillText('-12 dB',4,midY+h/2-4);ctx.fillText('20Hz',4,h-2);ctx.fillText('20kHz',w-38,h-2);},[ap.g1,ap.g2,ap.g3,ap.g4,activeMod]);return/*#__PURE__*/React.createElement("div",{className:"fixed inset-0 z-[115] bg-black/80 backdrop-blur-sm flex items-center justify-center p-4",onClick:onClose},/*#__PURE__*/React.createElement("div",{className:"w-full max-w-4xl bg-slate-900 border border-slate-700 rounded-2xl p-5 space-y-4 shadow-2xl flex flex-col max-h-[90vh] text-slate-200",onClick:e=>e.stopPropagation()},/*#__PURE__*/React.createElement("div",{className:"flex items-center justify-between border-b border-slate-800 pb-3"},/*#__PURE__*/React.createElement("div",{className:"flex items-center gap-2"},/*#__PURE__*/React.createElement("div",{className:"w-3 h-3 rounded-full bg-cyan-400 animate-pulse"}),/*#__PURE__*/React.createElement("h3",{className:"text-xs font-bold text-white uppercase tracking-wider font-mono"},track.name," \u2014 FX RACK PANEL")),/*#__PURE__*/React.createElement("button",{onClick:onClose,className:"text-slate-400 hover:text-white text-base"},/*#__PURE__*/React.createElement("i",{"data-lucide":"x",className:"w-4 h-4"}))),/*#__PURE__*/React.createElement("div",{className:"h-16 bg-slate-950 border border-slate-800 rounded-xl px-3 flex items-center gap-2 overflow-x-auto shrink-0 select-none"},/*#__PURE__*/React.createElement("span",{className:"text-[10px] font-bold text-slate-500 uppercase tracking-widest mr-1 font-mono shrink-0"},"CHAIN:"),chain.length===0&&/*#__PURE__*/React.createElement("span",{className:"text-[10px] text-slate-500 font-mono"},"Ch\u01B0a c\xF3 FX \u2014 b\u1EA5m [+] \u0111\u1EC3 th\xEAm (signal \u0111i th\u1EB3ng: Source \u2192 Fader)"),chain.map((m,idx)=>{const meta=TRACK_FX_META[m.type]||{name:m.type,icon:'circle',color:'#94a3b8',sub:''};const on=m.active!==false;return/*#__PURE__*/React.createElement("div",{key:idx,draggable:true,onDragStart:e=>{dragChainIndexRef.current=idx;e.dataTransfer.effectAllowed='move';},onDragOver:e=>{e.preventDefault();e.dataTransfer.dropEffect='move';},onDrop:e=>{e.preventDefault();const from=dragChainIndexRef.current;if(from!==null&&from!==idx){const next=[...chain];const mv=next.splice(from,1)[0];next.splice(idx,0,mv);setChain(next);}dragChainIndexRef.current=null;},onClick:()=>{closeFxGui();setActiveType(m.type);},className:`w-36 h-12 rounded-lg p-2 flex items-center justify-between cursor-pointer transition-all shrink-0 ${activeType===m.type?'border-2 border-cyan-400 bg-slate-800':'bg-slate-900 border border-slate-800 hover:border-slate-600'}`},/*#__PURE__*/React.createElement("div",{className:"flex items-center gap-2 min-w-0"},/*#__PURE__*/React.createElement("button",{onClick:e=>{e.stopPropagation();toggleMod(idx);},className:"w-4 h-4 rounded-full flex items-center justify-center text-[9px] font-bold shrink-0",style:{backgroundColor:on?'#38bdf8':'#334155',color:on?'#0f172a':'#94a3b8'}},/*#__PURE__*/React.createElement("i",{"data-lucide":"power",className:"w-2.5 h-2.5"})),/*#__PURE__*/React.createElement("div",{className:"min-w-0"},/*#__PURE__*/React.createElement("div",{className:"text-[11px] font-bold text-slate-200 truncate"},meta.name),/*#__PURE__*/React.createElement("div",{className:"text-[9px] font-mono truncate",style:{color:meta.color}},idx+1,". ",meta.sub))),/*#__PURE__*/React.createElement("button",{onClick:e=>{e.stopPropagation();removeMod(idx);},className:"text-slate-600 hover:text-red-400 text-xs px-0.5 shrink-0",title:"X\xF3a module"},/*#__PURE__*/React.createElement("i",{"data-lucide":"x",className:"w-3 h-3"})));}),/*#__PURE__*/React.createElement("button",{onClick:()=>setAddModuleOpen(true),className:"w-16 h-12 rounded-lg border border-dashed border-slate-700 hover:border-cyan-500 flex items-center justify-center text-slate-500 hover:text-cyan-400 cursor-pointer transition-all bg-slate-900/40 shrink-0",title:"Th\xEAm module"},/*#__PURE__*/React.createElement("i",{"data-lucide":"plus",className:"w-4 h-4"}))),/*#__PURE__*/React.createElement("div",{className:"bg-slate-950 border border-teal-900/60 rounded-xl px-3 py-2 flex flex-col gap-2 shrink-0 select-none"},/*#__PURE__*/React.createElement("div",{className:"flex items-center justify-between flex-wrap gap-2"},/*#__PURE__*/React.createElement("div",{className:"flex items-center gap-2 min-w-0"},/*#__PURE__*/React.createElement("span",{className:"text-[10px] font-bold text-teal-400 uppercase tracking-widest font-mono shrink-0"},"VST FX:"),/*#__PURE__*/React.createElement("span",{className:"text-[9px] text-slate-500 font-mono truncate"},"Plugin VST3 (Ozone...) \u2014 realtime browser v\u1EABn WebAudio builtin; VST \xE1p d\u1EE5ng l\xFAc Export/Offline render (preview = \xE2m export)")),/*#__PURE__*/React.createElement("div",{className:"flex items-center gap-2 shrink-0"},/*#__PURE__*/React.createElement("button",{onClick:previewFx,className:"px-2 py-1 bg-teal-800 hover:bg-teal-700 text-teal-100 text-[10px] font-semibold rounded transition flex items-center gap-1"},/*#__PURE__*/React.createElement("i",{"data-lucide":"play",className:"w-3 h-3"})," Nghe th\u1EED (render offline)"),/*#__PURE__*/React.createElement("label",{className:"flex items-center gap-1 text-[10px] text-slate-400 font-mono cursor-pointer"},/*#__PURE__*/React.createElement("input",{type:"checkbox",checked:vstBypass,onChange:e=>{const val=e.target.checked;setVstBypass(val);if(onUpdateTrack)onUpdateTrack(track.id,{vstFxBypass:val});},className:"w-3 h-3"})," Bypass"))),vstChain.length===0&&/*#__PURE__*/React.createElement("div",{className:"text-[10px] text-slate-500 font-mono"},"Ch\u01B0a c\xF3 VST FX \u2014 ch\u1ECDn plugin b\xEAn d\u01B0\u1EDBi \u0111\u1EC3 th\xEAm v\xE0o insert chain (WebAudio chain \u2192 VST FX \u2192 Fader)."),vstChain.map((s,idx)=>vstRow(s,idx,toggleVst,changeVstPlugin,uploadVstPreset,moveVst,removeVst,fxList,vstChain.length,openVstGui,false,activeVstIdx,(s2,i2)=>openVstGui(s2,i2))),/*#__PURE__*/React.createElement("button",{onClick:()=>setVstPickerOpen(true),className:"w-full bg-slate-950 border border-dashed border-slate-700 hover:border-teal-600 text-teal-300 rounded px-2 py-1.5 text-[11px] outline-none text-left",title:"Th\xEAm VST FX (Plugin Picker theo category)"},/*#__PURE__*/React.createElement("i",{"data-lucide":"plus",className:"w-3 h-3 inline-block mr-1"})," Th\xEAm VST FX... (Picker: EQ / Reverb / Comp / Utility)")),fxGuiOpen?/*#__PURE__*/React.createElement("div",{className:"flex-1 min-h-0"},/*#__PURE__*/React.createElement(VstGuiEmbed,{url:fxGuiOpen.url,onClose:closeFxGui,onDead:()=>{window.showToast&&window.showToast('Bridge VST GUI đã mất kết nối — trả về graph','error');closeFxGui();}})):/*#__PURE__*/React.createElement(React.Fragment,null,/*#__PURE__*/React.createElement("div",{className:"flex-1 bg-slate-950 border border-slate-800 rounded-xl p-4 flex flex-col gap-4 min-h-[240px] overflow-y-auto oz-scrollbar"},/*#__PURE__*/React.createElement("div",{className:"h-8 bg-slate-900/80 border-b border-slate-800/80 px-3 flex items-center justify-between text-xs font-mono rounded-t-lg shrink-0"},/*#__PURE__*/React.createElement("span",{className:"text-slate-400"},"Active Module: ",/*#__PURE__*/React.createElement("strong",{className:"text-cyan-400"},activeMod?TRACK_FX_META[activeMod.type]?.name||activeMod.type:'—')),activeMod&&activeMod.type==='eq'&&/*#__PURE__*/React.createElement("div",{className:"flex items-center gap-2"},/*#__PURE__*/React.createElement("span",{className:"text-slate-400"},"EQ Preset:"),/*#__PURE__*/React.createElement("select",{value:"flat",onChange:e=>applyPreset(e.target.value),className:"bg-slate-950 border border-slate-700 text-cyan-300 rounded px-2 py-0.5 text-xs outline-none focus:border-cyan-500"},Object.keys(TRACK_EQ_PRESETS).map(k=>/*#__PURE__*/React.createElement("option",{key:k,value:k},TRACK_EQ_PRESETS[k].name))))),!activeMod&&/*#__PURE__*/React.createElement("div",{className:"text-xs text-slate-500 font-mono text-center py-10"},"Ch\u01B0a c\xF3 module. B\u1EA5m [+] \u0111\u1EC3 th\xEAm EQ / Compressor / Limiter / Exciter / Rebalance."),activeMod&&activeMod.type==='eq'&&activeIdx>=0&&/*#__PURE__*/React.createElement("div",{className:"space-y-3"},/*#__PURE__*/React.createElement("div",{className:"grid grid-cols-4 gap-4"},[['g1','BAND 1 (LOW)','100 Hz','#22d3ee'],['g2','BAND 2 (MID LOW)','800 Hz','#fbbf24'],['g3','BAND 3 (MID HIGH)','3.2 kHz','#a855f7'],['g4','BAND 4 (HIGH)','10 kHz','#34d399']].map(([key,label,freq,color])=>/*#__PURE__*/React.createElement("div",{key:key,className:"bg-slate-900/80 border border-slate-800 p-3 rounded-lg space-y-2"},slider(label,ap[key]!==undefined?ap[key]:0,-12,12,0.1,color,v=>setParams(activeIdx,{[key]:v}),v=>`${v>0?'+':''}${v.toFixed(1)} dB`),/*#__PURE__*/React.createElement("div",{className:"text-[9px] text-slate-500 font-mono text-center"},freq)))),/*#__PURE__*/React.createElement("div",{className:"bg-slate-900/80 border border-slate-800 rounded-lg p-2"},/*#__PURE__*/React.createElement("div",{className:"text-[9px] text-slate-500 font-mono mb-1 flex justify-between"},/*#__PURE__*/React.createElement("span",null,"VECTOR DISPLAY \u2014 EQ RESPONSE"),/*#__PURE__*/React.createElement("span",null,"20Hz \u2013 20kHz")),/*#__PURE__*/React.createElement("canvas",{ref:eqCurveRef,className:"w-full h-[88px] block"}))),activeMod&&activeMod.type==='eqpro'&&activeIdx>=0&&/*#__PURE__*/React.createElement("div",{className:"space-y-3"},/*#__PURE__*/React.createElement("div",{className:"flex items-center justify-between"},/*#__PURE__*/React.createElement("span",{className:"text-[9px] text-teal-400 font-mono uppercase tracking-widest"},"PARAMETRIC / GRAPHIC EQ PRO \u2014 Pro-Q style interactive"),/*#__PURE__*/React.createElement("span",{className:"text-[9px] text-slate-500 font-mono"},"20Hz \u2013 20kHz \xB7 \xB124dB \xB7 ",EQPRO_MAX_BANDS," bands max")),/*#__PURE__*/React.createElement(InteractiveEqPro,{track:track,params:ap,onChange:next=>setParams(activeIdx,next),getModule:()=>window.__getTrackFxModule?window.__getTrackFxModule(track.id,'eqpro'):null,spectrumModules:()=>{const a=window.__getTrackFxModule?window.__getTrackFxModule(track.id,'eqpro'):null;const b=window.__getTrackSfFxModule?window.__getTrackSfFxModule(track.id,'eqpro'):null;return[a,b].filter(Boolean);}})),activeMod&&activeMod.type==='compressor'&&activeIdx>=0&&/*#__PURE__*/React.createElement("div",{className:"grid grid-cols-3 gap-4"},/*#__PURE__*/React.createElement("div",{className:"bg-slate-900/80 border border-slate-800 p-3 rounded-lg"},slider('THRESHOLD',ap.threshold,-60,0,0.5,'#fbbf24',v=>setParams(activeIdx,{threshold:v}),v=>`${v.toFixed(1)} dB`)),/*#__PURE__*/React.createElement("div",{className:"bg-slate-900/80 border border-slate-800 p-3 rounded-lg"},slider('RATIO',ap.ratio,1,20,0.5,'#f59e0b',v=>setParams(activeIdx,{ratio:v}),v=>`${v.toFixed(1)} : 1`)),/*#__PURE__*/React.createElement("div",{className:"bg-slate-900/80 border border-slate-800 p-3 rounded-lg"},slider('MAKE-UP',ap.makeup,0,12,0.1,'#f59e0b',v=>setParams(activeIdx,{makeup:v}),v=>`${v.toFixed(1)} dB`))),activeMod&&activeMod.type==='limiter'&&activeIdx>=0&&/*#__PURE__*/React.createElement("div",{className:"grid grid-cols-2 gap-4"},/*#__PURE__*/React.createElement("div",{className:"bg-slate-900/80 border border-slate-800 p-3 rounded-lg"},slider('CEILING',ap.ceiling,-24,0,0.1,'#f43f5e',v=>setParams(activeIdx,{ceiling:v}),v=>`${v.toFixed(1)} dB`)),/*#__PURE__*/React.createElement("div",{className:"bg-slate-900/80 border border-slate-800 p-3 rounded-lg flex items-center justify-center text-[10px] text-slate-500 font-mono text-center leading-snug"},"True-Peak limiting",/*#__PURE__*/React.createElement("br",null),"Ratio 20:1 \xB7 Knee 0dB")),activeMod&&activeMod.type==='exciter'&&activeIdx>=0&&/*#__PURE__*/React.createElement("div",{className:"grid grid-cols-2 gap-4"},/*#__PURE__*/React.createElement("div",{className:"bg-slate-900/80 border border-slate-800 p-3 rounded-lg"},slider('DRIVE / MIX',ap.drive,0,100,1,'#c084fc',v=>setParams(activeIdx,{drive:v}),v=>`${v}%`)),/*#__PURE__*/React.createElement("div",{className:"bg-slate-900/80 border border-slate-800 p-3 rounded-lg flex items-center justify-center text-[10px] text-slate-500 font-mono text-center leading-snug"},"WaveShaper saturation",/*#__PURE__*/React.createElement("br",null),"High-pass 2kHz \xB7 4\xD7 oversampled")),activeMod&&activeMod.type==='rebalance'&&activeIdx>=0&&/*#__PURE__*/React.createElement("div",{className:"grid grid-cols-2 gap-4"},/*#__PURE__*/React.createElement("div",{className:"bg-slate-900/80 border border-slate-800 p-3 rounded-lg"},slider('MID GAIN',ap.mid,-12,12,0.1,'#38bdf8',v=>setParams(activeIdx,{mid:v}),v=>`${v>0?'+':''}${v.toFixed(1)} dB`)),/*#__PURE__*/React.createElement("div",{className:"bg-slate-900/80 border border-slate-800 p-3 rounded-lg"},slider('SIDE GAIN',ap.side,-12,12,0.1,'#22d3ee',v=>setParams(activeIdx,{side:v}),v=>`${v>0?'+':''}${v.toFixed(1)} dB`))),activeMod&&activeMod.type==='carla'&&activeIdx>=0&&/*#__PURE__*/React.createElement("div",{className:"bg-amber-950/40 border border-amber-800/60 rounded-lg p-4 space-y-3"},/*#__PURE__*/React.createElement("div",{className:"text-[10px] text-amber-300 font-mono"},"Carla Bridge \u0111\xE3 b\u1ECB g\u1EE1 kh\u1ECFi FX Rack \u2014 track c\u0169 v\u1EABn gi\u1EEF module \u0111\u1EC3 kh\xF4ng m\u1EA5t c\u1EA5u h\xECnh."),/*#__PURE__*/React.createElement("button",{onClick:()=>removeMod(activeIdx),className:"px-3 py-1.5 bg-amber-800 hover:bg-amber-700 text-amber-50 text-xs font-semibold rounded transition"},"G\u1EE1 module Carla kh\u1ECFi track"))),/*#__PURE__*/React.createElement("div",{className:"bg-slate-950 border border-slate-800 rounded-xl p-3 flex flex-col gap-2 shrink-0"},/*#__PURE__*/React.createElement("div",{className:"flex items-center justify-between text-xs font-mono border-b border-slate-800/80 pb-1.5"},/*#__PURE__*/React.createElement("div",{className:"flex items-center gap-2"},/*#__PURE__*/React.createElement("span",{className:"font-bold text-white tracking-wider"},"WAVE OBSERVER"),/*#__PURE__*/React.createElement("span",{className:"text-[9px] bg-cyan-950 border border-cyan-800 text-cyan-400 px-1.5 py-0.5 rounded"},"Real-time Oscilloscope")),/*#__PURE__*/React.createElement("span",{className:"text-[10px] text-slate-500 truncate max-w-[200px]"},"Context: ",track.name)),/*#__PURE__*/React.createElement("div",{className:"relative w-full h-36 bg-slate-950 border border-slate-900 rounded-lg overflow-hidden"},/*#__PURE__*/React.createElement("canvas",{ref:scopeCanvasRef,className:"w-full h-full block cursor-crosshair"})),/*#__PURE__*/React.createElement("div",{className:"flex items-center justify-between bg-slate-900/90 border border-slate-800 rounded-lg px-3 py-1.5 text-xs font-mono flex-wrap gap-2"},/*#__PURE__*/React.createElement("div",{className:"flex items-center gap-2 pr-3 border-r border-slate-800"},/*#__PURE__*/React.createElement("span",{className:"text-[10px] text-slate-400"},"Input"),/*#__PURE__*/React.createElement("div",{className:"flex flex-col gap-1 w-12"},/*#__PURE__*/React.createElement("div",{className:"h-1.5 bg-slate-950 rounded overflow-hidden flex"},/*#__PURE__*/React.createElement("div",{ref:scopeMeterLRef,className:"h-full bg-cyan-400 w-0 transition-all"})),/*#__PURE__*/React.createElement("div",{className:"h-1.5 bg-slate-950 rounded overflow-hidden flex"},/*#__PURE__*/React.createElement("div",{ref:scopeMeterRRef,className:"h-full bg-cyan-400 w-0 transition-all"})))),/*#__PURE__*/React.createElement("div",{className:"flex items-center gap-1.5"},/*#__PURE__*/React.createElement("span",{className:"text-slate-500 text-[10px]"},"Channel:"),/*#__PURE__*/React.createElement("select",{value:scopeChannel,onChange:e=>setScopeChannel(e.target.value),className:"bg-slate-950 border border-slate-800 text-slate-300 rounded px-1.5 py-0.5 text-[11px] outline-none"},/*#__PURE__*/React.createElement("option",{value:"stereo"},"Stereo"),/*#__PURE__*/React.createElement("option",{value:"left"},"Left"),/*#__PURE__*/React.createElement("option",{value:"right"},"Right"),/*#__PURE__*/React.createElement("option",{value:"mid"},"Mid"),/*#__PURE__*/React.createElement("option",{value:"side"},"Side"))),/*#__PURE__*/React.createElement("div",{className:"flex items-center gap-1.5"},/*#__PURE__*/React.createElement("span",{className:"text-slate-500 text-[10px]"},"Mode:"),/*#__PURE__*/React.createElement("select",{value:scopeMode,onChange:e=>setScopeMode(e.target.value),className:"bg-slate-950 border border-slate-800 text-slate-300 rounded px-1.5 py-0.5 text-[11px] outline-none"},/*#__PURE__*/React.createElement("option",{value:"waveform"},"Waveform"),/*#__PURE__*/React.createElement("option",{value:"lissajous"},"Lissajous"),/*#__PURE__*/React.createElement("option",{value:"spectrum"},"Spectrum"))),/*#__PURE__*/React.createElement("div",{className:"flex items-center gap-1.5"},/*#__PURE__*/React.createElement("span",{className:"text-slate-500 text-[10px]"},"Duration:"),/*#__PURE__*/React.createElement("span",{className:"text-cyan-400 font-bold text-[11px] w-12"},scopeDuration.toFixed(2),"s"),/*#__PURE__*/React.createElement("input",{type:"range",min:"0.1",max:"5.0",step:"0.1",value:scopeDuration,onChange:e=>setScopeDuration(parseFloat(e.target.value)),className:"w-16 h-1 cursor-pointer",style:{accentColor:'#38bdf8'}})),/*#__PURE__*/React.createElement("div",{className:"flex items-center gap-1.5"},/*#__PURE__*/React.createElement("span",{className:"text-slate-500 text-[10px]"},"V.Zoom:"),/*#__PURE__*/React.createElement("span",{className:"text-cyan-400 font-bold text-[11px] w-12"},scopeZoom>0?'+':'',scopeZoom.toFixed(1)," dB"),/*#__PURE__*/React.createElement("input",{type:"range",min:"-12",max:"20",step:"0.5",value:scopeZoom,onChange:e=>setScopeZoom(parseFloat(e.target.value)),className:"w-16 h-1 cursor-pointer",style:{accentColor:'#38bdf8'}})),/*#__PURE__*/React.createElement("button",{onClick:()=>setScopePaused(p=>!p),className:`px-3 py-1 font-semibold rounded text-[11px] border transition-colors ${scopePaused?'bg-amber-600 border-amber-400 text-white':'bg-slate-800 hover:bg-slate-700 text-slate-300 border-slate-700'}`},scopePaused?'Resume':'Pause'))))),addModuleOpen&&/*#__PURE__*/React.createElement("div",{className:"fixed inset-0 z-[120] bg-black/80 backdrop-blur-sm flex items-center justify-center p-4",onClick:()=>setAddModuleOpen(false)},/*#__PURE__*/React.createElement("div",{className:"w-full max-w-lg bg-slate-900 border border-slate-700 rounded-2xl p-5 space-y-4 shadow-2xl max-h-[80vh] overflow-y-auto",onClick:e=>e.stopPropagation()},/*#__PURE__*/React.createElement("div",{className:"flex items-center justify-between border-b border-slate-800 pb-3"},/*#__PURE__*/React.createElement("h3",{className:"text-xs font-bold text-white uppercase tracking-wider font-mono"},"TH\xCAM MODULE V\xC0O FX CHAIN"),/*#__PURE__*/React.createElement("button",{onClick:()=>setAddModuleOpen(false),className:"text-slate-400 hover:text-white"},/*#__PURE__*/React.createElement("i",{"data-lucide":"x",className:"w-4 h-4"}))),/*#__PURE__*/React.createElement("div",{className:"grid grid-cols-2 gap-3 text-xs"},Object.keys(TRACK_FX_META).map(t=>{const meta=TRACK_FX_META[t];return/*#__PURE__*/React.createElement("button",{key:t,onClick:()=>addMod(t),className:"p-3 bg-slate-950 hover:bg-slate-800 border border-slate-800 rounded-xl text-left space-y-1 transition-colors"},/*#__PURE__*/React.createElement("div",{className:"font-bold flex items-center gap-1.5",style:{color:meta.color}},/*#__PURE__*/React.createElement("i",{"data-lucide":meta.icon,className:"w-3.5 h-3.5"})," ",meta.name),/*#__PURE__*/React.createElement("div",{className:"text-[10px] text-slate-400"},meta.sub));})))),/*#__PURE__*/React.createElement(VstPluginPicker,{open:vstPickerOpen,onClose:()=>setVstPickerOpen(false),plugins:fxList,onPick:f=>addVst(f.path)}));};// ────────────────────────────────────────────── +ctx.fillStyle='#475569';ctx.font='9px monospace';ctx.fillText('+12 dB',4,midY-h/2+10);ctx.fillText('0 dB',4,midY+3);ctx.fillText('-12 dB',4,midY+h/2-4);ctx.fillText('20Hz',4,h-2);ctx.fillText('20kHz',w-38,h-2);},[ap.g1,ap.g2,ap.g3,ap.g4,activeMod]);return/*#__PURE__*/React.createElement("div",{className:"fixed inset-0 z-[115] bg-black/80 backdrop-blur-sm flex items-center justify-center p-4",onClick:onClose},/*#__PURE__*/React.createElement("div",{className:"w-full max-w-4xl bg-slate-900 border border-slate-700 rounded-2xl p-5 space-y-4 shadow-2xl flex flex-col max-h-[90vh] text-slate-200",onClick:e=>e.stopPropagation()},/*#__PURE__*/React.createElement("div",{className:"flex items-center justify-between border-b border-slate-800 pb-3"},/*#__PURE__*/React.createElement("div",{className:"flex items-center gap-2"},/*#__PURE__*/React.createElement("div",{className:"w-3 h-3 rounded-full bg-cyan-400 animate-pulse"}),/*#__PURE__*/React.createElement("h3",{className:"text-xs font-bold text-white uppercase tracking-wider font-mono"},track.name," — FX RACK PANEL")),/*#__PURE__*/React.createElement("button",{onClick:onClose,className:"text-slate-400 hover:text-white text-base"},/*#__PURE__*/React.createElement("i",{"data-lucide":"x",className:"w-4 h-4"}))),/*#__PURE__*/React.createElement("div",{className:"h-16 bg-slate-950 border border-slate-800 rounded-xl px-3 flex items-center gap-2 overflow-x-auto shrink-0 select-none"},/*#__PURE__*/React.createElement("span",{className:"text-[10px] font-bold text-slate-500 uppercase tracking-widest mr-1 font-mono shrink-0"},"CHAIN:"),chain.length===0&&/*#__PURE__*/React.createElement("span",{className:"text-[10px] text-slate-500 font-mono"},"Chưa có FX — bấm [+] để thêm (signal đi thẳng: Source → Fader)"),chain.map((m,idx)=>{const meta=TRACK_FX_META[m.type]||{name:m.type,icon:'circle',color:'#94a3b8',sub:''};const on=m.active!==false;return/*#__PURE__*/React.createElement("div",{key:idx,draggable:true,onDragStart:e=>{dragChainIndexRef.current=idx;e.dataTransfer.effectAllowed='move';},onDragOver:e=>{e.preventDefault();e.dataTransfer.dropEffect='move';},onDrop:e=>{e.preventDefault();const from=dragChainIndexRef.current;if(from!==null&&from!==idx){const next=[...chain];const mv=next.splice(from,1)[0];next.splice(idx,0,mv);setChain(next);}dragChainIndexRef.current=null;},onClick:()=>{closeFxGui();setActiveType(m.type);},className:`w-36 h-12 rounded-lg p-2 flex items-center justify-between cursor-pointer transition-all shrink-0 ${activeType===m.type?'border-2 border-cyan-400 bg-slate-800':'bg-slate-900 border border-slate-800 hover:border-slate-600'}`},/*#__PURE__*/React.createElement("div",{className:"flex items-center gap-2 min-w-0"},/*#__PURE__*/React.createElement("button",{onClick:e=>{e.stopPropagation();toggleMod(idx);},className:"w-4 h-4 rounded-full flex items-center justify-center text-[9px] font-bold shrink-0",style:{backgroundColor:on?'#38bdf8':'#334155',color:on?'#0f172a':'#94a3b8'}},/*#__PURE__*/React.createElement("i",{"data-lucide":"power",className:"w-2.5 h-2.5"})),/*#__PURE__*/React.createElement("div",{className:"min-w-0"},/*#__PURE__*/React.createElement("div",{className:"text-[11px] font-bold text-slate-200 truncate"},meta.name),/*#__PURE__*/React.createElement("div",{className:"text-[9px] font-mono truncate",style:{color:meta.color}},idx+1,". ",meta.sub))),/*#__PURE__*/React.createElement("button",{onClick:e=>{e.stopPropagation();removeMod(idx);},className:"text-slate-600 hover:text-red-400 text-xs px-0.5 shrink-0",title:"Xóa module"},/*#__PURE__*/React.createElement("i",{"data-lucide":"x",className:"w-3 h-3"})));}),/*#__PURE__*/React.createElement("button",{onClick:()=>setAddModuleOpen(true),className:"w-16 h-12 rounded-lg border border-dashed border-slate-700 hover:border-cyan-500 flex items-center justify-center text-slate-500 hover:text-cyan-400 cursor-pointer transition-all bg-slate-900/40 shrink-0",title:"Thêm module"},/*#__PURE__*/React.createElement("i",{"data-lucide":"plus",className:"w-4 h-4"}))),/*#__PURE__*/React.createElement("div",{className:"bg-slate-950 border border-teal-900/60 rounded-xl px-3 py-2 flex flex-col gap-2 shrink-0 select-none"},/*#__PURE__*/React.createElement("div",{className:"flex items-center justify-between flex-wrap gap-2"},/*#__PURE__*/React.createElement("div",{className:"flex items-center gap-2 min-w-0"},/*#__PURE__*/React.createElement("span",{className:"text-[10px] font-bold text-teal-400 uppercase tracking-widest font-mono shrink-0"},"VST FX:"),/*#__PURE__*/React.createElement("span",{className:"text-[9px] text-slate-500 font-mono truncate"},"Plugin VST3 (Ozone...) — realtime browser vẫn WebAudio builtin; VST áp dụng lúc Export/Offline render (preview = âm export)")),/*#__PURE__*/React.createElement("div",{className:"flex items-center gap-2 shrink-0"},/*#__PURE__*/React.createElement("button",{onClick:previewFx,className:"px-2 py-1 bg-teal-800 hover:bg-teal-700 text-teal-100 text-[10px] font-semibold rounded transition flex items-center gap-1"},/*#__PURE__*/React.createElement("i",{"data-lucide":"play",className:"w-3 h-3"})," Nghe thử (render offline)"),/*#__PURE__*/React.createElement("label",{className:"flex items-center gap-1 text-[10px] text-slate-400 font-mono cursor-pointer"},/*#__PURE__*/React.createElement("input",{type:"checkbox",checked:vstBypass,onChange:e=>{const val=e.target.checked;setVstBypass(val);if(onUpdateTrack)onUpdateTrack(track.id,{vstFxBypass:val});},className:"w-3 h-3"})," Bypass"))),vstChain.length===0&&/*#__PURE__*/React.createElement("div",{className:"text-[10px] text-slate-500 font-mono"},"Chưa có VST FX — chọn plugin bên dưới để thêm vào insert chain (WebAudio chain → VST FX → Fader)."),vstChain.map((s,idx)=>vstRow(s,idx,toggleVst,changeVstPlugin,uploadVstPreset,moveVst,removeVst,fxList,vstChain.length,openVstGui,false,activeVstIdx,(s2,i2)=>openVstGui(s2,i2))),/*#__PURE__*/React.createElement("button",{onClick:()=>setVstPickerOpen(true),className:"w-full bg-slate-950 border border-dashed border-slate-700 hover:border-teal-600 text-teal-300 rounded px-2 py-1.5 text-[11px] outline-none text-left",title:"Thêm VST FX (Plugin Picker theo category)"},/*#__PURE__*/React.createElement("i",{"data-lucide":"plus",className:"w-3 h-3 inline-block mr-1"})," Thêm VST FX... (Picker: EQ / Reverb / Comp / Utility)")),fxGuiOpen?/*#__PURE__*/React.createElement("div",{className:"flex-1 min-h-0"},/*#__PURE__*/React.createElement(VstGuiEmbed,{url:fxGuiOpen.url,onClose:closeFxGui,onDead:()=>{window.showToast&&window.showToast('Bridge VST GUI đã mất kết nối — trả về graph','error');closeFxGui();}})):/*#__PURE__*/React.createElement(React.Fragment,null,/*#__PURE__*/React.createElement("div",{className:"flex-1 bg-slate-950 border border-slate-800 rounded-xl p-4 flex flex-col gap-4 min-h-[240px] overflow-y-auto oz-scrollbar"},/*#__PURE__*/React.createElement("div",{className:"h-8 bg-slate-900/80 border-b border-slate-800/80 px-3 flex items-center justify-between text-xs font-mono rounded-t-lg shrink-0"},/*#__PURE__*/React.createElement("span",{className:"text-slate-400"},"Active Module: ",/*#__PURE__*/React.createElement("strong",{className:"text-cyan-400"},activeMod?TRACK_FX_META[activeMod.type]?.name||activeMod.type:'—')),activeMod&&activeMod.type==='eq'&&/*#__PURE__*/React.createElement("div",{className:"flex items-center gap-2"},/*#__PURE__*/React.createElement("span",{className:"text-slate-400"},"EQ Preset:"),/*#__PURE__*/React.createElement("select",{value:"flat",onChange:e=>applyPreset(e.target.value),className:"bg-slate-950 border border-slate-700 text-cyan-300 rounded px-2 py-0.5 text-xs outline-none focus:border-cyan-500"},Object.keys(TRACK_EQ_PRESETS).map(k=>/*#__PURE__*/React.createElement("option",{key:k,value:k},TRACK_EQ_PRESETS[k].name))))),!activeMod&&/*#__PURE__*/React.createElement("div",{className:"text-xs text-slate-500 font-mono text-center py-10"},"Chưa có module. Bấm [+] để thêm EQ / Compressor / Limiter / Exciter / Rebalance."),activeMod&&activeMod.type==='eq'&&activeIdx>=0&&/*#__PURE__*/React.createElement("div",{className:"space-y-3"},/*#__PURE__*/React.createElement("div",{className:"grid grid-cols-4 gap-4"},[['g1','BAND 1 (LOW)','100 Hz','#22d3ee'],['g2','BAND 2 (MID LOW)','800 Hz','#fbbf24'],['g3','BAND 3 (MID HIGH)','3.2 kHz','#a855f7'],['g4','BAND 4 (HIGH)','10 kHz','#34d399']].map(([key,label,freq,color])=>/*#__PURE__*/React.createElement("div",{key:key,className:"bg-slate-900/80 border border-slate-800 p-3 rounded-lg space-y-2"},slider(label,ap[key]!==undefined?ap[key]:0,-12,12,0.1,color,v=>setParams(activeIdx,{[key]:v}),v=>`${v>0?'+':''}${v.toFixed(1)} dB`),/*#__PURE__*/React.createElement("div",{className:"text-[9px] text-slate-500 font-mono text-center"},freq)))),/*#__PURE__*/React.createElement("div",{className:"bg-slate-900/80 border border-slate-800 rounded-lg p-2"},/*#__PURE__*/React.createElement("div",{className:"text-[9px] text-slate-500 font-mono mb-1 flex justify-between"},/*#__PURE__*/React.createElement("span",null,"VECTOR DISPLAY — EQ RESPONSE"),/*#__PURE__*/React.createElement("span",null,"20Hz – 20kHz")),/*#__PURE__*/React.createElement("canvas",{ref:eqCurveRef,className:"w-full h-[88px] block"}))),activeMod&&activeMod.type==='eqpro'&&activeIdx>=0&&/*#__PURE__*/React.createElement("div",{className:"space-y-3"},/*#__PURE__*/React.createElement("div",{className:"flex items-center justify-between"},/*#__PURE__*/React.createElement("span",{className:"text-[9px] text-teal-400 font-mono uppercase tracking-widest"},"PARAMETRIC / GRAPHIC EQ PRO — Pro-Q style interactive"),/*#__PURE__*/React.createElement("span",{className:"text-[9px] text-slate-500 font-mono"},"20Hz – 20kHz · ±24dB · ",EQPRO_MAX_BANDS," bands max")),/*#__PURE__*/React.createElement(InteractiveEqPro,{track:track,params:ap,onChange:next=>setParams(activeIdx,next),getModule:()=>window.__getTrackFxModule?window.__getTrackFxModule(track.id,'eqpro'):null,spectrumModules:()=>{const a=window.__getTrackFxModule?window.__getTrackFxModule(track.id,'eqpro'):null;const b=window.__getTrackSfFxModule?window.__getTrackSfFxModule(track.id,'eqpro'):null;return[a,b].filter(Boolean);}})),activeMod&&activeMod.type==='compressor'&&activeIdx>=0&&/*#__PURE__*/React.createElement("div",{className:"grid grid-cols-3 gap-4"},/*#__PURE__*/React.createElement("div",{className:"bg-slate-900/80 border border-slate-800 p-3 rounded-lg"},slider('THRESHOLD',ap.threshold,-60,0,0.5,'#fbbf24',v=>setParams(activeIdx,{threshold:v}),v=>`${v.toFixed(1)} dB`)),/*#__PURE__*/React.createElement("div",{className:"bg-slate-900/80 border border-slate-800 p-3 rounded-lg"},slider('RATIO',ap.ratio,1,20,0.5,'#f59e0b',v=>setParams(activeIdx,{ratio:v}),v=>`${v.toFixed(1)} : 1`)),/*#__PURE__*/React.createElement("div",{className:"bg-slate-900/80 border border-slate-800 p-3 rounded-lg"},slider('MAKE-UP',ap.makeup,0,12,0.1,'#f59e0b',v=>setParams(activeIdx,{makeup:v}),v=>`${v.toFixed(1)} dB`))),activeMod&&activeMod.type==='limiter'&&activeIdx>=0&&/*#__PURE__*/React.createElement("div",{className:"grid grid-cols-2 gap-4"},/*#__PURE__*/React.createElement("div",{className:"bg-slate-900/80 border border-slate-800 p-3 rounded-lg"},slider('CEILING',ap.ceiling,-24,0,0.1,'#f43f5e',v=>setParams(activeIdx,{ceiling:v}),v=>`${v.toFixed(1)} dB`)),/*#__PURE__*/React.createElement("div",{className:"bg-slate-900/80 border border-slate-800 p-3 rounded-lg flex items-center justify-center text-[10px] text-slate-500 font-mono text-center leading-snug"},"True-Peak limiting",/*#__PURE__*/React.createElement("br",null),"Ratio 20:1 · Knee 0dB")),activeMod&&activeMod.type==='exciter'&&activeIdx>=0&&/*#__PURE__*/React.createElement("div",{className:"grid grid-cols-2 gap-4"},/*#__PURE__*/React.createElement("div",{className:"bg-slate-900/80 border border-slate-800 p-3 rounded-lg"},slider('DRIVE / MIX',ap.drive,0,100,1,'#c084fc',v=>setParams(activeIdx,{drive:v}),v=>`${v}%`)),/*#__PURE__*/React.createElement("div",{className:"bg-slate-900/80 border border-slate-800 p-3 rounded-lg flex items-center justify-center text-[10px] text-slate-500 font-mono text-center leading-snug"},"WaveShaper saturation",/*#__PURE__*/React.createElement("br",null),"High-pass 2kHz · 4× oversampled")),activeMod&&activeMod.type==='rebalance'&&activeIdx>=0&&/*#__PURE__*/React.createElement("div",{className:"grid grid-cols-2 gap-4"},/*#__PURE__*/React.createElement("div",{className:"bg-slate-900/80 border border-slate-800 p-3 rounded-lg"},slider('MID GAIN',ap.mid,-12,12,0.1,'#38bdf8',v=>setParams(activeIdx,{mid:v}),v=>`${v>0?'+':''}${v.toFixed(1)} dB`)),/*#__PURE__*/React.createElement("div",{className:"bg-slate-900/80 border border-slate-800 p-3 rounded-lg"},slider('SIDE GAIN',ap.side,-12,12,0.1,'#22d3ee',v=>setParams(activeIdx,{side:v}),v=>`${v>0?'+':''}${v.toFixed(1)} dB`))),activeMod&&activeMod.type==='carla'&&activeIdx>=0&&/*#__PURE__*/React.createElement("div",{className:"bg-amber-950/40 border border-amber-800/60 rounded-lg p-4 space-y-3"},/*#__PURE__*/React.createElement("div",{className:"text-[10px] text-amber-300 font-mono"},"Carla Bridge đã bị gỡ khỏi FX Rack — track cũ vẫn giữ module để không mất cấu hình."),/*#__PURE__*/React.createElement("button",{onClick:()=>removeMod(activeIdx),className:"px-3 py-1.5 bg-amber-800 hover:bg-amber-700 text-amber-50 text-xs font-semibold rounded transition"},"Gỡ module Carla khỏi track"))),/*#__PURE__*/React.createElement("div",{className:"bg-slate-950 border border-slate-800 rounded-xl p-3 flex flex-col gap-2 shrink-0"},/*#__PURE__*/React.createElement("div",{className:"flex items-center justify-between text-xs font-mono border-b border-slate-800/80 pb-1.5"},/*#__PURE__*/React.createElement("div",{className:"flex items-center gap-2"},/*#__PURE__*/React.createElement("span",{className:"font-bold text-white tracking-wider"},"WAVE OBSERVER"),/*#__PURE__*/React.createElement("span",{className:"text-[9px] bg-cyan-950 border border-cyan-800 text-cyan-400 px-1.5 py-0.5 rounded"},"Real-time Oscilloscope")),/*#__PURE__*/React.createElement("span",{className:"text-[10px] text-slate-500 truncate max-w-[200px]"},"Context: ",track.name)),/*#__PURE__*/React.createElement("div",{className:"relative w-full h-36 bg-slate-950 border border-slate-900 rounded-lg overflow-hidden"},/*#__PURE__*/React.createElement("canvas",{ref:scopeCanvasRef,className:"w-full h-full block cursor-crosshair"})),/*#__PURE__*/React.createElement("div",{className:"flex items-center justify-between bg-slate-900/90 border border-slate-800 rounded-lg px-3 py-1.5 text-xs font-mono flex-wrap gap-2"},/*#__PURE__*/React.createElement("div",{className:"flex items-center gap-2 pr-3 border-r border-slate-800"},/*#__PURE__*/React.createElement("span",{className:"text-[10px] text-slate-400"},"Input"),/*#__PURE__*/React.createElement("div",{className:"flex flex-col gap-1 w-12"},/*#__PURE__*/React.createElement("div",{className:"h-1.5 bg-slate-950 rounded overflow-hidden flex"},/*#__PURE__*/React.createElement("div",{ref:scopeMeterLRef,className:"h-full bg-cyan-400 w-0 transition-all"})),/*#__PURE__*/React.createElement("div",{className:"h-1.5 bg-slate-950 rounded overflow-hidden flex"},/*#__PURE__*/React.createElement("div",{ref:scopeMeterRRef,className:"h-full bg-cyan-400 w-0 transition-all"})))),/*#__PURE__*/React.createElement("div",{className:"flex items-center gap-1.5"},/*#__PURE__*/React.createElement("span",{className:"text-slate-500 text-[10px]"},"Channel:"),/*#__PURE__*/React.createElement("select",{value:scopeChannel,onChange:e=>setScopeChannel(e.target.value),className:"bg-slate-950 border border-slate-800 text-slate-300 rounded px-1.5 py-0.5 text-[11px] outline-none"},/*#__PURE__*/React.createElement("option",{value:"stereo"},"Stereo"),/*#__PURE__*/React.createElement("option",{value:"left"},"Left"),/*#__PURE__*/React.createElement("option",{value:"right"},"Right"),/*#__PURE__*/React.createElement("option",{value:"mid"},"Mid"),/*#__PURE__*/React.createElement("option",{value:"side"},"Side"))),/*#__PURE__*/React.createElement("div",{className:"flex items-center gap-1.5"},/*#__PURE__*/React.createElement("span",{className:"text-slate-500 text-[10px]"},"Mode:"),/*#__PURE__*/React.createElement("select",{value:scopeMode,onChange:e=>setScopeMode(e.target.value),className:"bg-slate-950 border border-slate-800 text-slate-300 rounded px-1.5 py-0.5 text-[11px] outline-none"},/*#__PURE__*/React.createElement("option",{value:"waveform"},"Waveform"),/*#__PURE__*/React.createElement("option",{value:"lissajous"},"Lissajous"),/*#__PURE__*/React.createElement("option",{value:"spectrum"},"Spectrum"))),/*#__PURE__*/React.createElement("div",{className:"flex items-center gap-1.5"},/*#__PURE__*/React.createElement("span",{className:"text-slate-500 text-[10px]"},"Duration:"),/*#__PURE__*/React.createElement("span",{className:"text-cyan-400 font-bold text-[11px] w-12"},scopeDuration.toFixed(2),"s"),/*#__PURE__*/React.createElement("input",{type:"range",min:"0.1",max:"5.0",step:"0.1",value:scopeDuration,onChange:e=>setScopeDuration(parseFloat(e.target.value)),className:"w-16 h-1 cursor-pointer",style:{accentColor:'#38bdf8'}})),/*#__PURE__*/React.createElement("div",{className:"flex items-center gap-1.5"},/*#__PURE__*/React.createElement("span",{className:"text-slate-500 text-[10px]"},"V.Zoom:"),/*#__PURE__*/React.createElement("span",{className:"text-cyan-400 font-bold text-[11px] w-12"},scopeZoom>0?'+':'',scopeZoom.toFixed(1)," dB"),/*#__PURE__*/React.createElement("input",{type:"range",min:"-12",max:"20",step:"0.5",value:scopeZoom,onChange:e=>setScopeZoom(parseFloat(e.target.value)),className:"w-16 h-1 cursor-pointer",style:{accentColor:'#38bdf8'}})),/*#__PURE__*/React.createElement("button",{onClick:()=>setScopePaused(p=>!p),className:`px-3 py-1 font-semibold rounded text-[11px] border transition-colors ${scopePaused?'bg-amber-600 border-amber-400 text-white':'bg-slate-800 hover:bg-slate-700 text-slate-300 border-slate-700'}`},scopePaused?'Resume':'Pause'))))),addModuleOpen&&/*#__PURE__*/React.createElement("div",{className:"fixed inset-0 z-[120] bg-black/80 backdrop-blur-sm flex items-center justify-center p-4",onClick:()=>setAddModuleOpen(false)},/*#__PURE__*/React.createElement("div",{className:"w-full max-w-lg bg-slate-900 border border-slate-700 rounded-2xl p-5 space-y-4 shadow-2xl max-h-[80vh] overflow-y-auto",onClick:e=>e.stopPropagation()},/*#__PURE__*/React.createElement("div",{className:"flex items-center justify-between border-b border-slate-800 pb-3"},/*#__PURE__*/React.createElement("h3",{className:"text-xs font-bold text-white uppercase tracking-wider font-mono"},"THÊM MODULE VÀO FX CHAIN"),/*#__PURE__*/React.createElement("button",{onClick:()=>setAddModuleOpen(false),className:"text-slate-400 hover:text-white"},/*#__PURE__*/React.createElement("i",{"data-lucide":"x",className:"w-4 h-4"}))),/*#__PURE__*/React.createElement("div",{className:"grid grid-cols-2 gap-3 text-xs"},Object.keys(TRACK_FX_META).map(t=>{const meta=TRACK_FX_META[t];return/*#__PURE__*/React.createElement("button",{key:t,onClick:()=>addMod(t),className:"p-3 bg-slate-950 hover:bg-slate-800 border border-slate-800 rounded-xl text-left space-y-1 transition-colors"},/*#__PURE__*/React.createElement("div",{className:"font-bold flex items-center gap-1.5",style:{color:meta.color}},/*#__PURE__*/React.createElement("i",{"data-lucide":meta.icon,className:"w-3.5 h-3.5"})," ",meta.name),/*#__PURE__*/React.createElement("div",{className:"text-[10px] text-slate-400"},meta.sub));})))),/*#__PURE__*/React.createElement(VstPluginPicker,{open:vstPickerOpen,onClose:()=>setVstPickerOpen(false),plugins:fxList,onPick:f=>addVst(f.path)}));};// ────────────────────────────────────────────── // MASTERING MODAL COMPONENT (from md/45_MASTERING_MODULE.md) // ────────────────────────────────────────────── // GUI embed state survives MasteringModal unmount so the native window @@ -786,9 +794,13 @@ ctx.fillStyle='#475569';ctx.font='9px monospace';ctx.fillText('+12 dB',4,midY-h/ let _persistMasterGuiOpen=null;const MasteringModal=({isOpen,onClose,masteringSettings,setMasteringSettings})=>{const ozState=masteringSettings;const setOzState=setMasteringSettings;const[isPlaying,setIsPlaying]=React.useState(false);const masterConnected=ozState.masterConnected;const setMasterConnected=val=>{setOzState(prev=>({...prev,masterConnected:typeof val==='function'?val(prev.masterConnected):val}));};// ── VST FX masterbus (native_bridge --render-fx, áp dụng khi Export/Offline render) ── const masterVstChain=ozState.vstFxChain||[];// Embedded VST GUI state (PLAN_MASTERBUS_VST_GUI_EMBED.md Phase 2) const[masterGuiOpen,setMasterGuiOpenState]=React.useState(_persistMasterGuiOpen);// { path, url } | null -const setMasterGuiOpen=v=>{_persistMasterGuiOpen=v;setMasterGuiOpenState(v);};const[activeMasterVstPath,setActiveMasterVstPath]=React.useState(null);const masterGuiOpenRef=React.useRef(null);masterGuiOpenRef.current=masterGuiOpen;const closeMasterGui=()=>{const g=masterGuiOpenRef.current;if(g){try{fetch(g.url+'/hide',{method:'POST'}).catch(()=>{});}catch(e){}}setMasterGuiOpen(null);setActiveMasterVstPath(null);};React.useEffect(()=>()=>{const g=masterGuiOpenRef.current;if(g){try{fetch(g.url+'/hide',{method:'POST'}).catch(()=>{});}catch(e){}}},[]);const setMasterVstChain=next=>setOzState(prev=>({...prev,vstFxChain:next}));// T2.4: push the master VST FX chain to the realtime bridge (live master +const setMasterGuiOpen=v=>{_persistMasterGuiOpen=v;setMasterGuiOpenState(v);};const[activeMasterVstPath,setActiveMasterVstPath]=React.useState(null);const masterGuiOpenRef=React.useRef(null);masterGuiOpenRef.current=masterGuiOpen;const closeMasterGui=()=>{const g=masterGuiOpenRef.current;if(g){try{fetch(g.url+'/hide',{method:'POST'}).catch(()=>{});}catch(e){}}setMasterGuiOpen(null);setActiveMasterVstPath(null);setOzState(prev=>{const n={...(prev||{})};delete n.gui_open_path;delete n.gui_open_name;return n;});};React.useEffect(()=>()=>{const g=masterGuiOpenRef.current;if(g){try{fetch(g.url+'/hide',{method:'POST'}).catch(()=>{});}catch(e){}}},[]);// Capture GUI knob tweaks while the embedded GUI is open (bridge /preset). +React.useEffect(()=>{if(!masterGuiOpen||!masterGuiOpen.url)return;const iv=setInterval(()=>{fetch(masterGuiOpen.url+'/preset').then(r=>r.json()).then(d=>{if(d&&d.preset_b64)_capturedPresetByPath[masterGuiOpen.path]=d.preset_b64;}).catch(()=>{});},1500);return()=>clearInterval(iv);// eslint-disable-next-line react-hooks/exhaustive-deps +},[masterGuiOpen]);// Reopen the saved GUI when the panel is opened after a project restore. +React.useEffect(()=>{if(!isOpen||!ozState||!ozState.gui_open_path||masterGuiOpen)return;const s=(ozState.vstFxChain||[]).find(x=>x.path===ozState.gui_open_path);if(!s||!window.SonicAPI||!window.SonicAPI.openFxGui)return;window.SonicAPI.openFxGui({path:s.path,name:ozState.gui_open_name||s.name||s.path,embed:true}).then(r=>{if(r&&r.embed_url)setMasterGuiOpen({path:s.path,url:r.embed_url});}).catch(()=>{});// eslint-disable-next-line react-hooks/exhaustive-deps +},[isOpen,ozState&&ozState.gui_open_path]);const setMasterVstChain=next=>setOzState(prev=>({...prev,vstFxChain:next}));// T2.4: push the master VST FX chain to the realtime bridge (live master // mix). v1: master chain only — per-track vstChain stays offline (defer). -React.useEffect(()=>{if(!window.NativeBridgeService||!window.NativeBridgeService.setFxChain)return;const chain=(ozState.vstFxChain||[]).map(s=>({path:s.path||'',bypass:!!s.bypass,preset_b64:s.preset_b64||''}));window.NativeBridgeService.setFxChain(JSON.stringify(chain));},[ozState.vstFxChain]);const toggleMasterVst=idx=>setMasterVstChain(masterVstChain.map((s,i)=>i===idx?{...s,bypass:!s.bypass}:s));const removeMasterVst=idx=>setMasterVstChain(masterVstChain.filter((_,i)=>i!==idx));const moveMasterVst=(idx,dir)=>{const j=idx+dir;if(j<0||j>=masterVstChain.length)return;const next=[...masterVstChain];const mv=next.splice(idx,1)[0];next.splice(j,0,mv);setMasterVstChain(next);};const openMasterVstGui=s=>{if(!s||!s.path){window.showToast&&window.showToast('Chọn VST FX trước','warning');return;}if(masterGuiOpen)closeMasterGui();if(s.path)setActiveMasterVstPath(s.path);if(!window.SonicAPI||!window.SonicAPI.openFxGui){window.showToast&&window.showToast('Máy này không hỗ trợ mở GUI VST','warning');return;}window.SonicAPI.openFxGui({path:s.path,name:s.name||s.path,embed:true}).then(r=>{if(r&&r.embed_url)setMasterGuiOpen({path:s.path,url:r.embed_url});else if(r&&r.already_running)window.showToast&&window.showToast('GUI của plugin này đang mở sẵn (cửa sổ ngoài)','info');else window.showToast&&window.showToast('Không mở được GUI embed','error');}).catch(err=>window.showToast&&window.showToast('Lỗi mở GUI: '+(err.message||err),'error'));};const addMasterVst=path=>{const fx=(masterFxList||[]).find(f=>f.path===path);if(!fx)return;setMasterVstChain([...masterVstChain,{type:'vst3',path:fx.path,name:fx.name||fx.id,preset_b64:'',bypass:false}]);openMasterVstGui({path:fx.path,name:fx.name||fx.id});};const changeMasterVstPlugin=(idx,path)=>{const fx=(masterFxList||[]).find(f=>f.path===path);setMasterVstChain(masterVstChain.map((s,i)=>i===idx?{...s,path,name:fx?fx.name||fx.id:s.name,preset_b64:''}:s));};const uploadMasterVstPreset=idx=>{const inp=document.createElement('input');inp.type='file';inp.accept='.vstpreset,.fxp,.fxb,.dspreset';inp.onchange=()=>{const f=inp.files&&inp.files[0];if(!f)return;const reader=new FileReader();reader.onload=()=>{const b64=String(reader.result||'').split(',')[1]||'';setMasterVstChain(masterVstChain.map((s,i)=>i===idx?{...s,preset_b64:b64}:s));window.showToast&&window.showToast('Đã gắn preset .vstpreset vào slot '+(idx+1),'success');};reader.readAsDataURL(f);};inp.click();};const previewMasterFx=async()=>{try{if(previewAudioRef.current){previewAudioRef.current.pause();previewAudioRef.current=null;}if(!window.__renderProjectPreview){window.showToast&&window.showToast('Không có hàm render preview','warning');return;}window.showToast&&window.showToast('Đang render offline (bridge)...','info');const res=await window.__renderProjectPreview();const au=new Audio((window.API_BASE_URL||'')+res.url);previewAudioRef.current=au;au.onended=()=>{previewAudioRef.current=null;};au.play().then(()=>window.showToast&&window.showToast('Preview offline — âm thật = âm export (VST FX)','success')).catch(()=>{});}catch(e){/* toast ở __renderProjectPreview */}};const audioRef=React.useRef({source:null});const eqCanvasRef=React.useRef(null);const imagerCanvasRef=React.useRef(null);const inMeterCanvasRef=React.useRef(null);const outMeterCanvasRef=React.useRef(null);const animFrameRef=React.useRef(null);const lufsAccRef=React.useRef([]);const knobsInitializedRef=React.useRef(false);// VST FX masterbus (native_bridge --render-fx) — list VST3 effect plugins + preview +React.useEffect(()=>{if(!window.NativeBridgeService||!window.NativeBridgeService.setFxChain)return;const chain=(ozState.vstFxChain||[]).map(s=>({path:s.path||'',bypass:!!s.bypass,preset_b64:s.preset_b64||''}));window.NativeBridgeService.setFxChain(JSON.stringify(chain));},[ozState.vstFxChain]);const toggleMasterVst=idx=>setMasterVstChain(masterVstChain.map((s,i)=>i===idx?{...s,bypass:!s.bypass}:s));const removeMasterVst=idx=>{const rem=masterVstChain[idx];if(rem)delete _capturedPresetByPath[rem.path];setMasterVstChain(masterVstChain.filter((_,i)=>i!==idx));};const moveMasterVst=(idx,dir)=>{const j=idx+dir;if(j<0||j>=masterVstChain.length)return;const next=[...masterVstChain];const mv=next.splice(idx,1)[0];next.splice(j,0,mv);setMasterVstChain(next);};const openMasterVstGui=s=>{if(!s||!s.path){window.showToast&&window.showToast('Chọn VST FX trước','warning');return;}if(masterGuiOpen)closeMasterGui();if(s.path)setActiveMasterVstPath(s.path);if(!window.SonicAPI||!window.SonicAPI.openFxGui){window.showToast&&window.showToast('Máy này không hỗ trợ mở GUI VST','warning');return;}window.SonicAPI.openFxGui({path:s.path,name:s.name||s.path,embed:true}).then(r=>{if(r&&r.embed_url){setMasterGuiOpen({path:s.path,url:r.embed_url,name:s.name||s.path});setOzState(prev=>({...(prev||{}),gui_open_path:s.path,gui_open_name:s.name||s.path}));}else if(r&&r.already_running)window.showToast&&window.showToast('GUI của plugin này đang mở sẵn (cửa sổ ngoài)','info');else window.showToast&&window.showToast('Không mở được GUI embed','error');}).catch(err=>window.showToast&&window.showToast('Lỗi mở GUI: '+(err.message||err),'error'));};const addMasterVst=path=>{const fx=(masterFxList||[]).find(f=>f.path===path);if(!fx)return;setMasterVstChain([...masterVstChain,{type:'vst3',path:fx.path,name:fx.name||fx.id,preset_b64:'',bypass:false}]);openMasterVstGui({path:fx.path,name:fx.name||fx.id});};const changeMasterVstPlugin=(idx,path)=>{const fx=(masterFxList||[]).find(f=>f.path===path);delete _capturedPresetByPath[path];setMasterVstChain(masterVstChain.map((s,i)=>i===idx?{...s,path,name:fx?fx.name||fx.id:s.name,preset_b64:''}:s));};const uploadMasterVstPreset=idx=>{const inp=document.createElement('input');inp.type='file';inp.accept='.vstpreset,.fxp,.fxb,.dspreset';inp.onchange=()=>{const f=inp.files&&inp.files[0];if(!f)return;const reader=new FileReader();reader.onload=()=>{const b64=String(reader.result||'').split(',')[1]||'';setMasterVstChain(masterVstChain.map((s,i)=>i===idx?{...s,preset_b64:b64}:s));window.showToast&&window.showToast('Đã gắn preset .vstpreset vào slot '+(idx+1),'success');};reader.readAsDataURL(f);};inp.click();};const previewMasterFx=async()=>{try{if(previewAudioRef.current){previewAudioRef.current.pause();previewAudioRef.current=null;}if(!window.__renderProjectPreview){window.showToast&&window.showToast('Không có hàm render preview','warning');return;}window.showToast&&window.showToast('Đang render offline (bridge)...','info');const res=await window.__renderProjectPreview();const au=new Audio((window.API_BASE_URL||'')+res.url);previewAudioRef.current=au;au.onended=()=>{previewAudioRef.current=null;};au.play().then(()=>window.showToast&&window.showToast('Preview offline — âm thật = âm export (VST FX)','success')).catch(()=>{});}catch(e){/* toast ở __renderProjectPreview */}};const audioRef=React.useRef({source:null});const eqCanvasRef=React.useRef(null);const imagerCanvasRef=React.useRef(null);const inMeterCanvasRef=React.useRef(null);const outMeterCanvasRef=React.useRef(null);const animFrameRef=React.useRef(null);const lufsAccRef=React.useRef([]);const knobsInitializedRef=React.useRef(false);// VST FX masterbus (native_bridge --render-fx) — list VST3 effect plugins + preview const[masterFxList,setMasterFxList]=React.useState([]);React.useEffect(()=>{if(window.SonicAPI&&window.SonicAPI.listFx){window.SonicAPI.listFx().then(d=>setMasterFxList(d&&d.plugins||[])).catch(()=>setMasterFxList([]));}},[]);const previewAudioRef=React.useRef(null);const[addMasterVstSel,setAddMasterVstSel]=React.useState('');const[masterVstPickerOpen,setMasterVstPickerOpen]=React.useState(false);// Wave Observer Refs & States const woCanvasRef=React.useRef(null);const woLeftHistoryRef=React.useRef(new Float32Array(400).fill(0));const woRightHistoryRef=React.useRef(new Float32Array(400).fill(0));const woLeftMeterRef=React.useRef(null);const woRightMeterRef=React.useRef(null);const[woPaused,setWoPaused]=React.useState(false);const[woChannel,setWoChannel]=React.useState('stereo');const[woMode,setWoMode]=React.useState('waveform');const[woDuration,setWoDuration]=React.useState(2.0);const[woZoom,setWoZoom]=React.useState(0.0);const woPausedRef=React.useRef(woPaused);woPausedRef.current=woPaused;const woChannelRef=React.useRef(woChannel);woChannelRef.current=woChannel;const woModeRef=React.useRef(woMode);woModeRef.current=woMode;const woDurationRef=React.useRef(woDuration);woDurationRef.current=woDuration;const woZoomRef=React.useRef(woZoom);woZoomRef.current=woZoom;const ozStateRef=React.useRef(ozState);ozStateRef.current=ozState;function startAudioDemo(){getAudioContext();const ctx=audioCtx;if(ctx.state==='suspended')ctx.resume();stopAudioDemo();const sampleRate=ctx.sampleRate;const bufferSize=sampleRate*4;const buffer=ctx.createBuffer(2,bufferSize,sampleRate);const left=buffer.getChannelData(0);const right=buffer.getChannelData(1);for(let i=0;i{if(!isOpen)return;getAudioContext();function resizeAll(){const resizeCanvas=ref=>{const el=ref.current;if(el){el.width=el.clientWidth;el.height=el.clientHeight;}};resizeCanvas(eqCanvasRef);resizeCanvas(imagerCanvasRef);resizeCanvas(inMeterCanvasRef);resizeCanvas(outMeterCanvasRef);resizeCanvas(woCanvasRef);}resizeAll();window.addEventListener('resize',resizeAll);const fftData=new Uint8Array(1024);function getPeakLevel(analyser){if(!analyser)return 0;const bufferLength=analyser.fftSize;const dataArray=new Float32Array(bufferLength);analyser.getFloatTimeDomainData(dataArray);let maxVal=0;for(let i=0;imaxVal){maxVal=val;}}return maxVal;}function renderFrame(){animFrameRef.current=requestAnimationFrame(renderFrame);const s=ozStateRef.current;// EQ Spectrum const eqCanvas=eqCanvasRef.current;if(eqCanvas){const w=eqCanvas.width,h=eqCanvas.height;const eqCtx=eqCanvas.getContext('2d');eqCtx.clearRect(0,0,w,h);eqCtx.strokeStyle='rgba(51, 65, 85, 0.3)';eqCtx.lineWidth=1;eqCtx.font='9px JetBrains Mono';eqCtx.fillStyle='#475569';const freqs=[20,50,100,200,500,1000,2000,5000,10000,20000];freqs.forEach(f=>{const x=Math.log10(f/20)/Math.log10(20000/20)*w;eqCtx.beginPath();eqCtx.moveTo(x,0);eqCtx.lineTo(x,h);eqCtx.stroke();if(f>=1000)eqCtx.fillText(`${f/1000}k`,x+3,h-6);else eqCtx.fillText(`${f}`,x+3,h-6);});if(masterBus&&masterBus.outputAnalyser){masterBus.outputAnalyser.getByteFrequencyData(fftData);eqCtx.fillStyle='rgba(56, 189, 248, 0.15)';const barWidth=w/128;for(let i=0;i<128;i++){const val=fftData[i*4]/255;eqCtx.fillRect(i*barWidth,h-val*h,barWidth-1,val*h);}}eqCtx.strokeStyle='#38bdf8';eqCtx.lineWidth=2.5;eqCtx.beginPath();for(let x=0;x{flags[chainFlag(m.type)]=!!m.active;});const activeModule=prev.activeModule;let vstFxChain=prev.vstFxChain||[];if(removed&&removed.type==='vst3'){const vi=vstFxChain.findIndex(s=>s.path===removed.path);if(vi>=0)vstFxChain=[...vstFxChain.slice(0,vi),...vstFxChain.slice(vi+1)];}return{...prev,chain,...flags,vstFxChain,activeModule:chain.some(m=>m.type===activeModule)?activeModule:chain[chain.length-1].type};});};const reorderChain=(fromIdx,toIdx)=>{if(fromIdx===toIdx)return;setOzState(prev=>{const chain=[...prev.chain];const moved=chain.splice(fromIdx,1)[0];chain.splice(toIdx,0,moved);return{...prev,chain};});};const addModuleToChain=type=>{const meta=MODULE_META[type];const id='mod_'+type+'_'+Date.now();const entry={id,type,name:meta.name,active:true};if(type==='eqpro')entry.params={amount:100,bands:JSON.parse(JSON.stringify(EQPRO_DEFAULT_BANDS))};if(type==='carla')entry.params={plugin:'',plugin_path:''};setOzState(prev=>({...prev,chain:[...(prev.chain||[]),entry],[chainFlag(type)]:true,activeModule:type}));setAddModuleOpen(false);};const addVstToChain=path=>{const fx=(masterFxList||[]).find(f=>f.path===path);if(!fx)return;const id='mod_vst_'+Date.now();const entry={id,type:'vst3',path:fx.path,name:fx.name||fx.id,preset_b64:'',bypass:false,active:true};setOzState(prev=>({...prev,chain:[...(prev.chain||[]),entry],vstFxChain:[...(prev.vstFxChain||[]),{type:'vst3',path:fx.path,name:fx.name||fx.id,preset_b64:'',bypass:false}]}));setAddModuleOpen(false);};const updateChainEntryParams=(modId,patch)=>{setOzState(prev=>({...prev,chain:(prev.chain||[]).map(m=>m.id===modId?{...m,params:{...(m.params||{}),...patch}}:m)}));};// ── EQ Preset Library (mastering_expand.md §II.1) ── const EQ_PRESET_LIBRARY={flat:{name:'Flat / Reset',bands:[{id:1,type:'lowshelf',freq:100,gain:0.0,q:0.7},{id:2,type:'peaking',freq:800,gain:0.0,q:0.7},{id:3,type:'peaking',freq:3200,gain:0.0,q:1.2},{id:4,type:'highshelf',freq:10000,gain:0.0,q:0.7}]},vocal_clarity:{name:'Vocal Unmask & Clarity',bands:[{id:1,type:'lowshelf',freq:90,gain:-2.5,q:0.7},{id:2,type:'peaking',freq:500,gain:-1.8,q:1.0},{id:3,type:'peaking',freq:2800,gain:3.2,q:1.2},{id:4,type:'highshelf',freq:12000,gain:2.0,q:0.7}]},bass_punch:{name:'EDM Low-End Punch',bands:[{id:1,type:'lowshelf',freq:80,gain:4.0,q:0.8},{id:2,type:'peaking',freq:300,gain:-3.0,q:1.4},{id:3,type:'peaking',freq:4000,gain:1.5,q:1.0},{id:4,type:'highshelf',freq:10000,gain:1.0,q:0.7}]},warm_tape:{name:'Warm Vintage Analog',bands:[{id:1,type:'lowshelf',freq:120,gain:2.0,q:0.6},{id:2,type:'peaking',freq:1500,gain:1.0,q:0.5},{id:3,type:'peaking',freq:5000,gain:-2.0,q:1.0},{id:4,type:'highshelf',freq:8000,gain:-3.0,q:0.7}]}};const applyEQPreset=presetKey=>{const preset=EQ_PRESET_LIBRARY[presetKey];if(!preset)return;const bus=masterBus;if(bus&&bus.eqLowFilter){const now=audioCtx?audioCtx.currentTime:0;const filters=[bus.eqLowFilter,bus.eqMid1Filter,bus.eqMid2Filter,bus.eqHighFilter];preset.bands.forEach((bd,i)=>{const f=filters[i];if(!f)return;try{// setValueAtTime (không automation) — tránh "BiquadFilterNode: state is bad" f.frequency.setValueAtTime(bd.freq,now);f.gain.setValueAtTime(bd.gain,now);f.Q.setValueAtTime(bd.q,now);}catch(e){}});}// Sync UI knobs + canvas: [eqLowGain, eqMid1Gain, eqMid2Gain, eqHighGain] -setOzState(prev=>({...prev,eqLowGain:preset.bands[0]?preset.bands[0].gain:prev.eqLowGain,eqMid1Gain:preset.bands[1]?preset.bands[1].gain:prev.eqMid1Gain,eqMid2Gain:preset.bands[2]?preset.bands[2].gain:prev.eqMid2Gain,eqHighGain:preset.bands[3]?preset.bands[3].gain:prev.eqHighGain,eqPreset:presetKey}));};const bandKnob=(param,min,max,val,unit,label,freq,color,filterType)=>/*#__PURE__*/React.createElement("div",{className:"bg-slate-900/80 border border-slate-800 p-2 flex flex-col justify-between items-center rounded-lg"},/*#__PURE__*/React.createElement("div",{className:"flex items-center justify-between text-[10px] font-bold w-full",style:{color}},/*#__PURE__*/React.createElement("span",null,label),/*#__PURE__*/React.createElement("span",{className:"text-[9px] font-mono text-slate-400"},freq)),/*#__PURE__*/React.createElement("div",{className:"my-1"},/*#__PURE__*/React.createElement(MasteringKnob,{param:param,min:min,max:max,value:ozState[param]!==undefined?ozState[param]:val,unit:unit,color:color,onChange:(p,v)=>setOzState(prev=>({...prev,[p]:v}))})),/*#__PURE__*/React.createElement("div",{className:"text-[9px] text-slate-500 font-mono text-center mt-1"},filterType));return/*#__PURE__*/React.createElement("div",{className:"fixed inset-0 z-[100] flex items-center justify-center bg-black/70 backdrop-blur-sm",onClick:onClose},/*#__PURE__*/React.createElement("div",{id:"masteringModalBody",className:"flex flex-col bg-slate-950 text-slate-200 w-[95vw] h-[92vh] max-w-[1400px] rounded-2xl border border-slate-800/80 shadow-2xl overflow-hidden",onClick:e=>e.stopPropagation(),style:{fontFamily:"'Inter', sans-serif"}},/*#__PURE__*/React.createElement("header",{className:"h-12 bg-slate-900/90 border-b border-slate-800/80 flex items-center justify-between px-4 z-30 shrink-0"},/*#__PURE__*/React.createElement("div",{className:"flex items-center gap-3"},/*#__PURE__*/React.createElement("div",{className:"w-7 h-7 rounded-lg bg-cyan-600 flex items-center justify-center font-bold text-white shadow-lg shadow-cyan-950"},/*#__PURE__*/React.createElement("i",{"data-lucide":"zap",className:"w-3.5 h-3.5"})),/*#__PURE__*/React.createElement("div",null,/*#__PURE__*/React.createElement("h1",{className:"text-xs font-bold tracking-wider text-white flex items-center gap-2"},"MASTERING SUITE ",/*#__PURE__*/React.createElement("span",{className:"text-[9px] bg-cyan-950 text-cyan-400 border border-cyan-800/80 px-1.5 py-0.5 rounded oz-font-mono"},"WEB MASTERING V10.5")))),/*#__PURE__*/React.createElement("div",{className:"flex items-center gap-3 bg-slate-950 px-3 py-1 rounded-lg border border-slate-800/80"},/*#__PURE__*/React.createElement("button",{onClick:startAudioDemo,className:"px-3 py-1 bg-cyan-600 hover:bg-cyan-500 text-white rounded text-xs font-semibold flex items-center gap-1.5 transition-all shadow-md shadow-cyan-950"},/*#__PURE__*/React.createElement("i",{"data-lucide":"play",className:"w-3 h-3"})," ",/*#__PURE__*/React.createElement("span",null,"Play Reference")),/*#__PURE__*/React.createElement("button",{onClick:stopAudioDemo,className:"px-3 py-1 bg-slate-800 hover:bg-slate-700 text-slate-300 rounded text-xs font-semibold flex items-center gap-1.5 transition-all"},/*#__PURE__*/React.createElement("i",{"data-lucide":"square",className:"w-3 h-3"})," ",/*#__PURE__*/React.createElement("span",null,"Stop")),/*#__PURE__*/React.createElement("div",{className:"h-4 w-[1px] bg-slate-800 mx-1"}),/*#__PURE__*/React.createElement("div",{className:"flex items-center gap-2 text-xs oz-font-mono"},/*#__PURE__*/React.createElement("span",{className:"text-slate-400 text-[11px]"},"Preset:"),/*#__PURE__*/React.createElement("select",{className:"bg-slate-900 border border-slate-700 rounded px-2 py-0.5 text-xs text-cyan-300 outline-none focus:border-cyan-500"},/*#__PURE__*/React.createElement("option",{value:"adaptive"},"Adaptive Dynamic Master"),/*#__PURE__*/React.createElement("option",{value:"edm_club"},"EDM / Club Punch Maximizer"),/*#__PURE__*/React.createElement("option",{value:"wide_space"},"Cinematic Stereo Expansion"),/*#__PURE__*/React.createElement("option",{value:"transparent"},"Transparent High-Clarity Limiter")))),/*#__PURE__*/React.createElement("div",{className:"flex items-center gap-3 text-xs oz-font-mono"},/*#__PURE__*/React.createElement("span",{className:"text-slate-400 text-[11px]"},"Target LUFS:"),/*#__PURE__*/React.createElement("span",{className:"text-cyan-400 font-bold bg-slate-950 border border-cyan-900/60 px-2 py-0.5 rounded"},"-11.0 LUFS"),/*#__PURE__*/React.createElement("button",{onClick:()=>{getAudioContext();setMasterConnected(prev=>!prev);},className:`px-2 py-0.5 rounded text-[10px] font-bold border transition-colors ${masterConnected?'bg-emerald-700 border-emerald-500 text-white':'bg-slate-800 border-slate-700 text-slate-300 hover:bg-slate-700'}`},masterConnected?'Master ON':'Master OFF'),/*#__PURE__*/React.createElement("button",{onClick:onClose,className:"px-2 py-0.5 rounded text-[10px] font-bold border transition-colors bg-slate-800 border-slate-700 text-slate-300 hover:bg-[#c2410c] hover:border-red-600 hover:text-white"},"\u0110\xF3ng"),/*#__PURE__*/React.createElement("button",{onClick:onClose,className:"text-slate-500 hover:text-slate-300 ml-1"},/*#__PURE__*/React.createElement("i",{"data-lucide":"x",className:"w-4 h-4"})))),/*#__PURE__*/React.createElement("div",{className:"h-16 bg-slate-950 border-b border-slate-800 px-4 flex items-center gap-2 overflow-x-auto shrink-0 oz-scrollbar"},/*#__PURE__*/React.createElement("span",{className:"text-[10px] font-bold text-slate-500 uppercase tracking-widest mr-1 oz-font-mono shrink-0"},"CHAIN:"),(ozState.chain||[]).map((mod,idx)=>{const isVst=mod.type==='vst3';const meta=MODULE_META[mod.type]||{name:mod.type,sub:'',icon:'circle',color:'#94a3b8'};const isEditing=!isVst&&ozState.activeModule===mod.type||isVst&&activeMasterVstPath===mod.path;const isOn=isVst?mod.active!==false:chainActive(mod.type);return/*#__PURE__*/React.createElement("div",{key:mod.id,draggable:true,onDragStart:e=>{dragChainIndexRef.current=idx;e.dataTransfer.effectAllowed='move';},onDragOver:e=>{e.preventDefault();e.dataTransfer.dropEffect='move';},onDrop:e=>{e.preventDefault();const from=dragChainIndexRef.current;if(from!==null&&from!==idx)reorderChain(from,idx);dragChainIndexRef.current=null;},onClick:()=>{if(mod.type==='vst3'){openMasterVstGui({path:mod.path,name:mod.name||mod.path});}else{closeMasterGui();switchModule(mod.type);}},className:`w-40 h-12 rounded-lg p-2 flex items-center justify-between cursor-pointer transition-all shrink-0 ${isEditing?'oz-card-active':'oz-card'}`},/*#__PURE__*/React.createElement("div",{className:"flex items-center gap-2 min-w-0"},/*#__PURE__*/React.createElement("button",{onClick:e=>{e.stopPropagation();toggleChainModule(mod.id);},className:"w-4 h-4 rounded-full flex items-center justify-center text-[9px] font-bold shrink-0",style:{backgroundColor:isOn?'#38bdf8':'#334155',color:isOn?'#0f172a':'#94a3b8'}},/*#__PURE__*/React.createElement("i",{"data-lucide":"power",className:"w-2.5 h-2.5"})),/*#__PURE__*/React.createElement("div",{className:"min-w-0"},/*#__PURE__*/React.createElement("div",{className:"text-[11px] font-bold text-slate-200 truncate"},isVst?mod.name||meta.name:meta.name),/*#__PURE__*/React.createElement("div",{className:"text-[9px] oz-font-mono truncate",style:{color:meta.color}},idx+1,". ",isVst?mod.path?mod.path.split(/[\\/]/).pop():'VST3':meta.sub))),/*#__PURE__*/React.createElement("div",{className:"flex items-center gap-1 shrink-0"},/*#__PURE__*/React.createElement("i",{"data-lucide":meta.icon,className:"w-3 h-3 text-slate-500"}),/*#__PURE__*/React.createElement("button",{onClick:e=>{e.stopPropagation();removeChainModule(mod.id);},className:"text-slate-600 hover:text-red-400 text-xs w-4 h-4 flex items-center justify-center shrink-0",title:"X\xF3a module"},/*#__PURE__*/React.createElement("i",{"data-lucide":"x",className:"w-3 h-3"}))));}),/*#__PURE__*/React.createElement("button",{onClick:()=>setAddModuleOpen(true),className:"w-24 h-12 rounded-lg border border-dashed border-slate-800 flex items-center justify-center text-slate-600 hover:text-slate-400 hover:border-slate-600 cursor-pointer transition-all shrink-0",title:"Th\xEAm module v\xE0o chain"},/*#__PURE__*/React.createElement("i",{"data-lucide":"plus",className:"w-4 h-4"}))),/*#__PURE__*/React.createElement("main",{className:"flex-1 flex overflow-hidden min-h-0"},masterGuiOpen?/*#__PURE__*/React.createElement("div",{className:"flex-1 flex flex-col bg-slate-950 relative min-h-0"},/*#__PURE__*/React.createElement(VstGuiEmbed,{url:masterGuiOpen.url,onClose:closeMasterGui,onDead:()=>{window.showToast&&window.showToast('Bridge VST GUI đã mất kết nối — trả về graph','error');closeMasterGui();}})):/*#__PURE__*/React.createElement("div",{className:"flex-1 flex flex-col bg-slate-950 relative overflow-y-auto oz-scrollbar"},/*#__PURE__*/React.createElement("div",{className:"h-9 bg-slate-900/60 border-b border-slate-800/80 px-4 flex items-center justify-between text-xs oz-font-mono shrink-0"},/*#__PURE__*/React.createElement("div",{className:"flex items-center gap-3"},/*#__PURE__*/React.createElement("span",{className:"text-slate-400 flex items-center gap-1.5"},/*#__PURE__*/React.createElement("i",{"data-lucide":"headphones",className:"w-3 h-3 text-cyan-400"})," Delta Listen"),/*#__PURE__*/React.createElement("select",{className:"bg-slate-950 border border-slate-800 rounded px-2 py-0.5 text-[11px] text-slate-300 outline-none"},/*#__PURE__*/React.createElement("option",{value:"irc4"},"IRC IV - Classic"),/*#__PURE__*/React.createElement("option",{value:"irc3"},"IRC III - Balanced"),/*#__PURE__*/React.createElement("option",{value:"irc2"},"IRC II - Crisp"))),/*#__PURE__*/React.createElement("div",{className:"flex items-center gap-2 text-[11px]"},ozState.activeModule==='eq'&&/*#__PURE__*/React.createElement("div",{className:"flex items-center gap-1.5"},/*#__PURE__*/React.createElement("span",{className:"text-slate-400"},"EQ Presets:"),/*#__PURE__*/React.createElement("select",{value:ozState.eqPreset||'flat',onChange:e=>applyEQPreset(e.target.value),className:"bg-slate-950 border border-slate-700 text-cyan-300 rounded px-2 py-0.5 text-[11px] outline-none focus:border-cyan-500"},Object.keys(EQ_PRESET_LIBRARY).map(k=>/*#__PURE__*/React.createElement("option",{key:k,value:k},EQ_PRESET_LIBRARY[k].name)))),/*#__PURE__*/React.createElement("span",{className:"text-slate-400"},"Learn Input Gain:"),/*#__PURE__*/React.createElement("button",{className:"bg-cyan-950 text-cyan-300 border border-cyan-800/80 px-2 py-0.5 rounded font-bold hover:bg-cyan-900 transition-colors"},"-11.0 LUFS"))),/*#__PURE__*/React.createElement("div",{className:`flex-1 flex flex-col p-4 gap-4 ${ozState.activeModule==='eq'?'':'hidden'}`},/*#__PURE__*/React.createElement("div",{className:"relative w-full h-64 bg-slate-950 border border-slate-800/90 rounded-xl overflow-hidden shadow-inner cursor-crosshair"},/*#__PURE__*/React.createElement("canvas",{ref:eqCanvasRef,className:"w-full h-full block"})),/*#__PURE__*/React.createElement("div",{className:"oz-panel p-3 rounded-xl grid grid-cols-4 gap-3"},bandKnob('eqLowGain',-12,12,1.5,'dB','BAND 1 (LOW)','100 Hz','#22d3ee','Shelf Filter'),bandKnob('eqMid1Gain',-12,12,-1.0,'dB','BAND 2 (MID LOW)','822 Hz','#fbbf24','Dynamic Bell (Q: 0.7)'),bandKnob('eqMid2Gain',-12,12,2.0,'dB','BAND 3 (MID HIGH)','3.2 kHz','#a855f7','Dynamic Bell (Q: 1.2)'),bandKnob('eqHighGain',-12,12,1.8,'dB','BAND 4 (HIGH)','10 kHz','#34d399','High Shelf'))),/*#__PURE__*/React.createElement("div",{className:`flex-1 flex flex-col p-4 gap-4 ${ozState.activeModule==='eqpro'?'':'hidden'}`},(()=>{const chainMods=ozState.chain||[];const cm=chainMods.find(m=>m.type==='eqpro'&&m.active!==false)||chainMods.find(m=>m.type==='eqpro');if(!cm)return/*#__PURE__*/React.createElement("div",{className:"text-xs text-slate-500 font-mono py-10 text-center"},"Ch\u01B0a c\xF3 module EQ PRO trong chain \u2014 b\u1EA5m [+] \u0111\u1EC3 th\xEAm.");return/*#__PURE__*/React.createElement(InteractiveEqPro,{track:null,params:cm.params||{},onChange:next=>updateChainEntryParams(cm.id,next),getModule:()=>masterBus&&masterBus.eqProInstances?masterBus.eqProInstances[cm.id]:null,spectrumModules:()=>{const m=masterBus&&masterBus.eqProInstances?masterBus.eqProInstances[cm.id]:null;return m?[m]:[];},applyTo:fn=>{const m=masterBus&&masterBus.eqProInstances?masterBus.eqProInstances[cm.id]:null;if(m)fn(m);}});})()),/*#__PURE__*/React.createElement("div",{className:`flex-1 flex flex-col p-4 gap-4 ${ozState.activeModule==='imager'?'':'hidden'}`},/*#__PURE__*/React.createElement("div",{className:"grid grid-cols-12 gap-4 flex-1"},/*#__PURE__*/React.createElement("div",{className:"col-span-8 bg-slate-950 border border-slate-800/90 rounded-xl p-3 flex flex-col relative shadow-inner"},/*#__PURE__*/React.createElement("span",{className:"text-xs font-bold text-cyan-400 uppercase oz-font-mono mb-2 flex items-center justify-between w-full"},/*#__PURE__*/React.createElement("span",null,/*#__PURE__*/React.createElement("i",{"data-lucide":"radio",className:"w-3.5 h-3.5"})," Polar Vectorscope & Correlation Meter"),/*#__PURE__*/React.createElement("span",{className:"text-[11px] text-slate-400 normal-case"},"Corr: ",/*#__PURE__*/React.createElement("span",{id:"corrText",className:"font-bold text-emerald-400"},"1.00"))),/*#__PURE__*/React.createElement("div",{className:"flex-1 relative w-full h-56 flex items-center justify-center"},/*#__PURE__*/React.createElement("canvas",{ref:imagerCanvasRef,className:"w-full h-full block"}))),/*#__PURE__*/React.createElement("div",{className:"col-span-4 oz-panel p-3 rounded-xl flex flex-col justify-between"},/*#__PURE__*/React.createElement("span",{className:"text-xs font-bold text-slate-300 uppercase oz-font-mono"},"4-Band Stereo Width"),/*#__PURE__*/React.createElement("div",{className:"text-[10px] text-slate-500 oz-font-mono leading-snug"},"0% = Mono \xB7 100% = Original \xB7 200% = 2\xD7 Width"),/*#__PURE__*/React.createElement("div",{className:"space-y-3 my-auto"},[{id:'w1',label:'Band 1 (20-100Hz)',color:'#22d3ee',val:ozState.w1},{id:'w2',label:'Band 2 (100Hz-1kHz)',color:'#fbbf24',val:ozState.w2},{id:'w3',label:'Band 3 (1k-6kHz)',color:'#a855f7',val:ozState.w3},{id:'w4',label:'Band 4 (6k-20kHz)',color:'#34d399',val:ozState.w4}].map(b=>/*#__PURE__*/React.createElement("div",{key:b.id},/*#__PURE__*/React.createElement("div",{className:"flex justify-between text-[11px] font-mono mb-1"},/*#__PURE__*/React.createElement("span",{style:{color:b.color,fontWeight:700}},b.label),/*#__PURE__*/React.createElement("span",{id:b.id+'Val'},b.val,"%")),/*#__PURE__*/React.createElement("input",{type:"range",min:"0",max:"200",value:b.val,onChange:e=>setOzState(prev=>({...prev,[b.id]:parseInt(e.target.value)})),className:"w-full h-1 cursor-pointer",style:{accentColor:b.color}}))))))),/*#__PURE__*/React.createElement("div",{className:`flex-1 flex flex-col p-4 gap-4 ${ozState.activeModule==='maximizer'?'':'hidden'}`},/*#__PURE__*/React.createElement("div",{className:"oz-panel p-4 rounded-xl flex-1 grid grid-cols-12 gap-6 items-center"},/*#__PURE__*/React.createElement("div",{className:"col-span-4 flex flex-col items-center justify-center border-r border-slate-800 pr-4"},/*#__PURE__*/React.createElement("span",{className:"text-xs font-bold text-slate-400 uppercase oz-font-mono mb-3"},"Maximizer Gain Boost"),/*#__PURE__*/React.createElement("div",{className:"my-2"},/*#__PURE__*/React.createElement(MasteringKnob,{param:"maxGain",min:0,max:12,value:ozState.maxGain,unit:"dB",color:"#22d3ee",size:"large",onChange:(p,v)=>setOzState(prev=>({...prev,[p]:v}))})),/*#__PURE__*/React.createElement("div",{className:"w-full mt-4 bg-slate-950 p-2 rounded-lg border border-slate-800 text-xs oz-font-mono flex flex-col gap-1.5"},/*#__PURE__*/React.createElement("div",{className:"flex justify-between items-center w-full"},/*#__PURE__*/React.createElement("span",{className:"text-slate-400"},"Ceiling Level:"),/*#__PURE__*/React.createElement("span",{className:"text-cyan-400 font-bold"},ozState.ceiling.toFixed(2)," dB")),/*#__PURE__*/React.createElement("input",{type:"range",min:"-12",max:"0",step:"0.1",value:ozState.ceiling,onChange:e=>setOzState(prev=>({...prev,ceiling:parseFloat(e.target.value)})),className:"w-full h-1 cursor-pointer accent-cyan-400"}))),/*#__PURE__*/React.createElement("div",{className:"col-span-8 grid grid-cols-3 gap-4"},/*#__PURE__*/React.createElement("div",{className:"bg-slate-950 p-3 border border-slate-800 rounded-xl flex flex-col items-center justify-center h-full"},/*#__PURE__*/React.createElement(MasteringKnob,{param:"maxUpward",min:0,max:10,value:ozState.maxUpward,unit:"dB",label:"UPWARD COMPRESS",color:"#22d3ee",onChange:(p,v)=>setOzState(prev=>({...prev,[p]:v}))})),/*#__PURE__*/React.createElement("div",{className:"bg-slate-950 p-3 border border-slate-800 rounded-xl flex flex-col items-center justify-center h-full"},/*#__PURE__*/React.createElement(MasteringKnob,{param:"maxSoftClip",min:0,max:100,value:ozState.maxSoftClip,unit:"%",label:"SOFT CLIPPER",color:"#fbbf24",onChange:(p,v)=>setOzState(prev=>({...prev,[p]:v}))})),/*#__PURE__*/React.createElement("div",{className:"bg-slate-950 p-3 border border-slate-800 rounded-xl flex flex-col items-center justify-center h-full"},/*#__PURE__*/React.createElement(MasteringKnob,{param:"maxTransient",min:0,max:100,value:ozState.maxTransient,unit:"%",label:"TRANSIENT EMPHASIS",color:"#34d399",onChange:(p,v)=>setOzState(prev=>({...prev,[p]:v}))}))))),/*#__PURE__*/React.createElement("div",{className:`flex-1 flex flex-col p-4 gap-4 ${ozState.activeModule==='compressor'?'':'hidden'}`},/*#__PURE__*/React.createElement("div",{className:"oz-panel p-4 rounded-xl flex-1 grid grid-cols-12 gap-6 items-center"},/*#__PURE__*/React.createElement("div",{className:"col-span-4 flex flex-col items-center justify-center border-r border-slate-800 pr-4"},/*#__PURE__*/React.createElement("span",{className:"text-xs font-bold text-amber-400 uppercase oz-font-mono mb-3"},"Bus Compressor"),/*#__PURE__*/React.createElement("div",{className:"my-2"},/*#__PURE__*/React.createElement(MasteringKnob,{param:"compMakeup",min:0,max:12,value:ozState.compMakeup,unit:"dB",label:"MAKE-UP GAIN",color:"#fbbf24",onChange:(p,v)=>setOzState(prev=>({...prev,[p]:v}))})),/*#__PURE__*/React.createElement("button",{onClick:()=>toggleChainModule((ozState.chain||[]).find(m=>m.type==='compressor')?.id),className:`px-3 py-1 rounded text-[10px] font-bold border transition-colors mt-2 ${ozState.compActive?'bg-amber-700 border-amber-500 text-white':'bg-slate-800 border-slate-700 text-slate-300'}`},ozState.compActive?'ON':'OFF')),/*#__PURE__*/React.createElement("div",{className:"col-span-8 grid grid-cols-3 gap-4"},/*#__PURE__*/React.createElement("div",{className:"bg-slate-950 p-3 border border-slate-800 rounded-xl flex flex-col items-center justify-center h-full"},/*#__PURE__*/React.createElement(MasteringKnob,{param:"compThreshold",min:-60,max:0,value:ozState.compThreshold,unit:"dB",label:"THRESHOLD",color:"#fbbf24",onChange:(p,v)=>setOzState(prev=>({...prev,[p]:v}))})),/*#__PURE__*/React.createElement("div",{className:"bg-slate-950 p-3 border border-slate-800 rounded-xl flex flex-col items-center justify-center h-full"},/*#__PURE__*/React.createElement(MasteringKnob,{param:"compRatio",min:1,max:20,value:ozState.compRatio,unit:":1",label:"RATIO",color:"#f59e0b",onChange:(p,v)=>setOzState(prev=>({...prev,[p]:v}))})),/*#__PURE__*/React.createElement("div",{className:"bg-slate-950 p-3 border border-slate-800 rounded-xl flex flex-col items-center justify-center h-full"},/*#__PURE__*/React.createElement("span",{className:"text-[10px] text-slate-500 oz-font-mono text-center leading-snug px-2"},"Glue & Punch",/*#__PURE__*/React.createElement("br",null),"Attack 20ms \xB7 Release 250ms \xB7 Knee 8dB"))))),/*#__PURE__*/React.createElement("div",{className:`flex-1 flex flex-col p-4 gap-4 ${ozState.activeModule==='limiter'?'':'hidden'}`},/*#__PURE__*/React.createElement("div",{className:"oz-panel p-4 rounded-xl flex-1 grid grid-cols-12 gap-6 items-center"},/*#__PURE__*/React.createElement("div",{className:"col-span-4 flex flex-col items-center justify-center border-r border-slate-800 pr-4"},/*#__PURE__*/React.createElement("span",{className:"text-xs font-bold text-rose-400 uppercase oz-font-mono mb-3"},"Brickwall Limiter"),/*#__PURE__*/React.createElement("button",{onClick:()=>toggleChainModule((ozState.chain||[]).find(m=>m.type==='limiter')?.id),className:`px-3 py-1 rounded text-[10px] font-bold border transition-colors mt-2 ${ozState.limActive?'bg-rose-700 border-rose-500 text-white':'bg-slate-800 border-slate-700 text-slate-300'}`},ozState.limActive?'ON':'OFF')),/*#__PURE__*/React.createElement("div",{className:"col-span-8 grid grid-cols-3 gap-4"},/*#__PURE__*/React.createElement("div",{className:"bg-slate-950 p-3 border border-slate-800 rounded-xl flex flex-col items-center justify-center h-full"},/*#__PURE__*/React.createElement(MasteringKnob,{param:"limThreshold",min:-24,max:0,value:ozState.limThreshold,unit:"dB",label:"CEILING",color:"#f43f5e",onChange:(p,v)=>setOzState(prev=>({...prev,[p]:v}))})),/*#__PURE__*/React.createElement("div",{className:"bg-slate-950 p-3 border border-slate-800 rounded-xl flex flex-col items-center justify-center h-full"},/*#__PURE__*/React.createElement("span",{className:"text-[10px] text-slate-500 oz-font-mono text-center leading-snug px-2"},"True-Peak limiting",/*#__PURE__*/React.createElement("br",null),"Ratio 20:1 \xB7 Knee 0dB",/*#__PURE__*/React.createElement("br",null),"Attack 1ms \xB7 Release 50ms"))))),/*#__PURE__*/React.createElement("div",{className:`flex-1 flex flex-col p-4 gap-4 ${ozState.activeModule==='exciter'?'':'hidden'}`},/*#__PURE__*/React.createElement("div",{className:"oz-panel p-4 rounded-xl flex-1 grid grid-cols-12 gap-6 items-center"},/*#__PURE__*/React.createElement("div",{className:"col-span-4 flex flex-col items-center justify-center border-r border-slate-800 pr-4"},/*#__PURE__*/React.createElement("span",{className:"text-xs font-bold text-purple-400 uppercase oz-font-mono mb-3"},"Harmonic Exciter"),/*#__PURE__*/React.createElement("button",{onClick:()=>toggleChainModule((ozState.chain||[]).find(m=>m.type==='exciter')?.id),className:`px-3 py-1 rounded text-[10px] font-bold border transition-colors mt-2 ${ozState.excActive?'bg-purple-700 border-purple-500 text-white':'bg-slate-800 border-slate-700 text-slate-300'}`},ozState.excActive?'ON':'OFF')),/*#__PURE__*/React.createElement("div",{className:"col-span-8 grid grid-cols-3 gap-4"},/*#__PURE__*/React.createElement("div",{className:"bg-slate-950 p-3 border border-slate-800 rounded-xl flex flex-col items-center justify-center h-full"},/*#__PURE__*/React.createElement(MasteringKnob,{param:"excDrive",min:0,max:100,value:ozState.excDrive,unit:"%",label:"DRIVE / MIX",color:"#c084fc",onChange:(p,v)=>setOzState(prev=>({...prev,[p]:v}))})),/*#__PURE__*/React.createElement("div",{className:"bg-slate-950 p-3 border border-slate-800 rounded-xl flex flex-col items-center justify-center h-full"},/*#__PURE__*/React.createElement("span",{className:"text-[10px] text-slate-500 oz-font-mono text-center leading-snug px-2"},"WaveShaper saturation",/*#__PURE__*/React.createElement("br",null),"High-pass 2kHz",/*#__PURE__*/React.createElement("br",null),"4\xD7 oversampled \xB7 wet/dry mix"))))),/*#__PURE__*/React.createElement("div",{className:`flex-1 flex flex-col p-4 gap-4 ${ozState.activeModule==='rebalance'?'':'hidden'}`},/*#__PURE__*/React.createElement("div",{className:"oz-panel p-4 rounded-xl flex-1 grid grid-cols-12 gap-6 items-center"},/*#__PURE__*/React.createElement("div",{className:"col-span-4 flex flex-col items-center justify-center border-r border-slate-800 pr-4"},/*#__PURE__*/React.createElement("span",{className:"text-xs font-bold text-sky-400 uppercase oz-font-mono mb-3"},"Master Rebalance (M/S)"),/*#__PURE__*/React.createElement("button",{onClick:()=>toggleChainModule((ozState.chain||[]).find(m=>m.type==='rebalance')?.id),className:`px-3 py-1 rounded text-[10px] font-bold border transition-colors mt-2 ${ozState.rebalActive?'bg-sky-700 border-sky-500 text-white':'bg-slate-800 border-slate-700 text-slate-300'}`},ozState.rebalActive?'ON':'OFF')),/*#__PURE__*/React.createElement("div",{className:"col-span-8 grid grid-cols-3 gap-4"},/*#__PURE__*/React.createElement("div",{className:"bg-slate-950 p-3 border border-slate-800 rounded-xl flex flex-col items-center justify-center h-full"},/*#__PURE__*/React.createElement(MasteringKnob,{param:"rebalMid",min:-12,max:12,value:ozState.rebalMid,unit:"dB",label:"MID GAIN",color:"#38bdf8",onChange:(p,v)=>setOzState(prev=>({...prev,[p]:v}))})),/*#__PURE__*/React.createElement("div",{className:"bg-slate-950 p-3 border border-slate-800 rounded-xl flex flex-col items-center justify-center h-full"},/*#__PURE__*/React.createElement(MasteringKnob,{param:"rebalSide",min:-12,max:12,value:ozState.rebalSide,unit:"dB",label:"SIDE GAIN",color:"#22d3ee",onChange:(p,v)=>setOzState(prev=>({...prev,[p]:v}))})),/*#__PURE__*/React.createElement("div",{className:"bg-slate-950 p-3 border border-slate-800 rounded-xl flex flex-col items-center justify-center h-full"},/*#__PURE__*/React.createElement("span",{className:"text-[10px] text-slate-500 oz-font-mono text-center leading-snug px-2"},"ChannelSplitter + M/S gains",/*#__PURE__*/React.createElement("br",null),"Center (vocal/bass) vs Sides (stereo width)"))))),/*#__PURE__*/React.createElement("div",{className:`flex-1 flex flex-col p-4 gap-4 ${ozState.activeModule==='carla'?'':'hidden'}`},/*#__PURE__*/React.createElement("div",{className:"oz-panel p-4 rounded-xl flex-1 grid grid-cols-12 gap-6 items-center"},/*#__PURE__*/React.createElement("div",{className:"col-span-4 flex flex-col items-center justify-center border-r border-slate-800 pr-4"},/*#__PURE__*/React.createElement("span",{className:"text-xs font-bold text-teal-400 uppercase oz-font-mono mb-3"},"Carla Bridge (VST FX)"),/*#__PURE__*/React.createElement("button",{onClick:()=>toggleChainModule((ozState.chain||[]).find(m=>m.type==='carla')?.id),className:`px-3 py-1 rounded text-[10px] font-bold border transition-colors mt-2 ${ozState.carlaBridgeActive?'bg-teal-700 border-teal-500 text-white':'bg-slate-800 border-slate-700 text-slate-300'}`},ozState.carlaBridgeActive?'ON':'OFF')),/*#__PURE__*/React.createElement("div",{className:"col-span-8 space-y-3"},/*#__PURE__*/React.createElement("div",{className:"flex items-end gap-2 flex-wrap"},/*#__PURE__*/React.createElement("div",{className:"flex-1 min-w-[220px]"},/*#__PURE__*/React.createElement("div",{className:"text-[9px] text-slate-500 oz-font-mono mb-1"},"CH\u1ECCN VST FX (\u0111\xE3 scan tr\xEAn m\xE1y)"),/*#__PURE__*/React.createElement("select",{value:ozState.carlaBridge&&ozState.carlaBridge.plugin||'',onChange:e=>setOzState(prev=>({...prev,carlaBridge:{...(prev.carlaBridge||{}),plugin:e.target.value,plugin_path:''}})),className:"w-full bg-slate-950 border border-slate-700 text-teal-300 rounded px-2 py-1.5 text-xs outline-none focus:border-teal-500"},/*#__PURE__*/React.createElement("option",{value:""},"\u2014 Ch\u1ECDn VST FX \u2014"),(masterCarlaVsts||[]).map(v=>/*#__PURE__*/React.createElement("option",{key:v.id||v.name,value:v.id||v.name},v.name||v.id)))),/*#__PURE__*/React.createElement("button",{onClick:()=>{const plugin=ozState.carlaBridge&&ozState.carlaBridge.plugin||'';if(!plugin){window.showToast&&window.showToast('Chọn VST FX trước khi Load Carla','warning');return;}window.SonicAPI.openInCarla(plugin,ozState.carlaBridge.plugin_path).then(r=>{if(r&&r.success){setOzState(prev=>({...prev,carlaBridge:{...(prev.carlaBridge||{}),connected:true}}));window.showToast&&window.showToast('Đã mở Carla với '+plugin+' (VST FX) — chỉnh âm thanh trong Carla','success');}else{window.showToast&&window.showToast('Không mở được Carla','error');}}).catch(err=>window.showToast&&window.showToast('Lỗi mở Carla: '+(err.message||err),'error'));},className:"px-4 py-1.5 bg-teal-700 hover:bg-teal-600 text-white text-xs font-semibold rounded transition flex items-center gap-1 shrink-0"},/*#__PURE__*/React.createElement("i",{"data-lucide":"play",className:"w-3 h-3"})," Load Carla Bridge"),/*#__PURE__*/React.createElement("button",{onClick:()=>{if(window.SonicCarlaMidi&&window.SonicCarlaMidi.stopBridge)window.SonicCarlaMidi.stopBridge();setOzState(prev=>({...prev,carlaBridge:{...(prev.carlaBridge||{}),connected:false}}));window.showToast&&window.showToast('Đã ngắt kết nối Carla Bridge','info');},className:"px-4 py-1.5 bg-zinc-800 hover:bg-zinc-700 text-red-300 text-xs font-semibold rounded transition flex items-center gap-1 shrink-0"},/*#__PURE__*/React.createElement("i",{"data-lucide":"square",className:"w-3 h-3"})," Stop / Unload")),/*#__PURE__*/React.createElement("div",{className:"text-[10px] text-slate-500 oz-font-mono leading-relaxed"},"M\u1EDF Carla v\u1EDBi VST FX \u0111\u1EC3 ch\u1EC9nh s\u1EEDa \xE2m thanh master (native GUI). Module n\xE0y l\xE0 pass-through trong master chain (kh\xF4ng th\xEAm DSP WebAudio).")))),/*#__PURE__*/React.createElement("div",{className:"border-t border-slate-800 bg-slate-900/60 p-3 flex flex-col shrink-0"},/*#__PURE__*/React.createElement("div",{className:"flex items-center justify-between pb-1.5 border-b border-slate-800/80 mb-2"},/*#__PURE__*/React.createElement("div",{className:"flex items-center gap-2"},/*#__PURE__*/React.createElement("span",{className:"text-[11px] font-bold text-white uppercase tracking-wider"},"Wave Observer"),/*#__PURE__*/React.createElement("span",{className:"text-[9px] bg-cyan-950 text-cyan-400 border border-cyan-800/60 px-1.5 py-0.2 rounded font-mono"},"Real-time Oscilloscope")),/*#__PURE__*/React.createElement("div",{className:"flex gap-2"},['Scope','Settings','Help','About'].map(tab=>/*#__PURE__*/React.createElement("button",{key:tab,className:`px-2 py-0.5 rounded text-[10px] font-bold ${tab==='Scope'?'bg-cyan-950 text-cyan-300 border border-cyan-800/60':'text-slate-400 hover:text-slate-200'}`},tab)))),/*#__PURE__*/React.createElement("div",{className:"relative w-full h-32 bg-[#090d16] border border-slate-800/80 rounded-lg overflow-hidden mb-2"},/*#__PURE__*/React.createElement("canvas",{ref:woCanvasRef,className:"w-full h-full block"})),/*#__PURE__*/React.createElement("div",{className:"flex items-center justify-between gap-4 text-[10px] oz-font-mono text-slate-400 mt-1 select-none"},/*#__PURE__*/React.createElement("div",{className:"flex items-center gap-2 bg-slate-950 px-2.5 py-1.5 rounded border border-slate-800/80 shrink-0"},/*#__PURE__*/React.createElement("span",{className:"text-[10px] font-bold text-slate-300"},"Input"),/*#__PURE__*/React.createElement("div",{className:"flex flex-col gap-1 w-20"},/*#__PURE__*/React.createElement("div",{className:"flex items-center gap-1"},/*#__PURE__*/React.createElement("span",{className:"text-[8px] text-slate-500 w-2"},"L"),/*#__PURE__*/React.createElement("div",{className:"w-16 h-1.5 bg-slate-900 rounded-sm overflow-hidden flex items-center"},/*#__PURE__*/React.createElement("div",{ref:woLeftMeterRef,className:"h-full bg-cyan-400 transition-all duration-75",style:{width:'0%'}}))),/*#__PURE__*/React.createElement("div",{className:"flex items-center gap-1"},/*#__PURE__*/React.createElement("span",{className:"text-[8px] text-slate-500 w-2"},"R"),/*#__PURE__*/React.createElement("div",{className:"w-16 h-1.5 bg-slate-900 rounded-sm overflow-hidden flex items-center"},/*#__PURE__*/React.createElement("div",{ref:woRightMeterRef,className:"h-full bg-teal-500 transition-all duration-75",style:{width:'0%'}}))))),/*#__PURE__*/React.createElement("div",{className:"flex items-center gap-4 bg-slate-950 px-3 py-1 rounded border border-slate-800/80 flex-1 justify-around"},/*#__PURE__*/React.createElement("span",{className:"font-bold text-slate-300 uppercase tracking-widest text-[9px]"},"Scope"),/*#__PURE__*/React.createElement("div",{className:"flex items-center gap-1.5"},/*#__PURE__*/React.createElement("span",null,"Channel"),/*#__PURE__*/React.createElement("select",{value:woChannel,onChange:e=>setWoChannel(e.target.value),className:"bg-slate-900 border border-slate-700 rounded px-1.5 py-0.5 text-[9px] text-slate-300 outline-none"},/*#__PURE__*/React.createElement("option",{value:"stereo"},"Stereo"),/*#__PURE__*/React.createElement("option",{value:"left"},"Left Only"),/*#__PURE__*/React.createElement("option",{value:"right"},"Right Only"))),/*#__PURE__*/React.createElement("div",{className:"flex items-center gap-1.5"},/*#__PURE__*/React.createElement("span",null,"Mode"),/*#__PURE__*/React.createElement("select",{value:woMode,onChange:e=>setWoMode(e.target.value),className:"bg-slate-900 border border-slate-700 rounded px-1.5 py-0.5 text-[9px] text-slate-300 outline-none"},/*#__PURE__*/React.createElement("option",{value:"waveform"},"Waveform"),/*#__PURE__*/React.createElement("option",{value:"envelope"},"Envelope"))),/*#__PURE__*/React.createElement("div",{className:"flex items-center gap-1.5"},/*#__PURE__*/React.createElement("span",null,"Duration:"),/*#__PURE__*/React.createElement("span",{className:"text-cyan-400 font-bold w-10 text-right"},woDuration.toFixed(3),"s"),/*#__PURE__*/React.createElement("input",{type:"range",min:"0.5",max:"5.0",step:"0.1",value:woDuration,onChange:e=>setWoDuration(parseFloat(e.target.value)),className:"w-16 h-1 cursor-pointer accent-cyan-400"})),/*#__PURE__*/React.createElement("div",{className:"flex items-center gap-1.5"},/*#__PURE__*/React.createElement("span",null,"V.Zoom:"),/*#__PURE__*/React.createElement("span",{className:"text-cyan-400 font-bold w-12 text-right"},woZoom.toFixed(1)," dB"),/*#__PURE__*/React.createElement("input",{type:"range",min:"-12",max:"24",step:"0.5",value:woZoom,onChange:e=>setWoZoom(parseFloat(e.target.value)),className:"w-16 h-1 cursor-pointer accent-cyan-400"}))),/*#__PURE__*/React.createElement("button",{onClick:()=>setWoPaused(!woPaused),className:`px-3 py-1 rounded font-bold border transition shadow-md shrink-0 flex items-center gap-1 ${woPaused?'bg-amber-800 hover:bg-amber-700 border-amber-500 text-amber-100':'bg-slate-800 hover:bg-slate-700 border-slate-700 text-slate-200'}`},woPaused?'Resume':'Pause')))),/*#__PURE__*/React.createElement("div",{className:"w-64 bg-slate-900 border-l border-slate-800/80 p-3 flex flex-col justify-between shadow-2xl oz-font-mono text-xs z-20 shrink-0"},/*#__PURE__*/React.createElement("div",{className:"flex items-center justify-between border-b border-slate-800 pb-2 mb-2"},/*#__PURE__*/React.createElement("span",{className:"text-xs font-bold text-white tracking-wider uppercase flex items-center gap-1.5"},/*#__PURE__*/React.createElement("i",{"data-lucide":"sliders",className:"w-3 h-3 text-cyan-400"})," I/O METERS"),/*#__PURE__*/React.createElement("span",{className:"text-[9px] bg-cyan-950 border border-cyan-800 text-cyan-300 px-1 py-0.5 rounded"},"TRUE PEAK")),/*#__PURE__*/React.createElement("div",{className:"grid grid-cols-2 gap-2 text-[10px] text-center mb-2"},/*#__PURE__*/React.createElement("div",{className:"bg-slate-950 border border-slate-800/80 p-1.5 rounded"},/*#__PURE__*/React.createElement("div",{className:"text-slate-500 font-bold"},"IN PEAK"),/*#__PURE__*/React.createElement("div",{id:"inPeakText",className:"text-cyan-400 font-bold oz-font-mono"},"-inf dB")),/*#__PURE__*/React.createElement("div",{className:"bg-slate-950 border border-slate-800/80 p-1.5 rounded"},/*#__PURE__*/React.createElement("div",{className:"text-slate-500 font-bold"},"OUT PEAK"),/*#__PURE__*/React.createElement("div",{id:"outPeakText",className:"text-emerald-400 font-bold oz-font-mono"},"-inf dB"))),/*#__PURE__*/React.createElement("div",{className:"grid grid-cols-2 gap-2 text-[10px] text-center mb-2"},/*#__PURE__*/React.createElement("div",{className:"bg-slate-950 border border-slate-800/80 p-1.5 rounded"},/*#__PURE__*/React.createElement("div",{className:"text-slate-500 font-bold"},"OUT RMS"),/*#__PURE__*/React.createElement("div",{id:"outRmsText",className:"text-sky-300 font-bold oz-font-mono"},"-inf")),/*#__PURE__*/React.createElement("div",{className:"bg-slate-950 border border-slate-800/80 p-1.5 rounded"},/*#__PURE__*/React.createElement("div",{className:"text-slate-500 font-bold"},"LOUDNESS"),/*#__PURE__*/React.createElement("div",{id:"lufsText",className:"text-fuchsia-300 font-bold oz-font-mono"},"--.-"))),/*#__PURE__*/React.createElement("div",{className:"flex-1 bg-slate-950 border border-slate-800/90 rounded-xl p-2 flex justify-around relative overflow-hidden my-1"},/*#__PURE__*/React.createElement("div",{className:"flex flex-col items-center h-full"},/*#__PURE__*/React.createElement("span",{className:"text-[9px] text-slate-500 mb-1"},"IN"),/*#__PURE__*/React.createElement("div",{className:"flex-1 w-5 bg-slate-900 border border-slate-800 rounded relative overflow-hidden flex items-end"},/*#__PURE__*/React.createElement("canvas",{ref:inMeterCanvasRef,className:"w-full h-full block"}))),/*#__PURE__*/React.createElement("div",{className:"flex flex-col items-center h-full"},/*#__PURE__*/React.createElement("span",{className:"text-[9px] text-slate-500 mb-1"},"OUT"),/*#__PURE__*/React.createElement("div",{className:"flex-1 w-6 bg-slate-900 border border-slate-800 rounded relative overflow-hidden flex items-end"},/*#__PURE__*/React.createElement("canvas",{ref:outMeterCanvasRef,className:"w-full h-full block"})))),/*#__PURE__*/React.createElement("div",{className:"grid grid-cols-2 gap-1.5 mt-2"},/*#__PURE__*/React.createElement("button",{onClick:()=>setOzState(prev=>({...prev,isBypassed:!prev.isBypassed})),className:`py-1.5 rounded text-[10px] font-bold border transition-colors ${ozState.isBypassed?'bg-cyan-600 border-cyan-500 text-white':'bg-slate-800 hover:bg-slate-700 text-slate-200 border-slate-700'}`},"Bypass"),/*#__PURE__*/React.createElement("button",{className:"bg-slate-800 hover:bg-slate-700 text-slate-200 py-1.5 rounded text-[10px] font-bold border border-slate-700 transition-colors"},"Gain Match"),/*#__PURE__*/React.createElement("button",{className:"bg-slate-800 hover:bg-slate-700 text-slate-300 py-1.5 rounded text-[10px] border border-slate-700"},"Codec"),/*#__PURE__*/React.createElement("button",{className:"bg-slate-800 hover:bg-slate-700 text-slate-300 py-1.5 rounded text-[10px] border border-slate-700"},"Dither"))))),addModuleOpen&&/*#__PURE__*/React.createElement("div",{className:"fixed inset-0 z-[110] bg-black/80 backdrop-blur-sm flex items-center justify-center p-4",onClick:()=>setAddModuleOpen(false)},/*#__PURE__*/React.createElement("div",{className:"w-full max-w-lg bg-slate-900 border border-slate-700 rounded-2xl p-5 space-y-4 shadow-2xl max-h-[80vh] overflow-y-auto",onClick:e=>e.stopPropagation()},/*#__PURE__*/React.createElement("div",{className:"flex items-center justify-between border-b border-slate-800 pb-3"},/*#__PURE__*/React.createElement("h3",{className:"text-xs font-bold text-white uppercase tracking-wider oz-font-mono"},"TH\xCAM MODULE V\xC0O MASTERING CHAIN"),/*#__PURE__*/React.createElement("button",{onClick:()=>setAddModuleOpen(false),className:"text-slate-400 hover:text-white"},/*#__PURE__*/React.createElement("i",{"data-lucide":"x",className:"w-4 h-4"}))),/*#__PURE__*/React.createElement("div",{className:"grid grid-cols-2 gap-3 text-xs"},[{t:'eqpro',c:'text-teal-400',i:'chart-area',d:'Parametric / Graphic EQ PRO — Pro-Q style, 8 bands, interactive canvas + spectrum.'},{t:'compressor',c:'text-amber-400',i:'compress',d:'Nén dynamic range, glue & punch cho master.'},{t:'limiter',c:'text-rose-400',i:'shield-half',d:'True-Peak ceiling (ratio 20:1, knee 0) chống clipping.'},{t:'exciter',c:'text-purple-400',i:'wand-2',d:'Saturation hài cho warmth và top-end brilliance.'},{t:'rebalance',c:'text-sky-400',i:'sliders-horizontal',d:'Cân bằng Mid/Side (Vocal/Bass vs stereo width).'},{t:'eq',c:'text-cyan-400',i:'activity',d:'EQ 4-band (lowshelf, 2× peaking, highshelf) + presets.'},{t:'imager',c:'text-fuchsia-400',i:'radio',d:'Stereo width 4-band M/S + vectorscope/correlation.'},{t:'maximizer',c:'text-emerald-400',i:'gauge',d:'Maximizer: boost, soft clip, upward comp, ceiling.'}].map(m=>/*#__PURE__*/React.createElement("button",{key:m.t,onClick:()=>addModuleToChain(m.t),className:"p-3 bg-slate-950 hover:bg-slate-800 border border-slate-800 rounded-xl text-left space-y-1 transition-colors"},/*#__PURE__*/React.createElement("div",{className:`font-bold ${m.c} flex items-center gap-1.5`},/*#__PURE__*/React.createElement("i",{"data-lucide":m.i,className:"w-3.5 h-3.5"})," ",MODULE_META[m.t].name),/*#__PURE__*/React.createElement("div",{className:"text-[10px] text-slate-400"},m.d)))),/*#__PURE__*/React.createElement("div",{className:"border-t border-slate-800 pt-3"},/*#__PURE__*/React.createElement("div",{className:"text-[10px] font-bold text-teal-400 uppercase tracking-wider oz-font-mono mb-2"},"VST FX (Ozone...)"),/*#__PURE__*/React.createElement("button",{onClick:()=>setMasterVstPickerOpen(true),className:"w-full bg-slate-950 hover:bg-slate-800 border border-dashed border-slate-700 hover:border-teal-600 text-teal-300 rounded px-2 py-2 text-[11px] text-left transition-colors",title:"Plugin Picker theo category (EQ / Reverb / Comp / Utility)"},/*#__PURE__*/React.createElement("i",{"data-lucide":"plug",className:"w-3 h-3 inline-block mr-1"})," Ch\u1ECDn VST FX t\u1EEB th\u01B0 vi\u1EC7n \u2014 Picker: EQ / Reverb / Comp / Utility")))),/*#__PURE__*/React.createElement(VstPluginPicker,{open:masterVstPickerOpen,onClose:()=>setMasterVstPickerOpen(false),plugins:masterFxList,onPick:f=>addVstToChain(f.path)}));};// ── Media Explorer Panel (from md/51_MEDIA_EXPLORER.md) ── +setOzState(prev=>({...prev,eqLowGain:preset.bands[0]?preset.bands[0].gain:prev.eqLowGain,eqMid1Gain:preset.bands[1]?preset.bands[1].gain:prev.eqMid1Gain,eqMid2Gain:preset.bands[2]?preset.bands[2].gain:prev.eqMid2Gain,eqHighGain:preset.bands[3]?preset.bands[3].gain:prev.eqHighGain,eqPreset:presetKey}));};const bandKnob=(param,min,max,val,unit,label,freq,color,filterType)=>/*#__PURE__*/React.createElement("div",{className:"bg-slate-900/80 border border-slate-800 p-2 flex flex-col justify-between items-center rounded-lg"},/*#__PURE__*/React.createElement("div",{className:"flex items-center justify-between text-[10px] font-bold w-full",style:{color}},/*#__PURE__*/React.createElement("span",null,label),/*#__PURE__*/React.createElement("span",{className:"text-[9px] font-mono text-slate-400"},freq)),/*#__PURE__*/React.createElement("div",{className:"my-1"},/*#__PURE__*/React.createElement(MasteringKnob,{param:param,min:min,max:max,value:ozState[param]!==undefined?ozState[param]:val,unit:unit,color:color,onChange:(p,v)=>setOzState(prev=>({...prev,[p]:v}))})),/*#__PURE__*/React.createElement("div",{className:"text-[9px] text-slate-500 font-mono text-center mt-1"},filterType));return/*#__PURE__*/React.createElement("div",{className:"fixed inset-0 z-[100] flex items-center justify-center bg-black/70 backdrop-blur-sm",onClick:onClose},/*#__PURE__*/React.createElement("div",{id:"masteringModalBody",className:"flex flex-col bg-slate-950 text-slate-200 w-[95vw] h-[92vh] max-w-[1400px] rounded-2xl border border-slate-800/80 shadow-2xl overflow-hidden",onClick:e=>e.stopPropagation(),style:{fontFamily:"'Inter', sans-serif"}},/*#__PURE__*/React.createElement("header",{className:"h-12 bg-slate-900/90 border-b border-slate-800/80 flex items-center justify-between px-4 z-30 shrink-0"},/*#__PURE__*/React.createElement("div",{className:"flex items-center gap-3"},/*#__PURE__*/React.createElement("div",{className:"w-7 h-7 rounded-lg bg-cyan-600 flex items-center justify-center font-bold text-white shadow-lg shadow-cyan-950"},/*#__PURE__*/React.createElement("i",{"data-lucide":"zap",className:"w-3.5 h-3.5"})),/*#__PURE__*/React.createElement("div",null,/*#__PURE__*/React.createElement("h1",{className:"text-xs font-bold tracking-wider text-white flex items-center gap-2"},"MASTERING SUITE ",/*#__PURE__*/React.createElement("span",{className:"text-[9px] bg-cyan-950 text-cyan-400 border border-cyan-800/80 px-1.5 py-0.5 rounded oz-font-mono"},"WEB MASTERING V10.5")))),/*#__PURE__*/React.createElement("div",{className:"flex items-center gap-3 bg-slate-950 px-3 py-1 rounded-lg border border-slate-800/80"},/*#__PURE__*/React.createElement("button",{onClick:startAudioDemo,className:"px-3 py-1 bg-cyan-600 hover:bg-cyan-500 text-white rounded text-xs font-semibold flex items-center gap-1.5 transition-all shadow-md shadow-cyan-950"},/*#__PURE__*/React.createElement("i",{"data-lucide":"play",className:"w-3 h-3"})," ",/*#__PURE__*/React.createElement("span",null,"Play Reference")),/*#__PURE__*/React.createElement("button",{onClick:stopAudioDemo,className:"px-3 py-1 bg-slate-800 hover:bg-slate-700 text-slate-300 rounded text-xs font-semibold flex items-center gap-1.5 transition-all"},/*#__PURE__*/React.createElement("i",{"data-lucide":"square",className:"w-3 h-3"})," ",/*#__PURE__*/React.createElement("span",null,"Stop")),/*#__PURE__*/React.createElement("div",{className:"h-4 w-[1px] bg-slate-800 mx-1"}),/*#__PURE__*/React.createElement("div",{className:"flex items-center gap-2 text-xs oz-font-mono"},/*#__PURE__*/React.createElement("span",{className:"text-slate-400 text-[11px]"},"Preset:"),/*#__PURE__*/React.createElement("select",{className:"bg-slate-900 border border-slate-700 rounded px-2 py-0.5 text-xs text-cyan-300 outline-none focus:border-cyan-500"},/*#__PURE__*/React.createElement("option",{value:"adaptive"},"Adaptive Dynamic Master"),/*#__PURE__*/React.createElement("option",{value:"edm_club"},"EDM / Club Punch Maximizer"),/*#__PURE__*/React.createElement("option",{value:"wide_space"},"Cinematic Stereo Expansion"),/*#__PURE__*/React.createElement("option",{value:"transparent"},"Transparent High-Clarity Limiter")))),/*#__PURE__*/React.createElement("div",{className:"flex items-center gap-3 text-xs oz-font-mono"},/*#__PURE__*/React.createElement("span",{className:"text-slate-400 text-[11px]"},"Target LUFS:"),/*#__PURE__*/React.createElement("span",{className:"text-cyan-400 font-bold bg-slate-950 border border-cyan-900/60 px-2 py-0.5 rounded"},"-11.0 LUFS"),/*#__PURE__*/React.createElement("button",{onClick:()=>{getAudioContext();setMasterConnected(prev=>!prev);},className:`px-2 py-0.5 rounded text-[10px] font-bold border transition-colors ${masterConnected?'bg-emerald-700 border-emerald-500 text-white':'bg-slate-800 border-slate-700 text-slate-300 hover:bg-slate-700'}`},masterConnected?'Master ON':'Master OFF'),/*#__PURE__*/React.createElement("button",{onClick:onClose,className:"px-2 py-0.5 rounded text-[10px] font-bold border transition-colors bg-slate-800 border-slate-700 text-slate-300 hover:bg-[#c2410c] hover:border-red-600 hover:text-white"},"Đóng"),/*#__PURE__*/React.createElement("button",{onClick:onClose,className:"text-slate-500 hover:text-slate-300 ml-1"},/*#__PURE__*/React.createElement("i",{"data-lucide":"x",className:"w-4 h-4"})))),/*#__PURE__*/React.createElement("div",{className:"h-16 bg-slate-950 border-b border-slate-800 px-4 flex items-center gap-2 overflow-x-auto shrink-0 oz-scrollbar"},/*#__PURE__*/React.createElement("span",{className:"text-[10px] font-bold text-slate-500 uppercase tracking-widest mr-1 oz-font-mono shrink-0"},"CHAIN:"),(ozState.chain||[]).map((mod,idx)=>{const isVst=mod.type==='vst3';const meta=MODULE_META[mod.type]||{name:mod.type,sub:'',icon:'circle',color:'#94a3b8'};const isEditing=!isVst&&ozState.activeModule===mod.type||isVst&&activeMasterVstPath===mod.path;const isOn=isVst?mod.active!==false:chainActive(mod.type);return/*#__PURE__*/React.createElement("div",{key:mod.id,draggable:true,onDragStart:e=>{dragChainIndexRef.current=idx;e.dataTransfer.effectAllowed='move';},onDragOver:e=>{e.preventDefault();e.dataTransfer.dropEffect='move';},onDrop:e=>{e.preventDefault();const from=dragChainIndexRef.current;if(from!==null&&from!==idx)reorderChain(from,idx);dragChainIndexRef.current=null;},onClick:()=>{if(mod.type==='vst3'){openMasterVstGui({path:mod.path,name:mod.name||mod.path});}else{closeMasterGui();switchModule(mod.type);}},className:`w-40 h-12 rounded-lg p-2 flex items-center justify-between cursor-pointer transition-all shrink-0 ${isEditing?'oz-card-active':'oz-card'}`},/*#__PURE__*/React.createElement("div",{className:"flex items-center gap-2 min-w-0"},/*#__PURE__*/React.createElement("button",{onClick:e=>{e.stopPropagation();toggleChainModule(mod.id);},className:"w-4 h-4 rounded-full flex items-center justify-center text-[9px] font-bold shrink-0",style:{backgroundColor:isOn?'#38bdf8':'#334155',color:isOn?'#0f172a':'#94a3b8'}},/*#__PURE__*/React.createElement("i",{"data-lucide":"power",className:"w-2.5 h-2.5"})),/*#__PURE__*/React.createElement("div",{className:"min-w-0"},/*#__PURE__*/React.createElement("div",{className:"text-[11px] font-bold text-slate-200 truncate"},isVst?mod.name||meta.name:meta.name),/*#__PURE__*/React.createElement("div",{className:"text-[9px] oz-font-mono truncate",style:{color:meta.color}},idx+1,". ",isVst?mod.path?mod.path.split(/[\\/]/).pop():'VST3':meta.sub))),/*#__PURE__*/React.createElement("div",{className:"flex items-center gap-1 shrink-0"},/*#__PURE__*/React.createElement("i",{"data-lucide":meta.icon,className:"w-3 h-3 text-slate-500"}),/*#__PURE__*/React.createElement("button",{onClick:e=>{e.stopPropagation();removeChainModule(mod.id);},className:"text-slate-600 hover:text-red-400 text-xs w-4 h-4 flex items-center justify-center shrink-0",title:"Xóa module"},/*#__PURE__*/React.createElement("i",{"data-lucide":"x",className:"w-3 h-3"}))));}),/*#__PURE__*/React.createElement("button",{onClick:()=>setAddModuleOpen(true),className:"w-24 h-12 rounded-lg border border-dashed border-slate-800 flex items-center justify-center text-slate-600 hover:text-slate-400 hover:border-slate-600 cursor-pointer transition-all shrink-0",title:"Thêm module vào chain"},/*#__PURE__*/React.createElement("i",{"data-lucide":"plus",className:"w-4 h-4"}))),/*#__PURE__*/React.createElement("main",{className:"flex-1 flex overflow-hidden min-h-0"},masterGuiOpen?/*#__PURE__*/React.createElement("div",{className:"flex-1 flex flex-col bg-slate-950 relative min-h-0"},/*#__PURE__*/React.createElement(VstGuiEmbed,{url:masterGuiOpen.url,onClose:closeMasterGui,onDead:()=>{window.showToast&&window.showToast('Bridge VST GUI đã mất kết nối — trả về graph','error');closeMasterGui();}})):/*#__PURE__*/React.createElement("div",{className:"flex-1 flex flex-col bg-slate-950 relative overflow-y-auto oz-scrollbar"},/*#__PURE__*/React.createElement("div",{className:"h-9 bg-slate-900/60 border-b border-slate-800/80 px-4 flex items-center justify-between text-xs oz-font-mono shrink-0"},/*#__PURE__*/React.createElement("div",{className:"flex items-center gap-3"},/*#__PURE__*/React.createElement("span",{className:"text-slate-400 flex items-center gap-1.5"},/*#__PURE__*/React.createElement("i",{"data-lucide":"headphones",className:"w-3 h-3 text-cyan-400"})," Delta Listen"),/*#__PURE__*/React.createElement("select",{className:"bg-slate-950 border border-slate-800 rounded px-2 py-0.5 text-[11px] text-slate-300 outline-none"},/*#__PURE__*/React.createElement("option",{value:"irc4"},"IRC IV - Classic"),/*#__PURE__*/React.createElement("option",{value:"irc3"},"IRC III - Balanced"),/*#__PURE__*/React.createElement("option",{value:"irc2"},"IRC II - Crisp"))),/*#__PURE__*/React.createElement("div",{className:"flex items-center gap-2 text-[11px]"},ozState.activeModule==='eq'&&/*#__PURE__*/React.createElement("div",{className:"flex items-center gap-1.5"},/*#__PURE__*/React.createElement("span",{className:"text-slate-400"},"EQ Presets:"),/*#__PURE__*/React.createElement("select",{value:ozState.eqPreset||'flat',onChange:e=>applyEQPreset(e.target.value),className:"bg-slate-950 border border-slate-700 text-cyan-300 rounded px-2 py-0.5 text-[11px] outline-none focus:border-cyan-500"},Object.keys(EQ_PRESET_LIBRARY).map(k=>/*#__PURE__*/React.createElement("option",{key:k,value:k},EQ_PRESET_LIBRARY[k].name)))),/*#__PURE__*/React.createElement("span",{className:"text-slate-400"},"Learn Input Gain:"),/*#__PURE__*/React.createElement("button",{className:"bg-cyan-950 text-cyan-300 border border-cyan-800/80 px-2 py-0.5 rounded font-bold hover:bg-cyan-900 transition-colors"},"-11.0 LUFS"))),/*#__PURE__*/React.createElement("div",{className:`flex-1 flex flex-col p-4 gap-4 ${ozState.activeModule==='eq'?'':'hidden'}`},/*#__PURE__*/React.createElement("div",{className:"relative w-full h-64 bg-slate-950 border border-slate-800/90 rounded-xl overflow-hidden shadow-inner cursor-crosshair"},/*#__PURE__*/React.createElement("canvas",{ref:eqCanvasRef,className:"w-full h-full block"})),/*#__PURE__*/React.createElement("div",{className:"oz-panel p-3 rounded-xl grid grid-cols-4 gap-3"},bandKnob('eqLowGain',-12,12,1.5,'dB','BAND 1 (LOW)','100 Hz','#22d3ee','Shelf Filter'),bandKnob('eqMid1Gain',-12,12,-1.0,'dB','BAND 2 (MID LOW)','822 Hz','#fbbf24','Dynamic Bell (Q: 0.7)'),bandKnob('eqMid2Gain',-12,12,2.0,'dB','BAND 3 (MID HIGH)','3.2 kHz','#a855f7','Dynamic Bell (Q: 1.2)'),bandKnob('eqHighGain',-12,12,1.8,'dB','BAND 4 (HIGH)','10 kHz','#34d399','High Shelf'))),/*#__PURE__*/React.createElement("div",{className:`flex-1 flex flex-col p-4 gap-4 ${ozState.activeModule==='eqpro'?'':'hidden'}`},(()=>{const chainMods=ozState.chain||[];const cm=chainMods.find(m=>m.type==='eqpro'&&m.active!==false)||chainMods.find(m=>m.type==='eqpro');if(!cm)return/*#__PURE__*/React.createElement("div",{className:"text-xs text-slate-500 font-mono py-10 text-center"},"Chưa có module EQ PRO trong chain — bấm [+] để thêm.");return/*#__PURE__*/React.createElement(InteractiveEqPro,{track:null,params:cm.params||{},onChange:next=>updateChainEntryParams(cm.id,next),getModule:()=>masterBus&&masterBus.eqProInstances?masterBus.eqProInstances[cm.id]:null,spectrumModules:()=>{const m=masterBus&&masterBus.eqProInstances?masterBus.eqProInstances[cm.id]:null;return m?[m]:[];},applyTo:fn=>{const m=masterBus&&masterBus.eqProInstances?masterBus.eqProInstances[cm.id]:null;if(m)fn(m);}});})()),/*#__PURE__*/React.createElement("div",{className:`flex-1 flex flex-col p-4 gap-4 ${ozState.activeModule==='imager'?'':'hidden'}`},/*#__PURE__*/React.createElement("div",{className:"grid grid-cols-12 gap-4 flex-1"},/*#__PURE__*/React.createElement("div",{className:"col-span-8 bg-slate-950 border border-slate-800/90 rounded-xl p-3 flex flex-col relative shadow-inner"},/*#__PURE__*/React.createElement("span",{className:"text-xs font-bold text-cyan-400 uppercase oz-font-mono mb-2 flex items-center justify-between w-full"},/*#__PURE__*/React.createElement("span",null,/*#__PURE__*/React.createElement("i",{"data-lucide":"radio",className:"w-3.5 h-3.5"})," Polar Vectorscope & Correlation Meter"),/*#__PURE__*/React.createElement("span",{className:"text-[11px] text-slate-400 normal-case"},"Corr: ",/*#__PURE__*/React.createElement("span",{id:"corrText",className:"font-bold text-emerald-400"},"1.00"))),/*#__PURE__*/React.createElement("div",{className:"flex-1 relative w-full h-56 flex items-center justify-center"},/*#__PURE__*/React.createElement("canvas",{ref:imagerCanvasRef,className:"w-full h-full block"}))),/*#__PURE__*/React.createElement("div",{className:"col-span-4 oz-panel p-3 rounded-xl flex flex-col justify-between"},/*#__PURE__*/React.createElement("span",{className:"text-xs font-bold text-slate-300 uppercase oz-font-mono"},"4-Band Stereo Width"),/*#__PURE__*/React.createElement("div",{className:"text-[10px] text-slate-500 oz-font-mono leading-snug"},"0% = Mono · 100% = Original · 200% = 2× Width"),/*#__PURE__*/React.createElement("div",{className:"space-y-3 my-auto"},[{id:'w1',label:'Band 1 (20-100Hz)',color:'#22d3ee',val:ozState.w1},{id:'w2',label:'Band 2 (100Hz-1kHz)',color:'#fbbf24',val:ozState.w2},{id:'w3',label:'Band 3 (1k-6kHz)',color:'#a855f7',val:ozState.w3},{id:'w4',label:'Band 4 (6k-20kHz)',color:'#34d399',val:ozState.w4}].map(b=>/*#__PURE__*/React.createElement("div",{key:b.id},/*#__PURE__*/React.createElement("div",{className:"flex justify-between text-[11px] font-mono mb-1"},/*#__PURE__*/React.createElement("span",{style:{color:b.color,fontWeight:700}},b.label),/*#__PURE__*/React.createElement("span",{id:b.id+'Val'},b.val,"%")),/*#__PURE__*/React.createElement("input",{type:"range",min:"0",max:"200",value:b.val,onChange:e=>setOzState(prev=>({...prev,[b.id]:parseInt(e.target.value)})),className:"w-full h-1 cursor-pointer",style:{accentColor:b.color}}))))))),/*#__PURE__*/React.createElement("div",{className:`flex-1 flex flex-col p-4 gap-4 ${ozState.activeModule==='maximizer'?'':'hidden'}`},/*#__PURE__*/React.createElement("div",{className:"oz-panel p-4 rounded-xl flex-1 grid grid-cols-12 gap-6 items-center"},/*#__PURE__*/React.createElement("div",{className:"col-span-4 flex flex-col items-center justify-center border-r border-slate-800 pr-4"},/*#__PURE__*/React.createElement("span",{className:"text-xs font-bold text-slate-400 uppercase oz-font-mono mb-3"},"Maximizer Gain Boost"),/*#__PURE__*/React.createElement("div",{className:"my-2"},/*#__PURE__*/React.createElement(MasteringKnob,{param:"maxGain",min:0,max:12,value:ozState.maxGain,unit:"dB",color:"#22d3ee",size:"large",onChange:(p,v)=>setOzState(prev=>({...prev,[p]:v}))})),/*#__PURE__*/React.createElement("div",{className:"w-full mt-4 bg-slate-950 p-2 rounded-lg border border-slate-800 text-xs oz-font-mono flex flex-col gap-1.5"},/*#__PURE__*/React.createElement("div",{className:"flex justify-between items-center w-full"},/*#__PURE__*/React.createElement("span",{className:"text-slate-400"},"Ceiling Level:"),/*#__PURE__*/React.createElement("span",{className:"text-cyan-400 font-bold"},ozState.ceiling.toFixed(2)," dB")),/*#__PURE__*/React.createElement("input",{type:"range",min:"-12",max:"0",step:"0.1",value:ozState.ceiling,onChange:e=>setOzState(prev=>({...prev,ceiling:parseFloat(e.target.value)})),className:"w-full h-1 cursor-pointer accent-cyan-400"}))),/*#__PURE__*/React.createElement("div",{className:"col-span-8 grid grid-cols-3 gap-4"},/*#__PURE__*/React.createElement("div",{className:"bg-slate-950 p-3 border border-slate-800 rounded-xl flex flex-col items-center justify-center h-full"},/*#__PURE__*/React.createElement(MasteringKnob,{param:"maxUpward",min:0,max:10,value:ozState.maxUpward,unit:"dB",label:"UPWARD COMPRESS",color:"#22d3ee",onChange:(p,v)=>setOzState(prev=>({...prev,[p]:v}))})),/*#__PURE__*/React.createElement("div",{className:"bg-slate-950 p-3 border border-slate-800 rounded-xl flex flex-col items-center justify-center h-full"},/*#__PURE__*/React.createElement(MasteringKnob,{param:"maxSoftClip",min:0,max:100,value:ozState.maxSoftClip,unit:"%",label:"SOFT CLIPPER",color:"#fbbf24",onChange:(p,v)=>setOzState(prev=>({...prev,[p]:v}))})),/*#__PURE__*/React.createElement("div",{className:"bg-slate-950 p-3 border border-slate-800 rounded-xl flex flex-col items-center justify-center h-full"},/*#__PURE__*/React.createElement(MasteringKnob,{param:"maxTransient",min:0,max:100,value:ozState.maxTransient,unit:"%",label:"TRANSIENT EMPHASIS",color:"#34d399",onChange:(p,v)=>setOzState(prev=>({...prev,[p]:v}))}))))),/*#__PURE__*/React.createElement("div",{className:`flex-1 flex flex-col p-4 gap-4 ${ozState.activeModule==='compressor'?'':'hidden'}`},/*#__PURE__*/React.createElement("div",{className:"oz-panel p-4 rounded-xl flex-1 grid grid-cols-12 gap-6 items-center"},/*#__PURE__*/React.createElement("div",{className:"col-span-4 flex flex-col items-center justify-center border-r border-slate-800 pr-4"},/*#__PURE__*/React.createElement("span",{className:"text-xs font-bold text-amber-400 uppercase oz-font-mono mb-3"},"Bus Compressor"),/*#__PURE__*/React.createElement("div",{className:"my-2"},/*#__PURE__*/React.createElement(MasteringKnob,{param:"compMakeup",min:0,max:12,value:ozState.compMakeup,unit:"dB",label:"MAKE-UP GAIN",color:"#fbbf24",onChange:(p,v)=>setOzState(prev=>({...prev,[p]:v}))})),/*#__PURE__*/React.createElement("button",{onClick:()=>toggleChainModule((ozState.chain||[]).find(m=>m.type==='compressor')?.id),className:`px-3 py-1 rounded text-[10px] font-bold border transition-colors mt-2 ${ozState.compActive?'bg-amber-700 border-amber-500 text-white':'bg-slate-800 border-slate-700 text-slate-300'}`},ozState.compActive?'ON':'OFF')),/*#__PURE__*/React.createElement("div",{className:"col-span-8 grid grid-cols-3 gap-4"},/*#__PURE__*/React.createElement("div",{className:"bg-slate-950 p-3 border border-slate-800 rounded-xl flex flex-col items-center justify-center h-full"},/*#__PURE__*/React.createElement(MasteringKnob,{param:"compThreshold",min:-60,max:0,value:ozState.compThreshold,unit:"dB",label:"THRESHOLD",color:"#fbbf24",onChange:(p,v)=>setOzState(prev=>({...prev,[p]:v}))})),/*#__PURE__*/React.createElement("div",{className:"bg-slate-950 p-3 border border-slate-800 rounded-xl flex flex-col items-center justify-center h-full"},/*#__PURE__*/React.createElement(MasteringKnob,{param:"compRatio",min:1,max:20,value:ozState.compRatio,unit:":1",label:"RATIO",color:"#f59e0b",onChange:(p,v)=>setOzState(prev=>({...prev,[p]:v}))})),/*#__PURE__*/React.createElement("div",{className:"bg-slate-950 p-3 border border-slate-800 rounded-xl flex flex-col items-center justify-center h-full"},/*#__PURE__*/React.createElement("span",{className:"text-[10px] text-slate-500 oz-font-mono text-center leading-snug px-2"},"Glue & Punch",/*#__PURE__*/React.createElement("br",null),"Attack 20ms · Release 250ms · Knee 8dB"))))),/*#__PURE__*/React.createElement("div",{className:`flex-1 flex flex-col p-4 gap-4 ${ozState.activeModule==='limiter'?'':'hidden'}`},/*#__PURE__*/React.createElement("div",{className:"oz-panel p-4 rounded-xl flex-1 grid grid-cols-12 gap-6 items-center"},/*#__PURE__*/React.createElement("div",{className:"col-span-4 flex flex-col items-center justify-center border-r border-slate-800 pr-4"},/*#__PURE__*/React.createElement("span",{className:"text-xs font-bold text-rose-400 uppercase oz-font-mono mb-3"},"Brickwall Limiter"),/*#__PURE__*/React.createElement("button",{onClick:()=>toggleChainModule((ozState.chain||[]).find(m=>m.type==='limiter')?.id),className:`px-3 py-1 rounded text-[10px] font-bold border transition-colors mt-2 ${ozState.limActive?'bg-rose-700 border-rose-500 text-white':'bg-slate-800 border-slate-700 text-slate-300'}`},ozState.limActive?'ON':'OFF')),/*#__PURE__*/React.createElement("div",{className:"col-span-8 grid grid-cols-3 gap-4"},/*#__PURE__*/React.createElement("div",{className:"bg-slate-950 p-3 border border-slate-800 rounded-xl flex flex-col items-center justify-center h-full"},/*#__PURE__*/React.createElement(MasteringKnob,{param:"limThreshold",min:-24,max:0,value:ozState.limThreshold,unit:"dB",label:"CEILING",color:"#f43f5e",onChange:(p,v)=>setOzState(prev=>({...prev,[p]:v}))})),/*#__PURE__*/React.createElement("div",{className:"bg-slate-950 p-3 border border-slate-800 rounded-xl flex flex-col items-center justify-center h-full"},/*#__PURE__*/React.createElement("span",{className:"text-[10px] text-slate-500 oz-font-mono text-center leading-snug px-2"},"True-Peak limiting",/*#__PURE__*/React.createElement("br",null),"Ratio 20:1 · Knee 0dB",/*#__PURE__*/React.createElement("br",null),"Attack 1ms · Release 50ms"))))),/*#__PURE__*/React.createElement("div",{className:`flex-1 flex flex-col p-4 gap-4 ${ozState.activeModule==='exciter'?'':'hidden'}`},/*#__PURE__*/React.createElement("div",{className:"oz-panel p-4 rounded-xl flex-1 grid grid-cols-12 gap-6 items-center"},/*#__PURE__*/React.createElement("div",{className:"col-span-4 flex flex-col items-center justify-center border-r border-slate-800 pr-4"},/*#__PURE__*/React.createElement("span",{className:"text-xs font-bold text-purple-400 uppercase oz-font-mono mb-3"},"Harmonic Exciter"),/*#__PURE__*/React.createElement("button",{onClick:()=>toggleChainModule((ozState.chain||[]).find(m=>m.type==='exciter')?.id),className:`px-3 py-1 rounded text-[10px] font-bold border transition-colors mt-2 ${ozState.excActive?'bg-purple-700 border-purple-500 text-white':'bg-slate-800 border-slate-700 text-slate-300'}`},ozState.excActive?'ON':'OFF')),/*#__PURE__*/React.createElement("div",{className:"col-span-8 grid grid-cols-3 gap-4"},/*#__PURE__*/React.createElement("div",{className:"bg-slate-950 p-3 border border-slate-800 rounded-xl flex flex-col items-center justify-center h-full"},/*#__PURE__*/React.createElement(MasteringKnob,{param:"excDrive",min:0,max:100,value:ozState.excDrive,unit:"%",label:"DRIVE / MIX",color:"#c084fc",onChange:(p,v)=>setOzState(prev=>({...prev,[p]:v}))})),/*#__PURE__*/React.createElement("div",{className:"bg-slate-950 p-3 border border-slate-800 rounded-xl flex flex-col items-center justify-center h-full"},/*#__PURE__*/React.createElement("span",{className:"text-[10px] text-slate-500 oz-font-mono text-center leading-snug px-2"},"WaveShaper saturation",/*#__PURE__*/React.createElement("br",null),"High-pass 2kHz",/*#__PURE__*/React.createElement("br",null),"4× oversampled · wet/dry mix"))))),/*#__PURE__*/React.createElement("div",{className:`flex-1 flex flex-col p-4 gap-4 ${ozState.activeModule==='rebalance'?'':'hidden'}`},/*#__PURE__*/React.createElement("div",{className:"oz-panel p-4 rounded-xl flex-1 grid grid-cols-12 gap-6 items-center"},/*#__PURE__*/React.createElement("div",{className:"col-span-4 flex flex-col items-center justify-center border-r border-slate-800 pr-4"},/*#__PURE__*/React.createElement("span",{className:"text-xs font-bold text-sky-400 uppercase oz-font-mono mb-3"},"Master Rebalance (M/S)"),/*#__PURE__*/React.createElement("button",{onClick:()=>toggleChainModule((ozState.chain||[]).find(m=>m.type==='rebalance')?.id),className:`px-3 py-1 rounded text-[10px] font-bold border transition-colors mt-2 ${ozState.rebalActive?'bg-sky-700 border-sky-500 text-white':'bg-slate-800 border-slate-700 text-slate-300'}`},ozState.rebalActive?'ON':'OFF')),/*#__PURE__*/React.createElement("div",{className:"col-span-8 grid grid-cols-3 gap-4"},/*#__PURE__*/React.createElement("div",{className:"bg-slate-950 p-3 border border-slate-800 rounded-xl flex flex-col items-center justify-center h-full"},/*#__PURE__*/React.createElement(MasteringKnob,{param:"rebalMid",min:-12,max:12,value:ozState.rebalMid,unit:"dB",label:"MID GAIN",color:"#38bdf8",onChange:(p,v)=>setOzState(prev=>({...prev,[p]:v}))})),/*#__PURE__*/React.createElement("div",{className:"bg-slate-950 p-3 border border-slate-800 rounded-xl flex flex-col items-center justify-center h-full"},/*#__PURE__*/React.createElement(MasteringKnob,{param:"rebalSide",min:-12,max:12,value:ozState.rebalSide,unit:"dB",label:"SIDE GAIN",color:"#22d3ee",onChange:(p,v)=>setOzState(prev=>({...prev,[p]:v}))})),/*#__PURE__*/React.createElement("div",{className:"bg-slate-950 p-3 border border-slate-800 rounded-xl flex flex-col items-center justify-center h-full"},/*#__PURE__*/React.createElement("span",{className:"text-[10px] text-slate-500 oz-font-mono text-center leading-snug px-2"},"ChannelSplitter + M/S gains",/*#__PURE__*/React.createElement("br",null),"Center (vocal/bass) vs Sides (stereo width)"))))),/*#__PURE__*/React.createElement("div",{className:`flex-1 flex flex-col p-4 gap-4 ${ozState.activeModule==='carla'?'':'hidden'}`},/*#__PURE__*/React.createElement("div",{className:"oz-panel p-4 rounded-xl flex-1 grid grid-cols-12 gap-6 items-center"},/*#__PURE__*/React.createElement("div",{className:"col-span-4 flex flex-col items-center justify-center border-r border-slate-800 pr-4"},/*#__PURE__*/React.createElement("span",{className:"text-xs font-bold text-teal-400 uppercase oz-font-mono mb-3"},"Carla Bridge (VST FX)"),/*#__PURE__*/React.createElement("button",{onClick:()=>toggleChainModule((ozState.chain||[]).find(m=>m.type==='carla')?.id),className:`px-3 py-1 rounded text-[10px] font-bold border transition-colors mt-2 ${ozState.carlaBridgeActive?'bg-teal-700 border-teal-500 text-white':'bg-slate-800 border-slate-700 text-slate-300'}`},ozState.carlaBridgeActive?'ON':'OFF')),/*#__PURE__*/React.createElement("div",{className:"col-span-8 space-y-3"},/*#__PURE__*/React.createElement("div",{className:"flex items-end gap-2 flex-wrap"},/*#__PURE__*/React.createElement("div",{className:"flex-1 min-w-[220px]"},/*#__PURE__*/React.createElement("div",{className:"text-[9px] text-slate-500 oz-font-mono mb-1"},"CHỌN VST FX (đã scan trên máy)"),/*#__PURE__*/React.createElement("select",{value:ozState.carlaBridge&&ozState.carlaBridge.plugin||'',onChange:e=>setOzState(prev=>({...prev,carlaBridge:{...(prev.carlaBridge||{}),plugin:e.target.value,plugin_path:''}})),className:"w-full bg-slate-950 border border-slate-700 text-teal-300 rounded px-2 py-1.5 text-xs outline-none focus:border-teal-500"},/*#__PURE__*/React.createElement("option",{value:""},"— Chọn VST FX —"),(masterCarlaVsts||[]).map(v=>/*#__PURE__*/React.createElement("option",{key:v.id||v.name,value:v.id||v.name},v.name||v.id)))),/*#__PURE__*/React.createElement("button",{onClick:()=>{const plugin=ozState.carlaBridge&&ozState.carlaBridge.plugin||'';if(!plugin){window.showToast&&window.showToast('Chọn VST FX trước khi Load Carla','warning');return;}window.SonicAPI.openInCarla(plugin,ozState.carlaBridge.plugin_path).then(r=>{if(r&&r.success){setOzState(prev=>({...prev,carlaBridge:{...(prev.carlaBridge||{}),connected:true}}));window.showToast&&window.showToast('Đã mở Carla với '+plugin+' (VST FX) — chỉnh âm thanh trong Carla','success');}else{window.showToast&&window.showToast('Không mở được Carla','error');}}).catch(err=>window.showToast&&window.showToast('Lỗi mở Carla: '+(err.message||err),'error'));},className:"px-4 py-1.5 bg-teal-700 hover:bg-teal-600 text-white text-xs font-semibold rounded transition flex items-center gap-1 shrink-0"},/*#__PURE__*/React.createElement("i",{"data-lucide":"play",className:"w-3 h-3"})," Load Carla Bridge"),/*#__PURE__*/React.createElement("button",{onClick:()=>{if(window.SonicCarlaMidi&&window.SonicCarlaMidi.stopBridge)window.SonicCarlaMidi.stopBridge();setOzState(prev=>({...prev,carlaBridge:{...(prev.carlaBridge||{}),connected:false}}));window.showToast&&window.showToast('Đã ngắt kết nối Carla Bridge','info');},className:"px-4 py-1.5 bg-zinc-800 hover:bg-zinc-700 text-red-300 text-xs font-semibold rounded transition flex items-center gap-1 shrink-0"},/*#__PURE__*/React.createElement("i",{"data-lucide":"square",className:"w-3 h-3"})," Stop / Unload")),/*#__PURE__*/React.createElement("div",{className:"text-[10px] text-slate-500 oz-font-mono leading-relaxed"},"Mở Carla với VST FX để chỉnh sửa âm thanh master (native GUI). Module này là pass-through trong master chain (không thêm DSP WebAudio).")))),/*#__PURE__*/React.createElement("div",{className:"border-t border-slate-800 bg-slate-900/60 p-3 flex flex-col shrink-0"},/*#__PURE__*/React.createElement("div",{className:"flex items-center justify-between pb-1.5 border-b border-slate-800/80 mb-2"},/*#__PURE__*/React.createElement("div",{className:"flex items-center gap-2"},/*#__PURE__*/React.createElement("span",{className:"text-[11px] font-bold text-white uppercase tracking-wider"},"Wave Observer"),/*#__PURE__*/React.createElement("span",{className:"text-[9px] bg-cyan-950 text-cyan-400 border border-cyan-800/60 px-1.5 py-0.2 rounded font-mono"},"Real-time Oscilloscope")),/*#__PURE__*/React.createElement("div",{className:"flex gap-2"},['Scope','Settings','Help','About'].map(tab=>/*#__PURE__*/React.createElement("button",{key:tab,className:`px-2 py-0.5 rounded text-[10px] font-bold ${tab==='Scope'?'bg-cyan-950 text-cyan-300 border border-cyan-800/60':'text-slate-400 hover:text-slate-200'}`},tab)))),/*#__PURE__*/React.createElement("div",{className:"relative w-full h-32 bg-[#090d16] border border-slate-800/80 rounded-lg overflow-hidden mb-2"},/*#__PURE__*/React.createElement("canvas",{ref:woCanvasRef,className:"w-full h-full block"})),/*#__PURE__*/React.createElement("div",{className:"flex items-center justify-between gap-4 text-[10px] oz-font-mono text-slate-400 mt-1 select-none"},/*#__PURE__*/React.createElement("div",{className:"flex items-center gap-2 bg-slate-950 px-2.5 py-1.5 rounded border border-slate-800/80 shrink-0"},/*#__PURE__*/React.createElement("span",{className:"text-[10px] font-bold text-slate-300"},"Input"),/*#__PURE__*/React.createElement("div",{className:"flex flex-col gap-1 w-20"},/*#__PURE__*/React.createElement("div",{className:"flex items-center gap-1"},/*#__PURE__*/React.createElement("span",{className:"text-[8px] text-slate-500 w-2"},"L"),/*#__PURE__*/React.createElement("div",{className:"w-16 h-1.5 bg-slate-900 rounded-sm overflow-hidden flex items-center"},/*#__PURE__*/React.createElement("div",{ref:woLeftMeterRef,className:"h-full bg-cyan-400 transition-all duration-75",style:{width:'0%'}}))),/*#__PURE__*/React.createElement("div",{className:"flex items-center gap-1"},/*#__PURE__*/React.createElement("span",{className:"text-[8px] text-slate-500 w-2"},"R"),/*#__PURE__*/React.createElement("div",{className:"w-16 h-1.5 bg-slate-900 rounded-sm overflow-hidden flex items-center"},/*#__PURE__*/React.createElement("div",{ref:woRightMeterRef,className:"h-full bg-teal-500 transition-all duration-75",style:{width:'0%'}}))))),/*#__PURE__*/React.createElement("div",{className:"flex items-center gap-4 bg-slate-950 px-3 py-1 rounded border border-slate-800/80 flex-1 justify-around"},/*#__PURE__*/React.createElement("span",{className:"font-bold text-slate-300 uppercase tracking-widest text-[9px]"},"Scope"),/*#__PURE__*/React.createElement("div",{className:"flex items-center gap-1.5"},/*#__PURE__*/React.createElement("span",null,"Channel"),/*#__PURE__*/React.createElement("select",{value:woChannel,onChange:e=>setWoChannel(e.target.value),className:"bg-slate-900 border border-slate-700 rounded px-1.5 py-0.5 text-[9px] text-slate-300 outline-none"},/*#__PURE__*/React.createElement("option",{value:"stereo"},"Stereo"),/*#__PURE__*/React.createElement("option",{value:"left"},"Left Only"),/*#__PURE__*/React.createElement("option",{value:"right"},"Right Only"))),/*#__PURE__*/React.createElement("div",{className:"flex items-center gap-1.5"},/*#__PURE__*/React.createElement("span",null,"Mode"),/*#__PURE__*/React.createElement("select",{value:woMode,onChange:e=>setWoMode(e.target.value),className:"bg-slate-900 border border-slate-700 rounded px-1.5 py-0.5 text-[9px] text-slate-300 outline-none"},/*#__PURE__*/React.createElement("option",{value:"waveform"},"Waveform"),/*#__PURE__*/React.createElement("option",{value:"envelope"},"Envelope"))),/*#__PURE__*/React.createElement("div",{className:"flex items-center gap-1.5"},/*#__PURE__*/React.createElement("span",null,"Duration:"),/*#__PURE__*/React.createElement("span",{className:"text-cyan-400 font-bold w-10 text-right"},woDuration.toFixed(3),"s"),/*#__PURE__*/React.createElement("input",{type:"range",min:"0.5",max:"5.0",step:"0.1",value:woDuration,onChange:e=>setWoDuration(parseFloat(e.target.value)),className:"w-16 h-1 cursor-pointer accent-cyan-400"})),/*#__PURE__*/React.createElement("div",{className:"flex items-center gap-1.5"},/*#__PURE__*/React.createElement("span",null,"V.Zoom:"),/*#__PURE__*/React.createElement("span",{className:"text-cyan-400 font-bold w-12 text-right"},woZoom.toFixed(1)," dB"),/*#__PURE__*/React.createElement("input",{type:"range",min:"-12",max:"24",step:"0.5",value:woZoom,onChange:e=>setWoZoom(parseFloat(e.target.value)),className:"w-16 h-1 cursor-pointer accent-cyan-400"}))),/*#__PURE__*/React.createElement("button",{onClick:()=>setWoPaused(!woPaused),className:`px-3 py-1 rounded font-bold border transition shadow-md shrink-0 flex items-center gap-1 ${woPaused?'bg-amber-800 hover:bg-amber-700 border-amber-500 text-amber-100':'bg-slate-800 hover:bg-slate-700 border-slate-700 text-slate-200'}`},woPaused?'Resume':'Pause')))),/*#__PURE__*/React.createElement("div",{className:"w-64 bg-slate-900 border-l border-slate-800/80 p-3 flex flex-col justify-between shadow-2xl oz-font-mono text-xs z-20 shrink-0"},/*#__PURE__*/React.createElement("div",{className:"flex items-center justify-between border-b border-slate-800 pb-2 mb-2"},/*#__PURE__*/React.createElement("span",{className:"text-xs font-bold text-white tracking-wider uppercase flex items-center gap-1.5"},/*#__PURE__*/React.createElement("i",{"data-lucide":"sliders",className:"w-3 h-3 text-cyan-400"})," I/O METERS"),/*#__PURE__*/React.createElement("span",{className:"text-[9px] bg-cyan-950 border border-cyan-800 text-cyan-300 px-1 py-0.5 rounded"},"TRUE PEAK")),/*#__PURE__*/React.createElement("div",{className:"grid grid-cols-2 gap-2 text-[10px] text-center mb-2"},/*#__PURE__*/React.createElement("div",{className:"bg-slate-950 border border-slate-800/80 p-1.5 rounded"},/*#__PURE__*/React.createElement("div",{className:"text-slate-500 font-bold"},"IN PEAK"),/*#__PURE__*/React.createElement("div",{id:"inPeakText",className:"text-cyan-400 font-bold oz-font-mono"},"-inf dB")),/*#__PURE__*/React.createElement("div",{className:"bg-slate-950 border border-slate-800/80 p-1.5 rounded"},/*#__PURE__*/React.createElement("div",{className:"text-slate-500 font-bold"},"OUT PEAK"),/*#__PURE__*/React.createElement("div",{id:"outPeakText",className:"text-emerald-400 font-bold oz-font-mono"},"-inf dB"))),/*#__PURE__*/React.createElement("div",{className:"grid grid-cols-2 gap-2 text-[10px] text-center mb-2"},/*#__PURE__*/React.createElement("div",{className:"bg-slate-950 border border-slate-800/80 p-1.5 rounded"},/*#__PURE__*/React.createElement("div",{className:"text-slate-500 font-bold"},"OUT RMS"),/*#__PURE__*/React.createElement("div",{id:"outRmsText",className:"text-sky-300 font-bold oz-font-mono"},"-inf")),/*#__PURE__*/React.createElement("div",{className:"bg-slate-950 border border-slate-800/80 p-1.5 rounded"},/*#__PURE__*/React.createElement("div",{className:"text-slate-500 font-bold"},"LOUDNESS"),/*#__PURE__*/React.createElement("div",{id:"lufsText",className:"text-fuchsia-300 font-bold oz-font-mono"},"--.-"))),/*#__PURE__*/React.createElement("div",{className:"flex-1 bg-slate-950 border border-slate-800/90 rounded-xl p-2 flex justify-around relative overflow-hidden my-1"},/*#__PURE__*/React.createElement("div",{className:"flex flex-col items-center h-full"},/*#__PURE__*/React.createElement("span",{className:"text-[9px] text-slate-500 mb-1"},"IN"),/*#__PURE__*/React.createElement("div",{className:"flex-1 w-5 bg-slate-900 border border-slate-800 rounded relative overflow-hidden flex items-end"},/*#__PURE__*/React.createElement("canvas",{ref:inMeterCanvasRef,className:"w-full h-full block"}))),/*#__PURE__*/React.createElement("div",{className:"flex flex-col items-center h-full"},/*#__PURE__*/React.createElement("span",{className:"text-[9px] text-slate-500 mb-1"},"OUT"),/*#__PURE__*/React.createElement("div",{className:"flex-1 w-6 bg-slate-900 border border-slate-800 rounded relative overflow-hidden flex items-end"},/*#__PURE__*/React.createElement("canvas",{ref:outMeterCanvasRef,className:"w-full h-full block"})))),/*#__PURE__*/React.createElement("div",{className:"grid grid-cols-2 gap-1.5 mt-2"},/*#__PURE__*/React.createElement("button",{onClick:()=>setOzState(prev=>({...prev,isBypassed:!prev.isBypassed})),className:`py-1.5 rounded text-[10px] font-bold border transition-colors ${ozState.isBypassed?'bg-cyan-600 border-cyan-500 text-white':'bg-slate-800 hover:bg-slate-700 text-slate-200 border-slate-700'}`},"Bypass"),/*#__PURE__*/React.createElement("button",{className:"bg-slate-800 hover:bg-slate-700 text-slate-200 py-1.5 rounded text-[10px] font-bold border border-slate-700 transition-colors"},"Gain Match"),/*#__PURE__*/React.createElement("button",{className:"bg-slate-800 hover:bg-slate-700 text-slate-300 py-1.5 rounded text-[10px] border border-slate-700"},"Codec"),/*#__PURE__*/React.createElement("button",{className:"bg-slate-800 hover:bg-slate-700 text-slate-300 py-1.5 rounded text-[10px] border border-slate-700"},"Dither"))))),addModuleOpen&&/*#__PURE__*/React.createElement("div",{className:"fixed inset-0 z-[110] bg-black/80 backdrop-blur-sm flex items-center justify-center p-4",onClick:()=>setAddModuleOpen(false)},/*#__PURE__*/React.createElement("div",{className:"w-full max-w-lg bg-slate-900 border border-slate-700 rounded-2xl p-5 space-y-4 shadow-2xl max-h-[80vh] overflow-y-auto",onClick:e=>e.stopPropagation()},/*#__PURE__*/React.createElement("div",{className:"flex items-center justify-between border-b border-slate-800 pb-3"},/*#__PURE__*/React.createElement("h3",{className:"text-xs font-bold text-white uppercase tracking-wider oz-font-mono"},"THÊM MODULE VÀO MASTERING CHAIN"),/*#__PURE__*/React.createElement("button",{onClick:()=>setAddModuleOpen(false),className:"text-slate-400 hover:text-white"},/*#__PURE__*/React.createElement("i",{"data-lucide":"x",className:"w-4 h-4"}))),/*#__PURE__*/React.createElement("div",{className:"grid grid-cols-2 gap-3 text-xs"},[{t:'eqpro',c:'text-teal-400',i:'chart-area',d:'Parametric / Graphic EQ PRO — Pro-Q style, 8 bands, interactive canvas + spectrum.'},{t:'compressor',c:'text-amber-400',i:'compress',d:'Nén dynamic range, glue & punch cho master.'},{t:'limiter',c:'text-rose-400',i:'shield-half',d:'True-Peak ceiling (ratio 20:1, knee 0) chống clipping.'},{t:'exciter',c:'text-purple-400',i:'wand-2',d:'Saturation hài cho warmth và top-end brilliance.'},{t:'rebalance',c:'text-sky-400',i:'sliders-horizontal',d:'Cân bằng Mid/Side (Vocal/Bass vs stereo width).'},{t:'eq',c:'text-cyan-400',i:'activity',d:'EQ 4-band (lowshelf, 2× peaking, highshelf) + presets.'},{t:'imager',c:'text-fuchsia-400',i:'radio',d:'Stereo width 4-band M/S + vectorscope/correlation.'},{t:'maximizer',c:'text-emerald-400',i:'gauge',d:'Maximizer: boost, soft clip, upward comp, ceiling.'}].map(m=>/*#__PURE__*/React.createElement("button",{key:m.t,onClick:()=>addModuleToChain(m.t),className:"p-3 bg-slate-950 hover:bg-slate-800 border border-slate-800 rounded-xl text-left space-y-1 transition-colors"},/*#__PURE__*/React.createElement("div",{className:`font-bold ${m.c} flex items-center gap-1.5`},/*#__PURE__*/React.createElement("i",{"data-lucide":m.i,className:"w-3.5 h-3.5"})," ",MODULE_META[m.t].name),/*#__PURE__*/React.createElement("div",{className:"text-[10px] text-slate-400"},m.d)))),/*#__PURE__*/React.createElement("div",{className:"border-t border-slate-800 pt-3"},/*#__PURE__*/React.createElement("div",{className:"text-[10px] font-bold text-teal-400 uppercase tracking-wider oz-font-mono mb-2"},"VST FX (Ozone...)"),/*#__PURE__*/React.createElement("button",{onClick:()=>setMasterVstPickerOpen(true),className:"w-full bg-slate-950 hover:bg-slate-800 border border-dashed border-slate-700 hover:border-teal-600 text-teal-300 rounded px-2 py-2 text-[11px] text-left transition-colors",title:"Plugin Picker theo category (EQ / Reverb / Comp / Utility)"},/*#__PURE__*/React.createElement("i",{"data-lucide":"plug",className:"w-3 h-3 inline-block mr-1"})," Chọn VST FX từ thư viện — Picker: EQ / Reverb / Comp / Utility")))),/*#__PURE__*/React.createElement(VstPluginPicker,{open:masterVstPickerOpen,onClose:()=>setMasterVstPickerOpen(false),plugins:masterFxList,onPick:f=>addVstToChain(f.path)}));};// ── Media Explorer Panel (from md/51_MEDIA_EXPLORER.md) ── const MEDIA_LIBRARY_SAMPLES=[{name:"MIDI_Loop_01.mid",events:95,lengthQn:16,time:"0:08.000",tpqn:480,bpm:130,kind:"midi"},{name:"MIDI_Loop_02_Bass.mid",events:48,lengthQn:16,time:"0:08.000",tpqn:480,bpm:130,kind:"midi"},{name:"MIDI_Loop_03_Lead.mid",events:110,lengthQn:16,time:"0:08.000",tpqn:480,bpm:130,kind:"midi"},{name:"MIDI_Loop_04.mid",events:76,lengthQn:16,time:"0:08.000",tpqn:480,bpm:130,kind:"midi"},{name:"MIDI_Loop_05_Bass.mid",events:52,lengthQn:16,time:"0:08.000",tpqn:480,bpm:130,kind:"midi"},{name:"MIDI_Loop_06.mid",events:88,lengthQn:16,time:"0:08.000",tpqn:480,bpm:130,kind:"midi"}];const MediaExplorerPanel=({height,clipboardRef,active})=>{const[userFiles,setUserFiles]=React.useState([]);const[folder,setFolder]=React.useState('library');const[selected,setSelected]=React.useState(null);const[filterText,setFilterText]=React.useState('');const[viewMode,setViewMode]=React.useState('details');const[isPlaying,setIsPlaying]=React.useState(false);const[isPaused,setIsPaused]=React.useState(false);const[isLooping,setIsLooping]=React.useState(false);const[autoPlay,setAutoPlay]=React.useState(true);const[pitch,setPitch]=React.useState(0.0);const[rate,setRate]=React.useState(1.0);const[volumeDb,setVolumeDb]=React.useState(0.0);const[currentTime,setCurrentTime]=React.useState(0);const[peaks,setPeaks]=React.useState(null);const[audioBuffer,setAudioBuffer]=React.useState(null);const[audioDuration,setAudioDuration]=React.useState(0);const[midiNotes,setMidiNotes]=React.useState(null);const[midiTotal,setMidiTotal]=React.useState(4);const[midiBars,setMidiBars]=React.useState(1);const[midiTotalBeats,setMidiTotalBeats]=React.useState(16);const[midiFileBpm,setMidiFileBpm]=React.useState(120);const[tempo,setTempo]=React.useState(function(){var saved=localStorage.getItem('studio_media_explorer_tempo');return saved?parseInt(saved):120;});const[tempoText,setTempoText]=React.useState(String(function(){var saved=localStorage.getItem('studio_media_explorer_tempo');return saved?parseInt(saved):120;}()));const[zoom,setZoom]=React.useState(1.0);// Đồng bộ zoom ra window ref — serializeProjectToSchema lưu vào metadata.zoom // (module-level không truy cập state) → restore/open khôi phục đúng zoom. React.useEffect(()=>{window.__currentZoom=zoom;},[zoom]);const[scrollOffset,setScrollOffset]=React.useState(0);const scrollOffsetRef=React.useRef(0);scrollOffsetRef.current=scrollOffset;const[selStart,setSelStart]=React.useState(null);const[selEnd,setSelEnd]=React.useState(null);const[isDragging,setIsDragging]=React.useState(false);const[previewCtxMenu,setPreviewCtxMenu]=React.useState(null);// { x, y } @@ -917,10 +929,10 @@ isLoopingRef.current=next;const cur=selectedRef.current;const st=playStateRef.cu // the loop points to the current selection so it loops continuously // over the selected region until Stop is pressed. if(next&&st.source.buffer){if(hasSelection){st.source.loopStart=Math.min(sStart,sEnd);st.source.loopEnd=Math.max(sStart,sEnd);}else{st.source.loopStart=0;st.source.loopEnd=st.source.buffer.duration;}}}if(next&&isMidiFile(cur)){// Re-schedule loop for the currently previewing MIDI file -if(cur&&(cur.handle||cur.path||cur.file_id||cur.fileId||cur.kind==='midi'&&cur.name)){selectTokenRef.current++;const token=selectTokenRef.current;try{if(window.SonicMidiRouter)window.SonicMidiRouter.panic();else if(window.SonicSF&&typeof window.SonicSF.stopAll==='function')window.SonicSF.stopAll();}catch(e){}stopAllNativeSfNotes();stopAllNativeVstNotes();playMidiPreview(cur,token);}}return next;});};const toggleRate=dir=>setRate(prev=>Math.max(0.25,Math.min(4.0,Math.round((prev+dir*0.1)*100)/100)));const togglePitch=dir=>setPitch(prev=>Math.max(-24,Math.min(24,prev+dir*0.5)));const selIsMidi=isMidiFile(selected);const selDur=fileDuration(selected);const selBpm=selected&&selected.bpm||tempo;return/*#__PURE__*/React.createElement("div",{ref:containerRef,className:"flex flex-col w-full h-full text-slate-900 overflow-hidden select-none",style:{fontFamily:"'Inter', sans-serif"}},/*#__PURE__*/React.createElement("div",{className:"h-8 bg-[#d4d0c8] border-b border-[#808080] px-2 flex items-center justify-between text-xs shrink-0"},/*#__PURE__*/React.createElement("div",{className:"flex items-center gap-1 flex-1 mr-2"},/*#__PURE__*/React.createElement("button",{className:"w-5 h-5 bg-[#e0e0e0] hover:bg-white border border-[#707070] rounded-sm flex items-center justify-center text-[10px]",title:"Back",onClick:()=>folder==='computer'?goComputerParent():setFolder('library')},/*#__PURE__*/React.createElement("i",{className:"fa-solid fa-arrow-left"})),/*#__PURE__*/React.createElement("button",{className:"w-5 h-5 bg-[#e0e0e0] hover:bg-white border border-[#707070] rounded-sm flex items-center justify-center text-[10px]",title:"Forward",onClick:()=>setFolder('uploads')},/*#__PURE__*/React.createElement("i",{className:"fa-solid fa-arrow-right"})),/*#__PURE__*/React.createElement("button",{className:"w-5 h-5 bg-[#e0e0e0] hover:bg-white border border-[#707070] rounded-sm flex items-center justify-center text-[10px]",title:"Up Directory",onClick:()=>folder==='computer'?goComputerParent():setFolder('library')},/*#__PURE__*/React.createElement("i",{className:"fa-solid fa-arrow-up"})),/*#__PURE__*/React.createElement("button",{className:"w-5 h-5 bg-[#e0e0e0] hover:bg-white border border-[#707070] rounded-sm flex items-center justify-center text-[10px]",title:"Refresh",onClick:()=>{if(folder==='computer'){const node=computerTree[computerPath];if(node&&node.handle)browseComputerDir({name:computerPath.split('/').pop()||computerPath,path:computerPath,is_dir:true,handle:node.handle});else if(computerPath)browseComputerDir({name:computerPath.split(/[\\/]/).pop()||computerPath,path:computerPath,is_dir:true});}else if(window.SonicAPI&&window.SonicAPI.listMyFiles)window.SonicAPI.listMyFiles([]).then(d=>setUserFiles(d||[]));}},/*#__PURE__*/React.createElement("i",{className:"fa-solid fa-rotate-right"})),/*#__PURE__*/React.createElement("div",{className:"flex-1 flex items-center bg-white border border-[#808080] h-5 px-1"},/*#__PURE__*/React.createElement("i",{className:"fa-solid fa-folder-open text-[#d9a752] text-[11px] mr-1.5"}),/*#__PURE__*/React.createElement("span",{className:"flex-1 text-xs text-slate-800 truncate"},folder==='computer'?computerPath||'My Computer':folder==='library'?'Media Library':folder==='uploads'?'Uploads':'Processed'),/*#__PURE__*/React.createElement("i",{className:"fa-solid fa-caret-down text-slate-600 text-[10px] ml-1"}))),/*#__PURE__*/React.createElement("div",{className:"flex items-center gap-2"},/*#__PURE__*/React.createElement("div",{className:"flex items-center bg-white border border-[#808080] h-5 px-1 w-40"},/*#__PURE__*/React.createElement("input",{type:"text",placeholder:"Filter/Search...",value:filterText,onChange:e=>setFilterText(e.target.value),className:"w-full text-xs outline-none bg-transparent font-sans text-slate-800"}),/*#__PURE__*/React.createElement("i",{className:"fa-solid fa-caret-down text-slate-600 text-[10px] ml-1"})),/*#__PURE__*/React.createElement("button",{className:"px-2 py-0.5 bg-[#e0e0e0] hover:bg-white border border-[#707070] rounded-sm text-[11px] flex items-center gap-1 font-semibold",onClick:()=>setViewMode(viewMode==='details'?'list':'details')},/*#__PURE__*/React.createElement("span",null,viewMode==='details'?'Details':'List')," ",/*#__PURE__*/React.createElement("i",{className:"fa-solid fa-caret-down text-[9px]"})))),/*#__PURE__*/React.createElement("div",{className:"flex-1 flex overflow-hidden min-h-0 relative"},/*#__PURE__*/React.createElement("div",{className:"flex bg-white border border-[#808080] m-1 mr-0 text-xs select-none shrink-0 overflow-hidden"},/*#__PURE__*/React.createElement("div",{ref:treePaneRef,className:"overflow-y-auto p-1",style:{width:treeWidth+'px',minWidth:treeWidth+'px',maxWidth:treeWidth+'px'}},/*#__PURE__*/React.createElement("div",{className:"space-y-0.5 font-sans"},/*#__PURE__*/React.createElement("div",{className:"flex items-center gap-1 px-1 py-0.5 text-slate-700"},/*#__PURE__*/React.createElement("span",{className:"w-3"})," "),/*#__PURE__*/React.createElement("div",{className:"flex items-center gap-1 px-1 py-0.5 text-slate-700"},/*#__PURE__*/React.createElement("span",{className:"w-3"})," "),/*#__PURE__*/React.createElement("div",{className:`flex items-center gap-1 px-1 py-0.5 cursor-pointer rounded-sm font-bold ${folder==='computer'&&computerPath==='favorited'?'bg-slate-300 text-slate-900':'hover:bg-slate-200 text-slate-800'}`,onClick:()=>{openFavorited();setFavoritedExpanded(!favoritedExpanded);}},/*#__PURE__*/React.createElement("i",{className:"fa-solid fa-star text-amber-500 text-[11px] font-bold"})," Favorited"),favoritedExpanded&&/*#__PURE__*/React.createElement("div",{className:"pl-3 space-y-0.5"},favorites.map((fav,fi)=>/*#__PURE__*/React.createElement("div",{key:fav.path+fi,"data-tree-path":fav.path,className:"flex items-center gap-1 px-1 py-0.5 cursor-pointer rounded-sm hover:bg-amber-100 text-slate-800",style:{paddingLeft:20},onClick:()=>openFavorite(fav),onContextMenu:e=>{e.preventDefault();e.stopPropagation();setFavContext(Object.assign({},fav,{x:e.clientX,y:e.clientY}));}},/*#__PURE__*/React.createElement("i",{className:"fa-solid fa-folder text-[#d9a752] shrink-0"}),/*#__PURE__*/React.createElement("span",{className:"truncate flex-1"},fav.name),/*#__PURE__*/React.createElement("i",{className:"fa-solid fa-star text-amber-500 text-[9px] shrink-0"}))),favorites.length===0&&/*#__PURE__*/React.createElement("div",{className:"pl-4 py-0.5 text-slate-400 italic text-[11px]"},"No favorites")),/*#__PURE__*/React.createElement("div",{className:`flex items-center gap-1 px-1 py-0.5 cursor-pointer rounded-sm ${folder==='computer'&&computerPath!=='favorited'?'bg-slate-300 text-slate-900 font-semibold':'hover:bg-slate-200 text-slate-800'}`,onClick:openMyComputer},/*#__PURE__*/React.createElement("i",{className:"fa-solid fa-computer text-[11px] text-slate-600"})," My Computer"),folder==='computer'&&computerPath!=='favorited'&&computerRoots&&/*#__PURE__*/React.createElement("div",{className:"pl-3 space-y-0.5"},computerRoots.map(root=>renderComputerNode(root,0,true))),/*#__PURE__*/React.createElement("div",{className:`flex items-center gap-1 px-1 py-0.5 cursor-pointer font-semibold rounded-sm ${folder==='library'?'bg-slate-300 text-slate-900':'hover:bg-slate-200 text-slate-800'}`,onClick:()=>setFolder('library')},/*#__PURE__*/React.createElement("i",{className:"fa-solid fa-folder-open text-[#d9a752]"})," Media Library"),/*#__PURE__*/React.createElement("div",{className:"pl-3 space-y-0.5"},/*#__PURE__*/React.createElement("div",{className:`flex items-center gap-1 px-1 py-0.5 cursor-pointer pl-4 rounded-sm ${folder==='uploads'?'bg-slate-300 text-slate-900':'hover:bg-slate-200 text-slate-800'}`,onClick:()=>setFolder('uploads')},/*#__PURE__*/React.createElement("i",{className:"fa-solid fa-folder text-[#d9a752]"})," Uploads"),/*#__PURE__*/React.createElement("div",{className:`flex items-center gap-1 px-1 py-0.5 cursor-pointer pl-4 rounded-sm ${folder==='processed'?'bg-slate-300 text-slate-900':'hover:bg-slate-200 text-slate-800'}`,onClick:()=>setFolder('processed')},/*#__PURE__*/React.createElement("i",{className:"fa-solid fa-folder text-[#d9a752]"})," Processed")))),/*#__PURE__*/React.createElement("div",{className:"w-1.5 cursor-ew-resize hover:bg-blue-500/40 active:bg-blue-500/60 transition-colors shrink-0",onMouseDown:startTreeResize,title:"K\xE9o \u0111\u1EC3 thay \u0111\u1ED5i chi\u1EC1u r\u1ED9ng"})),favContext&&/*#__PURE__*/React.createElement("div",{className:"fixed z-[100] bg-white border border-[#808080] shadow-lg rounded-sm text-xs font-sans text-slate-800 min-w-[180px]",style:{left:favContext.x,top:favContext.y},onMouseLeave:()=>setFavContext(null)},/*#__PURE__*/React.createElement("div",{className:`px-2 py-1 cursor-pointer hover:bg-blue-100 flex items-center gap-1.5 ${isFavorite(favContext)?'text-amber-700':''}`,onClick:()=>{toggleFavorite(favContext);setFavContext(null);}},/*#__PURE__*/React.createElement("i",{className:`fa-solid ${isFavorite(favContext)?'fa-star text-amber-500':'fa-star text-slate-400'} text-[11px]`}),isFavorite(favContext)?'Gỡ khỏi Favorited':'Thêm vào Favorited'),/*#__PURE__*/React.createElement("div",{className:"px-2 py-1 cursor-pointer hover:bg-blue-100 flex items-center gap-1.5",onClick:()=>{if(favContext)browseComputerDir(favContext);setFavContext(null);}},/*#__PURE__*/React.createElement("i",{className:"fa-solid fa-folder-open text-[#d9a752] text-[11px]"})," M\u1EDF th\u01B0 m\u1EE5c")),/*#__PURE__*/React.createElement("div",{className:"flex-1 bg-white border border-[#808080] m-1 overflow-y-auto relative"},/*#__PURE__*/React.createElement("table",{className:"w-full text-xs text-left border-collapse",style:{tableLayout:'fixed'}},/*#__PURE__*/React.createElement("thead",{className:"sticky top-0 bg-[#e0e0e0] border-b border-[#a0a0a0] text-slate-800 font-semibold select-none shadow-sm z-10"},/*#__PURE__*/React.createElement("tr",null,/*#__PURE__*/React.createElement("th",{className:"py-1 px-2 border-r border-[#b0b0b0] relative",style:viewMode==='details'?{width:colWidths.file}:undefined},/*#__PURE__*/React.createElement("div",{className:"truncate pr-2"},"File"),/*#__PURE__*/React.createElement("div",{className:"absolute right-0 top-0 bottom-0 w-1.5 cursor-col-resize hover:bg-slate-400",onMouseDown:e=>startColResize('file',e)})),viewMode==='details'&&/*#__PURE__*/React.createElement(React.Fragment,null,/*#__PURE__*/React.createElement("th",{className:"py-1 px-2 border-r border-[#b0b0b0] relative",style:{width:colWidths.size}},/*#__PURE__*/React.createElement("div",{className:"truncate pr-2"},"Size"),/*#__PURE__*/React.createElement("div",{className:"absolute right-0 top-0 bottom-0 w-1.5 cursor-col-resize hover:bg-slate-400",onMouseDown:e=>startColResize('size',e)})),/*#__PURE__*/React.createElement("th",{className:"py-1 px-2 border-r border-[#b0b0b0] relative",style:{width:colWidths.type}},/*#__PURE__*/React.createElement("div",{className:"truncate pr-2"},"Type"),/*#__PURE__*/React.createElement("div",{className:"absolute right-0 top-0 bottom-0 w-1.5 cursor-col-resize hover:bg-slate-400",onMouseDown:e=>startColResize('type',e)}))))),/*#__PURE__*/React.createElement("tbody",{className:"font-sans text-slate-800"},visibleFiles.map((f,i)=>{const isSel=selected&&(selected.name||selected.file_id)===(f.name||f.file_id);const isMidi=isMidiFile(f);const icon=f.is_dir?'fa-folder text-[#d9a752]':isMidi?'fa-music text-purple-600':f.kind==='audio'?'fa-file-audio text-emerald-600':'fa-file text-zinc-500';return/*#__PURE__*/React.createElement("tr",{key:(f.path||f.file_id||f.name)+i,draggable:!f.is_dir,onDragStart:e=>{if(f.is_dir){e.preventDefault();return;}e.dataTransfer.setData('text/plain',f.name||f.original_name||'');e.dataTransfer.effectAllowed='copy';window.__mediaExplorerDragFile=f;},onDragEnd:()=>{window.__mediaExplorerDragFile=null;},className:`cursor-pointer hover:bg-blue-100 ${isSel?'file-row-selected':''}`,onClick:()=>f.is_dir?browseComputerDir(f):handleSelect(f),onDoubleClick:()=>f.is_dir&&browseComputerDir(f),onContextMenu:e=>{if(f.is_dir){e.preventDefault();e.stopPropagation();setFavContext(Object.assign({},f,{x:e.clientX,y:e.clientY}));}}},/*#__PURE__*/React.createElement("td",{className:"py-1 px-2 truncate"},/*#__PURE__*/React.createElement("i",{className:`fa-solid ${icon} mr-2`}),f.name||f.original_name),viewMode==='details'&&/*#__PURE__*/React.createElement("td",{className:"py-1 px-2 truncate"},f.size_mb!=null?f.size_mb.toFixed(2)+' MB':isMidi?(f.tpqn||'MIDI')+' TPQN':'-'),viewMode==='details'&&/*#__PURE__*/React.createElement("td",{className:"py-1 px-2 truncate"},f.is_dir?'Folder':isMidi?'MIDI':f.kind==='audio'?'Audio':'File'));}),visibleFiles.length===0&&/*#__PURE__*/React.createElement("tr",null,/*#__PURE__*/React.createElement("td",{className:"py-3 px-2 text-slate-400 italic",colSpan:viewMode==='details'?3:1},"No files")))))),/*#__PURE__*/React.createElement("div",{className:"h-[38%] min-h-[110px] bg-[#d4d0c8] border-t border-[#808080] p-1.5 flex flex-col justify-between text-xs shrink-0 select-none"},/*#__PURE__*/React.createElement("div",{className:"flex items-center justify-between gap-2"},/*#__PURE__*/React.createElement("div",{className:"flex items-center gap-1"},/*#__PURE__*/React.createElement("button",{id:"btnStop",className:"w-6 h-6 bg-[#e0e0e0] hover:bg-white border border-[#707070] rounded-sm flex items-center justify-center text-slate-800",title:"Stop",onClick:stopMediaPlayback},/*#__PURE__*/React.createElement("i",{className:"fa-solid fa-square text-[10px]"})),/*#__PURE__*/React.createElement("button",{id:"btnPlay",className:"w-6 h-6 bg-[#e0e0e0] hover:bg-white border border-[#707070] rounded-sm flex items-center justify-center text-emerald-700 font-bold",title:"Play",onClick:()=>isPlaying?togglePause():playSelected(selected)},/*#__PURE__*/React.createElement("i",{className:`fa-solid ${isPlaying&&!isPaused?'fa-play':'fa-play'} text-xs`})),/*#__PURE__*/React.createElement("button",{id:"btnPause",className:"w-6 h-6 bg-[#e0e0e0] hover:bg-white border border-[#707070] rounded-sm flex items-center justify-center text-amber-700",title:"Pause",onClick:togglePause},/*#__PURE__*/React.createElement("i",{className:"fa-solid fa-pause text-xs"})),/*#__PURE__*/React.createElement("button",{id:"btnLoop",className:`w-6 h-6 border rounded-sm flex items-center justify-center text-xs ${isLooping?'bg-cyan-600 text-white border-cyan-700':'bg-[#e0e0e0] hover:bg-white text-slate-700 border-[#707070]'}`,title:"Loop / Repeat",onClick:toggleLoop},/*#__PURE__*/React.createElement("i",{className:"fa-solid fa-rotate-right"})),/*#__PURE__*/React.createElement("button",{id:"btnAutoPlay",className:`h-6 px-2 border rounded-sm font-bold text-[10px] flex items-center gap-1 ${autoPlay?'bg-gradient-to-r from-cyan-600 to-emerald-600 text-white border-slate-700':'bg-[#e0e0e0] text-slate-600 border-[#707070]'}`,onClick:()=>setAutoPlay(p=>!p)},/*#__PURE__*/React.createElement("i",{className:"fa-solid fa-bolt text-[9px]"})," ",/*#__PURE__*/React.createElement("span",null,"Auto-Play")),/*#__PURE__*/React.createElement("div",{className:"relative"},/*#__PURE__*/React.createElement("button",{id:"btnSynth",className:`h-6 px-2 border rounded-sm font-bold text-[10px] flex items-center gap-1 ${synthInst?'bg-gradient-to-r from-violet-600 to-fuchsia-600 text-white border-slate-700':'bg-[#e0e0e0] text-slate-600 border-[#707070]'}`,ref:btnSynthRef,title:"Ch\u1ECDn instrument \u0111\u1EC3 preview MIDI",onClick:toggleSynthDropdown},/*#__PURE__*/React.createElement("i",{className:"fa-solid fa-music text-[9px]"})," ",/*#__PURE__*/React.createElement("span",null,"Synth",synthInst?': '+(synthInst.name||'?'):''),/*#__PURE__*/React.createElement("i",{className:"fa-solid fa-caret-down text-[8px]"})),synthOpen&&(()=>{// Portal ra document.body: dropdown absolute bottom-8 bị clip bởi +if(cur&&(cur.handle||cur.path||cur.file_id||cur.fileId||cur.kind==='midi'&&cur.name)){selectTokenRef.current++;const token=selectTokenRef.current;try{if(window.SonicMidiRouter)window.SonicMidiRouter.panic();else if(window.SonicSF&&typeof window.SonicSF.stopAll==='function')window.SonicSF.stopAll();}catch(e){}stopAllNativeSfNotes();stopAllNativeVstNotes();playMidiPreview(cur,token);}}return next;});};const toggleRate=dir=>setRate(prev=>Math.max(0.25,Math.min(4.0,Math.round((prev+dir*0.1)*100)/100)));const togglePitch=dir=>setPitch(prev=>Math.max(-24,Math.min(24,prev+dir*0.5)));const selIsMidi=isMidiFile(selected);const selDur=fileDuration(selected);const selBpm=selected&&selected.bpm||tempo;return/*#__PURE__*/React.createElement("div",{ref:containerRef,className:"flex flex-col w-full h-full text-slate-900 overflow-hidden select-none",style:{fontFamily:"'Inter', sans-serif"}},/*#__PURE__*/React.createElement("div",{className:"h-8 bg-[#d4d0c8] border-b border-[#808080] px-2 flex items-center justify-between text-xs shrink-0"},/*#__PURE__*/React.createElement("div",{className:"flex items-center gap-1 flex-1 mr-2"},/*#__PURE__*/React.createElement("button",{className:"w-5 h-5 bg-[#e0e0e0] hover:bg-white border border-[#707070] rounded-sm flex items-center justify-center text-[10px]",title:"Back",onClick:()=>folder==='computer'?goComputerParent():setFolder('library')},/*#__PURE__*/React.createElement("i",{className:"fa-solid fa-arrow-left"})),/*#__PURE__*/React.createElement("button",{className:"w-5 h-5 bg-[#e0e0e0] hover:bg-white border border-[#707070] rounded-sm flex items-center justify-center text-[10px]",title:"Forward",onClick:()=>setFolder('uploads')},/*#__PURE__*/React.createElement("i",{className:"fa-solid fa-arrow-right"})),/*#__PURE__*/React.createElement("button",{className:"w-5 h-5 bg-[#e0e0e0] hover:bg-white border border-[#707070] rounded-sm flex items-center justify-center text-[10px]",title:"Up Directory",onClick:()=>folder==='computer'?goComputerParent():setFolder('library')},/*#__PURE__*/React.createElement("i",{className:"fa-solid fa-arrow-up"})),/*#__PURE__*/React.createElement("button",{className:"w-5 h-5 bg-[#e0e0e0] hover:bg-white border border-[#707070] rounded-sm flex items-center justify-center text-[10px]",title:"Refresh",onClick:()=>{if(folder==='computer'){const node=computerTree[computerPath];if(node&&node.handle)browseComputerDir({name:computerPath.split('/').pop()||computerPath,path:computerPath,is_dir:true,handle:node.handle});else if(computerPath)browseComputerDir({name:computerPath.split(/[\\/]/).pop()||computerPath,path:computerPath,is_dir:true});}else if(window.SonicAPI&&window.SonicAPI.listMyFiles)window.SonicAPI.listMyFiles([]).then(d=>setUserFiles(d||[]));}},/*#__PURE__*/React.createElement("i",{className:"fa-solid fa-rotate-right"})),/*#__PURE__*/React.createElement("div",{className:"flex-1 flex items-center bg-white border border-[#808080] h-5 px-1"},/*#__PURE__*/React.createElement("i",{className:"fa-solid fa-folder-open text-[#d9a752] text-[11px] mr-1.5"}),/*#__PURE__*/React.createElement("span",{className:"flex-1 text-xs text-slate-800 truncate"},folder==='computer'?computerPath||'My Computer':folder==='library'?'Media Library':folder==='uploads'?'Uploads':'Processed'),/*#__PURE__*/React.createElement("i",{className:"fa-solid fa-caret-down text-slate-600 text-[10px] ml-1"}))),/*#__PURE__*/React.createElement("div",{className:"flex items-center gap-2"},/*#__PURE__*/React.createElement("div",{className:"flex items-center bg-white border border-[#808080] h-5 px-1 w-40"},/*#__PURE__*/React.createElement("input",{type:"text",placeholder:"Filter/Search...",value:filterText,onChange:e=>setFilterText(e.target.value),className:"w-full text-xs outline-none bg-transparent font-sans text-slate-800"}),/*#__PURE__*/React.createElement("i",{className:"fa-solid fa-caret-down text-slate-600 text-[10px] ml-1"})),/*#__PURE__*/React.createElement("button",{className:"px-2 py-0.5 bg-[#e0e0e0] hover:bg-white border border-[#707070] rounded-sm text-[11px] flex items-center gap-1 font-semibold",onClick:()=>setViewMode(viewMode==='details'?'list':'details')},/*#__PURE__*/React.createElement("span",null,viewMode==='details'?'Details':'List')," ",/*#__PURE__*/React.createElement("i",{className:"fa-solid fa-caret-down text-[9px]"})))),/*#__PURE__*/React.createElement("div",{className:"flex-1 flex overflow-hidden min-h-0 relative"},/*#__PURE__*/React.createElement("div",{className:"flex bg-white border border-[#808080] m-1 mr-0 text-xs select-none shrink-0 overflow-hidden"},/*#__PURE__*/React.createElement("div",{ref:treePaneRef,className:"overflow-y-auto p-1",style:{width:treeWidth+'px',minWidth:treeWidth+'px',maxWidth:treeWidth+'px'}},/*#__PURE__*/React.createElement("div",{className:"space-y-0.5 font-sans"},/*#__PURE__*/React.createElement("div",{className:"flex items-center gap-1 px-1 py-0.5 text-slate-700"},/*#__PURE__*/React.createElement("span",{className:"w-3"})," "),/*#__PURE__*/React.createElement("div",{className:"flex items-center gap-1 px-1 py-0.5 text-slate-700"},/*#__PURE__*/React.createElement("span",{className:"w-3"})," "),/*#__PURE__*/React.createElement("div",{className:`flex items-center gap-1 px-1 py-0.5 cursor-pointer rounded-sm font-bold ${folder==='computer'&&computerPath==='favorited'?'bg-slate-300 text-slate-900':'hover:bg-slate-200 text-slate-800'}`,onClick:()=>{openFavorited();setFavoritedExpanded(!favoritedExpanded);}},/*#__PURE__*/React.createElement("i",{className:"fa-solid fa-star text-amber-500 text-[11px] font-bold"})," Favorited"),favoritedExpanded&&/*#__PURE__*/React.createElement("div",{className:"pl-3 space-y-0.5"},favorites.map((fav,fi)=>/*#__PURE__*/React.createElement("div",{key:fav.path+fi,"data-tree-path":fav.path,className:"flex items-center gap-1 px-1 py-0.5 cursor-pointer rounded-sm hover:bg-amber-100 text-slate-800",style:{paddingLeft:20},onClick:()=>openFavorite(fav),onContextMenu:e=>{e.preventDefault();e.stopPropagation();setFavContext(Object.assign({},fav,{x:e.clientX,y:e.clientY}));}},/*#__PURE__*/React.createElement("i",{className:"fa-solid fa-folder text-[#d9a752] shrink-0"}),/*#__PURE__*/React.createElement("span",{className:"truncate flex-1"},fav.name),/*#__PURE__*/React.createElement("i",{className:"fa-solid fa-star text-amber-500 text-[9px] shrink-0"}))),favorites.length===0&&/*#__PURE__*/React.createElement("div",{className:"pl-4 py-0.5 text-slate-400 italic text-[11px]"},"No favorites")),/*#__PURE__*/React.createElement("div",{className:`flex items-center gap-1 px-1 py-0.5 cursor-pointer rounded-sm ${folder==='computer'&&computerPath!=='favorited'?'bg-slate-300 text-slate-900 font-semibold':'hover:bg-slate-200 text-slate-800'}`,onClick:openMyComputer},/*#__PURE__*/React.createElement("i",{className:"fa-solid fa-computer text-[11px] text-slate-600"})," My Computer"),folder==='computer'&&computerPath!=='favorited'&&computerRoots&&/*#__PURE__*/React.createElement("div",{className:"pl-3 space-y-0.5"},computerRoots.map(root=>renderComputerNode(root,0,true))),/*#__PURE__*/React.createElement("div",{className:`flex items-center gap-1 px-1 py-0.5 cursor-pointer font-semibold rounded-sm ${folder==='library'?'bg-slate-300 text-slate-900':'hover:bg-slate-200 text-slate-800'}`,onClick:()=>setFolder('library')},/*#__PURE__*/React.createElement("i",{className:"fa-solid fa-folder-open text-[#d9a752]"})," Media Library"),/*#__PURE__*/React.createElement("div",{className:"pl-3 space-y-0.5"},/*#__PURE__*/React.createElement("div",{className:`flex items-center gap-1 px-1 py-0.5 cursor-pointer pl-4 rounded-sm ${folder==='uploads'?'bg-slate-300 text-slate-900':'hover:bg-slate-200 text-slate-800'}`,onClick:()=>setFolder('uploads')},/*#__PURE__*/React.createElement("i",{className:"fa-solid fa-folder text-[#d9a752]"})," Uploads"),/*#__PURE__*/React.createElement("div",{className:`flex items-center gap-1 px-1 py-0.5 cursor-pointer pl-4 rounded-sm ${folder==='processed'?'bg-slate-300 text-slate-900':'hover:bg-slate-200 text-slate-800'}`,onClick:()=>setFolder('processed')},/*#__PURE__*/React.createElement("i",{className:"fa-solid fa-folder text-[#d9a752]"})," Processed")))),/*#__PURE__*/React.createElement("div",{className:"w-1.5 cursor-ew-resize hover:bg-blue-500/40 active:bg-blue-500/60 transition-colors shrink-0",onMouseDown:startTreeResize,title:"Kéo để thay đổi chiều rộng"})),favContext&&/*#__PURE__*/React.createElement("div",{className:"fixed z-[100] bg-white border border-[#808080] shadow-lg rounded-sm text-xs font-sans text-slate-800 min-w-[180px]",style:{left:favContext.x,top:favContext.y},onMouseLeave:()=>setFavContext(null)},/*#__PURE__*/React.createElement("div",{className:`px-2 py-1 cursor-pointer hover:bg-blue-100 flex items-center gap-1.5 ${isFavorite(favContext)?'text-amber-700':''}`,onClick:()=>{toggleFavorite(favContext);setFavContext(null);}},/*#__PURE__*/React.createElement("i",{className:`fa-solid ${isFavorite(favContext)?'fa-star text-amber-500':'fa-star text-slate-400'} text-[11px]`}),isFavorite(favContext)?'Gỡ khỏi Favorited':'Thêm vào Favorited'),/*#__PURE__*/React.createElement("div",{className:"px-2 py-1 cursor-pointer hover:bg-blue-100 flex items-center gap-1.5",onClick:()=>{if(favContext)browseComputerDir(favContext);setFavContext(null);}},/*#__PURE__*/React.createElement("i",{className:"fa-solid fa-folder-open text-[#d9a752] text-[11px]"})," Mở thư mục")),/*#__PURE__*/React.createElement("div",{className:"flex-1 bg-white border border-[#808080] m-1 overflow-y-auto relative"},/*#__PURE__*/React.createElement("table",{className:"w-full text-xs text-left border-collapse",style:{tableLayout:'fixed'}},/*#__PURE__*/React.createElement("thead",{className:"sticky top-0 bg-[#e0e0e0] border-b border-[#a0a0a0] text-slate-800 font-semibold select-none shadow-sm z-10"},/*#__PURE__*/React.createElement("tr",null,/*#__PURE__*/React.createElement("th",{className:"py-1 px-2 border-r border-[#b0b0b0] relative",style:viewMode==='details'?{width:colWidths.file}:undefined},/*#__PURE__*/React.createElement("div",{className:"truncate pr-2"},"File"),/*#__PURE__*/React.createElement("div",{className:"absolute right-0 top-0 bottom-0 w-1.5 cursor-col-resize hover:bg-slate-400",onMouseDown:e=>startColResize('file',e)})),viewMode==='details'&&/*#__PURE__*/React.createElement(React.Fragment,null,/*#__PURE__*/React.createElement("th",{className:"py-1 px-2 border-r border-[#b0b0b0] relative",style:{width:colWidths.size}},/*#__PURE__*/React.createElement("div",{className:"truncate pr-2"},"Size"),/*#__PURE__*/React.createElement("div",{className:"absolute right-0 top-0 bottom-0 w-1.5 cursor-col-resize hover:bg-slate-400",onMouseDown:e=>startColResize('size',e)})),/*#__PURE__*/React.createElement("th",{className:"py-1 px-2 border-r border-[#b0b0b0] relative",style:{width:colWidths.type}},/*#__PURE__*/React.createElement("div",{className:"truncate pr-2"},"Type"),/*#__PURE__*/React.createElement("div",{className:"absolute right-0 top-0 bottom-0 w-1.5 cursor-col-resize hover:bg-slate-400",onMouseDown:e=>startColResize('type',e)}))))),/*#__PURE__*/React.createElement("tbody",{className:"font-sans text-slate-800"},visibleFiles.map((f,i)=>{const isSel=selected&&(selected.name||selected.file_id)===(f.name||f.file_id);const isMidi=isMidiFile(f);const icon=f.is_dir?'fa-folder text-[#d9a752]':isMidi?'fa-music text-purple-600':f.kind==='audio'?'fa-file-audio text-emerald-600':'fa-file text-zinc-500';return/*#__PURE__*/React.createElement("tr",{key:(f.path||f.file_id||f.name)+i,draggable:!f.is_dir,onDragStart:e=>{if(f.is_dir){e.preventDefault();return;}e.dataTransfer.setData('text/plain',f.name||f.original_name||'');e.dataTransfer.effectAllowed='copy';window.__mediaExplorerDragFile=f;},onDragEnd:()=>{window.__mediaExplorerDragFile=null;},className:`cursor-pointer hover:bg-blue-100 ${isSel?'file-row-selected':''}`,onClick:()=>f.is_dir?browseComputerDir(f):handleSelect(f),onDoubleClick:()=>f.is_dir&&browseComputerDir(f),onContextMenu:e=>{if(f.is_dir){e.preventDefault();e.stopPropagation();setFavContext(Object.assign({},f,{x:e.clientX,y:e.clientY}));}}},/*#__PURE__*/React.createElement("td",{className:"py-1 px-2 truncate"},/*#__PURE__*/React.createElement("i",{className:`fa-solid ${icon} mr-2`}),f.name||f.original_name),viewMode==='details'&&/*#__PURE__*/React.createElement("td",{className:"py-1 px-2 truncate"},f.size_mb!=null?f.size_mb.toFixed(2)+' MB':isMidi?(f.tpqn||'MIDI')+' TPQN':'-'),viewMode==='details'&&/*#__PURE__*/React.createElement("td",{className:"py-1 px-2 truncate"},f.is_dir?'Folder':isMidi?'MIDI':f.kind==='audio'?'Audio':'File'));}),visibleFiles.length===0&&/*#__PURE__*/React.createElement("tr",null,/*#__PURE__*/React.createElement("td",{className:"py-3 px-2 text-slate-400 italic",colSpan:viewMode==='details'?3:1},"No files")))))),/*#__PURE__*/React.createElement("div",{className:"h-[38%] min-h-[110px] bg-[#d4d0c8] border-t border-[#808080] p-1.5 flex flex-col justify-between text-xs shrink-0 select-none"},/*#__PURE__*/React.createElement("div",{className:"flex items-center justify-between gap-2"},/*#__PURE__*/React.createElement("div",{className:"flex items-center gap-1"},/*#__PURE__*/React.createElement("button",{id:"btnStop",className:"w-6 h-6 bg-[#e0e0e0] hover:bg-white border border-[#707070] rounded-sm flex items-center justify-center text-slate-800",title:"Stop",onClick:stopMediaPlayback},/*#__PURE__*/React.createElement("i",{className:"fa-solid fa-square text-[10px]"})),/*#__PURE__*/React.createElement("button",{id:"btnPlay",className:"w-6 h-6 bg-[#e0e0e0] hover:bg-white border border-[#707070] rounded-sm flex items-center justify-center text-emerald-700 font-bold",title:"Play",onClick:()=>isPlaying?togglePause():playSelected(selected)},/*#__PURE__*/React.createElement("i",{className:`fa-solid ${isPlaying&&!isPaused?'fa-play':'fa-play'} text-xs`})),/*#__PURE__*/React.createElement("button",{id:"btnPause",className:"w-6 h-6 bg-[#e0e0e0] hover:bg-white border border-[#707070] rounded-sm flex items-center justify-center text-amber-700",title:"Pause",onClick:togglePause},/*#__PURE__*/React.createElement("i",{className:"fa-solid fa-pause text-xs"})),/*#__PURE__*/React.createElement("button",{id:"btnLoop",className:`w-6 h-6 border rounded-sm flex items-center justify-center text-xs ${isLooping?'bg-cyan-600 text-white border-cyan-700':'bg-[#e0e0e0] hover:bg-white text-slate-700 border-[#707070]'}`,title:"Loop / Repeat",onClick:toggleLoop},/*#__PURE__*/React.createElement("i",{className:"fa-solid fa-rotate-right"})),/*#__PURE__*/React.createElement("button",{id:"btnAutoPlay",className:`h-6 px-2 border rounded-sm font-bold text-[10px] flex items-center gap-1 ${autoPlay?'bg-gradient-to-r from-cyan-600 to-emerald-600 text-white border-slate-700':'bg-[#e0e0e0] text-slate-600 border-[#707070]'}`,onClick:()=>setAutoPlay(p=>!p)},/*#__PURE__*/React.createElement("i",{className:"fa-solid fa-bolt text-[9px]"})," ",/*#__PURE__*/React.createElement("span",null,"Auto-Play")),/*#__PURE__*/React.createElement("div",{className:"relative"},/*#__PURE__*/React.createElement("button",{id:"btnSynth",className:`h-6 px-2 border rounded-sm font-bold text-[10px] flex items-center gap-1 ${synthInst?'bg-gradient-to-r from-violet-600 to-fuchsia-600 text-white border-slate-700':'bg-[#e0e0e0] text-slate-600 border-[#707070]'}`,ref:btnSynthRef,title:"Chọn instrument để preview MIDI",onClick:toggleSynthDropdown},/*#__PURE__*/React.createElement("i",{className:"fa-solid fa-music text-[9px]"})," ",/*#__PURE__*/React.createElement("span",null,"Synth",synthInst?': '+(synthInst.name||'?'):''),/*#__PURE__*/React.createElement("i",{className:"fa-solid fa-caret-down text-[8px]"})),synthOpen&&(()=>{// Portal ra document.body: dropdown absolute bottom-8 bị clip bởi // overflow-hidden của root Media Explorer khi list dài (max-h-72 // trồi lên trên) → header + ô tìm kiếm mất khi mở lần 2+. -const btnRect=btnSynthRef.current?btnSynthRef.current.getBoundingClientRect():null;return ReactDOM.createPortal(/*#__PURE__*/React.createElement("div",{className:"fixed z-40 w-64 bg-white border border-[#808080] shadow-xl rounded-sm text-xs text-slate-800 font-sans max-h-72 overflow-y-auto",style:{left:btnRect?btnRect.left:0,bottom:btnRect?window.innerHeight-btnRect.top+8:0}},/*#__PURE__*/React.createElement("div",{className:"sticky top-0 bg-[#e0e0e0] px-2 py-1 font-bold border-b border-[#a0a0a0] flex items-center justify-between z-20"},/*#__PURE__*/React.createElement("span",null,"Select Instrument"),/*#__PURE__*/React.createElement("button",{onClick:()=>setSynthOpen(false),className:"text-slate-500 hover:text-slate-900"},/*#__PURE__*/React.createElement("i",{className:"fa-solid fa-xmark"}))),/*#__PURE__*/React.createElement("div",{className:"sticky top-[23px] bg-white p-1 border-b border-[#c0c0c0] z-20 flex items-center gap-1"},/*#__PURE__*/React.createElement("i",{className:"fa-solid fa-magnifying-glass text-slate-400 pl-1 text-[10px]"}),/*#__PURE__*/React.createElement("input",{type:"text",placeholder:"T\xECm nh\u1EA1c c\u1EE5...",value:synthFilter,onChange:e=>setSynthFilter(e.target.value),onClick:e=>e.stopPropagation(),className:"w-full px-1 py-0.5 border border-[#c0c0c0] rounded-sm text-xs font-sans focus:outline-none focus:border-blue-500"}),synthFilter&&/*#__PURE__*/React.createElement("button",{onClick:e=>{e.stopPropagation();setSynthFilter('');},className:"text-slate-400 hover:text-slate-700 px-1"},/*#__PURE__*/React.createElement("i",{className:"fa-solid fa-xmark text-[10px]"}))),synthLoading&&/*#__PURE__*/React.createElement("div",{className:"px-2 py-2 text-slate-400 italic"},"Loading..."),!synthLoading&&(!synthList||synthList.length===0)&&/*#__PURE__*/React.createElement("div",{className:"px-2 py-2 text-slate-400 italic"},"Kh\xF4ng c\xF3 SoundFont n\xE0o"),/*#__PURE__*/React.createElement("div",{className:`flex items-center gap-1 px-2 py-1 cursor-pointer hover:bg-blue-100 ${!synthInst?'bg-slate-200':''}`,onClick:()=>selectSynthInst(null)},/*#__PURE__*/React.createElement("i",{className:"fa-solid fa-ban text-slate-400"})," None (m\u1EB7c \u0111\u1ECBnh)"),!synthLoading&&filteredSynthList&&filteredSynthList.map(group=>/*#__PURE__*/React.createElement("div",{key:group.sf.id||group.sf.name},/*#__PURE__*/React.createElement("div",{className:"px-2 py-1 bg-[#f0f0f0] font-semibold text-slate-600 border-t border-[#e0e0e0] truncate"},group.sf.display||group.sf.name||group.sf.id),(group.presets||[]).slice(0,200).map((p,pi)=>{const progId=p.id||p.name||'preset_'+pi;return/*#__PURE__*/React.createElement("div",{key:progId,className:`flex items-center gap-1 px-2 pl-4 py-0.5 cursor-pointer hover:bg-blue-100 truncate ${synthInst&&synthInst.program===p.program&&synthInst.sfId===(group.sf.id||group.sf.name)?'bg-slate-200':''}`,onClick:()=>selectSynthInst({sfId:group.sf.id,sfName:group.sf.display||group.sf.name||group.sf.id,bank:p.bank||0,program:p.program,name:p.name||'Program '+p.program})},p.bank===128?/*#__PURE__*/React.createElement("i",{className:"fa-solid fa-drum text-slate-400"}):/*#__PURE__*/React.createElement("i",{className:"fa-solid fa-music text-slate-400"})," ",p.name||'Program '+p.program);}))),!synthLoading&&filteredSynthList&&filteredSynthList.length===0&&synthFilter&&/*#__PURE__*/React.createElement("div",{className:"px-2 py-2 text-slate-400 italic"},"Kh\xF4ng t\xECm th\u1EA5y nh\u1EA1c c\u1EE5 tr\xF9ng kh\u1EDBp")),document.body);})()),/*#__PURE__*/React.createElement("div",{className:"flex items-center gap-1",title:"Tempo preview MIDI"},/*#__PURE__*/React.createElement("span",{className:"font-mono text-[10px] text-slate-700"},"Tempo:"),/*#__PURE__*/React.createElement("button",{className:"px-1 bg-[#e0e0e0] hover:bg-white border border-[#707070] rounded-sm text-[10px]",onClick:()=>commitTempo((tempo||120)-1)},"-"),/*#__PURE__*/React.createElement("div",{className:"bg-white border border-[#808080] px-1 h-5 flex items-center w-14"},/*#__PURE__*/React.createElement("input",{type:"number",min:"40",max:"300",value:tempoText,onChange:e=>{const raw=e.target.value;setTempoText(raw);const n=parseInt(raw);if(n>=40&&n<=300)commitTempo(n);},onBlur:()=>{const n=parseInt(tempoText);commitTempo(n);},onKeyDown:e=>{if(e.key==='Enter'){e.currentTarget.blur();}},className:"w-full text-xs text-right outline-none bg-transparent"})),/*#__PURE__*/React.createElement("button",{className:"px-1 bg-[#e0e0e0] hover:bg-white border border-[#707070] rounded-sm text-[10px]",onClick:()=>commitTempo((tempo||120)+1)},"+"),/*#__PURE__*/React.createElement("span",{className:"text-slate-600 text-[10px]"},"BPM"))),/*#__PURE__*/React.createElement("div",{className:"flex items-center gap-3 font-mono text-[11px]"},/*#__PURE__*/React.createElement("div",{className:"flex items-center gap-1"},/*#__PURE__*/React.createElement("span",null,"Pitch:"),/*#__PURE__*/React.createElement("button",{className:"px-1 bg-[#e0e0e0] hover:bg-white border border-[#707070] rounded-sm text-[10px]",onClick:()=>togglePitch(-0.5)},"-"),/*#__PURE__*/React.createElement("div",{className:"bg-white border border-[#808080] px-1 h-5 flex items-center w-14"},/*#__PURE__*/React.createElement("input",{type:"number",value:pitch.toFixed(1),step:"0.5",onChange:e=>setPitch(parseFloat(e.target.value)||0),className:"w-full text-xs text-right outline-none bg-transparent"})),/*#__PURE__*/React.createElement("button",{className:"px-1 bg-[#e0e0e0] hover:bg-white border border-[#707070] rounded-sm text-[10px]",onClick:()=>togglePitch(0.5)},"+")),/*#__PURE__*/React.createElement("div",{className:"flex items-center gap-1"},/*#__PURE__*/React.createElement("span",null,"Rate:"),/*#__PURE__*/React.createElement("div",{className:"bg-white border border-[#808080] px-1 h-5 flex items-center w-12"},/*#__PURE__*/React.createElement("input",{type:"number",value:rate.toFixed(2),step:"0.1",onChange:e=>setRate(Math.max(0.25,Math.min(4,parseFloat(e.target.value)||1))),className:"w-full text-xs text-right outline-none bg-transparent"})),/*#__PURE__*/React.createElement("button",{className:"w-5 h-5 bg-[#e0e0e0] hover:bg-white border border-[#707070] rounded-sm text-[9px]",onClick:()=>toggleRate(-1)},"-"),/*#__PURE__*/React.createElement("button",{className:"w-5 h-5 bg-[#e0e0e0] hover:bg-white border border-[#707070] rounded-sm text-[9px]",onClick:()=>toggleRate(1)},"+"))),/*#__PURE__*/React.createElement("div",{className:"flex items-center gap-2"},/*#__PURE__*/React.createElement("span",{className:"font-sans text-slate-700"},"Volume:"),/*#__PURE__*/React.createElement("input",{type:"range",min:"-60",max:"12",step:"0.5",value:volumeDb,onChange:e=>setVolumeDb(parseFloat(e.target.value)),className:"me-fader-slider w-24"}),/*#__PURE__*/React.createElement("div",{className:"bg-white border border-[#808080] px-1 h-5 flex items-center justify-center w-14 font-mono text-[11px]"},volumeDb<=-50?'-inf':volumeDb.toFixed(1)," dB")),/*#__PURE__*/React.createElement("div",{className:`px-2 py-0.5 border font-mono font-bold text-[10px] rounded-sm ${selIsMidi?'bg-purple-950 text-purple-300 border-purple-800':'bg-emerald-950 text-emerald-300 border-emerald-800'}`},selIsMidi?'MIDI':'Audio')),/*#__PURE__*/React.createElement("div",{className:"flex items-stretch gap-2 my-1 flex-1 min-h-0"},/*#__PURE__*/React.createElement("div",{className:"flex-1 bg-[#181818] border border-[#3a3a3a] relative overflow-hidden p-0.5"},/*#__PURE__*/React.createElement("canvas",{ref:canvasRef,className:"w-full h-full block cursor-pointer",onMouseDown:handleCanvasMouseDown,onMouseMove:handleCanvasMouseMove,onMouseUp:handleCanvasMouseUp,onContextMenu:handleCanvasContextMenu}),/*#__PURE__*/React.createElement("div",{className:"absolute top-1.5 right-1.5 flex gap-1 z-10"},/*#__PURE__*/React.createElement("button",{className:"w-5 h-5 bg-[#2a2a2a] hover:bg-slate-700 border border-[#444] rounded flex items-center justify-center text-white text-xs font-bold select-none cursor-pointer",title:"Zoom In",onClick:()=>setZoom(prev=>Math.min(10.0,prev*1.25))},"+"),/*#__PURE__*/React.createElement("button",{className:"w-5 h-5 bg-[#2a2a2a] hover:bg-slate-700 border border-[#444] rounded flex items-center justify-center text-white text-xs font-bold select-none cursor-pointer",title:"Zoom Out",onClick:()=>setZoom(prev=>Math.max(0.2,prev/1.25))},"-"),/*#__PURE__*/React.createElement("button",{className:"w-5 h-5 bg-[#2a2a2a] hover:bg-slate-700 border border-[#444] rounded flex items-center justify-center text-white text-[9px] select-none cursor-pointer",title:"Reset Zoom",onClick:()=>setZoom(1.0)},"1x")),previewCtxMenu&&/*#__PURE__*/React.createElement("div",{className:"fixed bg-[#1e1e24] border border-[#3e3e4a] rounded shadow-md z-[9999] py-1 font-sans text-xs text-slate-300 w-32 cursor-pointer select-none",style:{top:previewCtxMenu.y,left:previewCtxMenu.x},onClick:e=>e.stopPropagation()},/*#__PURE__*/React.createElement("div",{className:"px-3 py-1.5 hover:bg-slate-700 hover:text-white flex items-center gap-2",onClick:()=>{handleCopySelection();setPreviewCtxMenu(null);}},/*#__PURE__*/React.createElement("i",{className:"fa-solid fa-copy"})," Copy"),/*#__PURE__*/React.createElement("div",{className:"px-3 py-1.5 hover:bg-slate-700 hover:text-white border-t border-[#3e3e4a] flex items-center gap-2",onClick:()=>setPreviewCtxMenu(null)},/*#__PURE__*/React.createElement("i",{className:"fa-solid fa-xmark"})," Cancel"))),/*#__PURE__*/React.createElement("div",{className:"w-48 bg-[#181818] border border-[#3a3a3a] p-1.5 font-mono text-[10px] text-slate-300 leading-tight overflow-y-auto shrink-0"},selected?selIsMidi&&!selected.path?/*#__PURE__*/React.createElement(React.Fragment,null,/*#__PURE__*/React.createElement("div",null,selected.events," MIDI events"),/*#__PURE__*/React.createElement("div",null,"Length: ",selected.lengthQn," quarter notes"),/*#__PURE__*/React.createElement("div",null,"Length: ",selected.time," (est)"),/*#__PURE__*/React.createElement("div",null,"Ticks per quarter note: ",selected.tpqn)):/*#__PURE__*/React.createElement(React.Fragment,null,/*#__PURE__*/React.createElement("div",null,"Size: ",selected.size_mb!=null?selected.size_mb.toFixed(2)+' MB':'-'),selIsMidi?/*#__PURE__*/React.createElement(React.Fragment,null,/*#__PURE__*/React.createElement("div",null,"Bars: ",midiBars||1),/*#__PURE__*/React.createElement("div",null,"Beats: ",Math.round(midiTotalBeats||16)),/*#__PURE__*/React.createElement("div",null,"BPM: ",midiFileBpm||120),/*#__PURE__*/React.createElement("div",null,"Duration: ",selDur.toFixed(2),"s")):/*#__PURE__*/React.createElement(React.Fragment,null,/*#__PURE__*/React.createElement("div",null,"Duration: ",selDur.toFixed(2),"s"),/*#__PURE__*/React.createElement("div",null,"Sample Rate: 44100 Hz"),/*#__PURE__*/React.createElement("div",null,"Type: ",selected.path?selected.kind==='other'?'Local File':'Local Audio':selected.type||'Audio'))):/*#__PURE__*/React.createElement("div",null,"No file selected"))),/*#__PURE__*/React.createElement("div",{className:"h-5 bg-[#c0c0c0] border-t border-white flex items-center justify-between text-[11px] font-mono px-1 shrink-0"},/*#__PURE__*/React.createElement("div",{className:"flex items-center gap-3"},selIsMidi&&midiNotes&&midiNotes.length?/*#__PURE__*/React.createElement("div",{className:"bg-white border border-[#808080] px-1.5 text-slate-900 font-bold"},"Bar ",Math.max(1,Math.floor(currentTime/(4*60/(tempo||120)))+1)," / ",midiBars||1,/*#__PURE__*/React.createElement("span",{className:"text-slate-500 ml-1"},"| ",formatTime(currentTime)," / ",formatTime(selDur))):/*#__PURE__*/React.createElement("div",{className:"bg-white border border-[#808080] px-1.5 text-slate-900 font-bold"},formatTime(currentTime)," / ",formatTime(selDur))),/*#__PURE__*/React.createElement("div",{className:"text-slate-800 font-bold truncate max-w-[40%]"},selected?selected.name||selected.original_name:'No file selected'),/*#__PURE__*/React.createElement("div",{className:"text-slate-700"},selBpm," bpm x",rate.toFixed(2)))));};const App=()=>{// ── State Definitions ── +const btnRect=btnSynthRef.current?btnSynthRef.current.getBoundingClientRect():null;return ReactDOM.createPortal(/*#__PURE__*/React.createElement("div",{className:"fixed z-40 w-64 bg-white border border-[#808080] shadow-xl rounded-sm text-xs text-slate-800 font-sans max-h-72 overflow-y-auto",style:{left:btnRect?btnRect.left:0,bottom:btnRect?window.innerHeight-btnRect.top+8:0}},/*#__PURE__*/React.createElement("div",{className:"sticky top-0 bg-[#e0e0e0] px-2 py-1 font-bold border-b border-[#a0a0a0] flex items-center justify-between z-20"},/*#__PURE__*/React.createElement("span",null,"Select Instrument"),/*#__PURE__*/React.createElement("button",{onClick:()=>setSynthOpen(false),className:"text-slate-500 hover:text-slate-900"},/*#__PURE__*/React.createElement("i",{className:"fa-solid fa-xmark"}))),/*#__PURE__*/React.createElement("div",{className:"sticky top-[23px] bg-white p-1 border-b border-[#c0c0c0] z-20 flex items-center gap-1"},/*#__PURE__*/React.createElement("i",{className:"fa-solid fa-magnifying-glass text-slate-400 pl-1 text-[10px]"}),/*#__PURE__*/React.createElement("input",{type:"text",placeholder:"Tìm nhạc cụ...",value:synthFilter,onChange:e=>setSynthFilter(e.target.value),onClick:e=>e.stopPropagation(),className:"w-full px-1 py-0.5 border border-[#c0c0c0] rounded-sm text-xs font-sans focus:outline-none focus:border-blue-500"}),synthFilter&&/*#__PURE__*/React.createElement("button",{onClick:e=>{e.stopPropagation();setSynthFilter('');},className:"text-slate-400 hover:text-slate-700 px-1"},/*#__PURE__*/React.createElement("i",{className:"fa-solid fa-xmark text-[10px]"}))),synthLoading&&/*#__PURE__*/React.createElement("div",{className:"px-2 py-2 text-slate-400 italic"},"Loading..."),!synthLoading&&(!synthList||synthList.length===0)&&/*#__PURE__*/React.createElement("div",{className:"px-2 py-2 text-slate-400 italic"},"Không có SoundFont nào"),/*#__PURE__*/React.createElement("div",{className:`flex items-center gap-1 px-2 py-1 cursor-pointer hover:bg-blue-100 ${!synthInst?'bg-slate-200':''}`,onClick:()=>selectSynthInst(null)},/*#__PURE__*/React.createElement("i",{className:"fa-solid fa-ban text-slate-400"})," None (mặc định)"),!synthLoading&&filteredSynthList&&filteredSynthList.map(group=>/*#__PURE__*/React.createElement("div",{key:group.sf.id||group.sf.name},/*#__PURE__*/React.createElement("div",{className:"px-2 py-1 bg-[#f0f0f0] font-semibold text-slate-600 border-t border-[#e0e0e0] truncate"},group.sf.display||group.sf.name||group.sf.id),(group.presets||[]).slice(0,200).map((p,pi)=>{const progId=p.id||p.name||'preset_'+pi;return/*#__PURE__*/React.createElement("div",{key:progId,className:`flex items-center gap-1 px-2 pl-4 py-0.5 cursor-pointer hover:bg-blue-100 truncate ${synthInst&&synthInst.program===p.program&&synthInst.sfId===(group.sf.id||group.sf.name)?'bg-slate-200':''}`,onClick:()=>selectSynthInst({sfId:group.sf.id,sfName:group.sf.display||group.sf.name||group.sf.id,bank:p.bank||0,program:p.program,name:p.name||'Program '+p.program})},p.bank===128?/*#__PURE__*/React.createElement("i",{className:"fa-solid fa-drum text-slate-400"}):/*#__PURE__*/React.createElement("i",{className:"fa-solid fa-music text-slate-400"})," ",p.name||'Program '+p.program);}))),!synthLoading&&filteredSynthList&&filteredSynthList.length===0&&synthFilter&&/*#__PURE__*/React.createElement("div",{className:"px-2 py-2 text-slate-400 italic"},"Không tìm thấy nhạc cụ trùng khớp")),document.body);})()),/*#__PURE__*/React.createElement("div",{className:"flex items-center gap-1",title:"Tempo preview MIDI"},/*#__PURE__*/React.createElement("span",{className:"font-mono text-[10px] text-slate-700"},"Tempo:"),/*#__PURE__*/React.createElement("button",{className:"px-1 bg-[#e0e0e0] hover:bg-white border border-[#707070] rounded-sm text-[10px]",onClick:()=>commitTempo((tempo||120)-1)},"-"),/*#__PURE__*/React.createElement("div",{className:"bg-white border border-[#808080] px-1 h-5 flex items-center w-14"},/*#__PURE__*/React.createElement("input",{type:"number",min:"40",max:"300",value:tempoText,onChange:e=>{const raw=e.target.value;setTempoText(raw);const n=parseInt(raw);if(n>=40&&n<=300)commitTempo(n);},onBlur:()=>{const n=parseInt(tempoText);commitTempo(n);},onKeyDown:e=>{if(e.key==='Enter'){e.currentTarget.blur();}},className:"w-full text-xs text-right outline-none bg-transparent"})),/*#__PURE__*/React.createElement("button",{className:"px-1 bg-[#e0e0e0] hover:bg-white border border-[#707070] rounded-sm text-[10px]",onClick:()=>commitTempo((tempo||120)+1)},"+"),/*#__PURE__*/React.createElement("span",{className:"text-slate-600 text-[10px]"},"BPM"))),/*#__PURE__*/React.createElement("div",{className:"flex items-center gap-3 font-mono text-[11px]"},/*#__PURE__*/React.createElement("div",{className:"flex items-center gap-1"},/*#__PURE__*/React.createElement("span",null,"Pitch:"),/*#__PURE__*/React.createElement("button",{className:"px-1 bg-[#e0e0e0] hover:bg-white border border-[#707070] rounded-sm text-[10px]",onClick:()=>togglePitch(-0.5)},"-"),/*#__PURE__*/React.createElement("div",{className:"bg-white border border-[#808080] px-1 h-5 flex items-center w-14"},/*#__PURE__*/React.createElement("input",{type:"number",value:pitch.toFixed(1),step:"0.5",onChange:e=>setPitch(parseFloat(e.target.value)||0),className:"w-full text-xs text-right outline-none bg-transparent"})),/*#__PURE__*/React.createElement("button",{className:"px-1 bg-[#e0e0e0] hover:bg-white border border-[#707070] rounded-sm text-[10px]",onClick:()=>togglePitch(0.5)},"+")),/*#__PURE__*/React.createElement("div",{className:"flex items-center gap-1"},/*#__PURE__*/React.createElement("span",null,"Rate:"),/*#__PURE__*/React.createElement("div",{className:"bg-white border border-[#808080] px-1 h-5 flex items-center w-12"},/*#__PURE__*/React.createElement("input",{type:"number",value:rate.toFixed(2),step:"0.1",onChange:e=>setRate(Math.max(0.25,Math.min(4,parseFloat(e.target.value)||1))),className:"w-full text-xs text-right outline-none bg-transparent"})),/*#__PURE__*/React.createElement("button",{className:"w-5 h-5 bg-[#e0e0e0] hover:bg-white border border-[#707070] rounded-sm text-[9px]",onClick:()=>toggleRate(-1)},"-"),/*#__PURE__*/React.createElement("button",{className:"w-5 h-5 bg-[#e0e0e0] hover:bg-white border border-[#707070] rounded-sm text-[9px]",onClick:()=>toggleRate(1)},"+"))),/*#__PURE__*/React.createElement("div",{className:"flex items-center gap-2"},/*#__PURE__*/React.createElement("span",{className:"font-sans text-slate-700"},"Volume:"),/*#__PURE__*/React.createElement("input",{type:"range",min:"-60",max:"12",step:"0.5",value:volumeDb,onChange:e=>setVolumeDb(parseFloat(e.target.value)),className:"me-fader-slider w-24"}),/*#__PURE__*/React.createElement("div",{className:"bg-white border border-[#808080] px-1 h-5 flex items-center justify-center w-14 font-mono text-[11px]"},volumeDb<=-50?'-inf':volumeDb.toFixed(1)," dB")),/*#__PURE__*/React.createElement("div",{className:`px-2 py-0.5 border font-mono font-bold text-[10px] rounded-sm ${selIsMidi?'bg-purple-950 text-purple-300 border-purple-800':'bg-emerald-950 text-emerald-300 border-emerald-800'}`},selIsMidi?'MIDI':'Audio')),/*#__PURE__*/React.createElement("div",{className:"flex items-stretch gap-2 my-1 flex-1 min-h-0"},/*#__PURE__*/React.createElement("div",{className:"flex-1 bg-[#181818] border border-[#3a3a3a] relative overflow-hidden p-0.5"},/*#__PURE__*/React.createElement("canvas",{ref:canvasRef,className:"w-full h-full block cursor-pointer",onMouseDown:handleCanvasMouseDown,onMouseMove:handleCanvasMouseMove,onMouseUp:handleCanvasMouseUp,onContextMenu:handleCanvasContextMenu}),/*#__PURE__*/React.createElement("div",{className:"absolute top-1.5 right-1.5 flex gap-1 z-10"},/*#__PURE__*/React.createElement("button",{className:"w-5 h-5 bg-[#2a2a2a] hover:bg-slate-700 border border-[#444] rounded flex items-center justify-center text-white text-xs font-bold select-none cursor-pointer",title:"Zoom In",onClick:()=>setZoom(prev=>Math.min(10.0,prev*1.25))},"+"),/*#__PURE__*/React.createElement("button",{className:"w-5 h-5 bg-[#2a2a2a] hover:bg-slate-700 border border-[#444] rounded flex items-center justify-center text-white text-xs font-bold select-none cursor-pointer",title:"Zoom Out",onClick:()=>setZoom(prev=>Math.max(0.2,prev/1.25))},"-"),/*#__PURE__*/React.createElement("button",{className:"w-5 h-5 bg-[#2a2a2a] hover:bg-slate-700 border border-[#444] rounded flex items-center justify-center text-white text-[9px] select-none cursor-pointer",title:"Reset Zoom",onClick:()=>setZoom(1.0)},"1x")),previewCtxMenu&&/*#__PURE__*/React.createElement("div",{className:"fixed bg-[#1e1e24] border border-[#3e3e4a] rounded shadow-md z-[9999] py-1 font-sans text-xs text-slate-300 w-32 cursor-pointer select-none",style:{top:previewCtxMenu.y,left:previewCtxMenu.x},onClick:e=>e.stopPropagation()},/*#__PURE__*/React.createElement("div",{className:"px-3 py-1.5 hover:bg-slate-700 hover:text-white flex items-center gap-2",onClick:()=>{handleCopySelection();setPreviewCtxMenu(null);}},/*#__PURE__*/React.createElement("i",{className:"fa-solid fa-copy"})," Copy"),/*#__PURE__*/React.createElement("div",{className:"px-3 py-1.5 hover:bg-slate-700 hover:text-white border-t border-[#3e3e4a] flex items-center gap-2",onClick:()=>setPreviewCtxMenu(null)},/*#__PURE__*/React.createElement("i",{className:"fa-solid fa-xmark"})," Cancel"))),/*#__PURE__*/React.createElement("div",{className:"w-48 bg-[#181818] border border-[#3a3a3a] p-1.5 font-mono text-[10px] text-slate-300 leading-tight overflow-y-auto shrink-0"},selected?selIsMidi&&!selected.path?/*#__PURE__*/React.createElement(React.Fragment,null,/*#__PURE__*/React.createElement("div",null,selected.events," MIDI events"),/*#__PURE__*/React.createElement("div",null,"Length: ",selected.lengthQn," quarter notes"),/*#__PURE__*/React.createElement("div",null,"Length: ",selected.time," (est)"),/*#__PURE__*/React.createElement("div",null,"Ticks per quarter note: ",selected.tpqn)):/*#__PURE__*/React.createElement(React.Fragment,null,/*#__PURE__*/React.createElement("div",null,"Size: ",selected.size_mb!=null?selected.size_mb.toFixed(2)+' MB':'-'),selIsMidi?/*#__PURE__*/React.createElement(React.Fragment,null,/*#__PURE__*/React.createElement("div",null,"Bars: ",midiBars||1),/*#__PURE__*/React.createElement("div",null,"Beats: ",Math.round(midiTotalBeats||16)),/*#__PURE__*/React.createElement("div",null,"BPM: ",midiFileBpm||120),/*#__PURE__*/React.createElement("div",null,"Duration: ",selDur.toFixed(2),"s")):/*#__PURE__*/React.createElement(React.Fragment,null,/*#__PURE__*/React.createElement("div",null,"Duration: ",selDur.toFixed(2),"s"),/*#__PURE__*/React.createElement("div",null,"Sample Rate: 44100 Hz"),/*#__PURE__*/React.createElement("div",null,"Type: ",selected.path?selected.kind==='other'?'Local File':'Local Audio':selected.type||'Audio'))):/*#__PURE__*/React.createElement("div",null,"No file selected"))),/*#__PURE__*/React.createElement("div",{className:"h-5 bg-[#c0c0c0] border-t border-white flex items-center justify-between text-[11px] font-mono px-1 shrink-0"},/*#__PURE__*/React.createElement("div",{className:"flex items-center gap-3"},selIsMidi&&midiNotes&&midiNotes.length?/*#__PURE__*/React.createElement("div",{className:"bg-white border border-[#808080] px-1.5 text-slate-900 font-bold"},"Bar ",Math.max(1,Math.floor(currentTime/(4*60/(tempo||120)))+1)," / ",midiBars||1,/*#__PURE__*/React.createElement("span",{className:"text-slate-500 ml-1"},"| ",formatTime(currentTime)," / ",formatTime(selDur))):/*#__PURE__*/React.createElement("div",{className:"bg-white border border-[#808080] px-1.5 text-slate-900 font-bold"},formatTime(currentTime)," / ",formatTime(selDur))),/*#__PURE__*/React.createElement("div",{className:"text-slate-800 font-bold truncate max-w-[40%]"},selected?selected.name||selected.original_name:'No file selected'),/*#__PURE__*/React.createElement("div",{className:"text-slate-700"},selBpm," bpm x",rate.toFixed(2)))));};const App=()=>{// ── State Definitions ── const[tracks,setTracks]=useState([{id:'1',name:'Track 01',buffer:null,startTime:0,volumeDb:0,pan:0,muted:false,solo:false,color:'#0f766e',markers:[],serverFileId:null,clips:[],sections:[],midiItems:[],isArmed:false,monitoringEnabled:true,inputSource:{deviceType:'NONE',deviceId:''}},{id:'2',name:'Track 02',buffer:null,startTime:0,volumeDb:0,pan:0,muted:false,solo:false,color:'#1d4ed8',markers:[],serverFileId:null,clips:[],sections:[],midiItems:[],isArmed:false,monitoringEnabled:true,inputSource:{deviceType:'NONE',deviceId:''}}]);const[appWarningModal,setAppWarningModal]=useState(null);const[bpm,setBpm]=useState(localStorage.getItem('studio_bpm')||'120');const prevBpmRef=useRef(bpm);const[draggedClip,setDraggedClip]=useState(null);const[hoveredTrackId,setHoveredTrackId]=useState(null);// Recalculate item/section/selection durations when BPM changes useEffect(()=>{const oldSpb=prevBpmRef.current?60.0/parseFloat(prevBpmRef.current)*4:null;const bpmVal=parseFloat(bpm)||120;const secondsPerBar=60.0/bpmVal*4;// Recalculate range loop selection to maintain bar count (tempo mode only) if(oldSpb&&selectionFollowsTempo&&selectionStart!==null&&selectionEnd!==null&&selectionEnd>selectionStart){const startBar=selectionStart/oldSpb;const endBar=selectionEnd/oldSpb;if(endBar-startBar>0.01){setSelectionStart(startBar*secondsPerBar);setSelectionEnd(endBar*secondsPerBar);}}prevBpmRef.current=bpm;// Force canvas redraw @@ -1144,7 +1156,7 @@ useEffect(()=>{let cancelled=false;if(window.SonicAPI&&window.SonicAPI.getPrefer const handlePrefsChange=next=>{setPrefs(next);try{localStorage.setItem('sf_prefs',JSON.stringify(next));}catch(e){}if(window.SonicAPI&&window.SonicAPI.savePreferences){window.SonicAPI.savePreferences(next).catch(()=>{});}};// Unified FX Rack target context (unified_fx_rack_panel.md): { trackId, trackName } | null const[fxRackTarget,setFxRackTarget]=useState(null);window.__openFxRack=(trackId,trackName)=>setFxRackTarget({trackId,trackName});// Render offline toàn project qua native_bridge (VST FX masterbus + track) → WAV. // Dùng cho nút "Nghe thử" trong FX Rack / Mastering — preview = âm export. -window.__renderProjectPreview=async()=>{const schema=serializeProjectToSchema(currentProjectId||'temp_project',projectName||'Dự án tạm chưa lưu',bpm,tracks,subTabs,sessionTabs,masteringSettings);try{const res=await window.SonicAPI.renderProject(schema,'preview_'+Date.now()+'.wav');return res;}catch(e){window.showToast&&window.showToast('Render preview lỗi: '+(e.message||e),'error');throw e;}};const[masteringSettings,setMasteringSettings]=useState({masterConnected:true,// ⚠️ FIX: bật ON mặc định — MIDI item/preview PHẢI được xử lí qua mastering FX ngay khi chạy app (không cần bật/tắt power) +window.__renderProjectPreview=async()=>{const schema=serializeProjectToSchema(currentProjectId||'temp_project',projectName||'Dự án tạm chưa lưu',bpm,tracks,subTabs,sessionTabs,masteringSettings,masterVolume);try{const res=await window.SonicAPI.renderProject(schema,'preview_'+Date.now()+'.wav');return res;}catch(e){window.showToast&&window.showToast('Render preview lỗi: '+(e.message||e),'error');throw e;}};const[masteringSettings,setMasteringSettings]=useState({masterConnected:true,// ⚠️ FIX: bật ON mặc định — MIDI item/preview PHẢI được xử lí qua mastering FX ngay khi chạy app (không cần bật/tắt power) activeModule:'eq',eqActive:true,imagerActive:true,maximizerActive:true,eqLowGain:1.5,eqMid1Gain:-1.0,eqMid2Gain:2.0,eqHighGain:1.8,w1:0,w2:115,w3:135,w4:150,imagerScale:'v2',maxGain:5.4,maxUpward:2.0,maxSoftClip:15,maxTransient:25,ceiling:-0.1,isBypassed:false,chain:DEFAULT_MASTER_CHAIN.map(m=>({...m})),compActive:false,compThreshold:-16,compRatio:3,compMakeup:0,limActive:false,limThreshold:-1.0,excActive:false,excDrive:40,rebalActive:false,rebalMid:0,rebalSide:0,vstFxChain:[],vstBypass:false});useEffect(()=>{window.currentMasteringSettings=masteringSettings;if(audioCtx&&masterBus){toggleMasteringOnMaster(masteringSettings.masterConnected,masteringSettings.isBypassed);applyMasteringSettings(masteringSettings);// Re-sync live track routes: mastering ON → mọi track qua chain (♪ bị // override bởi effMidiBypass/effAudioBypass) — nút PWR bật/tắt phải áp // ngay lên node đang phát (không chờ tracks effect). @@ -1169,29 +1181,29 @@ const prevById=new Map((prev||[]).map(pt=>[pt.id,pt]));return updatedTracks.map( // Track 01 bị THAY bằng track MAIN (chứa SECTION_ITEM + không có midi) // → block lồng + mất MIDI. FIX: session tab CHỈ match với INNER TRACKS // của section items (đúng tầng), KHÔNG match track main top-level. -const sectionInnerTracks=[];updatedTracks.forEach(function(ut){(ut.sections||[]).forEach(function(s){(s.tracks||[]).forEach(function(st){sectionInnerTracks.push(st);});});});setSessionTabs(prev=>prev.map(st=>({...st,tracks:(st.tracks||[]).map(t=>{const found=sectionInnerTracks.find(u=>u.id===t.id);return found||t;})})));}};const restoreLastSessionProject=async()=>{var pendingWasNull=!window.__pendingSfsProject;loadPendingSfsProject();if(!pendingWasNull)return;var lastId=localStorage.getItem('sonic_project_id');var lastName=localStorage.getItem('sonic_project_name')||'Dự án';var parsed=null;if(!lastId){// Máy mới / browser ẩn danh: localStorage TRỐNG (id/name không tồn tại +const sectionInnerTracks=[];updatedTracks.forEach(function(ut){(ut.sections||[]).forEach(function(s){(s.tracks||[]).forEach(function(st){sectionInnerTracks.push(st);});});});setSessionTabs(prev=>prev.map(st=>({...st,tracks:(st.tracks||[]).map(t=>{const found=sectionInnerTracks.find(u=>u.id===t.id);return found||t;})})));}};const restoreLastSessionProject=async()=>{var pendingWasNull=!window.__pendingSfsProject;loadPendingSfsProject();if(!pendingWasNull)return true;// da xu li .sfs pending - khong de bang temp +var lastId=localStorage.getItem('sonic_project_id');var lastName=localStorage.getItem('sonic_project_name')||'Dự án';var parsed=null;if(!lastId){// Máy mới / browser ẩn danh: localStorage TRỐNG (id/name không tồn tại // trên máy này) → tự mở project Cloud GẦN NHẤT của tài khoản đang đăng // nhập — project tạo trên máy khác vẫn mở được ngay. const prof=currentUser||function(){try{return JSON.parse(localStorage.getItem('sonic_user')||'null');}catch(e){return null;}}();if(prof&&window.SonicAPI&&window.SonicAPI.listCloudProjects){try{const cloudList=await window.SonicAPI.listCloudProjects();if(cloudList&&cloudList.length>0){const latest=cloudList[0];// backend ORDER BY updated_at DESC -lastId=latest.id;lastName=latest.name||lastName;const proj=await window.SonicAPI.getCloudProject(lastId);if(proj&&proj.data_json)parsed=JSON.parse(proj.data_json);}}catch(e){console.warn('restore cloud fallback error:',e);}}}else{try{if(lastId.startsWith('local_')){var localData=localStorage.getItem('sonic_local_project_data');if(localData)parsed=JSON.parse(localData);}else{var proj=await window.SonicAPI.getCloudProject(lastId);if(proj)parsed=JSON.parse(proj.data_json);}}catch(e){console.warn('restore load error:',e);}}try{if(!parsed)return;var restoredBpm=bpm;var restoredTracks=[];var restoredSessionTabs=[];var restoredSubTabs=[];if(parsed.main_session){var result=deserializeProjectFromSchema(parsed);restoredTracks=result.tracks;restoredBpm=result.bpm;restoredSessionTabs=result.sessionTabs;restoredSubTabs=result.subTabs;// Bỏ qua zoom ≤ 1 (data cũ lưu 1.0 — lỗi __currentZoom của Media +lastId=latest.id;lastName=latest.name||lastName;const proj=await window.SonicAPI.getCloudProject(lastId);if(proj&&proj.data_json)parsed=JSON.parse(proj.data_json);}}catch(e){console.warn('restore cloud fallback error:',e);}}}else{try{if(lastId.startsWith('local_')){var localData=localStorage.getItem('sonic_local_project_data');if(localData)parsed=JSON.parse(localData);}else{var proj=await window.SonicAPI.getCloudProject(lastId);if(proj)parsed=JSON.parse(proj.data_json);}}catch(e){console.warn('restore load error:',e);}}try{if(!parsed)return false;var restoredBpm=bpm;var restoredTracks=[];var restoredSessionTabs=[];var restoredSubTabs=[];if(parsed.main_session){var result=deserializeProjectFromSchema(parsed);restoredTracks=result.tracks;restoredBpm=result.bpm;restoredSessionTabs=result.sessionTabs;restoredSubTabs=result.subTabs;// Bỏ qua zoom ≤ 1 (data cũ lưu 1.0 — lỗi __currentZoom của Media // Explorer) — áp dụng mới giữ zoom hiện tại/localStorage — hết thu nhỏ. -if(result.zoom>1&&setZoom)setZoom(result.zoom);if(result.masteringSettings)setMasteringSettings(result.masteringSettings);}else{restoredTracks=(parsed.tracks||[]).map(function(t){var rest=Object.assign({},t);delete rest.height;return Object.assign({},rest,{buffer:null,channelInfo:t.channelInfo||null,clips:t.clips||[],serverFileId:t.serverFileId||null});});}setTracks(restoredTracks);loadAudioBuffersForTracks(restoredTracks).catch(function(err){console.warn('loadAudioBuffersForTracks error:',err);});trackMidiChannelsRef.current={};preloadTrackInstruments(restoredTracks).catch(function(err){console.warn('preloadTrackInstruments error:',err);});prerenderNativeTracks(restoredTracks,restoredBpm);setBpm(restoredBpm.toString());setSelectedTrackId(restoredTracks[0]?.id||'1');setProjectName(lastName);setCurrentProjectId(lastId);localStorage.setItem('sonic_project_id',lastId);setSessionTabs(restoredSessionTabs);setSubTabs(restoredSubTabs);// DIAG section-tab block: log tracks + sections của section tab sau restore -try{(restoredSessionTabs||[]).forEach(function(st){var secCount=0,midiCount=0,clipCount=0;(st.tracks||[]).forEach(function(tr){secCount+=(tr.sections||[]).length;midiCount+=(tr.midiItems||[]).length;clipCount+=(tr.clips||[]).length;});console.log('[Restore] sessionTab',st.id,'sectionId',st.sectionId,'tracks',(st.tracks||[]).length,'sections',secCount,'midi',midiCount,'clips',clipCount);});}catch(e){}var restoredItemCount=0;restoredTracks.forEach(function(rt){if(rt.clips)restoredItemCount+=rt.clips.length;if(rt.midiItems)restoredItemCount+=rt.midiItems.length;if(rt.sections)restoredItemCount+=rt.sections.length;});showToast('Đã khôi phục dự án "'+lastName+'" ('+restoredItemCount+' items).','info');}catch(e){console.warn('restoreLastSessionProject failed:',e);// Stale session id (project deleted / DB reset): clear it so the error +if(result.zoom>1&&setZoom)setZoom(result.zoom);if(result.masteringSettings)setMasteringSettings(result.masteringSettings);if(result.masterVolume!==undefined&&result.masterVolume!==null)setMasterVolume(result.masterVolume);}else{restoredTracks=(parsed.tracks||[]).map(function(t){var rest=Object.assign({},t);delete rest.height;return Object.assign({},rest,{buffer:null,channelInfo:t.channelInfo||null,clips:t.clips||[],serverFileId:t.serverFileId||null});});}setTracks(restoredTracks);loadAudioBuffersForTracks(restoredTracks).catch(function(err){console.warn('loadAudioBuffersForTracks error:',err);});trackMidiChannelsRef.current={};preloadTrackInstruments(restoredTracks).catch(function(err){console.warn('preloadTrackInstruments error:',err);});prerenderNativeTracks(restoredTracks,restoredBpm);setBpm(restoredBpm.toString());setSelectedTrackId(restoredTracks[0]?.id||'1');setProjectName(lastName);setCurrentProjectId(lastId);localStorage.setItem('sonic_project_id',lastId);setSessionTabs(restoredSessionTabs);setSubTabs(restoredSubTabs);// DIAG section-tab block: log tracks + sections của section tab sau restore +try{(restoredSessionTabs||[]).forEach(function(st){var secCount=0,midiCount=0,clipCount=0;(st.tracks||[]).forEach(function(tr){secCount+=(tr.sections||[]).length;midiCount+=(tr.midiItems||[]).length;clipCount+=(tr.clips||[]).length;});console.log('[Restore] sessionTab',st.id,'sectionId',st.sectionId,'tracks',(st.tracks||[]).length,'sections',secCount,'midi',midiCount,'clips',clipCount);});}catch(e){}var restoredItemCount=0;restoredTracks.forEach(function(rt){if(rt.clips)restoredItemCount+=rt.clips.length;if(rt.midiItems)restoredItemCount+=rt.midiItems.length;if(rt.sections)restoredItemCount+=rt.sections.length;});showToast('Đã khôi phục dự án "'+lastName+'" ('+restoredItemCount+' items).','info');return true;}catch(e){console.warn('restoreLastSessionProject failed:',e);// Stale session id (project deleted / DB reset): clear it so the error // does not repeat on every page load. -localStorage.removeItem('sonic_project_id');localStorage.removeItem('sonic_project_name');}};useEffect(()=>{const checkAuthStatus=async()=>{const savedToken=localStorage.getItem('sonic_token');if(!savedToken){setIsMandatoryLogin(true);setAuthMode('login');setAuthModalOpen(true);return;}try{const profile=await window.SonicAPI.getProfile();setCurrentUser(profile);localStorage.setItem('sonic_user',JSON.stringify(profile));if(profile.must_change_password){setIsMandatoryLogin(true);setAuthMode('force_change');setAuthModalOpen(true);}else{setIsMandatoryLogin(false);setAuthModalOpen(false);restoreLastSessionProject();}}catch(err){const cached=localStorage.getItem('sonic_user');if(cached){try{setCurrentUser(JSON.parse(cached));}catch(_){}setIsMandatoryLogin(false);setAuthModalOpen(false);restoreLastSessionProject();}else{localStorage.removeItem('sonic_token');localStorage.removeItem('sonic_user');setCurrentUser(null);setIsMandatoryLogin(true);setAuthMode('login');setAuthModalOpen(true);}}};checkAuthStatus();},[]);const loadPendingSfsProject=()=>{const proj=window.__pendingSfsProject;if(!proj)return;try{let restoredTracks=[];let restoredBpm=bpm;let restoredSessionTabs=[];let restoredSubTabs=[];if(proj.main_session){const result=deserializeProjectFromSchema(proj);restoredTracks=result.tracks;restoredBpm=result.bpm;restoredSessionTabs=result.sessionTabs;restoredSubTabs=result.subTabs;if(result.masteringSettings){setMasteringSettings(result.masteringSettings);}else{setMasteringSettings({masterConnected:false,activeModule:'eq',eqActive:true,imagerActive:true,maximizerActive:true,eqLowGain:1.5,eqMid1Gain:-1.0,eqMid2Gain:2.0,eqHighGain:1.8,w1:0,w2:115,w3:135,w4:150,imagerScale:'v2',maxGain:5.4,maxUpward:2.0,maxSoftClip:15,maxTransient:25,ceiling:-0.1,isBypassed:false,chain:DEFAULT_MASTER_CHAIN.map(m=>({...m})),compActive:false,compThreshold:-16,compRatio:3,compMakeup:0,limActive:false,limThreshold:-1.0,excActive:false,excDrive:40,rebalActive:false,rebalMid:0,rebalSide:0,carlaBridgeActive:false,carlaBridge:{plugin:'',plugin_path:'',connected:false}});}}else{restoredTracks=(proj.tracks||[]).map(t=>{const{height:_h,...rest}=t;return{...rest,buffer:null,channelInfo:t.channelInfo||null,clips:t.clips||[],serverFileId:t.serverFileId||null};});}if(restoredTracks.length>0){setTracks(restoredTracks);setBpm(restoredBpm.toString());prerenderNativeTracks(restoredTracks,restoredBpm);if(restoredSessionTabs.length>0){setSessionTabs(restoredSessionTabs);}if(restoredSubTabs.length>0){setSubTabs(restoredSubTabs);}showToast(`Đã tải dự án "${proj.metadata?.title||proj.name||'Dự án mới'}" từ liên kết .sfs thành công!`,"success");}}catch(e){showToast("Lỗi tải dự án từ .sfs","error");}finally{window.__pendingSfsProject=null;}};const handleAuthSuccess=user=>{setCurrentUser(user);if(user.must_change_password){setIsMandatoryLogin(true);setAuthMode('force_change');setAuthModalOpen(true);}else{setIsMandatoryLogin(false);setAuthModalOpen(false);restoreLastSessionProject();const loadPrefs=p=>{if(!p)return;if(p.showAIPanel!==undefined)setShowAIPanel(p.showAIPanel);if(p.showExportPanel!==undefined)setShowExportPanel(p.showExportPanel);if(p.showSelectionPanel!==undefined)setShowSelectionPanel(p.showSelectionPanel);if(p.showPythonToolsPanel!==undefined)setShowPythonToolsPanel(p.showPythonToolsPanel);if(p.showMediaExplorer!==undefined)setShowMediaExplorer(p.showMediaExplorer);if(p.showFxRack!==undefined)setShowFxRack(p.showFxRack);if(p.showMidiEvents!==undefined)setShowMidiEvents(p.showMidiEvents);if(p.panelPositions)setPanelPositions(p.panelPositions);if(p.rightSidebarWidth)setRightSidebarWidth(p.rightSidebarWidth);if(p.mediaExplorerHeight)setMediaExplorerHeight(p.mediaExplorerHeight);if(p.selectedProviderId)setSelectedProviderId(p.selectedProviderId);};(async()=>{try{const data=await window.SonicAPI.getPreferences();if(data&&data.preferences)loadPrefs(data.preferences);else{const cached=localStorage.getItem('sonic_preferences');if(cached)loadPrefs(JSON.parse(cached));}}catch(e){const cached=localStorage.getItem('sonic_preferences');if(cached)loadPrefs(JSON.parse(cached));}try{const data=await window.SonicAPI.getAIConfigs();if(data&&data.providers){setAiProviders(data.providers);const active=data.providers.find(p=>p.is_active)||data.providers[0];if(active)setSelectedProviderId(active.id);}}catch(e){}try{window.SonicAPI.getSoundfontCatalog().then(cat=>{window.__soundfontCatalog=cat;}).catch(()=>{});}catch(e){}// Re-fetch instrument data after auth (useEffect on mount runs before token is set) -try{window.SonicAPI.listPlugins().then(async data=>{try{const catResp=(await window.SonicAPI.getSoundfontCatalog?.())??(await fetch('/api/v1/plugins/soundfonts/catalog').then(r=>r.json()));const catalog=catResp.full_catalog||{};data.soundfonts=(data.soundfonts||[]).map(sf=>{const sfId=sf.id.replace('sf_','');const catEntry=catalog[sfId.toLowerCase()]||catalog[sfId];if(catEntry&&catEntry.instruments)return{...sf,presets:catEntry.instruments};return sf;});}catch(e){console.warn('Catalog fetch error:',e);}setInstrumentSelectorData(data);}).catch(()=>{});}catch(e){}// ── Khôi phục dự án đang làm dở (temp autosave) khi load lại app ── -// Yêu cầu: "Khi tắt ứng dụng → tự động lưu temp; khi load lại → tải lại -// dự án đang làm dở." Chỉ restore khi app khởi động với project TRỐNG -// (chưa có clip/midi/audio nào) — không đè lên dự án user đang mở. -try{const tmp=await window.SonicAPI.getTempProject();if(tmp&&tmp.has_temp&&tmp.data_json){let proj=tmp.data_json;if(typeof proj==='string'){try{proj=JSON.parse(proj);}catch(e){proj=null;}}if(proj&&proj.main_session){const freshStart=!(tracks&&tracks.some(t=>t.clips&&t.clips.length>0||t.midiItems&&t.midiItems.length>0||t.buffer));if(freshStart){const result=deserializeProjectFromSchema(proj);if(result&&result.tracks&&result.tracks.length>0){setTracks(result.tracks);loadAudioBuffersForTracks(result.tracks);setBpm((result.bpm||120).toString());if(result.sessionTabs&&result.sessionTabs.length>0)setSessionTabs(result.sessionTabs);if(result.subTabs&&result.subTabs.length>0)setSubTabs(result.subTabs);if(result.masteringSettings)setMasteringSettings(result.masteringSettings);const tmpName=proj.metadata&&proj.metadata.title||'Dự án tạm';setProjectName(tmpName);localStorage.setItem('sonic_project_name',tmpName);showToast('Đã khôi phục dự án đang làm dở từ bản lưu tạm','success');}}}}}catch(e){console.warn('[TempRestore] error:',e);}})();}};const handleLogout=()=>{localStorage.removeItem('sonic_token');localStorage.removeItem('sonic_user');setCurrentUser(null);setIsMandatoryLogin(true);setAuthMode('login');setAuthModalOpen(true);};// ── Temp project auto-save (local + server) ── -useEffect(()=>{const serializeSafe=arr=>(arr||[]).map(t=>({id:t.id,name:t.name,startTime:t.startTime,height:t.height,volumeDb:t.volumeDb,pan:t.pan,muted:t.muted,solo:t.solo,color:t.color,markers:t.markers||[],serverFileId:t.serverFileId||null,channelInfo:t.channelInfo?{channels:t.channelInfo.channels,isStereo:t.channelInfo.isStereo,label:t.channelInfo.label}:null}));window.SonicStorage.scheduleTempAutoSave(()=>{return serializeProjectToSchema(currentProjectId||'temp_project',projectName||'Dự án tạm chưa lưu',bpm,tracks,subTabs,sessionTabs,masteringSettings);});},[tracks,subTabs,sessionTabs,masteringSettings]);// ── Temp autosave SERVER khi tắt ứng dụng (Bug: đóng app mất dự án làm dở) ── +localStorage.removeItem('sonic_project_id');localStorage.removeItem('sonic_project_name');return false;}};// Khoi phuc du an dang lam do tu temp autosave, CHI khi chua co project nao +// duoc restore (restoreLastSessionProject tra false). Goi o ca luong login +// modal (handleAuthSuccess) lan luong auto-login (checkAuthStatus). +const restoreTempProjectIfFresh=async()=>{try{const tmp=await window.SonicAPI.getTempProject();if(tmp&&tmp.has_temp&&tmp.data_json){let proj=tmp.data_json;if(typeof proj==='string'){try{proj=JSON.parse(proj);}catch(e){proj=null;}}if(proj&&proj.main_session){const freshStart=!(tracks&&tracks.some(t=>t.clips&&t.clips.length>0||t.midiItems&&t.midiItems.length>0||t.buffer));if(freshStart){const result=deserializeProjectFromSchema(proj);if(result&&result.tracks&&result.tracks.length>0){setTracks(result.tracks);loadAudioBuffersForTracks(result.tracks);setBpm((result.bpm||120).toString());if(result.sessionTabs&&result.sessionTabs.length>0)setSessionTabs(result.sessionTabs);if(result.subTabs&&result.subTabs.length>0)setSubTabs(result.subTabs);if(result.masteringSettings)setMasteringSettings(result.masteringSettings);if(result.masterVolume!==undefined&&result.masterVolume!==null)setMasterVolume(result.masterVolume);const tmpName=proj.metadata&&proj.metadata.title||'Dự án tạm';setProjectName(tmpName);localStorage.setItem('sonic_project_name',tmpName);showToast('Đã khôi phục dự án đang làm dở từ bản lưu tạm','success');}}}}}catch(e){console.warn('[TempRestore] error:',e);}};useEffect(()=>{const checkAuthStatus=async()=>{const savedToken=localStorage.getItem('sonic_token');if(!savedToken){setIsMandatoryLogin(true);setAuthMode('login');setAuthModalOpen(true);return;}try{const profile=await window.SonicAPI.getProfile();setCurrentUser(profile);localStorage.setItem('sonic_user',JSON.stringify(profile));if(profile.must_change_password){setIsMandatoryLogin(true);setAuthMode('force_change');setAuthModalOpen(true);}else{setIsMandatoryLogin(false);setAuthModalOpen(false);(async()=>{const restored=await restoreLastSessionProject();if(!restored)await restoreTempProjectIfFresh();})();}}catch(err){const cached=localStorage.getItem('sonic_user');if(cached){try{setCurrentUser(JSON.parse(cached));}catch(_){}setIsMandatoryLogin(false);setAuthModalOpen(false);(async()=>{const restored=await restoreLastSessionProject();if(!restored)await restoreTempProjectIfFresh();})();}else{localStorage.removeItem('sonic_token');localStorage.removeItem('sonic_user');setCurrentUser(null);setIsMandatoryLogin(true);setAuthMode('login');setAuthModalOpen(true);}}};checkAuthStatus();},[]);const loadPendingSfsProject=()=>{const proj=window.__pendingSfsProject;if(!proj)return;try{let restoredTracks=[];let restoredBpm=bpm;let restoredSessionTabs=[];let restoredSubTabs=[];if(proj.main_session){const result=deserializeProjectFromSchema(proj);restoredTracks=result.tracks;restoredBpm=result.bpm;restoredSessionTabs=result.sessionTabs;restoredSubTabs=result.subTabs;if(result.masteringSettings){setMasteringSettings(result.masteringSettings);}else{setMasteringSettings({masterConnected:false,activeModule:'eq',eqActive:true,imagerActive:true,maximizerActive:true,eqLowGain:1.5,eqMid1Gain:-1.0,eqMid2Gain:2.0,eqHighGain:1.8,w1:0,w2:115,w3:135,w4:150,imagerScale:'v2',maxGain:5.4,maxUpward:2.0,maxSoftClip:15,maxTransient:25,ceiling:-0.1,isBypassed:false,chain:DEFAULT_MASTER_CHAIN.map(m=>({...m})),compActive:false,compThreshold:-16,compRatio:3,compMakeup:0,limActive:false,limThreshold:-1.0,excActive:false,excDrive:40,rebalActive:false,rebalMid:0,rebalSide:0,carlaBridgeActive:false,carlaBridge:{plugin:'',plugin_path:'',connected:false}});}if(result.masterVolume!==undefined&&result.masterVolume!==null)setMasterVolume(result.masterVolume);}else{restoredTracks=(proj.tracks||[]).map(t=>{const{height:_h,...rest}=t;return{...rest,buffer:null,channelInfo:t.channelInfo||null,clips:t.clips||[],serverFileId:t.serverFileId||null};});}if(restoredTracks.length>0){setTracks(restoredTracks);setBpm(restoredBpm.toString());prerenderNativeTracks(restoredTracks,restoredBpm);if(restoredSessionTabs.length>0){setSessionTabs(restoredSessionTabs);}if(restoredSubTabs.length>0){setSubTabs(restoredSubTabs);}showToast(`Đã tải dự án "${proj.metadata?.title||proj.name||'Dự án mới'}" từ liên kết .sfs thành công!`,"success");}}catch(e){showToast("Lỗi tải dự án từ .sfs","error");}finally{window.__pendingSfsProject=null;}};const handleAuthSuccess=user=>{setCurrentUser(user);if(user.must_change_password){setIsMandatoryLogin(true);setAuthMode('force_change');setAuthModalOpen(true);}else{setIsMandatoryLogin(false);setAuthModalOpen(false);(async()=>{const restored=await restoreLastSessionProject();if(!restored)await restoreTempProjectIfFresh();})();const loadPrefs=p=>{if(!p)return;if(p.showAIPanel!==undefined)setShowAIPanel(p.showAIPanel);if(p.showExportPanel!==undefined)setShowExportPanel(p.showExportPanel);if(p.showSelectionPanel!==undefined)setShowSelectionPanel(p.showSelectionPanel);if(p.showPythonToolsPanel!==undefined)setShowPythonToolsPanel(p.showPythonToolsPanel);if(p.showMediaExplorer!==undefined)setShowMediaExplorer(p.showMediaExplorer);if(p.showFxRack!==undefined)setShowFxRack(p.showFxRack);if(p.showMidiEvents!==undefined)setShowMidiEvents(p.showMidiEvents);if(p.panelPositions)setPanelPositions(p.panelPositions);if(p.rightSidebarWidth)setRightSidebarWidth(p.rightSidebarWidth);if(p.mediaExplorerHeight)setMediaExplorerHeight(p.mediaExplorerHeight);if(p.selectedProviderId)setSelectedProviderId(p.selectedProviderId);};(async()=>{try{const data=await window.SonicAPI.getPreferences();if(data&&data.preferences)loadPrefs(data.preferences);else{const cached=localStorage.getItem('sonic_preferences');if(cached)loadPrefs(JSON.parse(cached));}}catch(e){const cached=localStorage.getItem('sonic_preferences');if(cached)loadPrefs(JSON.parse(cached));}try{const data=await window.SonicAPI.getAIConfigs();if(data&&data.providers){setAiProviders(data.providers);const active=data.providers.find(p=>p.is_active)||data.providers[0];if(active)setSelectedProviderId(active.id);}}catch(e){}try{window.SonicAPI.getSoundfontCatalog().then(cat=>{window.__soundfontCatalog=cat;}).catch(()=>{});}catch(e){}// Re-fetch instrument data after auth (useEffect on mount runs before token is set) +try{window.SonicAPI.listPlugins().then(async data=>{try{const catResp=(await window.SonicAPI.getSoundfontCatalog?.())??(await fetch('/api/v1/plugins/soundfonts/catalog').then(r=>r.json()));const catalog=catResp.full_catalog||{};data.soundfonts=(data.soundfonts||[]).map(sf=>{const sfId=sf.id.replace('sf_','');const catEntry=catalog[sfId.toLowerCase()]||catalog[sfId];if(catEntry&&catEntry.instruments)return{...sf,presets:catEntry.instruments};return sf;});}catch(e){console.warn('Catalog fetch error:',e);}setInstrumentSelectorData(data);}).catch(()=>{});}catch(e){}})();}};const handleLogout=()=>{localStorage.removeItem('sonic_token');localStorage.removeItem('sonic_user');setCurrentUser(null);setIsMandatoryLogin(true);setAuthMode('login');setAuthModalOpen(true);};// ── Temp project auto-save (local + server) ── +useEffect(()=>{const serializeSafe=arr=>(arr||[]).map(t=>({id:t.id,name:t.name,startTime:t.startTime,height:t.height,volumeDb:t.volumeDb,pan:t.pan,muted:t.muted,solo:t.solo,color:t.color,markers:t.markers||[],serverFileId:t.serverFileId||null,channelInfo:t.channelInfo?{channels:t.channelInfo.channels,isStereo:t.channelInfo.isStereo,label:t.channelInfo.label}:null}));window.SonicStorage.scheduleTempAutoSave(()=>{return serializeProjectToSchema(currentProjectId||'temp_project',projectName||'Dự án tạm chưa lưu',bpm,tracks,subTabs,sessionTabs,masteringSettings,masterVolume);});},[tracks,subTabs,sessionTabs,masteringSettings,masterVolume]);// ── Temp autosave SERVER khi tắt ứng dụng (Bug: đóng app mất dự án làm dở) ── // Lưu temp vào thư mục temp của ứng dụng (storage/temp + DB) khi: // 1) đóng tab/window (beforeunload/pagehide — sendBeacon keepalive) // 2) định kỳ 30s khi có thay đổi (phòng Tauri kill engine ngay khi close) // Load lại app → khôi phục dự án đang làm dở (getTempProject ở mount). -useEffect(()=>{const buildTempPayload=()=>{try{const schemaObj=serializeProjectToSchema(currentProjectId||'temp_project',projectName||'Dự án tạm chưa lưu',bpm,tracks,subTabs,sessionTabs,masteringSettings);const cid=window.SonicStorage&&window.SonicStorage.getClientId?window.SonicStorage.getClientId():'';return JSON.stringify({data_json:JSON.stringify(schemaObj),client_id:cid});}catch(e){return null;}};const saveTempServer=()=>{const payload=buildTempPayload();if(!payload)return;try{if(navigator.sendBeacon){// sendBeacon không đặt header JSON được — backend đọc body JSON thuần +useEffect(()=>{const buildTempPayload=()=>{try{const schemaObj=serializeProjectToSchema(currentProjectId||'temp_project',projectName||'Dự án tạm chưa lưu',bpm,tracks,subTabs,sessionTabs,masteringSettings,masterVolume);const cid=window.SonicStorage&&window.SonicStorage.getClientId?window.SonicStorage.getClientId():'';return JSON.stringify({data_json:JSON.stringify(schemaObj),client_id:cid});}catch(e){return null;}};const saveTempServer=()=>{const payload=buildTempPayload();if(!payload)return;try{if(navigator.sendBeacon){// sendBeacon không đặt header JSON được — backend đọc body JSON thuần const blob=new Blob([payload],{type:'application/json'});navigator.sendBeacon(window.API_BASE_URL+'/api/v1/projects/temp',blob);}else{fetch(window.API_BASE_URL+'/api/v1/projects/temp',{method:'POST',headers:{'Content-Type':'application/json'},body:payload,keepalive:true}).catch(()=>{});}}catch(e){/* fire-and-forget */}};const onUnload=e=>{saveTempServer();// Để sendBeacon có cơ hội gửi trước khi WebView bị destroy -try{navigator.sendBeacon&&navigator.sendBeacon(window.API_BASE_URL+'/health',new Blob(['ping'],{type:'text/plain'}));}catch(e2){}};window.addEventListener('beforeunload',onUnload);window.addEventListener('pagehide',onUnload);const interval=setInterval(saveTempServer,30*1000);return()=>{window.removeEventListener('beforeunload',onUnload);window.removeEventListener('pagehide',onUnload);clearInterval(interval);};},[currentProjectId,projectName,bpm,tracks,subTabs,sessionTabs,masteringSettings]);// ── Realtime sync giữa các client (LAN browser ↔ Tauri standalone) ── +try{navigator.sendBeacon&&navigator.sendBeacon(window.API_BASE_URL+'/health',new Blob(['ping'],{type:'text/plain'}));}catch(e2){}};window.addEventListener('beforeunload',onUnload);window.addEventListener('pagehide',onUnload);const interval=setInterval(saveTempServer,30*1000);return()=>{window.removeEventListener('beforeunload',onUnload);window.removeEventListener('pagehide',onUnload);clearInterval(interval);};},[currentProjectId,projectName,bpm,tracks,subTabs,sessionTabs,masteringSettings,masterVolume]);// ── Realtime sync giữa các client (LAN browser ↔ Tauri standalone) ── // Bug 3: 2 session cùng tài khoản không sync. Poll revision nhẹ 3s; khi // updated_at mới hơn bản đã apply + client_id KHÁC mình → tải full temp → // deserialize → apply. Skip nếu data_json giống hệt bản cuối (chống churn @@ -1203,10 +1215,10 @@ const tmp=await window.SonicAPI.getTempProject();if(!tmp||!tmp.has_temp||!tmp.da const result=deserializeProjectFromSchema(proj);if(result&&result.tracks&&result.tracks.length>0){lastAppliedJson=projStr;lastAppliedAt=rev.updated_at;setTracks(result.tracks);loadAudioBuffersForTracks(result.tracks).catch(function(err){console.warn('loadAudioBuffersForTracks (sync) error:',err);});setBpm((result.bpm||120).toString());if(result.sessionTabs&&result.sessionTabs.length>0)setSessionTabs(result.sessionTabs);if(result.subTabs&&result.subTabs.length>0)setSubTabs(result.subTabs);// Không đè masteringSettings khi user đang mở Mastering panel // (modal đang chỉnh) — bản đồng bộ từ thiết bị khác // không được revert chain đang sửa (ví dụ vừa xóa VST). -if(result.masteringSettings&&!masteringModalOpenRef.current)setMasteringSettings(result.masteringSettings);const tmpName=proj.metadata&&proj.metadata.title||'Dự án tạm';setProjectName(tmpName);localStorage.setItem('sonic_project_name',tmpName);showToast('Đã đồng bộ dự án từ thiết bị khác','info');}}catch(e){console.warn('[Sync] error:',e);}};const tick=()=>{if(stopped)return;applyRemote().finally(()=>{if(!stopped)timer=setTimeout(tick,3000);});};timer=setTimeout(tick,4000);// sau mount + restore temp +if(result.masteringSettings&&!masteringModalOpenRef.current)setMasteringSettings(result.masteringSettings);if(result.masterVolume!==undefined&&result.masterVolume!==null)setMasterVolume(result.masterVolume);const tmpName=proj.metadata&&proj.metadata.title||'Dự án tạm';setProjectName(tmpName);localStorage.setItem('sonic_project_name',tmpName);showToast('Đã đồng bộ dự án từ thiết bị khác','info');}}catch(e){console.warn('[Sync] error:',e);}};const tick=()=>{if(stopped)return;applyRemote().finally(()=>{if(!stopped)timer=setTimeout(tick,3000);});};timer=setTimeout(tick,4000);// sau mount + restore temp return()=>{stopped=true;if(timer)clearTimeout(timer);};},[]);// ── Timer-based auto-save (5 min) + backup (30 min) ── useEffect(()=>{const BACKUP_MAX_KEY='sonic_backup_max_count';if(!localStorage.getItem(BACKUP_MAX_KEY)){localStorage.setItem(BACKUP_MAX_KEY,'10');}const interval5=setInterval(()=>{if(!currentProjectId)return;// Auto-save: giống handleSaveProject -if(currentProjectId.startsWith('local_')){const finalName=projectName||'Dự án mới';const localId=currentProjectId;const schemaObj=serializeProjectToSchema(localId,finalName,bpm,tracks,subTabs,sessionTabs,masteringSettings);const dataStr=JSON.stringify(schemaObj);localStorage.setItem('sonic_local_project_data',dataStr);localStorage.setItem('sonic_project_id',localId);localStorage.setItem('sonic_project_name',finalName);}else if(currentUser&&window.SonicAPI){try{const schemaObj=serializeProjectToSchema(currentProjectId,projectName,bpm,tracks,subTabs,sessionTabs,masteringSettings);const dataJson=JSON.stringify(schemaObj);window.SonicAPI.updateCloudProject(currentProjectId,projectName||'Dự án mới',dataJson).catch(()=>{});}catch(e){console.warn('Auto-save error:',e);}}},5*60*1000);const interval30=setInterval(()=>{if(!currentProjectId||currentProjectId.startsWith('local_')||!currentUser||!window.SonicAPI)return;try{window.SonicAPI.createBackup(currentProjectId).catch(()=>{});}catch(e){console.warn('Backup error:',e);}},30*60*1000);return()=>{clearInterval(interval5);clearInterval(interval30);};},[currentProjectId,projectName,currentUser,tracks,subTabs,sessionTabs,masteringSettings,bpm]);// Lucide icons initialization +if(currentProjectId.startsWith('local_')){const finalName=projectName||'Dự án mới';const localId=currentProjectId;const schemaObj=serializeProjectToSchema(localId,finalName,bpm,tracks,subTabs,sessionTabs,masteringSettings,masterVolume);const dataStr=JSON.stringify(schemaObj);localStorage.setItem('sonic_local_project_data',dataStr);localStorage.setItem('sonic_project_id',localId);localStorage.setItem('sonic_project_name',finalName);}else if(currentUser&&window.SonicAPI){try{const schemaObj=serializeProjectToSchema(currentProjectId,projectName,bpm,tracks,subTabs,sessionTabs,masteringSettings,masterVolume);const dataJson=JSON.stringify(schemaObj);window.SonicAPI.updateCloudProject(currentProjectId,projectName||'Dự án mới',dataJson).catch(()=>{});}catch(e){console.warn('Auto-save error:',e);}}},5*60*1000);const interval30=setInterval(()=>{if(!currentProjectId||currentProjectId.startsWith('local_')||!currentUser||!window.SonicAPI)return;try{window.SonicAPI.createBackup(currentProjectId).catch(()=>{});}catch(e){console.warn('Backup error:',e);}},30*60*1000);return()=>{clearInterval(interval5);clearInterval(interval30);};},[currentProjectId,projectName,currentUser,tracks,subTabs,sessionTabs,masteringSettings,bpm]);// Lucide icons initialization useEffect(()=>{setTimeout(()=>{if(window.lucide){window.lucide.createIcons();}},50);},[activeTool,activeTab,contextMenu,activeTracks]);const timelineWrapperRef=useRef(null);const[timelineWrapperNode,setTimelineWrapperNode]=useState(null);const handleTimelineWrapperRef=useCallback(node=>{timelineWrapperRef.current=node;setTimelineWrapperNode(node);},[]);const tcpContainerRef=useRef(null);const[scrollLeft,setScrollLeft]=useState(0);const handleTimelineScroll=e=>{if(tcpContainerRef.current){tcpContainerRef.current.scrollTop=e.currentTarget.scrollTop;}setScrollLeft(e.currentTarget.scrollLeft);};const handleTCPScroll=e=>{if(timelineWrapperRef.current){timelineWrapperRef.current.scrollTop=e.currentTarget.scrollTop;}};const panelDropZoneRef=useRef(null);const startPanelDrag=(panelId,e)=>{panelDragRef.current={panelId,startX:e.clientX,startY:e.clientY};setPanelDropZone(null);setDragGhostPanel(panelId);setDragGhostPos({x:e.clientX-120,y:e.clientY-20});const onMove=ev=>{if(!panelDragRef.current||!workspaceRef.current)return;const rect=workspaceRef.current.getBoundingClientRect();const x=ev.clientX-rect.left;const y=ev.clientY-rect.top;const w=rect.width;const h=rect.height;const margin=60;let zone=null;if(x10)zone='left';else if(x>w-margin&&x10)zone='top';else if(y>h-margin&&y{if(panelDragRef.current){const pid=panelDragRef.current.panelId;const targetZone=panelDropZoneRef.current;if(targetZone&&targetZone!==panelPositions[pid]){setPanelPositions(prev=>({...prev,[pid]:targetZone}));}panelDragRef.current=null;panelDropZoneRef.current=null;setPanelDropZone(null);setDragGhostPos(null);setDragGhostPanel(null);}document.removeEventListener('mousemove',onMove);document.removeEventListener('mouseup',onUp);};document.addEventListener('mousemove',onMove);document.addEventListener('mouseup',onUp);};// ── Right Sidebar Column Resizer ── const startColResize=e=>{e.preventDefault();const startX=e.clientX;const startWidth=rightSidebarWidth;const onMove=ev=>{const deltaX=startX-ev.clientX;const newWidth=Math.max(200,Math.min(600,startWidth+deltaX));setRightSidebarWidth(newWidth);};const onUp=()=>{document.removeEventListener('mousemove',onMove);document.removeEventListener('mouseup',onUp);};document.addEventListener('mousemove',onMove);document.addEventListener('mouseup',onUp);};// ── TCP Resizer ── const startTcpResize=e=>{e.preventDefault();const startX=e.clientX;const startWidth=tcpWidth;const onMove=ev=>{const deltaX=ev.clientX-startX;const newWidth=Math.max(280,Math.min(600,startWidth+deltaX));setTcpWidth(newWidth);};const onUp=()=>{document.removeEventListener('mousemove',onMove);document.removeEventListener('mouseup',onUp);};document.addEventListener('mousemove',onMove);document.addEventListener('mouseup',onUp);};// ── Right Sidebar Row Resizer (Media Explorer / AI Panel) ── @@ -1846,7 +1858,7 @@ Object.keys(activeTrackNodesRef.current).forEach(function(k){if(k.endsWith('_sub // SonicSF (WASM fallback). const trkList=activeTracksRef.current&&activeTracksRef.current.length?activeTracksRef.current:tracks;const trk=trkList.find(x=>x.id===trackId);if(trk&&isMidiSoundTrack(trk)){try{const nt={...trk,volumeDb:val};sendMidiVolumeCC7(nt,trkList,computeTrackAudibleGain(trkList,nt)>0);}catch(e){}}};const updateTrackPan=(trackId,val)=>{const beforeSnap=captureTrackSnapshot(trackId);updateActiveTracks(prev=>prev.map(t=>t.id===trackId?{...t,pan:val}:t));setUndoStack(prev=>{const next=[...prev,{action_type:'PAN_CHANGE',track_id:trackId,timestamp:Date.now(),before_state:beforeSnap,after_state:captureTrackSnapshot(trackId)}];if(next.length>MAX_UNDO)next.shift();return next;});// Real-time update during playback const nodes=activeTrackNodesRef.current[trackId];if(nodes){nodes.pannerNode.pan.setValueAtTime(val/100,getAudioContext().currentTime);}};const updateTrackName=(trackId,name)=>{const beforeSnap=captureTrackSnapshot(trackId);setTracks(prev=>prev.map(t=>t.id===trackId?{...t,name}:t));setUndoStack(prev=>{const next=[...prev,{action_type:'RENAME',track_id:trackId,timestamp:Date.now(),before_state:beforeSnap,after_state:captureTrackSnapshot(trackId)}];if(next.length>MAX_UNDO)next.shift();return next;});};const updateTrackColor=(trackId,color)=>{const beforeSnap=captureTrackSnapshot(trackId);setTracks(prev=>prev.map(t=>t.id===trackId?{...t,color}:t));// Lưu màu NGAY (flush — không chờ debounce 2s — tránh mất màu khi reload nhanh) -try{if(window.SonicStorage){const nextTracks=(tracks||[]).map(t=>t.id===trackId?{...t,color}:t);window.SonicStorage.scheduleTempAutoSave(()=>serializeProjectToSchema(currentProjectId||'temp_project',projectName||'Dự án tạm chưa lưu',bpm,nextTracks,subTabs,sessionTabs,masteringSettings));if(window.SonicStorage.flushTempAutoSave)window.SonicStorage.flushTempAutoSave();}}catch(e){}setUndoStack(prev=>{const next=[...prev,{action_type:'RECOLOR',track_id:trackId,timestamp:Date.now(),before_state:beforeSnap,after_state:captureTrackSnapshot(trackId)}];if(next.length>MAX_UNDO)next.shift();return next;});};const updateClipName=(trackId,clipId,newName)=>{setTracks(prev=>prev.map(t=>{if(t.id!==trackId)return t;const clips=t.clips&&t.clips.length>0?t.clips:[];return{...t,clips:clips.map(c=>c.id===clipId?{...c,name:newName}:c)};}));};// ── MIDI .mid file parser ── +try{if(window.SonicStorage){const nextTracks=(tracks||[]).map(t=>t.id===trackId?{...t,color}:t);window.SonicStorage.scheduleTempAutoSave(()=>serializeProjectToSchema(currentProjectId||'temp_project',projectName||'Dự án tạm chưa lưu',bpm,nextTracks,subTabs,sessionTabs,masteringSettings,masterVolume));if(window.SonicStorage.flushTempAutoSave)window.SonicStorage.flushTempAutoSave();}}catch(e){}setUndoStack(prev=>{const next=[...prev,{action_type:'RECOLOR',track_id:trackId,timestamp:Date.now(),before_state:beforeSnap,after_state:captureTrackSnapshot(trackId)}];if(next.length>MAX_UNDO)next.shift();return next;});};const updateClipName=(trackId,clipId,newName)=>{setTracks(prev=>prev.map(t=>{if(t.id!==trackId)return t;const clips=t.clips&&t.clips.length>0?t.clips:[];return{...t,clips:clips.map(c=>c.id===clipId?{...c,name:newName}:c)};}));};// ── MIDI .mid file parser ── const parseMidiFile=arrayBuffer=>{const data=new Uint8Array(arrayBuffer);if(data.length<14)return null;var pos=0;var read32=function(){var v=data[pos]<<24|data[pos+1]<<16|data[pos+2]<<8|data[pos+3];pos+=4;return v;};var read16=function(){var v=data[pos]<<8|data[pos+1];pos+=2;return v;};var readVLQ=function(){var v=0,b;do{b=data[pos++];v=v<<7|b&0x7f;}while(b&0x80);return v;};var header=String.fromCharCode(data[0],data[1],data[2],data[3]);if(header!=='MThd')return null;pos=8;var fmt=read16();var numTracks=read16();var division=read16();var ticksPerBeat=division&0x8000?480:division||480;var bpm=120;var result=[];for(var t=0;tdata.length)break;var trkId=String.fromCharCode(data[pos],data[pos+1],data[pos+2],data[pos+3]);pos+=4;var trkLen=read32();var endPos=Math.min(pos+trkLen,data.length);if(trkId!=='MTrk'){pos=endPos;continue;}var absTicks=0;var runningStatus=0;var trackName='MIDI Track '+(t+1);var midiNotes=[];var pendingNotes={};var maxAbsTick=0;while(pos=0x80){if(status<0xf0){runningStatus=status;}pos++;}else{status=runningStatus;}var cmd=status>>4;if(cmd===0x9||cmd===0x8){var chan=status&0x0F;var pitch=data[pos++];var vel=pos0){pendingNotes[noteKey]={tick:absTicks,vel:vel};if(absTicks>maxAbsTick)maxAbsTick=absTicks;}else{var pn=pendingNotes[noteKey];if(pn){var durTicks=absTicks-pn.tick;if(durTicks<=0)durTicks=240;midiNotes.push({id:'mn_'+t+'_'+pitch+'_'+pn.tick,pitch:pitch,start_beat:pn.tick/ticksPerBeat,duration_beats:durTicks/ticksPerBeat,velocity:Math.min(1,pn.vel/127)});delete pendingNotes[noteKey];}}}else if(status>=0xc0&&status<0xe0){if(pos=0xe0&&status<0xf0){if(pos+2<=endPos)pos+=2;}else if(status>=0xa0&&status<0xc0){if(pos+2<=endPos)pos+=2;}else if(status>=0xf0&&status<0xf8){if(pos=endPos)break;var metaType=data[pos++];var metaLen=readVLQ();if(metaType===0x03){try{trackName=String.fromCharCode.apply(null,Array.from(data.subarray(pos,pos+metaLen)));}catch(e){}}else if(metaType===0x51&&pos+3<=endPos){bpm=Math.round(60000000/(data[pos]<<16|data[pos+1]<<8|data[pos+2]));}pos+=Math.min(metaLen,endPos-pos);}else{if(pos+2<=endPos)pos+=2;}}catch(e){pos=endPos;}}Object.keys(pendingNotes).forEach(function(k){var pn=pendingNotes[k];var parts=k.split('_');var p=parseInt(parts[1]);var dur=Math.max(240,maxAbsTick-pn.tick);midiNotes.push({id:'mn_'+t+'_'+p+'_'+pn.tick,pitch:p,start_beat:pn.tick/ticksPerBeat,duration_beats:dur/ticksPerBeat,velocity:Math.min(1,pn.vel/127)});});if(midiNotes.length>0){var lastEnd=0;var maxEndBeat=0;midiNotes.forEach(function(n){var e=(n.start_beat+n.duration_beats)*60/bpm;if(e>lastEnd)lastEnd=e;var eb=n.start_beat+n.duration_beats;if(eb>maxEndBeat)maxEndBeat=eb;});result.push({name:trackName,notes:midiNotes,duration:lastEnd||4,startTime:0,id:'midi_'+t+'_'+Date.now(),totalBeats:maxEndBeat||16,bars:Math.max(1,Math.ceil((maxEndBeat||16)/4)),bpm:bpm,ticksPerBeat:ticksPerBeat});}pos=endPos;}return result.length>0?result:null;};window.parseMidiFile=parseMidiFile;// ── Load File on Track (with server upload) ── // ── Resolve Media Explorer drag file → real File (for timeline drop) ── const resolveMediaExplorerDropFile=async()=>{const mef=window.__mediaExplorerDragFile;if(!mef)return null;try{if(mef.handle&&typeof mef.handle.getFile==='function'){const f=await mef.handle.getFile();return new File([f],f.name||mef.name,{type:f.type||'application/octet-stream'});}if(mef.file_id||mef.fileId){const fid=mef.file_id||mef.fileId;const resp=await fetch(`${API_BASE_URL}/api/v1/audio/download/${fid}`);const blob=await resp.blob();return new File([blob],mef.name||mef.original_name||fid,{type:blob.type||'audio/wav'});}if(mef.path){const resp=await fetch(`${API_BASE_URL}/api/v1/media/file?path=${encodeURIComponent(mef.path)}`);const blob=await resp.blob();return new File([blob],mef.name||mef.path.split(/[\\/]/).pop(),{type:blob.type||'application/octet-stream'});}// Media Library samples: only metadata (name/kind) — real bytes served @@ -1908,15 +1920,15 @@ stopAllPlayback();try{if(window.SonicSF&&window.SonicSF.stopAllNotes)window.Soni await new Promise(res=>setTimeout(res,Math.ceil(durationLimit*1000)+900));stopAllPlayback();try{if(window.SonicSF&&window.SonicSF.stopAllNotes)window.SonicSF.stopAllNotes();}catch(e){}try{script.disconnect();}catch(e){}try{masterBus.output.disconnect(script);}catch(e){}// Encode interleaved PCM chunks → WAV const totalFrames=chunks.reduce((a,c)=>a+c.length/2,0);const stereoBuf=new Float32Array(totalFrames*2);let off=0;chunks.forEach(c=>{stereoBuf.set(c,off);off+=c.length;});const frames=totalFrames;const bytesPerSample=isFloatBit?4:bitDepth/8;const headerSize=44;const fileSizeBytes=headerSize+frames*bytesPerSample*outChannels;const view=new DataView(new ArrayBuffer(fileSizeBytes));const writeString=(o,s)=>{for(let i=0;i>8&0xFF);view.setUint8(o+2,v>>16&0xFF);}else if(bitDepth===16)view.setInt16(o,Math.floor(s<0?s*0x8000:s*0x7FFF),true);else view.setUint8(o,Math.floor((s+1)*127.5),true);}o+=bytesPerSample;}}const blob=new Blob([view],{type:'audio/wav'});const url=URL.createObjectURL(blob);const a=document.createElement('a');a.href=url;a.download=`sonicforge-bounce-${captureRate}hz-${bitDepth}bit.wav`;a.click();URL.revokeObjectURL(url);showToast("Bounce hoàn tất — file gồm MIDI + FX Rack + Mastering Chain!","success");}catch(err){showToast("Lỗi bounce: "+err.message,"error");}finally{setIsExporting(false);}};const handleSaveLocalProject=name=>{const finalName=name||projectName||'Dự án mới';const localId=currentProjectId&¤tProjectId.startsWith('local_')?currentProjectId:'local_'+Date.now();const projectSchemaObj=serializeProjectToSchema(localId,finalName,bpm,tracks,subTabs,sessionTabs,masteringSettings);const dataStr=JSON.stringify(projectSchemaObj);localStorage.setItem('sonic_local_project_data',dataStr);localStorage.setItem('sonic_project_id',localId);localStorage.setItem('sonic_project_name',finalName);setCurrentProjectId(localId);setProjectName(finalName);window.SonicStorage.exportProjectToSFS(projectSchemaObj);showToast(`Đã lưu dự án local "${finalName}" thành công!`,"success");// Đã đăng nhập → đồng bộ lên Cloud (fire-and-forget): project mở được từ +const s=Math.max(-1,Math.min(1,tpdfDither(raw)));if(bitDepth===24){const v=Math.floor(s<0?s*0x800000:s*0x7FFFFF)&0xFFFFFF;view.setUint8(o,v&0xFF);view.setUint8(o+1,v>>8&0xFF);view.setUint8(o+2,v>>16&0xFF);}else if(bitDepth===16)view.setInt16(o,Math.floor(s<0?s*0x8000:s*0x7FFF),true);else view.setUint8(o,Math.floor((s+1)*127.5),true);}o+=bytesPerSample;}}const blob=new Blob([view],{type:'audio/wav'});const url=URL.createObjectURL(blob);const a=document.createElement('a');a.href=url;a.download=`sonicforge-bounce-${captureRate}hz-${bitDepth}bit.wav`;a.click();URL.revokeObjectURL(url);showToast("Bounce hoàn tất — file gồm MIDI + FX Rack + Mastering Chain!","success");}catch(err){showToast("Lỗi bounce: "+err.message,"error");}finally{setIsExporting(false);}};const handleSaveLocalProject=name=>{const finalName=name||projectName||'Dự án mới';const localId=currentProjectId&¤tProjectId.startsWith('local_')?currentProjectId:'local_'+Date.now();const projectSchemaObj=serializeProjectToSchema(localId,finalName,bpm,tracks,subTabs,sessionTabs,masteringSettings,masterVolume);const dataStr=JSON.stringify(projectSchemaObj);localStorage.setItem('sonic_local_project_data',dataStr);localStorage.setItem('sonic_project_id',localId);localStorage.setItem('sonic_project_name',finalName);setCurrentProjectId(localId);setProjectName(finalName);window.SonicStorage.exportProjectToSFS(projectSchemaObj);showToast(`Đã lưu dự án local "${finalName}" thành công!`,"success");// Đã đăng nhập → đồng bộ lên Cloud (fire-and-forget): project mở được từ // máy khác / browser ẩn danh khi đăng nhập cùng tài khoản. -if(currentUser&&window.SonicAPI&&window.SonicAPI.saveCloudProject){window.SonicAPI.saveCloudProject(finalName,dataStr).then(function(res){if(res&&res.project_id){console.log('[Cloud] local project synced:',res.project_id);}}).catch(function(e){console.warn('Cloud sync local project failed:',e);});}};const handleSaveCloudProject=async(name,existingProjectId)=>{const finalName=name||projectName||'Dự án mới';var useProjectId=existingProjectId||currentProjectId;const projectSchemaObj=serializeProjectToSchema(useProjectId||'project_'+Date.now(),finalName,bpm,tracks,subTabs,sessionTabs,masteringSettings);// Diagnostic: count source vs serialized items +if(currentUser&&window.SonicAPI&&window.SonicAPI.saveCloudProject){window.SonicAPI.saveCloudProject(finalName,dataStr).then(function(res){if(res&&res.project_id){console.log('[Cloud] local project synced:',res.project_id);}}).catch(function(e){console.warn('Cloud sync local project failed:',e);});}};const handleSaveCloudProject=async(name,existingProjectId)=>{const finalName=name||projectName||'Dự án mới';var useProjectId=existingProjectId||currentProjectId;const projectSchemaObj=serializeProjectToSchema(useProjectId||'project_'+Date.now(),finalName,bpm,tracks,subTabs,sessionTabs,masteringSettings,masterVolume);// Diagnostic: count source vs serialized items var srcMidi=0,srcClip=0,srcSec=0;tracks.forEach(function(t){srcMidi+=(t.midiItems||[]).length;srcClip+=(t.clips||[]).length;srcSec+=(t.sections||[]).length;});var serItems=0;if(projectSchemaObj.main_session&&projectSchemaObj.main_session.tracks){projectSchemaObj.main_session.tracks.forEach(function(st){if(st.items)serItems+=st.items.length;});}Object.keys(projectSchemaObj.section_store||{}).forEach(function(sk){(projectSchemaObj.section_store[sk].tracks||[]).forEach(function(st){if(st.items)serItems+=st.items.length;});});const dataJson=JSON.stringify(projectSchemaObj);try{if(existingProjectId){await window.SonicAPI.updateCloudProject(existingProjectId,finalName,dataJson);setProjectName(finalName);setCurrentProjectId(existingProjectId);localStorage.setItem('sonic_project_name',finalName);localStorage.setItem('sonic_project_id',existingProjectId);showToast('Đã ghi đè Cloud "'+finalName+'" (src midi='+srcMidi+' clip='+srcClip+' sec='+srcSec+' | ser='+serItems+').','success');}else if(currentProjectId&&!currentProjectId.startsWith('local_')){await window.SonicAPI.updateCloudProject(currentProjectId,finalName,dataJson);setProjectName(finalName);localStorage.setItem('sonic_project_name',finalName);localStorage.setItem('sonic_project_id',currentProjectId);showToast('Đã lưu Cloud "'+finalName+'" (src midi='+srcMidi+' clip='+srcClip+' sec='+srcSec+' | ser='+serItems+' id='+currentProjectId+').',serItems===0?'warning':'success');}else{const res=await window.SonicAPI.saveCloudProject(finalName,dataJson);const newProjId=res.project_id;setProjectName(finalName);localStorage.setItem('sonic_project_name',finalName);if(newProjId){setCurrentProjectId(newProjId);localStorage.setItem('sonic_project_id',newProjId);}showToast('Đã lưu Cloud mới "'+finalName+'" (src midi='+srcMidi+' clip='+srcClip+' sec='+srcSec+' | ser='+serItems+').',serItems===0?'warning':'success');}}catch(err){showToast(err.message||"Lỗi lưu dự án lên Cloud","error");}};const handleSaveProject=async()=>{if(!currentProjectId){setSaveProjectModalOpen(true);return;}if(currentProjectId.startsWith('local_')){handleSaveLocalProject(projectName);}else{if(!currentUser){showToast('Cần đăng nhập để lưu Cloud. currentUser='+(currentUser?'OK':'NULL')+' token='+(localStorage.getItem('sonic_token')?'exists':'missing'),'warning');return;}handleSaveCloudProject(projectName);}};const handleSaveProjectRef=useRef(handleSaveProject);handleSaveProjectRef.current=handleSaveProject;// ── Ctrl-S (Save) toàn cục ── // Desktop: lưu project ra THƯ MỤC CỦA HỆ ĐIỀU HÀNH (Documents/SonicForgeDAW/ // Projects). Docker/headless: lưu lên Cloud (đã login) hoặc local (.sfs). -const handleGlobalSave=async()=>{try{const finalName=projectName||'Dự án mới';const schemaObj=serializeProjectToSchema(currentProjectId||'proj_'+Date.now(),finalName,bpm,tracks,subTabs,sessionTabs,masteringSettings);const dataJson=JSON.stringify(schemaObj);const runtime=window.SonicRuntime&&window.SonicRuntime.capabilities&&window.SonicRuntime.capabilities.runtime||'';if(runtime==='desktop'&&window.SonicAPI&&window.SonicAPI.saveProjectToDisk){// Desktop → thư mục của hệ điều hành +const handleGlobalSave=async()=>{try{const finalName=projectName||'Dự án mới';const schemaObj=serializeProjectToSchema(currentProjectId||'proj_'+Date.now(),finalName,bpm,tracks,subTabs,sessionTabs,masteringSettings,masterVolume);const dataJson=JSON.stringify(schemaObj);const runtime=window.SonicRuntime&&window.SonicRuntime.capabilities&&window.SonicRuntime.capabilities.runtime||'';if(runtime==='desktop'&&window.SonicAPI&&window.SonicAPI.saveProjectToDisk){// Desktop → thư mục của hệ điều hành const res=await window.SonicAPI.saveProjectToDisk(finalName,dataJson);showToast('Đã lưu dự án: '+(res&&res.path||finalName),'success');}else if(window.SonicAPI){// Docker / headless → Cloud (nếu đã đăng nhập), ngược lại local -if(currentProjectId&&!currentProjectId.startsWith('local_')&¤tUser){await window.SonicAPI.updateCloudProject(currentProjectId,finalName,dataJson);showToast('Đã lưu dự án lên Cloud','success');}else if(currentUser){await handleSaveAsCloud(finalName);}else{handleSaveLocalProject(finalName);}}}catch(err){showToast('Lỗi lưu dự án: '+(err.message||err),'error');}};const handleGlobalSaveRef=useRef(handleGlobalSave);handleGlobalSaveRef.current=handleGlobalSave;useEffect(()=>{const handler=e=>{if((e.ctrlKey||e.metaKey)&&e.key.toLowerCase()==='s'){const target=e.target;if(target&&(target.tagName==='INPUT'||target.tagName==='TEXTAREA'||target.isContentEditable))return;e.preventDefault();handleGlobalSaveRef.current();}};window.addEventListener('keydown',handler);return()=>window.removeEventListener('keydown',handler);},[]);const handleSaveAsCloud=async newName=>{const projectSchemaObj=serializeProjectToSchema('project_'+Date.now(),newName,bpm,tracks,subTabs,sessionTabs,masteringSettings);const dataJson=JSON.stringify(projectSchemaObj);try{const res=await window.SonicAPI.saveCloudProject(newName,dataJson);const newProjId=res.project_id;setProjectName(newName);localStorage.setItem('sonic_project_name',newName);if(newProjId){setCurrentProjectId(newProjId);localStorage.setItem('sonic_project_id',newProjId);}showToast(`Đã lưu dự án dưới tên mới "${newName}" lên server!`,"success");}catch(err){showToast(err.message||"Lỗi Save As lên server","error");}};const handleSaveCloud=handleSaveProject;const handleExportSFS=(customName=null)=>{const finalName=customName||projectName||'Dự án SonicForge';const projectSchemaObj=serializeProjectToSchema(currentProjectId||'proj_'+Date.now(),finalName,bpm,tracks,subTabs,sessionTabs,masteringSettings);window.SonicStorage.exportProjectToSFS(projectSchemaObj);showToast("Đã xuất dự án (.sfs) thành công!","success");};const handleImportSFS=()=>{const input=document.createElement('input');input.type='file';input.accept='.sfs,application/json';input.onchange=async e=>{if(!e.target.files[0])return;try{const proj=await window.SonicStorage.importProjectFromSFSFile(e.target.files[0]);let restored=[];let restoredBpm=bpm;let restoredSessionTabs=[];let restoredSubTabs=[];if(proj.main_session){const result=deserializeProjectFromSchema(proj);restored=result.tracks;restoredBpm=result.bpm;restoredSessionTabs=result.sessionTabs;restoredSubTabs=result.subTabs;if(result.masteringSettings)setMasteringSettings(result.masteringSettings);}else{restored=(proj.tracks||[]).map(t=>({...t,buffer:null,channelInfo:t.channelInfo||null,clips:t.clips||[],serverFileId:t.serverFileId||null}));}if(restored.length>0){setTracks(restored);loadAudioBuffersForTracks(restored);setBpm(restoredBpm.toString());setProjectName(proj.name||'Dự án mới');setCurrentProjectId(null);if(restoredSessionTabs.length>0)setSessionTabs(restoredSessionTabs);if(restoredSubTabs.length>0)setSubTabs(restoredSubTabs);localStorage.setItem('sonic_project_name',proj.name||'Dự án mới');localStorage.removeItem('sonic_project_id');showToast(`Đã nạp dự án "${proj.name||'Dự án mới'}" từ tệp .sfs thành công!`,"success");}}catch(err){showToast(err.message||"Lỗi mở tệp .sfs","error");}};input.click();};const clientSideExport=async activeTracks=>{setIsExporting(true);showToast("Đang trộn âm thanh đa kênh (Offline Mixdown)...","info");try{const targetRate=parseInt(exportSettings.sampleRate);const bitDepth=parseInt(exportSettings.bitDepth);// MAIN SESSION end time (items trên track main — sections theo bounds) — +if(currentProjectId&&!currentProjectId.startsWith('local_')&¤tUser){await window.SonicAPI.updateCloudProject(currentProjectId,finalName,dataJson);showToast('Đã lưu dự án lên Cloud','success');}else if(currentUser){await handleSaveAsCloud(finalName);}else{handleSaveLocalProject(finalName);}}}catch(err){showToast('Lỗi lưu dự án: '+(err.message||err),'error');}};const handleGlobalSaveRef=useRef(handleGlobalSave);handleGlobalSaveRef.current=handleGlobalSave;useEffect(()=>{const handler=e=>{if((e.ctrlKey||e.metaKey)&&e.key.toLowerCase()==='s'){const target=e.target;if(target&&(target.tagName==='INPUT'||target.tagName==='TEXTAREA'||target.isContentEditable))return;e.preventDefault();handleGlobalSaveRef.current();}};window.addEventListener('keydown',handler);return()=>window.removeEventListener('keydown',handler);},[]);const handleSaveAsCloud=async newName=>{const projectSchemaObj=serializeProjectToSchema('project_'+Date.now(),newName,bpm,tracks,subTabs,sessionTabs,masteringSettings,masterVolume);const dataJson=JSON.stringify(projectSchemaObj);try{const res=await window.SonicAPI.saveCloudProject(newName,dataJson);const newProjId=res.project_id;setProjectName(newName);localStorage.setItem('sonic_project_name',newName);if(newProjId){setCurrentProjectId(newProjId);localStorage.setItem('sonic_project_id',newProjId);}showToast(`Đã lưu dự án dưới tên mới "${newName}" lên server!`,"success");}catch(err){showToast(err.message||"Lỗi Save As lên server","error");}};const handleSaveCloud=handleSaveProject;const handleExportSFS=(customName=null)=>{const finalName=customName||projectName||'Dự án SonicForge';const projectSchemaObj=serializeProjectToSchema(currentProjectId||'proj_'+Date.now(),finalName,bpm,tracks,subTabs,sessionTabs,masteringSettings,masterVolume);window.SonicStorage.exportProjectToSFS(projectSchemaObj);showToast("Đã xuất dự án (.sfs) thành công!","success");};const handleImportSFS=()=>{const input=document.createElement('input');input.type='file';input.accept='.sfs,application/json';input.onchange=async e=>{if(!e.target.files[0])return;try{const proj=await window.SonicStorage.importProjectFromSFSFile(e.target.files[0]);let restored=[];let restoredBpm=bpm;let restoredSessionTabs=[];let restoredSubTabs=[];if(proj.main_session){const result=deserializeProjectFromSchema(proj);restored=result.tracks;restoredBpm=result.bpm;restoredSessionTabs=result.sessionTabs;restoredSubTabs=result.subTabs;if(result.masteringSettings)setMasteringSettings(result.masteringSettings);if(result.masterVolume!==undefined&&result.masterVolume!==null)setMasterVolume(result.masterVolume);}else{restored=(proj.tracks||[]).map(t=>({...t,buffer:null,channelInfo:t.channelInfo||null,clips:t.clips||[],serverFileId:t.serverFileId||null}));}if(restored.length>0){setTracks(restored);loadAudioBuffersForTracks(restored);setBpm(restoredBpm.toString());setProjectName(proj.name||'Dự án mới');setCurrentProjectId(null);if(restoredSessionTabs.length>0)setSessionTabs(restoredSessionTabs);if(restoredSubTabs.length>0)setSubTabs(restoredSubTabs);localStorage.setItem('sonic_project_name',proj.name||'Dự án mới');localStorage.removeItem('sonic_project_id');showToast(`Đã nạp dự án "${proj.name||'Dự án mới'}" từ tệp .sfs thành công!`,"success");}}catch(err){showToast(err.message||"Lỗi mở tệp .sfs","error");}};input.click();};const clientSideExport=async activeTracks=>{setIsExporting(true);showToast("Đang trộn âm thanh đa kênh (Offline Mixdown)...","info");try{const targetRate=parseInt(exportSettings.sampleRate);const bitDepth=parseInt(exportSettings.bitDepth);// MAIN SESSION end time (items trên track main — sections theo bounds) — // offline render không cắt sớm; MIDI cache (preview) giữ max với cache. let durationLimit=Math.max(0.1,computeMainSessionEndTime(activeTracks));// Include preview-captured MIDI cache length (soundfont tracks have no clips) Object.keys(midiCacheRef.current).forEach(id=>{const c=midiCacheRef.current[id];if(c&&c.duration>durationLimit)durationLimit=c.duration;});const outChannels=exportSettings.channels==='mono'?1:2;const offlineCtx=new OfflineAudioContext(outChannels,Math.ceil(targetRate*Math.max(0.1,durationLimit)),targetRate);// Build the FULL graph (per-track FX Rack chains + mastering chain — the @@ -2067,7 +2079,7 @@ if(audioPeak<0.05)audioPeak=0;const peak=Math.max(audioPeak,midiPeak);const db=p // track 2 section không item vẫn nhảy). try{const _vf=window.__vuFrame=(window.__vuFrame||0)+1;if(_vf%45===0){console.log('[VU]',trackId,'audio=',audioPeak.toFixed(3),'midi=',midiPeak.toFixed(3),'key=',key,'peak=',Math.max(audioPeak,midiPeak).toFixed(3));}}catch(e){}if(peak>0.001){if(key.endsWith('_mixer')){drawMixerVuMeter(canvas,peak);}else{drawVuMeter(canvas,db);}}else{if(key.endsWith('_mixer')){drawMixerVuMeter(canvas,0);}else{drawVuMeter(canvas,-60);}}});}catch(e){console.warn('VU tick error:',e);}masterVUAnimRef.current=requestAnimationFrame(tick);}masterVUAnimRef.current=requestAnimationFrame(tick);return()=>{if(masterVUAnimRef.current)cancelAnimationFrame(masterVUAnimRef.current);};},[isPlaying]);const handleOpenProject=async(projectId,projectName)=>{setAppWarningModal({title:"Mở dự án",message:"Bạn có muốn mở dự án này? Các thay đổi chưa lưu trên workspace hiện tại sẽ bị mất.",isAlert:false,onConfirm:async()=>{try{const proj=await window.SonicAPI.getCloudProject(projectId);const parsed=JSON.parse(proj.data_json);let restoredTracks=[];let restoredBpm=bpm;let restoredSessionTabs=[];let restoredSubTabs=[];if(parsed.main_session){const result=deserializeProjectFromSchema(parsed);restoredTracks=result.tracks;restoredBpm=result.bpm;restoredSessionTabs=result.sessionTabs;restoredSubTabs=result.subTabs;// Bỏ qua zoom ≤ 1 (data cũ lưu 1.0 — lỗi __currentZoom của Media // Explorer) — áp dụng mới giữ zoom hiện tại/localStorage. -if(result.zoom>1&&setZoom)setZoom(result.zoom);if(result.masteringSettings)setMasteringSettings(result.masteringSettings);}else{restoredTracks=(parsed.tracks||[]).map(function(t){const rest=Object.assign({},t);delete rest.height;return Object.assign({},rest,{buffer:null,channelInfo:t.channelInfo||null,clips:t.clips||[],serverFileId:t.serverFileId||null});});}setTracks(restoredTracks);loadAudioBuffersForTracks(restoredTracks).catch(function(err){console.warn('loadAudioBuffersForTracks error:',err);});trackMidiChannelsRef.current={};preloadTrackInstruments(restoredTracks).catch(function(err){console.warn('preloadTrackInstruments error:',err);});setBpm(restoredBpm.toString());setSelectedTrackId(restoredTracks[0]?.id||'1');setProjectName(proj.name);setCurrentProjectId(proj.id);if(restoredSessionTabs.length>0)setSessionTabs(restoredSessionTabs);if(restoredSubTabs.length>0)setSubTabs(restoredSubTabs);localStorage.setItem('sonic_project_name',proj.name);localStorage.setItem('sonic_project_id',proj.id);showToast('Đã nạp dự án "'+proj.name+'" thành công!',"success");}catch(e){showToast(e.message||"Lỗi khi nạp dự án","error");}}});};return/*#__PURE__*/React.createElement(React.Fragment,null,/*#__PURE__*/React.createElement("div",{className:"h-full w-full flex flex-col bg-[#1e1e1e]"},/*#__PURE__*/React.createElement("header",{className:"h-9 bg-[#2e2e2e] border-b border-[#181818] flex items-center px-1 shrink-0 select-none"},[{label:'File',items:[{label:'New Project',icon:'file-plus',shortcut:'Ctrl+N',action:()=>{// New project: đóng hết tab + reset MỌI trạng thái về mặc định +if(result.zoom>1&&setZoom)setZoom(result.zoom);if(result.masteringSettings)setMasteringSettings(result.masteringSettings);if(result.masterVolume!==undefined&&result.masterVolume!==null)setMasterVolume(result.masterVolume);}else{restoredTracks=(parsed.tracks||[]).map(function(t){const rest=Object.assign({},t);delete rest.height;return Object.assign({},rest,{buffer:null,channelInfo:t.channelInfo||null,clips:t.clips||[],serverFileId:t.serverFileId||null});});}setTracks(restoredTracks);loadAudioBuffersForTracks(restoredTracks).catch(function(err){console.warn('loadAudioBuffersForTracks error:',err);});trackMidiChannelsRef.current={};preloadTrackInstruments(restoredTracks).catch(function(err){console.warn('preloadTrackInstruments error:',err);});setBpm(restoredBpm.toString());setSelectedTrackId(restoredTracks[0]?.id||'1');setProjectName(proj.name);setCurrentProjectId(proj.id);if(restoredSessionTabs.length>0)setSessionTabs(restoredSessionTabs);if(restoredSubTabs.length>0)setSubTabs(restoredSubTabs);localStorage.setItem('sonic_project_name',proj.name);localStorage.setItem('sonic_project_id',proj.id);showToast('Đã nạp dự án "'+proj.name+'" thành công!',"success");}catch(e){showToast(e.message||"Lỗi khi nạp dự án","error");}}});};return/*#__PURE__*/React.createElement(React.Fragment,null,/*#__PURE__*/React.createElement("div",{className:"h-full w-full flex flex-col bg-[#1e1e1e]"},/*#__PURE__*/React.createElement("header",{className:"h-9 bg-[#2e2e2e] border-b border-[#181818] flex items-center px-1 shrink-0 select-none"},[{label:'File',items:[{label:'New Project',icon:'file-plus',shortcut:'Ctrl+N',action:()=>{// New project: đóng hết tab + reset MỌI trạng thái về mặc định try{stopAllPlayback();}catch(e){}setSubTabs([]);setSessionTabs([]);setActiveTab('main');// Reset instrument/channel/route context đã load trackMidiChannelsRef.current={};Object.keys(trackMidiBypassMap).forEach(function(k){delete trackMidiBypassMap[k];});Object.keys(trackAudioBypassMap).forEach(function(k){delete trackAudioBypassMap[k];});Object.keys(trackMasteringBypassMap).forEach(function(k){delete trackMasteringBypassMap[k];});setSelectedItemIds(new Set());setTracks([{id:'1',name:'Track 01',buffer:null,startTime:0,volumeDb:0,pan:0,muted:false,solo:false,color:'#0f766e',markers:[],serverFileId:null,clips:[],sections:[],midiItems:[]},{id:'2',name:'Track 02',buffer:null,startTime:0,volumeDb:0,pan:0,muted:false,solo:false,color:'#1d4ed8',markers:[],serverFileId:null,clips:[],sections:[],midiItems:[]}]);setSelectedTrackId('1');setProjectName('');setCurrentProjectId(null);localStorage.removeItem('sonic_project_name');localStorage.removeItem('sonic_project_id');showToast('New project created','info');}},{label:'Open Project...',icon:'folder-open',shortcut:'Ctrl+O',action:()=>setOpenProjectModalOpen(true)},{label:'Save Project',icon:'upload-cloud',shortcut:'Ctrl+S',action:()=>{// Save project + save TẤT CẢ dirty sub-tabs (user 07:35 — nhấn lưu ở // MAIN phải lưu cả piano roll/audio tab đã sửa) @@ -2091,14 +2103,14 @@ if(aiPromptMgrRef.current&&window.__aiPresetVersion!==aiPresetVersion){window.__ // (quét 8 bars hiển thị "0 đến 8"): nhập 8 → selection tới vạch 8. setSelectionEnd(t);setNumberBar(Math.max(0,b-beginBar));},className:"w-full bg-[#242424] text-white text-center font-mono text-xs rounded py-0.5 border border-zinc-700 focus:outline-none"})),/*#__PURE__*/React.createElement("div",{className:"flex flex-col justify-center"},/*#__PURE__*/React.createElement("span",{className:"text-[7px] text-zinc-500 font-bold uppercase"},"# Bars"),/*#__PURE__*/React.createElement("span",{className:"text-zinc-200 font-mono text-xs font-semibold mt-0.5"},numberBar))));if(panelId==='fx_rack')return/*#__PURE__*/React.createElement("div",{className:"flex flex-col h-full gap-1.5"},/*#__PURE__*/React.createElement("div",{className:"flex items-center justify-between shrink-0 cursor-grab active:cursor-grabbing select-none",onMouseDown:e=>startPanelDrag('fx_rack',e)},/*#__PURE__*/React.createElement("h3",{className:"font-bold text-xs text-rose-300 flex items-center gap-1"},/*#__PURE__*/React.createElement("span",{className:"inline-flex items-center shrink-0"},/*#__PURE__*/React.createElement("i",{"data-lucide":"grip-vertical",className:"w-3 h-3 text-zinc-500"})),/*#__PURE__*/React.createElement("span",{className:"inline-flex items-center shrink-0"},/*#__PURE__*/React.createElement("i",{"data-lucide":"sliders",className:"w-3.5 h-3.5 text-rose-400"}))," Plugin FX Rack"),/*#__PURE__*/React.createElement("button",{onClick:()=>closePanel('fx_rack'),className:"text-zinc-600 hover:text-zinc-300"},/*#__PURE__*/React.createElement("span",{className:"inline-flex items-center shrink-0"},/*#__PURE__*/React.createElement("i",{"data-lucide":"x",className:"w-3 h-3"})))),/*#__PURE__*/React.createElement("div",{className:"flex-1 text-xs text-zinc-500 italic flex items-center justify-center"},"No FX plugins loaded"));if(panelId==='midi_events')return/*#__PURE__*/React.createElement("div",{className:"flex flex-col h-full gap-1.5"},/*#__PURE__*/React.createElement("div",{className:"flex items-center justify-between shrink-0 cursor-grab active:cursor-grabbing select-none",onMouseDown:e=>startPanelDrag('midi_events',e)},/*#__PURE__*/React.createElement("h3",{className:"font-bold text-xs text-sky-300 flex items-center gap-1"},/*#__PURE__*/React.createElement("span",{className:"inline-flex items-center shrink-0"},/*#__PURE__*/React.createElement("i",{"data-lucide":"grip-vertical",className:"w-3 h-3 text-zinc-500"})),/*#__PURE__*/React.createElement("span",{className:"inline-flex items-center shrink-0"},/*#__PURE__*/React.createElement("i",{"data-lucide":"music",className:"w-3.5 h-3.5 text-sky-400"}))," MIDI Event List"),/*#__PURE__*/React.createElement("button",{onClick:()=>closePanel('midi_events'),className:"text-zinc-600 hover:text-zinc-300"},/*#__PURE__*/React.createElement("span",{className:"inline-flex items-center shrink-0"},/*#__PURE__*/React.createElement("i",{"data-lucide":"x",className:"w-3 h-3"})))),/*#__PURE__*/React.createElement("div",{className:"flex-1 text-xs text-zinc-500 italic flex items-center justify-center"},"No MIDI events selected"));return null;};const renderDock=(pos,title)=>{const panels=dockPanels[pos];if(panels.length===0)return null;const isSide=pos==='left'||pos==='right';const borderClass=pos==='left'?'border-r':pos==='right'?'border-l':pos==='top'?'border-b':'border-t';const bgClass='bg-[#1e1e1e]';const highlight=panelDragRef.current&&panelDropZone===pos;if(pos==='right')return/*#__PURE__*/React.createElement("div",{id:"right-sidebar",className:`${borderClass} ${bgClass} flex flex-col overflow-hidden select-none h-full`,style:{width:`${rightSidebarWidth}px`,minWidth:'200px',maxWidth:'600px',flexShrink:0}},/*#__PURE__*/React.createElement("div",{className:"flex-1 flex flex-col gap-2 p-2 overflow-hidden h-full"},panels.map((p,idx)=>/*#__PURE__*/React.createElement(React.Fragment,{key:p},/*#__PURE__*/React.createElement("div",{className:'flex flex-col flex-1 min-h-0 border border-zinc-700 rounded-lg bg-[#262626] shadow-sm p-3'},renderPanelContent(p)),idx/*#__PURE__*/React.createElement("div",{key:p,className:`${isSide?'w-full':'flex-none w-[320px]'} border border-zinc-700 rounded-lg bg-[#262626] shadow-sm p-2`},renderPanelContent(p))));};return/*#__PURE__*/React.createElement("div",{ref:workspaceRef,className:"flex-1 flex flex-col overflow-hidden select-none daw-bg relative"},panelDragRef.current&&panelDropZone&&/*#__PURE__*/React.createElement("div",{className:"absolute inset-0 z-50 pointer-events-none"},panelDropZone==='top'&&/*#__PURE__*/React.createElement("div",{className:"absolute top-0 left-0 right-0 h-1 bg-cyan-400 shadow-[0_0_8px_#06b6d4]"}),panelDropZone==='bottom'&&/*#__PURE__*/React.createElement("div",{className:"absolute bottom-0 left-0 right-0 h-1 bg-cyan-400 shadow-[0_0_8px_#06b6d4]"}),panelDropZone==='left'&&/*#__PURE__*/React.createElement("div",{className:"absolute top-0 bottom-0 left-0 w-1 bg-cyan-400 shadow-[0_0_8px_#06b6d4]"}),panelDropZone==='right'&&/*#__PURE__*/React.createElement("div",{className:"absolute top-0 bottom-0 right-0 w-1 bg-cyan-400 shadow-[0_0_8px_#06b6d4]"})),dragGhostPanel&&dragGhostPos&&/*#__PURE__*/React.createElement("div",{className:"fixed z-[100] pointer-events-none opacity-80 border border-cyan-500 rounded-lg bg-[#262626] shadow-2xl p-3 w-56",style:{left:dragGhostPos.x,top:dragGhostPos.y}},/*#__PURE__*/React.createElement("div",{className:"flex items-center gap-2 text-xs text-zinc-200 font-bold"},/*#__PURE__*/React.createElement("span",{className:"inline-flex items-center shrink-0"},/*#__PURE__*/React.createElement("i",{"data-lucide":"move",className:"w-3.5 h-3.5 text-cyan-400"})),dragGhostPanel==='export'?'Export Panel':dragGhostPanel==='ai'?'AI Panel':dragGhostPanel==='python_tools'?'Audio Processing Panel':'Selection Panel'),/*#__PURE__*/React.createElement("div",{className:"text-xs text-zinc-500 mt-1"},"Drop at edge to dock")),renderDock('top','Top'),/*#__PURE__*/React.createElement("div",{className:"flex-1 flex overflow-hidden"},renderDock('left','Left'),/*#__PURE__*/React.createElement("div",{className:"flex-1 flex flex-col overflow-hidden min-w-0"},/*#__PURE__*/React.createElement("div",{className:"flex-1 flex overflow-hidden"},activeTab==='main'||sessionTabs.some(s=>s.id===activeTab)?/*#__PURE__*/React.createElement(React.Fragment,null,/*#__PURE__*/React.createElement("div",{ref:tcpContainerRef,onScroll:handleTCPScroll,className:"shrink-0 z-20 bg-[#262626] overflow-y-auto flex flex-col border-r border-zinc-900 no-scrollbar",style:{width:tcpWidth+'px',scrollbarWidth:'none',msOverflowStyle:'none'}},/*#__PURE__*/React.createElement("div",{className:"sticky top-0 z-50 flex items-center justify-between h-10 border-b border-zinc-900 bg-[#242424] px-2 shrink-0"},/*#__PURE__*/React.createElement("span",{className:"text-xs font-bold text-zinc-300 flex items-center gap-1.5"},/*#__PURE__*/React.createElement("span",{className:"inline-flex items-center shrink-0"},/*#__PURE__*/React.createElement("i",{"data-lucide":"sliders",className:"w-3.5 h-3.5 text-cyan-400"})),"TRACKS (",activeTracks.length,")"),/*#__PURE__*/React.createElement("button",{onClick:addNewTrack,className:"px-2.5 py-1 bg-cyan-600 hover:bg-cyan-500 text-white rounded text-xs font-semibold flex items-center gap-1 shadow transition"},/*#__PURE__*/React.createElement("span",{className:"inline-flex items-center shrink-0"},/*#__PURE__*/React.createElement("i",{"data-lucide":"plus",className:"w-3 h-3"}))," Add Track")),/*#__PURE__*/React.createElement("div",{className:"sticky top-10 z-40 flex h-[40px] border-b border-purple-500/30 bg-[#1a1a2e] p-2 border-l-4 border-purple-500 shrink-0"},/*#__PURE__*/React.createElement("div",{className:"flex items-center justify-between w-full"},/*#__PURE__*/React.createElement("div",{className:"flex items-center gap-2"},/*#__PURE__*/React.createElement("span",{className:"text-xs font-bold text-purple-400 font-mono"},"TM"),/*#__PURE__*/React.createElement("span",{className:"text-xs font-semibold text-zinc-300"},"Tempo")),/*#__PURE__*/React.createElement("div",{className:"flex items-center gap-1"},/*#__PURE__*/React.createElement("input",{type:"number",value:bpm,onChange:e=>{setBpm(e.target.value);},onBlur:e=>{const v=e.target.value;if(v&&String(bpm)!==v)setBpmWithUndo(v);localStorage.setItem('studio_bpm',bpm);},onKeyDown:e=>{if(e.key==='Enter'){e.target.blur();}},className:"w-12 bg-zinc-800 border border-zinc-700 rounded text-xs text-zinc-300 text-center font-mono focus:outline-none focus:border-purple-500",min:"40",max:"300"}),/*#__PURE__*/React.createElement("span",{className:"text-xs text-zinc-500"},"BPM")))),/*#__PURE__*/React.createElement("div",{className:"flex-1 flex flex-col divide-y divide-[#141414] bg-[#262626]"},activeTracks.length===0?/*#__PURE__*/React.createElement("div",{className:"p-6 text-center text-zinc-400 flex flex-col items-center justify-center space-y-3"},/*#__PURE__*/React.createElement("span",{className:"inline-flex items-center shrink-0"},/*#__PURE__*/React.createElement("i",{"data-lucide":"plus-circle",className:"w-8 h-8 text-cyan-400 opacity-80"})),/*#__PURE__*/React.createElement("p",{className:"text-xs font-medium"},"Chưa có Track nào trong dự án."),/*#__PURE__*/React.createElement("button",{onClick:addNewTrack,className:"px-3 py-1.5 bg-cyan-600 hover:bg-cyan-500 text-white rounded text-xs font-semibold flex items-center gap-1.5 shadow"},/*#__PURE__*/React.createElement("span",{className:"inline-flex items-center shrink-0"},/*#__PURE__*/React.createElement("i",{"data-lucide":"plus-circle",className:"w-3.5 h-3.5"}))," Thêm Track Mới")):activeTracks.map((track,idx)=>{const isSelected=selectedTrackId===track.id;const autoHeight=track.height||(track.isArmed?164:140);return/*#__PURE__*/React.createElement("div",{key:track.id,style:{height:`${autoHeight}px`},className:`shrink-0 relative flex flex-col justify-between p-2.5 bg-[#1e1e1e] border-r border-zinc-900 cursor-pointer border-l-4 border-b border-[#141414] overflow-hidden ${isSelected?'border-cyan-500 bg-[#252525]':'border-transparent hover:bg-zinc-800/20'}`,onClick:()=>{// Chỉ CHỌN track — KHÔNG tự dừng main play + chuyển sang piano roll // tab (trước đây gây "mất âm thanh khi click track number"). -setSelectedTrackId(track.id);}},/*#__PURE__*/React.createElement("div",{className:"flex items-start justify-between"},/*#__PURE__*/React.createElement("div",{className:"flex items-center gap-2"},/*#__PURE__*/React.createElement("span",{className:"text-xs font-bold text-zinc-500 font-mono"},(idx+1).toString().padStart(2,'0')),/*#__PURE__*/React.createElement("label",{className:"cursor-pointer relative block"},/*#__PURE__*/React.createElement("input",{type:"color",value:track.color||'#0f766e',onClick:e=>e.stopPropagation(),onMouseDown:e=>e.stopPropagation(),onChange:e=>{e.stopPropagation();updateTrackColor(track.id,e.target.value);},className:"absolute inset-0 w-full h-full opacity-0 cursor-pointer"}),/*#__PURE__*/React.createElement("div",{className:"w-3 h-3 rounded-full border border-zinc-600 hover:scale-110 transition-transform",style:{backgroundColor:track.color}})),editingTrackName===track.id?/*#__PURE__*/React.createElement("input",{type:"text",value:editNameInput,autoFocus:true,onChange:e=>setEditNameInput(e.target.value),onBlur:()=>{updateTrackName(track.id,editNameInput||track.name);setEditingTrackName(null);},onKeyDown:e=>{if(e.key==='Enter'){updateTrackName(track.id,editNameInput||track.name);setEditingTrackName(null);}if(e.key==='Escape')setEditingTrackName(null);},onClick:e=>e.stopPropagation(),className:"text-xs font-semibold bg-black text-zinc-200 border border-cyan-500 rounded px-1 py-0 w-24 outline-none"}):/*#__PURE__*/React.createElement("span",{className:"text-xs font-semibold text-zinc-300 truncate max-w-[80px] cursor-text hover:text-cyan-300 transition-colors",title:"Click to rename",onClick:e=>{e.stopPropagation();setEditingTrackName(track.id);setEditNameInput(track.name);}},track.name)),/*#__PURE__*/React.createElement("div",{className:"flex flex-wrap gap-0.5 max-w-[100px] mb-0.5"},(track.clips&&track.clips.length>0?track.clips:track.buffer?[{id:'default',name:track.name,startTime:track.startTime}]:[]).slice(0,3).map(c=>/*#__PURE__*/React.createElement("span",{key:c.id,className:"text-[9px] font-mono text-zinc-500 bg-zinc-800/60 rounded px-0.5 truncate max-w-[90px] cursor-pointer hover:text-cyan-400 hover:bg-zinc-700",title:c.name||track.name,onClick:e=>{e.stopPropagation();setSelectedTrackId(track.id);clearLocalSelection();setSelectionMode('global');const start=c.startTime||0;const end=start+(c.buffer?c.buffer.duration:2);setSelectionStart(start);setSelectionEnd(end);showToast(`Selected: ${c.name||track.name}`,'info');}},c.name||track.name),editingClipName&&editingClipName.trackId===track.id&&editingClipName.clipId===c.id?/*#__PURE__*/React.createElement("input",{type:"text",value:editNameInput,autoFocus:true,onChange:e=>setEditNameInput(e.target.value),onBlur:()=>{if(editNameInput.trim())updateClipName(track.id,c.id,editNameInput.trim());setEditingClipName(null);},onKeyDown:e=>{if(e.key==='Enter'){if(editNameInput.trim())updateClipName(track.id,c.id,editNameInput.trim());setEditingClipName(null);}if(e.key==='Escape')setEditingClipName(null);},onClick:e=>e.stopPropagation(),className:"w-20 text-[9px] font-mono bg-black text-cyan-300 border border-cyan-500 rounded px-0.5 py-0 outline-none"}):/*#__PURE__*/React.createElement("button",{className:"text-[9px] text-zinc-600 hover:text-cyan-400 ml-0.5 shrink-0",title:"Sửa tên clip",onClick:e=>{e.stopPropagation();setEditingClipName({trackId:track.id,clipId:c.id});setEditNameInput(c.name||track.name);}},/*#__PURE__*/React.createElement("i",{"data-lucide":"pencil",className:"w-2.5 h-2.5"})))),/*#__PURE__*/React.createElement("div",{className:"flex items-center gap-1"},/*#__PURE__*/React.createElement("button",{onClick:e=>{e.stopPropagation();toggleTrackMute(track.id);if(window.__applyTrackMuteSolo)window.__applyTrackMuteSolo(track.id,{muted:!track.muted});},title:"Mute",className:`px-1.5 py-0.5 text-[10px] rounded font-mono font-bold border transition flex items-center gap-0.5 ${track.muted?'bg-red-950 text-red-400 border-red-700':'bg-zinc-800 text-zinc-400 border-transparent hover:text-zinc-200'}`},/*#__PURE__*/React.createElement("i",{"data-lucide":track.muted?"volume-x":"volume-2",className:"w-3 h-3"})),/*#__PURE__*/React.createElement("button",{onClick:e=>{e.stopPropagation();toggleTrackSoloEvaluate(track.id);if(window.__applyTrackMuteSolo)window.__applyTrackMuteSolo(track.id,{solo:!track.solo});},title:"Solo",className:`px-1.5 py-0.5 text-[10px] rounded font-mono font-bold border transition flex items-center gap-0.5 ${track.solo?'bg-amber-950 text-amber-400 border-amber-600':'bg-zinc-800 text-zinc-400 border-transparent hover:text-zinc-200'}`},/*#__PURE__*/React.createElement("i",{"data-lucide":track.solo?"headphones":"headphone-off",className:"w-3 h-3"})),/*#__PURE__*/React.createElement("button",{onClick:e=>{e.stopPropagation();toggleTrackDrum(track.id);},title:track.is_percussion?"Drum Channel (CH 10) - Click to disable":"Toggle Drum Channel (CH 10)",className:`px-1.5 py-0.5 text-[9px] rounded font-mono font-bold border transition flex items-center gap-0.5 ${track.is_percussion?'bg-rose-900 text-rose-300 border-rose-700':'bg-zinc-800 text-zinc-500 border-transparent hover:text-zinc-300'}`},/*#__PURE__*/React.createElement("span",{className:"text-[11px]"},"🥁"),track.is_percussion?/*#__PURE__*/React.createElement("span",{className:"text-[9px]"},"D"):null),/*#__PURE__*/React.createElement("button",{onClick:e=>{e.stopPropagation();toggleTrackArm(track.id);},title:"ARM (Record)",className:`px-1.5 py-0.5 text-[10px] rounded font-mono font-bold border transition flex items-center gap-0.5 ${track.isArmed?'bg-red-600 text-white border-red-500 hover:bg-red-500':'bg-zinc-800 text-zinc-400 border-transparent hover:text-zinc-200'}`},/*#__PURE__*/React.createElement("i",{"data-lucide":"circle",className:`w-2.5 h-2.5 ${track.isArmed?'fill-white':''}`})),/*#__PURE__*/React.createElement("button",{onClick:e=>{e.stopPropagation();toggleTrackMonitor(track.id);},title:"Input Monitor",className:`px-1.5 py-0.5 text-[10px] rounded font-mono font-bold border transition flex items-center gap-0.5 ${track.monitoringEnabled?'bg-amber-600 text-white border-amber-500 hover:bg-amber-500':'bg-zinc-800 text-zinc-500 border-transparent hover:text-zinc-305'}`},/*#__PURE__*/React.createElement("i",{"data-lucide":track.monitoringEnabled?"mic":"mic-off",className:"w-3 h-3"})),/*#__PURE__*/React.createElement("button",{onClick:e=>{e.stopPropagation();deleteTrack(track.id);},className:"p-0.5 rounded text-red-500 hover:bg-red-950/40 hover:text-red-400 transition"},/*#__PURE__*/React.createElement("span",{className:"inline-flex items-center shrink-0"},/*#__PURE__*/React.createElement("i",{"data-lucide":"trash-2",className:"w-3 h-3"}))))),/*#__PURE__*/React.createElement("div",{className:"flex flex-col gap-0.5 text-xs",onClick:e=>e.stopPropagation()},/*#__PURE__*/React.createElement("div",{className:"flex items-center gap-1",onWheel:e=>{e.preventDefault();const steps=wheelSteps('vol:'+track.id,e.deltaY,e.deltaMode,100);if(!steps)return;const nv=Math.max(-50,Math.min(7,(track.volumeDb??0)+steps*0.5));updateTrackVolumeDb(track.id,nv);},onDoubleClick:e=>{e.stopPropagation();updateTrackVolumeDb(track.id,0);},},/*#__PURE__*/React.createElement("span",{className:"w-8 text-right text-zinc-500 text-xs"},"Vol:"),/*#__PURE__*/React.createElement("input",{type:"range",min:"-50",max:"7",step:"0.5",value:track.volumeDb??0,onChange:e=>updateTrackVolumeDb(track.id,parseFloat(e.target.value)),className:"flex-1 h-1 bg-zinc-700 rounded-lg appearance-none cursor-pointer accent-cyan-500",style:{height:'4px'}}),/*#__PURE__*/React.createElement("span",{className:"w-12 text-right font-mono text-zinc-300 text-xs"},track.volumeDb??0,"dB")),/*#__PURE__*/React.createElement("div",{className:"flex items-center gap-1",onWheel:e=>{e.preventDefault();const steps=wheelSteps('pan:'+track.id,e.deltaY,e.deltaMode,100);if(!steps)return;const np=Math.max(-100,Math.min(100,(track.pan??0)+steps*5));updateTrackPan(track.id,np);},onDoubleClick:e=>{e.stopPropagation();updateTrackPan(track.id,0);},},/*#__PURE__*/React.createElement("span",{className:"w-8 text-right text-zinc-500 text-xs"},"Pan:"),/*#__PURE__*/React.createElement("input",{type:"range",min:"-100",max:"100",step:"1",value:track.pan??0,onChange:e=>updateTrackPan(track.id,parseInt(e.target.value)),className:"flex-1 h-1 bg-zinc-700 rounded-lg appearance-none cursor-pointer accent-purple-500",style:{height:'4px'}}),/*#__PURE__*/React.createElement("span",{className:"w-12 text-right font-mono text-zinc-300 text-xs"},track.pan>0?'R'+track.pan:track.pan<0?'L'+Math.abs(track.pan):'C')),/*#__PURE__*/React.createElement("div",{className:"flex items-center gap-1 mt-0.5"},/*#__PURE__*/React.createElement("span",{className:"w-8 text-right text-zinc-500 text-[10px]"},"In:"),/*#__PURE__*/React.createElement("select",{value:`${track.inputSource?.deviceType||'NONE'}:${track.inputSource?.deviceId||''}`,onChange:e=>{const val=e.target.value;const parts=val.split(':');const type=parts[0];const id=parts.slice(1).join(':');updateTrackInputSource(track.id,type,id);},className:"flex-1 bg-[#18181b] text-zinc-300 text-[10px] rounded border border-zinc-700 focus:outline-none py-0.5 px-1 truncate max-w-[120px]"},/*#__PURE__*/React.createElement("option",{value:"NONE:"},"No Input"),/*#__PURE__*/React.createElement("optgroup",{label:"Microphones"},audioDevices.map(d=>/*#__PURE__*/React.createElement("option",{key:d.deviceId,value:`MICROPHONE:${d.deviceId}`},d.label||`Microphone ${d.deviceId.slice(0,5)}`))),/*#__PURE__*/React.createElement("optgroup",{label:"MIDI Keyboards"},/*#__PURE__*/React.createElement("option",{value:"MIDI_KEYBOARD:ALL"},"Any MIDI Keyboard"),midiDevices.map(d=>/*#__PURE__*/React.createElement("option",{key:d.id,value:`MIDI_KEYBOARD:${d.id}`},d.name||`MIDI Input ${d.id.slice(0,5)}`)))),/*#__PURE__*/React.createElement("div",{className:"flex items-center gap-0.5 w-16 shrink-0 ml-1"},/*#__PURE__*/React.createElement("span",{className:"text-zinc-500 text-[9px]"},"VU"),/*#__PURE__*/React.createElement("canvas",{ref:el=>{// TÁCH VU MAIN vs SECTION-TAB (user 07:20): section clone id TRÙNG +setSelectedTrackId(track.id);}},/*#__PURE__*/React.createElement("div",{className:"flex items-start justify-between"},/*#__PURE__*/React.createElement("div",{className:"flex items-center gap-2"},/*#__PURE__*/React.createElement("span",{className:"text-xs font-bold text-zinc-500 font-mono"},(idx+1).toString().padStart(2,'0')),/*#__PURE__*/React.createElement("label",{className:"cursor-pointer relative block"},/*#__PURE__*/React.createElement("input",{type:"color",value:track.color||'#0f766e',onClick:e=>e.stopPropagation(),onMouseDown:e=>e.stopPropagation(),onChange:e=>{e.stopPropagation();updateTrackColor(track.id,e.target.value);},className:"absolute inset-0 w-full h-full opacity-0 cursor-pointer"}),/*#__PURE__*/React.createElement("div",{className:"w-3 h-3 rounded-full border border-zinc-600 hover:scale-110 transition-transform",style:{backgroundColor:track.color}})),editingTrackName===track.id?/*#__PURE__*/React.createElement("input",{type:"text",value:editNameInput,autoFocus:true,onChange:e=>setEditNameInput(e.target.value),onBlur:()=>{updateTrackName(track.id,editNameInput||track.name);setEditingTrackName(null);},onKeyDown:e=>{if(e.key==='Enter'){updateTrackName(track.id,editNameInput||track.name);setEditingTrackName(null);}if(e.key==='Escape')setEditingTrackName(null);},onClick:e=>e.stopPropagation(),className:"text-xs font-semibold bg-black text-zinc-200 border border-cyan-500 rounded px-1 py-0 w-24 outline-none"}):/*#__PURE__*/React.createElement("span",{className:"text-xs font-semibold text-zinc-300 truncate max-w-[80px] cursor-text hover:text-cyan-300 transition-colors",title:"Click to rename",onClick:e=>{e.stopPropagation();setEditingTrackName(track.id);setEditNameInput(track.name);}},track.name)),/*#__PURE__*/React.createElement("div",{className:"flex flex-wrap gap-0.5 max-w-[100px] mb-0.5"},(track.clips&&track.clips.length>0?track.clips:track.buffer?[{id:'default',name:track.name,startTime:track.startTime}]:[]).slice(0,3).map(c=>/*#__PURE__*/React.createElement("span",{key:c.id,className:"text-[9px] font-mono text-zinc-500 bg-zinc-800/60 rounded px-0.5 truncate max-w-[90px] cursor-pointer hover:text-cyan-400 hover:bg-zinc-700",title:c.name||track.name,onClick:e=>{e.stopPropagation();setSelectedTrackId(track.id);clearLocalSelection();setSelectionMode('global');const start=c.startTime||0;const end=start+(c.buffer?c.buffer.duration:2);setSelectionStart(start);setSelectionEnd(end);showToast(`Selected: ${c.name||track.name}`,'info');}},c.name||track.name),editingClipName&&editingClipName.trackId===track.id&&editingClipName.clipId===c.id?/*#__PURE__*/React.createElement("input",{type:"text",value:editNameInput,autoFocus:true,onChange:e=>setEditNameInput(e.target.value),onBlur:()=>{if(editNameInput.trim())updateClipName(track.id,c.id,editNameInput.trim());setEditingClipName(null);},onKeyDown:e=>{if(e.key==='Enter'){if(editNameInput.trim())updateClipName(track.id,c.id,editNameInput.trim());setEditingClipName(null);}if(e.key==='Escape')setEditingClipName(null);},onClick:e=>e.stopPropagation(),className:"w-20 text-[9px] font-mono bg-black text-cyan-300 border border-cyan-500 rounded px-0.5 py-0 outline-none"}):/*#__PURE__*/React.createElement("button",{className:"text-[9px] text-zinc-600 hover:text-cyan-400 ml-0.5 shrink-0",title:"Sửa tên clip",onClick:e=>{e.stopPropagation();setEditingClipName({trackId:track.id,clipId:c.id});setEditNameInput(c.name||track.name);}},/*#__PURE__*/React.createElement("i",{"data-lucide":"pencil",className:"w-2.5 h-2.5"})))),/*#__PURE__*/React.createElement("div",{className:"flex items-center gap-1"},/*#__PURE__*/React.createElement("button",{onClick:e=>{e.stopPropagation();toggleTrackMute(track.id);if(window.__applyTrackMuteSolo)window.__applyTrackMuteSolo(track.id,{muted:!track.muted});},title:"Mute",className:`px-1.5 py-0.5 text-[10px] rounded font-mono font-bold border transition flex items-center gap-0.5 ${track.muted?'bg-red-950 text-red-400 border-red-700':'bg-zinc-800 text-zinc-400 border-transparent hover:text-zinc-200'}`},/*#__PURE__*/React.createElement("i",{"data-lucide":track.muted?"volume-x":"volume-2",className:"w-3 h-3"})),/*#__PURE__*/React.createElement("button",{onClick:e=>{e.stopPropagation();toggleTrackSoloEvaluate(track.id);if(window.__applyTrackMuteSolo)window.__applyTrackMuteSolo(track.id,{solo:!track.solo});},title:"Solo",className:`px-1.5 py-0.5 text-[10px] rounded font-mono font-bold border transition flex items-center gap-0.5 ${track.solo?'bg-amber-950 text-amber-400 border-amber-600':'bg-zinc-800 text-zinc-400 border-transparent hover:text-zinc-200'}`},/*#__PURE__*/React.createElement("i",{"data-lucide":track.solo?"headphones":"headphone-off",className:"w-3 h-3"})),/*#__PURE__*/React.createElement("button",{onClick:e=>{e.stopPropagation();toggleTrackDrum(track.id);},title:track.is_percussion?"Drum Channel (CH 10) - Click to disable":"Toggle Drum Channel (CH 10)",className:`px-1.5 py-0.5 text-[9px] rounded font-mono font-bold border transition flex items-center gap-0.5 ${track.is_percussion?'bg-rose-900 text-rose-300 border-rose-700':'bg-zinc-800 text-zinc-500 border-transparent hover:text-zinc-300'}`},/*#__PURE__*/React.createElement("span",{className:"text-[11px]"},"🥁"),track.is_percussion?/*#__PURE__*/React.createElement("span",{className:"text-[9px]"},"D"):null),/*#__PURE__*/React.createElement("button",{onClick:e=>{e.stopPropagation();toggleTrackArm(track.id);},title:"ARM (Record)",className:`px-1.5 py-0.5 text-[10px] rounded font-mono font-bold border transition flex items-center gap-0.5 ${track.isArmed?'bg-red-600 text-white border-red-500 hover:bg-red-500':'bg-zinc-800 text-zinc-400 border-transparent hover:text-zinc-200'}`},/*#__PURE__*/React.createElement("i",{"data-lucide":"circle",className:`w-2.5 h-2.5 ${track.isArmed?'fill-white':''}`})),/*#__PURE__*/React.createElement("button",{onClick:e=>{e.stopPropagation();toggleTrackMonitor(track.id);},title:"Input Monitor",className:`px-1.5 py-0.5 text-[10px] rounded font-mono font-bold border transition flex items-center gap-0.5 ${track.monitoringEnabled?'bg-amber-600 text-white border-amber-500 hover:bg-amber-500':'bg-zinc-800 text-zinc-500 border-transparent hover:text-zinc-305'}`},/*#__PURE__*/React.createElement("i",{"data-lucide":track.monitoringEnabled?"mic":"mic-off",className:"w-3 h-3"})),/*#__PURE__*/React.createElement("button",{onClick:e=>{e.stopPropagation();deleteTrack(track.id);},className:"p-0.5 rounded text-red-500 hover:bg-red-950/40 hover:text-red-400 transition"},/*#__PURE__*/React.createElement("span",{className:"inline-flex items-center shrink-0"},/*#__PURE__*/React.createElement("i",{"data-lucide":"trash-2",className:"w-3 h-3"}))))),/*#__PURE__*/React.createElement("div",{className:"flex flex-col gap-0.5 text-xs",onClick:e=>e.stopPropagation()},/*#__PURE__*/React.createElement("div",{className:"flex items-center gap-1",onWheel:e=>{e.preventDefault();const steps=wheelSteps('vol:'+track.id,e.deltaY,e.deltaMode,100);if(!steps)return;const nv=Math.max(-50,Math.min(7,(track.volumeDb??0)+steps*0.5));updateTrackVolumeDb(track.id,nv);},onDoubleClick:e=>{e.stopPropagation();updateTrackVolumeDb(track.id,0);}},/*#__PURE__*/React.createElement("span",{className:"w-8 text-right text-zinc-500 text-xs"},"Vol:"),/*#__PURE__*/React.createElement("input",{type:"range",min:"-50",max:"7",step:"0.5",value:track.volumeDb??0,onChange:e=>updateTrackVolumeDb(track.id,parseFloat(e.target.value)),className:"flex-1 h-1 bg-zinc-700 rounded-lg appearance-none cursor-pointer accent-cyan-500",style:{height:'4px'}}),/*#__PURE__*/React.createElement("span",{className:"w-12 text-right font-mono text-zinc-300 text-xs"},track.volumeDb??0,"dB")),/*#__PURE__*/React.createElement("div",{className:"flex items-center gap-1",onWheel:e=>{e.preventDefault();const steps=wheelSteps('pan:'+track.id,e.deltaY,e.deltaMode,100);if(!steps)return;const np=Math.max(-100,Math.min(100,(track.pan??0)+steps*5));updateTrackPan(track.id,np);},onDoubleClick:e=>{e.stopPropagation();updateTrackPan(track.id,0);}},/*#__PURE__*/React.createElement("span",{className:"w-8 text-right text-zinc-500 text-xs"},"Pan:"),/*#__PURE__*/React.createElement("input",{type:"range",min:"-100",max:"100",step:"1",value:track.pan??0,onChange:e=>updateTrackPan(track.id,parseInt(e.target.value)),className:"flex-1 h-1 bg-zinc-700 rounded-lg appearance-none cursor-pointer accent-purple-500",style:{height:'4px'}}),/*#__PURE__*/React.createElement("span",{className:"w-12 text-right font-mono text-zinc-300 text-xs"},track.pan>0?'R'+track.pan:track.pan<0?'L'+Math.abs(track.pan):'C')),/*#__PURE__*/React.createElement("div",{className:"flex items-center gap-1 mt-0.5"},/*#__PURE__*/React.createElement("span",{className:"w-8 text-right text-zinc-500 text-[10px]"},"In:"),/*#__PURE__*/React.createElement("select",{value:`${track.inputSource?.deviceType||'NONE'}:${track.inputSource?.deviceId||''}`,onChange:e=>{const val=e.target.value;const parts=val.split(':');const type=parts[0];const id=parts.slice(1).join(':');updateTrackInputSource(track.id,type,id);},className:"flex-1 bg-[#18181b] text-zinc-300 text-[10px] rounded border border-zinc-700 focus:outline-none py-0.5 px-1 truncate max-w-[120px]"},/*#__PURE__*/React.createElement("option",{value:"NONE:"},"No Input"),/*#__PURE__*/React.createElement("optgroup",{label:"Microphones"},audioDevices.map(d=>/*#__PURE__*/React.createElement("option",{key:d.deviceId,value:`MICROPHONE:${d.deviceId}`},d.label||`Microphone ${d.deviceId.slice(0,5)}`))),/*#__PURE__*/React.createElement("optgroup",{label:"MIDI Keyboards"},/*#__PURE__*/React.createElement("option",{value:"MIDI_KEYBOARD:ALL"},"Any MIDI Keyboard"),midiDevices.map(d=>/*#__PURE__*/React.createElement("option",{key:d.id,value:`MIDI_KEYBOARD:${d.id}`},d.name||`MIDI Input ${d.id.slice(0,5)}`)))),/*#__PURE__*/React.createElement("div",{className:"flex items-center gap-0.5 w-16 shrink-0 ml-1"},/*#__PURE__*/React.createElement("span",{className:"text-zinc-500 text-[9px]"},"VU"),/*#__PURE__*/React.createElement("canvas",{ref:el=>{// TÁCH VU MAIN vs SECTION-TAB (user 07:20): section clone id TRÙNG // main id → key canvas trùng → VU main/section lẫn nhau. Section // strip dùng key '_sess_' — VU tick parse theo key. const _vuK=track._isSectionClone?'_sess_'+track.id:track.id;if(el)trackVuRefs.current[_vuK]=el;else delete trackVuRefs.current[_vuK];},width:100,height:4,className:"flex-1 bg-[#18181b] rounded h-1"})))),/*#__PURE__*/React.createElement("div",{className:"flex items-center gap-1.5 mt-1",onClick:e=>e.stopPropagation()},/*#__PURE__*/React.createElement("input",{type:"file",id:`upload-${track.id}`,accept:"audio/*",className:"hidden",onChange:e=>loadFileOnTrack(track.id,e.target.files[0])}),/*#__PURE__*/React.createElement("label",{htmlFor:`upload-${track.id}`,className:"px-2.5 py-1 bg-zinc-800 hover:bg-zinc-700 text-zinc-300 rounded text-xs flex items-center gap-1 cursor-pointer border border-zinc-700 font-medium"},/*#__PURE__*/React.createElement("span",{className:"inline-flex items-center shrink-0"},/*#__PURE__*/React.createElement("i",{"data-lucide":"upload",className:"w-3 h-3"}))," File"),/*#__PURE__*/React.createElement("button",{onClick:e=>{e.stopPropagation();setFxSelectorTrackId(track.id);},className:"px-2.5 py-1 bg-zinc-800 hover:bg-zinc-700 text-purple-400 border border-purple-900 rounded text-xs font-bold flex items-center gap-1"},/*#__PURE__*/React.createElement("span",{className:"inline-flex items-center shrink-0"},/*#__PURE__*/React.createElement("i",{"data-lucide":"wand-2",className:"w-3 h-3"}))," FX: ",/*#__PURE__*/React.createElement("span",{className:"text-zinc-500 font-normal"},track.fxType||"None")),/*#__PURE__*/React.createElement("button",{onClick:e=>{e.stopPropagation();openInstrumentSelector(track.id);},className:"px-1.5 py-1 bg-zinc-800 hover:bg-zinc-700 text-amber-400 border border-amber-800 rounded text-xs font-bold flex items-center gap-1 max-w-[90px] shrink-0"},/*#__PURE__*/React.createElement("span",{className:"inline-flex items-center shrink-0"},/*#__PURE__*/React.createElement("i",{"data-lucide":"music",className:"w-2.5 h-2.5 shrink-0"})),/*#__PURE__*/React.createElement("span",{className:"truncate text-xs min-w-0"},track.instrumentName||track.instrumentId||"Synth"),/*#__PURE__*/React.createElement("i",{"data-lucide":"chevron-down",className:"w-3 h-3 shrink-0"})),track.instrumentId&&typeof track.instrumentId==='string'&&!track.instrumentId.startsWith('sf_')?/*#__PURE__*/React.createElement("button",{onClick:e=>{e.stopPropagation();ensureAndOpenVstGui(track);},title:"Mở lại GUI VSTi",className:"px-1.5 py-1 bg-zinc-800 hover:bg-zinc-700 text-violet-300 border border-violet-800 rounded text-xs font-bold flex items-center gap-1 shrink-0"},/*#__PURE__*/React.createElement("i",{"data-lucide":"sliders-horizontal",className:"w-3 h-3 shrink-0"}),/*#__PURE__*/React.createElement("span",{className:"truncate text-xs min-w-0"},"GUI")):null),/*#__PURE__*/React.createElement("div",{onMouseDown:e=>handleTrackResizeMouseDown(e,track.id),className:"absolute bottom-0 left-0 right-0 h-1 cursor-ns-resize z-30 hover:bg-cyan-500/50 transition-colors",onClick:e=>e.stopPropagation()}));})),/*#__PURE__*/React.createElement("div",{className:"h-[48px] border-r border-zinc-900 bg-[#1e1e1e]/50 shrink-0"})),/*#__PURE__*/React.createElement("div",{className:"w-1 cursor-ew-resize hover:bg-cyan-500/50 active:bg-cyan-400 transition-colors shrink-0 z-10",onMouseDown:startTcpResize}),/*#__PURE__*/React.createElement("div",{ref:handleTimelineWrapperRef,onScroll:handleTimelineScroll,className:"flex-1 relative z-10 overflow-x-auto overflow-y-auto min-w-0"},/*#__PURE__*/React.createElement("div",{style:{width:`${timelineWidth}px`},className:"relative flex flex-col min-h-full"},/*#__PURE__*/React.createElement("div",{className:"sticky top-0 z-30 bg-[#1a1a1a]"},/*#__PURE__*/React.createElement(TimelineRuler,{bpm:parseInt(bpm)||120,zoom:zoom,timelineWidth:timelineWidth,viewportWidth:viewportWidth,onPlayheadSet:handlePlayheadSet,snapValue:snapValue,onRulerMouseDown:e=>{setSelectionFollowsTempo(false);handleRulerMouseDown(e);},scrollLeft:scrollLeft,canvasRedrawCount:canvasRedrawCount}),/*#__PURE__*/React.createElement(TempoTrackLane,{bpm:parseInt(bpm)||120,zoom:zoom,timelineWidth:timelineWidth,viewportWidth:viewportWidth,onPlayheadSet:handlePlayheadSet,snapValue:snapValue,onRulerMouseDown:e=>{setSelectionFollowsTempo(true);handleRulerMouseDown(e);},scrollLeft:scrollLeft,canvasRedrawCount:canvasRedrawCount})),selectionMode==='global'&&selLeft!==null&&selRight!==null&&selRight>selLeft&&/*#__PURE__*/React.createElement("div",{className:"absolute inset-0 pointer-events-none z-20",style:{left:`${selLeft*zoom}px`,width:`${(selRight-selLeft)*zoom}px`,top:'80px'}},/*#__PURE__*/React.createElement("div",{className:"w-full h-full bg-amber-500/10",style:{borderLeft:'1px solid #f59e0b',borderRight:'1px solid #f59e0b'}})),/*#__PURE__*/React.createElement("div",{className:"flex-1 flex flex-col divide-y divide-[#141414] relative bg-[#111111] min-h-full",onDragOver:e=>e.preventDefault(),onDrop:async e=>{e.preventDefault();// Media Explorer drag (client FS handle / server file_id / local path) if(window.__mediaExplorerDragFile){const f=await resolveMediaExplorerDropFile();window.__mediaExplorerDragFile=null;if(!f)return;if(/\.mid$|\.midi$/i.test(f.name||'')){handleDropMidiToNewTracks(f);}else if(selectedTrackId){loadFileOnTrack(selectedTrackId,f);}return;}const f=e.dataTransfer.files&&e.dataTransfer.files[0];if(!f)return;if(/\.mid$|\.midi$/i.test(f.name||'')){handleDropMidiToNewTracks(f);}else if(selectedTrackId){loadFileOnTrack(selectedTrackId,f);}},onMouseDown:e=>{if(e.ctrlKey&&!e.shiftKey&&!e.altKey&&e.button===0){const wrapper=timelineWrapperRef.current;if(wrapper){const rect=wrapper.getBoundingClientRect();const sl=wrapper.scrollLeft;const raw=Math.max(0,(e.clientX-rect.left+sl)/zoom-leadInMargin);const time=snapValue!=='free'?snapTime(raw,snapValue,bpm):raw;handleSweepSelectStart(null,time);}}}},activeTracks.map((track,idx)=>{const isSelected=selectedTrackId===track.id;const autoHeight=track.height||(track.isArmed?164:140);return/*#__PURE__*/React.createElement("div",{key:track.id,style:{height:`${autoHeight}px`},className:`shrink-0 relative border-b border-[#141414] hover:bg-zinc-850/5 transition-colors ${isSelected?'bg-zinc-800/10':''}`,onDragOver:e=>e.preventDefault(),onDrop:async e=>{e.preventDefault();e.stopPropagation();// Media Explorer drag (client FS handle / server file_id / local path) -if(window.__mediaExplorerDragFile){const f=await resolveMediaExplorerDropFile();window.__mediaExplorerDragFile=null;if(f)loadFileOnTrack(track.id,f);return;}const f=e.dataTransfer.files&&e.dataTransfer.files[0];if(!f)return;loadFileOnTrack(track.id,f);},onMouseEnter:()=>{setHoveredTrackId(track.id);hoveredTrackIdRef.current=track.id;}},/*#__PURE__*/React.createElement(WaveformLane,{track:track,zoom:zoom,timelineWidth:timelineWidth,viewportWidth:viewportWidth,scrollLeft:scrollLeft,onSelectRange:handleSelectRange,onPlayheadSet:handlePlayheadSet,isSelected:isSelected,selectedItemIds:selectedItemIds,onSelectTrack:setSelectedTrackId,markers:track.markers,onTrackLaneMouseDown:handleTrackLaneMouseDown,onClearSelection:()=>{captureSelectionUndo();setSelectedItemIds(new Set());},onSweepSelectStart:handleSweepSelectStart,onDeselectItem:handleDeselectItem,onAddToSelection:handleAddToSelection,onSetPendingDrag:handleSetPendingDrag,onSetPendingDragMove:handleSetPendingDragMove,onContextMenu:handleContextMenu,onClipDragStart:handleClipDragStart,onClipStretchStart:handleClipStretchStart,onSectionItemDragStart:handleSectionItemDragStart,onSectionItemResizeStart:handleSectionItemResizeStart,onSelectionEdgeDragStart:handleSelectionEdgeDragStart,setSelectedClipId:setSelectedClipId,selectedClipId:selectedClipId,activeTool:activeTool,onSplitTrackAtTime:handleSplitTrackAtTime,onEditClipInSubTab:handleEditClipInSubTab,onEditSectionInTab:handleEditSectionInTab,onEditMidiInTab:handleEditMidiInTab,snapValue:snapValue,bpm:bpm,selectionMode:selectionMode,localSelectionTrackId:localSelectionTrackId,localSelectionStart:localSelectionStart,currentTime:currentTime,getLocalAnchor:()=>localSelectionAnchorRef.current,onClearLocalSelection:()=>{captureSelectionUndo();clearLocalSelection();},onSetSelectionMode:mode=>{captureSelectionUndo();setSelectionMode(mode);},onSetSelectionStart:val=>{captureSelectionUndo();setSelectionStart(val);},onSetSelectionEnd:val=>{captureSelectionUndo();setSelectionEnd(val);},onSetCurrentTime:setCurrentTime,onSetLocalSelectionTrackId:setLocalSelectionTrackId,onSetLocalSelectionStart:setLocalSelectionStart,onSetLocalSelectionEnd:setLocalSelectionEnd,localSelLeft:localSelectionStart!==null&&localSelectionEnd!==null?Math.min(localSelectionStart,localSelectionEnd):null,localSelRight:localSelectionStart!==null&&localSelectionEnd!==null?Math.max(localSelectionStart,localSelectionEnd):null,scrollLeft:scrollLeft,recordingState:recordingState,recTempMidiNotes:recTempMidiNotes,recTempAudioBuffer:recTempAudioBuffer,recStartTimelineTime:recStartTimelineTime,canvasRedrawCount:canvasRedrawCount}),selectionMode==='local'&&localSelectionTrackId===track.id&&localSelectionStart!==null&&localSelectionEnd!==null&&Math.abs(localSelectionEnd-localSelectionStart)>0&&/*#__PURE__*/React.createElement("div",{className:"absolute top-0 bottom-0 border-l border-r border-amber-400 bg-amber-500/20 z-20 pointer-events-none",style:{left:`${Math.min(localSelectionStart,localSelectionEnd)*zoom}px`,width:`${Math.abs(localSelectionEnd-localSelectionStart)*zoom}px`}},/*#__PURE__*/React.createElement("div",{className:"absolute -left-[1px] top-0 bottom-0 w-[2px] bg-amber-400 z-30 pointer-events-auto cursor-ew-resize",onMouseDown:e=>handleHandleDragStart(e,'left')}),/*#__PURE__*/React.createElement("div",{className:"absolute -right-[1px] top-0 bottom-0 w-[2px] bg-amber-400 z-30 pointer-events-auto cursor-ew-resize",onMouseDown:e=>handleHandleDragStart(e,'right')})),sweepSelect&&/*#__PURE__*/React.createElement("div",{className:"absolute top-0 bottom-0 border-l border-r border-amber-400 bg-amber-500/10 z-20 pointer-events-none",style:{left:`${Math.min(sweepSelect.startTime,sweepSelect.endTime)*zoom}px`,width:`${Math.abs(sweepSelect.endTime-sweepSelect.startTime)*zoom}px`}}),track.buffer&&/*#__PURE__*/React.createElement("div",{className:"absolute right-2 top-2 flex items-center gap-1 z-10 opacity-70 hover:opacity-100"},/*#__PURE__*/React.createElement("button",{onClick:()=>handleSplitTrack(track.id),className:"px-1.5 py-0.5 bg-zinc-900/95 text-zinc-300 rounded text-xs flex items-center gap-1 border border-zinc-700/50"},/*#__PURE__*/React.createElement("span",{className:"inline-flex items-center shrink-0"},/*#__PURE__*/React.createElement("i",{"data-lucide":"scissors",className:"w-2.5 h-2.5 text-cyan-400"}))," Cắt")),/*#__PURE__*/React.createElement("div",{onMouseDown:e=>handleTrackResizeMouseDown(e,track.id),className:"absolute bottom-0 left-0 right-0 h-1 cursor-ns-resize z-30 hover:bg-cyan-500/50 transition-colors",onClick:e=>e.stopPropagation()}));}),/*#__PURE__*/React.createElement("div",{className:"h-[48px] flex items-center justify-center text-xs text-zinc-500 hover:bg-zinc-900/20 cursor-pointer select-none border-t border-dashed border-zinc-800",onMouseEnter:()=>{if(draggedClipRef.current||draggedSectionItemRef.current){setHoveredTrackId(addNewTrack());}},onClick:addNewTrack},/*#__PURE__*/React.createElement("span",{className:"flex items-center gap-1 text-zinc-400"},/*#__PURE__*/React.createElement("span",{className:"inline-flex items-center shrink-0"},/*#__PURE__*/React.createElement("i",{"data-lucide":"plus",className:"w-3.5 h-3.5"}))," Kéo clip xuống hoặc Click tạo Track")),selectionMode==='global'&&selLeft!==null&&selRight!==null&&selRight>selLeft&&/*#__PURE__*/React.createElement("div",{className:"absolute top-0 bottom-0 border-l border-r border-amber-500 bg-amber-500/10 z-20 selection-interactive-box cursor-grab active:cursor-grabbing",style:{left:`${selLeft*zoom}px`,width:`${(selRight-selLeft)*zoom}px`},onMouseDown:handleSelectionBodyDragStart},/*#__PURE__*/React.createElement("div",{className:"absolute -left-[1px] top-0 bottom-0 w-[1px] bg-amber-500 hover:bg-amber-400 cursor-ew-resize z-30",onMouseDown:e=>handleHandleDragStart(e,'left')}),/*#__PURE__*/React.createElement("div",{className:"absolute -right-[1px] top-0 bottom-0 w-[1px] bg-amber-500 hover:bg-amber-400 cursor-ew-resize z-30",onMouseDown:e=>handleHandleDragStart(e,'right')})),/*#__PURE__*/React.createElement("div",{className:"absolute top-0 bottom-0 w-[2px] bg-[#ef4444] z-20 pointer-events-none",style:{left:`${playheadLeftPos}px`}},/*#__PURE__*/React.createElement("div",{className:"w-3 h-3 bg-[#ef4444] rotate-45 transform -translate-x-1/2 -translate-y-1/2 absolute top-0"})))))):(()=>{const st=subTabs.find(s=>s.id===activeTab);if(!st)return null;if(st.type==='PIANO_ROLL'){return/*#__PURE__*/React.createElement(PianoRollTabEditor,{st:st,zoom:zoom,bpm:bpm,viewportWidth:viewportWidth,activeTracks:activeTracks,onClose:()=>closeSubTab(st.id),onUpdateNotes:handleUpdateMidiNotes,onSaveNotes:handleSaveMidiNotes,setSubTabs:setSubTabs,onPlayPause:handlePlayPause,onStop:()=>stopAllPlayback(true),isPlaying:isPlaying,playPreviewNote:playMidiPreviewNote,showToast:showToast,midiDevices:midiDevices,recordingState:recordingState,recTempMidiNotes:recTempMidiNotes,onRecord:handleRecordClick,selectedMidiInputId:selectedMidiInputId,onMidiInputSelect:handleMidiInputSelect,activeMidiPitches:activeMidiPitches,onInstrumentSelect:trackId=>{openInstrumentSelector(trackId);},onRealtimePlay:handlePianoRollRealtimePlay,onCopyNotes:n=>setPianoRollClipboard(JSON.parse(JSON.stringify(n||[]))),clipboardNotes:pianoRollClipboard,onExportMidiAudio:handleExportMidiAudio,onRescheduleMidi:updatedNotes=>{const playingSub=subTabs.find(s=>s.id===activeTab&&s.type==='PIANO_ROLL'&&s.isPlaying);if(playingSub){const offset=playingSub.currentTime||0;const ctx=getAudioContext();const tNode=activeTrackNodesRef.current[playingSub.trackId];if(tNode&&tNode.gainNode){tNode.gainNode.gain.setValueAtTime(tNode.gainNode.gain.value||1,ctx.currentTime);tNode.gainNode.gain.linearRampToValueAtTime(0.001,ctx.currentTime+0.04);}setTimeout(()=>{window.SonicSF.stopAll();stopAllNativeSfNotes();stopAllNativeVstNotes();if(tNode&&tNode.gainNode){const trackData=activeTracksRef.current?activeTracksRef.current.find(t=>t.id===playingSub.trackId):null;const volDb=trackData?trackData.volumeDb??0:0;const volLinear=volDb<=-50?0:Math.pow(10,volDb/20);tNode.gainNode.gain.setValueAtTime(0.001,ctx.currentTime);tNode.gainNode.gain.linearRampToValueAtTime(volLinear||0.8,ctx.currentTime+0.015);}startOffsetTimeRef.current=offset;startAudioTimeRef.current=ctx.currentTime;startBufferOffsetRef.current=offset*(playingSub.speed||1.0);schedulePianoRollMidi(playingSub,offset,updatedNotes);},50);}},onSeekPlayhead:clickTime=>{const seekSt=subTabs.find(s=>s.id===activeTab&&s.type==='PIANO_ROLL');if(!seekSt)return;if(seekSt.isPlaying){stopAllPlayback();window.SonicSF.stopAll();stopAllNativeSfNotes();stopAllNativeVstNotes();setSubTabs(prev=>prev.map(s=>s.id===seekSt.id?{...s,currentTime:clickTime,isPlaying:true}:s));const ctx=getAudioContext();startOffsetTimeRef.current=clickTime;startAudioTimeRef.current=ctx.currentTime;startBufferOffsetRef.current=clickTime*(seekSt.speed||1.0);schedulePianoRollMidi(seekSt,clickTime);startSubTabPlayback(seekSt,clickTime);}else{setSubTabs(prev=>prev.map(s=>s.id===seekSt.id?{...s,currentTime:clickTime}:s));}}});}const subTrack=tracks.find(t=>t.id===st.trackId);const vTrack=subTrack?{...subTrack,buffer:st.buffer,isSubTab:true}:null;const subTabDuration=st.type==='PIANO_ROLL'?(()=>{const notes=st.notes||[];const beatSec=60.0/(parseFloat(bpm)||120);let maxEnd=0;notes.forEach(n=>{const end=(n.start_beat||0)+(n.duration_beats||1);if(end>maxEnd)maxEnd=end;});return maxEnd*beatSec+1.0;})():st.buffer&&'duration'in st.buffer?st.buffer.duration:4.0;const subTabTimelineWidth=Math.max(zoom*subTabDuration,viewportWidth);return/*#__PURE__*/React.createElement(React.Fragment,null,/*#__PURE__*/React.createElement("div",{className:"shrink-0 z-30 bg-[#262626] overflow-y-scroll no-scrollbar flex flex-col border-r border-zinc-900",style:{width:tcpWidth+'px',scrollbarWidth:'none',msOverflowStyle:'none'}},/*#__PURE__*/React.createElement("div",{className:"sticky top-0 z-50 flex items-center h-10 border-b border-zinc-900 bg-[#242424] px-2 justify-between shrink-0"},/*#__PURE__*/React.createElement("span",{className:"text-xs font-bold text-zinc-500 uppercase"},"Sub-Tab"),/*#__PURE__*/React.createElement("button",{onClick:()=>closeSubTab(st.id),className:"px-1.5 py-0.5 text-xs bg-zinc-800 hover:bg-zinc-700 text-zinc-400 rounded border border-zinc-700 flex items-center gap-1"},/*#__PURE__*/React.createElement("span",{className:"inline-flex items-center shrink-0"},/*#__PURE__*/React.createElement("i",{"data-lucide":"x",className:"w-3 h-3"}))," Close")),vTrack?/*#__PURE__*/React.createElement("div",{key:vTrack.id,className:"flex-1 flex flex-col p-2.5 bg-[#1e1e1e] border-r border-zinc-900 border-l-4 border-l-cyan-500"},/*#__PURE__*/React.createElement("div",{className:"flex items-center justify-between mb-2"},/*#__PURE__*/React.createElement("div",{className:"flex items-center gap-2"},/*#__PURE__*/React.createElement("label",{className:"cursor-pointer relative block"},/*#__PURE__*/React.createElement("input",{type:"color",value:vTrack.color||'#0f766e',onClick:e=>e.stopPropagation(),onMouseDown:e=>e.stopPropagation(),onChange:e=>{e.stopPropagation();updateTrackColor(vTrack.id,e.target.value);},className:"absolute inset-0 w-full h-full opacity-0 cursor-pointer"}),/*#__PURE__*/React.createElement("div",{className:"w-3 h-3 rounded-full border border-zinc-600 hover:scale-110 transition-transform",style:{backgroundColor:vTrack.color}})),editingTrackName===vTrack.id?/*#__PURE__*/React.createElement("input",{type:"text",value:editNameInput,autoFocus:true,onChange:e=>setEditNameInput(e.target.value),onBlur:()=>{updateTrackName(vTrack.id,editNameInput||vTrack.name);setEditingTrackName(null);},onKeyDown:e=>{if(e.key==='Enter'){updateTrackName(vTrack.id,editNameInput||vTrack.name);setEditingTrackName(null);}if(e.key==='Escape')setEditingTrackName(null);},onClick:e=>e.stopPropagation(),className:"text-xs font-semibold bg-black text-zinc-200 border border-cyan-500 rounded px-1 py-0 w-24 outline-none"}):/*#__PURE__*/React.createElement("span",{className:"text-xs font-semibold text-zinc-300 truncate max-w-[80px] cursor-text hover:text-cyan-300 transition-colors",title:"Click to rename",onClick:e=>{e.stopPropagation();setEditingTrackName(vTrack.id);setEditNameInput(vTrack.name);}},vTrack.name)),/*#__PURE__*/React.createElement("div",{className:"flex items-center gap-1"},/*#__PURE__*/React.createElement("button",{onClick:e=>{e.stopPropagation();toggleTrackMute(vTrack.id);if(window.__applyTrackMuteSolo)window.__applyTrackMuteSolo(vTrack.id,{muted:!vTrack.muted});},className:`px-1.5 py-0.5 text-xs rounded font-mono font-bold border ${vTrack.muted?'bg-red-950 text-red-400 border-red-700':'bg-zinc-800 text-zinc-400 border-transparent hover:text-zinc-200'}`},"M"),/*#__PURE__*/React.createElement("button",{onClick:e=>{e.stopPropagation();toggleTrackSoloEvaluate(vTrack.id);if(window.__applyTrackMuteSolo)window.__applyTrackMuteSolo(vTrack.id,{solo:!vTrack.solo});},className:`px-1.5 py-0.5 text-xs rounded font-mono font-bold border ${vTrack.solo?'bg-amber-950 text-amber-400 border-amber-600':'bg-zinc-800 text-zinc-400 border-transparent hover:text-zinc-200'}`},"S"))),/*#__PURE__*/React.createElement("div",{className:"flex flex-col gap-2.5 text-[14px] mb-3"},/*#__PURE__*/React.createElement("div",{className:"flex items-center gap-1",onWheel:e=>{e.preventDefault();const steps=wheelSteps('vol:'+vTrack.id,e.deltaY,e.deltaMode,100);if(!steps)return;const nv=Math.max(-50,Math.min(7,(vTrack.volumeDb??0)+steps*0.5));updateTrackVolumeDb(vTrack.id,nv);},onDoubleClick:e=>{e.stopPropagation();updateTrackVolumeDb(vTrack.id,0);},},/*#__PURE__*/React.createElement("span",{className:"w-10 text-right text-zinc-500 text-[14px]"},"Vol:"),/*#__PURE__*/React.createElement("input",{type:"range",min:"-50",max:"7",step:"0.5",id:`tcp-vol-${st.id}`,value:vTrack.volumeDb??0,onChange:e=>updateTrackVolumeDb(vTrack.id,parseFloat(e.target.value)),className:"flex-1 h-1 bg-zinc-700 rounded-lg appearance-none cursor-pointer accent-cyan-500",style:{height:'4px'}}),/*#__PURE__*/React.createElement("span",{className:"w-16 text-right font-mono text-zinc-300 text-[14px]",id:`tcp-vol-label-${st.id}`},vTrack.volumeDb??0,"dB")),/*#__PURE__*/React.createElement("div",{className:"flex items-center gap-1",onWheel:e=>{e.preventDefault();const steps=wheelSteps('pan:'+vTrack.id,e.deltaY,e.deltaMode,100);if(!steps)return;const np=Math.max(-100,Math.min(100,(vTrack.pan??0)+steps*5));updateTrackPan(vTrack.id,np);},onDoubleClick:e=>{e.stopPropagation();updateTrackPan(vTrack.id,0);},},/*#__PURE__*/React.createElement("span",{className:"w-10 text-right text-zinc-500 text-[14px]"},"Pan:"),/*#__PURE__*/React.createElement("input",{type:"range",min:"-100",max:"100",step:"1",id:`tcp-pan-${st.id}`,value:vTrack.pan??0,onChange:e=>updateTrackPan(vTrack.id,parseInt(e.target.value)),className:"flex-1 h-1 bg-zinc-700 rounded-lg appearance-none cursor-pointer accent-purple-500",style:{height:'4px'}}),/*#__PURE__*/React.createElement("span",{className:"w-16 text-right font-mono text-zinc-300 text-[14px]",id:`tcp-pan-label-detailed-${st.id}`},vTrack.pan>0?'R'+vTrack.pan:vTrack.pan<0?'L'+Math.abs(vTrack.pan):'C')),/*#__PURE__*/React.createElement("div",{className:"flex items-center gap-1.5 text-[14px]"},/*#__PURE__*/React.createElement("button",{onClick:()=>setSubTabs(prev=>prev.map(s=>s.id===st.id?{...s,isLooping:!s.isLooping}:s)),className:`px-2 py-0.5 text-[14px] rounded border font-bold ${st.isLooping?'bg-amber-700 text-white border-amber-500':'bg-zinc-800 text-zinc-400 border-zinc-700'}`},/*#__PURE__*/React.createElement("span",{className:"inline-flex items-center shrink-0"},/*#__PURE__*/React.createElement("i",{"data-lucide":"repeat",className:"w-3.5 h-3.5"}))),/*#__PURE__*/React.createElement("button",{onClick:()=>updateSubTabEffects(st.id,{reverse:!(st.effects||{}).reverse}),className:`px-2 py-0.5 rounded border text-[14px] font-bold ${(st.effects||{}).reverse?'bg-zinc-600 text-white border-zinc-500':'bg-zinc-800 text-zinc-400 border-zinc-700'} flex items-center justify-center`,title:"Reverse"},/*#__PURE__*/React.createElement("span",{className:"inline-flex items-center shrink-0"},/*#__PURE__*/React.createElement("i",{"data-lucide":"arrow-left-right",className:"w-3.5 h-3.5"}))),/*#__PURE__*/React.createElement("span",{className:"w-10 text-right text-zinc-500 text-[14px]"},"Loop:"),/*#__PURE__*/React.createElement("input",{type:"number",min:"0",max:"999",value:st.loopCount||0,onChange:e=>setSubTabs(prev=>prev.map(s=>s.id===st.id?{...s,loopCount:Math.max(0,parseInt(e.target.value)||0)}:s)),className:"w-12 bg-black text-amber-300 text-[14px] px-1 py-0.5 rounded border border-zinc-700 text-center font-mono",title:"Loop count"}))),/*#__PURE__*/React.createElement("div",{className:"flex items-center justify-between text-[14px] text-zinc-500 mb-1 font-semibold uppercase mt-2"},/*#__PURE__*/React.createElement("span",null,"DSP"),/*#__PURE__*/React.createElement("span",{className:"font-mono text-zinc-600 text-[11px] normal-case"},"áp dụng vùng chọn / cả clip")),/*#__PURE__*/React.createElement("div",{className:"grid grid-cols-3 gap-1 mb-2"},/*#__PURE__*/React.createElement("button",{onClick:()=>applySubTabEffect(st.id,'invert_phase',0),className:"py-1 bg-sky-900 hover:bg-sky-800 text-sky-200 font-bold rounded text-[14px] border border-sky-700 flex items-center justify-center gap-1"},/*#__PURE__*/React.createElement("span",{className:"inline-flex items-center shrink-0"},/*#__PURE__*/React.createElement("i",{"data-lucide":"arrow-down-up",className:"w-3 h-3"})),"Phase Inv"),/*#__PURE__*/React.createElement("button",{onClick:()=>applySubTabEffect(st.id,'swap_channels',0),className:"py-1 bg-sky-900 hover:bg-sky-800 text-sky-200 font-bold rounded text-[14px] border border-sky-700 flex items-center justify-center gap-1"},/*#__PURE__*/React.createElement("span",{className:"inline-flex items-center shrink-0"},/*#__PURE__*/React.createElement("i",{"data-lucide":"shuffle",className:"w-3 h-3"})),"Swap L/R"),/*#__PURE__*/React.createElement("button",{onClick:()=>applySubTabEffect(st.id,'reverse',0),className:"py-1 bg-sky-900 hover:bg-sky-800 text-sky-200 font-bold rounded text-[14px] border border-sky-700 flex items-center justify-center gap-1"},/*#__PURE__*/React.createElement("span",{className:"inline-flex items-center shrink-0"},/*#__PURE__*/React.createElement("i",{"data-lucide":"arrow-left-right",className:"w-3 h-3"})),"Reverse")),/*#__PURE__*/React.createElement("div",{className:"flex gap-1 justify-between my-2.5"},/*#__PURE__*/React.createElement("div",{className:"flex flex-col items-center bg-zinc-900/60 p-1.5 rounded border border-zinc-800 flex-1"},/*#__PURE__*/React.createElement("span",{className:"text-[14px] font-bold text-zinc-400 uppercase tracking-tighter",title:"Normalize"},"Norm"),/*#__PURE__*/React.createElement("input",{type:"range",min:"-12",max:"0",step:"0.1",value:subTabNormVal,onChange:e=>setSubTabNormVal(parseFloat(e.target.value)),style:{writingMode:'vertical-lr',direction:'rtl',height:'120px',width:'20px',accentColor:'#a1a1aa'},className:"my-2 cursor-pointer"}),/*#__PURE__*/React.createElement("span",{className:"text-[14px] font-mono text-zinc-300 font-bold"},subTabNormVal,"dB"),/*#__PURE__*/React.createElement("button",{onClick:()=>applySubTabEffect(st.id,'normalize',subTabNormVal),className:"mt-1.5 px-1 py-1 bg-zinc-700 hover:bg-zinc-600 text-zinc-100 rounded text-[14px] font-bold w-full uppercase border border-zinc-650"},"Apply")),/*#__PURE__*/React.createElement("div",{className:"flex flex-col items-center bg-zinc-900/60 p-1.5 rounded border border-zinc-800 flex-1"},/*#__PURE__*/React.createElement("span",{className:"text-[14px] font-bold text-zinc-400 uppercase tracking-tighter",title:"Pitch Shift"},"Pitch"),/*#__PURE__*/React.createElement("input",{type:"range",min:"-12",max:"12",step:"0.5",value:subTabPitchVal,onChange:e=>setSubTabPitchVal(parseFloat(e.target.value)),style:{writingMode:'vertical-lr',direction:'rtl',height:'120px',width:'20px',accentColor:'#a1a1aa'},className:"my-2 cursor-pointer"}),/*#__PURE__*/React.createElement("span",{className:"text-[14px] font-mono text-zinc-300 font-bold"},subTabPitchVal>0?'+':'',subTabPitchVal,"st"),/*#__PURE__*/React.createElement("button",{onClick:()=>applySubTabEffect(st.id,'pitch',subTabPitchVal),className:"mt-1.5 px-1 py-1 bg-zinc-700 hover:bg-zinc-600 text-zinc-100 rounded text-[14px] font-bold w-full uppercase border border-zinc-650"},"Apply")),/*#__PURE__*/React.createElement("div",{className:"flex flex-col items-center bg-zinc-900/60 p-1.5 rounded border border-zinc-800 flex-1"},/*#__PURE__*/React.createElement("span",{className:"text-[14px] font-bold text-zinc-400 uppercase tracking-tighter",title:"Gain Multiplier"},"Gain"),/*#__PURE__*/React.createElement("input",{type:"range",min:"0",max:"150",step:"1",value:subTabGainVal,onChange:e=>setSubTabGainVal(parseInt(e.target.value)),style:{writingMode:'vertical-lr',direction:'rtl',height:'120px',width:'20px',accentColor:'#a1a1aa'},className:"my-2 cursor-pointer"}),/*#__PURE__*/React.createElement("span",{className:"text-[14px] font-mono text-zinc-300 font-bold"},subTabGainVal,"%"),/*#__PURE__*/React.createElement("button",{onClick:()=>applySubTabEffect(st.id,'gain',subTabGainVal),className:"mt-1.5 px-1 py-1 bg-zinc-700 hover:bg-zinc-600 text-zinc-100 rounded text-[14px] font-bold w-full uppercase border border-zinc-650"},"Apply"))),/*#__PURE__*/React.createElement("div",{className:"flex-1"}),/*#__PURE__*/React.createElement("div",{className:"mt-auto pt-2.5 border-t border-zinc-800"},/*#__PURE__*/React.createElement("div",{className:"flex items-center justify-between text-[14px] text-zinc-500 mb-1 font-semibold uppercase"},/*#__PURE__*/React.createElement("span",null,"Duration:"),/*#__PURE__*/React.createElement("span",{className:"font-mono text-zinc-300"},st.buffer?formatTime(subTabDuration):'0s')),/*#__PURE__*/React.createElement("div",{className:"flex items-center justify-between text-[14px] text-zinc-500 mb-2.5 font-semibold uppercase"},/*#__PURE__*/React.createElement("span",null,"SR:"),/*#__PURE__*/React.createElement("span",{className:"font-mono text-zinc-300"},st.buffer?st.buffer.sampleRate:0," Hz")),/*#__PURE__*/React.createElement("div",{className:"grid grid-cols-2 gap-1 mb-2"},/*#__PURE__*/React.createElement("button",{onClick:async e=>{subTabAiTrackIdRef.current=st.trackId;handleAIScan();},disabled:analysisState.isRunning,className:"py-1 bg-purple-900 hover:bg-purple-800 text-purple-100 font-bold rounded text-xs border border-purple-700 flex items-center justify-center gap-1"},/*#__PURE__*/React.createElement("span",{className:"inline-flex items-center shrink-0"},/*#__PURE__*/React.createElement("i",{"data-lucide":"map-pin",className:"w-3 h-3"}))," Scan"),/*#__PURE__*/React.createElement("button",{onClick:async e=>{subTabAiTrackIdRef.current=st.trackId;handleAICutToNewTrack();},disabled:analysisState.isRunning,className:"py-1 bg-fuchsia-800 hover:bg-fuchsia-700 text-white font-bold rounded text-xs flex items-center justify-center gap-1"},/*#__PURE__*/React.createElement("span",{className:"inline-flex items-center shrink-0"},/*#__PURE__*/React.createElement("i",{"data-lucide":"scissors",className:"w-3 h-3"}))," Cut"),/*#__PURE__*/React.createElement("button",{onClick:async e=>{subTabAiTrackIdRef.current=st.trackId;if(st.buffer){setSelectionRangeOnBuffer(st.buffer,st.selectionStart||0,st.selectionEnd||st.buffer.duration);}handleAIAnalysicLoop();},disabled:analysisState.isRunning,className:"py-1 bg-violet-800 hover:bg-violet-700 text-violet-100 font-bold rounded text-xs border border-violet-600 flex items-center justify-center gap-1 col-span-2"},/*#__PURE__*/React.createElement("span",{className:"inline-flex items-center shrink-0"},/*#__PURE__*/React.createElement("i",{"data-lucide":"sparkles",className:"w-3 h-3"}))," AI Analysic Loop")),/*#__PURE__*/React.createElement("button",{onClick:()=>exportSubTabBuffer(st.id),className:"w-full py-1.5 mb-1.5 bg-blue-700 hover:bg-blue-600 text-white font-bold rounded text-[14px] flex items-center justify-center gap-1 transition"},/*#__PURE__*/React.createElement("span",{className:"inline-flex items-center shrink-0"},/*#__PURE__*/React.createElement("i",{"data-lucide":"download",className:"w-4 h-4"}))," Export"),/*#__PURE__*/React.createElement("button",{onClick:()=>applySubTab(st.id),className:"w-full py-1.5 bg-emerald-700 hover:bg-emerald-600 text-white font-bold rounded text-[14px] flex items-center justify-center gap-1 transition"},/*#__PURE__*/React.createElement("span",{className:"inline-flex items-center shrink-0"},/*#__PURE__*/React.createElement("i",{"data-lucide":"save",className:"w-4 h-4"}))," Save"))):/*#__PURE__*/React.createElement("div",{className:"flex-1 flex items-center justify-center text-xs text-zinc-500"},"Track not found")),/*#__PURE__*/React.createElement("div",{className:"w-1 cursor-ew-resize hover:bg-cyan-500/50 active:bg-cyan-400 transition-colors shrink-0 z-10",onMouseDown:startTcpResize}),/*#__PURE__*/React.createElement("div",{ref:handleTimelineWrapperRef,className:"flex-1 relative z-10 overflow-x-auto overflow-y-auto min-w-0"},/*#__PURE__*/React.createElement("div",{style:{width:`${subTabTimelineWidth}px`},className:"relative flex flex-col min-h-full"},/*#__PURE__*/React.createElement("div",{className:"sticky top-0 z-30 bg-[#1a1a1a]"},/*#__PURE__*/React.createElement(TimelineRuler,{bpm:parseInt(bpm)||120,zoom:zoom,timelineWidth:subTabTimelineWidth,viewportWidth:viewportWidth,onPlayheadSet:setCurrentTime,snapValue:snapValue,onRulerMouseDown:e=>{setSelectionFollowsTempo(false);const wrapper=timelineWrapperRef.current;if(!wrapper)return;const rect=wrapper.getBoundingClientRect();const sl=wrapper.scrollLeft;const raw=Math.max(0,(e.clientX-rect.left+sl)/zoom);const t=snapValue!=='free'?snapTime(raw,snapValue,bpm):raw;if(e.ctrlKey){e.preventDefault();e.stopPropagation();setSubTabs(prev=>prev.map(s=>s.id===activeTab?{...s,selectionStart:null,selectionEnd:null}:s));return;}if(e.shiftKey){e.preventDefault();e.stopPropagation();}handlePlayheadSet(t);subTabDragStartRef.current=t;isDraggingSubTabRef.current=true;},scrollLeft:scrollLeft,canvasRedrawCount:canvasRedrawCount})),/*#__PURE__*/React.createElement("div",{className:"flex-1 flex flex-col relative bg-[#111111] min-h-full"},vTrack&&/*#__PURE__*/React.createElement("div",{style:{height:`${subTabHeight}px`},className:"relative overflow-hidden border-2 border-purple-500/40 rounded bg-[#151515] mx-1 mt-1 shrink-0"},/*#__PURE__*/React.createElement(SubTabWaveform,{buffer:st.buffer,subTabId:st.id,activeTab:activeTab,activeTool:activeTool,currentTime:st.currentTime,selectionStart:st.selectionStart,selectionEnd:st.selectionEnd,onSelectRange:(start,end)=>setSubTabs(prev=>prev.map(s=>s.id===st.id?{...s,selectionStart:start,selectionEnd:end}:s)),onPlayheadSet:time=>setSubTabs(prev=>prev.map(s=>s.id===st.id?{...s,currentTime:time}:s)),onContextMenu:(e,clickTime)=>setContextMenu({x:e.clientX,y:e.clientY,isSubTab:true,subTabId:st.id,time:clickTime}),zoom:zoom,timelineWidth:subTabTimelineWidth,color:vTrack.color,name:vTrack.name,speed:st.speed||1.0,volumeNodes:st.volumeNodes||[],panningNodes:st.panningNodes||[],fadeInLen:st.fadeInLen||0,fadeOutLen:st.fadeOutLen||0,graphMode:st.graphMode,channelInfo:st.channelInfo,selectedNodeTime:subTabSelectedNodeTime,setSelectedNodeTime:setSubTabSelectedNodeTime,onUpdateNodes:nodes=>setSubTabs(prev=>prev.map(s=>s.id===st.id?{...s,[s.graphMode==='pan'?'panningNodes':'volumeNodes']:nodes}:s)),onUpdateFade:fade=>setSubTabs(prev=>prev.map(s=>s.id===st.id?{...s,fadeInLen:fade.fadeInLen??s.fadeInLen,fadeOutLen:fade.fadeOutLen??s.fadeOutLen}:s)),onModeToggle:()=>setSubTabs(prev=>prev.map(s=>s.id===st.id?{...s,graphMode:s.graphMode==='pan'?null:'pan'}:s)),onSpeedChange:newSpeed=>{setSubTabs(prev=>prev.map(s=>{if(s.id!==st.id)return s;const oldSpeed=s.speed||1.0;const ratio=oldSpeed/newSpeed;const newVolumeNodes=(s.volumeNodes||[]).map(n=>({...n,time:n.time*ratio}));const newPanningNodes=(s.panningNodes||[]).map(n=>({...n,time:n.time*ratio}));return{...s,speed:newSpeed,volumeNodes:newVolumeNodes,panningNodes:newPanningNodes,fadeInLen:(s.fadeInLen||0)*ratio,fadeOutLen:(s.fadeOutLen||0)*ratio,currentTime:(s.currentTime||0)*ratio,label:s.label.replace(/\s\(\d+%\)$/,'')+` (${Math.round(newSpeed*100)}%)`};}));const n=activeTrackNodesRef.current[st.trackId];if(n&&n.source)n.source.playbackRate.value=newSpeed;// Reset time refs to prevent playhead jump when speed changes mid-playback +if(window.__mediaExplorerDragFile){const f=await resolveMediaExplorerDropFile();window.__mediaExplorerDragFile=null;if(f)loadFileOnTrack(track.id,f);return;}const f=e.dataTransfer.files&&e.dataTransfer.files[0];if(!f)return;loadFileOnTrack(track.id,f);},onMouseEnter:()=>{setHoveredTrackId(track.id);hoveredTrackIdRef.current=track.id;}},/*#__PURE__*/React.createElement(WaveformLane,{track:track,zoom:zoom,timelineWidth:timelineWidth,viewportWidth:viewportWidth,scrollLeft:scrollLeft,onSelectRange:handleSelectRange,onPlayheadSet:handlePlayheadSet,isSelected:isSelected,selectedItemIds:selectedItemIds,onSelectTrack:setSelectedTrackId,markers:track.markers,onTrackLaneMouseDown:handleTrackLaneMouseDown,onClearSelection:()=>{captureSelectionUndo();setSelectedItemIds(new Set());},onSweepSelectStart:handleSweepSelectStart,onDeselectItem:handleDeselectItem,onAddToSelection:handleAddToSelection,onSetPendingDrag:handleSetPendingDrag,onSetPendingDragMove:handleSetPendingDragMove,onContextMenu:handleContextMenu,onClipDragStart:handleClipDragStart,onClipStretchStart:handleClipStretchStart,onSectionItemDragStart:handleSectionItemDragStart,onSectionItemResizeStart:handleSectionItemResizeStart,onSelectionEdgeDragStart:handleSelectionEdgeDragStart,setSelectedClipId:setSelectedClipId,selectedClipId:selectedClipId,activeTool:activeTool,onSplitTrackAtTime:handleSplitTrackAtTime,onEditClipInSubTab:handleEditClipInSubTab,onEditSectionInTab:handleEditSectionInTab,onEditMidiInTab:handleEditMidiInTab,snapValue:snapValue,bpm:bpm,selectionMode:selectionMode,localSelectionTrackId:localSelectionTrackId,localSelectionStart:localSelectionStart,currentTime:currentTime,getLocalAnchor:()=>localSelectionAnchorRef.current,onClearLocalSelection:()=>{captureSelectionUndo();clearLocalSelection();},onSetSelectionMode:mode=>{captureSelectionUndo();setSelectionMode(mode);},onSetSelectionStart:val=>{captureSelectionUndo();setSelectionStart(val);},onSetSelectionEnd:val=>{captureSelectionUndo();setSelectionEnd(val);},onSetCurrentTime:setCurrentTime,onSetLocalSelectionTrackId:setLocalSelectionTrackId,onSetLocalSelectionStart:setLocalSelectionStart,onSetLocalSelectionEnd:setLocalSelectionEnd,localSelLeft:localSelectionStart!==null&&localSelectionEnd!==null?Math.min(localSelectionStart,localSelectionEnd):null,localSelRight:localSelectionStart!==null&&localSelectionEnd!==null?Math.max(localSelectionStart,localSelectionEnd):null,scrollLeft:scrollLeft,recordingState:recordingState,recTempMidiNotes:recTempMidiNotes,recTempAudioBuffer:recTempAudioBuffer,recStartTimelineTime:recStartTimelineTime,canvasRedrawCount:canvasRedrawCount}),selectionMode==='local'&&localSelectionTrackId===track.id&&localSelectionStart!==null&&localSelectionEnd!==null&&Math.abs(localSelectionEnd-localSelectionStart)>0&&/*#__PURE__*/React.createElement("div",{className:"absolute top-0 bottom-0 border-l border-r border-amber-400 bg-amber-500/20 z-20 pointer-events-none",style:{left:`${Math.min(localSelectionStart,localSelectionEnd)*zoom}px`,width:`${Math.abs(localSelectionEnd-localSelectionStart)*zoom}px`}},/*#__PURE__*/React.createElement("div",{className:"absolute -left-[1px] top-0 bottom-0 w-[2px] bg-amber-400 z-30 pointer-events-auto cursor-ew-resize",onMouseDown:e=>handleHandleDragStart(e,'left')}),/*#__PURE__*/React.createElement("div",{className:"absolute -right-[1px] top-0 bottom-0 w-[2px] bg-amber-400 z-30 pointer-events-auto cursor-ew-resize",onMouseDown:e=>handleHandleDragStart(e,'right')})),sweepSelect&&/*#__PURE__*/React.createElement("div",{className:"absolute top-0 bottom-0 border-l border-r border-amber-400 bg-amber-500/10 z-20 pointer-events-none",style:{left:`${Math.min(sweepSelect.startTime,sweepSelect.endTime)*zoom}px`,width:`${Math.abs(sweepSelect.endTime-sweepSelect.startTime)*zoom}px`}}),track.buffer&&/*#__PURE__*/React.createElement("div",{className:"absolute right-2 top-2 flex items-center gap-1 z-10 opacity-70 hover:opacity-100"},/*#__PURE__*/React.createElement("button",{onClick:()=>handleSplitTrack(track.id),className:"px-1.5 py-0.5 bg-zinc-900/95 text-zinc-300 rounded text-xs flex items-center gap-1 border border-zinc-700/50"},/*#__PURE__*/React.createElement("span",{className:"inline-flex items-center shrink-0"},/*#__PURE__*/React.createElement("i",{"data-lucide":"scissors",className:"w-2.5 h-2.5 text-cyan-400"}))," Cắt")),/*#__PURE__*/React.createElement("div",{onMouseDown:e=>handleTrackResizeMouseDown(e,track.id),className:"absolute bottom-0 left-0 right-0 h-1 cursor-ns-resize z-30 hover:bg-cyan-500/50 transition-colors",onClick:e=>e.stopPropagation()}));}),/*#__PURE__*/React.createElement("div",{className:"h-[48px] flex items-center justify-center text-xs text-zinc-500 hover:bg-zinc-900/20 cursor-pointer select-none border-t border-dashed border-zinc-800",onMouseEnter:()=>{if(draggedClipRef.current||draggedSectionItemRef.current){setHoveredTrackId(addNewTrack());}},onClick:addNewTrack},/*#__PURE__*/React.createElement("span",{className:"flex items-center gap-1 text-zinc-400"},/*#__PURE__*/React.createElement("span",{className:"inline-flex items-center shrink-0"},/*#__PURE__*/React.createElement("i",{"data-lucide":"plus",className:"w-3.5 h-3.5"}))," Kéo clip xuống hoặc Click tạo Track")),selectionMode==='global'&&selLeft!==null&&selRight!==null&&selRight>selLeft&&/*#__PURE__*/React.createElement("div",{className:"absolute top-0 bottom-0 border-l border-r border-amber-500 bg-amber-500/10 z-20 selection-interactive-box cursor-grab active:cursor-grabbing",style:{left:`${selLeft*zoom}px`,width:`${(selRight-selLeft)*zoom}px`},onMouseDown:handleSelectionBodyDragStart},/*#__PURE__*/React.createElement("div",{className:"absolute -left-[1px] top-0 bottom-0 w-[1px] bg-amber-500 hover:bg-amber-400 cursor-ew-resize z-30",onMouseDown:e=>handleHandleDragStart(e,'left')}),/*#__PURE__*/React.createElement("div",{className:"absolute -right-[1px] top-0 bottom-0 w-[1px] bg-amber-500 hover:bg-amber-400 cursor-ew-resize z-30",onMouseDown:e=>handleHandleDragStart(e,'right')})),/*#__PURE__*/React.createElement("div",{className:"absolute top-0 bottom-0 w-[2px] bg-[#ef4444] z-20 pointer-events-none",style:{left:`${playheadLeftPos}px`}},/*#__PURE__*/React.createElement("div",{className:"w-3 h-3 bg-[#ef4444] rotate-45 transform -translate-x-1/2 -translate-y-1/2 absolute top-0"})))))):(()=>{const st=subTabs.find(s=>s.id===activeTab);if(!st)return null;if(st.type==='PIANO_ROLL'){return/*#__PURE__*/React.createElement(PianoRollTabEditor,{st:st,zoom:zoom,bpm:bpm,viewportWidth:viewportWidth,activeTracks:activeTracks,onClose:()=>closeSubTab(st.id),onUpdateNotes:handleUpdateMidiNotes,onSaveNotes:handleSaveMidiNotes,setSubTabs:setSubTabs,onPlayPause:handlePlayPause,onStop:()=>stopAllPlayback(true),isPlaying:isPlaying,playPreviewNote:playMidiPreviewNote,showToast:showToast,midiDevices:midiDevices,recordingState:recordingState,recTempMidiNotes:recTempMidiNotes,onRecord:handleRecordClick,selectedMidiInputId:selectedMidiInputId,onMidiInputSelect:handleMidiInputSelect,activeMidiPitches:activeMidiPitches,onInstrumentSelect:trackId=>{openInstrumentSelector(trackId);},onRealtimePlay:handlePianoRollRealtimePlay,onCopyNotes:n=>setPianoRollClipboard(JSON.parse(JSON.stringify(n||[]))),clipboardNotes:pianoRollClipboard,onExportMidiAudio:handleExportMidiAudio,onRescheduleMidi:updatedNotes=>{const playingSub=subTabs.find(s=>s.id===activeTab&&s.type==='PIANO_ROLL'&&s.isPlaying);if(playingSub){const offset=playingSub.currentTime||0;const ctx=getAudioContext();const tNode=activeTrackNodesRef.current[playingSub.trackId];if(tNode&&tNode.gainNode){tNode.gainNode.gain.setValueAtTime(tNode.gainNode.gain.value||1,ctx.currentTime);tNode.gainNode.gain.linearRampToValueAtTime(0.001,ctx.currentTime+0.04);}setTimeout(()=>{window.SonicSF.stopAll();stopAllNativeSfNotes();stopAllNativeVstNotes();if(tNode&&tNode.gainNode){const trackData=activeTracksRef.current?activeTracksRef.current.find(t=>t.id===playingSub.trackId):null;const volDb=trackData?trackData.volumeDb??0:0;const volLinear=volDb<=-50?0:Math.pow(10,volDb/20);tNode.gainNode.gain.setValueAtTime(0.001,ctx.currentTime);tNode.gainNode.gain.linearRampToValueAtTime(volLinear||0.8,ctx.currentTime+0.015);}startOffsetTimeRef.current=offset;startAudioTimeRef.current=ctx.currentTime;startBufferOffsetRef.current=offset*(playingSub.speed||1.0);schedulePianoRollMidi(playingSub,offset,updatedNotes);},50);}},onSeekPlayhead:clickTime=>{const seekSt=subTabs.find(s=>s.id===activeTab&&s.type==='PIANO_ROLL');if(!seekSt)return;if(seekSt.isPlaying){stopAllPlayback();window.SonicSF.stopAll();stopAllNativeSfNotes();stopAllNativeVstNotes();setSubTabs(prev=>prev.map(s=>s.id===seekSt.id?{...s,currentTime:clickTime,isPlaying:true}:s));const ctx=getAudioContext();startOffsetTimeRef.current=clickTime;startAudioTimeRef.current=ctx.currentTime;startBufferOffsetRef.current=clickTime*(seekSt.speed||1.0);schedulePianoRollMidi(seekSt,clickTime);startSubTabPlayback(seekSt,clickTime);}else{setSubTabs(prev=>prev.map(s=>s.id===seekSt.id?{...s,currentTime:clickTime}:s));}}});}const subTrack=tracks.find(t=>t.id===st.trackId);const vTrack=subTrack?{...subTrack,buffer:st.buffer,isSubTab:true}:null;const subTabDuration=st.type==='PIANO_ROLL'?(()=>{const notes=st.notes||[];const beatSec=60.0/(parseFloat(bpm)||120);let maxEnd=0;notes.forEach(n=>{const end=(n.start_beat||0)+(n.duration_beats||1);if(end>maxEnd)maxEnd=end;});return maxEnd*beatSec+1.0;})():st.buffer&&'duration'in st.buffer?st.buffer.duration:4.0;const subTabTimelineWidth=Math.max(zoom*subTabDuration,viewportWidth);return/*#__PURE__*/React.createElement(React.Fragment,null,/*#__PURE__*/React.createElement("div",{className:"shrink-0 z-30 bg-[#262626] overflow-y-scroll no-scrollbar flex flex-col border-r border-zinc-900",style:{width:tcpWidth+'px',scrollbarWidth:'none',msOverflowStyle:'none'}},/*#__PURE__*/React.createElement("div",{className:"sticky top-0 z-50 flex items-center h-10 border-b border-zinc-900 bg-[#242424] px-2 justify-between shrink-0"},/*#__PURE__*/React.createElement("span",{className:"text-xs font-bold text-zinc-500 uppercase"},"Sub-Tab"),/*#__PURE__*/React.createElement("button",{onClick:()=>closeSubTab(st.id),className:"px-1.5 py-0.5 text-xs bg-zinc-800 hover:bg-zinc-700 text-zinc-400 rounded border border-zinc-700 flex items-center gap-1"},/*#__PURE__*/React.createElement("span",{className:"inline-flex items-center shrink-0"},/*#__PURE__*/React.createElement("i",{"data-lucide":"x",className:"w-3 h-3"}))," Close")),vTrack?/*#__PURE__*/React.createElement("div",{key:vTrack.id,className:"flex-1 flex flex-col p-2.5 bg-[#1e1e1e] border-r border-zinc-900 border-l-4 border-l-cyan-500"},/*#__PURE__*/React.createElement("div",{className:"flex items-center justify-between mb-2"},/*#__PURE__*/React.createElement("div",{className:"flex items-center gap-2"},/*#__PURE__*/React.createElement("label",{className:"cursor-pointer relative block"},/*#__PURE__*/React.createElement("input",{type:"color",value:vTrack.color||'#0f766e',onClick:e=>e.stopPropagation(),onMouseDown:e=>e.stopPropagation(),onChange:e=>{e.stopPropagation();updateTrackColor(vTrack.id,e.target.value);},className:"absolute inset-0 w-full h-full opacity-0 cursor-pointer"}),/*#__PURE__*/React.createElement("div",{className:"w-3 h-3 rounded-full border border-zinc-600 hover:scale-110 transition-transform",style:{backgroundColor:vTrack.color}})),editingTrackName===vTrack.id?/*#__PURE__*/React.createElement("input",{type:"text",value:editNameInput,autoFocus:true,onChange:e=>setEditNameInput(e.target.value),onBlur:()=>{updateTrackName(vTrack.id,editNameInput||vTrack.name);setEditingTrackName(null);},onKeyDown:e=>{if(e.key==='Enter'){updateTrackName(vTrack.id,editNameInput||vTrack.name);setEditingTrackName(null);}if(e.key==='Escape')setEditingTrackName(null);},onClick:e=>e.stopPropagation(),className:"text-xs font-semibold bg-black text-zinc-200 border border-cyan-500 rounded px-1 py-0 w-24 outline-none"}):/*#__PURE__*/React.createElement("span",{className:"text-xs font-semibold text-zinc-300 truncate max-w-[80px] cursor-text hover:text-cyan-300 transition-colors",title:"Click to rename",onClick:e=>{e.stopPropagation();setEditingTrackName(vTrack.id);setEditNameInput(vTrack.name);}},vTrack.name)),/*#__PURE__*/React.createElement("div",{className:"flex items-center gap-1"},/*#__PURE__*/React.createElement("button",{onClick:e=>{e.stopPropagation();toggleTrackMute(vTrack.id);if(window.__applyTrackMuteSolo)window.__applyTrackMuteSolo(vTrack.id,{muted:!vTrack.muted});},className:`px-1.5 py-0.5 text-xs rounded font-mono font-bold border ${vTrack.muted?'bg-red-950 text-red-400 border-red-700':'bg-zinc-800 text-zinc-400 border-transparent hover:text-zinc-200'}`},"M"),/*#__PURE__*/React.createElement("button",{onClick:e=>{e.stopPropagation();toggleTrackSoloEvaluate(vTrack.id);if(window.__applyTrackMuteSolo)window.__applyTrackMuteSolo(vTrack.id,{solo:!vTrack.solo});},className:`px-1.5 py-0.5 text-xs rounded font-mono font-bold border ${vTrack.solo?'bg-amber-950 text-amber-400 border-amber-600':'bg-zinc-800 text-zinc-400 border-transparent hover:text-zinc-200'}`},"S"))),/*#__PURE__*/React.createElement("div",{className:"flex flex-col gap-2.5 text-[14px] mb-3"},/*#__PURE__*/React.createElement("div",{className:"flex items-center gap-1",onWheel:e=>{e.preventDefault();const steps=wheelSteps('vol:'+vTrack.id,e.deltaY,e.deltaMode,100);if(!steps)return;const nv=Math.max(-50,Math.min(7,(vTrack.volumeDb??0)+steps*0.5));updateTrackVolumeDb(vTrack.id,nv);},onDoubleClick:e=>{e.stopPropagation();updateTrackVolumeDb(vTrack.id,0);}},/*#__PURE__*/React.createElement("span",{className:"w-10 text-right text-zinc-500 text-[14px]"},"Vol:"),/*#__PURE__*/React.createElement("input",{type:"range",min:"-50",max:"7",step:"0.5",id:`tcp-vol-${st.id}`,value:vTrack.volumeDb??0,onChange:e=>updateTrackVolumeDb(vTrack.id,parseFloat(e.target.value)),className:"flex-1 h-1 bg-zinc-700 rounded-lg appearance-none cursor-pointer accent-cyan-500",style:{height:'4px'}}),/*#__PURE__*/React.createElement("span",{className:"w-16 text-right font-mono text-zinc-300 text-[14px]",id:`tcp-vol-label-${st.id}`},vTrack.volumeDb??0,"dB")),/*#__PURE__*/React.createElement("div",{className:"flex items-center gap-1",onWheel:e=>{e.preventDefault();const steps=wheelSteps('pan:'+vTrack.id,e.deltaY,e.deltaMode,100);if(!steps)return;const np=Math.max(-100,Math.min(100,(vTrack.pan??0)+steps*5));updateTrackPan(vTrack.id,np);},onDoubleClick:e=>{e.stopPropagation();updateTrackPan(vTrack.id,0);}},/*#__PURE__*/React.createElement("span",{className:"w-10 text-right text-zinc-500 text-[14px]"},"Pan:"),/*#__PURE__*/React.createElement("input",{type:"range",min:"-100",max:"100",step:"1",id:`tcp-pan-${st.id}`,value:vTrack.pan??0,onChange:e=>updateTrackPan(vTrack.id,parseInt(e.target.value)),className:"flex-1 h-1 bg-zinc-700 rounded-lg appearance-none cursor-pointer accent-purple-500",style:{height:'4px'}}),/*#__PURE__*/React.createElement("span",{className:"w-16 text-right font-mono text-zinc-300 text-[14px]",id:`tcp-pan-label-detailed-${st.id}`},vTrack.pan>0?'R'+vTrack.pan:vTrack.pan<0?'L'+Math.abs(vTrack.pan):'C')),/*#__PURE__*/React.createElement("div",{className:"flex items-center gap-1.5 text-[14px]"},/*#__PURE__*/React.createElement("button",{onClick:()=>setSubTabs(prev=>prev.map(s=>s.id===st.id?{...s,isLooping:!s.isLooping}:s)),className:`px-2 py-0.5 text-[14px] rounded border font-bold ${st.isLooping?'bg-amber-700 text-white border-amber-500':'bg-zinc-800 text-zinc-400 border-zinc-700'}`},/*#__PURE__*/React.createElement("span",{className:"inline-flex items-center shrink-0"},/*#__PURE__*/React.createElement("i",{"data-lucide":"repeat",className:"w-3.5 h-3.5"}))),/*#__PURE__*/React.createElement("button",{onClick:()=>updateSubTabEffects(st.id,{reverse:!(st.effects||{}).reverse}),className:`px-2 py-0.5 rounded border text-[14px] font-bold ${(st.effects||{}).reverse?'bg-zinc-600 text-white border-zinc-500':'bg-zinc-800 text-zinc-400 border-zinc-700'} flex items-center justify-center`,title:"Reverse"},/*#__PURE__*/React.createElement("span",{className:"inline-flex items-center shrink-0"},/*#__PURE__*/React.createElement("i",{"data-lucide":"arrow-left-right",className:"w-3.5 h-3.5"}))),/*#__PURE__*/React.createElement("span",{className:"w-10 text-right text-zinc-500 text-[14px]"},"Loop:"),/*#__PURE__*/React.createElement("input",{type:"number",min:"0",max:"999",value:st.loopCount||0,onChange:e=>setSubTabs(prev=>prev.map(s=>s.id===st.id?{...s,loopCount:Math.max(0,parseInt(e.target.value)||0)}:s)),className:"w-12 bg-black text-amber-300 text-[14px] px-1 py-0.5 rounded border border-zinc-700 text-center font-mono",title:"Loop count"}))),/*#__PURE__*/React.createElement("div",{className:"flex items-center justify-between text-[14px] text-zinc-500 mb-1 font-semibold uppercase mt-2"},/*#__PURE__*/React.createElement("span",null,"DSP"),/*#__PURE__*/React.createElement("span",{className:"font-mono text-zinc-600 text-[11px] normal-case"},"áp dụng vùng chọn / cả clip")),/*#__PURE__*/React.createElement("div",{className:"grid grid-cols-3 gap-1 mb-2"},/*#__PURE__*/React.createElement("button",{onClick:()=>applySubTabEffect(st.id,'invert_phase',0),className:"py-1 bg-sky-900 hover:bg-sky-800 text-sky-200 font-bold rounded text-[14px] border border-sky-700 flex items-center justify-center gap-1"},/*#__PURE__*/React.createElement("span",{className:"inline-flex items-center shrink-0"},/*#__PURE__*/React.createElement("i",{"data-lucide":"arrow-down-up",className:"w-3 h-3"})),"Phase Inv"),/*#__PURE__*/React.createElement("button",{onClick:()=>applySubTabEffect(st.id,'swap_channels',0),className:"py-1 bg-sky-900 hover:bg-sky-800 text-sky-200 font-bold rounded text-[14px] border border-sky-700 flex items-center justify-center gap-1"},/*#__PURE__*/React.createElement("span",{className:"inline-flex items-center shrink-0"},/*#__PURE__*/React.createElement("i",{"data-lucide":"shuffle",className:"w-3 h-3"})),"Swap L/R"),/*#__PURE__*/React.createElement("button",{onClick:()=>applySubTabEffect(st.id,'reverse',0),className:"py-1 bg-sky-900 hover:bg-sky-800 text-sky-200 font-bold rounded text-[14px] border border-sky-700 flex items-center justify-center gap-1"},/*#__PURE__*/React.createElement("span",{className:"inline-flex items-center shrink-0"},/*#__PURE__*/React.createElement("i",{"data-lucide":"arrow-left-right",className:"w-3 h-3"})),"Reverse")),/*#__PURE__*/React.createElement("div",{className:"flex gap-1 justify-between my-2.5"},/*#__PURE__*/React.createElement("div",{className:"flex flex-col items-center bg-zinc-900/60 p-1.5 rounded border border-zinc-800 flex-1"},/*#__PURE__*/React.createElement("span",{className:"text-[14px] font-bold text-zinc-400 uppercase tracking-tighter",title:"Normalize"},"Norm"),/*#__PURE__*/React.createElement("input",{type:"range",min:"-12",max:"0",step:"0.1",value:subTabNormVal,onChange:e=>setSubTabNormVal(parseFloat(e.target.value)),style:{writingMode:'vertical-lr',direction:'rtl',height:'120px',width:'20px',accentColor:'#a1a1aa'},className:"my-2 cursor-pointer"}),/*#__PURE__*/React.createElement("span",{className:"text-[14px] font-mono text-zinc-300 font-bold"},subTabNormVal,"dB"),/*#__PURE__*/React.createElement("button",{onClick:()=>applySubTabEffect(st.id,'normalize',subTabNormVal),className:"mt-1.5 px-1 py-1 bg-zinc-700 hover:bg-zinc-600 text-zinc-100 rounded text-[14px] font-bold w-full uppercase border border-zinc-650"},"Apply")),/*#__PURE__*/React.createElement("div",{className:"flex flex-col items-center bg-zinc-900/60 p-1.5 rounded border border-zinc-800 flex-1"},/*#__PURE__*/React.createElement("span",{className:"text-[14px] font-bold text-zinc-400 uppercase tracking-tighter",title:"Pitch Shift"},"Pitch"),/*#__PURE__*/React.createElement("input",{type:"range",min:"-12",max:"12",step:"0.5",value:subTabPitchVal,onChange:e=>setSubTabPitchVal(parseFloat(e.target.value)),style:{writingMode:'vertical-lr',direction:'rtl',height:'120px',width:'20px',accentColor:'#a1a1aa'},className:"my-2 cursor-pointer"}),/*#__PURE__*/React.createElement("span",{className:"text-[14px] font-mono text-zinc-300 font-bold"},subTabPitchVal>0?'+':'',subTabPitchVal,"st"),/*#__PURE__*/React.createElement("button",{onClick:()=>applySubTabEffect(st.id,'pitch',subTabPitchVal),className:"mt-1.5 px-1 py-1 bg-zinc-700 hover:bg-zinc-600 text-zinc-100 rounded text-[14px] font-bold w-full uppercase border border-zinc-650"},"Apply")),/*#__PURE__*/React.createElement("div",{className:"flex flex-col items-center bg-zinc-900/60 p-1.5 rounded border border-zinc-800 flex-1"},/*#__PURE__*/React.createElement("span",{className:"text-[14px] font-bold text-zinc-400 uppercase tracking-tighter",title:"Gain Multiplier"},"Gain"),/*#__PURE__*/React.createElement("input",{type:"range",min:"0",max:"150",step:"1",value:subTabGainVal,onChange:e=>setSubTabGainVal(parseInt(e.target.value)),style:{writingMode:'vertical-lr',direction:'rtl',height:'120px',width:'20px',accentColor:'#a1a1aa'},className:"my-2 cursor-pointer"}),/*#__PURE__*/React.createElement("span",{className:"text-[14px] font-mono text-zinc-300 font-bold"},subTabGainVal,"%"),/*#__PURE__*/React.createElement("button",{onClick:()=>applySubTabEffect(st.id,'gain',subTabGainVal),className:"mt-1.5 px-1 py-1 bg-zinc-700 hover:bg-zinc-600 text-zinc-100 rounded text-[14px] font-bold w-full uppercase border border-zinc-650"},"Apply"))),/*#__PURE__*/React.createElement("div",{className:"flex-1"}),/*#__PURE__*/React.createElement("div",{className:"mt-auto pt-2.5 border-t border-zinc-800"},/*#__PURE__*/React.createElement("div",{className:"flex items-center justify-between text-[14px] text-zinc-500 mb-1 font-semibold uppercase"},/*#__PURE__*/React.createElement("span",null,"Duration:"),/*#__PURE__*/React.createElement("span",{className:"font-mono text-zinc-300"},st.buffer?formatTime(subTabDuration):'0s')),/*#__PURE__*/React.createElement("div",{className:"flex items-center justify-between text-[14px] text-zinc-500 mb-2.5 font-semibold uppercase"},/*#__PURE__*/React.createElement("span",null,"SR:"),/*#__PURE__*/React.createElement("span",{className:"font-mono text-zinc-300"},st.buffer?st.buffer.sampleRate:0," Hz")),/*#__PURE__*/React.createElement("div",{className:"grid grid-cols-2 gap-1 mb-2"},/*#__PURE__*/React.createElement("button",{onClick:async e=>{subTabAiTrackIdRef.current=st.trackId;handleAIScan();},disabled:analysisState.isRunning,className:"py-1 bg-purple-900 hover:bg-purple-800 text-purple-100 font-bold rounded text-xs border border-purple-700 flex items-center justify-center gap-1"},/*#__PURE__*/React.createElement("span",{className:"inline-flex items-center shrink-0"},/*#__PURE__*/React.createElement("i",{"data-lucide":"map-pin",className:"w-3 h-3"}))," Scan"),/*#__PURE__*/React.createElement("button",{onClick:async e=>{subTabAiTrackIdRef.current=st.trackId;handleAICutToNewTrack();},disabled:analysisState.isRunning,className:"py-1 bg-fuchsia-800 hover:bg-fuchsia-700 text-white font-bold rounded text-xs flex items-center justify-center gap-1"},/*#__PURE__*/React.createElement("span",{className:"inline-flex items-center shrink-0"},/*#__PURE__*/React.createElement("i",{"data-lucide":"scissors",className:"w-3 h-3"}))," Cut"),/*#__PURE__*/React.createElement("button",{onClick:async e=>{subTabAiTrackIdRef.current=st.trackId;if(st.buffer){setSelectionRangeOnBuffer(st.buffer,st.selectionStart||0,st.selectionEnd||st.buffer.duration);}handleAIAnalysicLoop();},disabled:analysisState.isRunning,className:"py-1 bg-violet-800 hover:bg-violet-700 text-violet-100 font-bold rounded text-xs border border-violet-600 flex items-center justify-center gap-1 col-span-2"},/*#__PURE__*/React.createElement("span",{className:"inline-flex items-center shrink-0"},/*#__PURE__*/React.createElement("i",{"data-lucide":"sparkles",className:"w-3 h-3"}))," AI Analysic Loop")),/*#__PURE__*/React.createElement("button",{onClick:()=>exportSubTabBuffer(st.id),className:"w-full py-1.5 mb-1.5 bg-blue-700 hover:bg-blue-600 text-white font-bold rounded text-[14px] flex items-center justify-center gap-1 transition"},/*#__PURE__*/React.createElement("span",{className:"inline-flex items-center shrink-0"},/*#__PURE__*/React.createElement("i",{"data-lucide":"download",className:"w-4 h-4"}))," Export"),/*#__PURE__*/React.createElement("button",{onClick:()=>applySubTab(st.id),className:"w-full py-1.5 bg-emerald-700 hover:bg-emerald-600 text-white font-bold rounded text-[14px] flex items-center justify-center gap-1 transition"},/*#__PURE__*/React.createElement("span",{className:"inline-flex items-center shrink-0"},/*#__PURE__*/React.createElement("i",{"data-lucide":"save",className:"w-4 h-4"}))," Save"))):/*#__PURE__*/React.createElement("div",{className:"flex-1 flex items-center justify-center text-xs text-zinc-500"},"Track not found")),/*#__PURE__*/React.createElement("div",{className:"w-1 cursor-ew-resize hover:bg-cyan-500/50 active:bg-cyan-400 transition-colors shrink-0 z-10",onMouseDown:startTcpResize}),/*#__PURE__*/React.createElement("div",{ref:handleTimelineWrapperRef,className:"flex-1 relative z-10 overflow-x-auto overflow-y-auto min-w-0"},/*#__PURE__*/React.createElement("div",{style:{width:`${subTabTimelineWidth}px`},className:"relative flex flex-col min-h-full"},/*#__PURE__*/React.createElement("div",{className:"sticky top-0 z-30 bg-[#1a1a1a]"},/*#__PURE__*/React.createElement(TimelineRuler,{bpm:parseInt(bpm)||120,zoom:zoom,timelineWidth:subTabTimelineWidth,viewportWidth:viewportWidth,onPlayheadSet:setCurrentTime,snapValue:snapValue,onRulerMouseDown:e=>{setSelectionFollowsTempo(false);const wrapper=timelineWrapperRef.current;if(!wrapper)return;const rect=wrapper.getBoundingClientRect();const sl=wrapper.scrollLeft;const raw=Math.max(0,(e.clientX-rect.left+sl)/zoom);const t=snapValue!=='free'?snapTime(raw,snapValue,bpm):raw;if(e.ctrlKey){e.preventDefault();e.stopPropagation();setSubTabs(prev=>prev.map(s=>s.id===activeTab?{...s,selectionStart:null,selectionEnd:null}:s));return;}if(e.shiftKey){e.preventDefault();e.stopPropagation();}handlePlayheadSet(t);subTabDragStartRef.current=t;isDraggingSubTabRef.current=true;},scrollLeft:scrollLeft,canvasRedrawCount:canvasRedrawCount})),/*#__PURE__*/React.createElement("div",{className:"flex-1 flex flex-col relative bg-[#111111] min-h-full"},vTrack&&/*#__PURE__*/React.createElement("div",{style:{height:`${subTabHeight}px`},className:"relative overflow-hidden border-2 border-purple-500/40 rounded bg-[#151515] mx-1 mt-1 shrink-0"},/*#__PURE__*/React.createElement(SubTabWaveform,{buffer:st.buffer,subTabId:st.id,activeTab:activeTab,activeTool:activeTool,currentTime:st.currentTime,selectionStart:st.selectionStart,selectionEnd:st.selectionEnd,onSelectRange:(start,end)=>setSubTabs(prev=>prev.map(s=>s.id===st.id?{...s,selectionStart:start,selectionEnd:end}:s)),onPlayheadSet:time=>setSubTabs(prev=>prev.map(s=>s.id===st.id?{...s,currentTime:time}:s)),onContextMenu:(e,clickTime)=>setContextMenu({x:e.clientX,y:e.clientY,isSubTab:true,subTabId:st.id,time:clickTime}),zoom:zoom,timelineWidth:subTabTimelineWidth,color:vTrack.color,name:vTrack.name,speed:st.speed||1.0,volumeNodes:st.volumeNodes||[],panningNodes:st.panningNodes||[],fadeInLen:st.fadeInLen||0,fadeOutLen:st.fadeOutLen||0,graphMode:st.graphMode,channelInfo:st.channelInfo,selectedNodeTime:subTabSelectedNodeTime,setSelectedNodeTime:setSubTabSelectedNodeTime,onUpdateNodes:nodes=>setSubTabs(prev=>prev.map(s=>s.id===st.id?{...s,[s.graphMode==='pan'?'panningNodes':'volumeNodes']:nodes}:s)),onUpdateFade:fade=>setSubTabs(prev=>prev.map(s=>s.id===st.id?{...s,fadeInLen:fade.fadeInLen??s.fadeInLen,fadeOutLen:fade.fadeOutLen??s.fadeOutLen}:s)),onModeToggle:()=>setSubTabs(prev=>prev.map(s=>s.id===st.id?{...s,graphMode:s.graphMode==='pan'?null:'pan'}:s)),onSpeedChange:newSpeed=>{setSubTabs(prev=>prev.map(s=>{if(s.id!==st.id)return s;const oldSpeed=s.speed||1.0;const ratio=oldSpeed/newSpeed;const newVolumeNodes=(s.volumeNodes||[]).map(n=>({...n,time:n.time*ratio}));const newPanningNodes=(s.panningNodes||[]).map(n=>({...n,time:n.time*ratio}));return{...s,speed:newSpeed,volumeNodes:newVolumeNodes,panningNodes:newPanningNodes,fadeInLen:(s.fadeInLen||0)*ratio,fadeOutLen:(s.fadeOutLen||0)*ratio,currentTime:(s.currentTime||0)*ratio,label:s.label.replace(/\s\(\d+%\)$/,'')+` (${Math.round(newSpeed*100)}%)`};}));const n=activeTrackNodesRef.current[st.trackId];if(n&&n.source)n.source.playbackRate.value=newSpeed;// Reset time refs to prevent playhead jump when speed changes mid-playback const ctx=getAudioContext();const elapsed=ctx.currentTime-startAudioTimeRef.current;const oldSpeed=activePlaybackSpeedRef.current;const ratio=oldSpeed/newSpeed;startBufferOffsetRef.current=startBufferOffsetRef.current+elapsed*oldSpeed;startOffsetTimeRef.current=(startOffsetTimeRef.current+elapsed)*ratio;startAudioTimeRef.current=ctx.currentTime;activePlaybackSpeedRef.current=newSpeed;}}),/*#__PURE__*/React.createElement("div",{onMouseDown:handleSubTabResizeMouseDown,className:"absolute bottom-0 left-0 right-0 h-1.5 cursor-ns-resize z-30 hover:bg-purple-500/50 transition-colors"})),st.selectionStart!==null&&st.selectionEnd!==null&&st.selectionEnd>st.selectionStart&&/*#__PURE__*/React.createElement("div",{className:"absolute top-0 bottom-0 border-l border-r border-amber-500 bg-amber-500/10 z-20 pointer-events-none",style:{left:`${Math.min(st.selectionStart,st.selectionEnd)*zoom}px`,width:`${Math.abs(st.selectionEnd-st.selectionStart)*zoom}px`}})))));})())),/*#__PURE__*/React.createElement("div",{className:"w-1 cursor-ew-resize hover:bg-cyan-500/50 active:bg-cyan-400 transition-colors shrink-0 z-10",onMouseDown:startColResize}),renderDock('right','Right')),renderDock('bottom','Bottom'),showMixer&&/*#__PURE__*/React.createElement("div",{className:"flex flex-col border-t border-zinc-700 bg-slate-900 shrink-0 select-none",style:{height:mixerHeight+'px'}},/*#__PURE__*/React.createElement("div",{className:"flex items-center justify-between px-2 py-0.5 bg-zinc-800/80 shrink-0 cursor-ns-resize",onMouseDown:e=>{e.preventDefault();var startY=e.clientY;var startH=mixerHeight;var onMove=function(ev){var newH=Math.max(80,Math.min(400,startH-(ev.clientY-startY)));setMixerHeight(newH);localStorage.setItem('studio_mixer_height',newH.toString());};var onUp=function(){document.removeEventListener('mousemove',onMove);document.removeEventListener('mouseup',onUp);};document.addEventListener('mousemove',onMove);document.addEventListener('mouseup',onUp);}},/*#__PURE__*/React.createElement("div",{className:"flex items-center gap-2"},/*#__PURE__*/React.createElement("span",{className:"inline-flex items-center shrink-0"},/*#__PURE__*/React.createElement("i",{"data-lucide":"grip-horizontal",className:"w-3 h-3 text-zinc-600"})),/*#__PURE__*/React.createElement("span",{className:"text-[10px] font-bold text-zinc-400 uppercase tracking-wider"},"MIXER")),/*#__PURE__*/React.createElement("button",{onClick:()=>setShowMixer(false),className:"p-0.5 rounded text-zinc-500 hover:text-zinc-200 hover:bg-zinc-700 transition"},/*#__PURE__*/React.createElement("span",{className:"inline-flex items-center shrink-0"},/*#__PURE__*/React.createElement("i",{"data-lucide":"x",className:"w-3 h-3"})))),/*#__PURE__*/React.createElement("div",{className:"flex-1 flex overflow-x-auto p-1.5 gap-1.5 items-stretch"},/*#__PURE__*/React.createElement(MasterStripConsole,{masterVolume:masterVolume,setMasterVolume:setMasterVolume,showMasteringModal:showMasteringModal,setShowMasteringModal:setShowMasteringModal,masteringSettings:masteringSettings,setMasteringSettings:setMasteringSettings,isPlaying:isPlaying}),activeTracks.length>0&&/*#__PURE__*/React.createElement("div",{className:"w-px bg-zinc-700 shrink-0 self-stretch mx-0.5"}),activeTracks.map(function(track,idx){return/*#__PURE__*/React.createElement(TrackStripConsole,{key:track.id,track:track,index:idx,onUpdateTrack:updateTrackProp,trackVuRefs:trackVuRefs});}))),/*#__PURE__*/React.createElement("div",{className:"flex flex-col border-t border-zinc-700 bg-slate-900 shrink-0 select-none",style:{height:mediaExplorerPanelHeight+'px',display:showMediaExplorer?'flex':'none'}},/*#__PURE__*/React.createElement("div",{className:"flex items-center justify-between px-2 py-0.5 bg-zinc-800/80 shrink-0 cursor-ns-resize",onMouseDown:e=>{e.preventDefault();var startY=e.clientY;var startH=mediaExplorerPanelHeight;var onMove=function(ev){var newH=Math.max(120,Math.min(520,startH-(ev.clientY-startY)));setMediaExplorerPanelHeight(newH);localStorage.setItem('studio_media_explorer_height',newH.toString());};var onUp=function(){document.removeEventListener('mousemove',onMove);document.removeEventListener('mouseup',onUp);};document.addEventListener('mousemove',onMove);document.addEventListener('mouseup',onUp);}},/*#__PURE__*/React.createElement("div",{className:"flex items-center gap-2"},/*#__PURE__*/React.createElement("span",{className:"inline-flex items-center shrink-0"},/*#__PURE__*/React.createElement("i",{"data-lucide":"grip-horizontal",className:"w-3 h-3 text-zinc-600"})),/*#__PURE__*/React.createElement("span",{className:"text-[10px] font-bold text-emerald-400 uppercase tracking-wider"},"Media Explorer (F6)")),/*#__PURE__*/React.createElement("button",{onClick:()=>setShowMediaExplorer(false),className:"p-0.5 rounded text-zinc-500 hover:text-zinc-200 hover:bg-zinc-700 transition"},/*#__PURE__*/React.createElement("span",{className:"inline-flex items-center shrink-0"},/*#__PURE__*/React.createElement("i",{"data-lucide":"x",className:"w-3 h-3"})))),/*#__PURE__*/React.createElement("div",{className:"flex-1 min-h-0 overflow-hidden bg-[#262626]"},/*#__PURE__*/React.createElement(MediaExplorerPanel,{height:mediaExplorerPanelHeight,clipboardRef:clipboardRef,active:showMediaExplorer}))));})(),/*#__PURE__*/React.createElement("div",{className:"h-9 bg-[#141414] border-t border-zinc-900 px-4 flex items-center justify-between text-[18px] text-zinc-500 select-none shrink-0"},/*#__PURE__*/React.createElement("div",{className:"flex items-center gap-4"},/*#__PURE__*/React.createElement("span",null,"Status: ",isPlaying?'Playing':'Stopped'),activeTab!=='main'&&/*#__PURE__*/React.createElement("span",{className:"text-amber-400 font-semibold uppercase"},"Sub-Tab"),activeTab==='main'&&/*#__PURE__*/React.createElement("span",{className:"text-cyan-400 font-semibold uppercase"},"Track: ID ",selectedTrackId),selectionMode==='local'&&/*#__PURE__*/React.createElement("span",{className:"text-amber-400 font-semibold uppercase text-[18px]"},"Local Sel"),selectionMode==='global'&&/*#__PURE__*/React.createElement("span",{className:"text-purple-400 font-semibold uppercase text-[18px]"},"Global Sel"),hasAnySolo&&/*#__PURE__*/React.createElement("span",{className:"text-amber-500 font-semibold"},"Solo: ",tracks.filter(t=>t.solo).length," track(s)"),isLoopingSelection&&selectionMode==='local'&&/*#__PURE__*/React.createElement("span",{className:"text-emerald-400 font-semibold uppercase text-[18px]"},"Solo Loop"),isLoopingSelection&&selectionMode!=='local'&&/*#__PURE__*/React.createElement("span",{className:"text-cyan-400 font-semibold uppercase text-[18px]"},"Master Loop")),/*#__PURE__*/React.createElement("div",{className:"flex items-center gap-1.5 ml-3"},/*#__PURE__*/React.createElement("span",{className:"text-[18px] font-bold text-zinc-400 uppercase"},"Bars:"),/*#__PURE__*/React.createElement("input",{type:"number",min:"0",value:beginBar,onChange:e=>{const b=parseInt(e.target.value)||0;setBeginBar(b);const beatDuration=60/parseInt(bpm||120);const t=b*beatDuration*4;clearLocalSelection();setSelectionMode('global');setSelectionStart(t);setSelectionEnd(t+beatDuration*4);},className:"w-[60px] bg-black text-white text-[18px] px-1 py-0 rounded border border-zinc-700 text-center font-mono"}),/*#__PURE__*/React.createElement("span",{className:"text-[18px] text-zinc-500"},"-"),/*#__PURE__*/React.createElement("input",{type:"number",min:"0",value:endBar,onChange:e=>{const b=parseInt(e.target.value)||0;setEndBar(b);const beatDuration=60/parseInt(bpm||120);const t=b*beatDuration*4;// selectionEnd = vạch bar b (không +1 bar) — khớp hiển thị endBar // (quét 8 bars hiển thị "0 đến 8"): nhập 8 → selection tới vạch 8. setSelectionEnd(t);setNumberBar(Math.max(0,b-beginBar));},className:"w-[60px] bg-black text-white text-[18px] px-1 py-0 rounded border border-zinc-700 text-center font-mono"}),/*#__PURE__*/React.createElement("span",{className:"text-[18px] text-zinc-500"},"#"),/*#__PURE__*/React.createElement("input",{type:"number",min:"1",value:numberBar,readOnly:true,className:"w-[60px] bg-black text-zinc-400 text-[18px] px-1 py-0 rounded border border-zinc-800 text-center font-mono"}),/*#__PURE__*/React.createElement("button",{onClick:()=>setSelectionFollowsTempo(prev=>!prev),className:`px-1.5 py-0 text-[18px] rounded border font-bold ${selectionFollowsTempo?'bg-amber-700 text-white border-amber-500':'bg-zinc-800 text-zinc-400 border-zinc-700'}`,title:selectionFollowsTempo?"Selection theo tempo (đổi BPM → selection thay đổi)":"Selection theo thời gian (cố định)"},selectionFollowsTempo?"♪T":"⏱T"),/*#__PURE__*/React.createElement("div",{className:"w-[1px] h-6 bg-zinc-800 mx-1"}),/*#__PURE__*/React.createElement("span",{className:"text-[18px] text-zinc-500"},"Start:"),/*#__PURE__*/React.createElement("input",{type:"text",value:selLeft!==null?formatTime(selLeft):'',onChange:e=>{const parts=e.target.value.split(/[:.]/);if(parts.length===3){const secs=parseInt(parts[0])*60+parseInt(parts[1])+parseFloat('0.'+(parts[2]||'0'));clearLocalSelection();setSelectionMode('global');setSelectionStart(secs);}},className:"w-24 bg-black text-zinc-200 text-[18px] px-1 py-0 rounded border border-zinc-700 text-center font-mono"}),/*#__PURE__*/React.createElement("span",{className:"text-[18px] text-zinc-500"},"End:"),/*#__PURE__*/React.createElement("input",{type:"text",value:selRight!==null?formatTime(selRight):'',onChange:e=>{const parts=e.target.value.split(/[:.]/);if(parts.length===3){const secs=parseInt(parts[0])*60+parseInt(parts[1])+parseFloat('0.'+(parts[2]||'0'));setSelectionEnd(secs);}},className:"w-24 bg-black text-zinc-200 text-[18px] px-1 py-0 rounded border border-zinc-700 text-center font-mono"}),/*#__PURE__*/React.createElement("span",{className:"text-[18px] text-zinc-500"},"Len:"),/*#__PURE__*/React.createElement("input",{type:"text",value:selLeft!==null&&selRight!==null?formatTime(Math.abs(selRight-selLeft)):'',onChange:e=>{const parts=e.target.value.split(/[:.]/);if(parts.length===3&&selLeft!==null){const secs=parseInt(parts[0])*60+parseInt(parts[1])+parseFloat('0.'+(parts[2]||'0'));setSelectionEnd(selLeft+secs);}},className:"w-24 bg-black text-amber-300 text-[18px] px-1 py-0 rounded border border-zinc-700 text-center font-mono"})),/*#__PURE__*/React.createElement("div",{className:"flex items-center gap-2"},/*#__PURE__*/React.createElement("button",{onClick:()=>setShowExportPanel(p=>!p),className:`px-1.5 py-0.5 rounded text-xs font-semibold transition flex items-center gap-1 ${showExportPanel?'bg-cyan-900 text-cyan-300':'text-zinc-500 hover:text-zinc-300'}`,title:`Export (floating modal)`},/*#__PURE__*/React.createElement("span",{className:"inline-flex items-center shrink-0"},/*#__PURE__*/React.createElement("i",{"data-lucide":"save",className:"w-3 h-3"})),/*#__PURE__*/React.createElement("span",{className:"text-[7px] opacity-60"},showExportPanel?panelPositions.export[0].toUpperCase():'')),/*#__PURE__*/React.createElement("button",{onClick:()=>setShowAIPanel(p=>!p),className:`px-1.5 py-0.5 rounded text-xs font-semibold transition flex items-center gap-1 ${showAIPanel?'bg-purple-900 text-purple-300':'text-zinc-500 hover:text-zinc-300'}`,title:`AI Panel (${panelPositions.ai})`},/*#__PURE__*/React.createElement("span",{className:"inline-flex items-center shrink-0"},/*#__PURE__*/React.createElement("i",{"data-lucide":"cpu",className:"w-3 h-3"})),/*#__PURE__*/React.createElement("span",{className:"text-[7px] opacity-60"},showAIPanel?panelPositions.ai[0].toUpperCase():'')),/*#__PURE__*/React.createElement("button",{onClick:()=>window.__toggleMixerRef(),className:`px-1.5 py-0.5 rounded text-xs font-semibold transition flex items-center gap-1 ${showMixer?'bg-indigo-900 text-indigo-300':'text-zinc-500 hover:text-zinc-300'}`,title:"Mixer Panel (F7)"},/*#__PURE__*/React.createElement("span",{className:"inline-flex items-center shrink-0"},/*#__PURE__*/React.createElement("i",{"data-lucide":"sliders-horizontal",className:"w-3 h-3"}))),/*#__PURE__*/React.createElement("button",{onClick:()=>window.__toggleMediaExplorerRef(),className:`px-1.5 py-0.5 rounded text-xs font-semibold transition flex items-center gap-1 ${showMediaExplorer?'bg-emerald-900 text-emerald-300':'text-zinc-500 hover:text-zinc-300'}`,title:"Media Explorer Panel (F6)"},/*#__PURE__*/React.createElement("span",{className:"inline-flex items-center shrink-0"},/*#__PURE__*/React.createElement("i",{"data-lucide":"folder-open",className:"w-3 h-3"}))),/*#__PURE__*/React.createElement("span",{className:"w-[1px] h-3 bg-zinc-800 mx-1"}),/*#__PURE__*/React.createElement("span",{className:"flex items-center gap-1"},/*#__PURE__*/React.createElement("span",{className:"inline-flex items-center shrink-0"},/*#__PURE__*/React.createElement("i",{"data-lucide":"info",className:"w-3 h-3 text-zinc-600"})),prHint?/*#__PURE__*/React.createElement("span",{className:"text-cyan-400"},prHint):/*#__PURE__*/React.createElement("span",{className:"text-zinc-600 italic"},"Adaptive tips: hover vào vùng làm việc để xem hướng dẫn")))),contextMenu&&(contextMenu.isSubTab?/*#__PURE__*/React.createElement("div",{className:"fixed z-[60] bg-[#2a2a2a] border border-zinc-700 rounded-lg shadow-2xl py-1 w-64 overflow-y-auto",style:{left:Math.min(contextMenu.x,window.innerWidth-260),top:contextMenu.y+200>window.innerHeight?undefined:contextMenu.y,bottom:contextMenu.y+200>window.innerHeight?window.innerHeight-contextMenu.y:undefined,maxHeight:'60vh'},onClick:e=>e.stopPropagation()},/*#__PURE__*/React.createElement("div",{className:"px-3 py-1 text-xs text-zinc-500 font-bold uppercase border-b border-zinc-800 pb-1 mb-1"},"Selection: ",formatTime(subTabs.find(s=>s.id===contextMenu.subTabId)?.selectionStart||0)," - ",formatTime(subTabs.find(s=>s.id===contextMenu.subTabId)?.selectionEnd||0)),/*#__PURE__*/React.createElement("div",{className:"h-px bg-zinc-700 my-1"}),/*#__PURE__*/React.createElement("button",{onClick:()=>{handleSubTabCut(contextMenu.subTabId);closeContextMenu();},className:"w-full px-3 py-1.5 text-xs text-zinc-200 hover:bg-zinc-700 text-left flex items-center gap-2"},/*#__PURE__*/React.createElement("span",{className:"inline-flex items-center shrink-0"},/*#__PURE__*/React.createElement("i",{"data-lucide":"scissors",className:"w-3.5 h-3.5 text-rose-400 shrink-0"})),/*#__PURE__*/React.createElement("span",{className:"flex-1"},"Cut"),/*#__PURE__*/React.createElement("span",{className:"text-purple-400 text-xs font-semibold font-mono ml-auto"},"Ctrl+X")),/*#__PURE__*/React.createElement("button",{onClick:()=>{handleSubTabCopy(contextMenu.subTabId);closeContextMenu();},className:"w-full px-3 py-1.5 text-xs text-zinc-200 hover:bg-zinc-700 text-left flex items-center gap-2"},/*#__PURE__*/React.createElement("span",{className:"inline-flex items-center shrink-0"},/*#__PURE__*/React.createElement("i",{"data-lucide":"copy",className:"w-3.5 h-3.5 text-zinc-400 shrink-0"})),/*#__PURE__*/React.createElement("span",{className:"flex-1"},"Copy"),/*#__PURE__*/React.createElement("span",{className:"text-purple-400 text-xs font-semibold font-mono ml-auto"},"Ctrl+C")),/*#__PURE__*/React.createElement("button",{onClick:()=>{handleSubTabPaste(contextMenu.subTabId);closeContextMenu();},className:"w-full px-3 py-1.5 text-xs text-zinc-200 hover:bg-zinc-700 text-left flex items-center gap-2"},/*#__PURE__*/React.createElement("span",{className:"inline-flex items-center shrink-0"},/*#__PURE__*/React.createElement("i",{"data-lucide":"clipboard",className:"w-3.5 h-3.5 text-emerald-400 shrink-0"})),/*#__PURE__*/React.createElement("span",{className:"flex-1"},"Paste"),/*#__PURE__*/React.createElement("span",{className:"text-purple-400 text-xs font-semibold font-mono ml-auto"},"Ctrl+V")),/*#__PURE__*/React.createElement("button",{onClick:()=>{handleSubTabDelete(contextMenu.subTabId);closeContextMenu();},className:"w-full px-3 py-1.5 text-xs text-zinc-200 hover:bg-zinc-700 text-left flex items-center gap-2"},/*#__PURE__*/React.createElement("span",{className:"inline-flex items-center shrink-0"},/*#__PURE__*/React.createElement("i",{"data-lucide":"trash-2",className:"w-3.5 h-3.5 text-red-400 shrink-0"})),/*#__PURE__*/React.createElement("span",{className:"flex-1"},"Delete Selected Segment"),/*#__PURE__*/React.createElement("span",{className:"text-amber-400 text-xs font-semibold font-mono ml-auto"},"Del")),/*#__PURE__*/React.createElement("div",{className:"h-px bg-zinc-700 my-1"}),/*#__PURE__*/React.createElement("button",{onClick:()=>{handleSubTabLoop(contextMenu.subTabId,4);closeContextMenu();},className:"w-full px-3 py-1.5 text-xs text-zinc-200 hover:bg-zinc-700 text-left flex items-center gap-2"},/*#__PURE__*/React.createElement("span",{className:"inline-flex items-center shrink-0"},/*#__PURE__*/React.createElement("i",{"data-lucide":"repeat",className:"w-3.5 h-3.5 text-cyan-400 shrink-0"})),/*#__PURE__*/React.createElement("span",{className:"flex-1"},"Loop Selection 4 times"),/*#__PURE__*/React.createElement("span",{className:"text-purple-400 text-xs font-semibold font-mono ml-auto"},"Ctrl+L"))):/*#__PURE__*/React.createElement("div",{className:"fixed z-[60] bg-[#2a2a2a] border border-zinc-700 rounded-lg shadow-2xl py-1 w-64 overflow-y-auto",style:{left:Math.min(contextMenu.x,window.innerWidth-260),top:contextMenu.y+260>window.innerHeight?undefined:contextMenu.y,bottom:contextMenu.y+260>window.innerHeight?window.innerHeight-contextMenu.y:undefined,maxHeight:'60vh'},onClick:e=>e.stopPropagation()},contextMenu.sectionId?/*#__PURE__*/React.createElement("button",{onClick:contextMenuEditSection,className:"w-full px-3 py-1.5 text-xs text-zinc-200 hover:bg-zinc-700 text-left flex items-center gap-2"},/*#__PURE__*/React.createElement("span",{className:"inline-flex items-center shrink-0"},/*#__PURE__*/React.createElement("i",{"data-lucide":"file-edit",className:"w-3.5 h-3.5 text-amber-400 shrink-0"})),/*#__PURE__*/React.createElement("span",{className:"flex-1"},"Edit Section"),/*#__PURE__*/React.createElement("span",{className:"text-purple-400 text-xs font-semibold font-mono ml-auto pl-8"},"Ctrl+E")):/*#__PURE__*/React.createElement("button",{onClick:contextMenuEdit,className:"w-full px-3 py-1.5 text-xs text-zinc-200 hover:bg-zinc-700 text-left flex items-center gap-2"},/*#__PURE__*/React.createElement("span",{className:"inline-flex items-center shrink-0"},/*#__PURE__*/React.createElement("i",{"data-lucide":"file-edit",className:"w-3.5 h-3.5 text-amber-400 shrink-0"})),/*#__PURE__*/React.createElement("span",{className:"flex-1"},"Edit"),/*#__PURE__*/React.createElement("span",{className:"text-purple-400 text-xs font-semibold font-mono ml-auto pl-8"},"Ctrl+E")),/*#__PURE__*/React.createElement("button",{onClick:contextMenuSplit,className:"w-full px-3 py-1.5 text-xs text-zinc-200 hover:bg-zinc-700 text-left flex items-center gap-2"},/*#__PURE__*/React.createElement("span",{className:"inline-flex items-center shrink-0"},/*#__PURE__*/React.createElement("i",{"data-lucide":"scissors",className:"w-3.5 h-3.5 text-cyan-400 shrink-0"})),/*#__PURE__*/React.createElement("span",{className:"flex-1"},"Split"),/*#__PURE__*/React.createElement("span",{className:"text-purple-400 text-xs font-semibold font-mono ml-auto pl-8"},"S")),/*#__PURE__*/React.createElement("button",{onClick:contextMenuMerge,className:"w-full px-3 py-1.5 text-xs text-zinc-200 hover:bg-zinc-700 text-left flex items-center gap-2"},/*#__PURE__*/React.createElement("span",{className:"inline-flex items-center shrink-0"},/*#__PURE__*/React.createElement("i",{"data-lucide":"combine",className:"w-3.5 h-3.5 text-purple-400 shrink-0"})),/*#__PURE__*/React.createElement("span",{className:"flex-1"},"Merge"),/*#__PURE__*/React.createElement("span",{className:"text-purple-400 text-xs font-semibold font-mono ml-auto pl-8"},"Ctrl+M")),/*#__PURE__*/React.createElement("div",{className:"h-px bg-zinc-700 my-1"}),/*#__PURE__*/React.createElement("div",{className:"px-3 py-0.5 text-[10px] text-zinc-500 font-bold uppercase tracking-wider"},"Insert"),!sessionTabs.some(s=>s.id===activeTab)&&/*#__PURE__*/React.createElement("button",{onClick:()=>{insertSectionAtPlayhead();closeContextMenu();},className:"w-full px-3 py-1.5 text-xs text-zinc-200 hover:bg-zinc-700 text-left flex items-center gap-2"},/*#__PURE__*/React.createElement("span",{className:"inline-flex items-center shrink-0"},/*#__PURE__*/React.createElement("i",{"data-lucide":"folder-plus",className:"w-3.5 h-3.5 text-amber-400 shrink-0"})),/*#__PURE__*/React.createElement("span",{className:"flex-1"},"Insert Section")),/*#__PURE__*/React.createElement("button",{onClick:()=>{insertMidiItemAtPlayhead();closeContextMenu();},className:"w-full px-3 py-1.5 text-xs text-zinc-200 hover:bg-zinc-700 text-left flex items-center gap-2"},/*#__PURE__*/React.createElement("span",{className:"inline-flex items-center shrink-0"},/*#__PURE__*/React.createElement("i",{"data-lucide":"music",className:"w-3.5 h-3.5 text-purple-400 shrink-0"})),/*#__PURE__*/React.createElement("span",{className:"flex-1"},"Insert MIDI Item")),/*#__PURE__*/React.createElement("button",{onClick:()=>{insertSoundClipAtCursor();closeContextMenu();},className:"w-full px-3 py-1.5 text-xs text-zinc-200 hover:bg-zinc-700 text-left flex items-center gap-2"},/*#__PURE__*/React.createElement("span",{className:"inline-flex items-center shrink-0"},/*#__PURE__*/React.createElement("i",{"data-lucide":"file-audio",className:"w-3.5 h-3.5 text-emerald-400 shrink-0"})),/*#__PURE__*/React.createElement("span",{className:"flex-1"},"Insert Sound Clip")),/*#__PURE__*/React.createElement("button",{onClick:()=>{insertTrackBelow();closeContextMenu();},className:"w-full px-3 py-1.5 text-xs text-zinc-200 hover:bg-zinc-700 text-left flex items-center gap-2"},/*#__PURE__*/React.createElement("span",{className:"inline-flex items-center shrink-0"},/*#__PURE__*/React.createElement("i",{"data-lucide":"plus-square",className:"w-3.5 h-3.5 text-cyan-400 shrink-0"})),/*#__PURE__*/React.createElement("span",{className:"flex-1"},"Insert Track")),/*#__PURE__*/React.createElement("div",{className:"h-px bg-zinc-700 my-1"}),/*#__PURE__*/React.createElement("button",{onClick:contextMenuCopy,className:"w-full px-3 py-1.5 text-xs text-zinc-200 hover:bg-zinc-700 text-left flex items-center gap-2"},/*#__PURE__*/React.createElement("span",{className:"inline-flex items-center shrink-0"},/*#__PURE__*/React.createElement("i",{"data-lucide":"copy",className:"w-3.5 h-3.5 text-zinc-400 shrink-0"})),/*#__PURE__*/React.createElement("span",{className:"flex-1"},"Copy"),/*#__PURE__*/React.createElement("span",{className:"text-purple-400 text-xs font-semibold font-mono ml-auto pl-8"},"Ctrl+C")),/*#__PURE__*/React.createElement("button",{onClick:contextMenuCut,className:"w-full px-3 py-1.5 text-xs text-zinc-200 hover:bg-zinc-700 text-left flex items-center gap-2"},/*#__PURE__*/React.createElement("span",{className:"inline-flex items-center shrink-0"},/*#__PURE__*/React.createElement("i",{"data-lucide":"scissors",className:"w-3.5 h-3.5 text-rose-400 shrink-0"})),/*#__PURE__*/React.createElement("span",{className:"flex-1"},"Cut"),/*#__PURE__*/React.createElement("span",{className:"text-purple-400 text-xs font-semibold font-mono ml-auto pl-8"},"Ctrl+X")),/*#__PURE__*/React.createElement("button",{onClick:contextMenuPaste,className:"w-full px-3 py-1.5 text-xs text-zinc-200 hover:bg-zinc-700 text-left flex items-center gap-2"},/*#__PURE__*/React.createElement("span",{className:"inline-flex items-center shrink-0"},/*#__PURE__*/React.createElement("i",{"data-lucide":"clipboard",className:"w-3.5 h-3.5 text-emerald-400 shrink-0"})),/*#__PURE__*/React.createElement("span",{className:"flex-1"},"Paste"),/*#__PURE__*/React.createElement("span",{className:"text-purple-400 text-xs font-semibold font-mono ml-auto pl-8"},"Ctrl+V")),/*#__PURE__*/React.createElement("div",{className:"h-px bg-zinc-700 my-1"}),/*#__PURE__*/React.createElement("button",{onClick:contextMenuDelete,className:"w-full px-3 py-1.5 text-xs text-red-300 hover:bg-red-950 text-left flex items-center gap-2"},/*#__PURE__*/React.createElement("span",{className:"inline-flex items-center shrink-0"},/*#__PURE__*/React.createElement("i",{"data-lucide":"trash-2",className:"w-3.5 h-3.5 text-red-400 shrink-0"})),/*#__PURE__*/React.createElement("span",{className:"flex-1"},"Delete"),/*#__PURE__*/React.createElement("span",{className:"text-amber-400 text-xs font-semibold font-mono ml-auto pl-8"},"Del")))),toastMessage&&/*#__PURE__*/React.createElement("div",{className:"absolute top-14 right-4 z-50 px-4 py-2.5 rounded shadow-lg text-xs font-semibold flex items-center gap-2 border bg-zinc-900 text-zinc-100 border-zinc-800"},/*#__PURE__*/React.createElement("span",{className:"inline-flex items-center shrink-0"},/*#__PURE__*/React.createElement("i",{"data-lucide":"bell",className:`w-4 h-4 ${toastMessage.type==='success'?'text-emerald-400':toastMessage.type==='error'?'text-rose-400':toastMessage.type==='warning'?'text-amber-400':'text-cyan-400'}`})),toastMessage.text,toastMessage.onActionClick&&/*#__PURE__*/React.createElement("button",{onClick:()=>{toastMessage.onActionClick();setToastMessage(null);},className:"ml-2 px-2 py-0.5 bg-purple-700 hover:bg-purple-600 text-white rounded text-[10px] uppercase font-bold"},toastMessage.actionText||'Tải về'))),appWarningModal&&/*#__PURE__*/React.createElement("div",{className:"fixed inset-0 z-[100] flex items-center justify-center bg-black/60 backdrop-blur-sm"},/*#__PURE__*/React.createElement("div",{className:"bg-[#222222] border border-zinc-800 rounded-lg shadow-2xl p-6 max-w-md w-full text-slate-200"},/*#__PURE__*/React.createElement("div",{className:"flex items-center gap-2 mb-3 text-cyan-400 font-bold"},/*#__PURE__*/React.createElement("h3",{className:"text-base font-bold"},appWarningModal.title)),/*#__PURE__*/React.createElement("div",{className:"text-xs text-slate-300 mb-5 leading-relaxed whitespace-pre-line"},appWarningModal.message),/*#__PURE__*/React.createElement("div",{className:"flex justify-end gap-2"},appWarningModal.isAlert?/*#__PURE__*/React.createElement("button",{onClick:()=>setAppWarningModal(null),className:"px-4 py-2 bg-cyan-600 hover:bg-cyan-500 active:bg-cyan-700 text-white rounded text-xs font-semibold transition"},"Đóng"):/*#__PURE__*/React.createElement(React.Fragment,null,/*#__PURE__*/React.createElement("button",{onClick:()=>setAppWarningModal(null),className:"px-4 py-2 bg-zinc-700 hover:bg-zinc-600 active:bg-zinc-800 text-slate-300 rounded text-xs font-semibold transition"},"Hủy"),/*#__PURE__*/React.createElement("button",{onClick:()=>{const fn=appWarningModal.onConfirm;setAppWarningModal(null);if(fn)fn();},className:"px-4 py-2 bg-cyan-600 hover:bg-cyan-500 active:bg-cyan-700 text-white rounded text-xs font-semibold transition"},"Xác nhận"))))),tabContextMenu&&/*#__PURE__*/React.createElement(React.Fragment,null,/*#__PURE__*/React.createElement("div",{className:"fixed inset-0 z-[190]",onClick:()=>setTabContextMenu(null),onContextMenu:e=>{e.preventDefault();setTabContextMenu(null);}}),/*#__PURE__*/React.createElement("div",{className:"fixed bg-zinc-900 border border-zinc-800 rounded-lg shadow-2xl p-2 z-[200] flex gap-1.5",style:{top:tabContextMenu.y,left:tabContextMenu.x},onClick:e=>e.stopPropagation()},['#f43f5e','#f59e0b','#10b981','#06b6d4','#8b5cf6','#64748b'].map(color=>/*#__PURE__*/React.createElement("button",{key:color,className:"w-5 h-5 rounded-full border border-zinc-700 hover:scale-110 active:scale-95 transition",style:{backgroundColor:color},onClick:()=>{handleSetTabColor(tabContextMenu.tabId,tabContextMenu.tabType,color);setTabContextMenu(null);}})))),/*#__PURE__*/React.createElement(AuthModal,{isOpen:authModalOpen,mode:authMode,forceMandatory:isMandatoryLogin,onClose:()=>setAuthModalOpen(false),onSuccess:handleAuthSuccess}),/*#__PURE__*/React.createElement(ProfileModal,{isOpen:profileModalOpen,onClose:()=>setProfileModalOpen(false),tracks:tracks,setTracks:setTracks,setSelectedTrackId:setSelectedTrackId,projectName:projectName,setProjectName:setProjectName,currentProjectId:currentProjectId,setCurrentProjectId:setCurrentProjectId,showToast:showToast,loadAudioBuffersForTracks:loadAudioBuffersForTracks,setAppWarningModal:setAppWarningModal,bpm:bpm,setBpm:setBpm,setMasteringSettings:setMasteringSettings,setSessionTabs:setSessionTabs,setSubTabs:setSubTabs,trackMidiChannelsRef:trackMidiChannelsRef}),/*#__PURE__*/React.createElement(SaveProjectModal,{isOpen:saveProjectModalOpen,onClose:()=>setSaveProjectModalOpen(false),projectName:projectName,onSaveCloud:(newName,existingId)=>{handleSaveCloudProject(newName,existingId);},onSaveLocal:newName=>{handleSaveLocalProject(newName);}}),/*#__PURE__*/React.createElement(SaveAsModal,{isOpen:saveAsModalOpen,onClose:()=>setSaveAsModalOpen(false),projectName:projectName,onSaveCloud:newName=>{handleSaveAsCloud(newName);},onSaveLocal:newName=>{handleExportSFS(newName);setProjectName(newName);localStorage.setItem('sonic_project_name',newName);}}),/*#__PURE__*/React.createElement(OpenProjectModal,{isOpen:openProjectModalOpen,onClose:()=>setOpenProjectModalOpen(false),onOpenCloud:(projId,projName)=>{setOpenProjectModalOpen(false);handleOpenProject(projId,projName);},onOpenLocal:()=>{setOpenProjectModalOpen(false);handleImportSFS();}}),/*#__PURE__*/React.createElement(AIConfigModal,{isOpen:aiConfigModalOpen,onClose:()=>setAiConfigModalOpen(false),onConfigSaved:providers=>{setAiProviders(providers);const active=providers.find(p=>p.is_active)||providers[0];if(active)setSelectedProviderId(active.id);}}),/*#__PURE__*/React.createElement(AboutModal,{isOpen:aboutModalOpen,onClose:()=>setAboutModalOpen(false)}),/*#__PURE__*/React.createElement(HelpModal,{isOpen:helpModalOpen,onClose:()=>setHelpModalOpen(false),lang:prefs.language}),/*#__PURE__*/React.createElement(PreferencesModal,{isOpen:preferencesModalOpen,onClose:()=>setPreferencesModalOpen(false),prefs:prefs,onPrefsChange:handlePrefsChange}),/*#__PURE__*/React.createElement(SystemManagerModal,{isOpen:systemManagerModalOpen,onClose:()=>setSystemManagerModalOpen(false)}),/*#__PURE__*/React.createElement(PluginManagerModal,{isOpen:pluginManagerModalOpen,onClose:()=>setPluginManagerModalOpen(false),pluginsData:pluginsData,onInsertInstrument:inst=>{// Chèn instrument (soundfont bank/program) vào track đang chọn — nút Synth const tid=selectedTrackId||activeTracks&&activeTracks[0]&&activeTracks[0].id;if(tid&&inst&&inst.instrumentId){setTrackInstrumentWithProgram(tid,inst.instrumentId,inst.program,inst.displayName||inst.name,inst.bank);showToast('Đã chèn nhạc cụ: '+(inst.displayName||inst.name),'success');}setPluginManagerModalOpen(false);}}),/*#__PURE__*/React.createElement(AIPresetModal,{isOpen:aiPresetModalOpen,onClose:()=>{setAiPresetModalOpen(false);setAiPresetVersion(v=>v+1);}}),/*#__PURE__*/React.createElement(MasteringModal,{isOpen:showMasteringModal,onClose:()=>setShowMasteringModal(false),masteringSettings:masteringSettings,setMasteringSettings:setMasteringSettings}),fxRackTarget&&/*#__PURE__*/React.createElement(FXRackModal,{track:tracks.find(t=>t.id===fxRackTarget.trackId)||null,onUpdateTrack:updateTrackProp,onClose:()=>setFxRackTarget(null)}),/*#__PURE__*/React.createElement(ExportModal,{open:showExportPanel,onClose:()=>setShowExportPanel(false),exportSettings:exportSettings,setExportSettings:setExportSettings,isExporting:isExporting,onExport:triggerWavExport,onBounce:triggerBounceExport}),instrumentSelectorTrackId&&/*#__PURE__*/React.createElement("div",{className:"fixed inset-0 z-50 flex items-center justify-center bg-black/60 backdrop-blur-sm",onClick:closeInstrumentSelector},/*#__PURE__*/React.createElement("div",{className:"bg-[#262626] border border-[#383838] rounded-xl shadow-2xl w-full max-w-4xl p-5 text-slate-200",onClick:e=>e.stopPropagation()},/*#__PURE__*/React.createElement("div",{className:"flex justify-between items-center pb-3 border-b border-[#383838]"},/*#__PURE__*/React.createElement("h3",{className:"text-sm font-bold text-amber-400"},"Select Instrument"),/*#__PURE__*/React.createElement("div",{className:"flex items-center gap-2"},/*#__PURE__*/React.createElement("select",{value:instrumentSelectorTrackId||'',onChange:e=>{var tid=e.target.value;if(tid){openInstrumentSelector(tid);}},className:"bg-[#1e1e1e] text-zinc-300 border border-zinc-700 rounded px-2 py-1 text-xs font-mono cursor-pointer"},activeTracks.map(function(at){return/*#__PURE__*/React.createElement("option",{key:at.id,value:at.id},at.name+' ('+(at.instrumentName||'Synth')+')');})),/*#__PURE__*/React.createElement("button",{onClick:closeInstrumentSelector,className:"text-slate-400 hover:text-slate-200"},"\u2715"))),/*#__PURE__*/React.createElement("input",{type:"text",placeholder:"T\u00ecm nh\u1ea1c c\u1ee5...",value:sfPresetSearchQuery,onChange:e=>setSfPresetSearchQuery(e.target.value),autoFocus:true,className:"w-full bg-black border border-zinc-700 rounded px-2 py-1.5 outline-none my-3 text-sm"}),/*#__PURE__*/React.createElement("div",{className:"flex gap-4",style:{height:"420px"}},/*#__PURE__*/React.createElement("div",{className:"w-1/3 border-r border-[#383838] overflow-y-auto space-y-0.5 pr-2"},/*#__PURE__*/React.createElement("button",{onClick:()=>{setSelectedSoundFontId(null);setSynthCategory(null);},className:"w-full text-left px-3 py-2 text-sm rounded "+(!selectedSoundFontId?"bg-amber-700 text-white":"bg-zinc-800 hover:bg-zinc-700 text-zinc-300")},"All Instruments"),(instrumentSelectorData?.soundfonts||[]).map(sf=>{const sfId=sf.id.startsWith('sf_')?sf.id:'sf_'+sf.id;const sfName=sf.display||sf.name||sf.id;return/*#__PURE__*/React.createElement("button",{key:sfId,onClick:()=>{setSelectedSoundFontId(sfId);setSfPresets(null);const baseId=sfId.replace('sf_','');window.SonicAPI.listSoundfontInstruments(baseId).then(data=>{if(data&&data.presets){const mapping=data.presets.map(p=>({...p,_sfId:sfId,_sfName:sfName,_sfDisplay:sfName.substring(0,30)}));setSfPresets(mapping);setInstrumentSelectorData(prev=>prev?{...prev,soundfonts:(prev.soundfonts||[]).map(s=>s.id===sf.id?{...s,presets:data.presets}:s)}:prev);}else{setSfPresets([]);}}).catch(()=>{setSfPresets([]);});},className:"w-full text-left px-3 py-2 text-sm rounded "+(selectedSoundFontId===sfId?"bg-amber-700 text-white":"bg-zinc-800 hover:bg-zinc-700 text-zinc-300")},sfName);}),// ── VST Instruments (scanned bởi Plugin Manager) ── -instrumentSelectorData?.vst_instruments?.length>0&&/*#__PURE__*/React.createElement("div",{className:"mt-3 text-[10px] text-zinc-500 uppercase font-bold px-1 flex items-center gap-1"},/*#__PURE__*/React.createElement("i",{"data-lucide":"cpu",className:"w-3 h-3 text-violet-400"}),"VST Instruments"),(instrumentSelectorData?.vst_instruments||[]).map(v=>/*#__PURE__*/React.createElement("button",{key:'vst_modal_'+(v.id||v.name),onClick:()=>{setTrackInstrumentWithUndo(instrumentSelectorTrackId,v.id,v.name||v.id);closeInstrumentSelector();},className:"w-full text-left px-3 py-2 text-sm rounded bg-zinc-800 hover:bg-violet-800 text-zinc-300 flex items-center justify-between gap-2"},/*#__PURE__*/React.createElement("span",{className:"truncate"},v.name||v.id),/*#__PURE__*/React.createElement("span",{className:"text-[9px] text-cyan-400 shrink-0"},v.type||"VST")))),/*#__PURE__*/React.createElement("div",{className:"flex-1 overflow-y-auto space-y-0.5"},/*#__PURE__*/React.createElement("button",{onClick:()=>setTrackInstrumentWithUndo(instrumentSelectorTrackId,null),className:"w-full text-left px-3 py-2 text-sm rounded bg-zinc-800 hover:bg-zinc-700 text-zinc-400"},"None (Default Synth)"),sfPresets===null?(/*#__PURE__*/React.createElement("p",{className:"text-sm text-zinc-500 py-2"},"Loading instruments...")):sfPresets.length>0?sfPresets.filter(p=>!selectedSoundFontId||p._sfId===selectedSoundFontId).filter(p=>!sfPresetSearchQuery||(p.name||'').toLowerCase().includes(sfPresetSearchQuery.toLowerCase())||(p._sfName||'').toLowerCase().includes(sfPresetSearchQuery.toLowerCase())).map((p,i)=>/*#__PURE__*/React.createElement("button",{key:i,onClick:()=>setTrackInstrumentWithUndo(instrumentSelectorTrackId,p._sfId,p.name||'Preset '+p.program,p.bank,p.program),onDoubleClick:()=>{setTrackInstrumentWithUndo(instrumentSelectorTrackId,p._sfId,p.name||'Preset '+p.program,p.bank,p.program);closeInstrumentSelector();},className:"w-full text-left px-3 py-2 text-sm rounded bg-zinc-800/60 hover:bg-amber-800 text-zinc-300 truncate flex items-center gap-2"},/*#__PURE__*/React.createElement("span",{className:"text-xs text-zinc-500 shrink-0"},p._sfDisplay),p.bank===128?/*#__PURE__*/React.createElement("span",{className:"mr-1"},"🥁"):null,p.name||'Preset '+p.program)):(/*#__PURE__*/React.createElement("p",{className:"text-sm text-zinc-500 py-2"},sfPresetSearchQuery?"Kh\u00f4ng t\u00ecm th\u1ea5y nh\u1ea1c c\u1ee5 ph\u00f9 h\u1ee3p.":"No presets found.")))))),fxSelectorTrackId&&/*#__PURE__*/React.createElement("div",{className:"fixed inset-0 z-50 flex items-center justify-center bg-black/60 backdrop-blur-sm",onClick:()=>setFxSelectorTrackId(null)},/*#__PURE__*/React.createElement("div",{className:"bg-[#262626] border border-[#383838] rounded-xl shadow-2xl w-64 p-4 text-slate-200",onClick:e=>e.stopPropagation()},/*#__PURE__*/React.createElement("h3",{className:"text-sm font-bold text-purple-400 mb-3"},"Track FX"),/*#__PURE__*/React.createElement("div",{className:"space-y-1"},/*#__PURE__*/React.createElement("button",{onClick:()=>handleSetTrackFx(fxSelectorTrackId,null),className:"w-full text-left px-3 py-2 text-xs rounded bg-zinc-800 hover:bg-zinc-700 text-zinc-400"},"None"),/*#__PURE__*/React.createElement("button",{onClick:()=>handleSetTrackFx(fxSelectorTrackId,'chorus'),className:"w-full text-left px-3 py-2 text-xs rounded bg-zinc-800 hover:bg-cyan-800 text-cyan-300"},"Chorus"),/*#__PURE__*/React.createElement("button",{onClick:()=>handleSetTrackFx(fxSelectorTrackId,'reverb'),className:"w-full text-left px-3 py-2 text-xs rounded bg-zinc-800 hover:bg-purple-800 text-purple-300"},"Reverb")))),instrumentDropdownTrackId&&instrumentDropdownBtnRect&&/*#__PURE__*/React.createElement("div",{"data-instr-dropdown":"",className:"fixed z-[100] bg-[#1e1e1e] border border-zinc-700 rounded shadow-xl w-[220px] max-h-[300px] flex flex-col",style:{top:instrumentDropdownBtnRect.bottom+4,left:Math.max(4,Math.min(instrumentDropdownBtnRect.left,window.innerWidth-224))}},/*#__PURE__*/React.createElement("input",{type:"text",placeholder:"T\u00ecm nh\u1ea1c c\u1ee5...",value:instrumentSearchQuery,onChange:e=>setInstrumentSearchQuery(e.target.value),autoFocus:true,className:"w-full bg-black border-b border-zinc-700 px-2 py-1.5 text-xs outline-none"}),/*#__PURE__*/React.createElement("div",{className:"flex-1 overflow-y-auto"},/*#__PURE__*/React.createElement("button",{onClick:()=>setTrackInstrumentWithUndo(instrumentDropdownTrackId,null),className:"w-full text-left px-3 py-1.5 text-xs bg-zinc-800 hover:bg-zinc-700 text-zinc-400"},"None (Default Synth)"),filteredInstruments.soundfonts.length>0&&/*#__PURE__*/React.createElement("div",{className:"text-[10px] text-zinc-500 px-3 py-1 mt-1 uppercase font-bold"},"SoundFonts"),filteredInstruments.soundfonts.map((sf,i)=>/*#__PURE__*/React.createElement("button",{key:"sfd_"+i,onClick:()=>{setInstrumentDropdownTrackId(null);setInstrumentDropdownBtnRect(null);setTrackInstrumentWithUndo(instrumentDropdownTrackId,"sf_"+sf.id,sf.display||sf.name||sf.id,undefined,undefined);},className:"w-full text-left px-3 py-1.5 text-xs bg-zinc-800 hover:bg-amber-800 text-zinc-200 flex items-center justify-between"},/*#__PURE__*/React.createElement("span",{className:"truncate"},sf.display||sf.name||sf.id),/*#__PURE__*/React.createElement("span",{className:"text-[10px] text-amber-400 shrink-0 ml-1"},"SF"))),filteredInstruments.vst.length>0&&/*#__PURE__*/React.createElement("div",{className:"text-[10px] text-zinc-500 px-3 py-1 mt-1 uppercase font-bold"},"VST Instruments"),filteredInstruments.vst.map((v,i)=>/*#__PURE__*/React.createElement("div",{key:"vstd_"+i,className:"flex items-stretch"},/*#__PURE__*/React.createElement("button",{onClick:()=>{setInstrumentDropdownTrackId(null);setInstrumentDropdownBtnRect(null);setTrackInstrumentWithUndo(instrumentDropdownTrackId,v.id,v.name||v.id);},className:"flex-1 min-w-0 text-left px-3 py-1.5 text-xs bg-zinc-800 hover:bg-violet-800 text-zinc-200 flex items-center justify-between"},/*#__PURE__*/React.createElement("span",{className:"truncate"},v.name||v.id),/*#__PURE__*/React.createElement("span",{className:"text-[10px] text-cyan-400 shrink-0 ml-1"},v.type||"VST")))),filteredInstruments.vst.length>0&&/*#__PURE__*/React.createElement("div",{className:"text-[10px] text-zinc-500 px-3 py-1 mt-1 uppercase font-bold"},"VST Presets (.vstpreset)"),(window.SonicRuntime&&window.SonicRuntime.presets||[]).map((p,i)=>/*#__PURE__*/React.createElement("button",{key:"psd_"+i,onClick:()=>setTrackPreset(instrumentDropdownTrackId,p.id),className:"w-full text-left px-3 py-1 text-xs bg-zinc-800 hover:bg-emerald-800 text-zinc-300 flex items-center justify-between"},/*#__PURE__*/React.createElement("span",{className:"truncate"},p.name||p.id),/*#__PURE__*/React.createElement("span",{className:"text-[10px] text-emerald-400 shrink-0 ml-1"},"PRESET"))),/*#__PURE__*/React.createElement("button",{onClick:()=>{const inp=document.createElement('input');inp.type='file';inp.accept='.vstpreset,.fxp,.fxb,.dspreset';inp.onchange=()=>{const f=inp.files&&inp.files[0];if(!f)return;window.SonicAPI.uploadPreset(f).then(function(r){if(r&&r.success){if(window.SonicRuntime)window.SonicRuntime.refreshPresets();showToast('Đã upload preset: '+(r.original_name||r.name||''),'success');}else{showToast('Upload preset thất bại','error');}}).catch(function(err){showToast('Upload lỗi: '+(err.message||err),'error');});};inp.click();},className:"w-full text-left px-3 py-1 text-xs bg-zinc-800 hover:bg-teal-800 text-teal-300 border-t border-zinc-700",title:"Upload preset .vstpreset xuất từ Carla (native GUI)"},"\u2B06 Upload preset (t\u1EEB Carla...)"),!filteredInstruments.soundfonts.length&&!filteredInstruments.vst.length&&/*#__PURE__*/React.createElement("p",{className:"text-xs text-zinc-500 py-4 text-center"},"Kh\u00f4ng t\u00ecm th\u1ea5y nh\u1ea1c c\u1ee5 n\u00e0o"))));};const root=ReactDOM.createRoot(document.getElementById('root'));root.render(/*#__PURE__*/React.createElement(App,null));setTimeout(()=>lucide.createIcons(),300); \ No newline at end of file +instrumentSelectorData?.vst_instruments?.length>0&&/*#__PURE__*/React.createElement("div",{className:"mt-3 text-[10px] text-zinc-500 uppercase font-bold px-1 flex items-center gap-1"},/*#__PURE__*/React.createElement("i",{"data-lucide":"cpu",className:"w-3 h-3 text-violet-400"}),"VST Instruments"),(instrumentSelectorData?.vst_instruments||[]).map(v=>/*#__PURE__*/React.createElement("button",{key:'vst_modal_'+(v.id||v.name),onClick:()=>{setTrackInstrumentWithUndo(instrumentSelectorTrackId,v.id,v.name||v.id);closeInstrumentSelector();},className:"w-full text-left px-3 py-2 text-sm rounded bg-zinc-800 hover:bg-violet-800 text-zinc-300 flex items-center justify-between gap-2"},/*#__PURE__*/React.createElement("span",{className:"truncate"},v.name||v.id),/*#__PURE__*/React.createElement("span",{className:"text-[9px] text-cyan-400 shrink-0"},v.type||"VST")))),/*#__PURE__*/React.createElement("div",{className:"flex-1 overflow-y-auto space-y-0.5"},/*#__PURE__*/React.createElement("button",{onClick:()=>setTrackInstrumentWithUndo(instrumentSelectorTrackId,null),className:"w-full text-left px-3 py-2 text-sm rounded bg-zinc-800 hover:bg-zinc-700 text-zinc-400"},"None (Default Synth)"),sfPresets===null?(/*#__PURE__*/React.createElement("p",{className:"text-sm text-zinc-500 py-2"},"Loading instruments...")):sfPresets.length>0?sfPresets.filter(p=>!selectedSoundFontId||p._sfId===selectedSoundFontId).filter(p=>!sfPresetSearchQuery||(p.name||'').toLowerCase().includes(sfPresetSearchQuery.toLowerCase())||(p._sfName||'').toLowerCase().includes(sfPresetSearchQuery.toLowerCase())).map((p,i)=>/*#__PURE__*/React.createElement("button",{key:i,onClick:()=>setTrackInstrumentWithUndo(instrumentSelectorTrackId,p._sfId,p.name||'Preset '+p.program,p.bank,p.program),onDoubleClick:()=>{setTrackInstrumentWithUndo(instrumentSelectorTrackId,p._sfId,p.name||'Preset '+p.program,p.bank,p.program);closeInstrumentSelector();},className:"w-full text-left px-3 py-2 text-sm rounded bg-zinc-800/60 hover:bg-amber-800 text-zinc-300 truncate flex items-center gap-2"},/*#__PURE__*/React.createElement("span",{className:"text-xs text-zinc-500 shrink-0"},p._sfDisplay),p.bank===128?/*#__PURE__*/React.createElement("span",{className:"mr-1"},"🥁"):null,p.name||'Preset '+p.program)):(/*#__PURE__*/React.createElement("p",{className:"text-sm text-zinc-500 py-2"},sfPresetSearchQuery?"Kh\u00f4ng t\u00ecm th\u1ea5y nh\u1ea1c c\u1ee5 ph\u00f9 h\u1ee3p.":"No presets found.")))))),fxSelectorTrackId&&/*#__PURE__*/React.createElement("div",{className:"fixed inset-0 z-50 flex items-center justify-center bg-black/60 backdrop-blur-sm",onClick:()=>setFxSelectorTrackId(null)},/*#__PURE__*/React.createElement("div",{className:"bg-[#262626] border border-[#383838] rounded-xl shadow-2xl w-64 p-4 text-slate-200",onClick:e=>e.stopPropagation()},/*#__PURE__*/React.createElement("h3",{className:"text-sm font-bold text-purple-400 mb-3"},"Track FX"),/*#__PURE__*/React.createElement("div",{className:"space-y-1"},/*#__PURE__*/React.createElement("button",{onClick:()=>handleSetTrackFx(fxSelectorTrackId,null),className:"w-full text-left px-3 py-2 text-xs rounded bg-zinc-800 hover:bg-zinc-700 text-zinc-400"},"None"),/*#__PURE__*/React.createElement("button",{onClick:()=>handleSetTrackFx(fxSelectorTrackId,'chorus'),className:"w-full text-left px-3 py-2 text-xs rounded bg-zinc-800 hover:bg-cyan-800 text-cyan-300"},"Chorus"),/*#__PURE__*/React.createElement("button",{onClick:()=>handleSetTrackFx(fxSelectorTrackId,'reverb'),className:"w-full text-left px-3 py-2 text-xs rounded bg-zinc-800 hover:bg-purple-800 text-purple-300"},"Reverb")))),instrumentDropdownTrackId&&instrumentDropdownBtnRect&&/*#__PURE__*/React.createElement("div",{"data-instr-dropdown":"",className:"fixed z-[100] bg-[#1e1e1e] border border-zinc-700 rounded shadow-xl w-[220px] max-h-[300px] flex flex-col",style:{top:instrumentDropdownBtnRect.bottom+4,left:Math.max(4,Math.min(instrumentDropdownBtnRect.left,window.innerWidth-224))}},/*#__PURE__*/React.createElement("input",{type:"text",placeholder:"T\u00ecm nh\u1ea1c c\u1ee5...",value:instrumentSearchQuery,onChange:e=>setInstrumentSearchQuery(e.target.value),autoFocus:true,className:"w-full bg-black border-b border-zinc-700 px-2 py-1.5 text-xs outline-none"}),/*#__PURE__*/React.createElement("div",{className:"flex-1 overflow-y-auto"},/*#__PURE__*/React.createElement("button",{onClick:()=>setTrackInstrumentWithUndo(instrumentDropdownTrackId,null),className:"w-full text-left px-3 py-1.5 text-xs bg-zinc-800 hover:bg-zinc-700 text-zinc-400"},"None (Default Synth)"),filteredInstruments.soundfonts.length>0&&/*#__PURE__*/React.createElement("div",{className:"text-[10px] text-zinc-500 px-3 py-1 mt-1 uppercase font-bold"},"SoundFonts"),filteredInstruments.soundfonts.map((sf,i)=>/*#__PURE__*/React.createElement("button",{key:"sfd_"+i,onClick:()=>{setInstrumentDropdownTrackId(null);setInstrumentDropdownBtnRect(null);setTrackInstrumentWithUndo(instrumentDropdownTrackId,"sf_"+sf.id,sf.display||sf.name||sf.id,undefined,undefined);},className:"w-full text-left px-3 py-1.5 text-xs bg-zinc-800 hover:bg-amber-800 text-zinc-200 flex items-center justify-between"},/*#__PURE__*/React.createElement("span",{className:"truncate"},sf.display||sf.name||sf.id),/*#__PURE__*/React.createElement("span",{className:"text-[10px] text-amber-400 shrink-0 ml-1"},"SF"))),filteredInstruments.vst.length>0&&/*#__PURE__*/React.createElement("div",{className:"text-[10px] text-zinc-500 px-3 py-1 mt-1 uppercase font-bold"},"VST Instruments"),filteredInstruments.vst.map((v,i)=>/*#__PURE__*/React.createElement("div",{key:"vstd_"+i,className:"flex items-stretch"},/*#__PURE__*/React.createElement("button",{onClick:()=>{setInstrumentDropdownTrackId(null);setInstrumentDropdownBtnRect(null);setTrackInstrumentWithUndo(instrumentDropdownTrackId,v.id,v.name||v.id);},className:"flex-1 min-w-0 text-left px-3 py-1.5 text-xs bg-zinc-800 hover:bg-violet-800 text-zinc-200 flex items-center justify-between"},/*#__PURE__*/React.createElement("span",{className:"truncate"},v.name||v.id),/*#__PURE__*/React.createElement("span",{className:"text-[10px] text-cyan-400 shrink-0 ml-1"},v.type||"VST")))),filteredInstruments.vst.length>0&&/*#__PURE__*/React.createElement("div",{className:"text-[10px] text-zinc-500 px-3 py-1 mt-1 uppercase font-bold"},"VST Presets (.vstpreset)"),(window.SonicRuntime&&window.SonicRuntime.presets||[]).map((p,i)=>/*#__PURE__*/React.createElement("button",{key:"psd_"+i,onClick:()=>setTrackPreset(instrumentDropdownTrackId,p.id),className:"w-full text-left px-3 py-1 text-xs bg-zinc-800 hover:bg-emerald-800 text-zinc-300 flex items-center justify-between"},/*#__PURE__*/React.createElement("span",{className:"truncate"},p.name||p.id),/*#__PURE__*/React.createElement("span",{className:"text-[10px] text-emerald-400 shrink-0 ml-1"},"PRESET"))),/*#__PURE__*/React.createElement("button",{onClick:()=>{const inp=document.createElement('input');inp.type='file';inp.accept='.vstpreset,.fxp,.fxb,.dspreset';inp.onchange=()=>{const f=inp.files&&inp.files[0];if(!f)return;window.SonicAPI.uploadPreset(f).then(function(r){if(r&&r.success){if(window.SonicRuntime)window.SonicRuntime.refreshPresets();showToast('Đã upload preset: '+(r.original_name||r.name||''),'success');}else{showToast('Upload preset thất bại','error');}}).catch(function(err){showToast('Upload lỗi: '+(err.message||err),'error');});};inp.click();},className:"w-full text-left px-3 py-1 text-xs bg-zinc-800 hover:bg-teal-800 text-teal-300 border-t border-zinc-700",title:"Upload preset .vstpreset xuất từ Carla (native GUI)"},"\u2B06 Upload preset (t\u1EEB Carla...)"),!filteredInstruments.soundfonts.length&&!filteredInstruments.vst.length&&/*#__PURE__*/React.createElement("p",{className:"text-xs text-zinc-500 py-4 text-center"},"Kh\u00f4ng t\u00ecm th\u1ea5y nh\u1ea1c c\u1ee5 n\u00e0o"))));};const root=ReactDOM.createRoot(document.getElementById('root'));root.render(/*#__PURE__*/React.createElement(App,null));setTimeout(()=>lucide.createIcons(),300); diff --git a/install/daw_vst_bridge.exe b/install/daw_vst_bridge.exe index c84c84834b7a7e752286775ddcd523f6c7425d2d..2a66f66e9bd804330efd6c2d54ffdaf50602bef6 100644 GIT binary patch delta 380215 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

()+2=fY+vS0BE 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 delta 376110 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

fCPMSK(P%rER!+N|9NaG2JYNF+)J?=RnAz#p zyk&W&?dCRiL7OeL;bW5a@ucxF*^b231|PLZ_Sw!hZM}4i!6w`(#ndUzWE=OEQHNE_ z1vlV*FZ^VM>I5CQSSt`U&Jzxn~P4?2bUbjdKI^dMVvH5&6@ljkP~O_JW}A z*b2Arj3NSBw$#Xh&?cn_d!>$sHSIX#JUNYk_?#cEng0P*v0|+rWT#tmZ}D%2>#=IH z32t$zfv>4%qsduQtE!XI#4l+w97eTM1@zy-e$^c4{XY&IM|#AG#6(|<;`U5{ntSwy zZ@}p^dAKfcs^G$5G$&=2fP7I6(sbXaY1y6w&>x%xox}BAEtHN(pmCb?;afFOD#y4S zz8K{cQeJHsrCo2vfJg&upaA>>lDF}?(YC(A7TryAHrZeAZR2Qp?7c=6&z3Kv*Toq$rIH&r z7*4CP^s=vrF4&>57C6_jstev}h5LbqOLZ$&OP0HYsrj{3qo3$oq~JeV1^MJF{WmcM zhaRD&T^{pNiK#g6C0&lD%zo&jZhS#m{X`!Obhqj+;sOKKBFSP)Q=L@liPtRmI%(2v zEv@Y@VoIM|!v)*r>bl44q*{N$t8d2R0N<23@E$(w!-sv)#4R;sXLYg+5GA9h;#10L zk5h6uUZApDsvL&5n*SXOORki1I_#9}00^(bpgnaSAVSK-;X{0CNDO|s!4b)=6}}-X z<+xvGuAa*st}Op-38xnvK9&;kaW!okfN_Y%bOG)uZ`aYs0U}s=ypDnfiW(RaZ8K1` zFs-7E14Wp3{dF8w=#4pTvGm(OQ8ahw7;S`vTM~S*=bJU;Gf1>lwy(v888Nv2FL6*} zU)fc6qrZznbl|}K6ENp|fgR{K;*qvq3| z-)P^*YtISVbCUL)tUVWM&o`Q_x!U{u&%Q6x-oMwLa5qp1hLvphv=*aYd7my3+db&%uO)34VfEjz>;iQ z3@}4)YM`^eUQ1r5A?U&lWas+WE*^Jn7=~d)bt*LsWoQ(Q879gEZ10Qof%ZrkjFa=D z!d54Ap@YLjQ}<`k8DmUjOU9H|6Kb7|5uU!dR8u74?5N|(VyaTBC?yRSp{A$QZ@3ul zUSK_2C`ylqi&)!T9GsnfX>j={WD}G@nH{O@2ysbKSCD0-Xocdt!$=XO{JWe|M~Vgo z)-OlR{KlCamWWG1Fri!1cXuF0KX6BrZ5I6vCZ;&^kHU0LIJFxkVr&ZdSPplK%U&K| z!U84dGFm=Lw6Sf#{5CFv^^H8~v?&NcK1FLPd5uPyz3mT2!e}wlZTzjr^GJd2dI(ltC>fV1@xpP$yt~q6GE~iD>1|rQ|nWK_sO%&$&D4T2CW#4{K8j00F*KLPrijWsH<2QqW9V@0WDLSM z>F3Gf6-ur{Q$%SWpYJ&66Z0dWRiyxZm?Hke^zh56qKav;qtrCa{3^$<(#;v7l+Waa zOg$LP)KPh9>U8lTSKTWp8_?sMJc>R{g|1$XgQ=Ls!fL`BGa&utJhl=Y$W|T)I)c(f zOOrCkMgwMw7s|2#N0)R=j3_np(1BTEhp8f=1|`cbbl@;aWUIEPpnk_j;9Or#3Ii%XPnNgQcfEV6q_%ane$seIF8R3 z7L&QG_Xj$+KzuZp^}@?S)Ik{mjz1TQRc8Ci*Ib@jdyPZ&H+PaNQ&qy;oSLFT})Ee2f8a5-QGhF5eY3K>e& z)0Bwo7(CQlU!+947mEt^KCpw3$i;#y7?QkLiK04$61TQ#O03bjcgBM2X>e<>tM4Yb z^nZ@II5i6}!`l@S17JZ9iFpu&;$<3#L}J{VVcyht2}=EoZ#5Ayst%z< zRb2_|JB?eNxqS@oa!63y8?Y%W(GW1>uuF+^V_ZtS{0Y8^yX{-=HtwC_HRF_PsYtfp z(c^g}ciAf5e9b?B&fX%*b&o;YFoe@C2ov%DdEO~ z(r{{X+%?~N*PsY}Tq>3-Ll4o5Ur{_D|1J|Jl(`3W*qatC7bTQOUUX!+Xs*<+PPP@I zj$*D(U#$@Rm474Y%nB?(Xj_deD+TVBrZX!sLe{0~NA%S$JsFC^OEvE&uT`RIzFmmv zO!d${+*!?QtN)1MQDrQJxE(`XSBVzNa}V0RO2jJ9J?YshZJa*O58^`TI}d-i^x95b zAmZj$NpVrl(4aZ{;Oh;dQc^dmCtyb5&oM^RO2 zRe?O$i&M(X@^opvC|;p!d7QVFmVi{nldc$NOK*q+Q+`#8zsIo>X$j~%*N)^`EVXtS z7~w>w-&CLXRAz&ytzg#u=ar(2?~m%Pavz=L{(Eu{s~dSi;0966-7A>`2NUueM3VcS zVGNE^!;LUW*1&lBcB2R?v@lW&G&JwjH2w90I?44dOdT0Xr#6b}{f8j|9Q!doxuS2z zy2^dgK!@*EVO9n_?FqHgZE+Zq zQhoZnGKDuoXFm-hQ|wy8Y1w*E=Z<8<-*rP+4Q6=RfM@Oj9tTWs)ln-Z6WNwlOb&F| zw~4P!%A*bR%XtyxAAm8@eux5I+lxIA=hc1WvqLmh?)*hvc8DK}pI8rP(ZKXcN{=sA zKjq%N`l<16vT&fvy}sGDyx7*V_0)Km$VYW|idxFfKWWBJu{iRFAOC;s9_;hE-EXMT zE~L@MSi2Ur``;67 zzDIgxv!T%i)lLl@qJi?`6I$pHvm#fo$<`$?y=}3?ln3{aY~N%R!1bXB8u;FsjI}YE z8+*i2rIhOM+lzr2%$(KDz?57^>YpK!u+nyKh6q>gKBT)DXrug2QTwn?1Dl}tVc>oM z&E6;4i2Ey{PO}QOh5JR6SgL~ns=Z&-6V+X4)qXVKa0cjpZvM2TkOLy0bo4YEQBgevkr)&ibpZpeE>?_r&|X^oM{aOAH*!+ct?$cSThn3fL^)!x&nG!Q-A4( z0zcjQPqd@uA@Q@x^o$A~5lu}?9fOZB^ryIEnD~55zaJAtl-KRa{kSNO#cDCfp-mh9 z381OR;gdl9{S?1nrB}z%qMGBVbOH;Tl!|0TPLsCTk*Fmbt7HF3f%U56t~-vL5~L`} zqa5vj7J&-4J~Bmq-@(l_`d@rO$~m=^V{s-XV@>bq!g(0_H~rl37kYbMY{r;^W>%$1 zb_BuV1@(>N;ssGfQ4XZBBKiETCVg%?FO51~7UA^OCGnfGaE3SxonWQ5?kDqeKkfNY5p95vaJ@WWj1ryL)wZN6}A1$p~3 z23W5%7^w?UZ+Q2nz%?K+g#@2K8&WOY+n1Itgu#fcC!s9N5lJMqGDaz@`$j#N_5zvlg7 zxIl{SJvscE#^1v1Jl59T63ww&smX1u8k$K%ZVT0Shg}mNS+jFTIIw_v-$5s(18uv5 zY8NL{-9f$jX}snM;MQ)iXuAikjR5C!-y;(jfvFxC1V_@|s9Ogud?5-^$-g{(>FFaB<43nq)jzN{ zZ3NLD;t5|{^cdN=EZyXvYg9qS59(W0oWP+8t)7U*%B{Zi&l3?F{BW4lIl-RSE%`Eb zyz`KBMj3YL9K}BswS!YXH(g zEUdt*P8YI7g89u5Csw-V3Q%-rsU=iMw7h;epnErhM>*(SABf@Pt&nee}jiYYYeKQX@hB=r2hY!%JMmoHmIH&DB> zoaQh=t0=3e4r{YjSF5NLgPc}TX~67OQF&_jS_~~vJX^@hA9ZC8qlLrm8?=HjTk%?) zQ#>xx?l)NF+4B*-c_VfzKRu)^Z^aRGLkGV@v~_cAe1{IM^1LqHc`x!Qlgrb)_o98? zAMM ziMoEo!peW?%10C>xSZjW2oK)z9b3uS4y8@w5A5uumHE8#2K|pAMwM{|0u1jz^T=yk z^rcPB5bJe6iLUIF6Lobr+UP{`DL^lr7=QV=z)uD%S3-A{ka@X~P)f(h#k3 zxyiL4j&$mP6#T+r3RN~Qr#U9s3fuV~n`A8|&sB<2WFbBTOpz`97GJ?pu5q`9P2~BO&wn1~rQ`(ghE$QI|4DtRM;PB5SdzrZK_L7}>gu_dIjC_IH5Vdya7wxtDxQ@zS z3&HI6+Rxao<1wfk)@_41L2 zaamrZuMAU?GpKEWRlW!FAemQwUv$MXosJitjJ?j zIk!y2uBl16Wd*-AnID`_y29%io^q%okJ72!vPLdTlGFKBfEEPG38ozs7$n~dM*^bi$Z1plkW7mf zdaivYsW3oI$pg^pi|IIqURDyd4RYHr$+pkP5L z<#ei?S5_4*T>OyUI^U&9#AoF6X|ye`j5qy8UGvG%kUzy2IG#oEUPKe&mD6LON)XFkrstZ zUdntmTu#B7yssi;L#%yY7a{8@jknSB2snk|&Z4poR*beRihS6IRu@GEY)F@i%DT$K z*OafAtQ_Du2Cc}nMwitUn=oj{FSLnz6_c+_+Z-JtWk-dFDN7)MrjR*GmIyvH3T=|~ zwAttuXbaqI_1uv}){k-|M9B>%oGSX>@lQ#aCg9Ha7+KU5?pPBeCrPBf$co57=xWvkUH*O78cFydq}mb z$mvSWhmLbqs{!!C_odU>LTVtmbj0AcKSVD89N(bf2uDf%GkaX9W!u zyl15@zhe^pU3FQ?<6$V%&)=moHDo={1sby7)fhoUHDt7VqV}z<<7^Gt%!K==LTVxm zS5d>7vb1R^jjbs=Vp#WjP1y#!hGJ^TVmQaKT`gG`J+~FLWCIWXTUHETdv~UPYRR6; z&WqH(wrptM+L+6JYtt)M9CdsB9hzCZj<4BQ2+96BL?f?oE-nRZSvohIxlIi26ns_V z4H(NX1~6v;amQsV+~85n>z>@mi(AHHcSAjDrhRgR*O3^r?N5~xWH;r=B3hatM`GWD zt*%_FTx>}P>dN9Mw;tD(QA&vb3aE$Da1$2UWU4rUxgIi61zJ>3E@-y(>)d>sqMx-2 zx^4Vo>yiB;HwAIU?^hu_`$I&*?3a+(?3ZX$_Dcni?3Zf3G(J(TcE54niaL2R6|XN# zeVPfb&EV!|uEl^K>H@yLi16IZwH`N`N5g_1p35N!jpo{ZiE+<|VMVo| zP7P&KB&n?pCEtE_ts(O3E(%DJMU<;8sB)4_u`fa|3Ng;hZq%=TacQ_A3C^_AAvE+d zX&PS9xmM;@GPtFfTik#JK~nPp<}~Y<{Or>3sGFu?_HLh6dz}>5NP2q~^?-cLng>(U zMzSVy=-ftfn@8$GUi+|kAvJ6)`=PPmXe@_#9$(;t!=bEK7f?(SImFr?QSwg`8jkqZ znzlBP)0Fe`sZvu}MVULFlAFph9$n`9VCyz+yV}%L_EywP3T!5y`qh~Wf5+Jp_{X=2 zts40?m#36}|8`t&&PnhlJ!^piz(M{kWr}GeEo><-D!Y;#eOjRy^C$^hX|n8G8r)V^ zR3c8&i#Bqkd-5FqI)(0(>i#AE+#HaI$4qhq&nmv%D5jPi4Q2U!dK z#3LPK7v+6LD$-F7aqpeMY0RG%ca){NrBvt0LDT8bI}Ad$4ELxX6%d|y;Vo!f-D83y+`b2l1rCBr3v z8691jF4Rz>4l9u*`JD6+Ui}_Ldwa-5J{z}bO3X(w?zA|l+pU%|BVC(ZBhU3-|SA9t~!))g+*{VQ_hv%6ZEtZ{ow?H$Q{7?# z$LSDu%jrr~)w%yNw~N8;$=qfJtjDIc0CS4R<6B%xJbkDsQBNx#gSmLj(?@=7pTdN6 z+pm$Zx_*aC33~;=?{x?zn!+xUOFNzG&(4f9xI5VDKm&fwurpvzop*n;O9^*fiR_Sg zKFp8)>m$eeOlJaa<$BM_C5k5Xm5~AdrS#-7X1go7lzBk2`^kKCt*&gjTSF*aA~VG9f@GjA1a%T_>~~L0d=5 z!c=3hO!s!nV*g;3bjZQ+bZDf^PcH|fbC|C<R$7m)=*mz zx8NQZ80okWmE~TbM?+-^Y@YKQCjV1nAG4b^#0k_HRB|28#O?{`(+lv)5G=idN9T>w z{c$x}9(3=siWSL2-w%f(eTTreM@~x=+@ST%P$>vH_W2BVW3!gAj zb`0tJ2Sg@wgs0C+L?=S^T#0urNSq@b2$C3+hxc-pzIz$H86~50^(v%`cm6=7N6T`# z!Uy`e4Yl@+vxZQA1guj149y;m9__ketl)NB#@TI*Y|ewcV=$7TJRt9}vUd39AJ7nY z+Sckn%k`f{`p+Ew2dA`*m8GMVGP(6_JX0oUCG3r)w6{FCUIw=?oPU9|iOt=77y^7? z#j#IgOKcnqhErupOLUJRNv zw#!BsJYQm$J52$OW)sle#LC7g6XE;TNX zMq?(+QcAuMdN>(THkArak<~rvhLv0GXo&ZmB5T;Udb3b#)46DfjwM%4j0r$?>aRoO z#KNbw6q==T!pEpzGIOS9)YCl_6r5)4cK;`BFvdob+sM~aOC`;1)>9Vf-qbsXQ+fn_Q2&@zBX!K0E&R$+>!E$v5yy`aF6)d~iZ!f-e<-v7_wO|>nbJsKX zif)MPyn(qV47g7K?gq@5;0l&Xu#jCpKoFuVje`Yk(=e5mr_0XD+K`2_WHnF6MLot! zQ{7o8z%$L7Y6DW?+@e`7)f#(2eyR=;V>J$Gs(HXw#BNRI_BXh-nA_2SEg(>B448r2 z{8%HW?U(5;)&4v9MT`Zt;TXHj^D5sWvL3eL$l9R1naS~Vz*L`(&%wZhl1bikWdbfh zY(5vUg99z*%0kMS<#ceaJncSWGNl%sam4OVgM+hnpVSK>9)R_ z;c2xw4DlIXg7HPItwVV8Exnp2yO|gIzNdEcTb=YZ94hs1dwe8IZFZ8V!#jYVETFr zT>1o;v?v-43)?Xod|F-ZXiOMVvA=t(>Actu?#an6{}n*$R2@2ms{?jvuEs(j!eS6} zzc;vpP2i>(a3Tb%-vDMj{lb59bcf2a<&Fls-C0iJjdcu{gznNgoor!pj6rs1mkJv& zm|e;Pn33i3--7Wj|Lt>>{Z8USg$G5c-}f@F=aUS00bSgij`Z)P$>e!=FXK1rMZ&=; zU6eJw`7trHZ;33aTrEjYmY}0qwI&r_D#Mi#B`I+!@a=e- zxKuXGd)V)j6ML^3@|1DQ4t$N`H9m@@eg}HARF3sqfK#R%jH+f$qX8`97E=F-Jyt6GfySSh0lNA2Mv#6BgAGkAJ>Z~Ul1WqDRMy%N8Bm8Ej4 zWP2otAmJlWUFhLLqMb6l7T zQq74M+^{%3F?|861?~J;yZ!$3&w5!i`1%f95AV!uH09xVUtYJ>PU~UrNT!AxWULb9 zPbnMZ;NtbswQ>b?&(tX_0fMyfE>%1yybBkn0vly5+p=LCNk4A?EY#0N(l8jg*VBxe z(f*CHN$`uI;PJ{pEHcNI1YXkJ1v@?_QISouxBHNOT%hKsxtnCkJfVMc&OWR59ITZ9 z$cQ*sb(0+AzJCb2h3WClvL2Rde7hM%vUd;1_RVszX;9e*Y|DDNH}c`90j{zmNd^2{ zhY++zzgv5t&RxgcO9uD!W58nu-1|G=PQZ*bt%Ze3B^DM?UO`X?nzL0d#pH77pP)ql zZjRo0wzDRaI%M7-^ttqj-Ae{$8T zRYrY5QEzKzE&LLlN40W!I4tPK!w}%=!QNWSJt!f?6&+vUa#7?l-Zj3Wpkvui+1lhj z=NnL8{^fYTORh2bbm#&R>9&9GW0 za%$Aq_zq7kV#~)2cDt_Z(oP-2rM|jL<#d<&GnowX0Cs7*0mrjTqX9FHX*+C?KHqnA z)i{M5nR_wXn|lHx_@!@W+jQ->9p;du_sI&F+33Cx(;i>ZjD2Y0kE3h*VAm$$0 z4#NmM{JFXf_H>V)<#oqSlQAv%P!#nQA$ey($iGqfnT z@U}YFfYTYK0OpLbNkfS!Rw6MiJ(7#>xVQDw9G8yCQYOy=iIY?|iDsycT#b5|JLU(W*0G2k?YlK?ZWuur&UFJM7WDJ39?2NHP$ z8@4X}m`ImT${o4>gLB+J{B(_GpF#(5%FmioMVmrYvsNypigA?I(jk<3GeuMCh|Yc2 z1cng?_bYr=0}bfS&>b*mOfMA{bfvaJ5R^LTp@sb2p&r!uv^?t7ai$*dO=fu--2iiz z$3JZ3QY{w*WhPeER2#`RK+?-Ivc5f7S7I-C>ci$PC1!AZU)3R$NK4U_XsL74nY+i} z&O&-s*Bfy8DZuXmGj6%EM*%~LS`dWrnW}|P${UlfeOih(OktY?Ye+n0S$0Q5Sh*{J zjdch;gs#UqooiukjKS^24i`3HFvC26If1bt$rTv;CS~hERnDSob>gJvcu$zCbDFsV zq4Pz+Njik%m0$_UlebnY(Z-qQ{7HIQAsXuwk^0FMIZgg_lb ziN3lLaQ!eJ|7A&}d6_a$abBj4nX;IDhMwMvumg<^iFMHIRcq)F%KSS)Q|6@3ecb?t zg$?c-e6(Un%LC-duSWwD)ldmf^*v+7GO~NuSG;zhq8jg{}I)wWp zboXoM+)>Q^!Qfs$4mjU{GZ;<*%n1y4!~JLoLbB9j1bX1`*>lJnwe|FVt3Ir{80rl{x~INh?^ zCgPU!7Nm`-b^ym|v(UQpmhOo?3H)qnED>791 z_gC6>MGjMfr&7_Y@))*?J-v$2sfUS_?^jvezPBd4fbHG;5gNDax*~ThXV~*PMC48$ z$-c0r>)g7`-DYs7aX_vz;G%ti^8hn`ceRFWY)@-a#6eKzOW)i(mmmL{YZ2TB@|(2M zg;k@K9U@slQcOgUJ zyL8(hI=3Km8yMWMgMe`ci~&h437C=Jm43IxxqNqJ2z*yFb$1!9*>B%jbs#GaT$+t0ezTytmyCX-~YgE>PbM_91>|WiaT*4v1mO6xTxdv%LpGW6rGPk0^ zwQ@{E8ZeYi^8#jgVWA>I+-X}}$)((pflv-(lVwugIfvs06RXc*HcPjypURVF-KoJ{ z8EM}R?{ePSUd@%ed&Az7#>kR&aBN2Tn%EZVJLQztBeZtZ1#H<4XD8|wAa6N`*igfM zB<#br7@hl+xvdOt6epIt2CQ0*jVl6Y> zQuna7!$NKD$x1#0bfeaqksmFEQMXeEbl-KZ>hhfpG9f2aC;zq$&ezfnAvSm~U^xR8 zXVY-NjJ#0p$u>O@9>i)YWKL!krc$x{2*m}+s~n0~<6Q2f_1D~)uah5P5?S4&8^WE1 zoVC{*+|D|;x6UoZuFf>L-Sz;EGvF|mG!QUDxB~2X1y6RJ`x1fl+kH8@)Uq4W?I-*r zPkiye7ufZG6z^y8zw8E$|6K-R$IF7><*)W9TUeHLMtL~1tFkMNns)-O)ghee&=;Od zw?%B#xSg1rYH;nGD90FZFa)ao0CRfuf0c9Tn+Jk0<5>|?eZwt@X|LQ2SKQoaWzR|S{V)%YW)~p)zio5&SP2L`=k~-7cl2_bc-WYmD6qJX92mj z100*V+j8qC?D=oOu>ri$lXnOO-bDu|hC;l=1DtG5=fD{Qftlz(PYxVr_r5@%9ZcS}W#?|^Hm^I7X}1lL*hJ4bRZ%Um4s-;6xGEoIuyZU&8V4q^12%;!&@gvfO3 z5gzn-h-EdYwFTf&hP>1#wKfj_uzqzN@T3NL_t;K0b!gBJO&LkEy)E}}QuPq4B@!!E zzqeZAO}quf$I>24Y-4>b#Z1eoldolA<>1E9;8Z}t_+%CilxO1`z!wF%wC-Adg z2lF-UrGXlaZily?PM9w;9Y==&f`zR-IKt^_%w z9mlnnHnUo2>F0QY<5G}is7d){4AsqRsik<=p&5BCrLmMggMX0x^IDRW^9ohUX9>yg z9?Nm;m3ZVnj{P|7@jTJ@NTtNr*R%Z8zi4ni%NR^GWaYCAwEysd^P%n42t?&6lPd|Q zPXXMcLnPsWWm%YYq|Plf5{8Qn?l$JmG~gtbG!8H$i6fUA1;IQq^N5^5PJp@#s=Kh#pzbiyGDT5Kls%WAlI zaE6HX+40F6#oAvJxL8|<`>4V!d$Ex!cOm5b8IBr-Ea4{e`nXTDd$uTTMQCQKtHv|6 zgPm3tw(Pfm8mg64^a{o8(YJ3An>;z{HW3=`&>=k6r-YW$stnV({g}JZ;ATRCI?aIN z1_F)(%y{DR+`E@9&xNrd-VUD@r0yw54-D z#_i%KoR*h6r4lDCoSa2}Mp(W#PpznDK)<$d#Z{zWi`93uv#6yl|*TRGwVtV4v^ga|Fn>g(J|%-w8ocQALE0q6Gt{1!07 zSU{W`7WAx95rU8^r)r~XIIqQzPDWa~=8`PpaFUl>CKcL(S(tjoEi3G{XRwuS>)9J- zm0!9v^X2qbLWj`oUJ)(7Jo!uGu41m$;O1fOr+-{lU-bg~8!$(+A#6{}v;;xWOdt2d z>gE9ISptP{4SG<*;&AWwr#HIF-n25x5*gQh6bBg=&Axbx89vbURBVrdv5EomuP=^_dmmbU)+=hET~Y0V0`q!rPn zVO#}wrH`N;B`uXb{4`M+Pw7=jOR?fl5RNR%6S8z~9SU>Vo`bxokIJN5D?92$TTCY9 z@nA>2QWg)BU24-a*0m~P_Tpcz09!W*0d`b}@YkqNEfv(%xnr2S#^7#b?m`33>;^au zFlP;(CoJenm4+a+0%z%|;QCNOE6P}W=vHY11 zO_M=7_ebVlHn`WBd)$B-T>*Ci=4et87IaNILeT%wBq{f7E=W=*hY!|D@MmXoFz|zGaoS~b1LBtI>1ONvTP2cMt`00 zeKrFF0L<{pVceUlGx}vSu;`5$4-qBVu5?|ZF(|CO#aB5nh+@h^nT6E3JW8r2G>d=Y z9S6!=A{8a5pW|^X+E~hwK2)ue<)h^&rt&f~sp(Qt%Kof_7CY1KAjG#naK+A#JrTq| z=n%2fE(F_8JxG)7!4t@nb<>960hsV5}8s)dTWqI*=7`1789m^K1f$N%Ji7p&^@U1g#W`>$zal^@_&ii24n&(46 zaw`eIik;L6mj24MycAm3GR$Xer_an<)AG8O0aibJ%iwebSHmf9JTiTCDzmfeY(f7UgRIFFmViaqC^n;&vPVZEIWHiqx^VO{+uO z>syK_7rN4K^(`H-i>N{a%f~z!r~LTLx9mTp=Jls2p`qop@^@SEO|q23PS@H=mRsgr zx8WkP@M-lS6>n+KhshpxT=US7>QK4P8JCB;H3zJq zL!{iSw>T^;&HCz?#@)=^V1qlp8K9>Doz(!}ordSXa(Vt6wx`u5s~`xq3HlRhUTN_k zQfoTCYKi`V{Sd+vVN&4~WF<`bPg@t2RuwUkW-WOX`J~M$muA(PLVThQq1mU`e2kgx zl+JZyZj`~D(*)cC2J{C>wE||8b7}VN5lu5YB<+Hv%#`=`5o00GPnWk1#_Fw;F1P(z z-Z>q@MvCrslFpsN+@B0?Aahq5kT7ni&IQaU?{YgpcN>DL(2mxY4!N%%@N={F%5-fb*FCi_($rAxDpI0ScB9(U<@h-Yc$>JXw6|JA}L zcNLA>fVsmB?#(1{dm69<1gdQSb7JoLL08NULDe)}} z?xsU15e&Ns)cZO&A9E87?#71T#u~6BNNO>_93|Eta4B)&<^L$*DAnF#HQDp>h+3L8 zV?QK6I^xpe0ZaZ>htOi?KbjV;bnYzX?lrgtIYVzS;EGtl#ef-?T+tN*3wk214MFIh zd4H9dHu*v%`Vo}zm8G)1E9^iCg#||&lA>6NP#r>vD=#!9mg?MJ_kn9NxV^aC_~)=o zf3*VO1Hg=HE+u-vg04gw1Z5_rdyi-gCBj&Vp&cx{?9s3TCC+C+@Y_Q!Ny}OAQyoHy z70)##`smzM%sppt%O!$)(11I6fNd*a2A>zDm1QxopexY^g19r)Hr9=^Z~O;Z+tJd% z?#+aBTSvB9#*oyB1sBpGl=$s$D3NBpw^!qS$6R4>`_=>e7iB)&fut-9+Npm4X4qXy z^k#cnnKBE4IOC2inKo@yEtKvwsFS6meY!T#XDtq%+R~6Tqb?*R=nzW0f2M`Rah>~d z54e#AcNTN=8qk-O$OV`&%caCjSkRT&4nbV1PhK9Z4b^v`hMg@*_5)?L=;*|PQxCYj z6U4q7qeCcBMpxpk&MnK_jt2Kw0=SJ0SO+Av24Kc|ml8)DE+roSrAJ4+5gmbDEZyxl zwP8l19s!_$c}&+`q(_`x4XMt zN=RLa$?peeYvFj)1#JfVFx1ZDCSw56X9_4F-WVb%w4w-I($XqGyQMB#Q!!s#f(tGG>5H0XJ|NQW;>pN8Xat57s7*C`Swd*q*A|~bExzO?W^-p} zbAPEtY0SO+wPk_*&yt$|(ziqBJq}l3J*xpF*Xt1e>#S8W5W?BX`;2AociwJx-_oy#T52NPwP^3GYvaZ)L>VHVunPrr z2yHGs*0foybFVfG(pya#ii8}N@P!25t1xCKbprn{j{>f?{pv!`WwrwSymXd|Wf5{q_&2okJ`x+eHJ+M{#MK8;D z_DN`bXo;*VhDbDD?g0bpWNV9*>D}g*HQl;VebJJMY4VmGYxb=h9IJ1 zL`4M=#T-!)P*5=Eh&g9iUDK$jh~t>G%yD;h&91wSV$KQE>Y8&L)HSRbSNYCcHQjjc z{r#Vh=NV>B)p_4K6}q~+y1MEy&-FXO4I^$lgS(%ulj00m7bHhb!1T3xuJ>+n)`8@B zz;gAITUb5@^Hdih!f|AWp6VM)^>+c0YX3(()k-4Ofy8A7_bXi?O*7zlICT67m>#YV zhJV?t*L*QJ%1B$;7i~}spxJNrlV3`-h`>Pk04?h?NZue_eZ?{c%7IwSSssPy!WRZ( zObx5w43?V|Ia!hJ-NawLmUzq?*(P@4iwQh`?pRo1h+G>xn9dr4f%B!T_)vKYHi}z6 zR9ecjWQL-uAS>bSw=yN78yve{W*G!{vay52)kelWzl^Pml3_^eR>lao&5@ z__%n_Vmv=pep$o%4wsAIZZmbbJPh|#pNGqRq`k#h_Yv~=xU#D;7(C^s_mqcN(vb2v z3Mtj=+J$ytH|Im7V=B(QDG|Bw6VFJSf#q0FLz-#sZ&uMbviTo;IZUrvNRqra_CQsH z(MCj5hT$!ean+{eXO&EB~QliNwFr&PoIWF<-N#viU1zPOTwCCeM( z^m?)!>Uoq79qVh_o~AE5l#Y!H-G{QUA8>7Y(jM~zMy2zw$1xu59qgWn{@gqGwfFH4 zF5c~`tO>Kv7%7)B`Siy@hiG$gbamdrRR-7(kHVdxWz-TV|CmYH8;GCC-c%ewjsU8i zH1`$=LiSn`X*fuk{Se95yf(66H6O#0)amqqA=c`7lJ5cK2R`2e>U0IzJD*T}TMQ>Q zp3*<~DV|UTY#)V&S(_gr=G(;Z1Os5K+*x|C zi0vJVk@eoJ+BkW#2{WlzC3+EBu+4u#ZnW*b%k`tA2sQQg z0^%s~K1aoB&M&wZiCf#?<|b~K0ZUM95kOm;2E6xQ!}Me1)xLa++}O=>b)xJtaJ=kNbe!yx zh|gMlyr#-7Pw*Xr@HBib;gioIyL7~7B|Z=Fu}_d)O5-yGpKN>@!p|&x-r-YylI$`T zpM&_grQj|epB9s4mlgQ_gwH1YmZu=SDRL-Jj1v6+``D+jxzpt_lK0Qd+bV~KuSqmx z^MnSU&_34Tr(^B_3=2nk`!@I&AwN^d1ZRkhfS(dse=CNsDzocWIb3}^m+I)S&JYI!I#5hRs5~%qx1`iyw1?Er3-cf+X89>j+-eQD%hFsY15k)k0Mua2cVHdV^ zhFq}96^bb4jKG8=Gf%_E8IXv*R{P>J6rWL6^C^(6?&rI(=QHF8E#ps5Iy1ZD{B4u- zNx#pwH?m=Ds!UG|QD6ug`*YgNeev7TvM-G>nFr!Ggh#nK>WhE@Y|Tu05T2*{%#yp% zdvLSl79WJ z*N`?%Q>%dGVrd3%K`1&Dk-);s1xY|7~TKJnK2KEqvOt+^eWe*TQL<9u9_ zu<53M-Mmy1XB;1=GgGoh0Bbf^_QbGa=ecqZZM{DYMY-=^$xh9ck7Ek zPi~1tPwXKJzd%RHIi#@Q{FpR*s9%m<*dG92Dm^z!v8d8Bk~1nak2 zZsPI20T!>K2T~dA%_=#+{rYM=#FoB&+qo8!q*q_rt5tFV7V?vPBiFCEKbc02etkpc z^|M?6qjn)b%L&rdf9<1wmK&R-8eiNckwl0RtnT?Jzp4Ria_la5h|Q2P~tSJdvF~zG=!B*5n%%{zy}z1YdaQ| zw98ecBSYA#ZE`RhvqkpsSc^*xTt&IhiePWH%GIPM&dAqW_j>R#H(@DmK_xBj9iXY7DE zjn9zz+3F(Q+9J|_!&qS-Zgn5vq_h=+L^k%zE>f562wjEE2`sj6UAaL<*;~|DDh;_b-V9o3! z656&?R;1hEZ1+w%!lR;-RK!WT-CHEs_($%lEbC{N>u3`(;y|tjv2MFi@nxN)C8IcL z3@fk;q(CRhQ;^2=;-0k3k(_k89Lv~+1czW`fLwK~BvhU5DH5zMXaQ{OZd^BPF3%5< zPEDVDe~9!F$a#oV6Ucdp6c)&Nh!how4v|D$F!4jApa|0skt8-T9eL^4gQuV8R5GtP zbmd=gpGXRymg5RdPgwaqDDmd( zj5Da94#?q!ZkHlE-zZN<%gW!fr$yn|uj(Wg7p}T>5y{*>fTFvAI~>xmH$)W7b9V8d z9HO=#%9~A1*6|<;|1&P-i1avEkfMoXwIo45&UX~k89%*4u#Js(+YjC$WBG%Qh);Js zU4FeMxws?^Ss$3>L01Kt2zuTPtCLsYtCN?+>f|2~G_sI)`Qu_~@~9P_E?BA@q6q1kqa9A#H8Q>Jq_J0NJ!ZWh}5^xMb-wDY5y?~Pc zhk$4vmt_cL&&JAYI*tAX5k zsiJJ+X`JUix8qU%eFpG)X&6KeCcOxyf3S$4qzDSza|~N7$05owpPrPbHH<~K`y=7W z0yhKZ@ks)=i%lDe%h8dz9343naf684PQ;A@9>)TY%T>yZq~P2XjOk=H^E864oV9Wr zzgJ7$MPD{^5oS4#Cxagfv-QX2a%yi7t?mPzDzn>&Jk~uS`>^a2a$RYvGi28Z*(-8k zVO)f!(wnizQ}f_I`J0O{N9Qn1OiRsAH`6xrYzk@2Lkb~;%EE>qtNXmdqAaeo7OC_- zDf_6Ec~nhjRA*<@{gZOu$j61?XlOYqrc^%gfE#HF8Wf6`xYPK1X2(-wNr%t`kR*87XX5Xk<&*Z-{_Tb!2SgP z0-UxI`}~5|pS+^oxVPhOyA)#k&*9nnrIzgLIk^lQbXxXQpBJPQ-xL%%?9@`^@WE-h zfO?Hb-6`m_YT>jx1FHc%YM5@-!fACz&R-!54^$odO6#KD65IkfZRJ=lYMd^rIby8t zZ3_tZo0@a?dGh!4pxgO_RQitsi193dYs2b*_cG+E9bXos;gQdKR+LrdouMZ2bn)8IS|w&Wv&-}5;Qny|0u zVGzkf8|HHwBsdK&z@RFRs;wI&u&)S;xWCKmG>CT^T!cXr+^%5jL4Rio@$BnG zxvFwM4~0Hu6E7p9YZ^QGf6DnI+kx+J#dMfysXjO_padIG$Qw*?nU?B{kmISj@gLSz z(U{Uw^8oO+mFh<>ZGIx52aQB4>2gW-R0{B@KsM|WQX9}nq;~0&Tu$-hI#86*fn{$a zFUvKQbk07=*?7?vVIlcWbrf|_n^HqXb>o~q!sCNj;jzY_xuE}lGgHUXBKkh9o)1rmtAJ=7H^$M@?Th1ESqM7*y znn*t$I>cWX%#9KTn{LP>uz-KyO*uey+4`?#gG~qz3ox>Ld9tH|fM-`(1}z z++_I@#z*Ah*W=7yw30p|XQt=mJ_2Gy?syMAB6nVJrxEvUMV*_rAMlX@Z>$6S3o!jN zX`&}GZOM*5svHMLcwX8P(;w=`M(%QTVH2LoRisx3?e=H#Ym@YKKl}BCJjZgl3|Hm% zGkiTMucwrOhrf=i0z#E7k*iuLxJ`+hZg86sccTGU{{*-UFx^8}RfO!gs%SWZDvYAE zE*)<@;%LQo|1D3m>u}bm3we z2yQlU`x{&r;&wD(bBc`zO#fRKbFQ>5<{fQf_g#s&G3_-bJr=c3eJwYZETJX2n6WG2 zqG=gjOavZ*I_e1sF&{c`G1))T%ULH0vZx~hess^*u!@i5y!mv_i|PDL{uua&e`u#knMes&I%hTe88+`tjPXB z-b6!?AJOLRrCGy|m=;`}{q+%Z;-8mdexDGVzz%-GdBu%={v@YhHRy4lCPHwV`QzWeMq+a zn^fOwqKRjdrhRixJlkeEQt{xC*%N{PU!Tc{qmMJ5^^lZ-$k+u*X=R#VFX^iMZ3@Zl zE1m`7F|l*Hj~ha;&q5hoKDBrE`-yH6+PSaoz-qZGMRGm5=ZURzq3+f_drx?YzQ9`770=zwrXAzcM^e+!d$T*W<7eUJzDvPE28SGd= zB}&S;z&r{mm9UaY&3Qrx4FVO<}nH~P6$7}w{_VB_=xCw>Ot%x#0I(dd& zDWa5-j-F*wQDr}NvpG~$u}HU0v-*KbYw3@ZY;mA6OZw>~D^pC##6-(H#g+D0ifC|g z<+il=6iX<9l;0g?b4w_#O(mJ5gfd;qI?9rQkk{Qu*ybSR5}q4PEUA>kdnVgTDvhu` z2tko$+3t(3wF2J*RK7f^AEW77$)wDCV&>0nm3v=W7d##2fw7o<~%S?gdWLYjMk z%@0;u(8dnIN_lKdnJ)w>*Ru}_QGPWQIgZmA?nRY-o-Ub{X?;(uR~U=6B)PgE`TpZQjdCSJGL#a>}35Z+ltU^2!lY znEiEmr4wFJ+0B|%K+|b#|FeRE_pj#fvfrqv95SJaE~~5ro1~L}u;W#ficxM4azTOr zzE0?Of}eguJ6JnM>ez2+9;`6Yne8a(DI_LQXS72O4d_q zp~vc0PYIQpZDe%|DFxZD_29fYi;q+uNO#t=@cK$OY3VO)UVUY{=@lyyrF1a0Vn0SH z7H_wknBMR3D)5zD+t)EATG?qD!uCfid8I|auq)BZ9_j5GHZKNkyDd8xqhPV|HEc)& z)Ne35)qS2I(rQUlwM){0farRyu%pjc&+w0Sjq6RY^6X((|@EZSSM zIAxi%Xa##2ho+2G_F@|0=sC8WO>Cqr$G)OP8zURPtzz+wl?Kw>Wo&+9_-x9~HAe4+ z6{O;oXun<`K4Hf}Tbn>ERuza%Kpd?;u+i~KAJ?ZoU)jZTZUNre7m+D?rGsxkvd`|B zpma0g{jb4Il+O7gz3I$on_#B;Trdh>v^*NN0coNn6ghjIisP!+|3%sUz@E@laW_d> ziAUZInFP zQA9xNJ*QUxw#rVa+gw4o-&QG%9gDKtDrKd9GeuZrJ7u1_3Ymb>P__+;u+Qz3p3+?_ z>)KvfM5|%8R}Pz}+bBJMDp&s>*oh8GUA4%3ZZts{g?3a@r43G}Cp#*W@Df|&PUt}P zrm^XrltSw9X`DV=(9d*I{>1)pD>|b?eVi(!By>^y%*#?e`MRdBt>(q4Y)}_vnq;5G zK6b&uIG)w*s*IHoysxXWC|~Kx`#_o4hf=tzz++F!>8n>_qPO|mz-=9tDp;R&b#ebgdp+rjs zC$i?l&{|6OR60mECyQ*bo=V5OS#>^VXI4SYV-+{dD@L)McO1XX)Lu$|>F^{$oYo6x zol#Ek8-Tjd!pmqCl~Ez~te0|7>h6p`*juS2WjcY@M=6}|mvKD*uSN4(&ymf=nY(s< zls?kWODMEOsfvC@*6kb||*@S^OpA{c3q7DvJ^5lyh$(3CY${KNG zyXS29${?Hu=Z<1y2Pp@n&p)z=!HQj-J%KCSCK^Y;5alB-419+wJ@WNU=DxNGU;R0< z9d!CyH&j`VW%-*8!{x~N$Gdi1H9D}|gb(}I^!W9PZBrA+pqHz%aFkT5OwYpD^n6qJ&6b(0K4u3;c zV6G*cY!gnNj8~GSVgrPeVHTVmeqi1caBVoZj|kf}K}nEK^b`kI!HG&+2@k%KCgSw5 zxd&T4QL#(E7iS$NDGPC`doxKnq9yj=BAdC1W_&$GxhPHQDV!agtTe+()OU)q7`GD} zrzoGa?cF$io0}-`lT%U03agWf3!IT`aH?_}3&_S#QzBf)pg-~Hi2h{VH04sBXI;>! z<~-p!Dut^D)V~Y6XhpGXOjDB8%ZNr$pa_bYuI%+n=?n{x$GjOTorRtfR-DwUvaVKC z<(E$Ej8!=-J#Eis%}{2W!dRdU4Q*=&R@bI1(h9dnp{8M92S!8S5B<)b>HozN~) z$vaEgV$R=&g5rakp|N9;#aXxnsKLt4#zE1M{We>vjdSm-*~)QDQQJ8Oy-3TpLP+); zr5(n5+RatYOOM;Ika@}msar=;=$Z4B0Ifwwkw*_vOr_^5cF!ymBw5ekUHuOx`?L8< zWs~bU^Jgqt>h`6kOy5(N_k zV9S)w*xu;=pRIe2CTCEh53YTIPRx7>G|f^uC>sakLCRdz4O;t5jO58Wu!Kno7n;t(f$K| zR(eULU`&@X^M6(nv=V|)PY~?#FG?AA^NY2gvNJy)|k7-+Qa@>x6p0_CH%e?$maru9J{zV*pL_E8*RrzWu)`wro566YMBW9p} zC13C*U{wJz7V%;kRy4Jm-}mO+EyN8lxJ8NUVL%s({W1Vo{llnH(pCRBvg23%YvBlQ zHYs?!c!Y19)vXTeuw7YgF$u>l?!mMqOhLx&#FrOmFS5VF8Cp`;@UJ>BFj> z2XM@qhT5kbLf?UVtfPl&AHyG|;Z5xIb4L(h?eK>Umk{Qz4TzmUoh+`S>fzqGI^ zyz-&&VHe+F7W5-_B4J2}?peK8MRzFZgR|9MO4u9XS74hQ(G#^*LZFK;L=-)<@{ zUbhvOB6k#*a(5M%I`Yfq za_KH0lHUU>kdF%PIO000=u*!e1-x#+^BVw91LmyD5N{+uTqK{YV)YyE$@Hk!KI5q} z-z44I!-{7rO)b`PT+XfaaI&?Mo<#Ctz*Pc5PMe-wPFKOr|0^O>3~oQ-CK<3ldFln2 zK2R@>r(t?&nBfQ`zjadTiqbG!gv%~uRKf5ugj^OE5XoQb!IQsFZfyQbi0f`}pC1DJ zP*GR@VjbX9!1O_S^8JkDXTcGFkEPtFFjYSDHnf?SlGkf z^11Shgg1(_{#NQ+4uk)M)fViwy#1`lSB0~Ym^R{EFeUOVug7$^U8wzH*wn;+&aXKGhkhc ztqGV@W_wHOq91hRqK$U-z(P?r|4L*e8$P1R<;OBy4U*psDDaEB20hKPje!QFso z40vcI;9kI-GOJ@G-%}*t8AsVo@5#k5Aj6jYqm;xffrJ0xLUOkK@jr^2gq{4Jy;B-m zLRXV)^U>n)_^PyCG%!~;C?2lzZ-DFGQgh!(-$LYw4!YP z(l8LsDFKe+tUsu+weBP(!{cTPjFEf;ayiWK@oFbvcL9-nevy2p;1(cmjKLj4$yYUC zSxUY%VEPh0`Cp6a$)9gaWt@O@nDZrIkNC100<-rv7q{Jwy_#up_- z3fquKsm@%4)=LYnc%&zyGjPlop|k%p6x(=z#RCDnZckse*+u%ouG?QRwuoJ=zhQhy z?#hmSQ=;>^;UJ?|)tzfN3AdRqS~>98wMN)t4F6*hp#REviU|F$jAQ#wS2fTS z&ko_Mcqr%W;nR<%WG7+I$McSSW8GZRX%QI$9?aEEjWr!&@os8@X#`v1rgo*xDc#gW z({HS!J5USz9(Og5$uh;tn^-AdG>qnX^%h=w5nz1*(ZoJs`Zn6*A;Hb^L1amT+YzCT zyax0nr~rPqW-<&!3*QPy=rFhNHGylrA1<>diW*>fKa-1?Nsf2>>moi=m8w{3|JK;M+Lz2sru7{9bUSK>(M9) zoY!RDFZcEyVY#OEj`bdYFt*kSe(;CbxSYeVz>;pdoQDem?+6Gv^Wg;*(@Ss{68Dh7 z{Wt^gHv_Jp2Dlb5XH}1qhMdOH_O+V&#^mjo&yVNx{7mtDK3khh9j#>}V{`>t&0fk= z9c02*QS;5}W6Q%-E^({|$LqXwiH~t9?pP!sBsQtbB^E{M=*pTAcZ|W^4iAoj2JD^! z*cmXV+U}})iMhj3j1}7;9Kkc!IO|yl`{bpjS#D0{j+4N1tTgK)ZX+9x*#bgDgF0M9 zJ|Q@kxFZbiukhgLX}}JX09ym*h`6fgBEClamxzTvYA?&jDO|&B&>VX_bq$~A0d5iy z8oI+2byZ2|?Md8O2KN{|I3^hIhlzm00CP0Fm30jPU#20ko~+8DBM1Y1bH!sr>7+J-OANm1S69#1)ag2Dc$X9g+b*jRSnELic()eb6~J z83v*US_((dy@z_B__Td^VADO1n%i;@HYk^g|@uLr2L zBO3SZWL> z1VrA)mFE@EKyWR@-C%I7 zT-p9lKk(F0gEmkc;fTjZy6-Xb32ouD5t&Glent|fSWq!_oYE2T+5YZqeKEC6p3y&u zBwBpYg{WoOlVWO=a_K$M#>D3VQ6g_6CWbtTyEyM$U#jpVH7Z`qL&YDi2wC#^cC zwW2aXp8tHS%NT_UbQI)~t=BiQ&d;i+SJ4)O6K$^$q-MKWg8EUC=3_5W*{|R7WKpEY zN$Y(9p_K*khLI?^i-~*G;AZs&_YVVZB=`$p&b2`>3`E0d0!JAMwccUrwh=0neYI~5 zQ9nzTO})5^gy--)>b0&yw!l?C0imL3F|NWPxW$MYZ*V6e)DdC8N(9RRrk~UEzU`T= z;z}U(51}9V=0#|s3HH)qY6Dlx({5bFw5RaAlmQ15><5^$Nd5CCx(Z)7LNArduaju4I`$%5yp? z>=+1V=LCd~$uLKANf6wr#NBRipLPXzjR6-CoClaw82*NiTDlIFUQumri2)a_^2sAO z^ff%(Mf-C|0wVEU1$g2U1vj0zk27_l9qG8gV!(_pfF}Uc?fDhd%_1h+DAyBgdDlxi~rHXs-Ym{S5r9_k`81O7uq zk|)bkSuLQAMuAgD-iB4HtcDKB5>0d-%pCh2dS-v8V{WT}(9{dAP%BkM6YWFXxdvCI zJ}Sk4KXwL80!(kD7tDtTx+XkDs;uU-3jXPDqo-Kdf#>edIe?i z)iCkIX8zolRjH~@#qxH0tE%Os!%6H#Rke1ZPD4>twN5A1@8|yhj@S1$!_V%p=xS;c z--Z7fY~{h_*`L+aGSaRQ>{~T8NP1Sx9#mbuX{z>hxVRMX_rd8l(mVLDW9bJK!@{p| zJ3b;7|Ehce!#nt!_wj7p)AN-|3LhQLs@7D?YflkHmlaLf;F{_VX=5NOQ44poKibFE zQhQ3;z#)8q8O!x$MyQu8tJ?BPu5le@*7J^DQyr)WYb_wkHH5i!Z0|UG^+?9G=DZe6YC}J%c%UsOx={yx#Z$UqD+dY3;mJU>lW z_Vgns?cFCMCfmQrMGu$fRS74NvGJ~H7ee2?VM$nZzGB(KUM4{;VX}C~@;1Ew6x!vb zb9(DJMeXvafGE$=*YI^O2VmxWS^AddAvq&DGtK zB`@wIaRhBWf@E);)Fpmu1)DPhLgK{FTw)8sO(E_UgX=~e(Mkg@hya`om?JSa41~n$ z@Zx9D?Ve$8{BXQL&D00zyT;k6eXAa07@NZE%;+ znV^aRLu&z+0!%Nb7u5QLx{7ljsJhVC#H@?2^$9(Xy?k5sp=n4XNJm*b+z-!QM|Blt zo55A~5e}i^k9SsqfO9nhu9q=e%PFXa7fhY@1;BK#0!Mf)5_UbCr za@MYcI(^7!=!OKpeQ;anur8r8+J>XNfROO`A1-01;6B|8Zf=7cOF4Hn;ODARxj?TMwpl2u!y%szQe4~hkM!5j%uZnUMNmHZ%UkoL%gIf>cRW?DGC@E zo>=D+qvh@5$^TkkeU`;jGHv zP3@*G>T;8LVFGt{8P4|XVjH`{**63k&LYtzavj{+5upEdc00l8Y&uQ|$k<*uTf39( z=>}&n5tQQ$C#D={Yk~gP+1bWUXXE3zv)|#&`n$;H9R%e#!}%r0SqjkqI@=d#uh3IH z>uRo#8ilfDa2Bug+%)0vE30nR4F*_Vw}W|b=<#PD@r z0KNQy{?}JTq|?`y+T7O*_GV)H}iaPxf(@y^S-ebP1gNay?KABfHwMJy?%sky3U(-vfyqZ?sXA~BdjU4=hFr} zSQu~*VEQoqX;=gdMDy+eN4V8+wa-aXPnazK7UYR9Uk!&Rf6)`4Ss5O73y5QD$W@+r z^+KFGjJV4TZf@e*4449kj`4u$x%8(4E-(;@mx7~=m`aZ#t?v@7VOM`p^IG}{ z5h^*ZWO&ko;VDQ!h`4cui&!hTw^o6x7~BX-_0!L~{+9&+GXZl3WCp-Mh?oOM7?627 z+#HEv_q3it_JJeST#{R_N?tCkLX>AIw)#i)y5&Ybp4&0YksQ3;p0 zsJ!_(w<&Q)8{BR1;22=QZUj34=7_qpOc&(_M;Qs&2U)3fD%$$_xyn9|R!3T1AS3Ad zrhwTrTHrZ)uhK=-E)Gv^1%wFmMK0os;Cd6crokPGP)Dc%ixDgY zm{SrfmgpjmUZ4hwos!g;N`FUMk3F~77^gOOwVd|lDh4okUbswGF%SoYBUM1Ch&ant z$hkSUE^+%C+*R=4=xD&^1mgj7RGeF=t9X~;tPi=;DeIf(?y*dpsQOxJ3K2KKbI69L zTXevET*@^;#AevysQf{2w-Wb;h(xFlrFzDIhkO9{0_KRQV~FTUBH~iAO(Rhj2P3Tq z?TaU>`CTn*%{+V2^Wb^NBE2Zymx8NA0ih!ADX!wK;N~Z8l)>Fy65PrLECZ6GBw+eu zzJ&{hR@cqdi{k7_s*tp<7~CC?PZu8+K1Ee6g@ogM;5i&j7crPbTo(``X2BMjZYQ{N zh`ZO|RwNOd4Y<}5a0Ouc3tdE@A)6gxdr9cY@%s?AdS7aDNx3-;9#&!*2fIuFUtc0QXv<7meA z%~F?{cCZe!)q#?9mYtlf_A7J~HJD>?_NA--F#C+-AWN8|Hnr?>;dR-5DvD;ZRWC*l ze$)zxVhr8Oi}9V{h7q@&!99o0#}Q}1x*$1f0_N1^-YI%rKG+{y?cjT3@CO3<^Jv?Ho<4_9FGFbjr`}zgV4YQYzt6&gx!+ zty-cs$UD=WZXL`1=gbuo`*(@@8`jI)x>OC+TBAF{txw4ic5SKJ*yAsBM>O>Mw~sw+ znYzx^GYChnckpStJE~#7w^GHz@ZKXK#^#^+1~My+)iZp^1DOaC5E;I)3B`=th95Y0 z8F3YZ8$s~X7~S;cYrssvoCg;J$d1oNn*&FxP+iLZ+ z$rNorwN~vTOOM=G#SQ9+vVC@Z;jd9+FNQS!@^gO7{r~3$+@!hI`*6aPWKIv{w_ax) znB}uU^)uzSKi;55OO{Lhc|iryWZ}!TQ9WT_@aD+lFigHDdo}k9E^_$h(mXZCqh?5Utx^%EEVh(jEGX#W) z`YXAJ#)9ic$qX^L$;3@GU>ow(95B+>rXrHg_P^X$*O0XW8oYg6W30aOK?YJf@FS)a{*j|cAm z{;B?C=@bnb=IPB2Ei#3UOaH z)VV(q_pSl|+6#CAFlXSQ1=;Z#L2qIQwa@3S|(s#;BI@lzi$+rQ8$_TZYj5ihRKysidITduHO*VV&blTb_<+5Thb z%Q1ybyP=jg2c$qe-@Dvq_GNo-s9P}waNtc$h^x(PH}Sk;V-5E9rg|<<NZn;=KfF}>t;nmU>`P^in6P-u*gFUJNZy86p+6b44i-1?>QKWM4Uwh zWU{Xh)tRO_Y{ny8W%aYqc&vt+ED=9?xX{x6?pSSJoXa;-&6vX~z@%MOy+*g-q>oKo zIYjMe_eQ2{{wD?3MBK6l_c!7eHlQC!*t8Y3-&Svev%~e;H|?}ndy30R%W#}3yvtu8 z9ap)IL+iPY?&V-@tEB6Ai19_ocmbiKa!;<~tKe28Za0Jbl(;Pn7z>gk3NUAPfn#BY zj^}pinJP(Gq{ID%y2mpAXP$bMP}n4f>#0{g3fNpgq^@-1sb3IWjkuK!Zu$|xk_IdY zk|Qr*`fI%u7M0Oc-=9dG;m$pu(H(p5Ovy6Y>;A2_GI{yJM{HVioYPDgqhu3{YJOpd zDaa%?O{&)t6&-8>5YZu37{EZk9U$QO2~V6FiF|BB>01Ab%Puhc40yMke8^B=Yr z>TZSU`J4+2$5{g&Sp&EqFujkiy&l=|`VV&(iyQJ<0m%;z2 zb1ju9z~(=BC5Uay=!Nhjxrr4J+P`(++7-b)NZe3^d!J4cg$$URV$FcI)=hYlbAt3F z?Qnz3m-CL7?dWA+3|e1fv2WFZQL#k9TtPA&7@~_PPL4Ypu;mKCCV)9RiCrk6yZ*pF zzC}%>Q-IAs7g6s7>yBK=(Rl%pnHzh1Up#g9zY)TM-mCp-tAzKM-Zqt0`=E}HvVLcqKB#S^B}JIqM|Cw`h5Y5C znua&P!$0BaYMn;PaA6F>(Gy#!(U6FjO;F>7;fd;obCEwYAEy+_8 zz?@edE)>?2|IiZ2$Kj?>yzB4^`>?24xV_(CkIGW-o1|;&S*d^3=9Vc1d7)fc0AIfb z>KPrf6>y1wP}QtCFO>Fzn|mQ5#~IuaI{^n9uqS!y3YgOu+%KT3Qs4-MQcHhlMzIK& z?Z_z9@X?QwFC-w6|FaoS{wBGx`OhbAc2QmG`#%6*8}P||!25tX?-lhhl23!9j2Q2> zHzU2vec^8wvE;AnB;T*yXl=QWozhFNWO(BO^dgz^5Z#tV}p~U`SmPKUkCVyfRHmFj+aJ~ z;D*gaXa0WIWdG+<5>`Zu>Or#Kv;G-?OwZOBqg_#94FF@}>AO24XrNdHAF zPyapnvH5QyZh*n{ru01w=t8ky@_pZi#u@3ag`@v?H;r|0*M{Q-lC$nwdyfz8MUyEU zW)GLOxss_SJECe~USm-?xD?o35B-|s4Ev^PrKNSAthA;rtk4w4d^$zorh|5M>6jTo zy#W2f_AbRxfqYjNwXO34!opr^TE4t(k-^wB<--xWVHP`%oOk@g3VLWE*x)!is*7<1;Gdu60b@o1p6B))Sl3%^`?p%0BDSNG4n#ts~4d)sobgjLSr1#neCx-rx5qG0iRd^?*pcn=EaRubPpJa!z>Ms&^I+z z9d+fe*;v_)CFRzFv{pqabDayvv(>q^Syd9^@1nk}1GTP$7u#!lqb&bp0ifO~*L5w3+jvi)Nex>c~Gu><+E zU}@hxmYGkhDt#TxiseUZN@Mf$Yg_RZ9iYWU4*8~0qYeHM>gT!YdF!_XaIyhMj{-~v zw6%=qR|22E!iskwMcKIkEg|YY1>n6*BDx!PH|ZSnLDIdxz_^v;DPVdFy@>i5j%Kkg z1+*cN<%J^$QCk|8A>=69fHf($3ZSiJBG8!TX zfSYiy;aCTl-doobVmNBbRut4GMBe$r9WkOxhUGN|_|`@Do0$yw2+-EHFxS(Uta$m% zWL*ns9i!?CH(!X@+pw!mZrU0!fns9;(@W@jPG{+kUbC--w6?C(W|>)7lxG<>v9Pu* z^6qD@Zc!2pU9)jOTIubA>k9ziebeEy5rB^YZ7r*Fb^XYSt3#m|L1{G?Zam0MvSHVl z-1IhJCvwvkFujhh?)oR)Q8s&7M2j(D5wW6LSFB(%zo=F+@7g)k{&Th>&ks9C9sBvB z8kTrz&n^dQ36VEH@Ept^2ItvdbjeldO#9k^Plf{C2eh?}<2mR>Ry+q**1edvILaj4 zq!Y2EVb^gUU|s`yQmg`)Q{QRtbw^uSo#NV{sOA)4^Yb3f+W^{H7T_7X@m6=^Qii=Op+!fX zrVyKd3Nc?&pUbN_i2U3&;9r9PF94?3((9&$;b|004$?+PnT4a{M6F<0^6QM^2Fy>f ze&op5O?JUQx}-g^Al?c{KV3D=AVdrI>V`tka4a23V;ikU zv0p>99q0@@mw{a@n^;CWWjf3nhic`#QjmuX$G&7Dj>Lx0q1rjTh1jO77G{dEPcEyK zHJLiG?O|G3ucB{=*?t5u{gT-8Fzv2MvY#oZVadLF%oYwUgIW0s+Ru_>FuPJg8;U6} z4J+b|Q;GGjs4bGx2Qjxw+7#(h3bR(y4q#P^#+9{J(${-zb!BZ89%$9CqD?g=*-ur` zu!l7EVXLY&Gp%REs%ho0ykxU#+HMH*sICn&EoNh@qdSjhr>bl9Bx?}MRYNNv4GChU zYiJQL=~Y9kY1+qD)j)3J*wGqVSJ%uEUs%07?ggbik62Vqt%K_j1n^C;8!&rKE!p*6 zae>AD*V;4^P)loVddf=GhK_}7WNj@ncdKG_T_T>{1a`&wz7jiK8>tLoFKcVXrGM|T z+!5M+i*|#zunw(I^u5_YudZ>&^~luE@U)m5y9o#p>0VsK5y2fx z+^4toR5w!>ea(R9S^%B`Ob^sWG$uPPVi+7j#1s;NJ#Q_sY(`ye2G$%5sD~ziM>_Si zveG+mwz>x31iP&sT7>kf87m#7EtIYXume$AjH(u(yTyNQFwbbMmU1kB&{ozYTKm&- z>rbAWumosuxuz?eN}b%Bs~jRX>r|ebZGzj6xR*sFj`t!F@}eR}ll| zp;&Lg^uD@?ITv*icI7(}HaANgYtTUZMpugswMC}7>`p_ix^yR>J%6mW)73Jy0l)kz zouOf9?xJ2m)dwJfC;_4Evk3)c^FJ)OU(SGA%HY1}2W~zCnn7}?fH|**O^1Ofplxu3 zSuZzZtY@bD?LB#t$(|6eop-fVug_InKLO8fXLS|Ndc)QG4858*e$65kNrJnXxYtA^ zLRa(x_mlw-L;|J*reD-cs5T6Qitccf5sld$K{UCddTg3~X*2YNULE1NckkZbMJJ;* zy0CiTq?#jv~cnr*w6bdLRj#fGDFVye|M9o^?4lhPXowZq@GKb~9jG zICQiCOs6dbAPP@|j_B&LK0_TAMhzwrI3_kS*H+qGSLKigoAX}vV;fs(J1i>>gKqPG zg|TSI;S;(fM7R5l1<8&d>5*`R5}7xf*O7Ia3)|aP zD`qJw91kVaD8tisa$H$JhLSLF9T%}0 zjxwwbzAKSV?NB0JuCNL1v_Teckw7B3s00@ci7n1}nhm}SIO4DQ)Z zfS-=&rZ1}lW&)&N#*;0S%6=*fBCH?TeWzP`foZZe%=cq&dJ#t8@!m4t}e zg8QDhi3Yb6iD+)Xh7?;LFkRL~9Nnjjc=q-?5xnp7>!77u$`irnKcN~-TOQW4^QHq} zw15zi^$#xzSHay&+|ma3Z{p@Rpclnzfa#O;YO(IsMQn$o3~N;W$TTIh7-?kj9kq+n z$7-x-CvBAU)rBqYq+O6UR%HV^Yi+zPWz#Zg@j-!(aelaUyjw>rXUX2p1vjgVWJ(;+ z1^?O(Fpq!`eEJm^d`WO;5clJLox86spu>Q7Dgj;xO!w1Ets~j-s+$N$|9KJ~+eO=t zWu9ww#r^Fd)~T!3L%RJ3JJeNMNo!aqYO$ssY(t_}Tn$H+WjOlRW0w=PURd?GW;ZR+ zb@0DgtXy8LB%9Pt8zHUR!9I4=4!O1Zl4aZ&7eirXI6Bs`KkTk;H(`~ND*c2hmy6)CQ}M)Fj6ZQl0O>flQh@eKBzWF!zWbZc=$Ov=mNDn zdT(?N{jj+QvgISSK#y~`!LT(Q>UhXbjMPH>YDbZ|5^GE41~&8aDCRm!dy3gv&qrx3 zr4@m!-j7=K{LLO^;pKp)fw5_BUUAljfq30N9M36Bve`dsg?v8VM67KVb#{(EBNcRZ zKWa_R7;r)^(0x6UJc(?$6rxJmarXM*f9AV~0!$7R?U)|fM zX*hdt(XL6=ZnN_fFhW;|eV(A*m#|jct%+JMSKJcSpMrZA^9B2&DVk)GwDWA)RP8VA zU_Vh(P1xvE?Rv@PB~ViI=1z1_c%1c3g7tO0H7nMd=`fw8`oHFQn}I`V!hAI1_0zOQ z!Nsp?E^#QGyqnMZy1K;e-7)`4DMzkyzPOT!MvZj>o2;6!0%=-=(G_8lW98pwrvsjJk+HaPA7{##Rj8 zzEZ5MvFf;Vmw4{)N>L`1SS(LdG(gMCX3x>QP04K49IcRat)zYb91N{utFNrNTFD}} zvBgwuTFl*eTa{;XG^}fp{FFP4c?CytEMlHk5HoGs&%?dbe)eRZHrRZ-lW0=|4xv0* zu`O6dY3zL5M~_Kot_!rE{Cb_FR+04G9^+9geSucTRF-{SpcT)frD`r%hXpgeXvroj zjm$f&{6cMn+Qs1h9^`E|Y70+Y_OL@sw7i}j+92DzG1(stj6Ga}8~rzFtmIM* zE1X~pmukhmT20hk(!&u?PfZ)L<4ZA2W?`k4q2FrD8ZOg9F>PbSvj2~-?*NM;dERCR z7MQRsh9wH3f`W<}6(cApsF(wsIi5MkGpvdUan0JEIqMnjJiT)jbHgq7v;zL}i(P{~TD?8Y)OT=g~$BJ@Bn|RC~E)fgW-{D7v zr=xaxeQ@67ox8!&X^0q?d>}}bo4G+T*6*)QLKwURsqOiTr<&H(&B?a??VKiq)IfUN5)XcpYV@mWuu^A^Se(%%AIOn!ijGy^;%13(cM2qp^dE zqp+5V6+-GEAUcYP_uzJP@-_TNm24EHR@NADr5?kEFGH?BV~dxG1#qg=&Sj_pm;R<0 zLAjZ~_^31fV6T^qBa1dI!6BW?mtBqw8lYM2oY! z>oe>A-nD{m1#7cX{1r>TA6AN$gtH@A=~dzoU3a!-l~~>oJQ5WIe`p!!z1ibcVh!QA zHw#%U?!i464_Axvx_c~qjhHQLAI?J8iVb}C)I*&~!)01pcNV1jglURiUBfJE#YTpB zct;=8Q8mlB$THTVili{pIz$-GQrC$gx-9nRIx#GvZM>V4Rzo&J_B6@@t`;_69Rj*d ztptAv)y$JS=gXiK`*gJ^Ip_XidpiW5&Wf#vMKsC!^LpwilCxQ_-^9MygMH&SD7YXt zW`o#6x0|UO#M0q@b$Gn%H=qc<{R5v2T*t?^roaQ(m&I%p!<=g__<(JBx_qWX*kl%r zo*w5$tE0bQ8r@pPEJ^_fLWuDZq4f6*T!h)@Yj%?HC8`1k5a|{T#3>7^)or(}Gb{TCeh; z2Zf_=W8J|B6AwAjsjn00@Xb5yJ%oYo@%mjXAzXaSYX2@a#J>00zl+5@n)Urg>^kh& z?_wEY$?q)tcd;_&63hL8sn#$y_z$u1Pd;B@yK|ccm#NHDKcUB)sg+<0^a%-XRCbM) zCa&WBoLc`qHy^b{?BKb$2##2` z>Ygha`Sc=e%NAIi=UDa@F#^Xhm;Mutb^vSeCu$6i1pZST=APY~ELrDGR(UJ@ggtK7 zux(;*o#4L0%KpMEDrvXvP`+_&>~@&J5v;#etSdZj%XV7DM-6Jeb0kYkOu|R?)LA-V z=L!U{s$*Yh3Hhjjht71C5+&rS`m^Q%igx~5LO!Z3{8`2hBxE|1cZyxmyY=5Gb`pB} zu}eGAa5KIzLz>tN(|se-#D!>8`FDw}-7IZH?9;5ohVBwe)Hq4YP}rxL-0=hAH#SIx z@-h{Dt2iZ0+#e59lJ0BQE^gN@ZKw8>JyNSoD0Jg&>)l;YYvu>I$C#|C%JG(jGFpvS zCw~;2lJOlf9ervsmA$N0unRw-3VmsBuZ$b92Bp5@5bRdZ)GA{iPP>+9&pT)*6YW6< z+;ItT8(`W#ol_oO8zT^c*T&Xt_8zf~y9XR{Ogoa;hdpAk`b=A@I;pxL6l^lB0&h%0 z5R0h`U&T^iv;#vYd+i=dp4yncGD=%L3s25|BEzV=rSRkh+rL*VS8OWQebphA@lk8} z4-HZV2h#?`qvX~RZkmw^hsz;W-+kgRoiHtt&E7AD784T5;@A|tob(t>!;5oyH*x`r zEiUzIgVYcB2CzErfZZ<^7V{8sYCzsZrW_E1M75OxM<_>Rv|B3bunciqe#%I&}`|ecSM25i=fy88DW`9~8@BDPz<@v4WS<(%|&m8L?`g zj_=f#uUr*u#XXz(JpWcGCJcJe7FgEg#7%CQ@&3lsqY||kz zK)Csoojio$DwcTbiVjAt zwnwS0jMk@zMcj8E=fOT4!7^MAR_!P{xO~>BN3qD_?%S9O{7@tI{FoSAB?0=2sG z6}Sh=dDkP7%=YOo%(;ZrIHH%Ld$JDz00Ms;0i0zK?L4(x$aVb#aIi|<;p}wfM z(yGu?pz=54ED^76;J$3jAc1TFUwG%38ZhxV)}!}~V$t}mII#ukj2S5BxRkc(amQlM z8Np;q+a2gPlF%lps`Q7H35&Jq@|F!LF-~mraWO37&KsVVhRsk3F(ufVV1wY{w$wlp zwLE!g$~YsL8j@aO@(Hm^LLW*7*P&e5#HpY6kg~aiTn<%#zoBJ+oCfk_+Oz+YI#2Te z#WXq>&XN$PCX1ig?h|4qcQJuP+tz^nb3zO;S9r~3b7@NXOlK^pJCD-21~eV!22b@_ z6B6wjNn9o_HBU}c80_b$XwGXM>07I)lgEF~No|g{Lj%Bi4ZzW2>dYIoy78Of4N^s# zSwMpAw6UC#P`7J#6DC*w4Q(^_18QD!kfh@o(Yz9hP-k-0t2i zp3;ts0scHA7L`sv=V?#C9kXY|e4bN))$$GPvScuqvtk)%cl{?;=`8w(B)0mj80GSM zA}qJ)bE04M_?-Q&R1;tg->A5dnbo7GMnyx*?3nm;)`<}9z z=fqOp=5K>=^8|$-#wMIY-FtR}?LH^g5f;WUm-FJVgpN1As|=p%tL;?g)E3LAD=%u5 z0r3FnpW7=#V>Lzdfa6#}s|=p%FyRwRKQDI1ysB2>WQ|DgSH~k7IHvu5UF_q(>B{%=iF$DgDjM^VX#o*QtO~M!>LC&@s-uSBGxfq z)Mk4Py+Nn4I(8xS_W`GHh_E#f7D5=c>1jh0(e`rCt^fzMjRQ8_1(*Ps*3&M;*(kdZ z?}vWIX)9l~<4Kb!W^<|`6TWJIBmA~|fF2wo>ca?usONDpj}q!XxzKgZEE@DGl4QdaW)!FXr*bp9Ymy&u? ztzMhGy)G7#)7omXA|dBkzzwm1uq}=Cx*>KaZa2gZZt2x1^gveirdU!seVYQGRrf^m zz*XAV12<+%ZiPvx;}bSi#rKM&E&(CEi*qwdH`aKW>X@|fA zu|V+bgIY6MhGukEeSh8FjB?Zwng<;Fzh!40VBq95l6gE7=R5D{{h3`2b`A1~jdY~! ztcp)B9*PNt{N8{=&e8aB$M&P(jN4ty->jBnw2Z?!H<+R`-Q2=zKf=uGFgEFtST_Hf z-5)SgOqi@zdyRQkdMW>!oqU9K-pxl@_9L;T@aPX#Eq^Dv+0XnVkhm?%2O{u^)E>BTz2P?8_s#w$O{thh_bJXF`LP*6N zwI5#QL`UXlYgF;1ZY~>;0nsnAsTr`UWF|ZlXZAa|jw+C$b2!?;^m6uA(&aBeGl!^% z5uLSa{gu;JBHB(4+U`W#%mL#;q{aZ|YLufTDGt&oFEC;d+v;>*S^F1ah&ZJTc`OdT z#`b-3_X?smG+dR{ zc96pwKrdGxc2RSzU3ec8oFZ}Lr)EwcT+P#29MVlMZBJ*lQ-Ed;DV-g7Iyr46qV43M z^Ʋj2z2H3l$kIrKF?fJ7&JG|Z7urhA2z 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 bs@+!6S&`2ZS7~LkGOH?3Rd!dWci8^}a_lIa diff --git a/native_bridge/include/RenderFxJob.h b/native_bridge/include/RenderFxJob.h index d5bfa16..99b3b6a 100644 --- a/native_bridge/include/RenderFxJob.h +++ b/native_bridge/include/RenderFxJob.h @@ -55,6 +55,12 @@ int run_open_fx_gui(const std::string& jobPath); // --open-fx-gui. int run_fx_gui_server(const std::string& jobPath); +// Capture the GUI plugin's current state (component + controller) as base64 +// of the bridge blob [4B BE compLen][comp][4B BE ctrlLen][ctrl] - the same +// format applyPreset accepts. Runs on the GUI pump thread; blocks up to +// timeoutMs. outB64 stays empty on timeout or when the plugin has no state. +void fxGuiRequestCapture(void* hwnd, std::string& outB64, int timeoutMs); + // Realtime FX chain (T2.4): live VST3 audio effects on the bridge master mix. // setChain() is async (a worker thread loads the plugins and swaps the chain); // process() runs ONLY on the audio thread; shutdown() joins the worker and must diff --git a/native_bridge/src/FxGuiServer.cpp b/native_bridge/src/FxGuiServer.cpp index c3d86cf..4a1d9fc 100644 --- a/native_bridge/src/FxGuiServer.cpp +++ b/native_bridge/src/FxGuiServer.cpp @@ -11,6 +11,7 @@ // POST /input -> {type:"mousedown|mousemove|mouseup|wheel|keydown|keyup", // x,y,button,deltaY,keyCode} -> PostMessage to HWND // POST /close -> detach + exit 0 +// GET /preset -> {"preset_b64":"..."} current plugin state // // The HTTP server runs on a worker thread; the calling (STA) thread runs the // message pump — VST3 editors need COM apartment + pump on the same thread. @@ -44,6 +45,7 @@ // Defined in RenderFxJob.cpp (global scope); declared here outside the // anonymous namespace so both TUs see the same symbol. extern void fxGuiRequestResize(HWND hwnd, int w, int h); +extern void fxGuiRequestCapture(void* hwnd, std::string& outB64, int timeoutMs); namespace { @@ -575,6 +577,11 @@ void runHttpServer(HWND hwnd, std::atomic& stop) { SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE | SWP_SHOWWINDOW); } sendResponse(c, 200, "application/json", "{\"ok\":true}", 11); + } else if (req.path == "/preset") { + std::string b64; + fxGuiRequestCapture(hwnd, b64, 1500); + const std::string body = "{\"preset_b64\":\"" + b64 + "\"}"; + sendResponse(c, 200, "application/json", body.data(), (int)body.size()); } else if (req.path == "/close") { sendResponse(c, 200, "application/json", "{\"ok\":true}", 11); stop.store(true); diff --git a/native_bridge/src/RenderFxJob.cpp b/native_bridge/src/RenderFxJob.cpp index d6c3a3b..bcdc44e 100644 --- a/native_bridge/src/RenderFxJob.cpp +++ b/native_bridge/src/RenderFxJob.cpp @@ -44,6 +44,7 @@ #include #include #include +#include #include #include #include @@ -258,6 +259,24 @@ static std::string base64Encode(const uint8_t* data, size_t len) { } return out; } + +// Append-only variant (no return temporary) so it can run inside an SEH +// __try frame (C2712: __try functions cannot have destructor temporaries). +static void base64EncodeTo(const uint8_t* data, size_t len, std::string& out) { + static const char* tbl = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + size_t cap = ((len + 2) / 3) * 4; + out.clear(); + out.reserve(cap); + for (size_t i = 0; i < len; i += 3) { + uint32_t n = (uint32_t)data[i] << 16; + if (i + 1 < len) n |= (uint32_t)data[i + 1] << 8; + if (i + 2 < len) n |= (uint32_t)data[i + 2]; + out += tbl[(n >> 18) & 63]; + out += tbl[(n >> 12) & 63]; + out += (i + 1 < len) ? tbl[(n >> 6) & 63] : '='; + out += (i + 2 < len) ? tbl[n & 63] : '='; + } +} static int b64val(unsigned char c) { if (c >= 'A' && c <= 'Z') return c - 'A'; if (c >= 'a' && c <= 'z') return c - 'a' + 26; @@ -619,6 +638,43 @@ public: std::cout << "[RenderFx] preset applied component=" << comp.size() << " controller=" << ctrl.size() << std::endl; return true; +#endif + } + // Capture the plugin's CURRENT state (component + edit controller) as the + // bridge blob [4B BE compLen][comp][4B BE ctrlLen][ctrl] base64 — same + // format applyPreset accepts. Lets the GUI bridge report knob tweaks so a + // saved project can restore them. Must run on the thread owning the plugin. + void captureState(std::string& out) { +#ifndef HAVE_VST3SDK + (void)out; + return; +#else + auto* s = static_cast(state_); + if (!s) return; + std::vector comp, ctrl; + { + Steinberg::MemoryStream stream; + if (s->component && s->component->getState(&stream) == kResultOk && stream.getSize() > 0) + comp.assign(stream.getData(), stream.getData() + stream.getSize()); + } + if (!s->controllerIsComponent) { + Steinberg::MemoryStream stream; + if (s->controller && s->controller->getState(&stream) == kResultOk && stream.getSize() > 0) + ctrl.assign(stream.getData(), stream.getData() + stream.getSize()); + } + if (comp.empty() && ctrl.empty()) return; + std::vector blob; + auto append32 = [&blob](uint32_t v) { + blob.push_back((uint8_t)(v >> 24)); + blob.push_back((uint8_t)(v >> 16)); + blob.push_back((uint8_t)(v >> 8)); + blob.push_back((uint8_t)v); + }; + append32((uint32_t)comp.size()); + blob.insert(blob.end(), comp.begin(), comp.end()); + append32((uint32_t)ctrl.size()); + blob.insert(blob.end(), ctrl.begin(), ctrl.end()); + base64EncodeTo(blob.data(), blob.size(), out); #endif } // Native editor: attach the plugin's IPlugView to a host window (must run @@ -1103,6 +1159,7 @@ void RealtimeFxChain::Impl::workerLoop() { // Worker (HTTP) thread -> pump thread editor-resize request. Declared // outside the anonymous namespace: the definition sits after the namespace. static void fxGuiResizeSafe(void* fx, HWND hwnd, int w, int h); +static void fxGuiCaptureSafe(void* fx, std::string& out); namespace { @@ -1116,6 +1173,16 @@ struct FxGuiCtx { // checkSizeConstraint/onSize must run on the thread that owns the editor. #define WM_FXGUI_RESIZE (WM_APP + 0x51) +// --- preset capture (GUI state -> project save) ------------------------ +// getState must run on the pump thread that owns the plugin, so the HTTP +// worker posts WM_FXGUI_CAPTURE and waits (up to timeoutMs) for the pump +// thread to park the base64 blob. Empty outB64 = timeout or no state. +#define WM_FXGUI_CAPTURE (WM_APP + 0x52) +static std::mutex& gCapMutex() { static std::mutex m; return m; } +static std::condition_variable& gCapCv() { static std::condition_variable cv; return cv; } +static std::string& gCapB64() { static std::string s; return s; } +static bool& gCapDone() { static bool b = false; return b; } + LRESULT CALLBACK FxGuiWndProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp) { FxGuiCtx* ctx = (FxGuiCtx*)GetWindowLongPtrA(hwnd, GWLP_USERDATA); switch (msg) { @@ -1128,6 +1195,17 @@ LRESULT CALLBACK FxGuiWndProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp) { case WM_FXGUI_RESIZE: fxGuiResizeSafe((void*)GetPropA(hwnd, "FXGUI_FX"), hwnd, (int)wp, (int)lp); return 0; + case WM_FXGUI_CAPTURE: { + std::string b64; + fxGuiCaptureSafe((void*)GetPropA(hwnd, "FXGUI_FX"), b64); + { + std::lock_guard lk(gCapMutex()); + gCapB64() = std::move(b64); + gCapDone() = true; + } + gCapCv().notify_one(); + return 0; + } default: return DefWindowProcA(hwnd, msg, wp, lp); } @@ -1161,11 +1239,37 @@ static void fxGuiResizeSafe(void* fx, HWND hwnd, int w, int h) { (void)fx; (void)hwnd; (void)w; (void)h; #endif } +static void fxGuiCaptureSafe(void* fx, std::string& out) { +#ifdef HAVE_VST3SDK + __try { static_cast(fx)->captureState(out); } + __except (EXCEPTION_EXECUTE_HANDLER) {} +#else + (void)fx; (void)out; +#endif +} // Worker (HTTP) thread asks the GUI pump thread to resize the plugin view. void fxGuiRequestResize(HWND hwnd, int w, int h) { PostMessageA(hwnd, WM_FXGUI_RESIZE, (WPARAM)w, (LPARAM)h); } +// Capture the GUI plugin state on the pump thread; blocks up to timeoutMs. +void fxGuiRequestCapture(void* hwndV, std::string& outB64, int timeoutMs) { + HWND hwnd = (HWND)hwndV; + { + std::lock_guard lk(gCapMutex()); + gCapDone() = false; + gCapB64().clear(); + } + PostMessageA(hwnd, WM_FXGUI_CAPTURE, 0, 0); + { + std::unique_lock lk(gCapMutex()); + if (!gCapCv().wait_for(lk, std::chrono::milliseconds(timeoutMs), [] { return gCapDone(); })) + return; // timeout - outB64 stays empty + outB64 = gCapB64(); + } +} + + // --- split setup for server mode (startup speed) ----------------------------- // 1. Parse job { path, name } — fast. Returns 0 ok, 1 job/argument error. static int fxGuiParseJob(const std::string& jobPath, std::string& path, std::string& name) {