fix: LFO→cutoff modulation, visual knob feedback, persistent hints

- Fix LFO→Filter cutoff: add scaling Gain nodes so LFO (-1..1) maps to
  meaningful Hz modulation (±cutoff value). Same fix for LFO→Osc freq.
  Mod scale updates dynamically when user changes the base param value.
- Visual modulation indicator: knobs receiving LFO/modulation show a
  pulsing dashed ring animation (spin + pulse) around the knob arc
- Persist hint usage per level: using a hint permanently caps that level
  at 2 stars — survives reload/restart. No more cheating by restarting!
- Hint state stored in separate localStorage key (synthquest-hints)
- Admin reset also clears hint history

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Jose Luis
2026-03-21 02:44:28 +01:00
parent c4a2cb3cef
commit f0100eb64f
7 changed files with 120 additions and 15 deletions

View File

@@ -168,6 +168,27 @@ html, body, #root {
.knob-fill { fill: none; stroke-width: 3; stroke-linecap: round; }
.knob-dot { fill: var(--text); }
/* Modulation indicator: pulsing ring around modulated knobs */
.knob-mod-ring {
fill: none;
stroke-width: 1.5;
stroke-dasharray: 3 2;
opacity: 0.7;
animation: knob-mod-pulse 1.2s ease-in-out infinite alternate, knob-mod-spin 4s linear infinite;
}
@keyframes knob-mod-pulse {
from { opacity: 0.3; stroke-width: 1; }
to { opacity: 0.9; stroke-width: 2; }
}
@keyframes knob-mod-spin {
from { stroke-dashoffset: 0; }
to { stroke-dashoffset: 30; }
}
.knob-modulated .param-label,
.knob-container.knob-modulated + .param-value {
color: var(--accent2);
}
.knob-editing { display: flex; align-items: center; justify-content: center; }
.knob-input {
width: 48px; height: 22px; padding: 0 4px;