Spaces:
Sleeping
Sleeping
ChatGPT commited on
Commit ·
8c10624
1
Parent(s): 0b5f0f0
feat: reduce default ui clutter
Browse files- README.md +3 -2
- docs/CLEAN_DEFAULT_UI.md +65 -0
- docs/FEATURES.md +12 -2
- docs/FIXED_WORKSTATION_UI.md +13 -0
- docs/PROGRESS.md +16 -0
- docs/REMAINING_WORK.md +1 -1
- docs/TASKS.md +12 -0
- docs/UI_REPLACEMENT.md +15 -0
- web/index.html +5 -5
- web/styles.css +280 -0
README.md
CHANGED
|
@@ -39,7 +39,7 @@ Implemented:
|
|
| 39 |
- event log,
|
| 40 |
- suggestions,
|
| 41 |
- undo stack.
|
| 42 |
-
-
|
| 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,
|
| 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 |
|
| 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 |
|
| 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
|
|
|
|
| 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"
|
| 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"
|
| 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"
|
| 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"
|
| 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"
|
| 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 |
+
}
|