ChatGPT commited on
Commit
8c10624
·
1 Parent(s): 0b5f0f0

feat: reduce default ui clutter

Browse files
README.md CHANGED
@@ -39,7 +39,7 @@ Implemented:
39
  - event log,
40
  - suggestions,
41
  - undo stack.
42
- - Fixed, non-scrolling workstation UI: explicit top-bar upload button, whole-app drag/drop overlay, left/right sidebars for tool panels, large center waveform/sample workspace, and bottom dock for review/edit tools.
43
  - Supervision UI:
44
  - selected-hit actions,
45
  - move hit to cluster,
@@ -74,6 +74,7 @@ See:
74
  - `docs/SUPERVISED_EXPORT_AND_FORCE_ONSET.md`
75
  - `docs/FIXED_WORKSTATION_UI.md`
76
  - `docs/REPRODUCED_AUDIO_AND_PARAMETERS.md`
 
77
 
78
  ## Run locally
79
 
@@ -156,7 +157,7 @@ curl http://127.0.0.1:7860/api/jobs
156
  | `sample_extractor.py` | Core DSP/sample extraction implementation |
157
  | `supervised_state.py` | Persistent semantic state, confidence, constraints, events, suggestions, force-onset, restore, undo |
158
  | `supervised_export.py` | Renders edited semantic state into supervised WAV/MIDI/reconstruction/ZIP artifacts |
159
- | `web/` | Custom no-build browser frontend with fixed non-scrolling workstation layout, explicit upload/whole-page drag-drop, source/stem/reproduced preview transport, common/advanced parameter separation, sidebars, bottom dock, sample-card grid, hidden-audio audition, add-onset mode, and edited export |
160
  | `scripts/benchmark_subprocesses.py` | Synthetic benchmark runner for stage timings |
161
  | `scripts/test_interactive_supervision.py` | Smoke test for supervised state endpoints |
162
  | `scripts/test_supervised_export_and_force_onset.py` | Smoke test for force-onset, restore, suggestion diffs, and edited exports |
 
39
  - event log,
40
  - suggestions,
41
  - undo stack.
42
+ - Clean, fixed, non-scrolling workstation UI: explicit top-bar upload button, whole-app drag/drop overlay, collapsed left/right/bottom tool panels by default, large center waveform/sample workspace, and bottom dock for review/edit tools.
43
  - Supervision UI:
44
  - selected-hit actions,
45
  - move hit to cluster,
 
74
  - `docs/SUPERVISED_EXPORT_AND_FORCE_ONSET.md`
75
  - `docs/FIXED_WORKSTATION_UI.md`
76
  - `docs/REPRODUCED_AUDIO_AND_PARAMETERS.md`
77
+ - `docs/CLEAN_DEFAULT_UI.md`
78
 
79
  ## Run locally
80
 
 
157
  | `sample_extractor.py` | Core DSP/sample extraction implementation |
158
  | `supervised_state.py` | Persistent semantic state, confidence, constraints, events, suggestions, force-onset, restore, undo |
159
  | `supervised_export.py` | Renders edited semantic state into supervised WAV/MIDI/reconstruction/ZIP artifacts |
160
+ | `web/` | Custom no-build browser frontend with clean fixed non-scrolling workstation layout, explicit upload/whole-page drag-drop, source/stem/reproduced preview transport, common/advanced parameter separation, collapsed sidebars/bottom dock, sample-card grid, hidden-audio audition, add-onset mode, and edited export |
161
  | `scripts/benchmark_subprocesses.py` | Synthetic benchmark runner for stage timings |
162
  | `scripts/test_interactive_supervision.py` | Smoke test for supervised state endpoints |
163
  | `scripts/test_supervised_export_and_force_onset.py` | Smoke test for force-onset, restore, suggestion diffs, and edited exports |
