Spaces:
Sleeping
Sleeping
| :root { | |
| --bg: #07070e; | |
| --surface: #0f0f1a; | |
| --surface-2: #161628; | |
| --surface-3: #1c1c36; | |
| --border: #1e1e3a; | |
| --border-hover: #2e2e52; | |
| --primary: #8b5cf6; | |
| --primary-hover: #a78bfa; | |
| --primary-dim: #7c3aed; | |
| --primary-glow: rgba(139, 92, 246, 0.25); | |
| --accent: #06b6d4; | |
| --text: #f1f5f9; | |
| --text-muted: #94a3b8; | |
| --text-subtle: #525280; | |
| --danger: #ef4444; | |
| --danger-bg: rgba(239, 68, 68, 0.1); | |
| --radius: 10px; | |
| --radius-lg: 14px; | |
| } | |
| * { | |
| margin: 0; | |
| padding: 0; | |
| box-sizing: border-box; | |
| } | |
| body { | |
| background: var(--bg); | |
| color: var(--text); | |
| font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif; | |
| overflow: hidden; | |
| -webkit-font-smoothing: antialiased; | |
| -moz-osx-font-smoothing: grayscale; | |
| } | |
| #root { | |
| width: 100vw; | |
| height: 100vh; | |
| } | |
| .app { | |
| width: 100%; | |
| height: 100%; | |
| display: flex; | |
| flex-direction: column; | |
| } | |
| /* ======================================== | |
| Upload Screen | |
| ======================================== */ | |
| .upload-screen { | |
| width: 100vw; | |
| height: 100vh; | |
| display: flex; | |
| align-items: center; | |
| justify-content: center; | |
| background: var(--bg); | |
| background-image: | |
| radial-gradient(ellipse at 50% 30%, rgba(139, 92, 246, 0.08) 0%, transparent 60%), | |
| radial-gradient(ellipse at 50% 60%, rgba(6, 182, 212, 0.04) 0%, transparent 50%); | |
| } | |
| .upload-content { | |
| width: 100%; | |
| max-width: 520px; | |
| padding: 0 24px; | |
| } | |
| .upload-logo { | |
| display: flex; | |
| flex-direction: column; | |
| align-items: center; | |
| margin-bottom: 48px; | |
| } | |
| .upload-logo h1 { | |
| font-size: 36px; | |
| font-weight: 700; | |
| letter-spacing: -1px; | |
| background: linear-gradient(135deg, #a78bfa 0%, #06b6d4 100%); | |
| -webkit-background-clip: text; | |
| -webkit-text-fill-color: transparent; | |
| background-clip: text; | |
| margin-top: 14px; | |
| } | |
| .upload-tagline { | |
| color: var(--text-muted); | |
| font-size: 16px; | |
| margin-top: 8px; | |
| } | |
| .upload-mode-tabs { | |
| display: flex; | |
| gap: 4px; | |
| margin-bottom: 20px; | |
| background: var(--surface-2); | |
| border-radius: var(--radius); | |
| padding: 4px; | |
| border: 1px solid var(--border); | |
| } | |
| .upload-mode-tab { | |
| flex: 1; | |
| padding: 10px 20px; | |
| border: none; | |
| border-radius: 7px; | |
| background: transparent; | |
| color: var(--text-muted); | |
| font-size: 14px; | |
| font-weight: 600; | |
| font-family: inherit; | |
| cursor: pointer; | |
| transition: all 0.15s; | |
| } | |
| .upload-mode-tab:hover { | |
| color: var(--text); | |
| } | |
| .upload-mode-tab.active { | |
| background: var(--primary); | |
| color: white; | |
| box-shadow: 0 2px 8px var(--primary-glow); | |
| } | |
| .upload-description { | |
| color: var(--text-muted); | |
| font-size: 14px; | |
| line-height: 1.6; | |
| text-align: center; | |
| margin-bottom: 28px; | |
| } | |
| /* Copyright notice */ | |
| .copyright-notice { | |
| margin-top: 20px; | |
| padding: 12px 16px; | |
| font-size: 12px; | |
| line-height: 1.5; | |
| color: var(--text-subtle); | |
| text-align: center; | |
| border-top: 1px solid var(--border); | |
| } | |
| /* Drop zone */ | |
| .drop-zone { | |
| border: 2px dashed var(--border); | |
| border-radius: var(--radius-lg); | |
| padding: 36px 24px; | |
| cursor: pointer; | |
| transition: all 0.2s; | |
| text-align: center; | |
| } | |
| .drop-zone:hover, | |
| .drop-zone.dragging { | |
| border-color: var(--primary); | |
| background: rgba(139, 92, 246, 0.05); | |
| box-shadow: inset 0 0 30px rgba(139, 92, 246, 0.03); | |
| } | |
| .drop-icon { | |
| font-size: 32px; | |
| margin-bottom: 10px; | |
| opacity: 0.4; | |
| } | |
| .drop-zone p { | |
| color: var(--text-muted); | |
| font-size: 14px; | |
| font-weight: 500; | |
| } | |
| .drop-hint { | |
| font-size: 12px ; | |
| color: var(--text-subtle) ; | |
| font-weight: 400 ; | |
| margin-top: 6px; | |
| } | |
| /* Error message */ | |
| .upload-error { | |
| margin-top: 20px; | |
| color: var(--danger); | |
| font-size: 13px; | |
| font-weight: 500; | |
| background: var(--danger-bg); | |
| padding: 12px 16px; | |
| border-radius: var(--radius); | |
| border: 1px solid rgba(239, 68, 68, 0.2); | |
| } | |
| /* ======================================== | |
| Processing / Loading Screen | |
| ======================================== */ | |
| .upload-processing { | |
| text-align: center; | |
| } | |
| .processing-logo { | |
| animation: pulse 2s ease-in-out infinite; | |
| margin-bottom: 24px; | |
| } | |
| .upload-processing h2 { | |
| font-size: 24px; | |
| font-weight: 700; | |
| color: var(--text); | |
| margin-bottom: 8px; | |
| } | |
| .upload-processing p { | |
| color: var(--text-muted); | |
| font-size: 15px; | |
| } | |
| .loading-sub { | |
| margin-bottom: 28px; | |
| } | |
| .loading-bar { | |
| width: 200px; | |
| height: 4px; | |
| background: var(--border); | |
| border-radius: 2px; | |
| margin: 0 auto; | |
| overflow: hidden; | |
| } | |
| .loading-bar-fill { | |
| width: 40%; | |
| height: 100%; | |
| background: linear-gradient(90deg, var(--primary), var(--accent)); | |
| border-radius: 2px; | |
| animation: loading-slide 1.5s ease-in-out infinite; | |
| } | |
| @keyframes loading-slide { | |
| 0% { transform: translateX(-100%); } | |
| 100% { transform: translateX(350%); } | |
| } | |
| @keyframes pulse { | |
| 0%, 100% { transform: scale(1); opacity: 1; } | |
| 50% { transform: scale(1.08); opacity: 0.7; } | |
| } | |
| /* ======================================== | |
| Controls Bar (Player) | |
| ======================================== */ | |
| .controls { | |
| background: var(--surface); | |
| border-bottom: 1px solid var(--border); | |
| flex-shrink: 0; | |
| display: flex; | |
| flex-direction: column; | |
| } | |
| .controls-main { | |
| height: 72px; | |
| display: flex; | |
| align-items: center; | |
| justify-content: space-between; | |
| padding: 0 24px; | |
| gap: 20px; | |
| } | |
| .controls-left { | |
| display: flex; | |
| align-items: center; | |
| gap: 16px; | |
| min-width: 0; | |
| flex: 1; | |
| } | |
| .brand-mark { | |
| display: flex; | |
| align-items: center; | |
| gap: 10px; | |
| flex-shrink: 0; | |
| } | |
| .brand-name { | |
| font-size: 16px; | |
| font-weight: 700; | |
| background: linear-gradient(135deg, #a78bfa, #06b6d4); | |
| -webkit-background-clip: text; | |
| -webkit-text-fill-color: transparent; | |
| background-clip: text; | |
| white-space: nowrap; | |
| letter-spacing: -0.3px; | |
| } | |
| .file-name { | |
| font-size: 14px; | |
| color: var(--text-muted); | |
| white-space: nowrap; | |
| overflow: hidden; | |
| text-overflow: ellipsis; | |
| max-width: 240px; | |
| padding-left: 16px; | |
| border-left: 1.5px solid var(--border); | |
| font-weight: 500; | |
| } | |
| .controls-center { | |
| display: flex; | |
| align-items: center; | |
| gap: 10px; | |
| flex-shrink: 0; | |
| } | |
| .controls-right { | |
| display: flex; | |
| align-items: center; | |
| gap: 20px; | |
| flex: 1; | |
| justify-content: flex-end; | |
| } | |
| /* Transport buttons (skip back/forward) */ | |
| .transport-btn { | |
| width: 48px; | |
| height: 48px; | |
| border-radius: 10px; | |
| border: none; | |
| background: var(--surface-2); | |
| color: var(--text-muted); | |
| cursor: pointer; | |
| display: flex; | |
| flex-direction: column; | |
| align-items: center; | |
| justify-content: center; | |
| gap: 2px; | |
| transition: all 0.15s; | |
| border: 1px solid var(--border); | |
| } | |
| .transport-btn:hover { | |
| background: var(--surface-3); | |
| color: var(--text); | |
| border-color: var(--border-hover); | |
| } | |
| .transport-label { | |
| font-size: 10px; | |
| font-weight: 600; | |
| letter-spacing: 0.3px; | |
| opacity: 0.7; | |
| } | |
| /* Play button — bold and prominent */ | |
| .play-btn { | |
| width: 56px; | |
| height: 56px; | |
| border-radius: 50%; | |
| border: none; | |
| background: var(--primary); | |
| color: white; | |
| font-size: 20px; | |
| cursor: pointer; | |
| transition: all 0.2s; | |
| display: flex; | |
| align-items: center; | |
| justify-content: center; | |
| box-shadow: 0 0 24px var(--primary-glow); | |
| } | |
| .play-btn:hover { | |
| background: var(--primary-hover); | |
| box-shadow: 0 0 36px var(--primary-glow); | |
| transform: scale(1.06); | |
| } | |
| .play-btn:active { | |
| transform: scale(0.96); | |
| } | |
| /* General button */ | |
| .btn { | |
| background: var(--surface-2); | |
| color: var(--text-muted); | |
| border: 1.5px solid var(--border); | |
| border-radius: 8px; | |
| padding: 8px 18px; | |
| font-size: 13px; | |
| font-weight: 600; | |
| font-family: inherit; | |
| cursor: pointer; | |
| transition: all 0.15s; | |
| white-space: nowrap; | |
| letter-spacing: 0.2px; | |
| } | |
| .btn:hover { | |
| background: var(--surface-3); | |
| color: var(--text); | |
| border-color: var(--border-hover); | |
| } | |
| .btn-new { | |
| border-color: var(--primary-dim); | |
| color: var(--primary-hover); | |
| } | |
| .btn-new:hover { | |
| background: rgba(139, 92, 246, 0.1); | |
| border-color: var(--primary); | |
| color: var(--primary-hover); | |
| } | |
| /* Tempo control */ | |
| .original-audio-control { | |
| display: flex; | |
| align-items: center; | |
| gap: 6px; | |
| } | |
| .btn-original { | |
| display: flex; | |
| align-items: center; | |
| gap: 5px; | |
| padding: 6px 12px; | |
| font-size: 12px; | |
| font-weight: 600; | |
| border-radius: 8px; | |
| border: 1px solid var(--border); | |
| background: var(--surface-2); | |
| color: var(--text-muted); | |
| cursor: pointer; | |
| white-space: nowrap; | |
| transition: all 0.15s ease; | |
| } | |
| .btn-original:hover { | |
| border-color: var(--primary); | |
| color: var(--text); | |
| } | |
| .btn-original.active { | |
| background: rgba(139, 92, 246, 0.15); | |
| border-color: var(--primary); | |
| color: var(--primary); | |
| } | |
| .original-volume { | |
| width: 60px; | |
| } | |
| .tempo-control { | |
| display: flex; | |
| align-items: center; | |
| gap: 10px; | |
| background: var(--surface-2); | |
| padding: 8px 16px; | |
| border-radius: 10px; | |
| border: 1px solid var(--border); | |
| } | |
| .tempo-label { | |
| font-size: 12px; | |
| font-weight: 700; | |
| color: var(--text-muted); | |
| text-transform: uppercase; | |
| letter-spacing: 0.5px; | |
| white-space: nowrap; | |
| } | |
| .tempo-value { | |
| font-size: 14px; | |
| font-weight: 700; | |
| color: var(--text); | |
| min-width: 40px; | |
| text-align: right; | |
| font-variant-numeric: tabular-nums; | |
| } | |
| .tempo-control input[type='range'] { | |
| width: 100px; | |
| } | |
| /* ======================================== | |
| Timeline / Progress Bar | |
| ======================================== */ | |
| .timeline { | |
| display: flex; | |
| align-items: center; | |
| gap: 14px; | |
| padding: 0 24px 12px; | |
| } | |
| .timeline-time { | |
| font-size: 13px; | |
| font-weight: 600; | |
| color: var(--text-muted); | |
| font-variant-numeric: tabular-nums; | |
| min-width: 40px; | |
| } | |
| .timeline-time:last-child { | |
| text-align: right; | |
| } | |
| .timeline-track { | |
| flex: 1; | |
| position: relative; | |
| } | |
| .timeline-track input[type='range'] { | |
| width: 100%; | |
| height: 8px; | |
| border-radius: 4px; | |
| -webkit-appearance: none; | |
| appearance: none; | |
| outline: none; | |
| cursor: pointer; | |
| transition: height 0.15s; | |
| } | |
| .timeline-track input[type='range']:hover { | |
| height: 10px; | |
| } | |
| .timeline-track input[type='range']::-webkit-slider-thumb { | |
| -webkit-appearance: none; | |
| appearance: none; | |
| width: 16px; | |
| height: 16px; | |
| border-radius: 50%; | |
| background: var(--primary-hover); | |
| cursor: pointer; | |
| border: 2px solid white; | |
| box-shadow: 0 0 10px var(--primary-glow); | |
| transition: transform 0.1s; | |
| } | |
| .timeline-track input[type='range']::-webkit-slider-thumb:hover { | |
| transform: scale(1.25); | |
| } | |
| .timeline-track input[type='range']::-moz-range-thumb { | |
| width: 16px; | |
| height: 16px; | |
| border-radius: 50%; | |
| background: var(--primary-hover); | |
| cursor: pointer; | |
| border: 2px solid white; | |
| box-shadow: 0 0 10px var(--primary-glow); | |
| } | |
| /* General range sliders (for tempo) */ | |
| input[type='range'] { | |
| -webkit-appearance: none; | |
| appearance: none; | |
| background: var(--border); | |
| height: 5px; | |
| border-radius: 3px; | |
| outline: none; | |
| cursor: pointer; | |
| } | |
| input[type='range']::-webkit-slider-thumb { | |
| -webkit-appearance: none; | |
| appearance: none; | |
| width: 16px; | |
| height: 16px; | |
| border-radius: 50%; | |
| background: var(--primary); | |
| cursor: pointer; | |
| border: none; | |
| transition: transform 0.1s; | |
| } | |
| input[type='range']::-webkit-slider-thumb:hover { | |
| transform: scale(1.2); | |
| } | |
| input[type='range']::-moz-range-thumb { | |
| width: 16px; | |
| height: 16px; | |
| border-radius: 50%; | |
| background: var(--primary); | |
| cursor: pointer; | |
| border: none; | |
| } | |
| /* Loop controls */ | |
| .loop-controls { | |
| display: flex; | |
| align-items: center; | |
| gap: 6px; | |
| } | |
| .loop-badge { | |
| font-size: 12px; | |
| font-weight: 600; | |
| color: var(--primary-hover); | |
| background: rgba(139, 92, 246, 0.12); | |
| padding: 5px 10px; | |
| border-radius: 6px; | |
| white-space: nowrap; | |
| } | |
| .loop-step { | |
| font-size: 12px; | |
| font-weight: 600; | |
| color: var(--text); | |
| white-space: nowrap; | |
| } | |
| .loop-arrow { | |
| font-size: 13px; | |
| color: var(--text-muted); | |
| } | |
| .btn-loop-action { | |
| font-size: 12px; | |
| font-weight: 600; | |
| padding: 5px 12px; | |
| border-radius: 6px; | |
| background: rgba(139, 92, 246, 0.1); | |
| border: 1px solid rgba(139, 92, 246, 0.25); | |
| color: var(--primary-hover); | |
| cursor: pointer; | |
| font-family: inherit; | |
| white-space: nowrap; | |
| transition: background 0.15s, border-color 0.15s; | |
| } | |
| .btn-loop-action:hover { | |
| background: rgba(139, 92, 246, 0.2); | |
| border-color: var(--primary); | |
| } | |
| .btn-loop-clear { | |
| font-size: 16px; | |
| line-height: 1; | |
| padding: 2px 6px; | |
| border-radius: 4px; | |
| background: transparent; | |
| border: 1px solid transparent; | |
| color: var(--text-muted); | |
| cursor: pointer; | |
| font-family: inherit; | |
| transition: color 0.15s, background 0.15s; | |
| } | |
| .btn-loop-clear:hover { | |
| color: var(--text); | |
| background: var(--surface-2); | |
| } | |
| /* ======================================== | |
| View Tabs (Piano Roll / Sheet Music) | |
| ======================================== */ | |
| .view-tabs { | |
| display: flex; | |
| gap: 2px; | |
| padding: 8px 24px; | |
| background: var(--surface); | |
| border-bottom: 1px solid var(--border); | |
| flex-shrink: 0; | |
| } | |
| .view-tab { | |
| padding: 8px 20px; | |
| border: 1.5px solid var(--border); | |
| border-radius: 8px; | |
| background: var(--surface-2); | |
| color: var(--text-muted); | |
| font-size: 13px; | |
| font-weight: 600; | |
| font-family: inherit; | |
| cursor: pointer; | |
| transition: all 0.15s; | |
| letter-spacing: 0.2px; | |
| } | |
| .view-tab:hover { | |
| background: var(--surface-3); | |
| color: var(--text); | |
| border-color: var(--border-hover); | |
| } | |
| .view-tab.active { | |
| background: rgba(139, 92, 246, 0.15); | |
| border-color: var(--primary); | |
| color: var(--primary-hover); | |
| } | |
| /* Canvas area */ | |
| .canvas-container { | |
| flex: 1; | |
| position: relative; | |
| overflow: hidden; | |
| width: 100%; | |
| } | |
| /* ======================================== | |
| Sheet Music | |
| ======================================== */ | |
| .sheet-music-wrapper { | |
| flex: 1; | |
| display: flex; | |
| flex-direction: column; | |
| overflow: hidden; | |
| } | |
| .sheet-music-toolbar { | |
| display: flex; | |
| align-items: center; | |
| justify-content: space-between; | |
| padding: 10px 24px; | |
| background: var(--surface); | |
| border-bottom: 1px solid var(--border); | |
| flex-shrink: 0; | |
| } | |
| .sheet-music-info { | |
| font-size: 13px; | |
| color: var(--text-muted); | |
| font-weight: 500; | |
| } | |
| .btn-download { | |
| display: flex; | |
| align-items: center; | |
| gap: 8px; | |
| background: var(--surface-2); | |
| color: var(--text-muted); | |
| border: 1.5px solid var(--border); | |
| border-radius: 8px; | |
| padding: 8px 16px; | |
| font-size: 13px; | |
| font-weight: 600; | |
| font-family: inherit; | |
| cursor: pointer; | |
| transition: all 0.15s; | |
| } | |
| .btn-download:hover { | |
| background: var(--surface-3); | |
| color: var(--text); | |
| border-color: var(--border-hover); | |
| } | |
| .sheet-music-scroll { | |
| flex: 1; | |
| overflow: auto; | |
| background: #ffffff; | |
| position: relative; | |
| } | |
| .sheet-music-container { | |
| min-height: 100%; | |
| padding: 20px; | |
| } | |
| .sheet-music-container svg { | |
| display: block; | |
| } | |
| .sheet-music-progress-line { | |
| position: absolute; | |
| width: 2px; | |
| background: #8b5cf6; | |
| border-radius: 1px; | |
| pointer-events: none; | |
| display: none; | |
| z-index: 10; | |
| box-shadow: 0 0 6px rgba(139, 92, 246, 0.5); | |
| } | |
| .sheet-music-progress-line.smooth { | |
| transition: left 0.12s linear, top 0.12s linear; | |
| } | |
| .sheet-music-empty, | |
| .tab-empty { | |
| flex: 1; | |
| display: flex; | |
| align-items: center; | |
| justify-content: center; | |
| color: var(--text-muted); | |
| font-size: 15px; | |
| } | |
| @media print { | |
| .controls, .view-tabs, .sheet-music-toolbar { | |
| display: none ; | |
| } | |
| .sheet-music-scroll { | |
| overflow: visible; | |
| } | |
| } | |