Files
Dansori_EQ/mockups/main_window.html
T
2026-07-04 10:34:46 +09:00

330 lines
17 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Dansori EQ — GUI Mockup</title>
<!--
VISUAL TARGET MOCKUP (not the real app).
Represents the intended look of the native app: .NET 8 + WPF + WPF-UI (Fluent) + LiveCharts2.
Open in a browser to preview the aesthetic. Dark Fluent, Mica-like background, accent cyan.
-->
<style>
:root{
--bg:#1b1b1f;
--mica-1:#232733;
--mica-2:#1a1c22;
--card:#26262b;
--card-2:#2d2d33;
--stroke:#3a3a42;
--text:#f2f3f5;
--text-dim:#a8abb4;
--text-mute:#767a83;
--accent:#4cc2ff;
--accent-2:#38e0c4;
--accent-soft:rgba(76,194,255,.14);
--good:#4fd08a;
--warn:#ffb454;
--radius:12px;
--radius-lg:16px;
font-family:"Segoe UI Variable","Segoe UI",system-ui,sans-serif;
}
*{box-sizing:border-box;}
html,body{margin:0;height:100%;}
body{
background:
radial-gradient(1200px 500px at 12% -8%, #2b3550 0%, transparent 55%),
radial-gradient(900px 500px at 100% 0%, #22403c 0%, transparent 50%),
var(--bg);
color:var(--text);
display:flex;align-items:center;justify-content:center;
height:100vh;overflow:hidden;
}
.window{
width:1180px;height:720px;
background:linear-gradient(180deg,var(--mica-1),var(--mica-2));
border:1px solid var(--stroke);
border-radius:var(--radius-lg);
box-shadow:0 30px 80px rgba(0,0,0,.55);
display:flex;flex-direction:column;overflow:hidden;
}
/* ---- title bar ---- */
.titlebar{
height:44px;display:flex;align-items:center;gap:10px;
padding:0 16px;border-bottom:1px solid var(--stroke);
-webkit-app-region:drag;background:rgba(255,255,255,.015);
}
.logo{width:22px;height:22px;border-radius:6px;
background:conic-gradient(from 200deg,var(--accent),var(--accent-2),var(--accent));
box-shadow:0 0 14px rgba(76,194,255,.5);}
.title{font-size:13px;font-weight:600;letter-spacing:.2px;}
.title .sub{color:var(--text-mute);font-weight:400;margin-left:8px;}
.winbtns{margin-left:auto;display:flex;gap:14px;color:var(--text-mute);}
.winbtns span{font-size:13px;}
/* ---- body ---- */
.body{flex:1;display:flex;min-height:0;}
/* ---- sidebar ---- */
.sidebar{
width:288px;border-right:1px solid var(--stroke);
display:flex;flex-direction:column;background:rgba(0,0,0,.12);
}
.search{padding:14px 14px 8px;}
.search input{
width:100%;height:38px;border-radius:9px;border:1px solid var(--stroke);
background:var(--card);color:var(--text);padding:0 12px 0 34px;font-size:13px;
background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='none' stroke='%23888' stroke-width='2' viewBox='0 0 24 24'%3E%3Ccircle cx='11' cy='11' r='7'/%3E%3Cpath d='M21 21l-4.3-4.3'/%3E%3C/svg%3E");
background-repeat:no-repeat;background-position:11px center;outline:none;
}
.search input:focus{border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-soft);}
.list{flex:1;overflow:auto;padding:4px 8px 8px;}
.grouphdr{
display:flex;align-items:center;gap:8px;
padding:12px 10px 6px;font-size:11px;font-weight:700;letter-spacing:.8px;
color:var(--text-mute);text-transform:uppercase;
}
.grouphdr .count{margin-left:auto;font-weight:600;color:var(--text-mute);
background:var(--card);padding:1px 8px;border-radius:20px;font-size:10px;letter-spacing:0;}
.item{
display:flex;align-items:center;gap:11px;padding:9px 10px;border-radius:9px;
cursor:pointer;margin:2px 0;
}
.item:hover{background:var(--card);}
.item.active{background:var(--accent-soft);box-shadow:inset 0 0 0 1px rgba(76,194,255,.35);}
.item .ic{width:30px;height:30px;border-radius:8px;background:var(--card-2);
display:flex;align-items:center;justify-content:center;flex-shrink:0;color:var(--text-dim);}
.item.active .ic{color:var(--accent);}
.item .nm{font-size:13px;font-weight:600;line-height:1.15;}
.item .br{font-size:11px;color:var(--text-mute);}
.sidefoot{border-top:1px solid var(--stroke);padding:12px;display:flex;flex-direction:column;gap:8px;}
.btn{
height:38px;border-radius:9px;border:1px solid var(--stroke);background:var(--card);
color:var(--text);font-size:13px;font-weight:600;display:flex;align-items:center;
justify-content:center;gap:8px;cursor:pointer;
}
.btn:hover{background:var(--card-2);}
.btn.accent{background:linear-gradient(180deg,#57c7ff,#2f9fe0);border-color:transparent;color:#04222f;}
.dbmeta{font-size:11px;color:var(--text-mute);text-align:center;}
/* ---- main ---- */
.main{flex:1;display:flex;flex-direction:column;min-width:0;}
.mainhdr{display:flex;align-items:center;gap:14px;padding:18px 22px 6px;}
.mainhdr h1{font-size:20px;margin:0;font-weight:700;letter-spacing:.2px;}
.badge{font-size:11px;font-weight:700;padding:3px 9px;border-radius:20px;letter-spacing:.4px;}
.badge.iem{background:rgba(56,224,196,.14);color:var(--accent-2);}
.badge.src{background:var(--card);color:var(--text-mute);font-weight:600;}
.hdr-actions{margin-left:auto;display:flex;gap:8px;align-items:center;}
.chipbtn{height:32px;padding:0 12px;border-radius:8px;border:1px solid var(--stroke);
background:var(--card);color:var(--text-dim);font-size:12px;font-weight:600;cursor:pointer;
display:flex;align-items:center;gap:6px;}
.chipbtn:hover{background:var(--card-2);color:var(--text);}
.toggle{display:flex;align-items:center;gap:8px;font-size:12px;color:var(--text-dim);}
.sw{width:38px;height:22px;border-radius:20px;background:linear-gradient(90deg,#3aa0d8,#38e0c4);
position:relative;}
.sw::after{content:"";position:absolute;right:3px;top:3px;width:16px;height:16px;border-radius:50%;background:#fff;}
/* graph card */
.content{flex:1;overflow:auto;padding:12px 22px 0;}
.card{background:var(--card);border:1px solid var(--stroke);border-radius:var(--radius);padding:16px 18px;margin-bottom:16px;}
.card .caption{display:flex;align-items:center;gap:10px;margin-bottom:10px;}
.card .caption .t{font-size:13px;font-weight:700;color:var(--text-dim);letter-spacing:.3px;}
.preamp{margin-left:auto;font-size:12px;font-weight:700;color:var(--warn);
background:rgba(255,180,84,.12);padding:3px 10px;border-radius:20px;}
.legend{display:flex;gap:16px;font-size:11px;color:var(--text-mute);}
.legend i{display:inline-block;width:14px;height:0;border-top:2px solid;vertical-align:middle;margin-right:5px;}
.graphwrap{position:relative;}
svg .grid{stroke:#33333b;stroke-width:1;}
svg .axis{fill:var(--text-mute);font-size:10px;}
/* filter chips */
.filters{display:flex;flex-wrap:wrap;gap:8px;}
.fchip{display:flex;align-items:center;gap:8px;padding:7px 11px;border-radius:9px;
background:var(--card-2);border:1px solid var(--stroke);font-size:12px;}
.fchip .type{font-weight:700;color:var(--accent);font-size:10px;letter-spacing:.5px;}
.fchip .val{color:var(--text-dim);}
.fchip .g.pos{color:var(--good);font-weight:600;}
.fchip .g.neg{color:var(--warn);font-weight:600;}
/* AI dock */
.aidock{border-top:1px solid var(--stroke);padding:14px 22px 18px;background:rgba(0,0,0,.14);}
.airesp{display:flex;gap:11px;margin-bottom:12px;}
.airesp .av{width:28px;height:28px;border-radius:8px;flex-shrink:0;
background:conic-gradient(from 200deg,var(--accent),var(--accent-2));box-shadow:0 0 12px rgba(76,194,255,.45);}
.airesp .bubble{background:var(--card);border:1px solid var(--stroke);border-radius:12px;
padding:11px 14px;font-size:12.5px;line-height:1.5;color:var(--text-dim);max-width:820px;}
.airesp .bubble b{color:var(--text);font-weight:600;}
.promptbar{display:flex;gap:10px;align-items:center;}
.promptbar .field{flex:1;height:46px;border-radius:12px;border:1px solid var(--stroke);
background:var(--card);display:flex;align-items:center;padding:0 8px 0 16px;}
.promptbar .field:focus-within{border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-soft);}
.promptbar input{flex:1;border:none;background:none;color:var(--text);font-size:14px;outline:none;}
.promptbar input::placeholder{color:var(--text-mute);}
.mic{width:32px;height:32px;border-radius:8px;background:var(--card-2);display:flex;align-items:center;justify-content:center;color:var(--text-mute);}
.send{width:46px;height:46px;border-radius:12px;border:none;cursor:pointer;
background:linear-gradient(180deg,#57c7ff,#2f9fe0);color:#04222f;display:flex;align-items:center;justify-content:center;}
.hint{font-size:11px;color:var(--text-mute);margin-top:8px;}
::-webkit-scrollbar{width:10px;}::-webkit-scrollbar-thumb{background:#3a3a42;border-radius:8px;border:3px solid transparent;background-clip:content-box;}
</style>
</head>
<body>
<div class="window">
<!-- title bar -->
<div class="titlebar">
<div class="logo"></div>
<div class="title">Dansori EQ <span class="sub">· AI EQ for Equalizer APO</span></div>
<div class="winbtns"><span></span><span></span><span></span></div>
</div>
<div class="body">
<!-- sidebar -->
<aside class="sidebar">
<div class="search"><input placeholder="이어폰 · 헤드폰 검색…" value="" /></div>
<div class="list">
<div class="grouphdr">🎧 In-Ear Monitors <span class="count">2,140</span></div>
<div class="item active">
<div class="ic">🎵</div>
<div><div class="nm">Truthear × Crinacle Zero</div><div class="br">Truthear · IEM</div></div>
</div>
<div class="item">
<div class="ic">🎵</div>
<div><div class="nm">Moondrop Blessing 2</div><div class="br">Moondrop · IEM</div></div>
</div>
<div class="item">
<div class="ic">🎵</div>
<div><div class="nm">7Hz Timeless</div><div class="br">7Hz · IEM</div></div>
</div>
<div class="item">
<div class="ic">🎵</div>
<div><div class="nm">Etymotic ER2XR</div><div class="br">Etymotic · IEM</div></div>
</div>
<div class="grouphdr">🎧 Headphones <span class="count">2,073</span></div>
<div class="item">
<div class="ic">🎧</div>
<div><div class="nm">Sennheiser HD 600</div><div class="br">Sennheiser · Over-ear</div></div>
</div>
<div class="item">
<div class="ic">🎧</div>
<div><div class="nm">HIFIMAN Sundara</div><div class="br">HIFIMAN · Over-ear</div></div>
</div>
<div class="item">
<div class="ic">🎧</div>
<div><div class="nm">Focal Clear</div><div class="br">Focal · Over-ear</div></div>
</div>
</div>
<div class="sidefoot">
<button class="btn"><span></span> 프로파일 DB 업데이트</button>
<div class="dbmeta">4,213 profiles · 최신: 2026-06-28</div>
</div>
</aside>
<!-- main -->
<section class="main">
<div class="mainhdr">
<h1>Truthear × Crinacle Zero</h1>
<span class="badge iem">IEM</span>
<span class="badge src">AutoEQ · Harman IE 2019</span>
<div class="hdr-actions">
<button class="chipbtn">↶ 되돌리기</button>
<button class="chipbtn">⟲ 베이스로 리셋</button>
<div class="toggle">활성 <div class="sw"></div></div>
</div>
</div>
<div class="content">
<!-- EQ GRAPH -->
<div class="card">
<div class="caption">
<span class="t">EQUALIZATION CURVE</span>
<div class="legend">
<span><i style="border-color:#5a5f6b;border-top-style:dashed"></i>타깃</span>
<span><i style="border-color:var(--accent)"></i>현재 EQ</span>
</div>
<span class="preamp">Preamp 6.0 dB</span>
</div>
<div class="graphwrap">
<svg viewBox="0 0 900 300" width="100%" height="300">
<defs>
<linearGradient id="fill" x1="0" y1="0" x2="0" y2="1">
<stop offset="0%" stop-color="rgba(76,194,255,.35)"/>
<stop offset="100%" stop-color="rgba(76,194,255,0)"/>
</linearGradient>
<linearGradient id="stroke" x1="0" y1="0" x2="1" y2="0">
<stop offset="0%" stop-color="#38e0c4"/>
<stop offset="100%" stop-color="#4cc2ff"/>
</linearGradient>
</defs>
<!-- horizontal grid (dB) -->
<line class="grid" x1="40" y1="60" x2="880" y2="60"/>
<line class="grid" x1="40" y1="110" x2="880" y2="110"/>
<line class="grid" x1="40" y1="150" x2="880" y2="150" stroke="#44454e"/>
<line class="grid" x1="40" y1="190" x2="880" y2="190"/>
<line class="grid" x1="40" y1="240" x2="880" y2="240"/>
<text class="axis" x="8" y="64">+12</text>
<text class="axis" x="12" y="154">0</text>
<text class="axis" x="8" y="244">12</text>
<!-- vertical grid (freq) -->
<line class="grid" x1="130" y1="40" x2="130" y2="260"/>
<line class="grid" x1="300" y1="40" x2="300" y2="260"/>
<line class="grid" x1="470" y1="40" x2="470" y2="260"/>
<line class="grid" x1="640" y1="40" x2="640" y2="260"/>
<line class="grid" x1="810" y1="40" x2="810" y2="260"/>
<text class="axis" x="118" y="278">50</text>
<text class="axis" x="285" y="278">200</text>
<text class="axis" x="452" y="278">1k</text>
<text class="axis" x="625" y="278">5k</text>
<text class="axis" x="792" y="278">20k</text>
<!-- target (dashed) -->
<path d="M40 150 C160 148 240 156 320 158 S470 152 560 150 S720 148 880 150"
fill="none" stroke="#5a5f6b" stroke-width="1.6" stroke-dasharray="5 5"/>
<!-- current EQ area -->
<path d="M40 120 C120 116 190 150 300 170 S430 172 470 150 S560 118 620 130
S740 176 800 164 S860 158 880 156 L880 260 L40 260 Z"
fill="url(#fill)"/>
<!-- current EQ line -->
<path d="M40 120 C120 116 190 150 300 170 S430 172 470 150 S560 118 620 130
S740 176 800 164 S860 158 880 156"
fill="none" stroke="url(#stroke)" stroke-width="3" stroke-linecap="round"/>
<!-- filter nodes -->
<circle cx="95" cy="118" r="5" fill="#04222f" stroke="#38e0c4" stroke-width="2.5"/>
<circle cx="300" cy="170" r="5" fill="#04222f" stroke="#4cc2ff" stroke-width="2.5"/>
<circle cx="560" cy="122" r="5" fill="#04222f" stroke="#4cc2ff" stroke-width="2.5"/>
<circle cx="770" cy="172" r="5" fill="#04222f" stroke="#4cc2ff" stroke-width="2.5"/>
</svg>
</div>
</div>
<!-- FILTER CHIPS -->
<div class="card">
<div class="caption"><span class="t">ACTIVE FILTERS · 6 bands</span></div>
<div class="filters">
<div class="fchip"><span class="type">LSC</span><span class="val">90 Hz · Q0.7</span><span class="g pos">+4.0 dB</span></div>
<div class="fchip"><span class="type">PK</span><span class="val">180 Hz · Q1.0</span><span class="g neg">2.5 dB</span></div>
<div class="fchip"><span class="type">PK</span><span class="val">3.0 kHz · Q1.2</span><span class="g pos">+3.0 dB</span></div>
<div class="fchip"><span class="type">PK</span><span class="val">6.5 kHz · Q3.0</span><span class="g neg">2.0 dB</span></div>
<div class="fchip"><span class="type">HSC</span><span class="val">10 kHz · Q0.7</span><span class="g neg">1.5 dB</span></div>
<div class="fchip"><span class="type">PK</span><span class="val">45 Hz · Q0.9</span><span class="g pos">+2.0 dB</span></div>
</div>
</div>
</div>
<!-- AI DOCK -->
<div class="aidock">
<div class="airesp">
<div class="av"></div>
<div class="bubble">
보컬을 앞으로 당기기 위해 <b>3 kHz를 +3 dB(Q1.2)</b> 올리고, 저음을 단단하게 하려고
<b>180 Hz를 2.5 dB</b>로 뭉침을 줄이면서 <b>45 Hz +2 dB</b>로 무게는 유지했습니다.
클리핑 방지를 위해 <b>Preamp를 6.0 dB</b>로 설정했습니다. 적용됨 ✓
</div>
</div>
<div class="promptbar">
<div class="field">
<input placeholder="예: 보컬을 더 가깝게, 저음은 단단하게 · 치찰음 줄여줘" />
<div class="mic">🎤</div>
</div>
<button class="send"></button>
</div>
<div class="hint">Enter로 전송 · 변경은 Equalizer APO에 즉시 적용됩니다 · 모델: Claude Sonnet</div>
</div>
</section>
</div>
</div>
</body>
</html>