* { margin: 0; padding: 0; box-sizing: border-box; } .hidden { display: none !important; } body { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif; background: #1a1a2e; color: #e0e0e0; min-height: 100vh; } /* Header bar */ header { display: flex; align-items: baseline; gap: 1rem; padding: 1rem 2rem; background: #12122a; border-bottom: 1px solid #2a2a4a; } header h1 { font-size: 1.3rem; color: #fff; } header .subtitle { color: #666; font-size: 0.85rem; } /* Main content */ main { padding: 1.5rem 2rem; } /* Drop zone */ .drop-zone { max-width: 600px; margin: 4rem auto; border: 2px dashed #444; border-radius: 8px; padding: 3rem; text-align: center; cursor: pointer; transition: border-color 0.2s, background 0.2s; } .drop-zone:hover, .drop-zone.dragover { border-color: #6c63ff; background: rgba(108, 99, 255, 0.05); } .drop-zone p { color: #888; font-size: 1rem; } /* File bar */ .file-bar { display: flex; align-items: center; gap: 0.75rem; padding: 0.6rem 1rem; background: #16213e; border-radius: 6px; margin-bottom: 1.25rem; } #file-name { flex: 1; font-size: 0.9rem; } .file-bar-actions { display: flex; gap: 0.5rem; } .btn-action { background: #6c63ff; border: none; color: #fff; padding: 0.3rem 0.7rem; border-radius: 4px; cursor: pointer; font-size: 0.8rem; transition: background 0.2s; } .btn-action:hover { background: #5a52d5; } .btn-muted { background: none; border: 1px solid #555; color: #aaa; } .btn-muted:hover { border-color: #888; color: #fff; background: none; } /* MIDI Player */ #midi-player { flex: 0 1 360px; min-width: 200px; --primary-color: #6c63ff; } #midi-player::part(control-panel) { background: #12122a; border: 1px solid #2a2a4a; border-radius: 4px; padding: 0.2rem 0.5rem; } #midi-player::part(play-button) { color: #e0e0e0; border: none; } #midi-player::part(time) { color: #888; font-family: inherit; font-size: 0.75rem; } #midi-player::part(seek-bar) { accent-color: #6c63ff; } #midi-player::part(loading-overlay) { background: #12122a; } /* Two-column layout */ .columns { display: grid; grid-template-columns: 1fr 360px; gap: 1.25rem; align-items: start; } .panel { background: #12122a; border: 1px solid #2a2a4a; border-radius: 8px; padding: 1.25rem; } .panel h2 { font-size: 1rem; color: #ccc; margin-bottom: 1rem; text-transform: uppercase; letter-spacing: 0.05em; font-weight: 600; } .panel h3 { font-size: 0.85rem; color: #888; margin-bottom: 0.6rem; text-transform: uppercase; letter-spacing: 0.04em; font-weight: 600; } /* Analysis panel */ .analysis-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(150px, 1fr)); gap: 0.6rem; margin-bottom: 1.25rem; } .metric-card { background: #1a1a2e; border-radius: 6px; padding: 0.65rem 0.85rem; border-left: 3px solid #6c63ff; } .metric-card .label { font-size: 0.7rem; color: #888; text-transform: uppercase; letter-spacing: 0.04em; margin-bottom: 0.15rem; } .metric-card .value { font-size: 1.05rem; color: #fff; font-weight: 500; } .track-list { display: grid; grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); gap: 0.5rem; } .track-card { background: #1a1a2e; border-radius: 6px; padding: 0.65rem 0.85rem; } .track-card .track-header { font-size: 0.9rem; color: #fff; font-weight: 500; margin-bottom: 0.35rem; display: flex; align-items: center; gap: 0.4rem; flex-wrap: wrap; } .channel-badge { font-size: 0.65rem; background: #6c63ff33; color: #a9a4ff; padding: 0.1rem 0.35rem; border-radius: 3px; font-weight: 400; } .track-card .detail-row { display: flex; justify-content: space-between; font-size: 0.8rem; padding: 0.12rem 0; color: #777; } .track-card .detail-row .detail-value { color: #bbb; } .hint { font-size: 0.7rem; color: #555; font-weight: 400; text-transform: none; letter-spacing: 0; } /* Tracks header with merge button */ .tracks-header { display: flex; align-items: center; justify-content: space-between; margin-bottom: 0.6rem; } .tracks-header h3 { margin-bottom: 0; } .track-card .merge-checkbox { position: absolute; top: 0.5rem; right: 0.5rem; accent-color: #6c63ff; width: 14px; height: 14px; } .track-card { position: relative; } /* Track detail panel */ .track-detail { margin-top: 1.25rem; padding-top: 1rem; border-top: 1px solid #2a2a4a; } .track-detail-header { display: flex; align-items: center; justify-content: space-between; margin-bottom: 0.75rem; } .track-detail-header h3 { margin-bottom: 0; } .track-detail-actions { display: flex; align-items: center; gap: 0.75rem; } .btn-danger { background: #e03131; } .btn-danger:hover { background: #c92a2a; } .track-edit-controls { margin-bottom: 0.75rem; } .track-edit-row { display: flex; align-items: flex-end; gap: 0.75rem; } .track-edit-row .param-group { flex: 1; } .track-edit-row .param-group select { width: 100%; padding: 0.4rem 0.5rem; background: #1a1a2e; color: #e0e0e0; border: 1px solid #333; border-radius: 6px; font-size: 0.85rem; } .track-edit-row .btn-action { margin-bottom: 0; white-space: nowrap; } .graph-container { display: flex; flex-direction: column; gap: 0.75rem; } .graph-card { background: #1a1a2e; border-radius: 6px; padding: 0.6rem 0.75rem; } .graph-card .graph-label { font-size: 0.75rem; color: #888; margin-bottom: 0.35rem; font-weight: 500; } .graph-card canvas { width: 100%; height: 80px; display: block; border-radius: 4px; } .graph-card canvas.piano-roll { height: 300px; } .graph-card .graph-range { display: flex; justify-content: space-between; font-size: 0.65rem; color: #555; margin-top: 0.2rem; } .track-card { cursor: pointer; transition: border-color 0.15s; border: 1px solid transparent; } .track-card:hover { border-color: #6c63ff55; } .track-card.selected { border-color: #6c63ff; } /* Tool panel */ .tool-select select { width: 100%; padding: 0.5rem; background: #1a1a2e; color: #e0e0e0; border: 1px solid #333; border-radius: 6px; font-size: 0.9rem; } .tool-description { color: #777; font-size: 0.8rem; margin-top: 0.6rem; line-height: 1.4; } /* Channel selection */ .channel-section { margin-top: 1rem; } .channel-header { display: flex; align-items: center; justify-content: space-between; margin-bottom: 0.4rem; } .channel-header label { font-size: 0.8rem; color: #aaa; font-weight: 500; text-transform: uppercase; letter-spacing: 0.04em; } .btn-link { background: none; border: none; color: #6c63ff; cursor: pointer; font-size: 0.75rem; padding: 0; } .btn-link:hover { color: #a9a4ff; } .channel-checkboxes { display: flex; flex-wrap: wrap; gap: 0.3rem; } .channel-checkboxes label { display: flex; align-items: center; gap: 0.25rem; font-size: 0.8rem; color: #ccc; background: #1a1a2e; padding: 0.25rem 0.5rem; border-radius: 4px; cursor: pointer; user-select: none; border: 1px solid transparent; transition: border-color 0.15s; } .channel-checkboxes label:has(input:checked) { border-color: #6c63ff55; background: #6c63ff15; } .channel-checkboxes input[type="checkbox"] { accent-color: #6c63ff; width: 14px; height: 14px; } /* Params */ .params { margin-top: 1rem; display: flex; flex-direction: column; gap: 0.75rem; } .param-group { display: flex; flex-direction: column; gap: 0.25rem; } .param-group label { font-size: 0.8rem; color: #aaa; font-weight: 500; } .param-group input { padding: 0.45rem 0.6rem; background: #1a1a2e; color: #e0e0e0; border: 1px solid #333; border-radius: 6px; font-size: 0.9rem; } .vel-range-row { display: flex; align-items: center; gap: 0.4rem; } .vel-range-row input { flex: 1; } .vel-range-sep { color: #666; font-size: 0.9rem; } .param-hint { font-size: 0.7rem; color: #555; } .btn-primary { margin-top: 1rem; width: 100%; padding: 0.65rem; background: #6c63ff; color: #fff; border: none; border-radius: 6px; font-size: 0.95rem; cursor: pointer; transition: background 0.2s; } .btn-primary:hover:not(:disabled) { background: #5a52d5; } .btn-primary:disabled { opacity: 0.4; cursor: not-allowed; } .status { margin-top: 0.75rem; padding: 0.6rem 0.85rem; border-radius: 6px; font-size: 0.85rem; } .status.loading { background: #16213e; color: #6c63ff; } .status.error { background: #2e1a1a; color: #ff6b6b; } .status.success { background: #1a2e1a; color: #69db7c; } /* History */ .history-section { margin-top: 1.25rem; padding-top: 1rem; border-top: 1px solid #2a2a4a; } .history-header { display: flex; align-items: center; justify-content: space-between; margin-bottom: 0.5rem; } .history-header h3 { margin-bottom: 0; } .btn-undo { background: #e8590c; font-size: 0.75rem; padding: 0.25rem 0.6rem; } .btn-undo:hover { background: #d9480f; } .btn-undo:disabled { opacity: 0.4; cursor: not-allowed; background: #e8590c; } .history-list { list-style: none; counter-reset: history; } .history-list li { counter-increment: history; font-size: 0.8rem; color: #aaa; padding: 0.3rem 0; border-bottom: 1px solid #1a1a2e; } .history-list li::before { content: counter(history) ". "; color: #555; }