@brett_lamy/docstream 1.11.0 → 1.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/styles.css CHANGED
@@ -661,65 +661,157 @@
661
661
  cursor: pointer;
662
662
  }
663
663
 
664
+ /* The rack is hardware, so it is dark in both themes: a brushed-steel 19" frame with screwed rack ears,
665
+ anodized modules with silkscreened labels, rubber knobs with LED rings, channel faders, backlit pads,
666
+ TR-style step keys and green LCDs. */
664
667
  .strudel-rack {
665
- --strudel-accent: var(--gb-primary, #6366f1);
668
+ --strudel-accent: #36d6ff;
669
+ --strudel-amber: #ff9d1c;
670
+ --strudel-red: #ff4433;
671
+ --strudel-lcd: #9dff9a;
672
+ --strudel-silk: #d9dde4;
673
+ --strudel-ear: 22px;
674
+ position: relative;
666
675
  display: flex;
667
676
  flex-direction: column;
668
- gap: 8px;
669
- padding: 10px;
670
- border: 1px solid var(--gb-border);
671
- border-radius: 12px;
672
- background: var(--gb-muted, #f4f4f5);
677
+ gap: 10px;
678
+ padding: 12px calc(var(--strudel-ear) + 10px);
679
+ border-radius: 8px;
680
+ color: var(--strudel-silk);
673
681
  font-size: 12px;
682
+ font-family: "Helvetica Neue", Arial, system-ui, sans-serif;
683
+ background:
684
+ /* rack ears: four screws */
685
+ radial-gradient(circle at calc(var(--strudel-ear) / 2) 18px, #e7e9ee 0 2px, #6b7079 2.5px 4px, transparent 4.5px),
686
+ radial-gradient(circle at calc(var(--strudel-ear) / 2) calc(100% - 18px), #e7e9ee 0 2px, #6b7079 2.5px 4px, transparent 4.5px),
687
+ radial-gradient(circle at calc(100% - var(--strudel-ear) / 2) 18px, #e7e9ee 0 2px, #6b7079 2.5px 4px, transparent 4.5px),
688
+ radial-gradient(circle at calc(100% - var(--strudel-ear) / 2) calc(100% - 18px), #e7e9ee 0 2px, #6b7079 2.5px 4px, transparent 4.5px),
689
+ /* ear plates */
690
+ linear-gradient(90deg, #9da2ab 0, #c9ccd2 9px, #8e939c var(--strudel-ear), rgb(0 0 0 / 0.5) var(--strudel-ear), transparent calc(var(--strudel-ear) + 2px)) left / calc(var(--strudel-ear) + 2px) 100% no-repeat,
691
+ linear-gradient(270deg, #9da2ab 0, #c9ccd2 9px, #8e939c var(--strudel-ear), rgb(0 0 0 / 0.5) var(--strudel-ear), transparent calc(var(--strudel-ear) + 2px)) right / calc(var(--strudel-ear) + 2px) 100% no-repeat,
692
+ /* brushed steel */
693
+ repeating-linear-gradient(0deg, rgb(255 255 255 / 0.025) 0 1px, transparent 1px 3px),
694
+ linear-gradient(180deg, #3a3d44, #24262b 30%, #1b1c20);
695
+ box-shadow:
696
+ inset 0 1px 0 rgb(255 255 255 / 0.18),
697
+ inset 0 -1px 0 rgb(0 0 0 / 0.6),
698
+ 0 1px 0 rgb(255 255 255 / 0.4),
699
+ 0 10px 24px -8px rgb(0 0 0 / 0.55);
674
700
  }
675
701
 
676
702
  .strudel-rack__master {
677
703
  display: flex;
678
704
  align-items: center;
679
705
  gap: 14px;
680
- padding: 4px 6px;
706
+ padding: 10px 14px;
707
+ border-radius: 6px;
708
+ background: linear-gradient(180deg, #2c2f35, #17181c);
709
+ box-shadow: inset 0 1px 0 rgb(255 255 255 / 0.1), inset 0 0 0 1px rgb(0 0 0 / 0.7), 0 2px 3px rgb(0 0 0 / 0.5);
681
710
  }
682
711
 
683
712
  .strudel-rack__title {
684
- font-weight: 600;
713
+ display: flex;
714
+ flex-direction: column;
715
+ font-weight: 800;
685
716
  font-size: 13px;
717
+ letter-spacing: 0.14em;
718
+ text-transform: uppercase;
719
+ color: #fff;
720
+ }
721
+
722
+ .strudel-rack__title small {
723
+ font-weight: 500;
724
+ font-size: 9px;
725
+ letter-spacing: 0.3em;
726
+ color: var(--strudel-accent);
727
+ text-shadow: 0 0 6px color-mix(in srgb, var(--strudel-accent) 60%, transparent);
686
728
  }
687
729
 
688
730
  .strudel-rack__summary {
689
731
  margin-left: auto;
690
- color: var(--gb-muted-foreground);
732
+ font-size: 9px;
733
+ letter-spacing: 0.18em;
734
+ text-transform: uppercase;
735
+ color: #8b9099;
691
736
  }
692
737
 
693
738
  .strudel-rack__error,
694
739
  .strudel-device__error {
695
740
  margin: 0;
696
- color: var(--gb-danger, #dc2626);
741
+ color: var(--strudel-red);
697
742
  font-size: 12px;
698
743
  }
699
744
 
700
- .strudel-device {
701
- border: 1px solid var(--gb-border);
702
- border-radius: 10px;
703
- background: var(--gb-panel, #fff);
704
- color: var(--gb-panel-foreground, inherit);
705
- overflow: hidden;
745
+ /* LCD: recessed green glass with a faint pixel grid. */
746
+ .strudel-lcd {
747
+ padding: 6px 10px;
748
+ border-radius: 4px;
749
+ background:
750
+ repeating-linear-gradient(0deg, rgb(0 0 0 / 0.18) 0 1px, transparent 1px 2px),
751
+ linear-gradient(180deg, #0c1a10, #10261a);
752
+ box-shadow: inset 0 2px 4px rgb(0 0 0 / 0.8), inset 0 0 0 1px rgb(0 0 0 / 0.9), 0 1px 0 rgb(255 255 255 / 0.12);
753
+ color: var(--strudel-lcd);
754
+ font-family: "SF Mono", ui-monospace, Menlo, monospace;
755
+ text-shadow: 0 0 6px color-mix(in srgb, var(--strudel-lcd) 55%, transparent);
706
756
  }
707
757
 
708
- .strudel-device[data-audible="false"] .strudel-device__body {
709
- opacity: 0.45;
758
+ .strudel-lcd--bpm {
759
+ display: inline-flex;
760
+ align-items: baseline;
761
+ gap: 4px;
762
+ min-width: 92px;
763
+ justify-content: flex-end;
764
+ font-size: 24px;
765
+ font-weight: 600;
766
+ font-variant-numeric: tabular-nums;
767
+ letter-spacing: 0.04em;
710
768
  }
711
769
 
770
+ .strudel-lcd--bpm small {
771
+ font-size: 9px;
772
+ letter-spacing: 0.15em;
773
+ }
774
+
775
+ /* Modules: anodized faceplates with a top bevel and corner screws. */
776
+ .strudel-device {
777
+ position: relative;
778
+ border-radius: 6px;
779
+ background:
780
+ radial-gradient(circle at 8px 8px, #c4c8cf 0 1.5px, #555a62 2px 3px, transparent 3.5px),
781
+ radial-gradient(circle at calc(100% - 8px) 8px, #c4c8cf 0 1.5px, #555a62 2px 3px, transparent 3.5px),
782
+ radial-gradient(circle at 8px calc(100% - 8px), #c4c8cf 0 1.5px, #555a62 2px 3px, transparent 3.5px),
783
+ radial-gradient(circle at calc(100% - 8px) calc(100% - 8px), #c4c8cf 0 1.5px, #555a62 2px 3px, transparent 3.5px),
784
+ repeating-linear-gradient(90deg, rgb(255 255 255 / 0.018) 0 1px, transparent 1px 2px),
785
+ linear-gradient(180deg, #33363d, #212328);
786
+ box-shadow: inset 0 1px 0 rgb(255 255 255 / 0.14), inset 0 0 0 1px rgb(0 0 0 / 0.75), 0 3px 5px rgb(0 0 0 / 0.5);
787
+ }
788
+
789
+ .strudel-device[data-kind="drums"] { --strudel-key: var(--strudel-amber); }
790
+ .strudel-device[data-kind="melodic"],
791
+ .strudel-device[data-kind="other"] { --strudel-key: var(--strudel-accent); }
792
+
712
793
  .strudel-device__head {
713
794
  display: flex;
714
795
  align-items: center;
715
796
  gap: 8px;
716
- padding: 6px 8px 6px 10px;
717
- border-bottom: 1px solid var(--gb-border);
718
- color: var(--gb-muted-foreground);
797
+ padding: 7px 16px 7px 18px;
798
+ border-bottom: 1px solid rgb(0 0 0 / 0.6);
799
+ box-shadow: 0 1px 0 rgb(255 255 255 / 0.06);
800
+ color: var(--strudel-key);
801
+ }
802
+
803
+ .strudel-device__led {
804
+ width: 7px;
805
+ height: 7px;
806
+ border-radius: 999px;
807
+ background: radial-gradient(circle at 35% 35%, #d8ffd6, #2fe05a 45%, #0d6a26);
808
+ box-shadow: 0 0 6px #2fe05a, 0 0 0 1px rgb(0 0 0 / 0.7);
719
809
  }
720
810
 
721
- .strudel-device[data-kind="drums"] .strudel-device__head svg { color: #f59e0b; }
722
- .strudel-device[data-kind="melodic"] .strudel-device__head svg { color: var(--strudel-accent); }
811
+ .strudel-device[data-audible="false"] .strudel-device__led {
812
+ background: radial-gradient(circle at 35% 35%, #4b524c, #1f2420);
813
+ box-shadow: 0 0 0 1px rgb(0 0 0 / 0.7);
814
+ }
723
815
 
724
816
  .strudel-device__name {
725
817
  flex: 1;
@@ -727,30 +819,54 @@
727
819
  overflow: hidden;
728
820
  text-overflow: ellipsis;
729
821
  white-space: nowrap;
730
- font-weight: 600;
731
- color: var(--gb-panel-foreground, inherit);
822
+ font-weight: 700;
823
+ font-size: 11px;
824
+ letter-spacing: 0.14em;
825
+ text-transform: uppercase;
826
+ color: var(--strudel-silk);
732
827
  }
733
828
 
829
+ /* Backlit rubber pads. */
734
830
  .strudel-device__toggle {
735
- width: 22px;
736
- height: 22px;
737
- border: 1px solid var(--gb-border);
738
- border-radius: 5px;
739
- background: transparent;
740
- color: var(--gb-muted-foreground);
831
+ width: 26px;
832
+ height: 20px;
833
+ border: 0;
834
+ border-radius: 4px;
835
+ background: linear-gradient(180deg, #4a4e56, #2b2e34);
836
+ box-shadow: inset 0 1px 0 rgb(255 255 255 / 0.18), 0 2px 0 #0d0e10, 0 3px 4px rgb(0 0 0 / 0.5);
837
+ color: #9aa0a9;
741
838
  font: inherit;
742
- font-size: 11px;
743
- font-weight: 700;
839
+ font-size: 10px;
840
+ font-weight: 800;
744
841
  cursor: pointer;
842
+ transition: transform 60ms, box-shadow 60ms;
843
+ }
844
+
845
+ .strudel-device__toggle:active {
846
+ transform: translateY(2px);
847
+ box-shadow: inset 0 1px 0 rgb(255 255 255 / 0.12), 0 0 0 #0d0e10, 0 1px 2px rgb(0 0 0 / 0.5);
745
848
  }
746
849
 
747
- .strudel-device__toggle[data-kind="mute"][aria-pressed="true"] { background: #f59e0b; border-color: #f59e0b; color: #000; }
748
- .strudel-device__toggle[data-kind="solo"][aria-pressed="true"] { background: var(--strudel-accent); border-color: var(--strudel-accent); color: var(--gb-primary-foreground, #fff); }
850
+ .strudel-device__toggle[data-kind="mute"][aria-pressed="true"] {
851
+ background: linear-gradient(180deg, #ffc266, var(--strudel-amber));
852
+ color: #3a1d00;
853
+ box-shadow: inset 0 1px 0 rgb(255 255 255 / 0.5), 0 2px 0 #7a4300, 0 0 12px color-mix(in srgb, var(--strudel-amber) 70%, transparent);
854
+ }
855
+
856
+ .strudel-device__toggle[data-kind="solo"][aria-pressed="true"] {
857
+ background: linear-gradient(180deg, #a6f0ff, var(--strudel-accent));
858
+ color: #002a36;
859
+ box-shadow: inset 0 1px 0 rgb(255 255 255 / 0.5), 0 2px 0 #00657d, 0 0 12px color-mix(in srgb, var(--strudel-accent) 70%, transparent);
860
+ }
749
861
 
750
862
  .strudel-device__body {
751
863
  display: flex;
752
- gap: 12px;
753
- padding: 10px;
864
+ gap: 14px;
865
+ padding: 12px 18px 16px;
866
+ }
867
+
868
+ .strudel-device[data-audible="false"] .strudel-device__main {
869
+ filter: saturate(0.2) brightness(0.7);
754
870
  }
755
871
 
756
872
  .strudel-device__main {
@@ -758,38 +874,57 @@
758
874
  min-width: 0;
759
875
  display: flex;
760
876
  flex-direction: column;
761
- gap: 8px;
877
+ gap: 10px;
762
878
  }
763
879
 
764
880
  .strudel-device__selects {
765
881
  display: flex;
766
882
  flex-wrap: wrap;
767
- gap: 6px 14px;
883
+ align-items: center;
884
+ gap: 4px 16px;
885
+ align-self: flex-start;
768
886
  }
769
887
 
770
888
  .strudel-device__selects label {
771
889
  display: inline-flex;
772
890
  align-items: center;
773
891
  gap: 6px;
774
- color: var(--gb-muted-foreground);
892
+ font-size: 9px;
893
+ letter-spacing: 0.18em;
894
+ text-transform: uppercase;
895
+ opacity: 0.85;
775
896
  }
776
897
 
777
- .strudel-device__selects select,
778
- .strudel-device__add select {
898
+ .strudel-device__selects select {
899
+ appearance: none;
900
+ padding: 0 2px;
901
+ border: 0;
902
+ background: transparent;
903
+ color: var(--strudel-lcd);
779
904
  font: inherit;
780
- font-size: 12px;
781
- padding: 2px 4px;
782
- border: 1px solid var(--gb-border);
783
- border-radius: 6px;
784
- background: var(--gb-panel, #fff);
785
- color: var(--gb-panel-foreground, inherit);
905
+ font-size: 13px;
906
+ letter-spacing: 0.04em;
907
+ text-transform: none;
908
+ text-shadow: inherit;
909
+ cursor: pointer;
910
+ }
911
+
912
+ .strudel-device__selects select:focus-visible {
913
+ outline: 1px solid var(--strudel-lcd);
914
+ border-radius: 2px;
915
+ }
916
+
917
+ .strudel-device__selects option,
918
+ .strudel-device__add option {
919
+ background: #111;
920
+ color: #eee;
786
921
  }
787
922
 
788
923
  .strudel-device__knobs {
789
924
  display: flex;
790
925
  flex-wrap: wrap;
791
926
  align-items: flex-start;
792
- gap: 4px 10px;
927
+ gap: 6px 10px;
793
928
  }
794
929
 
795
930
  .strudel-device__knob {
@@ -798,8 +933,8 @@
798
933
 
799
934
  .strudel-device__remove {
800
935
  position: absolute;
801
- top: -2px;
802
- right: -4px;
936
+ top: 0;
937
+ right: 0;
803
938
  display: none;
804
939
  place-items: center;
805
940
  width: 14px;
@@ -807,8 +942,8 @@
807
942
  padding: 0;
808
943
  border: 0;
809
944
  border-radius: 999px;
810
- background: var(--gb-muted-foreground);
811
- color: var(--gb-panel, #fff);
945
+ background: var(--strudel-red);
946
+ color: #fff;
812
947
  cursor: pointer;
813
948
  }
814
949
 
@@ -818,126 +953,296 @@
818
953
  }
819
954
 
820
955
  .strudel-device__add {
821
- display: inline-flex;
822
- align-items: center;
823
- gap: 4px;
824
- align-self: center;
825
- color: var(--gb-muted-foreground);
956
+ position: relative;
957
+ display: inline-grid;
958
+ place-items: center;
959
+ align-self: flex-start;
960
+ width: 40px;
961
+ height: 40px;
962
+ margin-top: 6px;
963
+ border-radius: 999px;
964
+ border: 1px dashed #5d626b;
965
+ color: #8b9099;
966
+ }
967
+
968
+ .strudel-device__add select {
969
+ position: absolute;
970
+ inset: 0;
971
+ opacity: 0;
972
+ cursor: pointer;
826
973
  }
827
974
 
975
+ .strudel-device__add:focus-within {
976
+ outline: 2px solid var(--strudel-accent);
977
+ outline-offset: 2px;
978
+ }
979
+
980
+ /* Knob: LED ring, rubber skirt, machined cap. */
828
981
  .strudel-knob {
829
982
  display: flex;
830
983
  flex-direction: column;
831
984
  align-items: center;
832
- width: 52px;
985
+ width: 58px;
833
986
  user-select: none;
834
987
  }
835
988
 
836
989
  .strudel-knob__dial {
837
- width: 38px;
838
- height: 38px;
990
+ width: 52px;
991
+ height: 52px;
839
992
  border-radius: 999px;
840
993
  cursor: ns-resize;
841
994
  touch-action: none;
842
995
  }
843
996
 
997
+ .strudel-knob[data-size="lg"] {
998
+ width: 70px;
999
+ }
1000
+
1001
+ .strudel-knob[data-size="lg"] .strudel-knob__dial {
1002
+ width: 64px;
1003
+ height: 64px;
1004
+ }
1005
+
844
1006
  .strudel-knob__dial:focus-visible,
845
1007
  .strudel-fader__track:focus-visible {
846
- outline: 2px solid var(--strudel-accent, #6366f1);
1008
+ outline: 2px solid var(--strudel-accent);
847
1009
  outline-offset: 2px;
848
1010
  }
849
1011
 
850
- .strudel-knob__dial svg { width: 100%; height: 100%; display: block; }
851
- .strudel-knob__track { fill: none; stroke: var(--gb-border); stroke-width: 3; stroke-linecap: round; }
852
- .strudel-knob__fill { fill: none; stroke: var(--strudel-accent, #6366f1); stroke-width: 3; stroke-linecap: round; }
853
- .strudel-knob__cap { fill: var(--gb-muted, #f4f4f5); stroke: var(--gb-border); }
854
- .strudel-knob__pointer { stroke: var(--gb-panel-foreground, #18181b); stroke-width: 2; stroke-linecap: round; }
1012
+ .strudel-knob__dial svg { width: 100%; height: 100%; display: block; overflow: visible; }
1013
+ .strudel-knob__led { fill: #2a2d33; stroke: rgb(0 0 0 / 0.6); stroke-width: 0.5; }
1014
+ .strudel-knob__led[data-on] { fill: var(--strudel-key, var(--strudel-accent)); filter: drop-shadow(0 0 1.6px var(--strudel-key, var(--strudel-accent))); }
1015
+ .strudel-knob__shadow { fill: rgb(0 0 0 / 0.55); filter: blur(1.4px); }
1016
+ .strudel-knob__skirt { stroke: #050506; stroke-width: 0.8; }
1017
+ .strudel-knob__ridge { stroke: rgb(255 255 255 / 0.12); stroke-width: 1.2; stroke-linecap: round; }
1018
+ .strudel-knob__cap { stroke: rgb(0 0 0 / 0.5); stroke-width: 0.6; }
1019
+ .strudel-knob__brush { fill: none; stroke: rgb(255 255 255 / 0.35); stroke-width: 0.5; stroke-dasharray: 0.6 1.4; }
1020
+ .strudel-knob__pointer { stroke: #111; stroke-width: 2.4; stroke-linecap: round; }
855
1021
 
856
1022
  .strudel-knob__value,
857
1023
  .strudel-fader__value {
1024
+ font-family: "SF Mono", ui-monospace, Menlo, monospace;
858
1025
  font-variant-numeric: tabular-nums;
859
- font-size: 11px;
860
- line-height: 1.3;
1026
+ font-size: 10px;
1027
+ line-height: 1.5;
1028
+ color: #fff;
861
1029
  }
862
1030
 
863
1031
  .strudel-knob__label,
864
1032
  .strudel-fader__label {
865
- font-size: 10px;
866
- color: var(--gb-muted-foreground);
1033
+ font-size: 8.5px;
1034
+ font-weight: 700;
1035
+ color: var(--strudel-silk);
867
1036
  text-transform: uppercase;
868
- letter-spacing: 0.04em;
1037
+ letter-spacing: 0.16em;
869
1038
  white-space: nowrap;
870
1039
  }
871
1040
 
872
1041
  .strudel-knob[data-disabled] .strudel-knob__dial,
873
1042
  .strudel-fader[data-disabled] .strudel-fader__track {
874
1043
  cursor: not-allowed;
875
- opacity: 0.6;
876
1044
  }
877
1045
 
1046
+ .strudel-knob[data-disabled] .strudel-knob__value {
1047
+ color: var(--strudel-accent);
1048
+ }
1049
+
1050
+ /* Channel fader: tick scale, slotted track, chunky ribbed cap. */
878
1051
  .strudel-fader {
879
1052
  display: flex;
880
1053
  flex-direction: column;
881
1054
  align-items: center;
882
1055
  gap: 4px;
883
- width: 36px;
884
1056
  user-select: none;
885
1057
  }
886
1058
 
1059
+ .strudel-fader__body {
1060
+ display: flex;
1061
+ gap: 4px;
1062
+ }
1063
+
1064
+ .strudel-fader__scale {
1065
+ display: flex;
1066
+ flex-direction: column;
1067
+ justify-content: space-between;
1068
+ padding: 8px 0;
1069
+ font-size: 7px;
1070
+ line-height: 1;
1071
+ color: #8b9099;
1072
+ text-align: right;
1073
+ }
1074
+
887
1075
  .strudel-fader__track {
888
1076
  position: relative;
889
- width: 8px;
890
- height: 90px;
891
- border-radius: 999px;
892
- background: var(--gb-border);
1077
+ width: 26px;
1078
+ height: 118px;
893
1079
  cursor: ns-resize;
894
1080
  touch-action: none;
1081
+ border-radius: 4px;
1082
+ background: repeating-linear-gradient(180deg, transparent 0 9px, rgb(255 255 255 / 0.12) 9px 10px) 0 6px / 5px calc(100% - 12px) no-repeat,
1083
+ repeating-linear-gradient(180deg, transparent 0 9px, rgb(255 255 255 / 0.12) 9px 10px) 100% 6px / 5px calc(100% - 12px) no-repeat;
895
1084
  }
896
1085
 
897
- .strudel-fader__fill {
1086
+ .strudel-fader__slot {
898
1087
  position: absolute;
899
- inset: auto 0 0;
900
- border-radius: 999px;
901
- background: var(--strudel-accent, #6366f1);
1088
+ inset: 4px calc(50% - 2.5px);
1089
+ border-radius: 3px;
1090
+ background: #050506;
1091
+ box-shadow: inset 0 1px 2px rgb(0 0 0 / 0.9), 0 1px 0 rgb(255 255 255 / 0.1);
902
1092
  }
903
1093
 
904
- .strudel-fader__thumb {
1094
+ .strudel-fader__cap {
905
1095
  position: absolute;
906
- left: -6px;
907
- width: 20px;
908
- height: 10px;
1096
+ left: 1px;
1097
+ right: 1px;
1098
+ height: 22px;
909
1099
  border-radius: 3px;
910
- background: var(--gb-panel, #fff);
911
- border: 1px solid var(--gb-muted-foreground);
912
- box-shadow: 0 1px 2px rgb(0 0 0 / 0.2);
1100
+ background:
1101
+ linear-gradient(180deg, transparent 10px, #fff 10px 12px, transparent 12px),
1102
+ repeating-linear-gradient(180deg, rgb(0 0 0 / 0.25) 0 1px, transparent 1px 3px),
1103
+ linear-gradient(180deg, #a3a8b1, #5b6069 48%, #3e4249 52%, #7c818a);
1104
+ box-shadow: inset 0 1px 0 rgb(255 255 255 / 0.5), 0 3px 5px rgb(0 0 0 / 0.7), 0 0 0 1px rgb(0 0 0 / 0.6);
913
1105
  }
914
1106
 
915
- /* StepGrid: mini-notation as a step sequencer. */
1107
+ .strudel-rack__mode {
1108
+ display: inline-flex;
1109
+ padding: 2px;
1110
+ border-radius: 5px;
1111
+ background: #0a0b0d;
1112
+ box-shadow: inset 0 1px 2px rgb(0 0 0 / 0.9), 0 1px 0 rgb(255 255 255 / 0.08);
1113
+ }
1114
+
1115
+ .strudel-rack__mode button {
1116
+ padding: 3px 9px;
1117
+ border: 0;
1118
+ border-radius: 3px;
1119
+ background: transparent;
1120
+ color: #8b9099;
1121
+ font: inherit;
1122
+ font-size: 9px;
1123
+ font-weight: 700;
1124
+ letter-spacing: 0.16em;
1125
+ text-transform: uppercase;
1126
+ cursor: pointer;
1127
+ }
1128
+
1129
+ .strudel-rack__mode button[aria-checked="true"] {
1130
+ background: linear-gradient(180deg, #4a4e56, #2b2e34);
1131
+ color: var(--strudel-accent);
1132
+ box-shadow: inset 0 1px 0 rgb(255 255 255 / 0.18);
1133
+ text-shadow: 0 0 6px color-mix(in srgb, var(--strudel-accent) 60%, transparent);
1134
+ }
1135
+
1136
+ /* Grid mode: a Eurorack-style case — rails behind, modules dropped in a masonry grid. */
1137
+ .strudel-rack[data-mode="grid"] {
1138
+ padding-block: 14px;
1139
+ }
1140
+
1141
+ .strudel-grid {
1142
+ display: grid;
1143
+ grid-auto-flow: row dense;
1144
+ }
1145
+
1146
+ .strudel-grid__item {
1147
+ position: relative;
1148
+ min-width: 0;
1149
+ transition: transform 0s;
1150
+ }
1151
+
1152
+ .strudel-grid__item[data-dragging] {
1153
+ z-index: 5;
1154
+ filter: drop-shadow(0 18px 22px rgb(0 0 0 / 0.6));
1155
+ cursor: grabbing;
1156
+ }
1157
+
1158
+ .strudel-grid__content {
1159
+ display: flex;
1160
+ flex-direction: column;
1161
+ }
1162
+
1163
+ .strudel-grid__content > * {
1164
+ flex: 1;
1165
+ }
1166
+
1167
+ .strudel-grid__content > .strudel-rack__master {
1168
+ flex-wrap: wrap;
1169
+ }
1170
+
1171
+ /* The grip: an invisible handle over the module's title (left of its pads). */
1172
+ .strudel-grid__grip {
1173
+ position: absolute;
1174
+ top: 0;
1175
+ left: 0;
1176
+ width: calc(100% - 84px);
1177
+ height: 34px;
1178
+ padding: 0;
1179
+ border: 0;
1180
+ border-radius: 6px 0 0 0;
1181
+ background: transparent;
1182
+ cursor: grab;
1183
+ touch-action: none;
1184
+ }
1185
+
1186
+ .strudel-grid__item[data-grid-key="master"] .strudel-grid__grip {
1187
+ width: 140px;
1188
+ height: 100%;
1189
+ }
1190
+
1191
+ .strudel-grid__grip:focus-visible,
1192
+ .strudel-grid__corner:focus-visible {
1193
+ outline: 2px solid var(--strudel-accent);
1194
+ outline-offset: -2px;
1195
+ }
1196
+
1197
+ /* The corner: three engraved ribs. */
1198
+ .strudel-grid__corner {
1199
+ position: absolute;
1200
+ right: 0;
1201
+ bottom: 0;
1202
+ width: 18px;
1203
+ height: 18px;
1204
+ padding: 0;
1205
+ border: 0;
1206
+ border-radius: 0 0 6px 0;
1207
+ background: linear-gradient(135deg, transparent 0 45%, #7d828b 45% 52%, transparent 52% 62%, #7d828b 62% 69%, transparent 69% 79%, #7d828b 79% 86%, transparent 86%);
1208
+ cursor: nwse-resize;
1209
+ touch-action: none;
1210
+ opacity: 0.7;
1211
+ }
1212
+
1213
+ .strudel-grid__item:hover .strudel-grid__corner {
1214
+ opacity: 1;
1215
+ }
1216
+
1217
+ /* Steps: TR-style keys that light up. */
916
1218
  .strudel-steps {
917
1219
  display: flex;
918
1220
  flex-direction: column;
919
1221
  gap: 4px;
920
- padding-top: 6px;
1222
+ padding: 8px;
1223
+ border-radius: 5px;
1224
+ background: rgb(0 0 0 / 0.35);
1225
+ box-shadow: inset 0 1px 3px rgb(0 0 0 / 0.8), 0 1px 0 rgb(255 255 255 / 0.06);
921
1226
  overflow-x: auto;
922
1227
  }
923
1228
 
924
1229
  .strudel-step__layers {
925
1230
  display: flex;
926
1231
  flex-direction: column;
927
- gap: 3px;
1232
+ gap: 4px;
928
1233
  flex: 1;
929
1234
  }
930
1235
 
931
1236
  .strudel-step__row {
932
1237
  display: flex;
933
- gap: 3px;
1238
+ gap: 4px;
934
1239
  min-width: 0;
935
1240
  }
936
1241
 
937
1242
  .strudel-step {
938
1243
  position: relative;
939
1244
  flex: 1 1 0;
940
- min-width: 18px;
1245
+ min-width: 20px;
941
1246
  display: flex;
942
1247
  }
943
1248
 
@@ -945,48 +1250,75 @@
945
1250
  .strudel-step__input {
946
1251
  flex: 1;
947
1252
  min-width: 0;
948
- height: 26px;
1253
+ height: 30px;
949
1254
  padding: 0 3px;
950
- border: 1px solid var(--gb-border);
951
- border-radius: 5px;
952
- font: inherit;
953
- font-size: 11px;
954
- font-family: var(--gb-mono, ui-monospace, SFMono-Regular, Menlo, monospace);
1255
+ border: 0;
1256
+ border-radius: 3px;
1257
+ font-family: "SF Mono", ui-monospace, Menlo, monospace;
1258
+ font-size: 10px;
1259
+ font-weight: 600;
955
1260
  overflow: hidden;
956
1261
  text-overflow: ellipsis;
957
1262
  white-space: nowrap;
958
1263
  }
959
1264
 
960
1265
  .strudel-step__cell {
961
- background: color-mix(in srgb, var(--strudel-accent, #6366f1) 22%, var(--gb-panel, #fff));
962
- color: var(--gb-panel-foreground, inherit);
1266
+ position: relative;
1267
+ padding-top: 7px;
1268
+ color: #1a0d00;
963
1269
  cursor: pointer;
1270
+ background: linear-gradient(180deg, color-mix(in srgb, var(--strudel-key) 70%, #fff), var(--strudel-key) 55%, color-mix(in srgb, var(--strudel-key) 75%, #000));
1271
+ box-shadow: inset 0 1px 0 rgb(255 255 255 / 0.55), 0 2px 0 rgb(0 0 0 / 0.75), 0 0 10px color-mix(in srgb, var(--strudel-key) 45%, transparent);
1272
+ transition: transform 50ms, box-shadow 50ms;
964
1273
  }
965
1274
 
966
- .strudel-device[data-kind="drums"] .strudel-step__cell:not([data-rest]) {
967
- background: color-mix(in srgb, #f59e0b 30%, var(--gb-panel, #fff));
1275
+ /* The key's LED. */
1276
+ .strudel-step__cell::before {
1277
+ content: "";
1278
+ position: absolute;
1279
+ top: 4px;
1280
+ left: 50%;
1281
+ width: 10px;
1282
+ height: 3px;
1283
+ margin-left: -5px;
1284
+ border-radius: 2px;
1285
+ background: #fff;
1286
+ box-shadow: 0 0 5px #fff;
968
1287
  }
969
1288
 
970
1289
  .strudel-step__cell[data-rest] {
971
- background: transparent;
972
- border-style: dashed;
1290
+ color: transparent;
1291
+ background: linear-gradient(180deg, #4b4f57, #34373d 55%, #26282d);
1292
+ box-shadow: inset 0 1px 0 rgb(255 255 255 / 0.16), 0 2px 0 rgb(0 0 0 / 0.75);
973
1293
  }
974
1294
 
975
- .strudel-step__cell:hover {
976
- border-color: var(--strudel-accent, #6366f1);
1295
+ .strudel-step__cell[data-rest]::before {
1296
+ background: #1a1b1e;
1297
+ box-shadow: inset 0 0 1px #000;
1298
+ }
1299
+
1300
+ .strudel-step__cell:active {
1301
+ transform: translateY(2px);
1302
+ box-shadow: inset 0 1px 0 rgb(255 255 255 / 0.3), 0 0 0 rgb(0 0 0 / 0.75);
1303
+ }
1304
+
1305
+ .strudel-step__cell:focus-visible,
1306
+ .strudel-step__input:focus-visible {
1307
+ outline: 2px solid #fff;
1308
+ outline-offset: 1px;
977
1309
  }
978
1310
 
979
1311
  .strudel-step__input {
980
- background: var(--gb-panel, #fff);
981
- color: inherit;
1312
+ background: #0c1a10;
1313
+ color: var(--strudel-lcd);
982
1314
  }
983
1315
 
984
1316
  .strudel-step__nest {
985
1317
  flex: 1;
986
1318
  display: flex;
987
- padding: 2px;
988
- border: 1px solid var(--gb-border);
989
- border-radius: 6px;
1319
+ padding: 3px;
1320
+ border-radius: 4px;
1321
+ box-shadow: inset 0 0 0 1px rgb(255 255 255 / 0.12);
990
1322
  }
991
1323
 
992
1324
  .strudel-step__nest > .strudel-step__row {
@@ -994,7 +1326,7 @@
994
1326
  }
995
1327
 
996
1328
  .strudel-step__nest[data-kind="alternation"] {
997
- border-style: dashed;
1329
+ box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--strudel-key) 45%, transparent);
998
1330
  }
999
1331
 
1000
1332
  .strudel-step__nest[data-kind="alternation"] > .strudel-step__layers > .strudel-step__row {
@@ -1006,14 +1338,20 @@
1006
1338
  top: -6px;
1007
1339
  right: 2px;
1008
1340
  padding: 0 3px;
1009
- border-radius: 4px;
1010
- background: var(--gb-panel-foreground, #18181b);
1011
- color: var(--gb-panel, #fff);
1012
- font-size: 9px;
1341
+ border-radius: 3px;
1342
+ background: #000;
1343
+ box-shadow: 0 0 0 1px rgb(255 255 255 / 0.2);
1344
+ color: var(--strudel-lcd);
1345
+ font-family: "SF Mono", ui-monospace, Menlo, monospace;
1346
+ font-size: 8px;
1013
1347
  line-height: 12px;
1014
1348
  pointer-events: none;
1015
1349
  }
1016
1350
 
1351
+ .strudel-steps {
1352
+ padding-top: 10px;
1353
+ }
1354
+
1017
1355
  .docs-content-ref {
1018
1356
  display: flex !important;
1019
1357
  align-items: center;