fffiloni commited on
Commit
462497d
·
verified ·
1 Parent(s): 68640c1

Upload 8 files

Browse files
Files changed (3) hide show
  1. frontend/app.css +130 -149
  2. frontend/studio.css +130 -249
  3. frontend/studio.html +29 -24
frontend/app.css CHANGED
@@ -1,23 +1,20 @@
1
  :root {
2
  color-scheme: dark;
3
- --ms-bg: #090b0f;
4
- --ms-bg-elevated: #0d1016;
5
- --ms-panel: rgba(18, 21, 29, .86);
6
- --ms-border: rgba(255, 255, 255, .085);
7
- --ms-border-strong: rgba(255, 255, 255, .15);
8
- --ms-text: #f4f5f7;
9
- --ms-text-soft: #b5bac6;
10
- --ms-muted: #747b8c;
11
- --ms-faint: #4f5564;
12
- --ms-accent: #8b7cff;
13
- --ms-success: #63d8a2;
14
- --ms-warning: #f4bf75;
15
- --ms-radius-xl: 22px;
16
- --ms-radius-lg: 16px;
17
- --ms-radius-md: 12px;
18
- --ms-shadow: 0 28px 80px rgba(0,0,0,.34), inset 0 1px rgba(255,255,255,.025);
19
- --ms-font: Inter, ui-sans-serif, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
20
- --ms-mono: "SFMono-Regular", Consolas, "Liberation Mono", monospace;
21
  }
22
 