docs/CLEAN_DEFAULT_UI.md ADDED
@@ -0,0 +1,65 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Clean default UI pass
2
+
3
+ Last updated: 2026-05-12
4
+
5
+ ## Goal
6
+
7
+ The application had become functionally rich but visually too dense. The default view should communicate one simple loop:
8
+
9
+ ```text
10
+ upload audio → adjust 2-3 controls → extract → audition waveform and sample cards
11
+ ```
12
+
13
+ Everything else should remain available, but it should not compete with that loop until the user opens the relevant panel.
14
+
15
+ ## Implemented changes
16
+
17
+ | Area | Change |
18
+ |---|---|
19
+ | Default panels | Left-sidebar source, selection, pipeline, history, right-sidebar exports, and bottom review/edit are collapsed by default. |
20
+ | Bottom dock | Reduced to a compact tab bar until a tool is opened; opening a bottom tool expands only the bottom dock. |
21
+ | Top bar | Shorter top bar, smaller logo mark, compact upload control, compact backend status, smaller primary action. |
22
+ | Main workspace | Waveform and sample cards get more of the viewport by shrinking sidebars, gaps, padding, and the collapsed bottom dock. |
23
+ | Common controls | Helper paragraphs, long field hints, and range captions are hidden in the default common-control card. |
24
+ | Advanced controls | Advanced DSP/model/cache parameters remain available but are collapsed and visually quieter. |
25
+ | Pipeline/logs/history | Still present, but no longer visible unless the user opens the relevant left-sidebar panel. |
26
+ | Review/edit tools | Still present, but moved behind the collapsed bottom dock so normal extraction is not visually crowded. |
27
+ | Local scrolling | The page remains non-scrolling; only panels and grids scroll internally when needed. |
28
+
29
+ ## Default visible surface
30
+
31
+ The default screen now shows only:
32
+
33
+ 1. app identity;
34
+ 2. upload control;
35
+ 3. backend status;
36
+ 4. primary extract button;
37
+ 5. collapsed utility panels;
38
+ 6. waveform transport;
39
+ 7. sample-card grid;
40
+ 8. common extraction controls.
41
+
42
+ This keeps the advanced workstation architecture without making the application feel like a debug console.
43
+
44
+ ## Preserved behavior
45
+
46
+ No backend API or DOM id was removed. Existing functionality is still wired:
47
+
48
+ - whole-app drag/drop upload;
49
+ - extraction jobs and SSE progress;
50
+ - source/stem/reproduced preview transport;
51
+ - waveform onset selection and force-onset mode;
52
+ - sample/hit audition;
53
+ - run history;
54
+ - supervised editing;
55
+ - edited export;
56
+ - raw tables;
57
+ - advanced parameter tuning.
58
+
59
+ ## Remaining UI work
60
+
61
+ 1. Add a single keyboard shortcut/help overlay so hidden tools remain discoverable.
62
+ 2. Add browser screenshot regression tests for the clean default layout.
63
+ 3. Consider a true icon rail if the left collapsed panel summaries still feel too wide after real browser review.
64
+ 4. Add a focused empty state inside the waveform/sample area before upload.
65
+ 5. Migrate the frontend to TypeScript/Vite once the UI stops changing rapidly.
docs/FEATURES.md CHANGED
@@ -13,9 +13,9 @@ Turn an input audio file into a practical drum sample pack: detected hits, group
13
  | UI | Custom browser frontend | Implemented | `web/index.html`, `web/styles.css`, `web/app.js`; no Gradio dependency in active app. |
14
  | UI | Explicit upload button | Implemented | Top bar contains a visible `Upload audio` control. |
15
  | UI | Whole-app drag/drop audio upload | Implemented | Dropping files anywhere on the app selects the file and shows a drop overlay during drag. |
16
- | UI | Fixed non-scrolling workstation layout | Implemented | Body is viewport-locked; tools live in left/right sidebars and a bottom dock; long content scrolls inside panels only. |
17
  | UI | Minimal custom transport | Implemented | One play/time/progress row can audition Source, Stem, or Reproduced previews; completed runs default to Reproduced. |
18
- | UI | Common vs advanced parameters | Implemented | Common controls show stem, sensitivity, group count, and two presets; advanced model/DSP/export controls are grouped by pipeline stage. |
19
  | UI | Streaming progress | Implemented | Uses `EventSource` over `GET /api/jobs/{id}/events`, with polling fallback. |
20
  | UI | Waveform/onset overview | Implemented | Canvas envelope plus clickable onset markers from `manifest.json`. |
21
  | UI | Result downloads | Implemented | ZIP, MIDI, stem WAV, reconstruction WAV, individual sample WAVs, and per-hit review WAVs. |
