mirror of
https://github.com/storytold/soundcraft.git
synced 2026-10-25 19:16:49 -06:00
* Add a selectable Light theme * Apply the active theme to the menu bar * Use the system theme by default * Expose Appearance in the Setup menu * Add Light theme screenshot * Remove the Light theme screenshot Repo policy keeps large binary assets out of the tree, and the PNG had no ATTRIBUTION row. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Appearance: ui.theme command, Dark default, non-blocking system lookup - ThemeMode derives Default with Dark as the default (fixes clippy's derivable_impls); System and Light are opt-in. LIGHT_THEME starts false. - New UI command `ui.theme {"mode": "system|light|dark"}` (label "Appearance") in UI_COMMANDS; with no mode it reports the current one. The UI Customization combo box dispatches it instead of writing state. - The choice lives in UiState.theme, so it persists with the existing UI prefs (ui.json) and is exposed through ui.set / ui.inspect. Restoring a window configuration keeps the current theme. - dark_light::detect() is only called in System mode, on a background thread (an AtomicU8 holds the answer; dark until it arrives, then a repaint). On the web it is the synchronous matchMedia lookup. - theme::apply runs only when the effective palette changes, not every frame. - window.ui_customization keeps its catalog path (Window > UI Customization) so parity is unchanged; Setup > Appearance still opens it. The combo row is labelled "Theme" so it no longer repeats the title. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Light theme: move hard-coded colours to theme tokens The Light palette left dark islands and unreadable text where colours were Color32 literals. New tokens (Dark values are the old literals, so the Dark theme renders pixel-identical to main): - menu bar; toolbar group outline; edit-mode cells (no more dark block around Shuffle/Spot/Slip/Grid); counter panel outlines, dividers and off toggles; Smart-tool bracket - selected rows in the Tracks/Groups/Clips lists, track-visible dot, selected Edit track header, selected Mix strip - marker names, alternate-playlist lanes, Universe background/outline, Big Counter background - meter background and clip lamp, pan knob body/ring/pointer, Mix insert and send slots, Mix section captions In Light, clip bodies are a paler tint and waveforms a deep shade of the clip colour instead of black. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Light theme: instrument slot and plugin window text use the current tokens The instrument picker (#23) landed with Tokens::DARK literals. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: t <t@t> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: Brandon Thomas <echelon@gmail.com>
71 lines
1.8 KiB
TOML
71 lines
1.8 KiB
TOML
[workspace]
|
|
resolver = "3"
|
|
members = ["crates/*", "apps/*", "xtask"]
|
|
default-members = ["crates/*", "apps/*", "xtask"]
|
|
|
|
[workspace.package]
|
|
version = "0.3.0"
|
|
edition = "2024"
|
|
license = "MIT OR Apache-2.0"
|
|
rust-version = "1.90"
|
|
repository = "https://github.com/storytold/soundcraft"
|
|
|
|
[workspace.dependencies]
|
|
# internal
|
|
soundcraft-time = { path = "crates/time" }
|
|
soundcraft-audio-io = { path = "crates/audio-io" }
|
|
soundcraft-midi = { path = "crates/midi" }
|
|
soundcraft-video = { path = "crates/video" }
|
|
soundcraft-dsp = { path = "crates/dsp" }
|
|
soundcraft-clap-host = { path = "crates/clap-host" }
|
|
soundcraft-vst3-host = { path = "crates/vst3-host" }
|
|
soundcraft-au-host = { path = "crates/au-host" }
|
|
soundcraft-model = { path = "crates/model" }
|
|
soundcraft-mix = { path = "crates/mix" }
|
|
soundcraft-engine = { path = "crates/engine" }
|
|
soundcraft-playback = { path = "crates/playback" }
|
|
soundcraft-automation = { path = "crates/automation" }
|
|
soundcraft-ui-egui = { path = "crates/ui-egui" }
|
|
|
|
# foundation
|
|
thiserror = "2"
|
|
serde = { version = "1", features = ["derive", "rc"] }
|
|
serde_json = { version = "1", features = ["float_roundtrip"] }
|
|
log = "0.4"
|
|
rayon = "1"
|
|
proptest = "1"
|
|
|
|
# audio
|
|
symphonia = { version = "0.5", default-features = false, features = ["mp3", "flac", "vorbis", "ogg", "wav", "pcm", "aiff", "isomp4", "aac", "alac", "adpcm", "caf", "mkv"] }
|
|
rustfft = "6"
|
|
cpal = "0.16"
|
|
|
|
# ui
|
|
egui = "0.36"
|
|
eframe = { version = "0.36", default-features = false }
|
|
egui_kittest = "0.36"
|
|
dark-light = "3"
|
|
rfd = "0.17"
|
|
image = { version = "0.25", default-features = false, features = ["png"] }
|
|
|
|
[workspace.lints.rust]
|
|
unsafe_code = "forbid"
|
|
|
|
[workspace.lints.clippy]
|
|
dbg_macro = "warn"
|
|
todo = "warn"
|
|
too_many_arguments = "allow"
|
|
type_complexity = "allow"
|
|
|
|
[profile.dev.package."*"]
|
|
opt-level = 2
|
|
|
|
[profile.dev]
|
|
opt-level = 1
|
|
|
|
[profile.release]
|
|
opt-level = 3
|
|
lto = "thin"
|
|
codegen-units = 16
|
|
debug = 0
|