Repository navigation
Expand file tree
/
Copy pathscreen.html
More file actions
1657 lines (1599 loc) · 122 KB
/
Copy pathscreen.html
File metadata and controls
1657 lines (1599 loc) · 122 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<style>
/* v3-integration polish, custom (non-utility) rules only. The Tailwind
utility classes this plugin uses ship via assets/rb.css (loaded by
screen.js, built by tools/build_tailwind.sh) so the look is correct even
when the host skips its JIT rebuild. Safe in legacy desktop + v3. */
/* Kill the white UA focus box the v3 web shell shows on click (buttons/tabs
and the interactive pedal <canvas>, which Safari outlines). */
#rb-root button:focus,
#rb-root a:focus,
#rb-root [onclick]:focus,
#rb-root input:focus,
#rb-root select:focus,
#rb-root textarea:focus,
#rb-root canvas:focus,
#rb-root [tabindex]:focus,
#rb-root button:focus-visible,
#rb-root a:focus-visible,
#rb-root [onclick]:focus-visible,
#rb-root canvas:focus-visible { outline: none !important; box-shadow: none !important; }
/* pt-24 clears the legacy fixed navbar; in v3 that navbar is hidden, so trim
the gap ONLY inside #v3-main. The legacy desktop keeps pt-24. */
/* v3: the host topbar is hidden in Studio (rbSetImmersiveTopbar), so drop
the top padding entirely — the plugin's own floating tab bar sits flush
at the very top and the room fills everything below it. */
#v3-main #rb-root { padding-top: 0; }
/* v3: sidebar + Plugins page own navigation, so hide the legacy "< Back". */
#v3-main #rb-root .rb-back{display:none!important}
#rb-root.rb-wide { max-width: min(1400px, calc(100vw - 3rem)); }
/* Studio runs edge-to-edge: full viewport width, no horizontal padding, so
the room + the right-docked swap rail reach the screen edges. */
#rb-root.rb-studio-bleed { max-width: none !important; padding-left: 0 !important; padding-right: 0 !important; }
@media (max-width: 1023px) {
#rb-root .rb-gear-browser { grid-template-columns: 1fr !important; }
#rb-root.rb-wide { max-width: 100%; }
}
/* ── Immersive shell: Studio is the permanent backdrop; the top bar floats
(translucent blue) and the other tabs float over the room as panels ── */
#rb-root.rb-immersive{ max-width:none !important; padding-left:0 !important;
padding-right:0 !important; padding-bottom:0 !important; position:relative; }
#rb-root.rb-immersive > .rb-back{ display:none; }
.rb-topbar{ position:relative; z-index:50; display:flex; align-items:center; gap:5px;
padding:11px 18px;
background:linear-gradient(180deg, rgba(54,82,146,.34), rgba(26,46,90,.15));
-webkit-backdrop-filter:blur(12px); backdrop-filter:blur(12px);
border-bottom:1px solid rgba(120,165,225,.18); }
.rb-topbar .rb-tab{ border:none; border-radius:9px; padding:7px 14px; font-size:13px; color:#aab7cf;
background:transparent; cursor:pointer; transition:background .15s, color .15s; white-space:nowrap; }
.rb-topbar .rb-tab:hover{ color:#fff; background:rgba(255,255,255,.07); }
.rb-topbar .rb-tab.rb-tab-active{ color:#fff; background:rgba(120,160,220,.24);
box-shadow:inset 0 0 0 1px rgba(120,170,240,.32); }
.rb-topbar-back{ flex:0 0 auto; width:30px; height:30px; border-radius:8px; margin-right:4px; cursor:pointer;
font-size:18px; line-height:1; color:#aab7cf; background:rgba(255,255,255,.05);
border:1px solid rgba(255,255,255,.1); }
/* Advanced entry point, floating inside the Studio room (top-right) */
.rb-studio-adv-btn{ position:absolute; top:14px; right:16px; z-index:20; cursor:pointer;
padding:7px 13px; border-radius:9px; font-size:13px; font-weight:500; color:#cfe0ff;
background:rgba(30,46,76,.62); border:1px solid rgba(120,170,240,.34);
box-shadow:0 6px 18px rgba(0,0,0,.4); backdrop-filter:blur(6px);
transition:background .15s, color .15s, transform .12s; }
.rb-studio-adv-btn:hover{ background:rgba(48,72,118,.8); color:#fff; transform:translateY(-1px); }
/* Restore/Remove-tone action, floating just LEFT of ⚙ Advanced. */
.rb-studio-tone-action{ right:140px !important; }
.rb-studio-tone-action.hidden{ display:none; }
/* Replace-with-preset action, floating just LEFT of Restore/Remove.
Offset clears the widest Restore/Remove label ("↺ Restore to original"). */
.rb-studio-tone-replace{ right:316px !important; }
.rb-studio-tone-replace.hidden{ display:none; }
/* When a song's tonebar is shown it covers the top strip — drop the Advanced
button below it so it stays reachable while a song is loaded. */
#rb-stage-wrap.rb-songbar-on .rb-studio-adv-btn{ top:58px; }
/* Full-chain NAM loader: fixed bottom-left, always present (song or not). */
.rb-studio-fullchain-btn{ position:absolute; bottom:16px; left:16px; z-index:20; cursor:pointer;
padding:7px 13px; border-radius:9px; font-size:13px; font-weight:500; color:#d8ffe6;
background:rgba(20,58,40,.62); border:1px solid rgba(90,220,150,.34);
box-shadow:0 6px 18px rgba(0,0,0,.4); backdrop-filter:blur(6px);
transition:background .15s, color .15s, transform .12s; }
.rb-studio-fullchain-btn:hover{ background:rgba(28,84,58,.85); color:#fff; transform:translateY(-1px); }
/* Full-chain override: grey the board when active + a banner with a toggle.
A `filter`/`opacity` on the 3D stage FLATTENS the room (breaks translateZ/
rotateY → gear changes size/position), so only disable interaction here and
grey the 2D leaf FACES below. */
#rb-studio-room.rb-fullchain-active .rb-studio-stage{ pointer-events:none; }
#rb-studio-room.rb-fullchain-active .rb-amp-face img,
#rb-studio-room.rb-fullchain-active .rb-amp-head,
#rb-studio-room.rb-fullchain-active .rb-amp-cab img,
#rb-studio-room.rb-fullchain-active .rb-pedal img,
#rb-studio-room.rb-fullchain-active .rb-pedal-fallback,
#rb-studio-room.rb-fullchain-active .rb-rack img,
#rb-studio-room.rb-fullchain-active .rb-rack-fallback{ filter:grayscale(1) brightness(.7); transition:filter .2s; }
.rb-fc-banner{ position:absolute; top:14px; left:50%; transform:translateX(-50%); z-index:30; display:flex; align-items:center;
gap:10px; padding:8px 12px; border-radius:11px; font-size:13px; color:#eaf1ff; backdrop-filter:blur(6px);
box-shadow:0 8px 22px rgba(0,0,0,.45); }
#rb-stage-wrap.rb-songbar-on #rb-studio-room .rb-fc-banner{ top:58px; }
.rb-fc-banner.on{ background:rgba(24,84,54,.82); border:1px solid rgba(90,220,150,.5); }
.rb-fc-banner.off{ background:rgba(40,46,60,.82); border:1px solid rgba(255,255,255,.16); color:#b9c4d6; }
.rb-fc-banner b{ color:#fff; }
.rb-fc-banner-btn{ cursor:pointer; font-size:12px; padding:4px 11px; border-radius:8px; color:#fff;
background:rgba(255,255,255,.14); border:1px solid rgba(255,255,255,.28); }
.rb-fc-banner-btn:hover{ background:rgba(255,255,255,.24); }
.rb-fc-banner-x{ cursor:pointer; color:inherit; background:none; border:none; font-size:14px; padding:2px 5px; border-radius:6px; opacity:.75; }
.rb-fc-banner-x:hover{ opacity:1; background:rgba(255,255,255,.14); }
/* Hide it in gear/pedal focus edit (same as the Advanced button). */
#rb-stage-wrap:has(#rb-studio-room.rb-focus-active) .rb-studio-fullchain-btn,
#rb-stage-wrap:has(#rb-studio-room.rb-pfocus) .rb-studio-fullchain-btn{ display:none !important; }
/* ── Full-chain NAM chooser modal ─────────────────────────────────────── */
.rb-fc-modal{ position:fixed; inset:0; z-index:120; display:flex; align-items:center;
justify-content:center; background:rgba(6,10,16,.62); backdrop-filter:blur(3px); }
.rb-fc-modal.hidden{ display:none; }
.rb-fc-card{ width:min(460px,92vw); max-height:86vh; overflow:hidden; display:flex; flex-direction:column;
background:#141a24; border:1px solid rgba(120,170,240,.22); border-radius:14px;
box-shadow:0 24px 70px rgba(0,0,0,.6); }
.rb-fc-head{ display:flex; align-items:center; justify-content:space-between; padding:13px 16px;
font-size:14px; font-weight:600; color:#eaf1ff; border-bottom:1px solid rgba(255,255,255,.07); }
.rb-fc-x{ cursor:pointer; color:#9fb0c8; background:none; border:none; font-size:15px; padding:2px 6px; border-radius:6px; }
.rb-fc-x:hover{ color:#fff; background:rgba(255,255,255,.1); }
.rb-fc-body{ padding:14px 16px; overflow-y:auto; }
.rb-fc-scope{ font-size:12px; color:#9fb0c8; margin-bottom:12px; }
.rb-fc-scope b{ color:#d8ffe6; font-weight:600; }
.rb-fc-dir{ width:100%; cursor:pointer; padding:10px 12px; border-radius:9px; font-size:13px; font-weight:500;
color:#d8ffe6; background:rgba(20,58,40,.6); border:1px solid rgba(90,220,150,.34); transition:background .15s; }
.rb-fc-dir:hover{ background:rgba(28,84,58,.85); color:#fff; }
.rb-fc-or{ text-align:center; font-size:11px; text-transform:uppercase; letter-spacing:.06em;
color:#6b7a90; margin:13px 0 10px; }
.rb-fc-search{ display:flex; gap:6px; }
.rb-fc-search input{ flex:1; min-width:0; background:#0e131b; border:1px solid rgba(255,255,255,.1);
border-radius:8px; color:#e6edf7; font-size:13px; padding:8px 10px; }
.rb-fc-search button{ cursor:pointer; padding:8px 14px; border-radius:8px; font-size:13px; color:#cfe0ff;
background:rgba(30,46,76,.7); border:1px solid rgba(120,170,240,.34); }
.rb-fc-search button:hover{ background:rgba(48,72,118,.85); color:#fff; }
.rb-fc-results{ margin-top:10px; display:flex; flex-direction:column; gap:3px; max-height:340px; overflow-y:auto; }
.rb-fc-hint{ font-size:12px; color:#8a98ad; padding:8px 2px; }
.rb-fc-hint.rb-fc-warn{ color:#ffcf7a; }
.rb-fc-row{ display:flex; align-items:center; gap:9px; padding:6px 7px; border-radius:8px; }
.rb-fc-row:hover{ background:rgba(255,255,255,.05); }
.rb-fc-thumb{ width:36px; height:36px; object-fit:cover; border-radius:6px; background:#0e131b; flex:0 0 auto; }
.rb-fc-thumb-empty{ display:flex; align-items:center; justify-content:center; font-size:9px; color:#4b5568; }
.rb-fc-row-main{ flex:1; min-width:0; text-decoration:none; }
.rb-fc-row-title{ font-size:12px; color:#dbe4f2; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
.rb-fc-row-main:hover .rb-fc-row-title{ color:#fff; }
.rb-fc-row-sub{ font-size:10px; color:#6b7a90; }
.rb-fc-use{ cursor:pointer; white-space:nowrap; flex:0 0 auto; font-size:11px; padding:5px 9px; border-radius:7px;
color:#d8ffe6; background:rgba(24,96,60,.8); border:1px solid rgba(90,220,150,.4); }
.rb-fc-use:hover{ background:rgba(30,120,74,.95); color:#fff; }
.rb-fc-use:disabled{ opacity:.6; cursor:default; }
/* Shared tone3000 browser: category chips + per-tone capture list. */
.rb-t3k-chips{ display:flex; flex-wrap:wrap; gap:5px; margin:8px 0; }
.rb-t3k-chip{ cursor:pointer; font-size:11px; padding:3px 9px; border-radius:999px; color:#9fb0c8;
background:rgba(255,255,255,.05); border:1px solid rgba(255,255,255,.12); transition:background .12s, color .12s; }
.rb-t3k-chip:hover{ background:rgba(255,255,255,.1); color:#e6edf7; }
.rb-t3k-chip.on{ background:rgba(48,72,118,.85); border-color:rgba(120,170,240,.5); color:#fff; }
.rb-t3k-cand{ align-items:center; }
.rb-t3k-exp{ cursor:pointer; flex:0 0 auto; width:20px; text-align:center; color:#8a98ad; background:none;
border:none; font-size:12px; padding:2px; border-radius:5px; }
.rb-t3k-exp:hover{ color:#fff; background:rgba(255,255,255,.1); }
.rb-t3k-caps{ margin:1px 0 8px 30px; border-left:2px solid rgba(120,170,240,.2); padding-left:8px; }
.rb-t3k-caplist{ display:flex; flex-direction:column; gap:2px; max-height:230px; overflow-y:auto; }
.rb-t3k-capsearch input{ width:100%; box-sizing:border-box; margin:2px 0 5px; background:#0e131b;
border:1px solid rgba(255,255,255,.1); border-radius:7px; color:#e6edf7; font-size:11px; padding:5px 8px; }
.rb-t3k-cap{ display:flex; align-items:center; gap:8px; padding:3px 4px; border-radius:6px; }
.rb-t3k-cap:hover{ background:rgba(255,255,255,.04); }
.rb-t3k-cap-name{ flex:1; min-width:0; font-size:11px; color:#cdd7e6; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
.rb-t3k-cap-size{ flex:0 0 auto; font-size:9px; text-transform:uppercase; color:#6b7a90; }
/* Whole-row expander: the candidate row is clickable; the pill on the right
makes "there's more inside" obvious (no separate download button here). */
.rb-t3k-cand{ cursor:pointer; }
.rb-t3k-cand:hover{ background:rgba(255,255,255,.05); }
.rb-t3k-more{ flex:0 0 auto; font-size:11px; color:#9fb0c8; white-space:nowrap; padding:3px 10px; border-radius:999px;
background:rgba(255,255,255,.06); border:1px solid rgba(255,255,255,.14); }
.rb-t3k-cand:hover .rb-t3k-more{ color:#fff; background:rgba(48,72,118,.7); border-color:rgba(120,170,240,.4); }
.rb-t3k-cand.open .rb-t3k-more{ color:#fff; background:rgba(48,72,118,.9); border-color:rgba(120,170,240,.5); }
.rb-t3k-link{ color:#8fb3ef; text-decoration:none; }
.rb-t3k-link:hover{ color:#cfe0ff; text-decoration:underline; }
/* Add-gear source selector: pick ONE of tone3000 / directory / downloaded. */
.rb-cg-srcsegs{ display:inline-flex; flex-wrap:wrap; gap:4px; margin-bottom:9px; }
.rb-cg-srcseg{ cursor:pointer; font-size:12px; padding:5px 11px; border-radius:8px; color:#9fb0c8;
background:rgba(255,255,255,.05); border:1px solid rgba(255,255,255,.12); transition:background .12s, color .12s; }
.rb-cg-srcseg:hover{ background:rgba(255,255,255,.1); color:#e6edf7; }
.rb-cg-srcseg.on{ background:rgba(48,72,118,.85); border-color:rgba(120,170,240,.5); color:#fff; }
/* Amp gain-variant rows (clean/crunch/dist → downloaded NAM). */
.rb-cg-varrow{ display:flex; align-items:center; gap:8px; margin-bottom:5px; }
.rb-cg-varlvl{ flex:0 0 46px; font-size:11px; font-weight:600; text-transform:capitalize; color:#cdd7e6; }
.rb-cg-varrange{ flex:0 0 74px; font-size:10px; color:#6b7a90; white-space:nowrap; }
.rb-cg-varsel{ flex:1; min-width:0; background:#0e131b; border:1px solid rgba(255,255,255,.12); border-radius:7px;
color:#e6edf7; font-size:11px; padding:5px 7px; }
/* Gear focus (amp/pedal/rack editor open, catalog on the right): hide the
floating "⚙ Advanced" button AND the song-tones bar. The focus bar's
"← Room" back button sits at top:0/z-index:7, but the tonebar is at
top:0/z-index:25 and was covering it. Both auto-restore on close — the
focus class drops off #rb-studio-room, so no JS teardown needed. */
#rb-stage-wrap:has(#rb-studio-room.rb-focus-active) .rb-studio-adv-btn,
#rb-stage-wrap:has(#rb-studio-room.rb-pfocus) .rb-studio-adv-btn,
#rb-stage-wrap:has(#rb-studio-room.rb-focus-active) .rb-song-tonebar,
#rb-stage-wrap:has(#rb-studio-room.rb-pfocus) .rb-song-tonebar{ display:none !important; }
.rb-topbar-back:hover{ color:#fff; background:rgba(255,255,255,.12); }
.rb-mute-btn{ margin-left:auto; flex:0 0 auto; border:1px solid rgba(120,170,240,.3); border-radius:9px; padding:7px 11px;
font-size:14px; line-height:1; color:#dbe4f2; background:rgba(120,160,220,.14); cursor:pointer;
transition:background .15s, color .15s, border-color .15s; }
.rb-mute-btn:hover{ background:rgba(120,160,220,.24); }
.rb-mute-btn.rb-mute-on{ color:#ffd7d7; background:rgba(200,60,60,.34); border-color:rgba(220,90,90,.6); }
.rb-songbtn{ flex:0 0 auto; border:1px solid rgba(120,170,240,.3); border-radius:9px;
padding:7px 13px; font-size:13px; color:#dbe4f2; background:rgba(120,160,220,.16); cursor:pointer;
white-space:nowrap; transition:background .15s, color .15s; }
.rb-songbtn:hover{ color:#fff; background:rgba(120,160,220,.28); }
.rb-songbtn.rb-songbtn-on{ color:#fff; background:rgba(120,160,220,.34); box-shadow:inset 0 0 0 1px rgba(140,180,250,.5); }
/* tone selector (single bar): current tone + a searchable dropdown */
.rb-toneselect{ position:relative; flex:0 0 auto; }
.rb-tone-btn{ border:1px solid rgba(120,170,240,.3); border-radius:9px; padding:7px 13px; font-size:13px;
color:#dbe4f2; background:rgba(120,160,220,.16); cursor:pointer; white-space:nowrap; max-width:240px;
overflow:hidden; text-overflow:ellipsis; transition:background .15s, color .15s; }
.rb-tone-btn:hover{ color:#fff; background:rgba(120,160,220,.28); }
.rb-tone-menu{ position:absolute; top:calc(100% + 8px); right:0; width:min(300px,80vw); z-index:60;
display:flex; flex-direction:column; max-height:60vh; border-radius:12px; overflow:hidden;
background:linear-gradient(180deg, rgba(20,30,52,.96), rgba(12,18,32,.97));
-webkit-backdrop-filter:blur(14px); backdrop-filter:blur(14px);
border:1px solid rgba(120,165,225,.22); box-shadow:0 18px 44px rgba(0,0,0,.55); }
.rb-tone-menu.hidden{ display:none; }
.rb-tone-search{ padding:10px; border-bottom:1px solid rgba(255,255,255,.06); }
.rb-tone-search input{ width:100%; background:rgba(8,14,28,.6); border:1px solid rgba(120,160,220,.22);
border-radius:9px; padding:8px 11px; font-size:13px; color:#dbe4f2; outline:none; }
.rb-tone-search input::placeholder{ color:#7e8aa3; }
.rb-tone-list{ overflow-y:auto; padding:6px; display:flex; flex-direction:column; gap:2px; }
.rb-tone-grouphdr{ font-size:10px; letter-spacing:.1em; text-transform:uppercase; color:#7e8aa3;
padding:8px 8px 4px; }
.rb-tone-row{ display:flex; align-items:center; gap:8px; padding:8px 10px; border-radius:8px; cursor:pointer;
color:#cdd6e6; font-size:13px; }
.rb-tone-row:hover{ background:rgba(120,160,220,.16); color:#fff; }
.rb-tone-row-on{ background:rgba(120,160,220,.24); color:#fff; box-shadow:inset 0 0 0 1px rgba(140,180,250,.4); }
.rb-tone-row-name{ flex:1; min-width:0; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.rb-tone-row-del{ flex:0 0 auto; border:none; background:transparent; cursor:pointer; font-size:13px; opacity:.6; }
.rb-tone-row-del:hover{ opacity:1; }
.rb-tone-foot{ padding:8px; border-top:1px solid rgba(255,255,255,.06); }
.rb-tone-save{ width:100%; border:1px solid rgba(74,210,150,.4); border-radius:9px; padding:9px;
color:#bff0d6; background:rgba(52,180,120,.16); cursor:pointer; font-size:13px; }
.rb-tone-save:hover{ color:#fff; background:rgba(52,180,120,.3); }
.rb-tone-saveinput{ display:flex; align-items:center; gap:6px; }
.rb-tone-saveinput input{ flex:1; background:rgba(8,14,28,.6); border:1px solid rgba(120,160,220,.3);
border-radius:8px; padding:8px 10px; font-size:13px; color:#dbe4f2; outline:none; }
.rb-tone-saveok, .rb-tone-savecancel{ border:1px solid rgba(255,255,255,.14); border-radius:8px;
padding:8px 11px; font-size:13px; cursor:pointer; background:rgba(255,255,255,.06); color:#dbe2ee; }
.rb-tone-saveok{ background:rgba(52,180,120,.22); border-color:rgba(74,210,150,.42); color:#bff0d6; }
.rb-tone-saveok:hover{ background:rgba(52,180,120,.34); color:#fff; }
.rb-tone-savecancel:hover{ background:rgba(255,255,255,.14); color:#fff; }
#rb-stage-wrap{ position:relative; }
/* song-tones bar — its own strip over the top of the room, only with a song */
.rb-song-tonebar{ position:absolute; top:0; left:0; right:0; z-index:25; display:flex; gap:6px;
align-items:center; padding:8px 16px; overflow-x:auto; white-space:nowrap;
background:linear-gradient(180deg, rgba(40,62,112,.4), rgba(20,36,72,.18));
-webkit-backdrop-filter:blur(10px); backdrop-filter:blur(10px);
border-bottom:1px solid rgba(120,165,225,.14); }
.rb-song-tonebar.hidden{ display:none; }
.rb-song-tonebar::-webkit-scrollbar{ height:0; }
.rb-song-tonebar-name{ font-size:12.5px; color:#d2dcec; font-weight:500; max-width:340px;
overflow:hidden; text-overflow:ellipsis; white-space:nowrap; margin-right:8px; flex:0 0 auto; }
.rb-song-tonebar-x{ margin-left:auto; flex:0 0 auto; border:1px solid rgba(255,255,255,.14); border-radius:8px;
width:28px; height:28px; cursor:pointer; color:#cdd6e6; background:rgba(255,255,255,.05); font-size:13px; }
.rb-song-tonebar-x:hover{ color:#fff; background:rgba(255,255,255,.14); }
#rb-root.rb-immersive #rb-tab-studio{ display:block; }
#rb-root.rb-immersive #rb-studio-room{ height:calc(100vh - 158px); border-radius:0; }
/* In the v3 shell the host topbar is hidden while Studio is open (see
rbSetImmersiveTopbar in screen.js) and #rb-root's top padding is 0, so the
room fills the whole main area: 100vh minus only the plugin's own floating
tab bar (~59px). Scoped to #v3-main so the legacy v2 shell (which still
shows its own chrome) keeps 158px. */
#v3-main #rb-root.rb-immersive #rb-studio-room{ height:calc(100vh - 59px); }
.rb-overlay{ position:absolute; inset:0; z-index:30; overflow-y:auto;
padding:24px clamp(16px,5vw,72px) 60px;
background:linear-gradient(180deg, rgba(8,12,22,.72), rgba(6,9,16,.82));
-webkit-backdrop-filter:blur(10px); backdrop-filter:blur(10px); }
.rb-overlay.hidden{ display:none; }
/* Songs = a bottom search dock that does NOT cover the studio room */
.rb-songdock{ position:absolute; left:0; right:0; bottom:0; z-index:35; pointer-events:none; }
.rb-songdock.hidden{ display:none; }
.rb-songdock-inner{ pointer-events:auto; margin:0 auto; width:min(660px,94%);
display:flex; flex-direction:column; }
.rb-songdock-list{ max-height:46vh; overflow-y:auto; display:flex; flex-direction:column; gap:2px; padding:8px;
background:linear-gradient(180deg, rgba(12,18,32,.6), rgba(10,14,26,.82));
-webkit-backdrop-filter:blur(12px); backdrop-filter:blur(12px);
border:1px solid rgba(120,160,220,.16); border-bottom:none; border-radius:14px 14px 0 0; }
.rb-songdock-list:empty{ display:none; }
.rb-songdock-search{ display:flex; gap:8px; align-items:center; padding:12px 14px;
background:linear-gradient(180deg, rgba(48,74,134,.34), rgba(26,46,90,.42));
-webkit-backdrop-filter:blur(12px); backdrop-filter:blur(12px);
border:1px solid rgba(120,165,225,.2); }
.rb-songdock-search input{ flex:1; background:rgba(8,14,28,.6); border:1px solid rgba(120,160,220,.22);
border-radius:10px; padding:10px 14px; font-size:13px; color:#dbe4f2; outline:none; }
.rb-songdock-search input::placeholder{ color:#7e8aa3; }
.rb-songdock-search input:focus{ border-color:rgba(120,170,240,.5); }
.rb-songdock-search button{ background:rgba(120,160,220,.22); border:1px solid rgba(120,170,240,.34);
color:#eaf1fb; padding:10px 16px; border-radius:10px; font-size:13px; cursor:pointer; }
.rb-songdock-search button:hover{ background:rgba(120,160,220,.34); }
/* top-bar tone chips (the loaded song's tones, left→right) */
.rb-tone-chip{ border:1px solid rgba(120,170,240,.22); border-radius:9px; padding:6px 12px; font-size:12.5px;
color:#bcc8de; background:rgba(120,160,220,.1); cursor:pointer; white-space:nowrap;
transition:background .15s, color .15s; }
.rb-tone-chip:hover{ color:#fff; background:rgba(120,160,220,.2); }
.rb-tone-chip.rb-tone-chip-on{ color:#fff; background:rgba(120,160,220,.34);
box-shadow:inset 0 0 0 1px rgba(140,180,250,.5); }
.rb-song-reset-btn{ border-color:rgba(240,180,90,.42) !important; color:#e8c48a !important;
background:rgba(240,180,90,.1) !important; }
.rb-song-reset-btn:hover{ color:#fff !important; background:rgba(240,170,70,.28) !important; }
.rb-tone-sep{ width:1px; align-self:stretch; margin:2px 2px; background:rgba(160,180,220,.22); }
.rb-tone-save{ border:1px solid rgba(74,210,150,.4); border-radius:9px; padding:6px 12px; font-size:12.5px;
color:#bff0d6; background:rgba(52,180,120,.16); cursor:pointer; white-space:nowrap; }
.rb-tone-save:hover{ color:#fff; background:rgba(52,180,120,.3); }
.rb-tone-del{ border:1px solid rgba(220,95,95,.4); border-radius:9px; padding:6px 10px; font-size:12.5px;
color:#f4d4d4; background:rgba(200,70,70,.16); cursor:pointer; }
.rb-tone-del:hover{ color:#fff; background:rgba(212,72,72,.3); }
/* ── Studio room (premium dark + perspective) — Phase 1 ───────────── */
#rb-studio-room{
--rb-accent:#34d3c0;
position:relative; border-radius:1.25rem; overflow:hidden;
min-height:0; height:calc(100vh - 210px);
background:#070809;
border:1px solid rgba(255,255,255,.06);
box-shadow:inset 0 1px 0 rgba(255,255,255,.05);
}
/* warm light pools spilling from the ceiling fixtures */
#rb-studio-room::before{ content:""; position:absolute; inset:0; pointer-events:none; z-index:3;
background:
radial-gradient(38% 32% at 31% 6%, rgba(255,246,222,.20), transparent 72%),
radial-gradient(38% 32% at 69% 6%, rgba(255,246,222,.18), transparent 72%),
radial-gradient(70% 50% at 50% -4%, rgba(255,250,236,.12), transparent 78%); }
/* soft atmosphere vignette over the whole scene */
#rb-studio-room::after{ content:""; position:absolute; inset:0; pointer-events:none; z-index:4;
background:radial-gradient(88% 72% at 50% 40%, transparent 56%, rgba(0,0,0,.46) 100%); }
/* hide the room header while focused so the ← Room button isn't crowded */
#rb-studio-room.rb-focus-active .rb-studio-head{ opacity:0; pointer-events:none; }
/* ── 3D control room: black walls w/ mounted grey acoustic panels (3D) ── */
.rb-room-3d{ position:absolute; inset:0; transform-style:preserve-3d;
transition:transform .55s cubic-bezier(.33,0,.2,1), opacity .5s ease, filter .5s ease; }
.rb-wall{ position:absolute; overflow:hidden;
background:linear-gradient(180deg,#111317,#070809); }
.rb-wall::before{ content:""; position:absolute; inset:0;
background-image:repeating-linear-gradient(45deg, rgba(255,255,255,.012) 0 1px, transparent 1px 5px);
box-shadow:inset 0 0 130px rgba(0,0,0,.6); }
.rb-wall-back{ inset:0; transform:translateZ(-760px); filter:brightness(1.06); }
.rb-wall-left{ top:0; bottom:0; left:0; width:760px; transform-origin:left center;
transform:rotateY(90deg); filter:brightness(.8); }
.rb-wall-right{ top:0; bottom:0; right:0; width:760px; transform-origin:right center;
transform:rotateY(-90deg); filter:brightness(.9); }
/* grey fabric acoustic panel — raised off the wall with a SUBTLE depth face.
The face direction depends on which side of the room the panel sits
(modifier -l / -r) so every panel's depth points toward the camera and the
perspective stays consistent. */
.rb-acpanel{ position:absolute; border-radius:3px; z-index:1;
background:
repeating-linear-gradient(45deg, rgba(0,0,0,.04) 0 1px, transparent 1px 5px),
linear-gradient(155deg,#666d74,#454c53);
box-shadow:
inset 0 1px 0 rgba(255,255,255,.12), inset 0 -2px 0 rgba(0,0,0,.3),
5px 9px 18px rgba(0,0,0,.5); }
/* bottom face (very subtle) — skews toward the panel's lit side */
.rb-acpanel-r::after{ content:""; position:absolute; left:0; top:100%; width:100%; height:3px;
background:#3a4046; transform:skewX(45deg); transform-origin:top left; border-radius:0 0 3px 3px; }
.rb-acpanel-l::after{ content:""; position:absolute; left:0; top:100%; width:100%; height:3px;
background:#3a4046; transform:skewX(-45deg); transform-origin:top right; border-radius:0 0 3px 3px; }
/* side face (very subtle, darker) — RIGHT side for left-of-centre panels, LEFT
for right-of-centre, so it always faces the room centre / camera */
.rb-acpanel-r::before{ content:""; position:absolute; top:0; left:100%; width:4px; height:100%;
background:#2f353a; transform:skewY(45deg); transform-origin:top left; border-radius:0 3px 3px 0; }
.rb-acpanel-l::before{ content:""; position:absolute; top:0; right:100%; width:4px; height:100%;
background:#2f353a; transform:skewY(-45deg); transform-origin:top right; border-radius:3px 0 0 3px; }
/* side-wall panels read at a grazing angle, so their side face needs more
depth than the head-on back-wall panels to look right */
.rb-wall-left .rb-acpanel-l::before,
.rb-wall-right .rb-acpanel-r::before{ width:12px; }
/* full-height warm wood-slat panel (back wall centre) — head-on, no side face */
.rb-woodpanel{ position:absolute; z-index:1; border-radius:2px;
background:
repeating-linear-gradient(90deg, #714e2c 0 10px, #2c1d0f 10px 12px, #5e4124 12px 22px, #3a2614 22px 24px),
linear-gradient(180deg,#5e4124,#34220f);
box-shadow:
inset 0 0 60px rgba(0,0,0,.4), inset 0 2px 0 rgba(255,220,170,.12),
0 0 0 5px #0b0c0f, 0 12px 26px rgba(0,0,0,.5); }
.rb-floor3d{ position:absolute; left:0; right:0; bottom:0; height:760px;
transform-origin:bottom center; transform:rotateX(90deg); background-color:#4a3018;
background-image:
repeating-linear-gradient(90deg, rgba(0,0,0,.40) 0 2px, rgba(0,0,0,0) 2px 116px),
repeating-linear-gradient(90deg, rgba(255,255,255,.03) 0 1px, transparent 1px 9px),
repeating-linear-gradient(90deg, rgba(255,255,255,.028) 0 58px, rgba(0,0,0,.04) 58px 116px),
linear-gradient(180deg,#33200f 0%,#5c3d20 45%,#74502c 100%);
box-shadow:inset 0 70px 120px -55px rgba(0,0,0,.7); }
/* ceiling with recessed light panels — lifts the whole room's lighting */
.rb-ceil3d{ position:absolute; left:0; right:0; top:0; height:760px;
transform-origin:top center; transform:rotateX(-90deg);
background:linear-gradient(180deg,#202329,#111316); }
.rb-ceil3d::before{ content:""; position:absolute; left:14%; right:14%; top:18%; bottom:16%;
border-radius:6px; background:
repeating-linear-gradient(90deg, transparent 0 74px,
rgba(255,248,228,.9) 74px 150px, transparent 150px 224px);
box-shadow:0 0 70px rgba(255,244,214,.5), inset 0 0 0 2px rgba(255,248,228,.25); }
/* red carpet centred on the wood floor */
.rb-carpet{ position:absolute; left:16%; right:16%; top:24%; bottom:4%; border-radius:8px;
background-color:#6e1019;
background-image:
repeating-linear-gradient(45deg, rgba(0,0,0,.05) 0 2px, transparent 2px 5px),
radial-gradient(120% 120% at 50% 0%, rgba(255,255,255,.06), transparent 55%),
linear-gradient(180deg,#7c1320,#540c15);
box-shadow:0 0 0 5px rgba(38,6,10,.7), inset 0 0 50px rgba(0,0,0,.45);
border:2px solid rgba(150,40,52,.5); }
/* gear layer — preserve-3d so the amp can sit ANGLED in the room corner */
.rb-studio-stage{ position:absolute; inset:0; z-index:1; pointer-events:none; transform-style:preserve-3d; }
.rb-studio-stage > *{ pointer-events:auto; }
/* amp head + cab stack (left) */
/* amp + cab tucked into the back-left corner, ANGLED into the room (3D —
not facing the camera flat), with an extruded side panel for real box
depth. On focus it straightens out, steps forward + the side disappears. */
/* anchored by the BOTTOM so the cab always sits on the same floor line — a
shorter amp head grows upward instead of leaving the stack floating. */
.rb-amp-stack{ position:absolute; left:28%; top:auto; bottom:14%; width:calc(168px * var(--rb-scale,1)); cursor:pointer;
transform-style:preserve-3d; transform:translateX(-50%) rotateY(32deg) translateZ(-140px);
transition:left .55s cubic-bezier(.33,0,.2,1), top .55s cubic-bezier(.33,0,.2,1),
bottom .55s cubic-bezier(.33,0,.2,1), width .55s cubic-bezier(.33,0,.2,1),
transform .55s cubic-bezier(.33,0,.2,1), filter .2s ease, opacity .35s ease; will-change:transform; }
.rb-amp-stack:hover{ transform:translateX(-50%) rotateY(32deg) translateZ(-140px); }
.rb-amp-stack:hover .rb-amp-face{ filter:brightness(1.13); }
/* Empty-amp placeholder — reuses the amp stack + cabinet visual (so it
matches the room, like the empty pedalboard/rack), with a "+ amp" head
prompt. Clicking the cabinet opens the add-amp flow. */
.rb-amp-stack-empty{ cursor:pointer; }
.rb-amp-face-empty{ height:calc(56px * var(--rb-scale,1)); display:flex; align-items:center; justify-content:center;
color:#9fb4d6; font-size:calc(14px * var(--rb-scale,1)); font-weight:700; letter-spacing:.03em;
border:2px dashed rgba(120,170,240,.45); border-radius:6px; background:rgba(30,46,76,.32);
transition:color .15s, border-color .15s, background .15s; }
.rb-amp-stack-empty:hover .rb-amp-face-empty{ color:var(--rb-accent); border-color:var(--rb-accent); background:rgba(48,72,118,.45); }
/* extruded side panel = box depth for the amp + cab (hidden when flat) */
.rb-amp-stack::before{ content:''; position:absolute; top:1%; bottom:0; left:0; width:calc(54px * var(--rb-scale,1));
transform-origin:left center; transform:rotateY(90deg);
background:linear-gradient(90deg,#1d2026,#090a0c);
box-shadow:inset 0 0 55px rgba(0,0,0,.6); border-radius:2px 0 0 2px;
transition:opacity .35s ease; }
#rb-studio-room.rb-focus-active .rb-amp-stack::before{ opacity:0; }
/* top face = the box's roof; lies back from the top edge (rotateX -90) so the
slightly-elevated camera sees the amp's top. Opaque (no transparent stop)
or it looks see-through. Hidden when an amp is focused/flat. */
.rb-amp-stack::after{ content:''; position:absolute; top:2px; left:0; width:100%; height:calc(60px * var(--rb-scale,1));
transform-origin:top center; transform:rotateX(-90deg);
background:linear-gradient(180deg,#363b44,#23272e); border-radius:3px 3px 0 0;
box-shadow:inset 0 0 30px rgba(0,0,0,.45); transition:opacity .35s ease; }
#rb-studio-room.rb-focus-active .rb-amp-stack::after{ opacity:0; }
/* contact shadow on the floor so the amp reads as grounded, not floating */
.rb-amp-ground{ position:absolute; left:28%; top:78%; width:calc(178px * var(--rb-scale,1)); height:calc(40px * var(--rb-scale,1)); pointer-events:none;
transform:translateX(-50%) rotateX(66deg);
background:radial-gradient(ellipse 50% 50% at 50% 50%, rgba(0,0,0,.62), transparent 72%);
filter:blur(8px); transition:opacity .4s ease; }
#rb-studio-room.rb-focus-active .rb-amp-ground{ opacity:0; }
.rb-amp-head{ border-radius:11px 11px 5px 5px; padding:11px 13px 13px;
background:linear-gradient(180deg,#262a31,#171a1f);
border:1px solid rgba(255,255,255,.09);
box-shadow:inset 0 1px 0 rgba(255,255,255,.09), 0 10px 22px rgba(0,0,0,.55); }
.rb-amp-name{ font-size:calc(10px * var(--rb-scale,1)); letter-spacing:.12em; text-transform:uppercase; color:#cbd2dc;
text-align:center; margin-bottom:9px; text-shadow:0 1px 0 rgba(0,0,0,.6);
white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
.rb-amp-knobs{ display:flex; justify-content:center; gap:calc(13px * var(--rb-scale,1)); }
.rb-knob{ width:calc(24px * var(--rb-scale,1)); height:calc(24px * var(--rb-scale,1)); border-radius:50%; position:relative;
background:radial-gradient(circle at 36% 30%,#444a54,#15171a);
border:1px solid rgba(255,255,255,.14);
box-shadow:0 2px 5px rgba(0,0,0,.55), inset 0 1px 0 rgba(255,255,255,.12); }
.rb-knob::after{ content:""; position:absolute; left:calc(50% - 1px * var(--rb-scale,1)); top:calc(3px * var(--rb-scale,1));
width:calc(2px * var(--rb-scale,1)); height:calc(9px * var(--rb-scale,1)); background:var(--rb-accent); border-radius:1px;
transform-origin:50% calc(9px * var(--rb-scale,1)); transform:rotate(var(--rb-knob-rot,0deg)); }
.rb-amp-stack:hover .rb-knob{ box-shadow:0 2px 5px rgba(0,0,0,.55), 0 0 10px rgba(52,211,192,.45); }
.rb-amp-cab{ aspect-ratio:1.04; margin-top:-3px; border-radius:7px; position:relative;
background:linear-gradient(180deg,#1b1d22,#0f1012);
border:1px solid rgba(255,255,255,.06);
box-shadow:inset 0 0 50px rgba(0,0,0,.65), 0 12px 26px rgba(0,0,0,.6); }
.rb-amp-cab::before{ content:""; position:absolute; inset:10px; border-radius:4px;
background:
repeating-linear-gradient(45deg, rgba(255,255,255,.03) 0 2px, transparent 2px 5px),
repeating-linear-gradient(-45deg, rgba(0,0,0,.22) 0 2px, transparent 2px 5px);
box-shadow:inset 0 0 0 1px rgba(255,255,255,.04); }
/* Recreated cab artwork present → drop the generic grille + let the SVG show
on a dark backdrop (it fits inside, letterboxed for non-square cabs). */
/* Recreated cab in the room: no generic grille/backdrop, no fixed shadow —
the cab art (sized to the cab's real aspect inline) is the whole face, and
it rides the amp stack's 3D transform so depth is preserved. */
.rb-amp-cab.has-art{ background:transparent; box-shadow:none; border:0; overflow:visible; }
.rb-amp-cab.has-art::before{ display:none; }
.rb-amp-cab.has-art > img{ position:absolute; inset:0; width:100%; height:100%; object-fit:contain; }
/* Mic on a boom stand over the room cab (position/model from the Cab Room). The
stand SVG extends below the cab to the floor; the mic sits at the boom tip. */
.rb-amp-cab .rb-room-stand{ position:absolute; left:0; top:0; width:100%; height:122%;
overflow:visible; pointer-events:none; z-index:1; }
/* Mic sits capsule-UP (natural). Anchored by its BODY clip point (~55% down the
art) at the boom tip; the capsule then sticks up above it. The 45° option
rotates around that SAME clip point so the mic stays on the boom. */
.rb-room-mic{ position:absolute; width:13%; aspect-ratio:120/320; transform-origin:50% 55%;
transform:translate(-50%,-55%); z-index:2; pointer-events:none;
filter:drop-shadow(0 2px 4px rgba(0,0,0,.5)); }
.rb-room-mic.rb-cabmic-ang{ transform:translate(-50%,-55%) rotate(38deg); }
.rb-room-mic svg{ width:100%; height:100%; display:block; }
/* camera = perspective viewport. On focus the viewpoint re-aims toward the
amp's corner (perspective-origin shifts there) so it reads as the camera
travelling to the amp. */
.rb-room-camera{ position:absolute; inset:0; perspective:1300px; perspective-origin:50% 41%;
transition:perspective-origin .55s cubic-bezier(.33,0,.2,1); }
/* focus mode — the amp grows by layout (canvas stays crisp + editable). The
3D room stays centred and full-frame, just gently pushed back + dimmed +
blurred behind the amp (left) and the swap rail (right). No perspective
shift / big scale — that left a black void behind the translucent rail. */
#rb-studio-room.rb-focus-active .rb-room-3d{ transform:scale(1.12); opacity:.5; filter:blur(1.5px); }
#rb-studio-room.rb-focus-active .rb-pedalboard{ opacity:0; pointer-events:none; transition:opacity .4s ease; }
/* straightens out (rotateY → 0) + frames the AMP HEAD only: the head fills
the view BIG (knob names read) and the cab runs off the bottom (cut off,
not the focus — cab switching comes later). */
/* sits LEFT of centre so the swap rail (always shown in focus) fits on the
right; head fills the frame, cab runs off the bottom. */
/* multi-amp: only the FOCUSED stack centres + grows; siblings fade out so
the room reads as one amp being edited (default 1-amp rig: this IS the
amp, so behaviour is unchanged). */
/* !important so a FOCUSED extra amp beats its own inline corner-position
style (left/bottom/width/transform) — without it the new amp stayed small
in the corner on focus and you couldn't edit its knobs. On close the rule
stops applying and the inline style returns it to the corner. */
#rb-studio-room.rb-focus-active .rb-amp-stack.rb-amp-focused{
left:37% !important; top:20% !important; bottom:auto !important;
width:min(calc(820px * var(--rb-scale,1)),63%) !important; z-index:6; cursor:default;
transform:translateX(-50%) rotateY(0deg) !important; }
#rb-studio-room.rb-focus-active .rb-amp-stack.rb-amp-focused:hover{ transform:translateX(-50%) rotateY(0deg); filter:none; }
#rb-studio-room.rb-focus-active .rb-amp-stack:not(.rb-amp-focused){ opacity:0 !important; pointer-events:none; }
/* NB: do NOT put `filter` on .rb-amp-extra — a filter on a preserve-3d
element FLATTENS its 3D faces, collapsing the side-depth panel to an
invisible line (the amp looked like a flat photo). The extra amp is a true
MIRROR of the primary, so it needs no dimming anyway. */
/* the right-side amps face INWARD (negative rotateY), so their solid depth
panel must be on the RIGHT edge — the default ::before sits on the left
(correct for the primary amp) and would hide behind a right-facing amp. */
.rb-amp-extra::before{ left:auto; right:0; width:64px;
transform-origin:right center; transform:rotateY(-90deg);
background:linear-gradient(90deg,#090a0c,#22262e); }
.rb-amp-face-canvas{ border-radius:6px; }
/* swap rail — right-docked, translucent-blue carousel of alternative amps */
.rb-swap-panel{ position:absolute; top:0; right:0; bottom:0; width:min(320px,30%); z-index:8;
display:flex; flex-direction:column; gap:12px; padding:16px 14px;
background:linear-gradient(180deg, rgba(48,74,134,.15), rgba(30,52,100,.20));
-webkit-backdrop-filter:blur(6px); backdrop-filter:blur(6px);
border-left:1px solid rgba(120,160,220,.14);
transform:translateX(100%); opacity:0;
transition:transform .35s cubic-bezier(.33,0,.2,1), opacity .3s ease; }
.rb-swap-panel.rb-swap-open{ transform:none; opacity:1; }
.rb-swap-head{ display:flex; align-items:center; gap:8px; flex:0 0 auto; }
.rb-swap-head input{ flex:1; background:rgba(8,14,28,.55); border:1px solid rgba(120,160,220,.22);
border-radius:10px; padding:9px 12px; font-size:12px; color:#dbe4f2; outline:none; }
.rb-swap-head input::placeholder{ color:#7e8aa3; }
.rb-swap-head input:focus{ border-color:rgba(120,170,240,.5); }
.rb-swap-close{ flex:0 0 auto; width:30px; height:30px; border-radius:8px; cursor:pointer;
background:rgba(255,255,255,.05); border:1px solid rgba(255,255,255,.1); color:#aeb8cc; font-size:14px; }
.rb-swap-close:hover{ background:rgba(255,255,255,.12); color:#fff; }
.rb-swap-list{ flex:1 1 auto; overflow-y:auto; overflow-x:hidden;
display:flex; flex-direction:column; gap:8px; padding:44% 4px; scroll-snap-type:y proximity;
-webkit-mask-image:linear-gradient(180deg, transparent, #000 20%, #000 80%, transparent);
mask-image:linear-gradient(180deg, transparent, #000 20%, #000 80%, transparent); }
.rb-swap-list::-webkit-scrollbar{ width:0; height:0; }
.rb-swap-item{ flex:0 0 auto; scroll-snap-align:center; cursor:pointer; transform-origin:center;
display:flex; align-items:center; gap:11px; padding:8px 10px; border-radius:13px;
background:rgba(255,255,255,.03); border:1px solid rgba(255,255,255,.06);
transition:background .15s, border-color .15s, box-shadow .2s; will-change:transform, opacity; }
.rb-swap-item:hover{ background:rgba(120,160,220,.12); }
.rb-swap-item.rb-swap-current{ border-color:rgba(120,170,240,.55);
background:rgba(120,160,220,.15); box-shadow:0 0 22px rgba(80,130,220,.28); }
.rb-swap-thumb{ flex:0 0 auto; width:92px; height:56px; border-radius:8px; overflow:hidden;
background:#0b0d12; display:flex; align-items:center; justify-content:center; }
.rb-swap-thumb img{ width:100%; height:100%; object-fit:contain; }
.rb-swap-name{ flex:1 1 auto; min-width:0; font-size:12.5px; color:#e8eef8; font-weight:500; line-height:1.25;
white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
/* Studio Cab Room: LEFT mic rail — same look/size as the right cab rail. */
.rb-mic-rail{ position:absolute; top:0; left:0; bottom:0; width:min(320px,30%); z-index:8;
display:flex; flex-direction:column; gap:12px; padding:16px 14px;
background:linear-gradient(180deg, rgba(48,74,134,.15), rgba(30,52,100,.20));
-webkit-backdrop-filter:blur(6px); backdrop-filter:blur(6px);
border-right:1px solid rgba(120,160,220,.14);
transform:translateX(-100%); opacity:0;
transition:transform .35s cubic-bezier(.33,0,.2,1), opacity .3s ease; }
.rb-mic-rail.rb-swap-open{ transform:none; opacity:1; }
.rb-mic-list{ flex:1 1 auto; overflow-y:auto; display:flex; flex-direction:column; gap:8px; padding:2px; }
.rb-mic-list::-webkit-scrollbar{ width:0; }
.rb-mic-foot{ flex:0 0 auto; display:flex; flex-direction:column; gap:10px;
border-top:1px solid rgba(120,160,220,.14); padding-top:12px; }
.rb-mic-sec{ display:flex; flex-direction:column; gap:6px; }
.rb-mic-h{ font-size:10px; letter-spacing:.12em; text-transform:uppercase; color:#8a97b0; font-weight:700; }
.rb-mic-btns{ display:flex; flex-wrap:wrap; gap:5px; }
/* Studio cab centre: transparent, fills the middle at the cab's real aspect. */
.rb-cab-center{ width:100%; height:100%; display:flex; align-items:center; justify-content:center; }
.rb-cab-fit{ position:relative; max-width:100%; cursor:crosshair; touch-action:none; isolation:isolate; }
.rb-cab-fit > svg{ position:absolute; inset:0; width:100%; height:100%; display:block; }
/* Speaker-cone silhouettes faintly visible through the grille — never block the mic drag.
Two blended layers self-adapt to grille colour: light(screen)=more on dark cabs,
dark(multiply)=subtle on light cabs (see rbCabSpeakerSilhouettesSvg). */
.rb-cab-spk{ pointer-events:none; z-index:2; }
.rb-spk-lite{ mix-blend-mode:screen; }
/* The chosen mic recreated as SVG art, sitting capsule-at-the-point over the
cone. transform-origin near the capsule so the 45° toggle pivots on it. */
.rb-cabmic{ position:absolute; width:34px; height:96px; transform:translate(-50%,-16%);
transform-origin:50% 10%; z-index:3; pointer-events:none;
filter:drop-shadow(0 6px 11px rgba(0,0,0,.6)); transition:transform .18s ease; }
.rb-cabmic svg{ width:100%; height:100%; display:block; }
.rb-cabmic-ang{ transform:translate(-50%,-16%) rotate(38deg); }
/* Mic rail thumbnail: reuse the portrait art laid diagonally like a product shot. */
.rb-mic-swap-thumb{ overflow:hidden; }
.rb-mic-thumb{ width:100%; height:100%; display:flex; align-items:center; justify-content:center; }
.rb-mic-thumb svg{ height:158%; width:auto; transform:rotate(50deg); }
/* floating control bar shown in focus mode */
.rb-focus-bar2{ position:absolute; top:0; left:0; right:0; z-index:7; display:flex; align-items:center;
justify-content:space-between; gap:10px; padding:24px 52px; opacity:0; pointer-events:none;
transition:opacity .25s ease; }
.rb-focus-bar2.rb-focus-open{ opacity:1; }
.rb-focus-bar2 > *{ pointer-events:auto; }
.rb-focus-bar2 .rb-focus-title{ flex:1; text-align:center; }
.rb-focus-bar2 button{ font-size:12.5px; padding:8px 14px; border-radius:9px; color:#dbe2ee; cursor:pointer;
background:rgba(255,255,255,.07); border:1px solid rgba(255,255,255,.14); transition:.15s; white-space:nowrap; }
.rb-focus-bar2 button:hover{ background:rgba(255,255,255,.16); color:#fff; }
.rb-focus-bar2 .rb-focus-back{ background:rgba(120,160,220,.16); border-color:rgba(120,170,240,.4); color:#eaf1fb; }
.rb-focus-bar2 .rb-focus-remove{ background:rgba(200,70,70,.16); border-color:rgba(220,95,95,.42); color:#f4d4d4; }
.rb-focus-bar2 .rb-focus-remove:hover{ background:rgba(212,72,72,.30); color:#fff; }
/* "Open the plugin's real window" chip, top-centre of the focused gear. Uses
the SAME visual language as .rb-studio-adv-btn so it reads as part of the
game's UI, not a bolted-on overlay. Only shown for gear ADDED as a VST
(a plugin the user brought in — not the game's bundled gear). */
.rb-studio-realui-btn{ position:absolute; top:14px; left:50%; transform:translateX(-50%);
z-index:21; cursor:pointer; white-space:nowrap;
padding:7px 13px; border-radius:9px; font-size:13px; font-weight:500; color:#cfe0ff;
background:rgba(30,46,76,.62); border:1px solid rgba(120,170,240,.34);
box-shadow:0 6px 18px rgba(0,0,0,.4); backdrop-filter:blur(6px);
transition:background .15s, color .15s, transform .12s; }
.rb-studio-realui-btn:hover{ background:rgba(48,72,118,.8); color:#fff; transform:translateX(-50%) translateY(-1px); }
#rb-stage-wrap.rb-songbar-on .rb-studio-realui-btn{ top:58px; }
/* amp face = the VST's own canvas UI render, sitting on the cab */
.rb-amp-face{ border-radius:8px 8px 4px 4px; overflow:hidden;
border:1px solid rgba(255,255,255,.09); background:#0e0f12;
box-shadow:inset 0 1px 0 rgba(255,255,255,.08), 0 10px 22px rgba(0,0,0,.55); }
.rb-amp-face img{ width:100%; display:block; }
/* ── Rack tower on a table — set back against the RIGHT WALL, on the wood
floor, angled almost to the left (faces into the room) ── */
.rb-rack-zone{ position:absolute; right:11%; bottom:6%; width:min(calc(280px * var(--rb-scale,1)),26%); cursor:pointer;
transform-style:preserve-3d; transform:translateZ(150px) rotateY(-88deg);
transform-origin:bottom right; transition:opacity .4s ease, filter .2s; }
/* highlight only the placeholder on hover — a filter on the preserve-3d zone
would flatten it and make the table's 3D faces vanish */
.rb-rack-zone.rb-rack-empty:hover .rb-rack-placeholder{ color:var(--rb-accent); border-color:var(--rb-accent); }
/* a long WOODEN desk: a top slab (front edge + horizontal top surface) on legs */
.rb-rack-table{ position:absolute; left:0; right:0; bottom:0; height:calc(92px * var(--rb-scale,1)); transform-style:preserve-3d; }
/* front edge of the top (the thickness seen straight on) — wood */
.rb-rack-tabletop{ position:absolute; left:-4%; right:-4%; bottom:calc(76px * var(--rb-scale,1)); height:calc(14px * var(--rb-scale,1)); transform-style:preserve-3d;
background:
repeating-linear-gradient(90deg, rgba(0,0,0,.16) 0 1px, transparent 1px 26px),
linear-gradient(180deg,#5e4124,#3a2614);
border-radius:2px; box-shadow:0 14px 26px rgba(0,0,0,.5); }
/* the horizontal TOP surface (wood planks), lying flat, extending back */
.rb-rack-tabletop::before{ content:""; position:absolute; left:0; right:0; bottom:100%; height:calc(64px * var(--rb-scale,1));
transform-origin:bottom center; transform:rotateX(90deg);
background:
repeating-linear-gradient(90deg, rgba(0,0,0,.20) 0 2px, transparent 2px 30px),
linear-gradient(180deg,#6e4c2b,#49301a);
box-shadow:inset 0 0 44px rgba(0,0,0,.3); }
/* thin dark underside */
.rb-rack-tabletop::after{ content:""; position:absolute; left:0; right:0; top:100%; height:5px;
background:#241809; }
.rb-rack-leg{ position:absolute; bottom:0; height:calc(78px * var(--rb-scale,1)); width:calc(13px * var(--rb-scale,1));
background:linear-gradient(90deg,#5a3d22,#2a1c0e);
border-radius:0 0 2px 2px; box-shadow:2px 7px 11px rgba(0,0,0,.5); }
.rb-rack-leg-back{ transform:translateZ(calc(-60px * var(--rb-scale,1))); filter:brightness(.6); }
/* rack tower sits on the FAR end of the desk (near end left open) */
.rb-rack-stack{ position:absolute; left:4%; width:56%; bottom:calc(90px * var(--rb-scale,1)); display:flex; flex-direction:column-reverse;
align-items:center; gap:2px; transform-style:preserve-3d; }
/* each rack is its own 3D box: a right SIDE face + a TOP face give it depth.
The box hugs its image (capped height) so a tall/portrait rack like the
G-550 EQ stays a thin, short unit instead of towering. */
.rb-rack{ max-width:100%; cursor:pointer; position:relative; border-radius:2px;
transform-style:preserve-3d; transition:filter .2s; box-shadow:0 2px 7px rgba(0,0,0,.55); }
.rb-rack::after{ content:""; position:absolute; top:0; bottom:0; right:0; width:calc(44px * var(--rb-scale,1));
transform-origin:right center; transform:rotateY(-90deg);
background:linear-gradient(90deg,#2b2f35,#0a0b0d);
box-shadow:inset 0 0 16px rgba(0,0,0,.5); }
.rb-rack::before{ content:""; position:absolute; left:0; right:0; bottom:100%; height:calc(44px * var(--rb-scale,1));
transform-origin:bottom center; transform:rotateX(90deg);
background:linear-gradient(180deg,#3a3f47,#16191d); }
/* hover brightens the FACES only — a filter on the preserve-3d .rb-rack would
flatten it and make the depth faces vanish */
.rb-rack:hover > img, .rb-rack:hover::after, .rb-rack:hover::before{ filter:brightness(1.18); }
.rb-rack img{ display:block; width:auto; height:auto; max-width:100%; max-height:calc(66px * var(--rb-scale,1)); border-radius:2px; }
.rb-rack-fallback{ height:42px; display:flex; align-items:center; justify-content:center; text-align:center;
padding:4px; font-size:11px; color:#9aa3af; border-radius:2px;
background:linear-gradient(180deg,#1c1f24,#101114); border:1px solid rgba(255,255,255,.06); }
.rb-rack-bypassed{ opacity:.45; filter:grayscale(.6); }
.rb-rack-placeholder{ height:calc(78px * var(--rb-scale,1)); min-width:calc(96px * var(--rb-scale,1));
display:flex; align-items:center; justify-content:center;
color:#9fb4d6; font-size:calc(15px * var(--rb-scale,1)); font-weight:700; letter-spacing:.03em;
border-radius:7px; border:2px dashed rgba(120,170,240,.42); background:rgba(30,46,76,.3);
transition:color .15s, border-color .15s, background .15s; }
/* contact shadow under the rack table */
.rb-rack-ground{ position:absolute; right:12%; bottom:4%; width:calc(230px * var(--rb-scale,1)); height:calc(30px * var(--rb-scale,1)); pointer-events:none;
transform:translateZ(-35px) rotateX(66deg) rotateZ(-12deg); transform-origin:bottom right;
background:radial-gradient(ellipse 50% 50% at 50% 50%, rgba(0,0,0,.6), transparent 72%);
filter:blur(8px); transition:opacity .4s ease; }
#rb-studio-room.rb-focus-active .rb-rack-zone,
#rb-studio-room.rb-focus-active .rb-rack-ground{ opacity:0; pointer-events:none; transition:opacity .4s ease; }
/* ── Room props (decorative) — hidden while focused ── */
#rb-studio-room.rb-focus-active .rb-ceil-cloud{ opacity:0; pointer-events:none; transition:opacity .4s ease; }
/* acoustic cloud panel hanging from the ceiling (centre) */
.rb-ceil-cloud{ position:absolute; top:8%; left:35%; right:35%; height:24px; z-index:1; pointer-events:none;
transform:rotateX(34deg); transform-origin:top center; border-radius:5px;
background:linear-gradient(180deg,#3c424a,#22262c);
box-shadow:0 16px 28px rgba(0,0,0,.5), inset 0 1px 0 rgba(255,255,255,.06); }
.rb-ceil-cloud::before, .rb-ceil-cloud::after{ content:""; position:absolute; bottom:100%; width:2px; height:30px;
background:linear-gradient(180deg,rgba(180,185,195,.5), rgba(180,185,195,.15)); }
.rb-ceil-cloud::before{ left:20%; }
.rb-ceil-cloud::after{ right:20%; }
/* pedalboard = a SLIM angled platform on the floor; pedals stand proud of it.
Width grows with the pedals (each sized by HEIGHT so landscape pedals like
Q-Trix read big), capped so it never spans the whole floor. */
.rb-pedalboard{ position:absolute; left:50%; bottom:6%; width:fit-content;
min-width:min(170px,17%); max-width:74%; min-height:26px; cursor:pointer;
transform:translateX(-50%) rotateX(40deg);
transform-origin:bottom center; transform-style:preserve-3d;
display:flex; gap:calc(18px * var(--rb-scale,1)); align-items:flex-end; justify-content:center;
padding:calc(8px * var(--rb-scale,1)) calc(18px * var(--rb-scale,1)) calc(6px * var(--rb-scale,1)); border-radius:9px; transition:opacity .4s ease, filter .2s; }
.rb-pedalboard-empty:hover{ filter:brightness(1.25); }
/* "+ pedals" prompt on the empty pedalboard (matches the +amp / +rack). */
.rb-pedal-placeholder{ height:calc(46px * var(--rb-scale,1)); min-width:calc(104px * var(--rb-scale,1));
display:flex; align-items:center; justify-content:center;
color:#9fb4d6; font-size:calc(13px * var(--rb-scale,1)); font-weight:700; letter-spacing:.03em;
border:2px dashed rgba(120,170,240,.42); border-radius:8px; background:rgba(30,46,76,.28);
transition:color .15s, border-color .15s, background .15s; }
.rb-pedalboard-empty:hover .rb-pedal-placeholder{ color:var(--rb-accent); border-color:var(--rb-accent); background:rgba(48,72,118,.42); }
.rb-pedalboard{
background:
repeating-linear-gradient(90deg, rgba(0,0,0,.30) 0 3px, transparent 3px 27px),
linear-gradient(180deg,#1b1d22,#0c0d0f);
border:1px solid rgba(255,255,255,.07);
box-shadow:inset 0 1px 0 rgba(255,255,255,.06), inset 0 -8px 20px rgba(0,0,0,.55); }
/* short extruded front lip = a thin platform edge (no longer a thick block) */
.rb-pedalboard::after{ content:''; position:absolute; left:-1px; right:-1px; bottom:0; height:11px;
transform-origin:bottom center; transform:rotateX(-90deg);
background:linear-gradient(180deg,#26282d,#0f1012);
border-radius:0 0 9px 9px; box-shadow:inset 0 0 14px rgba(0,0,0,.55); }
/* contact shadow under the board */
.rb-pedalboard::before{ content:''; position:absolute; inset:-8% -4% -22% -4%; z-index:-1;
background:radial-gradient(ellipse 60% 60% at 50% 62%, rgba(0,0,0,.6), transparent 72%); filter:blur(8px); }
/* pedals STAND PROUD of the board (translateZ so the edge can't cover them),
facing front + tilted up; extruded side + front faces give the 3D box.
Hover only brightens (no resize — like the amp). */
/* contain pedals in a small box: landscape (Q-Trix) fills width, portrait
fills height — consistent, not giant. --rb-d = extrusion depth. The two
skewed pseudo faces (bottom-front + right side) form a real 3D box, each
shaded differently and tinted with the pedal's own colour (--rb-edge). */
.rb-pedal{ flex:0 0 auto; cursor:pointer; position:relative; transform:translateZ(calc(8px * var(--rb-scale,1))) rotateX(2deg);
transition:filter .2s; --rb-d:calc(5px * var(--rb-scale,1)); }
.rb-pedal:hover{ filter:brightness(1.16); }
.rb-pedal img{ max-width:calc(94px * var(--rb-scale,1)); max-height:calc(66px * var(--rb-scale,1)); width:auto; height:auto; display:block;
border-radius:6px 6px 2px 2px; position:relative; z-index:1;
box-shadow:0 0 0 1px rgba(255,255,255,.07), 14px 30px 24px rgba(0,0,0,.55); }
/* bottom-front face (lighter) */
.rb-pedal::after{ content:''; position:absolute; left:0; top:100%; width:100%; height:var(--rb-d);
background:var(--rb-edge,#15171b); filter:brightness(.74);
transform:skewX(45deg); transform-origin:top left; z-index:0; border-radius:0 0 2px 2px; }
/* right side face (darker) */
.rb-pedal::before{ content:''; position:absolute; top:0; left:100%; width:var(--rb-d); height:100%;
background:var(--rb-edge,#15171b); filter:brightness(.5);
transform:skewY(45deg); transform-origin:top left; z-index:0; border-radius:0 3px 2px 0; }
.rb-pedal > .rb-pedal-fallback{ width:calc(60px * var(--rb-scale,1)); height:calc(66px * var(--rb-scale,1)); }
.rb-pedal-fallback{ height:calc(116px * var(--rb-scale,1)); border-radius:8px; display:flex; align-items:center;
justify-content:center; text-align:center; padding:8px; font-size:10px; color:#9aa3af;
background:linear-gradient(180deg,#1c1f24,#101114); border:1px solid rgba(255,255,255,.07); }
.rb-pedal-bypassed{ opacity:.4; filter:grayscale(.7) drop-shadow(0 14px 11px rgba(0,0,0,.5)); }
.rb-pedal-add{ width:calc(92px * var(--rb-scale,1)); height:calc(112px * var(--rb-scale,1)); border-radius:8px; cursor:pointer; transform:rotateX(-20deg);
display:flex; flex-direction:column; align-items:center; justify-content:center; gap:4px;
color:#7c848f; font-size:11px; background:rgba(255,255,255,.015);
border:1.5px dashed rgba(255,255,255,.12); transition:border-color .2s, color .2s; }
.rb-pedal-add:hover{ border-color:var(--rb-accent); color:var(--rb-accent); }
/* ── Pedal focus (Phase 3): one pedal large + chain nav + swap rail ── */
/* hide the amp + its depth while editing a pedal */
#rb-studio-room.rb-pfocus .rb-amp-stack,
#rb-studio-room.rb-pfocus .rb-amp-stack::before,
#rb-studio-room.rb-pfocus .rb-amp-ground{ opacity:0 !important; pointer-events:none; }
/* ── Pedal / rack focus — NO amp grow (that's amp-focus / rb-focus-active
only). The backdrop is the surface the focused gear actually lives on,
blurred: PEDALS sit on the FLOOR → the wood floor + carpet fill the frame;
RACKS stand against the RIGHT WALL → that wall fills the frame. The group's
own piece of furniture (pedalboard / rack desk) stays as a blurred, EMPTIED
prop; the units being swapped are shown big up top (coverflow + right
rail). Blur lives on .rb-room-camera so the whole 3D backdrop softens
together while the big focused unit (a sibling OUTSIDE the camera) stays
sharp. NB: .rb-pedalboard/.rb-rack-zone are preserve-3d → only fully hide
(opacity:0) or fully show (opacity:1) them, never partial. ── */
#rb-studio-room.rb-pfocus .rb-room-camera{ filter:blur(2px); will-change:filter;
transition:filter .45s ease, perspective-origin .5s cubic-bezier(.33,0,.2,1); }
#rb-studio-room.rb-pfocus .rb-room-3d{ transform:none; opacity:1; filter:none; }
#rb-studio-room.rb-pfocus .rb-ceil3d,
#rb-studio-room.rb-pfocus .rb-ceil-cloud{ opacity:0; pointer-events:none; transition:opacity .4s ease; }
/* hide ALL stage gear; each group re-shows only its own (emptied) furniture */
#rb-studio-room.rb-pfocus .rb-studio-stage > *{ opacity:0 !important; pointer-events:none; }
/* PEDAL: aim down at the floor — hide every wall, stand the wood floor up so
the carpet backs the frame, show the (emptied) enlarged pedalboard. */
#rb-studio-room.rb-pfocus.rb-gfocus-pedal .rb-room-camera{ perspective-origin:50% 60%; }
#rb-studio-room.rb-pfocus.rb-gfocus-pedal .rb-wall{ opacity:0; transition:opacity .4s ease; }
#rb-studio-room.rb-pfocus.rb-gfocus-pedal .rb-floor3d{ transform:rotateX(28deg) scale(1.2);
transition:transform .5s cubic-bezier(.33,0,.2,1); }
#rb-studio-room.rb-pfocus.rb-gfocus-pedal .rb-pedalboard{ opacity:1 !important;
transform:translateX(-50%) rotateX(40deg) scale(1.85);
transition:transform .5s cubic-bezier(.33,0,.2,1), opacity .4s ease; }
#rb-studio-room.rb-pfocus.rb-gfocus-pedal .rb-pedalboard .rb-pedal,
#rb-studio-room.rb-pfocus.rb-gfocus-pedal .rb-pedalboard .rb-pedal-add{ opacity:0 !important; }
/* RACK: the LATERAL (right) wall — where the racks live — swung flat to face
the camera FRONTALLY and stretched to fill the frame. NOT the centre/back
wall (no wood panel). Hide the back + left walls + floor + ceiling; the
rack desk drops to FRONTAL, low + large, reading as the table the (big,
up-top) rack sits on. */
#rb-studio-room.rb-pfocus.rb-gfocus-rack .rb-room-camera{ perspective-origin:50% 50%; }
#rb-studio-room.rb-pfocus.rb-gfocus-rack .rb-wall-back,
#rb-studio-room.rb-pfocus.rb-gfocus-rack .rb-wall-left,
#rb-studio-room.rb-pfocus.rb-gfocus-rack .rb-floor3d{ opacity:0; transition:opacity .4s ease; }
/* uniform scale (NOT a full-width stretch) so the acoustic panels keep their
tall, long proportions instead of squashing wide + compact */
#rb-studio-room.rb-pfocus.rb-gfocus-rack .rb-wall-right{
transform:rotateY(0deg) scale(1.7); transform-origin:right center;
filter:brightness(.92); transition:transform .5s cubic-bezier(.33,0,.2,1); }
#rb-studio-room.rb-pfocus.rb-gfocus-rack .rb-rack-zone{ opacity:1 !important;
left:50%; right:auto; bottom:-3%; width:min(560px,54%);
transform:translateX(-50%) rotateY(0deg) scale(1.6); transform-origin:bottom center;
transition:transform .5s cubic-bezier(.33,0,.2,1), opacity .4s ease; }
#rb-studio-room.rb-pfocus.rb-gfocus-rack .rb-rack-zone .rb-rack{ opacity:0 !important; }
#rb-studio-room.rb-focus-active .rb-room-3d{ will-change:transform, opacity, filter; }
#rb-studio-room.rb-pfocus .rb-pf-stage{ will-change:transform; }
/* focus layer sits LEFT of centre (right swap rail has room); column =
coverflow row on top, dots + Add/Remove buttons underneath. */
.rb-pedal-focus{ position:absolute; inset:0; z-index:6; display:flex; flex-direction:column;
align-items:center; justify-content:center; gap:18px; padding-right:32%;
opacity:0; pointer-events:none; transition:opacity .3s ease; }
.rb-pedal-focus.rb-pf-open{ opacity:1; }
.rb-pedal-focus > *, .rb-pedal-focus .rb-pf-side, .rb-pedal-focus button{ pointer-events:auto; }
/* coverflow row: prev (small/blur) · current (big) · next (small/blur) */
.rb-pf-row{ display:flex; align-items:center; justify-content:center; gap:20px; width:100%; }
/* zoom-in: the big pedal grows small → full as focus opens ("se acerque") */
.rb-pf-stage{ flex:0 0 auto; width:min(calc(320px * var(--rb-scale,1)),34%); transform:scale(.78);
transition:transform .38s cubic-bezier(.33,0,.2,1); }
.rb-pedal-focus.rb-pf-open .rb-pf-stage{ transform:scale(1); }
.rb-pf-pedal{ width:100%; border-radius:12px; overflow:hidden;
box-shadow:0 30px 70px -20px rgba(0,0,0,.85); }
.rb-pf-pedal img, .rb-pf-pedal canvas{ width:100%; display:block; }
.rb-pf-empty{ aspect-ratio:1/1.05; display:flex; align-items:center; justify-content:center;
text-align:center; padding:22px; font-size:13px; color:#9fb0cc; line-height:1.5;
background:linear-gradient(180deg,#1c2026,#101318); border:1.5px dashed rgba(120,160,220,.32); }
/* neighbour pedals — smaller, faded + blurred, click to slide along */
.rb-pf-side{ flex:0 0 auto; width:min(calc(132px * var(--rb-scale,1)),14%); cursor:pointer; opacity:.42;
filter:blur(2.4px); transform:scale(.9); transition:opacity .2s, filter .2s, transform .2s; }
.rb-pf-side:hover{ opacity:.72; filter:blur(1.1px); transform:scale(.96); }
.rb-pf-side img{ width:100%; display:block; border-radius:10px;
box-shadow:0 18px 40px -16px rgba(0,0,0,.8); }
.rb-pf-side-empty{ visibility:hidden; pointer-events:none; }
/* "+" add tile to the right of the last pedal (replaces the Add button) */
.rb-pf-side-add{ flex:0 0 auto; width:min(calc(96px * var(--rb-scale,1)),11%); aspect-ratio:1/1.05; cursor:pointer;
display:flex; align-items:center; justify-content:center; font-size:34px; line-height:1;
color:#8fa0bd; border:2px dashed rgba(120,160,220,.32); border-radius:12px;
background:rgba(120,160,220,.06); transition:color .15s, border-color .15s, background .15s; }
.rb-pf-side-add:hover{ color:#fff; border-color:rgba(140,180,250,.6); background:rgba(120,160,220,.16); }
.rb-pf-bottom{ display:flex; flex-direction:column; align-items:center; gap:13px; }
.rb-pf-dots{ display:flex; gap:7px; justify-content:center; }
.rb-pf-dots span{ width:7px; height:7px; border-radius:50%; background:rgba(255,255,255,.22);
transition:background .15s; }
.rb-pf-dots span.on{ background:var(--rb-accent); box-shadow:0 0 8px var(--rb-accent); }
.rb-pf-actions{ display:flex; gap:16px; align-items:center; justify-content:center; }
/* centre column: Pre/Post on top, Remove underneath it */
.rb-pf-center{ display:flex; flex-direction:column; gap:8px; align-items:center; }
.rb-pf-actions button{ font-size:12.5px; padding:8px 16px; border-radius:9px; color:#dbe2ee; cursor:pointer;
background:rgba(255,255,255,.07); border:1px solid rgba(255,255,255,.14); transition:.15s; }
.rb-pf-actions button:hover{ background:rgba(255,255,255,.16); color:#fff; }
.rb-pf-actions button:disabled{ opacity:.32; cursor:default; background:rgba(255,255,255,.04); }
.rb-pf-actions button:disabled:hover{ color:#dbe2ee; background:rgba(255,255,255,.04); }
.rb-pf-actions .rb-focus-remove{ background:rgba(200,70,70,.16); border-color:rgba(220,95,95,.42); color:#f4d4d4; }
.rb-pf-actions .rb-focus-remove:hover{ background:rgba(212,72,72,.30); color:#fff; }
/* pre/post-amp toggle: green = before the amp, cyan = after it */
.rb-pf-actions .rb-pf-slot-pre{ background:rgba(52,180,120,.18); border-color:rgba(74,210,150,.4); color:#bff0d6; }
.rb-pf-actions .rb-pf-slot-pre:hover{ background:rgba(52,180,120,.3); color:#fff; }
.rb-pf-actions .rb-pf-slot-post{ background:rgba(56,150,210,.18); border-color:rgba(90,180,240,.4); color:#cfe6f8; }
.rb-pf-actions .rb-pf-slot-post:hover{ background:rgba(56,150,210,.3); color:#fff; }
/* room header overlay */
.rb-studio-head{ position:absolute; top:0; left:0; right:0; z-index:3;
display:flex; align-items:center; justify-content:space-between;
padding:14px 18px; pointer-events:none; }
.rb-studio-head > *{ pointer-events:auto; }
.rb-studio-label{ font-size:11px; letter-spacing:.14em; text-transform:uppercase; color:#8b929c; }
.rb-studio-label b{ color:#e6e9ee; font-weight:600; }
/* amp focus overlay (Phase 2 — zoom to real knobs) */
.rb-studio-focus{ position:absolute; inset:0; z-index:5; display:flex; align-items:center; justify-content:center;
background:radial-gradient(60% 60% at 50% 45%, rgba(10,11,14,.55), rgba(7,8,10,.92));
-webkit-backdrop-filter:blur(3px); backdrop-filter:blur(3px);
opacity:0; transition:opacity .22s ease; }
.rb-studio-focus.rb-focus-open{ opacity:1; }
.rb-focus-panel{ width:min(880px,94%); border-radius:16px; padding:18px 22px 26px;
background:linear-gradient(180deg,#23272e,#15171b);
border:1px solid rgba(255,255,255,.09);
box-shadow:inset 0 1px 0 rgba(255,255,255,.09), 0 30px 70px -20px rgba(0,0,0,.8);
transform:translateY(10px) scale(.96); transition:transform .22s ease; }
.rb-studio-focus.rb-focus-open .rb-focus-panel{ transform:none; }
.rb-focus-bar{ display:flex; align-items:center; justify-content:space-between; gap:10px; margin-bottom:18px; }
.rb-focus-title{ font-size:13px; letter-spacing:.1em; text-transform:uppercase; color:#e6e9ee; font-weight:600;
white-space:nowrap; overflow:hidden; text-overflow:ellipsis; flex:1; text-align:center; }
.rb-focus-bar button{ font-size:11px; padding:6px 10px; border-radius:8px; color:#cbd2dc; cursor:pointer;
background:rgba(255,255,255,.04); border:1px solid rgba(255,255,255,.08); transition:.15s; white-space:nowrap; }
.rb-focus-bar button:hover{ background:rgba(255,255,255,.09); color:#fff; }
.rb-focus-back{ color:#8b929c !important; }
.rb-focus-actions{ display:flex; gap:7px; }
.rb-focus-knobs{ display:flex; flex-wrap:wrap; gap:16px 24px; justify-content:center; align-items:flex-start;
padding:8px 4px 4px; min-height:108px; }
.rb-focus-knob{ display:flex; flex-direction:column; align-items:center; gap:6px; width:84px; }
.rb-focus-knob-label{ font-size:10px; letter-spacing:.03em; color:#9aa3af; text-align:center; max-width:84px;
white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
/* ── Advanced: node-graph routing editor ─────────────────────────────── */
#rb-tab-advanced.rb-adv{ padding:0; overflow:hidden; }
.rb-adv-wrap{ position:absolute; inset:0; display:flex; }
/* left gear palette (like Gear) */
.rb-adv-palette{ flex:0 0 232px; display:flex; flex-direction:column; min-height:0;
background:linear-gradient(180deg, rgba(40,62,112,.22), rgba(20,36,72,.26));
border-right:1px solid rgba(120,165,225,.16); }
.rb-adv-pal-head{ flex:0 0 auto; padding:12px 12px 8px; display:flex; flex-direction:column; gap:8px;
border-bottom:1px solid rgba(120,165,225,.12); }
.rb-adv-pal-filters{ display:flex; gap:4px; flex-wrap:wrap; }
.rb-adv-pal-chip{ border:1px solid rgba(120,170,240,.24); border-radius:8px; padding:5px 9px; font-size:12px;
color:#bcc8de; background:rgba(120,160,220,.1); cursor:pointer; transition:background .15s, color .15s; }
.rb-adv-pal-chip:hover{ color:#fff; background:rgba(120,160,220,.2); }
.rb-adv-pal-chip.rb-adv-pal-on{ color:#fff; background:rgba(120,160,220,.34); box-shadow:inset 0 0 0 1px rgba(140,180,250,.5); }
.rb-adv-pal-head input{ background:rgba(8,14,28,.55); border:1px solid rgba(120,160,220,.22); border-radius:9px;
padding:8px 11px; font-size:12.5px; color:#dbe4f2; outline:none; }
.rb-adv-pal-head input::placeholder{ color:#7e8aa3; }
.rb-adv-palette-list{ flex:1 1 auto; overflow-y:auto; padding:8px; display:flex; flex-direction:column; gap:6px; }
.rb-adv-pal-item{ display:flex; align-items:center; gap:9px; padding:6px 8px; border-radius:10px; cursor:grab;
background:rgba(255,255,255,.03); border:1px solid rgba(255,255,255,.06); transition:background .15s, border-color .15s; }
.rb-adv-pal-item:active{ cursor:grabbing; }
/* ghost that follows the cursor while dragging a palette gear onto the canvas */
.rb-adv-drag-ghost{ position:fixed; z-index:9999; pointer-events:none; transform:translate(-50%,-50%);
padding:6px 12px; border-radius:9px; font-size:12.5px; font-weight:600; color:#eaf1fb; white-space:nowrap;
background:rgba(48,72,118,.94); border:1px solid rgba(120,170,240,.6); box-shadow:0 6px 18px rgba(0,0,0,.5); }
.rb-adv-pal-item:hover{ background:rgba(120,160,220,.14); border-color:rgba(120,170,240,.4); }
.rb-adv-pal-item:active{ cursor:grabbing; }
.rb-adv-pal-thumb{ flex:0 0 auto; width:52px; height:34px; border-radius:6px; overflow:hidden; background:#0b0d12;
display:flex; align-items:center; justify-content:center; }
.rb-adv-pal-thumb img{ width:100%; height:100%; object-fit:contain; -webkit-user-drag:none; user-select:none; }
.rb-adv-pal-ph{ font-size:11px; font-weight:600; letter-spacing:.06em; color:#6f7a88; }
.rb-adv-pal-name{ flex:1 1 auto; min-width:0; font-size:12px; color:#dbe4f2; line-height:1.2;
overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.rb-adv-pal-empty{ color:#7e8aa3; font-size:12px; padding:14px 8px; text-align:center; }
/* main canvas area */
.rb-adv-main{ flex:1 1 auto; display:flex; flex-direction:column; min-width:0; position:relative; }
.rb-adv-toolbar{ flex:0 0 auto; display:flex; align-items:center; justify-content:space-between; gap:10px;
padding:10px 16px; border-bottom:1px solid rgba(120,165,225,.12); }
.rb-adv-hint{ font-size:12px; color:#8b96ad; }
.rb-adv-actions{ display:flex; gap:7px; }
.rb-adv-btn{ font-size:12px; padding:6px 12px; border-radius:8px; color:#dbe2ee; cursor:pointer;
background:rgba(255,255,255,.06); border:1px solid rgba(255,255,255,.14); transition:.15s; }
.rb-adv-btn:hover{ background:rgba(120,160,220,.2); color:#fff; }
.rb-adv-canvas{ flex:1 1 auto; position:relative; overflow:auto;
background:
radial-gradient(circle at 18px 18px, rgba(120,160,220,.10) 1.4px, transparent 1.6px) 0 0 / 34px 34px,
linear-gradient(180deg, rgba(8,12,22,.30), rgba(6,9,16,.42)); }
/* sizer wrapper: holds the scroll size (w*zoom); the two layers inside are
transform:scale'd so scrolling works at any zoom. */
.rb-adv-zoom{ position:relative; }
.rb-adv-cables{ position:absolute; top:0; left:0; pointer-events:none; z-index:1; overflow:visible; }
/* the nodes layer is ON TOP of the cables (z-index:2); make its EMPTY area
click-through (pointer-events:none) so the cables below get hover/click —
the node boxes re-enable pointer-events so they stay interactive. */
.rb-adv-nodes{ position:absolute; top:0; left:0; z-index:2; pointer-events:none; }
/* a node = a gear box with an input jack (left) + output jack (right) */
.rb-adv-node{ position:absolute; width:128px; border-radius:12px; cursor:grab; user-select:none;
pointer-events:auto;
background:linear-gradient(180deg, rgba(30,42,66,.96), rgba(18,26,44,.97));
border:1px solid rgba(120,165,225,.28); box-shadow:0 10px 26px rgba(0,0,0,.5);
transition:box-shadow .15s, border-color .15s; }
.rb-adv-node:hover{ border-color:rgba(140,180,250,.6); box-shadow:0 12px 30px rgba(40,80,160,.4); }
.rb-adv-node.rb-adv-sel{ border-color:var(--rb-accent); box-shadow:0 0 0 1px var(--rb-accent), 0 12px 30px rgba(0,0,0,.55); }
.rb-adv-node:active{ cursor:grabbing; }
/* bypassed gear = passthrough; greyed out (saturation 0) */