@@ -102,3 +102,13 @@ Status: implemented.
102
  - Right-side core-control card now exposes only stem, sensitivity, cluster count, and export samples in the default view.
103
  - Fast modes, DSP/model parameters, pipeline logs, history, supervision, and raw tables are hidden behind `Advanced` / `Review & edit`.
104
  - Extracted samples render as auditionable cards with waveform thumbnails and minimal labels.
 
 
 
 
 
 
 
 
 
 
 
13
  | UI | Custom browser frontend | Implemented | `web/index.html`, `web/styles.css`, `web/app.js`; no Gradio dependency in active app. |
14
  | UI | Explicit upload button | Implemented | Top bar contains a visible `Upload audio` control. |
15
  | UI | Whole-app drag/drop audio upload | Implemented | Dropping files anywhere on the app selects the file and shows a drop overlay during drag. |
16
+ | UI | Clean fixed non-scrolling workstation layout | Implemented | Body is viewport-locked; primary workflow stays visible; secondary tools live in collapsed left/right sidebars and a compact bottom dock; long content scrolls inside panels only. |
17
  | UI | Minimal custom transport | Implemented | One play/time/progress row can audition Source, Stem, or Reproduced previews; completed runs default to Reproduced. |
18
+ | UI | Common vs advanced parameters | Implemented | Default view shows stem, sensitivity, group count, and two presets; helper copy and advanced model/DSP/export controls stay hidden until the user opens the relevant panel. |
19
  | UI | Streaming progress | Implemented | Uses `EventSource` over `GET /api/jobs/{id}/events`, with polling fallback. |
20
  | UI | Waveform/onset overview | Implemented | Canvas envelope plus clickable onset markers from `manifest.json`. |
21
  | UI | Result downloads | Implemented | ZIP, MIDI, stem WAV, reconstruction WAV, individual sample WAVs, and per-hit review WAVs. |
 
102
  - Right-side core-control card now exposes only stem, sensitivity, cluster count, and export samples in the default view.
103
  - Fast modes, DSP/model parameters, pipeline logs, history, supervision, and raw tables are hidden behind `Advanced` / `Review & edit`.
104
  - Extracted samples render as auditionable cards with waveform thumbnails and minimal labels.
105
+
106
+
107
+ ## Clean default UI status
108
+
109
+ Status: implemented.
110
+
111
+ - Secondary panels are collapsed by default so the first screen is no longer dominated by logs, history, exports, or review/edit tools.
112
+ - The bottom dock stays as a small tab bar until a tool is opened.
113
+ - The top bar, sidebars, common controls, transport, and sample cards were tightened to give the waveform/sample workspace more room.
114
+ - No feature was removed; advanced and supervised tools remain available through expandable panels.
docs/FIXED_WORKSTATION_UI.md CHANGED
@@ -53,3 +53,16 @@ Static checks added/performed for this pass:
53
  - The right sidebar now separates the normal workflow from advanced tuning.
54
  - Common controls are limited to stem choice, hit sensitivity, sample group count, and two presets.
55
  - Advanced parameters are grouped into stem separation, hit detection, grouping, export/cache sections.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
53
  - The right sidebar now separates the normal workflow from advanced tuning.
54
  - Common controls are limited to stem choice, hit sensitivity, sample group count, and two presets.
55
  - Advanced parameters are grouped into stem separation, hit detection, grouping, export/cache sections.
56
+
57
+ ## Clean default refinement
58
+
59
+ The fixed workstation layout now defaults to a much quieter state:
60
+
61
+ - left-sidebar utility panels are closed initially;
62
+ - the right-sidebar exports panel is closed initially;
63
+ - the bottom dock is only a compact tab bar until opened;
64
+ - the common-control card remains open because it is part of the core extraction loop;
65
+ - helper copy is hidden from the default common-control view;
66
+ - the waveform and sample grid receive more viewport space.
67
+
68
+ The layout still does not use document-level scrolling. Opening a panel expands only that panel or dock and uses local scrolling as needed.
docs/PROGRESS.md CHANGED
@@ -283,3 +283,19 @@ Completed in this pass:
283
  Outcome:
284
 