23
  :host {
@@ -25,147 +22,131 @@
25
  min-height: 100vh;
26
  color-scheme: dark;
27
  background:
28
- radial-gradient(1000px 620px at 10% -10%, rgba(92,75,202,.18), transparent 62%),
29
- radial-gradient(780px 500px at 96% 8%, rgba(53,103,175,.12), transparent 66%),
30
- linear-gradient(180deg, #0a0c11 0%, #090b0f 50%, #080a0d 100%);
31
  }
32
 
33
- html, body { min-height: 100%; background: var(--ms-bg) !important; }
34
- body { margin: 0; color: var(--ms-text); font-family: var(--ms-font); -webkit-font-smoothing: antialiased; text-rendering: optimizeLegibility; }
35
- body::before {
36
- position: fixed;
37
- z-index: -2;
38
- inset: 0;
39
- content: "";
40
- pointer-events: none;
41
- background:
42
- radial-gradient(1000px 620px at 10% -10%, rgba(92,75,202,.18), transparent 62%),
43
- radial-gradient(780px 500px at 96% 8%, rgba(53,103,175,.12), transparent 66%),
44
- linear-gradient(180deg, #0a0c11 0%, #090b0f 50%, #080a0d 100%);
45
- }
46
- body::after {
47
- position: fixed;
48
- z-index: -1;
49
- inset: 0;
50
- content: "";
51
- pointer-events: none;
52
- opacity: .28;
53
- background-image: linear-gradient(rgba(255,255,255,.012) 1px, transparent 1px), linear-gradient(90deg, rgba(255,255,255,.012) 1px, transparent 1px);
54
- background-size: 32px 32px;
55
- mask-image: linear-gradient(to bottom, black, transparent 78%);
56
- }
57
-
58
- .gradio-container, .gradio-container.dark {
59
- min-height: 100vh !important;
60
- max-width: none !important;
61
- margin: 0 !important;
62
- padding: 0 !important;
63
- background: transparent !important;
64
- color: var(--ms-text) !important;
65
- font-family: var(--ms-font) !important;
66
- }
67
  .gradio-container .prose, .gradio-container .prose * { color: inherit; }
68
  .gradio-container footer { display: none !important; }
69
 
70
- #app-shell {
71
- width: min(1240px, calc(100% - 40px));
72
- margin: 0 auto;
73
- padding: 34px 0 58px;
74
- gap: 18px;
75
- }
76
-
77
- #masthead, #intro { border: 0 !important; background: transparent !important; }
78
- #masthead { padding: 16px 4px 24px; }
79
- #masthead .masthead-inner { display: flex; align-items: center; justify-content: space-between; gap: 18px; }
80
- #masthead .brand { display: inline-flex; align-items: center; gap: 11px; color: var(--ms-text) !important; font-size: .92rem; font-weight: 680; letter-spacing: -.025em; text-decoration: none; }
81
- .brand-mark { display: flex; align-items: end; justify-content: center; width: 30px; height: 30px; gap: 2px; padding: 7px; border: 1px solid rgba(139,124,255,.3); border-radius: 9px; background: linear-gradient(145deg, rgba(139,124,255,.2), rgba(95,140,255,.08)); box-shadow: 0 8px 28px rgba(75,60,180,.2), inset 0 1px rgba(255,255,255,.13); }
82
- .brand-mark i { display: block; width: 2px; border-radius: 3px; background: #d8d4ff; }
83
- .brand-mark i:nth-child(1) { height: 6px; opacity: .62; }
84
- .brand-mark i:nth-child(2) { height: 12px; }
85
- .brand-mark i:nth-child(3) { height: 9px; opacity: .8; }
86
- .brand-mark i:nth-child(4) { height: 14px; }
87
- .header-meta { display: flex; align-items: center; gap: 8px; }
88
- #model-badge, .zerogpu-badge { display: inline-flex; align-items: center; min-height: 30px; padding: 5px 10px; border: 1px solid var(--ms-border); border-radius: 999px; font: 620 .64rem/1 var(--ms-mono); letter-spacing: .07em; text-transform: uppercase; }
89
- #model-badge { border-color: rgba(139,124,255,.22); background: rgba(139,124,255,.09); color: #cec8ff; }
90
- #model-badge::before { width: 6px; height: 6px; margin-right: 7px; border-radius: 50%; background: var(--ms-success); box-shadow: 0 0 0 4px rgba(99,216,162,.1), 0 0 12px rgba(99,216,162,.62); content: ""; }
91
- .zerogpu-badge { background: rgba(255,255,255,.025); color: var(--ms-muted); }
92
-
93
- #intro { padding: 28px 4px 32px; }
94
- .intro-copy { max-width: 850px; }
95
- .eyebrow { display: inline-block; margin-bottom: 16px; color: #aaa1ff; font: 670 .67rem var(--ms-mono); letter-spacing: .13em; text-transform: uppercase; }
96
- .intro-copy h1 { margin: 0; color: var(--ms-text); font-size: clamp(2.7rem, 7vw, 5.9rem); font-weight: 590; letter-spacing: -.072em; line-height: .94; }
97
- .intro-copy h1 em { color: transparent; background: linear-gradient(112deg, #d9d5ff 4%, #8b7cff 48%, #5f9cff 94%); -webkit-background-clip: text; background-clip: text; font-style: normal; }
98
- .intro-copy p { max-width: 690px; margin: 23px 0 0; color: var(--ms-text-soft); font-size: clamp(.95rem,1.8vw,1.1rem); line-height: 1.68; letter-spacing: -.015em; }
99
-
100
- #studio-grid { align-items: flex-start; gap: 16px; }
101
- .section-heading { display: flex; align-items: center; gap: 12px; padding: 2px 2px 12px; }
102
- .section-heading .step-number { color: var(--ms-faint); font: .61rem var(--ms-mono); letter-spacing: .08em; }
103
- .section-heading h2 { margin: 0 0 4px; color: var(--ms-text); font-size: .9rem; font-weight: 630; letter-spacing: -.02em; }
104
- .section-heading p { margin: 0; color: var(--ms-muted); font-size: .68rem; line-height: 1.4; }
105
-
106
- #upload-card, #result-panel {
107
- position: relative;
108
- min-width: 0;
109
- border: 1px solid var(--ms-border) !important;
110
- border-radius: var(--ms-radius-xl) !important;
111
- background: linear-gradient(145deg, rgba(20,23,32,.93), rgba(13,16,22,.9)) !important;
112
- box-shadow: var(--ms-shadow) !important;
113
- backdrop-filter: blur(22px);
114
- }
115
- #upload-card::before, #result-panel::before { position: absolute; top: 0; right: 12%; left: 12%; height: 1px; content: ""; pointer-events: none; background: linear-gradient(90deg, transparent, rgba(255,255,255,.16), transparent); }
116
- #upload-card { padding: clamp(16px,2.5vw,25px) !important; }
117
- #result-panel { padding: clamp(12px,2vw,19px) !important; }
118
-
119
- #audio-input { overflow: hidden; min-height: 214px; border: 1px dashed rgba(255,255,255,.16) !important; border-radius: var(--ms-radius-lg) !important; background: rgba(7,9,13,.46) !important; transition: border-color 180ms ease, background 180ms ease; }
120
- #audio-input:hover, #audio-input:focus-within { border-color: rgba(139,124,255,.54) !important; background: rgba(139,124,255,.045) !important; }
121
  #audio-input .wrap, #audio-input > div, #audio-input .upload-container { border: 0 !important; background: transparent !important; }
122
- #audio-input .upload-container { min-height: 190px; }
123
- #audio-input button, #audio-input .upload-button { border-color: var(--ms-border-strong) !important; border-radius: 10px !important; background: rgba(255,255,255,.055) !important; color: var(--ms-text) !important; box-shadow: none !important; }
124
- #audio-input audio { width: 100%; filter: saturate(.75) contrast(.96); }
125
-
126
- #advanced-settings, #score-settings, #downloads-panel { overflow: hidden; border: 1px solid var(--ms-border) !important; border-radius: var(--ms-radius-md) !important; background: rgba(8,10,14,.42) !important; box-shadow: none !important; }
127
- #advanced-settings > button, #advanced-settings summary, #score-settings > button, #score-settings summary, #downloads-panel > button, #downloads-panel summary { min-height: 43px; padding-inline: 13px !important; background: transparent !important; color: var(--ms-text-soft) !important; font-size: .76rem !important; font-weight: 580 !important; }
128
- #advanced-settings > div, #score-settings > div, #downloads-panel > div { border-color: var(--ms-border) !important; background: transparent !important; }
129
- #advanced-settings label, #score-settings label, #downloads-panel label { color: var(--ms-text-soft) !important; font-size: .73rem !important; }
130
- #advanced-settings input, #advanced-settings textarea, #advanced-settings select, #score-settings input, #score-settings textarea, #score-settings select { border-color: var(--ms-border) !important; border-radius: 9px !important; background: rgba(255,255,255,.035) !important; color: var(--ms-text) !important; }
131
- #advanced-settings input[type="range"], #advanced-settings input[type="checkbox"], #score-settings input[type="range"], #score-settings input[type="checkbox"] { accent-color: var(--ms-accent); }
132
-
133
- #transcribe-button { position: relative; overflow: hidden; width: 100%; min-height: 50px; margin-top: 3px; border: 1px solid rgba(255,255,255,.15) !important; border-radius: 13px !important; background: linear-gradient(128deg, #7a69eb 0%, #675ad2 48%, #4f75d5 100%) !important; box-shadow: 0 10px 30px rgba(76,66,181,.25), inset 0 1px rgba(255,255,255,.2) !important; color: #fff !important; font-size: .9rem !important; font-weight: 650 !important; transition: transform 150ms ease, box-shadow 150ms ease, filter 150ms ease !important; }
134
- #transcribe-button:hover:not(:disabled) { filter: brightness(1.08); transform: translateY(-1px); box-shadow: 0 14px 38px rgba(76,66,181,.32), inset 0 1px rgba(255,255,255,.22) !important; }
135
- #transcribe-button:disabled, #transcribe-button[aria-busy="true"] { cursor: wait; filter: saturate(.55) brightness(.8); }
136
- .cold-note { display: flex; align-items: flex-start; gap: 8px; margin: 2px !important; color: var(--ms-faint); font-size: .64rem; line-height: 1.5; }
137
- .cold-note > span { width: 6px; height: 6px; flex: none; margin-top: 3px; border-radius: 50%; background: var(--ms-warning); box-shadow: 0 0 8px rgba(244,191,117,.38); }
138
-
139
- #studio-viewer, #visualizer-host { min-width: 0; margin: 0; padding: 0 !important; border: 0 !important; background: transparent !important; }
 
 
 
 
140
  #studio-viewer > .wrap, #studio-viewer > div, #studio-viewer .html-container { min-width: 0; padding: 0 !important; border: 0 !important; background: transparent !important; }
141
- #score-settings { margin-top: 3px; }
142
- #generate-score-button { min-height: 42px; margin-top: 5px; border: 1px solid rgba(139,124,255,.44) !important; border-radius: 10px !important; background: rgba(139,124,255,.14) !important; color: #ede9fe !important; font-weight: 680 !important; }
143
- #generate-score-button:hover:not(:disabled) { background: rgba(139,124,255,.22) !important; }
144
- #generate-score-button:disabled { border-color: var(--ms-border) !important; background: rgba(255,255,255,.025) !important; color: var(--ms-faint) !important; }
145
- #downloads-panel { margin-top: 0; }
146
- #downloads-row { margin: 0; padding: 3px 11px 12px; display: flex !important; flex-wrap: wrap !important; gap: 8px; border: 0; background: transparent; }
147
- #downloads-row > div { min-width: min(190px,100%); flex: 1 1 190px !important; overflow: hidden; border: 1px solid var(--ms-border) !important; border-radius: 9px !important; background: rgba(255,255,255,.022) !important; }
148
-
149
- .footnote { display: flex; justify-content: space-between; gap: 16px; padding: 14px 5px 0; color: var(--ms-faint); font: .57rem/1.5 var(--ms-mono); }
150
-
151
- @media (max-width: 860px) {
152
- #app-shell { width: min(100% - 24px,1240px); padding-top: 22px; }
153
- #intro { padding: 22px 3px 27px; }
154
- #studio-grid { flex-direction: column !important; }
155
- #upload-card, #result-panel { width: 100% !important; min-width: 100% !important; }
 
 
 
 
 
156
  }
157
 
158
- @media (max-width: 600px) {
159
- #app-shell { width: min(100% - 16px,1240px); padding-bottom: 30px; gap: 12px; }
160
- #masthead .masthead-inner, .footnote { align-items: flex-start; flex-direction: column; }
161
- .header-meta { width: 100%; }
162
- .intro-copy h1 { font-size: clamp(2.65rem,15vw,4.2rem); letter-spacing: -.062em; }
163
- #upload-card, #result-panel { border-radius: 17px !important; }
164
- #upload-card { padding: 12px !important; }
165
- #result-panel { padding: 10px !important; }
166
- #audio-input { min-height: 180px; }
 
 
 
 
 
 
167
  }
168
 
169
  @media (prefers-reduced-motion: reduce) {
170
- *, *::before, *::after { scroll-behavior: auto !important; animation-duration: .01ms !important; animation-iteration-count: 1 !important; transition-duration: .01ms !important; }
171
  }
 
1
  :root {
2
  color-scheme: dark;
3
+ --ui-bg: #0b0d0e;
4
+ --ui-surface: #121517;
5
+ --ui-surface-2: #171b1e;
6
+ --ui-surface-3: #1b2023;
7
+ --ui-line: rgba(218, 233, 229, .1);
8
+ --ui-line-strong: rgba(218, 233, 229, .19);
9
+ --ui-text: #eef4f1;
10
+ --ui-soft: #b1bcb8;
11
+ --ui-muted: #727e7a;
12
+ --ui-accent: #45d1b5;
13
+ --ui-accent-dark: #168f7d;
14
+ --ui-warm: #eead68;
15
+ --ui-danger: #fb7185;
16
+ --ui-font: Inter, ui-sans-serif, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
17
+ --ui-mono: "SFMono-Regular", Consolas, "Liberation Mono", monospace;
 
 
 
18
  }
19
 
20
  :host {
 
22
  min-height: 100vh;
23
  color-scheme: dark;
24
  background:
25
+ linear-gradient(115deg, rgba(69,209,181,.045) 0 1px, transparent 1px 100%),
26
+ linear-gradient(180deg, #101315 0%, #0b0d0e 34%, #090b0c 100%);
27
+ background-size: 56px 56px, auto;
28
  }
29
 
30
+ html, body { min-height: 100%; background: var(--ui-bg) !important; }
31
+ body { margin: 0; color: var(--ui-text); font-family: var(--ui-font); -webkit-font-smoothing: antialiased; }
32
+ .gradio-container, .gradio-container.dark { min-height: 100vh !important; max-width: none !important; margin: 0 !important; padding: 0 !important; color: var(--ui-text) !important; background: transparent !important; font-family: var(--ui-font) !important; }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
33
  .gradio-container .prose, .gradio-container .prose * { color: inherit; }
34
  .gradio-container footer { display: none !important; }
35
 
36
+ #app-shell { width: min(1360px, calc(100% - 44px)); margin: 0 auto; padding: 28px 0 54px; gap: 18px; }
37
+ #masthead, #intro { padding: 0 !important; border: 0 !important; background: transparent !important; }
38
+
39
+ .workbench-nav { display: flex; align-items: center; justify-content: space-between; min-height: 52px; gap: 20px; padding: 0 2px 14px; border-bottom: 1px solid var(--ui-line); }
40
+ .wordmark { display: inline-flex; align-items: center; gap: 11px; color: var(--ui-text) !important; text-decoration: none; }
41
+ .wordmark-glyph { display: grid; width: 35px; height: 35px; border: 1px solid rgba(69,209,181,.3); border-radius: 50%; color: var(--ui-accent); background: #101a18; font: 720 .88rem var(--ui-mono); box-shadow: inset 0 0 0 5px rgba(69,209,181,.045); place-items: center; }
42
+ .wordmark strong, .wordmark small { display: block; }
43
+ .wordmark strong { font-size: .9rem; font-weight: 670; letter-spacing: -.02em; }
44
+ .wordmark small { margin-top: 2px; color: var(--ui-muted); font: .56rem var(--ui-mono); letter-spacing: .055em; text-transform: uppercase; }
45
+ .runtime-status { display: flex; align-items: center; gap: 6px; }
46
+ .runtime-status span { display: inline-flex; align-items: center; min-height: 28px; gap: 7px; padding: 0 9px; border: 1px solid var(--ui-line); border-radius: 6px; color: var(--ui-muted); background: rgba(255,255,255,.018); font: 590 .58rem var(--ui-mono); letter-spacing: .04em; text-transform: uppercase; }
47
+ .runtime-status i { width: 6px; height: 6px; border-radius: 50%; background: var(--ui-accent); box-shadow: 0 0 10px rgba(69,209,181,.65); }
48
+
49
+ .workbench-intro { display: grid; grid-template-columns: minmax(0,1.45fr) minmax(330px,.7fr); align-items: end; gap: clamp(38px,7vw,110px); padding: clamp(44px,7vw,88px) 2px clamp(34px,5vw,62px); }
50
+ .intro-statement { max-width: 790px; }
51
+ .overline { display: inline-block; margin-bottom: 17px; color: var(--ui-accent); font: 620 .62rem var(--ui-mono); letter-spacing: .12em; text-transform: uppercase; }
52
+ .intro-statement h1 { margin: 0; color: var(--ui-text); font-size: clamp(3rem,7.2vw,6.4rem); font-weight: 545; letter-spacing: -.068em; line-height: .88; }
53
+ .intro-statement h1 em { color: var(--ui-warm); font-style: normal; }
54
+ .intro-statement p { max-width: 680px; margin: 25px 0 0; color: var(--ui-soft); font-size: clamp(.94rem,1.6vw,1.08rem); line-height: 1.7; }
55
+ .workflow-map { display: grid; border-top: 1px solid var(--ui-line-strong); }
56
+ .workflow-map > div { display: grid; grid-template-columns: 34px 1fr; align-items: center; gap: 12px; min-height: 67px; border-bottom: 1px solid var(--ui-line); }
57
+ .workflow-map b { color: var(--ui-accent); font: 560 .58rem var(--ui-mono); }
58
+ .workflow-map strong, .workflow-map small { display: block; }
59
+ .workflow-map strong { color: var(--ui-text); font-size: .76rem; font-weight: 620; }
60
+ .workflow-map small { margin-top: 3px; color: var(--ui-muted); font-size: .65rem; }
61
+
62
+ #input-workbench, #transcription-panel { position: relative; min-width: 0; padding: clamp(17px,2.2vw,27px) !important; border: 1px solid var(--ui-line) !important; background: rgba(18,21,23,.94) !important; box-shadow: 0 24px 70px rgba(0,0,0,.23) !important; }
63
+ #input-workbench { border-radius: 18px !important; }
64
+ #input-workbench::before { position: absolute; top: -1px; left: 28px; width: 92px; height: 2px; content: ""; background: var(--ui-accent); }
65
+ #transcription-panel { border-radius: 8px 22px 22px 22px !important; }
66
+ #transcription-panel::before { position: absolute; top: -1px; left: -1px; width: 84px; height: 5px; content: ""; background: linear-gradient(90deg,var(--ui-warm),#d8784f); }
67
+
68
+ .panel-heading { display: flex; align-items: flex-end; justify-content: space-between; gap: 20px; padding: 0 1px 18px; border-bottom: 1px solid var(--ui-line); }
69
+ .panel-heading span { display: block; margin-bottom: 5px; color: var(--ui-accent); font: 620 .57rem var(--ui-mono); letter-spacing: .1em; text-transform: uppercase; }
70
+ .studio-heading span { color: var(--ui-warm); }
71
+ .panel-heading h2 { margin: 0; color: var(--ui-text); font-size: 1.02rem; font-weight: 625; letter-spacing: -.025em; }
72
+ .panel-heading p { max-width: 440px; margin: 0; color: var(--ui-muted); font-size: .68rem; line-height: 1.45; text-align: right; }
73
+
74
+ #control-grid { align-items: stretch; gap: 10px; padding-top: 13px; }
75
+ #source-panel, #decode-panel, #notation-panel { min-width: 0; padding: 15px !important; border: 1px solid var(--ui-line) !important; border-radius: 11px !important; background: rgba(7,10,10,.32) !important; box-shadow: none !important; }
76
+ #source-panel { background: linear-gradient(145deg,rgba(69,209,181,.04),rgba(7,10,10,.34)) !important; }
77
+ #notation-panel { background: linear-gradient(145deg,rgba(238,173,104,.035),rgba(7,10,10,.34)) !important; }
78
+ .control-heading { display: flex; align-items: flex-start; gap: 10px; min-height: 46px; padding-bottom: 12px; }
79
+ .control-heading > span { display: grid; width: 24px; height: 24px; flex: none; border: 1px solid var(--ui-line-strong); border-radius: 5px; color: var(--ui-accent); font: 600 .55rem var(--ui-mono); place-items: center; }
80
+ #notation-panel .control-heading > span { color: var(--ui-warm); }
81
+ .control-heading strong, .control-heading small { display: block; }
82
+ .control-heading strong { color: var(--ui-text); font-size: .77rem; font-weight: 620; }
83
+ .control-heading small { margin-top: 4px; color: var(--ui-muted); font-size: .61rem; line-height: 1.45; }
84
+
85
+ #audio-input { overflow: hidden; min-height: 243px; border: 1px dashed rgba(69,209,181,.3) !important; border-radius: 9px !important; background: rgba(5,9,8,.58) !important; }
86
+ #audio-input:hover, #audio-input:focus-within { border-color: rgba(69,209,181,.7) !important; background: rgba(69,209,181,.035) !important; }
87
  #audio-input .wrap, #audio-input > div, #audio-input .upload-container { border: 0 !important; background: transparent !important; }
88
+ #audio-input .upload-container { min-height: 215px; }
89
+ #audio-input button, #audio-input .upload-button { border: 1px solid var(--ui-line-strong) !important; border-radius: 7px !important; background: var(--ui-surface-3) !important; color: var(--ui-text) !important; box-shadow: none !important; }
90
+ #audio-input audio { width: 100%; filter: saturate(.72) contrast(.96); }
91
+
92
+ #decode-panel label, #notation-panel label, #downloads-row label { color: var(--ui-soft) !important; font-size: .7rem !important; }
93
+ #decode-panel input, #decode-panel textarea, #decode-panel select, #notation-panel input, #notation-panel textarea, #notation-panel select { border-color: var(--ui-line) !important; border-radius: 7px !important; background: rgba(255,255,255,.03) !important; color: var(--ui-text) !important; }
94
+ #decode-panel input[type="range"], #decode-panel input[type="checkbox"], #notation-panel input[type="range"], #notation-panel input[type="checkbox"] { accent-color: var(--ui-accent); }
95
+ #decoding-sliders, #score-primary-settings { gap: 7px; }
96
+ #decoding-sliders > div, #score-primary-settings > div { min-width: 118px; }
97
+
98
+ #run-row { align-items: center; gap: 14px; padding: 11px 1px 0; }
99
+ #transcribe-button { flex: 0 1 330px !important; min-height: 48px; border: 1px solid rgba(141,255,230,.32) !important; border-radius: 7px !important; background: linear-gradient(112deg,#168f7d,#21aa93) !important; box-shadow: 0 9px 24px rgba(18,132,113,.23), inset 0 1px rgba(255,255,255,.17) !important; color: #f5fffc !important; font-size: .84rem !important; font-weight: 680 !important; letter-spacing: .005em; transition: transform 140ms ease, filter 140ms ease !important; }
100
+ #transcribe-button:hover:not(:disabled) { filter: brightness(1.1); transform: translateY(-1px); }
101
+ #transcribe-button:disabled, #transcribe-button[aria-busy="true"] { cursor: wait; filter: grayscale(.35) brightness(.75); }
102
+ .cold-note { display: flex; align-items: center; gap: 8px; margin: 0 !important; color: var(--ui-muted); font: .59rem/1.5 var(--ui-mono); }
103
+ .cold-note > span { width: 6px; height: 6px; flex: none; border-radius: 50%; background: var(--ui-warm); }
104
+
105
+ #generate-score-button { min-height: 38px; margin-top: 2px; border: 1px solid rgba(238,173,104,.38) !important; border-radius: 7px !important; background: rgba(238,173,104,.1) !important; color: #f5c996 !important; font-weight: 650 !important; }
106
+ #generate-score-button:hover:not(:disabled) { background: rgba(238,173,104,.17) !important; }
107
+ #generate-score-button:disabled { border-color: var(--ui-line) !important; background: rgba(255,255,255,.018) !important; color: var(--ui-muted) !important; }
108
+
109
+ #studio-viewer { min-width: 0; margin: 14px 0 0; padding: 0 !important; border: 0 !important; background: transparent !important; }
110
  #studio-viewer > .wrap, #studio-viewer > div, #studio-viewer .html-container { min-width: 0; padding: 0 !important; border: 0 !important; background: transparent !important; }
111
+ .export-heading { display: grid; grid-template-columns: auto 1fr auto; align-items: baseline; gap: 10px; margin-top: 3px; padding: 14px 1px 8px; border-top: 1px solid var(--ui-line); }
112
+ .export-heading span { color: var(--ui-warm); font: 600 .55rem var(--ui-mono); letter-spacing: .08em; text-transform: uppercase; }
113
+ .export-heading strong { color: var(--ui-text); font-size: .76rem; }
114
+ .export-heading small { color: var(--ui-muted); font-size: .61rem; }
115
+ #downloads-row { display: grid !important; grid-template-columns: repeat(5,minmax(0,1fr)); gap: 7px; margin: 0; }
116
+ #downloads-row > div { min-width: 0 !important; overflow: hidden; border: 1px solid var(--ui-line) !important; border-radius: 7px !important; background: rgba(255,255,255,.018) !important; box-shadow: none !important; }
117
+ #downloads-row a, #downloads-row button { color: #bfeee4 !important; }
118
+
119
+ .footnote { display: flex; justify-content: space-between; gap: 16px; padding: 11px 3px 0; color: var(--ui-muted); font: .55rem var(--ui-mono); }
120
+
121
+ @media (max-width: 1080px) {
122
+ .workbench-intro { grid-template-columns: 1fr; gap: 35px; }
123
+ .workflow-map { grid-template-columns: repeat(3,1fr); }
124
+ .workflow-map > div { grid-template-columns: 28px 1fr; border-right: 1px solid var(--ui-line); padding: 0 12px; }
125
+ #control-grid { flex-wrap: wrap !important; }
126
+ #source-panel { width: 100% !important; flex-basis: 100% !important; }
127
+ #decode-panel, #notation-panel { flex: 1 1 calc(50% - 5px) !important; }
128
+ #audio-input { min-height: 190px; }
129
+ #audio-input .upload-container { min-height: 165px; }
130
+ #downloads-row { grid-template-columns: repeat(3,minmax(0,1fr)); }
131
  }
132
 
133
+ @media (max-width: 720px) {
134
+ #app-shell { width: min(100% - 18px,1360px); padding-top: 14px; }
135
+ .workbench-nav, .panel-heading, .footnote { align-items: flex-start; flex-direction: column; }
136
+ .runtime-status { width: 100%; }
137
+ .workbench-intro { padding: 38px 2px 28px; }
138
+ .intro-statement h1 { font-size: clamp(3rem,16vw,4.8rem); }
139
+ .workflow-map { grid-template-columns: 1fr; }
140
+ .workflow-map > div { border-right: 0; }
141
+ #input-workbench, #transcription-panel { padding: 12px !important; border-radius: 11px !important; }
142
+ .panel-heading p { text-align: left; }
143
+ #decode-panel, #notation-panel { width: 100% !important; flex-basis: 100% !important; }
144
+ #run-row { align-items: stretch; flex-direction: column !important; }
145
+ #transcribe-button { width: 100% !important; flex-basis: auto !important; }
146
+ .export-heading { grid-template-columns: 1fr; }
147
+ #downloads-row { grid-template-columns: 1fr; }
148
  }
149
 
150
  @media (prefers-reduced-motion: reduce) {
151
+ *, *::before, *::after { animation-duration: .01ms !important; animation-iteration-count: 1 !important; transition-duration: .01ms !important; }
152
  }
frontend/studio.css CHANGED
@@ -1,289 +1,170 @@
1
  :root {
2
  color-scheme: dark;
3
- --ms-bg: #090b0f;
4
- --ms-panel: #11151d;
5
- --ms-line: rgba(255, 255, 255, .085);
6
- --ms-line-strong: rgba(255, 255, 255, .15);
7
- --ms-text: #f4f5f7;
8
- --ms-soft: #b5bac6;
9
- --ms-muted: #747b8c;
10
- --ms-faint: #505766;
11
- --ms-accent: #8b7cff;
12
- --ms-success: #63d8a2;
13
- --ms-warning: #f4bf75;
14
- --ms-danger: #ff758e;
 
 
 
15
  --ms-mono: "SFMono-Regular", Consolas, "Liberation Mono", monospace;
16
  }
17
 
18
  * { box-sizing: border-box; }
19
-
20
- .ms-root {
21
- display: grid;
22
- min-width: 0;
23
- gap: 14px;
24
- color: var(--ms-text);
25
- font-family: Inter, ui-sans-serif, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
26
- container-type: inline-size;
27
- }
28
-
29
  .ms-root [hidden] { display: none !important; }
30
  .ms-root button, .ms-root input, .ms-root select { font: inherit; }
31
 
32
- .ms-topbar {
33
- display: flex;
34
- align-items: flex-start;
35
- justify-content: space-between;
36
- gap: 18px;
37
- min-width: 0;
38
- padding: 2px 2px 0;
39
- }
40
-
41
  .ms-heading { min-width: 0; }
42
- .ms-heading h2 {
43
- overflow: hidden;
44
- max-width: 620px;
45
- margin: 0;
46
- color: var(--ms-text);
47
- font-size: clamp(1.04rem, 2vw, 1.3rem);
48
- font-weight: 620;
49
- letter-spacing: -.032em;
50
- text-overflow: ellipsis;
51
- white-space: nowrap;
52
- }
53
- .ms-subtitle {
54
- display: flex;
55
- align-items: center;
56
- gap: 8px;
57
- margin: 6px 0 0;
58
- color: var(--ms-muted);
59
- font-size: .74rem;
60
- line-height: 1.45;
61
- }
62
- .ms-subtitle b { color: var(--ms-faint); font: 560 .57rem var(--ms-mono); white-space: nowrap; }
63
- .ms-subtitle b::before { margin-right: 8px; content: "·"; }
64
-
65
- .ms-eyebrow {
66
- display: flex;
67
- align-items: center;
68
- gap: 8px;
69
- margin: 0 0 7px;
70
- color: var(--ms-muted);
71
- font: 650 .62rem/1 var(--ms-mono);
72
- letter-spacing: .09em;
73
- text-transform: uppercase;
74
- }
75
-
76
- .ms-state-dot {
77
- width: 7px;
78
- height: 7px;
79
- flex: none;
80
- border-radius: 50%;
81
- background: var(--ms-faint);
82
- box-shadow: 0 0 0 3px rgba(255,255,255,.035);
83
- }
84
- .ms-root[data-state="queued"] .ms-state-dot,
85
- .ms-root[data-state="loading"] .ms-state-dot,
86
- .ms-root[data-state="transcribing"] .ms-state-dot {
87
- background: var(--ms-warning);
88
- box-shadow: 0 0 0 4px rgba(244,191,117,.1), 0 0 14px rgba(244,191,117,.38);
89
- animation: ms-pulse 1.7s ease-in-out infinite;
90
- }
91
- .ms-root[data-state="complete"] .ms-state-dot,
92
- .ms-root[data-state="ready"] .ms-state-dot {
93
- background: var(--ms-success);
94
- box-shadow: 0 0 0 4px rgba(99,216,162,.09), 0 0 13px rgba(99,216,162,.32);
95
- }
96
- .ms-root[data-state="error"] .ms-state-dot,
97
- .ms-root[data-state="notation_error"] .ms-state-dot { background: var(--ms-danger); }
98
-
99
- .ms-quick-downloads { display: flex; flex: none; gap: 6px; }
100
- .ms-quick-downloads a,
101
- .ms-tracks-heading button,
102
- .ms-track-controls button,
103
- .ms-track-controls a {
104
- display: inline-flex;
105
- align-items: center;
106
- justify-content: center;
107
- border: 1px solid var(--ms-line);
108
- border-radius: 9px;
109
- background: rgba(255,255,255,.035);
110
- color: var(--ms-soft);
111
- cursor: pointer;
112
- text-decoration: none;
113
- transition: color 140ms ease, border-color 140ms ease, background 140ms ease, transform 140ms ease;
114
- }
115
- .ms-quick-downloads a { min-height: 33px; padding: 0 10px; font-size: .66rem; font-weight: 620; }
116
- .ms-quick-downloads a:hover:not([aria-disabled="true"]),
117
- .ms-tracks-heading button:hover,
118
- .ms-track-controls button:hover,
119
- .ms-track-controls a:hover:not([aria-disabled="true"]) {
120
- border-color: rgba(139,124,255,.38);
121
- background: rgba(139,124,255,.13);
122
- color: #e4e1ff;
123
- transform: translateY(-1px);
124
- }
125
- .ms-quick-downloads a[aria-disabled="true"], .ms-track-controls a[aria-disabled="true"] {
126
- pointer-events: none;
127
- opacity: .3;
128
- }
129
-
130
- .ms-progress {
131
- display: grid;
132
- gap: 8px;
133
- padding: 11px 13px;
134
- border: 1px solid var(--ms-line);
135
- border-radius: 11px;
136
- background: rgba(7,9,13,.45);
137
- }
138
- .ms-progress > div { display: flex; justify-content: space-between; gap: 12px; color: var(--ms-soft); font-size: .7rem; }
139
- .ms-progress b { color: var(--ms-muted); font: 600 .64rem var(--ms-mono); }
140
- .ms-progress i { display: block; overflow: hidden; height: 4px; border-radius: 99px; background: rgba(255,255,255,.055); }
141
- .ms-progress i span { display: block; width: 0; height: 100%; border-radius: inherit; background: linear-gradient(90deg, var(--ms-accent), #6b9bff); box-shadow: 0 0 18px rgba(119,102,255,.45); transition: width 320ms ease; }
142
-
143
- .ms-empty {
144
- min-height: 420px;
145
- display: grid;
146
- align-content: center;
147
- justify-items: center;
148
- padding: 34px 20px;
149
- border: 1px solid var(--ms-line);
150
- border-radius: 14px;
151
- background: radial-gradient(circle at 50% 42%, rgba(139,124,255,.06), transparent 36%), #0a0d12;
152
- text-align: center;
153
- }
154
- .ms-empty-icon { display: grid; width: 44px; height: 44px; border: 1px solid var(--ms-line); border-radius: 12px; background: rgba(255,255,255,.025); color: #aaa1ff; font-size: 20px; place-items: center; }
155
- .ms-empty h3 { margin: 14px 0 6px; color: var(--ms-soft); font-size: .88rem; }
156
- .ms-empty p { max-width: 430px; margin: 0; color: var(--ms-faint); font-size: .7rem; line-height: 1.6; }
157
-
158
- .ms-workspace { display: grid; min-width: 0; gap: 12px; }
159
-
160
- .ms-stats {
161
- display: grid;
162
- grid-template-columns: repeat(4, minmax(0,1fr));
163
- overflow: hidden;
164
- border: 1px solid var(--ms-line);
165
- border-radius: 11px;
166
- background: rgba(7,9,13,.36);
167
- }
168
- .ms-stats > div { min-width: 0; padding: 10px 12px; }
169
  .ms-stats > div + div { border-left: 1px solid var(--ms-line); }
170
- .ms-stats span { display: block; margin-bottom: 4px; color: var(--ms-faint); font: 650 .55rem var(--ms-mono); letter-spacing: .07em; text-transform: uppercase; }
171
- .ms-stats strong { display: block; overflow: hidden; color: var(--ms-soft); font-size: .75rem; font-weight: 590; text-overflow: ellipsis; white-space: nowrap; }
172
-
173
- .ms-transport {
174
- display: grid;
175
- gap: 9px;
176
- padding: 10px;
177
- border: 1px solid var(--ms-line);
178
- border-radius: 12px;
179
- background: rgba(7,9,13,.46);
180
- }
181
- .ms-transport-main, .ms-transport-options { display: flex; align-items: center; min-width: 0; gap: 8px; }
182
- .ms-play, .ms-stop {
183
- display: grid;
184
- width: 34px;
185
- height: 34px;
186
- flex: none;
187
- border: 1px solid var(--ms-line-strong);
188
- border-radius: 50%;
189
- color: #fff;
190
- background: linear-gradient(135deg, #7a69eb, #5576d7);
191
- cursor: pointer;
192
- place-items: center;
193
- }
194
- .ms-stop { width: 29px; height: 29px; border-radius: 8px; color: var(--ms-soft); background: rgba(255,255,255,.04); }
195
- .ms-play:disabled, .ms-stop:disabled { cursor: not-allowed; filter: saturate(.3); opacity: .38; }
196
- .ms-transport-main > span { min-width: 44px; color: var(--ms-muted); font: 600 .62rem var(--ms-mono); text-align: center; }
197
- .ms-seek { min-width: 80px; flex: 1; accent-color: var(--ms-accent); }
198
- .ms-transport-options { flex-wrap: wrap; padding-left: 71px; }
199
-
200
- .ms-source-mix { display: flex; align-items: center; gap: 5px; min-height: 32px; padding: 3px; border: 1px solid var(--ms-line); border-radius: 9px; background: rgba(255,255,255,.025); }
201
- .ms-source-mix button { height: 24px; padding: 0 7px; border: 0; border-radius: 6px; color: var(--ms-muted); background: transparent; cursor: pointer; font-size: .58rem; font-weight: 720; }
202
- .ms-source-mix button[aria-pressed="true"] { color: #fff; background: rgba(139,124,255,.32); }
203
- .ms-source-mix input { width: 82px; accent-color: var(--ms-accent); }
204
- .ms-stereo-toggle, .ms-volume { display: flex; align-items: center; gap: 6px; min-height: 32px; padding: 0 8px; border: 1px solid var(--ms-line); border-radius: 9px; color: var(--ms-muted); background: rgba(255,255,255,.025); font-size: .6rem; white-space: nowrap; }
205
  .ms-stereo-toggle { cursor: pointer; }
206
- .ms-stereo-toggle input { accent-color: var(--ms-accent); }
207
- .ms-stereo-toggle[data-active="true"] { border-color: rgba(139,124,255,.46); color: #dcd7ff; background: rgba(139,124,255,.12); }
208
- .ms-volume input { width: 64px; accent-color: var(--ms-accent); }
209
- .ms-synth-state { margin-left: auto; color: var(--ms-faint); font: 570 .56rem var(--ms-mono); }
210
  .ms-synth-state[data-kind="loading"] { color: var(--ms-warning); }
211
  .ms-synth-state[data-kind="ready"] { color: var(--ms-success); }
212
  .ms-synth-state[data-kind="error"] { color: var(--ms-danger); }
213
 
214
- .ms-view-shell { overflow: hidden; min-width: 0; border: 1px solid var(--ms-line); border-radius: 14px; background: #0a0d12; }
215
- .ms-tabs { display: flex; align-items: center; min-height: 42px; gap: 20px; padding: 0 13px; border-bottom: 1px solid var(--ms-line); background: rgba(255,255,255,.018); }
216
- .ms-tabs button { align-self: stretch; padding: 0 1px; border: 0; border-bottom: 2px solid transparent; color: var(--ms-muted); background: transparent; cursor: pointer; font-size: .64rem; font-weight: 720; text-transform: uppercase; }
 
 
217
  .ms-tabs button[aria-selected="true"] { border-bottom-color: var(--ms-accent); color: var(--ms-text); }
218
- .ms-tabs > span { overflow: hidden; margin-left: auto; color: var(--ms-faint); font: .57rem var(--ms-mono); text-overflow: ellipsis; white-space: nowrap; }
219
- .ms-tabs label { display: flex; align-items: center; gap: 5px; color: var(--ms-faint); font-size: .58rem; }
220
- .ms-tabs input { width: 62px; accent-color: var(--ms-accent); }
221
-
222
- .ms-roll-view { height: 420px; min-width: 0; padding: 11px; }
223
- .ms-roll-view canvas { display: block; width: 100%; height: 370px; border-radius: 8px; background: #090c11; cursor: crosshair; }
224
- .ms-roll-view p { margin: 7px 1px 0; color: var(--ms-faint); font-size: .58rem; text-align: right; }
225
- .ms-score-view { height: 420px; overflow: auto; padding: 14px; background: #11151b; overscroll-behavior: contain; }
226
  .ms-score-empty { min-height: 100%; display: grid; align-content: center; justify-items: center; color: var(--ms-muted); text-align: center; }
227
- .ms-score-empty span { color: var(--ms-accent); font-size: 36px; }
228
- .ms-score-empty strong { margin-top: 9px; color: var(--ms-soft); font-size: .82rem; }
229
- .ms-score-empty p { max-width: 420px; margin: 5px 0 0; font-size: .66rem; line-height: 1.5; }
230
- .ms-score-paper { min-width: 720px; padding: 18px; border-radius: 4px; background: #fffdf7; box-shadow: 0 12px 36px rgba(0,0,0,.3); }
231
  .ms-score-paper svg { display: block; width: 100%; height: auto; color: #111; }
232
 
233
- .ms-notation-info { display: flex; align-items: center; gap: 12px; padding: 9px 11px; border: 1px solid var(--ms-line); border-radius: 10px; background: rgba(255,255,255,.022); }
234
- .ms-notation-info > span { color: #aaa1ff; font: 650 .58rem var(--ms-mono); letter-spacing: .08em; text-transform: uppercase; }
235
- .ms-notation-info dl { display: flex; flex: 1; gap: 14px; margin: 0; }
236
- .ms-notation-info dl div { display: flex; gap: 5px; }
237
- .ms-notation-info dt, .ms-notation-info dd { margin: 0; font-size: .58rem; }
238
- .ms-notation-info dt { color: var(--ms-faint); }
239
- .ms-notation-info dd { color: var(--ms-soft); }
240
-
241
- .ms-tracks-heading { display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 4px 2px 0; }
242
  .ms-tracks-heading strong, .ms-kicker { display: block; }
243
- .ms-kicker { color: var(--ms-soft); font-size: .72rem; font-weight: 620; }
244
- .ms-tracks-heading strong { margin-top: 3px; color: var(--ms-faint); font: .58rem var(--ms-mono); }
245
- .ms-tracks-heading button { min-height: 29px; padding: 0 9px; font-size: .59rem; }
246
- .ms-track-list { display: grid; grid-template-columns: repeat(2, minmax(0,1fr)); gap: 8px; }
247
- .ms-track-placeholder { grid-column: 1 / -1; padding: 15px; border: 1px dashed var(--ms-line); border-radius: 11px; color: var(--ms-faint); font-size: .68rem; text-align: center; }
248
- .ms-track-row { display: grid; grid-template-columns: 6px minmax(0,1fr) auto; align-items: center; min-width: 0; min-height: 68px; gap: 10px; padding: 10px 11px; border: 1px solid var(--ms-line); border-radius: 11px; background: rgba(255,255,255,.022); transition: opacity 150ms ease, border-color 150ms ease, background 150ms ease; }
249
- .ms-track-row:hover { border-color: var(--ms-line-strong); background: rgba(255,255,255,.034); }
250
- .ms-track-row[data-inactive="true"] { opacity: .48; }
251
- .ms-track-color { width: 6px; height: 36px; border-radius: 99px; background: var(--track); box-shadow: 0 0 15px color-mix(in srgb, var(--track) 35%, transparent); }
252
  .ms-track-copy { min-width: 0; overflow: hidden; }
253
  .ms-track-copy strong, .ms-track-copy span { display: block; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
254
- .ms-track-copy strong { color: var(--ms-soft); font-size: .74rem; font-weight: 600; }
255
- .ms-track-copy span { margin-top: 4px; color: var(--ms-faint); font: .56rem var(--ms-mono); }
256
- .ms-program-select { width: min(100%, 158px); margin-top: 6px; padding: 3px 20px 3px 5px; border: 1px solid var(--ms-line); border-radius: 6px; background: #111721; color: var(--ms-soft); font-size: .57rem; }
257
- .ms-track-controls { display: flex; gap: 4px; }
258
- .ms-track-controls button, .ms-track-controls a { width: 27px; height: 27px; padding: 0; font: 700 .58rem var(--ms-mono); }
259
- .ms-track-controls button[aria-pressed="true"] { border-color: color-mix(in srgb, var(--track) 52%, transparent); background: color-mix(in srgb, var(--track) 18%, transparent); color: #fff; }
260
-
 
 
 
 
 
 
 
261
  .ms-announcer { position: absolute; overflow: hidden; width: 1px; height: 1px; clip: rect(0 0 0 0); }
262
 
263
- @keyframes ms-pulse { 0%,100% { opacity:.62; transform:scale(.88); } 50% { opacity:1; transform:scale(1); } }
 
 
 
 
 
 
 
 
 
 
264
 
265
- @container (max-width: 760px) {
266
  .ms-topbar { display: grid; }
267
  .ms-quick-downloads { width: 100%; }
268
  .ms-quick-downloads a { flex: 1; }
269
- .ms-transport-options { padding-left: 0; }
270
- .ms-synth-state { width: 100%; margin-left: 0; }
271
- .ms-track-list { grid-template-columns: 1fr; }
272
- }
273
-
274
- @container (max-width: 520px) {
275
  .ms-stats { grid-template-columns: repeat(2,minmax(0,1fr)); }
276
  .ms-stats > div:nth-child(3) { border-top: 1px solid var(--ms-line); border-left: 0; }
277
  .ms-stats > div:nth-child(4) { border-top: 1px solid var(--ms-line); }
278
  .ms-transport-main { flex-wrap: wrap; }
279
- .ms-seek { min-width: calc(100% - 134px); }
 
280
  .ms-source-mix { width: 100%; }
281
  .ms-source-mix input { flex: 1; }
 
 
282
  .ms-tabs > span { display: none; }
283
- .ms-roll-view, .ms-score-view { height: 330px; }
284
- .ms-roll-view canvas { height: 282px; }
285
  .ms-notation-info { align-items: flex-start; }
286
- .ms-notation-info dl { display: grid; grid-template-columns: repeat(2,1fr); gap: 6px 12px; }
287
  }
288
 
289
  @media (prefers-reduced-motion: reduce) {
 
1
  :root {
2
  color-scheme: dark;
3
+ --ms-bg: #0b0e0f;
4
+ --ms-panel: #121617;
5
+ --ms-panel-2: #171c1e;
6
+ --ms-line: rgba(218, 233, 229, .1);
7
+ --ms-line-strong: rgba(218, 233, 229, .19);
8
+ --ms-text: #eef4f1;
9
+ --ms-soft: #b1bcb8;
10
+ --ms-muted: #727e7a;
11
+ --ms-faint: #4e5855;
12
+ --ms-accent: #45d1b5;
13
+ --ms-accent-dark: #168f7d;
14
+ --ms-warm: #eead68;
15
+ --ms-success: #66d6a7;
16
+ --ms-warning: #eead68;
17
+ --ms-danger: #fb7185;
18
  --ms-mono: "SFMono-Regular", Consolas, "Liberation Mono", monospace;
19
  }
20
 
21
  * { box-sizing: border-box; }
22
+ .ms-root { display: grid; min-width: 0; gap: 12px; color: var(--ms-text); font-family: Inter, ui-sans-serif, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; container-type: inline-size; }
 
 
 
 
 
 
 
 
 
23
  .ms-root [hidden] { display: none !important; }
24
  .ms-root button, .ms-root input, .ms-root select { font: inherit; }
25
 
26
+ .ms-topbar { display: flex; align-items: flex-start; justify-content: space-between; min-width: 0; gap: 20px; padding: 2px 3px 12px 13px; border-left: 3px solid var(--ms-warm); }
 
 
 
 
 
 
 
 
27
  .ms-heading { min-width: 0; }
28
+ .ms-heading h2 { overflow: hidden; max-width: 760px; margin: 0; color: var(--ms-text); font-size: clamp(1.02rem,2vw,1.3rem); font-weight: 620; letter-spacing: -.03em; text-overflow: ellipsis; white-space: nowrap; }
29
+ .ms-eyebrow { display: flex; align-items: center; gap: 8px; margin: 0 0 7px; color: var(--ms-muted); font: 610 .57rem/1 var(--ms-mono); letter-spacing: .1em; text-transform: uppercase; }
30
+ .ms-state-dot { width: 7px; height: 7px; flex: none; border-radius: 2px; background: var(--ms-faint); transform: rotate(45deg); }
31
+ .ms-root[data-state="queued"] .ms-state-dot, .ms-root[data-state="loading"] .ms-state-dot, .ms-root[data-state="transcribing"] .ms-state-dot { background: var(--ms-warning); box-shadow: 0 0 12px rgba(238,173,104,.55); animation: ms-blink 1.3s ease-in-out infinite; }
32
+ .ms-root[data-state="complete"] .ms-state-dot, .ms-root[data-state="ready"] .ms-state-dot { background: var(--ms-success); box-shadow: 0 0 10px rgba(102,214,167,.42); }
33
+ .ms-root[data-state="error"] .ms-state-dot, .ms-root[data-state="notation_error"] .ms-state-dot { background: var(--ms-danger); }
34
+ .ms-subtitle { display: flex; align-items: center; gap: 8px; margin: 6px 0 0; color: var(--ms-muted); font-size: .7rem; line-height: 1.45; }
35
+ .ms-subtitle b { color: var(--ms-faint); font: 550 .55rem var(--ms-mono); white-space: nowrap; }
36
+ .ms-subtitle b::before { margin-right: 8px; content: "/"; }
37
+
38
+ .ms-quick-downloads { display: flex; flex: none; gap: 5px; }
39
+ .ms-quick-downloads a, .ms-tracks-heading button, .ms-track-controls button, .ms-track-controls a { display: inline-flex; align-items: center; justify-content: center; border: 1px solid var(--ms-line); border-radius: 4px; color: var(--ms-soft); background: rgba(255,255,255,.018); cursor: pointer; text-decoration: none; transition: border-color 130ms ease, color 130ms ease, background 130ms ease; }
40
+ .ms-quick-downloads a { min-height: 31px; padding: 0 9px; font: 610 .58rem var(--ms-mono); text-transform: uppercase; }
41
+ .ms-quick-downloads a:hover:not([aria-disabled="true"]), .ms-tracks-heading button:hover, .ms-track-controls button:hover, .ms-track-controls a:hover:not([aria-disabled="true"]) { border-color: rgba(69,209,181,.42); color: #d9fff7; background: rgba(69,209,181,.075); }
42
+ .ms-quick-downloads a[aria-disabled="true"], .ms-track-controls a[aria-disabled="true"] { pointer-events: none; opacity: .28; }
43
+
44
+ .ms-progress { display: grid; grid-template-columns: minmax(0,1fr) minmax(180px,.35fr); align-items: center; gap: 15px; padding: 9px 11px; border-top: 1px solid var(--ms-line); border-bottom: 1px solid var(--ms-line); background: rgba(238,173,104,.025); }
45
+ .ms-progress > div { display: flex; justify-content: space-between; gap: 12px; color: var(--ms-soft); font-size: .65rem; }
46
+ .ms-progress b { color: var(--ms-warning); font: 590 .58rem var(--ms-mono); }
47
+ .ms-progress i { display: block; overflow: hidden; height: 3px; background: rgba(255,255,255,.055); }
48
+ .ms-progress i span { display: block; width: 0; height: 100%; background: linear-gradient(90deg,var(--ms-warm),#d8784f); transition: width 300ms ease; }
49
+
50
+ .ms-empty { min-height: 440px; display: grid; align-content: center; justify-items: center; padding: 35px 20px; border: 1px dashed var(--ms-line-strong); background: repeating-linear-gradient(90deg,transparent 0 79px,rgba(255,255,255,.018) 80px), #0b0f10; text-align: center; }
51
+ .ms-empty-icon { display: grid; width: 46px; height: 46px; border: 1px solid rgba(69,209,181,.27); color: var(--ms-accent); background: rgba(69,209,181,.035); font-size: 20px; place-items: center; }
52
+ .ms-empty h3 { margin: 15px 0 6px; color: var(--ms-soft); font-size: .84rem; font-weight: 610; }
53
+ .ms-empty p { max-width: 480px; margin: 0; color: var(--ms-muted); font-size: .67rem; line-height: 1.6; }
54
+
55
+ .ms-workspace { display: grid; min-width: 0; gap: 10px; }
56
+ .ms-stats { display: grid; grid-template-columns: repeat(4,minmax(0,1fr)); border-top: 1px solid var(--ms-line); border-bottom: 1px solid var(--ms-line); }
57
+ .ms-stats > div { display: flex; align-items: baseline; justify-content: space-between; min-width: 0; gap: 9px; padding: 8px 11px; }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
58
  .ms-stats > div + div { border-left: 1px solid var(--ms-line); }
59
+ .ms-stats span { color: var(--ms-muted); font: 580 .53rem var(--ms-mono); letter-spacing: .07em; text-transform: uppercase; }
60
+ .ms-stats strong { overflow: hidden; color: var(--ms-soft); font-size: .7rem; font-weight: 590; text-overflow: ellipsis; white-space: nowrap; }
61
+
62
+ .ms-transport { display: grid; grid-template-columns: minmax(360px,1fr) auto; align-items: center; gap: 10px; padding: 9px 10px; border: 1px solid var(--ms-line); background: #0e1213; }
63
+ .ms-transport-main, .ms-transport-options { display: flex; align-items: center; min-width: 0; gap: 7px; }
64
+ .ms-play, .ms-stop { display: grid; width: 33px; height: 33px; flex: none; border: 1px solid rgba(69,209,181,.34); border-radius: 50%; color: #effffb; background: var(--ms-accent-dark); cursor: pointer; place-items: center; }
65
+ .ms-stop { width: 28px; height: 28px; border-color: var(--ms-line); border-radius: 4px; color: var(--ms-soft); background: rgba(255,255,255,.025); }
66
+ .ms-play:disabled, .ms-stop:disabled { cursor: not-allowed; filter: grayscale(.5); opacity: .34; }
67
+ .ms-transport-main > span { min-width: 43px; color: var(--ms-muted); font: 580 .58rem var(--ms-mono); text-align: center; }
68
+ .ms-seek { min-width: 90px; flex: 1; accent-color: var(--ms-accent); }
69
+ .ms-source-mix { display: flex; align-items: center; gap: 4px; min-height: 30px; padding: 2px; border: 1px solid var(--ms-line); background: rgba(255,255,255,.018); }
70
+ .ms-source-mix button { height: 24px; padding: 0 6px; border: 0; border-radius: 2px; color: var(--ms-muted); background: transparent; cursor: pointer; font-size: .54rem; font-weight: 700; text-transform: uppercase; }
71
+ .ms-source-mix button[aria-pressed="true"] { color: #e9fff9; background: rgba(69,209,181,.18); }
72
+ .ms-source-mix input { width: 76px; accent-color: var(--ms-accent); }
73
+ .ms-stereo-toggle, .ms-volume { display: flex; align-items: center; gap: 5px; min-height: 30px; padding: 0 7px; border: 1px solid var(--ms-line); color: var(--ms-muted); background: rgba(255,255,255,.018); font-size: .56rem; white-space: nowrap; }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
74
  .ms-stereo-toggle { cursor: pointer; }
75
+ .ms-stereo-toggle input, .ms-volume input { accent-color: var(--ms-accent); }
76
+ .ms-stereo-toggle[data-active="true"] { border-color: rgba(69,209,181,.4); color: #d9fff7; background: rgba(69,209,181,.065); }
77
+ .ms-volume input { width: 58px; }
78
+ .ms-synth-state { max-width: 154px; color: var(--ms-faint); font: .52rem/1.25 var(--ms-mono); }
79
  .ms-synth-state[data-kind="loading"] { color: var(--ms-warning); }
80
  .ms-synth-state[data-kind="ready"] { color: var(--ms-success); }
81
  .ms-synth-state[data-kind="error"] { color: var(--ms-danger); }
82
 
83
+ .ms-studio-grid { display: grid; grid-template-columns: minmax(0,2.05fr) minmax(270px,.72fr); height: 520px; min-width: 0; gap: 9px; }
84
+ .ms-view-shell, .ms-mixer { min-width: 0; min-height: 0; border: 1px solid var(--ms-line); background: #0a0e0f; }
85
+ .ms-view-shell { display: flex; flex-direction: column; overflow: hidden; }
86
+ .ms-tabs { display: flex; align-items: center; min-height: 42px; gap: 18px; padding: 0 12px; border-bottom: 1px solid var(--ms-line); background: #111617; }
87
+ .ms-tabs button { align-self: stretch; padding: 0 1px; border: 0; border-bottom: 2px solid transparent; color: var(--ms-muted); background: transparent; cursor: pointer; font: 650 .58rem var(--ms-mono); letter-spacing: .05em; text-transform: uppercase; }
88
  .ms-tabs button[aria-selected="true"] { border-bottom-color: var(--ms-accent); color: var(--ms-text); }
89
+ .ms-tabs > span { overflow: hidden; margin-left: auto; color: var(--ms-faint); font: .54rem var(--ms-mono); text-overflow: ellipsis; white-space: nowrap; }
90
+ .ms-tabs label { display: flex; align-items: center; gap: 5px; color: var(--ms-faint); font-size: .54rem; }
91
+ .ms-tabs input { width: 60px; accent-color: var(--ms-accent); }
92
+ .ms-roll-view, .ms-score-view { min-height: 0; flex: 1; }
93
+ .ms-roll-view { padding: 9px; }
94
+ .ms-roll-view canvas { display: block; width: 100%; height: calc(100% - 23px); background: #090c0d; cursor: crosshair; }
95
+ .ms-roll-view p { margin: 6px 1px 0; color: var(--ms-faint); font-size: .54rem; text-align: right; }
96
+ .ms-score-view { overflow: auto; padding: 13px; background: #15191a; overscroll-behavior: contain; }
97
  .ms-score-empty { min-height: 100%; display: grid; align-content: center; justify-items: center; color: var(--ms-muted); text-align: center; }
98
+ .ms-score-empty span { color: var(--ms-warm); font-size: 36px; }
99
+ .ms-score-empty strong { margin-top: 8px; color: var(--ms-soft); font-size: .78rem; }
100
+ .ms-score-empty p { max-width: 410px; margin: 5px 0 0; font-size: .62rem; line-height: 1.5; }
101
+ .ms-score-paper { min-width: 720px; padding: 17px; background: #fffdf7; box-shadow: 0 10px 30px rgba(0,0,0,.3); }
102
  .ms-score-paper svg { display: block; width: 100%; height: auto; color: #111; }
103
 
104
+ .ms-mixer { display: flex; flex-direction: column; overflow: hidden; background: #101415; }
105
+ .ms-tracks-heading { display: flex; align-items: center; justify-content: space-between; flex: none; min-height: 54px; gap: 10px; padding: 8px 10px; border-bottom: 1px solid var(--ms-line); }
 
 
 
 
 
 
 
106
  .ms-tracks-heading strong, .ms-kicker { display: block; }
107
+ .ms-kicker { color: var(--ms-soft); font-size: .67rem; font-weight: 620; }
108
+ .ms-tracks-heading strong { margin-top: 3px; color: var(--ms-faint); font: .53rem var(--ms-mono); }
109
+ .ms-tracks-heading button { min-height: 27px; padding: 0 7px; font-size: .54rem; }
110
+ .ms-track-list { display: grid; align-content: start; min-height: 0; overflow-y: auto; scrollbar-color: rgba(255,255,255,.14) transparent; }
111
+ .ms-track-placeholder { padding: 18px 12px; color: var(--ms-faint); font-size: .63rem; line-height: 1.5; text-align: center; }
112
+ .ms-track-row { display: grid; grid-template-columns: 5px minmax(0,1fr) auto; align-items: center; min-width: 0; min-height: 76px; gap: 9px; padding: 10px; border-bottom: 1px solid var(--ms-line); background: rgba(255,255,255,.008); transition: opacity 130ms ease, background 130ms ease; }
113
+ .ms-track-row:hover { background: rgba(255,255,255,.025); }
114
+ .ms-track-row[data-inactive="true"] { opacity: .42; }
115
+ .ms-track-color { width: 5px; height: 38px; background: var(--track); box-shadow: 0 0 13px color-mix(in srgb,var(--track) 34%,transparent); }
116
  .ms-track-copy { min-width: 0; overflow: hidden; }
117
  .ms-track-copy strong, .ms-track-copy span { display: block; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
118
+ .ms-track-copy strong { color: var(--ms-soft); font-size: .68rem; font-weight: 600; }
119
+ .ms-track-copy span { margin-top: 4px; color: var(--ms-faint); font: .51rem var(--ms-mono); }
120
+ .ms-program-select { width: 100%; max-width: 142px; margin-top: 6px; padding: 3px 19px 3px 4px; border: 1px solid var(--ms-line); border-radius: 2px; background: #151a1b; color: var(--ms-soft); font-size: .52rem; }
121
+ .ms-track-controls { display: flex; gap: 3px; }
122
+ .ms-track-controls button, .ms-track-controls a { width: 25px; height: 25px; padding: 0; font: 700 .54rem var(--ms-mono); }
123
+ .ms-track-controls button[aria-pressed="true"] { border-color: color-mix(in srgb,var(--track) 56%,transparent); color: #fff; background: color-mix(in srgb,var(--track) 18%,transparent); }
124
+
125
+ .ms-notation-info { display: flex; align-items: center; gap: 12px; padding: 7px 10px; border-left: 2px solid var(--ms-warm); background: rgba(238,173,104,.025); }
126
+ .ms-notation-info > span { color: var(--ms-warm); font: 620 .54rem var(--ms-mono); letter-spacing: .08em; text-transform: uppercase; }
127
+ .ms-notation-info dl { display: flex; flex: 1; gap: 15px; margin: 0; }
128
+ .ms-notation-info dl div { display: flex; gap: 5px; }
129
+ .ms-notation-info dt, .ms-notation-info dd { margin: 0; font-size: .55rem; }
130
+ .ms-notation-info dt { color: var(--ms-faint); }
131
+ .ms-notation-info dd { color: var(--ms-soft); }
132
  .ms-announcer { position: absolute; overflow: hidden; width: 1px; height: 1px; clip: rect(0 0 0 0); }
133
 
134
+ @keyframes ms-blink { 0%,100% { opacity:.35; } 50% { opacity:1; } }
135
+
136
+ @container (max-width: 1030px) {
137
+ .ms-transport { grid-template-columns: 1fr; }
138
+ .ms-transport-options { padding-left: 68px; }
139
+ .ms-studio-grid { grid-template-columns: 1fr; height: auto; }
140
+ .ms-view-shell { height: 440px; }
141
+ .ms-mixer { max-height: 430px; }
142
+ .ms-track-list { grid-template-columns: repeat(2,minmax(0,1fr)); }
143
+ .ms-track-row:nth-child(odd) { border-right: 1px solid var(--ms-line); }
144
+ }
145
 
146
+ @container (max-width: 650px) {
147
  .ms-topbar { display: grid; }
148
  .ms-quick-downloads { width: 100%; }
149
  .ms-quick-downloads a { flex: 1; }
150
+ .ms-subtitle { align-items: flex-start; flex-direction: column; }
151
+ .ms-subtitle b::before { display: none; }
152
+ .ms-progress { grid-template-columns: 1fr; }
 
 
 
153
  .ms-stats { grid-template-columns: repeat(2,minmax(0,1fr)); }
154
  .ms-stats > div:nth-child(3) { border-top: 1px solid var(--ms-line); border-left: 0; }
155
  .ms-stats > div:nth-child(4) { border-top: 1px solid var(--ms-line); }
156
  .ms-transport-main { flex-wrap: wrap; }
157
+ .ms-seek { min-width: calc(100% - 132px); }
158
+ .ms-transport-options { padding-left: 0; flex-wrap: wrap; }
159
  .ms-source-mix { width: 100%; }
160
  .ms-source-mix input { flex: 1; }
161
+ .ms-synth-state { width: 100%; max-width: none; }
162
+ .ms-view-shell { height: 350px; }
163
  .ms-tabs > span { display: none; }
164
+ .ms-track-list { grid-template-columns: 1fr; }
165
+ .ms-track-row:nth-child(odd) { border-right: 0; }
166
  .ms-notation-info { align-items: flex-start; }
167
+ .ms-notation-info dl { display: grid; grid-template-columns: repeat(2,1fr); gap: 5px 12px; }
168
  }
169
 
170
  @media (prefers-reduced-motion: reduce) {
frontend/studio.html CHANGED
@@ -51,28 +51,38 @@
51
  </div>
52
  </div>
53
 
54
- <section class="ms-view-shell">
55
- <nav class="ms-tabs" aria-label="Visualization">
56
- <button type="button" data-tab="roll" aria-selected="true">Piano roll</button>
57
- <button type="button" data-tab="score" aria-selected="false">Score</button>
58
- <span data-field="pitch-range">Waiting for notes</span>
59
- <label>Zoom <input data-action="zoom" type="range" min="1" max="8" step="1" value="1"></label>
60
- </nav>
 
61
 
62
- <div data-view="roll" class="ms-roll-view">
63
- <canvas data-canvas="roll" height="410" aria-label="Color-coded multitrack piano roll"></canvas>
64
- <p>Click the piano roll to seek. Use zoom to inspect dense passages.</p>
65
- </div>
66
 
67
- <div data-view="score" class="ms-score-view" hidden>
68
- <div data-region="score-empty" class="ms-score-empty">
69
- <span aria-hidden="true">♩</span>
70
- <strong>No score generated yet</strong>
71
- <p>After transcription, open “Create an editable score” below and generate it manually.</p>
 
 
72
  </div>
73
- <div data-region="score" class="ms-score-paper" hidden></div>
74
- </div>
75
- </section>
 
 
 
 
 
 
 
76
 
77
  <div class="ms-notation-info" hidden>
78
  <span>Score</span>
@@ -84,11 +94,6 @@
84
  </dl>
85
  </div>
86
 
87
- <div class="ms-tracks-heading">
88
- <div><span class="ms-kicker">Instrument tracks</span><strong data-field="track-count">No tracks yet</strong></div>
89
- <button type="button" data-action="reset-mix">Reset mute &amp; solo</button>
90
- </div>
91
- <div data-region="tracks" class="ms-track-list" aria-label="Instrument tracks"></div>
92
  </section>
93
 
94
  <div class="ms-announcer" aria-live="polite"></div>
 
51
  </div>
52
  </div>
53
 
54
+ <div class="ms-studio-grid">
55
+ <section class="ms-view-shell">
56
+ <nav class="ms-tabs" aria-label="Visualization">
57
+ <button type="button" data-tab="roll" aria-selected="true">Piano roll</button>
58
+ <button type="button" data-tab="score" aria-selected="false">Score</button>
59
+ <span data-field="pitch-range">Waiting for notes</span>
60
+ <label>Zoom <input data-action="zoom" type="range" min="1" max="8" step="1" value="1"></label>
61
+ </nav>
62
 
63
+ <div data-view="roll" class="ms-roll-view">
64
+ <canvas data-canvas="roll" height="460" aria-label="Color-coded multitrack piano roll"></canvas>
65
+ <p>Click the piano roll to seek. Use zoom to inspect dense passages.</p>
66
+ </div>
67
 
68
+ <div data-view="score" class="ms-score-view" hidden>
69
+ <div data-region="score-empty" class="ms-score-empty">
70
+ <span aria-hidden="true">♩</span>
71
+ <strong>No score generated yet</strong>
72
+ <p>Use the visible Score controls above the studio to generate it manually.</p>
73
+ </div>
74
+ <div data-region="score" class="ms-score-paper" hidden></div>
75
  </div>
76
+ </section>
77
+
78
+ <aside class="ms-mixer" aria-label="Track mixer">
79
+ <div class="ms-tracks-heading">
80
+ <div><span class="ms-kicker">Track mixer</span><strong data-field="track-count">No tracks yet</strong></div>
81
+ <button type="button" data-action="reset-mix">Reset</button>
82
+ </div>
83
+ <div data-region="tracks" class="ms-track-list" aria-label="Instrument tracks"></div>
84
+ </aside>
85
+ </div>
86
 
87
  <div class="ms-notation-info" hidden>
88
  <span>Score</span>
 
94
  </dl>
95
  </div>
96
 
 
 
 
 
 
97
  </section>
98
 
99
  <div class="ms-announcer" aria-live="polite"></div>