From 1b208de3b5fd3267ffb75b3c5c36905946f5ca8f Mon Sep 17 00:00:00 2001 From: Craig Jennings Date: Sun, 12 Jul 2026 01:10:45 -0500 Subject: feat(gallery): add R28 rotary disc switch The heavy master-power selector after a marine battery switch (reference filed in the catalogue's working directory): the whole red disc turns with a molded grip bar and a cream index notch, stepping OFF, ON, COMBINE with the active legend lit. A disc that is itself the handle was the one heavy-switch form the kit lacked. I verified it in headless Chrome: clicks cycle all three positions and wrap, the disc rotates with its settle transition, no console exceptions. --- docs/prototypes/panel-widget-gallery.html | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) (limited to 'docs') diff --git a/docs/prototypes/panel-widget-gallery.html b/docs/prototypes/panel-widget-gallery.html index c4f1520..dc62d7d 100644 --- a/docs/prototypes/panel-widget-gallery.html +++ b/docs/prototypes/panel-widget-gallery.html @@ -739,6 +739,9 @@ card(C,'R24','Stomp switch + jewel', card(C,'R27','Winged gain selector', ``, 'the red T-bar, stepped. A bar-grip handle over a dot ring, snapping between labeled gain detents. Drag up/down to step it. After a classic mic-preamp gain switch.'); +card(C,'R28','Rotary disc switch', + ``, + 'the master power disc. The whole red disc turns, grip bar molded in — a heavy three-position selector for OFF, ON, and COMBINE. Click to step. After a marine battery switch.'); /* ============ METERS & GAUGES ============ */ const M=$('meters'); @@ -1920,6 +1923,34 @@ function setWing(v){const i=Math.max(0,Math.min(WINGK_STEPS.length-1,Math.round( setRd('R27',(db>0?'+':'')+db+' dB');} dragDelta($('wingk'),()=>wingI,setWing,{min:0,max:WINGK_STEPS.length-1,sens:.05});setWing(7); +/* R28 rotary disc switch: the whole disc turns between heavy positions */ +const DISCSW_POS=[['OFF',-45],['ON',45],['COMBINE',135]]; +let discI=1,discGrp=null,discLbls=[]; +(function(){const s=$('discsw'),cx=55,cy=58; + const defs=svgEl(s,'defs',{}); + const rr=svgEl(defs,'radialGradient',{id:'discRed',cx:'42%',cy:'34%',r:'85%'}); + svgEl(rr,'stop',{offset:'0','stop-color':'#d98a6f'}); + svgEl(rr,'stop',{offset:'.65','stop-color':'var(--fail)'}); + svgEl(rr,'stop',{offset:'1','stop-color':'#7a2a1a'}); + svgEl(s,'circle',{cx,cy,r:48,fill:'#1a1714',stroke:'#060505','stroke-width':1.5}); + for(let k=0;k<4;k++){const [x,y]=polar(cx,cy,44,45+k*90); + svgEl(s,'circle',{cx:x,cy:y,r:2.6,fill:'url(#sfScrew)',stroke:'#0a0908','stroke-width':.5});} + DISCSW_POS.forEach(([lbl,a],i)=>{const [tx,ty]=polar(cx,cy,42,a); + const t=svgEl(s,'text',{x:tx,y:ty+2.4,'text-anchor':'middle','font-size':5.8,'letter-spacing':'.06em', + 'font-family':'var(--mono)',fill:'var(--dim)'});t.textContent=lbl;discLbls.push(t);}); + svgEl(s,'circle',{cx,cy,r:36,fill:'url(#discRed)',stroke:'#4e150a','stroke-width':1}); + discGrp=svgEl(s,'g',{});discGrp.style.transition='transform .15s';discGrp.style.transformOrigin=`${cx}px ${cy}px`; + svgEl(discGrp,'rect',{x:cx-27,y:cy-8,width:54,height:16,rx:8,fill:'url(#discRed)',stroke:'#8f3520','stroke-width':1}); + svgEl(discGrp,'rect',{x:cx-25,y:cy-6.5,width:50,height:4,rx:2,fill:'rgba(255,255,255,.16)'}); + svgEl(discGrp,'line',{x1:cx+20,y1:cy,x2:cx+26,y2:cy,stroke:'var(--cream)','stroke-width':2.5,'stroke-linecap':'round'}); + svgEl(s,'ellipse',{cx:cx-12,cy:cy-14,rx:12,ry:6,fill:'rgba(255,255,255,.10)',transform:`rotate(-28,${cx-12},${cy-14})`}); + $('discsw').onclick=()=>setDisc((discI+1)%DISCSW_POS.length);})(); +function setDisc(i){discI=i; + discGrp.style.transform=`rotate(${DISCSW_POS[i][1]}deg)`; + discLbls.forEach((t,k)=>t.setAttribute('fill',k===i?'var(--gold-hi)':'var(--dim)')); + setRd('R28',DISCSW_POS[i][0]);} +setDisc(1); + /* R25 fourteen-segment display: the starburst that spells */ const SEG14_WORDS=['ZOOM','ECHO','TAPE','MOOD','HALL','COMP']; const SEG14_MAP={A:['a','b','c','e','f','g1','g2'],C:['a','d','e','f'], -- cgit v1.2.3