285
  The app is easier to understand for normal use: the main right-side controls are now only the few controls users are likely to touch repeatedly, while lower-level DSP/model controls stay available but grouped by stage. Reproduced audio is now useful for musical judgment because separated-stem runs are previewed inside the rest of the mix rather than as an isolated sample-triggered stem only.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
283
  Outcome:
284
 
285
  The app is easier to understand for normal use: the main right-side controls are now only the few controls users are likely to touch repeatedly, while lower-level DSP/model controls stay available but grouped by stage. Reproduced audio is now useful for musical judgment because separated-stem runs are previewed inside the rest of the mix rather than as an isolated sample-triggered stem only.
286
+
287
+ ## Pass 10: clean default UI
288
+
289
+ Completed in this pass:
290
+
291
+ 1. Collapsed secondary panels by default: source hints, selection context, pipeline, run history, exports, and review/edit no longer open on initial load.
292
+ 2. Reduced the bottom dock to a compact tab bar unless a bottom tool is explicitly opened.
293
+ 3. Shortened the top bar and reduced logo/upload/backend/action button visual weight.
294
+ 4. Shrunk sidebars, panel padding, gaps, transport height, and sample-card dimensions to give the waveform and samples more room.
295
+ 5. Hid common-control helper paragraphs and long field hints from the default extraction flow.
296
+ 6. Preserved advanced controls, logs, history, supervision, tables, and edited export behind existing expandable panels.
297
+ 7. Added `docs/CLEAN_DEFAULT_UI.md` to document the clean-default layout contract.
298
+
299
+ Outcome:
300
+
301
+ The UI remains a fixed workstation with sidebars and a bottom dock, but the first screen is now much less cluttered. The visible default workflow is upload, extract, listen, inspect waveform, and audition sample cards; debug/review/power-user tools are available only when opened.
docs/REMAINING_WORK.md CHANGED
@@ -77,4 +77,4 @@ Highest-priority remaining work now:
77
 
78
  ## UI status note
79
 
80
- The default UI is now a fixed, non-scrolling workstation layout with left/right sidebars, a bottom dock, explicit upload, and whole-app drag/drop. Remaining UI work is interaction depth and engineering hardening: browser screenshot regression tests, TypeScript/Vite migration, edited-vs-original comparison, waveform zoom/pan, and richer cluster merge/split/relabel workflows.
 
77
 
78
  ## UI status note
79
 
80
+ The default UI is now a cleaner fixed, non-scrolling workstation layout with collapsed side/bottom utility panels, explicit upload, and whole-app drag/drop. Remaining UI work is interaction depth and engineering hardening: browser screenshot regression tests, TypeScript/Vite migration, edited-vs-original comparison, waveform zoom/pan, a shortcut/help overlay for discoverability, and richer cluster merge/split/relabel workflows.
docs/TASKS.md CHANGED
@@ -127,3 +127,15 @@ Remaining follow-up tasks:
127
  - [ ] Add source-vs-reproduced waveform/error comparison.
128
  - [ ] Add LUFS loudness matching for long previews.
129
  - [ ] Optionally cache explicit Demucs non-target stem sums instead of residual subtraction.
 
 
 
 
 
 
 
 
 
 
 
 
 
127
  - [ ] Add source-vs-reproduced waveform/error comparison.
128
  - [ ] Add LUFS loudness matching for long previews.
129
  - [ ] Optionally cache explicit Demucs non-target stem sums instead of residual subtraction.
130
+
131
+ ## Pass 10 tasks: clean default UI
132
+
133
+ | Task | Status | Notes |
134
+ |---|---:|---|
135
+ | Collapse secondary panels by default | Done | Source, selection, pipeline, history, exports, and review/edit no longer open on first load. |
136
+ | Make bottom dock compact by default | Done | Bottom dock is a small tab bar until `Review & edit` or `Tables` is opened. |
137
+ | Reduce top-bar visual weight | Done | Smaller brand mark, shorter upload control, compact backend status, smaller primary button. |
138
+ | Give center workspace more room | Done | Reduced sidebars/gaps/padding and collapsed bottom dock. |
139
+ | Hide long helper copy from common controls | Done | Common-control hint text is hidden; advanced descriptions remain in expandable sections. |
140
+ | Preserve no-scroll workstation behavior | Done | Body remains viewport-locked; panel-local scrolling remains. |
141
+ | Preserve all current features | Done | Existing DOM ids and API paths are preserved; changes are layout/CSS/default-open-state only. |
docs/UI_REPLACEMENT.md CHANGED
@@ -145,3 +145,18 @@ This pass made the audio preview and control model more explicit:
145
  - Advanced parameters are grouped by pipeline stage: stem separation, hit detection, grouping, export/cache.
146
 
147
  See `docs/REPRODUCED_AUDIO_AND_PARAMETERS.md`.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
145
  - Advanced parameters are grouped by pipeline stage: stem separation, hit detection, grouping, export/cache.
146
 
147
  See `docs/REPRODUCED_AUDIO_AND_PARAMETERS.md`.
148
+
149
+ ## Pass 10 clean-default refinement
150
+
151
+ This pass responds to the UI being too cluttered after the workstation and reproduced-audio additions.
152
+
153
+ Changes:
154
+
155
+ - all non-essential side/bottom panels are collapsed by default;
156
+ - the bottom dock is compact until a review/table tool is opened;
157
+ - top-bar controls are shorter and visually lighter;
158
+ - common controls hide explanatory copy and show only the core knobs;
159
+ - pipeline logs, run history, exports, supervision, and raw tables remain present but opt-in;
160
+ - the no-scroll workstation constraint is preserved.
161
+
162
+ See `docs/CLEAN_DEFAULT_UI.md`.
web/index.html CHANGED
@@ -44,7 +44,7 @@
44
 
45
  <main class="workstation">
46
  <aside class="sidebar left-sidebar" aria-label="Left tool sidebar">
47
- <details class="tool-panel source-panel" open>
48
  <summary><span>Source</span><small>Upload and status</small></summary>
49
  <div class="drop-hint-card">
50
  <strong>Upload button is in the top bar.</strong>
@@ -56,7 +56,7 @@
56
  </div>
57
  </details>
58
 
59
- <details class="tool-panel selection-panel" open>
60
  <summary><span>Selection</span><small>Audition context</small></summary>
61
  <article class="review-card">
62
  <strong>Selected hit</strong>
@@ -68,7 +68,7 @@
68
  </article>
69
  </details>
70
 
71
- <details class="tool-panel progress-panel" open>
72
  <summary><span>Pipeline</span><small>Stage timings and logs</small></summary>
73
  <div id="stageList" class="stage-list"></div>
74
  <pre id="logs" class="logs" aria-live="polite"></pre>
@@ -146,7 +146,7 @@
146
  </div>
147
  </details>
148
 
149
- <details class="tool-panel downloads-panel" open>
150
  <summary><span>Exports</span><small>Current artifacts</small></summary>
151
  <div id="downloads" class="downloads compact-downloads"></div>
152
  <div id="editedDownloads" class="downloads edited-downloads"></div>
@@ -252,7 +252,7 @@
252
  </main>
253
 
254
  <footer class="bottom-dock" aria-label="Bottom tool bar">
255
- <details class="bottom-tool supervision-panel" open>
256
  <summary><span>Review & edit</span><small>Move, suppress, restore, force-onset, explain, and export edited packs</small></summary>
257
  <div class="bottom-tool-content">
258
  <div class="supervision-header">
 
44
 
45
  <main class="workstation">
46
  <aside class="sidebar left-sidebar" aria-label="Left tool sidebar">
47
+ <details class="tool-panel source-panel">
48
  <summary><span>Source</span><small>Upload and status</small></summary>
49
  <div class="drop-hint-card">
50
  <strong>Upload button is in the top bar.</strong>
 
56
  </div>
57
  </details>
58
 
59
+ <details class="tool-panel selection-panel">
60
  <summary><span>Selection</span><small>Audition context</small></summary>
61
  <article class="review-card">
62
  <strong>Selected hit</strong>
 
68
  </article>
69
  </details>
70
 
71
+ <details class="tool-panel progress-panel">
72
  <summary><span>Pipeline</span><small>Stage timings and logs</small></summary>
73
  <div id="stageList" class="stage-list"></div>
74
  <pre id="logs" class="logs" aria-live="polite"></pre>
 
146
  </div>
147
  </details>
148
 
149
+ <details class="tool-panel downloads-panel">
150
  <summary><span>Exports</span><small>Current artifacts</small></summary>
151
  <div id="downloads" class="downloads compact-downloads"></div>
152
  <div id="editedDownloads" class="downloads edited-downloads"></div>
 
252
  </main>
253
 
254
  <footer class="bottom-dock" aria-label="Bottom tool bar">
255
+ <details class="bottom-tool supervision-panel">
256
  <summary><span>Review & edit</span><small>Move, suppress, restore, force-onset, explain, and export edited packs</small></summary>
257
  <div class="bottom-tool-content">
258
  <div class="supervision-header">
web/styles.css CHANGED
@@ -929,3 +929,283 @@ tr:last-child td { border-bottom: 0; }
929
  justify-content: center;
930
  }
931
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
929
  justify-content: center;
930
  }
931
  }
932
+
933
+ /* Clean default UI pass: keep the app usable at a glance and hide workstation depth until requested. */
934
+ :root {
935
+ --topbar-h: 58px;
936
+ --bottom-h: 44px;
937
+ --radius-xl: 14px;
938
+ --radius-lg: 10px;
939
+ --shadow: 0 8px 24px rgba(18, 21, 30, .045);
940
+ }
941
+
942
+ .shell {
943
+ grid-template-rows: var(--topbar-h) minmax(0, 1fr) var(--bottom-h);
944
+ gap: 8px;
945
+ padding: 8px;
946
+ }
947
+ .shell:has(.bottom-tool[open]) {
948
+ grid-template-rows: var(--topbar-h) minmax(0, 1fr) minmax(230px, 33vh);
949
+ }
950
+
951
+ .topbar {
952
+ grid-template-columns: minmax(210px, 1fr) minmax(260px, 420px) auto;
953
+ gap: 10px;
954
+ padding: 0;
955
+ }
956
+ .app-title { gap: 10px; }
957
+ .brand-mark {
958
+ width: 34px;
959
+ height: 34px;
960
+ border-radius: 10px;
961
+ box-shadow: none;
962
+ }
963
+ .brand-mark i { width: 3px; }
964
+ .brand-mark i:nth-child(1) { height: 10px; }
965
+ .brand-mark i:nth-child(2) { height: 18px; }
966
+ .brand-mark i:nth-child(3) { height: 25px; }
967
+ .brand-mark i:nth-child(4) { height: 15px; }
968
+ .brand-mark i:nth-child(5) { height: 8px; }
969
+ .app-title strong { font-size: 16px; }
970
+ .app-title small { display: none; }
971
+
972
+ .upload-chip {
973
+ height: 44px;
974
+ gap: 9px;
975
+ padding: 5px 10px 5px 5px;
976
+ border-radius: 12px;
977
+ box-shadow: none;
978
+ }
979
+ .upload-button-face {
980
+ height: 32px;
981
+ padding: 0 12px;
982
+ border-radius: 9px;
983
+ font-size: 12px;
984
+ }
985
+ .upload-copy strong { font-size: 12px; }
986
+ .upload-copy small { display: none; }
987
+ .backend-pill { max-width: 88px; overflow: hidden; }
988
+ .backend-pill strong { max-width: 68px; overflow: hidden; text-overflow: ellipsis; }
989
+ .primary-button {
990
+ min-width: 156px;
991
+ padding: 12px 16px;
992
+ border-radius: 11px;
993
+ font-size: 14px;
994
+ box-shadow: 0 10px 26px rgba(85, 43, 216, .18);
995
+ }
996
+ .primary-button span { margin-right: 5px; }
997
+
998
+ .workstation {
999
+ grid-template-columns: 214px minmax(0, 1fr) 292px;
1000
+ gap: 8px;
1001
+ }
1002
+ .sidebar { gap: 6px; overflow: hidden; }
1003
+ .sidebar:hover { overflow: auto; }
1004
+ .center-workspace {
1005
+ grid-template-rows: minmax(280px, 1fr) minmax(142px, 190px);
1006
+ gap: 8px;
1007
+ }
1008
+ .panel,
1009
+ .tool-panel,
1010
+ .bottom-tool {
1011
+ border-color: rgba(226, 227, 232, .78);
1012
+ box-shadow: none;
1013
+ background: rgba(255, 255, 255, .94);
1014
+ }
1015
+ .tool-panel {
1016
+ padding: 9px 10px;
1017
+ border-radius: 12px;
1018
+ }
1019
+ .tool-panel[open] { padding-bottom: 10px; }
1020
+ .tool-panel > summary,
1021
+ .bottom-tool > summary {
1022
+ min-height: 28px;
1023
+ gap: 0;
1024
+ }
1025
+ .tool-panel > summary span,
1026
+ .bottom-tool > summary span {
1027
+ font-size: 12px;
1028
+ letter-spacing: -.01em;
1029
+ }
1030
+ .tool-panel > summary small,
1031
+ .bottom-tool > summary small {
1032
+ font-size: 10px;
1033
+ }
1034
+ .left-sidebar .tool-panel > summary small,
1035
+ .control-card .panel-help,
1036
+ .control-card .field-hint,
1037
+ .control-card .range-caption,
1038
+ .section-heading small,
1039
+ .drop-hint-card,
1040
+ .review-card strong {
1041
+ display: none;
1042
+ }
1043
+ .tool-panel > summary::after,
1044
+ .bottom-tool > summary::after {
1045
+ right: 12px;
1046
+ font-size: 12px;
1047
+ }
1048
+
1049
+ .drop-hint-card,
1050
+ .job-status-card,
1051
+ .review-card {
1052
+ margin-top: 8px;
1053
+ padding: 9px;
1054
+ border-radius: 10px;
1055
+ }
1056
+ .review-card span,
1057
+ .job-status-card small {
1058
+ font-size: 11px;
1059
+ line-height: 1.3;
1060
+ }
1061
+ .stage-list { gap: 5px; margin-top: 8px; }
1062
+ .stage {
1063
+ grid-template-columns: 10px minmax(0, 1fr) auto;
1064
+ gap: 6px;
1065
+ padding: 7px;
1066
+ border-radius: 9px;
1067
+ }
1068
+ .stage small { display: none; }
1069
+ .logs { display: none; }
1070
+ .history-list, .compact-list { gap: 6px; }
1071
+ .history-row, .compact-row, .suggestion-row, .log-row {
1072
+ padding: 8px;
1073
+ border-radius: 10px;
1074
+ }
1075
+
1076
+ .wave-card {
1077
+ grid-template-rows: minmax(0, 1fr) 54px;
1078
+ border-radius: 16px;
1079
+ }
1080
+ .transport-row {
1081
+ grid-template-columns: 38px 76px minmax(0, 1fr) auto;
1082
+ gap: 10px;
1083
+ padding: 8px 14px 10px;
1084
+ }
1085
+ .round-play {
1086
+ width: 38px;
1087
+ height: 38px;
1088
+ font-size: 13px;
1089
+ }
1090
+ .transport-time { font-size: 12px; }
1091
+ .preview-tabs {
1092
+ padding: 3px;
1093
+ gap: 2px;
1094
+ }
1095
+ .preview-tab {
1096
+ padding: 6px 8px;
1097
+ font-size: 10px;
1098
+ }
1099
+
1100
+ .samples-section {
1101
+ padding: 10px;
1102
+ border-radius: 14px;
1103
+ }
1104
+ .section-heading { margin-bottom: 8px; }
1105
+ h2 { font-size: 14px; }
1106
+ .sample-grid {
1107
+ grid-template-columns: repeat(auto-fill, minmax(116px, 1fr));
1108
+ grid-auto-rows: 124px;
1109
+ gap: 8px;
1110
+ }
1111
+ .sample-card {
1112
+ grid-template-rows: minmax(0, 1fr) 42px;
1113
+ border-top-width: 3px;
1114
+ border-radius: 9px;
1115
+ box-shadow: none;
1116
+ }
1117
+ .sample-card-footer {
1118
+ grid-template-columns: 26px minmax(0, 1fr);
1119
+ gap: 7px;
1120
+ padding: 7px;
1121
+ }
1122
+ .play-dot {
1123
+ width: 25px;
1124
+ height: 25px;
1125
+ font-size: 10px;
1126
+ }
1127
+ .sample-name { font-size: 11px; }
1128
+
1129
+ .control-group { margin-top: 9px; }
1130
+ label { font-size: 12px; }
1131
+ input, select {
1132
+ margin-top: 6px;
1133
+ padding: 8px 9px;
1134
+ border-radius: 9px;
1135
+ font-size: 12px;
1136
+ }
1137
+ input[type="range"] { height: 4px; }
1138
+ input[type="range"]::-webkit-slider-thumb { width: 16px; height: 16px; }
1139
+ input[type="range"]::-moz-range-thumb { width: 16px; height: 16px; }
1140
+ .stepper { grid-template-columns: 34px minmax(0, 1fr) 34px; gap: 6px; }
1141
+ .step-button { height: 32px; margin-top: 6px; }
1142
+ .ghost-button,
1143
+ .secondary-button,
1144
+ .export-button {
1145
+ padding: 7px 9px;
1146
+ border-radius: 9px;
1147
+ font-size: 11px;
1148
+ }
1149
+ .preset-row { gap: 6px; margin-top: 8px; }
1150
+ .downloads { gap: 6px; margin-top: 8px; }
1151
+ .downloads a, .table-wrap a { padding: 6px 8px; font-size: 10px; }
1152
+ .advanced-section { margin-top: 10px; padding-top: 9px; }
1153
+ .advanced-section h4 { font-size: 11px; margin-bottom: 6px; }
1154
+ .control-grid { gap: 7px; margin-top: 7px; }
1155
+
1156
+ .bottom-dock {
1157
+ grid-template-columns: repeat(2, minmax(0, 1fr));
1158
+ gap: 8px;
1159
+ }
1160
+ .bottom-tool {
1161
+ padding: 8px 10px;
1162
+ border-radius: 12px;
1163
+ }
1164
+ .bottom-tool[open] {
1165
+ padding: 10px;
1166
+ }
1167
+ .bottom-tool:not([open]) {
1168
+ display: grid;
1169
+ align-items: center;
1170
+ }
1171
+ .bottom-tool:not([open]) > summary small { display: none; }
1172
+ .bottom-tool-content { padding-top: 8px; }
1173
+ .supervision-header p,
1174
+ .supervision-header h3,
1175
+ .result-columns h3,
1176
+ .subtle {
1177
+ display: none;
1178
+ }
1179
+ .supervision-header { justify-content: end; }
1180
+ .state-summary { margin: 7px 0; gap: 5px; }
1181
+ .state-summary span { padding: 5px 8px; font-size: 10px; }
1182
+ .supervision-tools {
1183
+ grid-template-columns: minmax(160px, 1fr) repeat(4, auto);
1184
+ gap: 6px;
1185
+ margin-top: 8px;
1186
+ }
1187
+ .supervision-grid {
1188
+ grid-template-columns: repeat(4, minmax(160px, 1fr));
1189
+ gap: 8px;
1190
+ margin-top: 8px;
1191
+ }
1192
+ .supervision-grid article {
1193
+ min-height: 96px;
1194
+ padding: 8px;
1195
+ border-radius: 10px;
1196
+ }
1197
+ .supervision-grid h4 { font-size: 11px; margin-bottom: 6px; }
1198
+ .explanation { margin-top: 8px; max-height: 110px; }
1199
+
1200
+ @media (max-width: 1180px) {
1201
+ :root { --bottom-h: 44px; }
1202
+ .workstation { grid-template-columns: 180px minmax(0, 1fr) 270px; }
1203
+ .shell:has(.bottom-tool[open]) { grid-template-rows: var(--topbar-h) minmax(0, 1fr) minmax(230px, 36vh); }
1204
+ }
1205
+ @media (max-width: 900px) {
1206
+ :root { --topbar-h: 118px; --bottom-h: 44px; }
1207
+ .workstation { grid-template-columns: 1fr; grid-template-rows: 0 minmax(0, 1fr) 0; }
1208
+ .topbar { grid-template-columns: 1fr; }
1209
+ .left-sidebar, .right-sidebar { display: none; }
1210
+ .shell:has(.bottom-tool[open]) { grid-template-rows: var(--topbar-h) minmax(0, 1fr) minmax(240px, 38vh); }
1211
+ }