@goplasmatic/dataflow-ui 2.0.13 → 2.0.14

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.
@@ -1,3 +1,181 @@
1
+ * {
2
+ box-sizing: border-box;
3
+ }
4
+
5
+ :root {
6
+ /* Light theme (default) */
7
+ --bg-primary: #f5f5f5;
8
+ --bg-secondary: #ffffff;
9
+ --bg-tertiary: #fafafa;
10
+ --bg-hover: #f0f0f0;
11
+ --bg-active: #e8e8e8;
12
+
13
+ --text-primary: #333333;
14
+ --text-secondary: #555555;
15
+ --text-tertiary: #666666;
16
+ --text-muted: #999999;
17
+ --text-placeholder: #aaaaaa;
18
+
19
+ --border-primary: #e0e0e0;
20
+ --border-secondary: #dddddd;
21
+ --border-light: #eeeeee;
22
+
23
+ --accent-blue: #3b82f6;
24
+ --accent-blue-light: #dbeafe;
25
+
26
+ --accent-amber: #f59e0b;
27
+ --accent-amber-light: #fef3c7;
28
+
29
+ /* Status colors */
30
+ --success-bg: #d1fae5;
31
+ --success-text: #059669;
32
+ --success-border: #a7f3d0;
33
+
34
+ --error-bg: #fee2e2;
35
+ --error-bg-light: #fef2f2;
36
+ --error-bg-lighter: #fff5f5;
37
+ --error-text: #dc2626;
38
+ --error-border: #fecaca;
39
+
40
+ --warning-bg: #fef3c7;
41
+ --warning-text: #d97706;
42
+ --warning-border: #fde68a;
43
+
44
+ /* Syntax highlighting */
45
+ --syntax-key: #0550ae;
46
+ --syntax-string: #0a3069;
47
+ --syntax-number: #0550ae;
48
+ --syntax-boolean: #cf222e;
49
+ --syntax-null: #6e7781;
50
+ --syntax-bracket: #24292f;
51
+ --syntax-punctuation: #24292f;
52
+
53
+ /* Node colors - these stay consistent */
54
+ --node-bg: #ffffff;
55
+ --node-shadow: rgba(0, 0, 0, 0.1);
56
+ --node-shadow-hover: rgba(0, 0, 0, 0.15);
57
+
58
+ /* Code background */
59
+ --code-bg: #f8f9fa;
60
+
61
+ /* Debug popover colors */
62
+ --debug-popover-bg: #ffffff;
63
+ --debug-popover-text: #1f2937;
64
+ --debug-popover-error-bg: #fef2f2;
65
+ --debug-popover-shadow: rgba(0, 0, 0, 0.15);
66
+ --debug-popover-value-bg: rgba(0, 0, 0, 0.05);
67
+ --debug-iteration-color: #b45309;
68
+ --debug-label-color: #6b7280;
69
+ --debug-border-color: rgba(0, 0, 0, 0.1);
70
+
71
+ /* Debug value type colors */
72
+ --debug-value-true: #059669;
73
+ --debug-value-false: #dc2626;
74
+ --debug-value-number: #2563eb;
75
+ --debug-value-string: #059669;
76
+ --debug-value-array: #7c3aed;
77
+ --debug-value-null: #6b7280;
78
+
79
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, sans-serif;
80
+ line-height: 1.5;
81
+ font-weight: 400;
82
+ color-scheme: light dark;
83
+ color: var(--text-primary);
84
+ background-color: var(--bg-primary);
85
+ font-synthesis: none;
86
+ text-rendering: optimizeLegibility;
87
+ -webkit-font-smoothing: antialiased;
88
+ -moz-osx-font-smoothing: grayscale;
89
+ }
90
+
91
+ [data-theme="dark"] {
92
+ --bg-primary: #1a1a1a;
93
+ --bg-secondary: #242424;
94
+ --bg-tertiary: #2a2a2a;
95
+ --bg-hover: #333333;
96
+ --bg-active: #404040;
97
+
98
+ --text-primary: #e5e5e5;
99
+ --text-secondary: #cccccc;
100
+ --text-tertiary: #b3b3b3;
101
+ --text-muted: #888888;
102
+ --text-placeholder: #666666;
103
+
104
+ --border-primary: #404040;
105
+ --border-secondary: #4a4a4a;
106
+ --border-light: #333333;
107
+
108
+ --accent-blue: #60a5fa;
109
+ --accent-blue-light: #1e3a5f;
110
+
111
+ --accent-amber: #fbbf24;
112
+ --accent-amber-light: #451a03;
113
+
114
+ /* Status colors - darker variants */
115
+ --success-bg: #064e3b;
116
+ --success-text: #6ee7b7;
117
+ --success-border: #065f46;
118
+
119
+ --error-bg: #450a0a;
120
+ --error-bg-light: #3f0a0a;
121
+ --error-bg-lighter: #350a0a;
122
+ --error-text: #fca5a5;
123
+ --error-border: #7f1d1d;
124
+
125
+ --warning-bg: #451a03;
126
+ --warning-text: #fcd34d;
127
+ --warning-border: #78350f;
128
+
129
+ /* Syntax highlighting - dark theme */
130
+ --syntax-key: #79c0ff;
131
+ --syntax-string: #a5d6ff;
132
+ --syntax-number: #79c0ff;
133
+ --syntax-boolean: #ff7b72;
134
+ --syntax-null: #8b949e;
135
+ --syntax-bracket: #c9d1d9;
136
+ --syntax-punctuation: #c9d1d9;
137
+
138
+ /* Node colors */
139
+ --node-bg: #2d2d2d;
140
+ --node-shadow: rgba(0, 0, 0, 0.3);
141
+ --node-shadow-hover: rgba(0, 0, 0, 0.4);
142
+
143
+ /* Code background */
144
+ --code-bg: #1f1f1f;
145
+
146
+ /* Debug popover colors */
147
+ --debug-popover-bg: #1f2937;
148
+ --debug-popover-text: #f3f4f6;
149
+ --debug-popover-error-bg: #7f1d1d;
150
+ --debug-popover-shadow: rgba(0, 0, 0, 0.4);
151
+ --debug-popover-value-bg: rgba(0, 0, 0, 0.2);
152
+ --debug-iteration-color: #fbbf24;
153
+ --debug-label-color: #9ca3af;
154
+ --debug-border-color: rgba(255, 255, 255, 0.1);
155
+
156
+ /* Debug value type colors */
157
+ --debug-value-true: #86efac;
158
+ --debug-value-false: #fca5a5;
159
+ --debug-value-number: #93c5fd;
160
+ --debug-value-string: #86efac;
161
+ --debug-value-array: #d8b4fe;
162
+ --debug-value-null: #9ca3af;
163
+ }
164
+
165
+ body {
166
+ margin: 0;
167
+ min-width: 320px;
168
+ min-height: 100vh;
169
+ }
170
+
171
+ #root {
172
+ width: 100%;
173
+ height: 100vh;
174
+ }
175
+
176
+ button {
177
+ font-family: inherit;
178
+ }
1
179
  /* this gets exported as style.css and can be used for the default theming */
2
180
  /* these are the necessary styles for React/Svelte Flow, they get used by base.css and style.css */
3
181
  .react-flow {
@@ -622,7 +800,322 @@ svg.react-flow__connectionline {
622
800
  .react-flow__edge-text {
623
801
  fill: var(--xy-edge-label-color, var(--xy-edge-label-color-default));
624
802
  }
625
- .debugger-controls {
803
+ /**
804
+ * Edge Component Styles
805
+ *
806
+ * Styles for edge-related components.
807
+ */
808
+
809
+ /* ============================================================================
810
+ Operator Picker Popup (may be used by other components)
811
+ ============================================================================ */
812
+
813
+ .edge-operator-picker {
814
+ position: absolute;
815
+ top: 100%;
816
+ left: 50%;
817
+ transform: translateX(-50%);
818
+ width: 260px;
819
+ max-height: 360px;
820
+ margin-top: 8px;
821
+ background: var(--bg-primary, #ffffff);
822
+ border: 1px solid var(--border-color, #e0e0e0);
823
+ border-radius: 8px;
824
+ box-shadow: 0 8px 24px rgba(0, 0, 0, 0.15);
825
+ overflow: hidden;
826
+ z-index: 1000;
827
+ }
828
+
829
+ [data-theme="dark"] .edge-operator-picker {
830
+ background: var(--bg-secondary, #1e1e1e);
831
+ border-color: var(--border-color, #3e3e3e);
832
+ box-shadow: 0 8px 24px rgba(0, 0, 0, 0.4);
833
+ }
834
+
835
+ /* Header */
836
+ .edge-picker-header {
837
+ display: flex;
838
+ align-items: center;
839
+ justify-content: space-between;
840
+ padding: 10px 12px;
841
+ border-bottom: 1px solid var(--border-color, #e0e0e0);
842
+ }
843
+
844
+ [data-theme="dark"] .edge-picker-header {
845
+ border-color: var(--border-color, #3e3e3e);
846
+ }
847
+
848
+ .edge-picker-title {
849
+ font-size: 13px;
850
+ font-weight: 600;
851
+ color: var(--text-primary, #1a1a1a);
852
+ }
853
+
854
+ [data-theme="dark"] .edge-picker-title {
855
+ color: var(--text-primary, #e0e0e0);
856
+ }
857
+
858
+ .edge-picker-close {
859
+ display: flex;
860
+ align-items: center;
861
+ justify-content: center;
862
+ width: 24px;
863
+ height: 24px;
864
+ padding: 0;
865
+ background: transparent;
866
+ border: none;
867
+ border-radius: 4px;
868
+ color: var(--text-tertiary, #888);
869
+ cursor: pointer;
870
+ transition: background 0.15s, color 0.15s;
871
+ }
872
+
873
+ .edge-picker-close:hover {
874
+ background: var(--bg-hover, #f0f0f0);
875
+ color: var(--text-primary, #1a1a1a);
876
+ }
877
+
878
+ [data-theme="dark"] .edge-picker-close:hover {
879
+ background: var(--bg-hover, #3e3e3e);
880
+ color: var(--text-primary, #e0e0e0);
881
+ }
882
+
883
+ /* Search */
884
+ .edge-picker-search {
885
+ display: flex;
886
+ align-items: center;
887
+ gap: 8px;
888
+ padding: 8px 12px;
889
+ border-bottom: 1px solid var(--border-color, #e0e0e0);
890
+ }
891
+
892
+ [data-theme="dark"] .edge-picker-search {
893
+ border-color: var(--border-color, #3e3e3e);
894
+ }
895
+
896
+ .edge-picker-search-icon {
897
+ color: var(--text-tertiary, #888);
898
+ flex-shrink: 0;
899
+ }
900
+
901
+ .edge-picker-search-input {
902
+ flex: 1;
903
+ padding: 4px 0;
904
+ font-size: 13px;
905
+ color: var(--text-primary, #1a1a1a);
906
+ background: transparent;
907
+ border: none;
908
+ outline: none;
909
+ }
910
+
911
+ .edge-picker-search-input::placeholder {
912
+ color: var(--text-tertiary, #888);
913
+ }
914
+
915
+ [data-theme="dark"] .edge-picker-search-input {
916
+ color: var(--text-primary, #e0e0e0);
917
+ }
918
+
919
+ /* Quick Add */
920
+ .edge-picker-quick {
921
+ display: flex;
922
+ gap: 8px;
923
+ padding: 8px 12px;
924
+ border-bottom: 1px solid var(--border-color, #e0e0e0);
925
+ }
926
+
927
+ [data-theme="dark"] .edge-picker-quick {
928
+ border-color: var(--border-color, #3e3e3e);
929
+ }
930
+
931
+ .edge-picker-quick-btn {
932
+ display: flex;
933
+ align-items: center;
934
+ gap: 6px;
935
+ flex: 1;
936
+ padding: 6px 10px;
937
+ font-size: 12px;
938
+ color: var(--text-secondary, #666);
939
+ background: var(--bg-tertiary, #f8f9fa);
940
+ border: 1px solid var(--border-color, #e0e0e0);
941
+ border-radius: 4px;
942
+ cursor: pointer;
943
+ transition: background 0.15s, border-color 0.15s;
944
+ }
945
+
946
+ .edge-picker-quick-btn:hover {
947
+ background: var(--bg-hover, #f0f0f0);
948
+ border-color: var(--color-primary, #2563eb);
949
+ color: var(--color-primary, #2563eb);
950
+ }
951
+
952
+ [data-theme="dark"] .edge-picker-quick-btn {
953
+ background: var(--bg-tertiary, #252525);
954
+ border-color: var(--border-color, #3e3e3e);
955
+ color: var(--text-secondary, #aaa);
956
+ }
957
+
958
+ [data-theme="dark"] .edge-picker-quick-btn:hover {
959
+ background: var(--bg-hover, #3e3e3e);
960
+ border-color: var(--color-primary, #60a5fa);
961
+ color: var(--color-primary, #60a5fa);
962
+ }
963
+
964
+ /* Content */
965
+ .edge-picker-content {
966
+ max-height: 220px;
967
+ overflow-y: auto;
968
+ }
969
+
970
+ /* Categories */
971
+ .edge-picker-categories {
972
+ display: flex;
973
+ flex-direction: column;
974
+ }
975
+
976
+ .edge-picker-category {
977
+ display: flex;
978
+ align-items: center;
979
+ justify-content: space-between;
980
+ padding: 10px 12px;
981
+ font-size: 13px;
982
+ color: var(--text-primary, #1a1a1a);
983
+ background: transparent;
984
+ border: none;
985
+ border-left: 3px solid transparent;
986
+ cursor: pointer;
987
+ text-align: left;
988
+ transition: background 0.15s;
989
+ }
990
+
991
+ .edge-picker-category:hover {
992
+ background: var(--bg-hover, #f0f0f0);
993
+ }
994
+
995
+ [data-theme="dark"] .edge-picker-category {
996
+ color: var(--text-primary, #e0e0e0);
997
+ }
998
+
999
+ [data-theme="dark"] .edge-picker-category:hover {
1000
+ background: var(--bg-hover, #3e3e3e);
1001
+ }
1002
+
1003
+ .edge-picker-category-name {
1004
+ font-weight: 500;
1005
+ }
1006
+
1007
+ .edge-picker-category-count {
1008
+ font-size: 11px;
1009
+ color: var(--text-tertiary, #888);
1010
+ background: var(--bg-tertiary, #f0f0f0);
1011
+ padding: 2px 6px;
1012
+ border-radius: 10px;
1013
+ }
1014
+
1015
+ [data-theme="dark"] .edge-picker-category-count {
1016
+ background: var(--bg-tertiary, #2e2e2e);
1017
+ }
1018
+
1019
+ /* Operators */
1020
+ .edge-picker-operators {
1021
+ display: flex;
1022
+ flex-direction: column;
1023
+ }
1024
+
1025
+ .edge-picker-back {
1026
+ padding: 8px 12px;
1027
+ font-size: 12px;
1028
+ color: var(--color-primary, #2563eb);
1029
+ background: transparent;
1030
+ border: none;
1031
+ border-bottom: 1px solid var(--border-color, #e0e0e0);
1032
+ cursor: pointer;
1033
+ text-align: left;
1034
+ transition: background 0.15s;
1035
+ }
1036
+
1037
+ .edge-picker-back:hover {
1038
+ background: var(--bg-hover, #f0f0f0);
1039
+ }
1040
+
1041
+ [data-theme="dark"] .edge-picker-back {
1042
+ color: var(--color-primary, #60a5fa);
1043
+ border-color: var(--border-color, #3e3e3e);
1044
+ }
1045
+
1046
+ [data-theme="dark"] .edge-picker-back:hover {
1047
+ background: var(--bg-hover, #3e3e3e);
1048
+ }
1049
+
1050
+ .edge-picker-operator {
1051
+ display: flex;
1052
+ align-items: center;
1053
+ gap: 10px;
1054
+ padding: 8px 12px;
1055
+ font-size: 13px;
1056
+ color: var(--text-primary, #1a1a1a);
1057
+ background: transparent;
1058
+ border: none;
1059
+ cursor: pointer;
1060
+ text-align: left;
1061
+ transition: background 0.15s;
1062
+ }
1063
+
1064
+ .edge-picker-operator:hover {
1065
+ background: var(--bg-hover, #f0f0f0);
1066
+ }
1067
+
1068
+ [data-theme="dark"] .edge-picker-operator {
1069
+ color: var(--text-primary, #e0e0e0);
1070
+ }
1071
+
1072
+ [data-theme="dark"] .edge-picker-operator:hover {
1073
+ background: var(--bg-hover, #3e3e3e);
1074
+ }
1075
+
1076
+ .edge-picker-operator-name {
1077
+ font-family: 'SF Mono', Monaco, 'Cascadia Code', monospace;
1078
+ font-weight: 600;
1079
+ min-width: 50px;
1080
+ }
1081
+
1082
+ .edge-picker-operator-label {
1083
+ font-size: 12px;
1084
+ color: var(--text-secondary, #666);
1085
+ }
1086
+
1087
+ [data-theme="dark"] .edge-picker-operator-label {
1088
+ color: var(--text-secondary, #aaa);
1089
+ }
1090
+
1091
+ .edge-picker-empty {
1092
+ padding: 20px 12px;
1093
+ font-size: 13px;
1094
+ color: var(--text-tertiary, #888);
1095
+ text-align: center;
1096
+ }
1097
+ /* Inline variant (used in toolbar) */
1098
+ .debugger-controls--inline {
1099
+ display: flex;
1100
+ align-items: center;
1101
+ flex-shrink: 0;
1102
+ }
1103
+
1104
+ .debugger-controls--inline .debugger-controls-inner {
1105
+ display: flex;
1106
+ align-items: center;
1107
+ gap: 12px;
1108
+ padding: 0;
1109
+ background: none;
1110
+ border: none;
1111
+ border-radius: 0;
1112
+ box-shadow: none;
1113
+ backdrop-filter: none;
1114
+ flex-shrink: 0;
1115
+ }
1116
+
1117
+ /* Floating overlay variant (legacy, used inside ReactFlow) */
1118
+ .debugger-controls--floating {
626
1119
  position: absolute;
627
1120
  top: 12px;
628
1121
  left: 50%;
@@ -631,7 +1124,7 @@ svg.react-flow__connectionline {
631
1124
  pointer-events: auto;
632
1125
  }
633
1126
 
634
- .debugger-controls-inner {
1127
+ .debugger-controls--floating .debugger-controls-inner {
635
1128
  display: flex;
636
1129
  align-items: center;
637
1130
  gap: 16px;
@@ -656,6 +1149,7 @@ svg.react-flow__connectionline {
656
1149
  display: flex;
657
1150
  align-items: center;
658
1151
  gap: 4px;
1152
+ flex-shrink: 0;
659
1153
  }
660
1154
 
661
1155
  .debugger-btn {
@@ -708,6 +1202,7 @@ svg.react-flow__connectionline {
708
1202
  font-size: 13px;
709
1203
  min-width: 60px;
710
1204
  justify-content: center;
1205
+ flex-shrink: 0;
711
1206
  }
712
1207
 
713
1208
  .step-current {
@@ -729,6 +1224,7 @@ svg.react-flow__connectionline {
729
1224
  display: flex;
730
1225
  align-items: center;
731
1226
  gap: 8px;
1227
+ flex-shrink: 0;
732
1228
  }
733
1229
 
734
1230
  .speed-label {
@@ -771,22 +1267,1673 @@ svg.react-flow__connectionline {
771
1267
  cursor: pointer;
772
1268
  }
773
1269
 
774
- /* Dark mode adjustments */
775
- [data-theme="dark"] .debugger-controls-inner {
776
- background: rgba(31, 41, 55, 0.95);
777
- border-color: var(--border-light);
778
- }
1270
+ /* Dark mode adjustments */
1271
+ [data-theme="dark"] .debugger-controls--floating .debugger-controls-inner {
1272
+ background: rgba(31, 41, 55, 0.95);
1273
+ border-color: var(--border-light);
1274
+ }
1275
+
1276
+ [data-theme="dark"] .debugger-btn {
1277
+ background: rgba(55, 65, 81, 0.8);
1278
+ }
1279
+
1280
+ [data-theme="dark"] .debugger-btn:hover:not(:disabled) {
1281
+ background: rgba(75, 85, 99, 0.9);
1282
+ }
1283
+
1284
+ [data-theme="dark"] .speed-slider {
1285
+ background: rgba(75, 85, 99, 0.8);
1286
+ }
1287
+
1288
+ /* Mobile adjustments */
1289
+ @media (max-width: 1024px) {
1290
+ .debugger-controls--inline .debugger-controls-inner {
1291
+ gap: 8px;
1292
+ }
1293
+
1294
+ .debugger-btn {
1295
+ width: 36px;
1296
+ height: 36px;
1297
+ }
1298
+
1299
+ .debugger-btn-primary {
1300
+ width: 40px;
1301
+ height: 40px;
1302
+ }
1303
+
1304
+ .debugger-step-counter {
1305
+ min-width: 50px;
1306
+ font-size: 12px;
1307
+ }
1308
+
1309
+ .speed-slider {
1310
+ width: 60px;
1311
+ }
1312
+ }
1313
+ /* ==========================================================================
1314
+ Panel Input Styles
1315
+ ========================================================================== */
1316
+
1317
+ /* Field Container */
1318
+ .panel-field {
1319
+ display: flex;
1320
+ flex-direction: column;
1321
+ gap: 6px;
1322
+ margin-bottom: 12px;
1323
+ }
1324
+
1325
+ .panel-field-label {
1326
+ font-size: 12px;
1327
+ font-weight: 500;
1328
+ color: var(--dl-text-secondary, #666);
1329
+ }
1330
+
1331
+ .panel-field-required {
1332
+ color: var(--dl-error, #ef4444);
1333
+ margin-left: 2px;
1334
+ }
1335
+
1336
+ .panel-field-help {
1337
+ font-size: 11px;
1338
+ color: var(--dl-text-tertiary, #999);
1339
+ line-height: 1.4;
1340
+ }
1341
+
1342
+ /* ==========================================================================
1343
+ Base Input Styles
1344
+ ========================================================================== */
1345
+
1346
+ .panel-input {
1347
+ width: 100%;
1348
+ padding: 8px 10px;
1349
+ font-size: 13px;
1350
+ font-family: inherit;
1351
+ color: var(--dl-text-primary, #1a1a1a);
1352
+ background: var(--dl-bg-input, #fff);
1353
+ border: 1px solid var(--dl-border, #e0e0e0);
1354
+ border-radius: 6px;
1355
+ outline: none;
1356
+ transition: border-color 0.15s, box-shadow 0.15s;
1357
+ box-sizing: border-box;
1358
+ }
1359
+
1360
+ .panel-input:focus {
1361
+ border-color: var(--dl-primary, #3b82f6);
1362
+ box-shadow: 0 0 0 3px var(--dl-primary-alpha, rgba(59, 130, 246, 0.15));
1363
+ }
1364
+
1365
+ .panel-input:disabled {
1366
+ background: var(--dl-bg-disabled, #f5f5f5);
1367
+ color: var(--dl-text-disabled, #aaa);
1368
+ cursor: not-allowed;
1369
+ }
1370
+
1371
+ .panel-input::placeholder {
1372
+ color: var(--dl-text-placeholder, #bbb);
1373
+ }
1374
+
1375
+ .panel-input-error {
1376
+ border-color: var(--dl-error, #ef4444);
1377
+ }
1378
+
1379
+ .panel-input-error:focus {
1380
+ box-shadow: 0 0 0 3px var(--dl-error-alpha, rgba(239, 68, 68, 0.15));
1381
+ }
1382
+
1383
+ .panel-input-error-message {
1384
+ font-size: 11px;
1385
+ color: var(--dl-error, #ef4444);
1386
+ margin-top: 4px;
1387
+ }
1388
+
1389
+ .panel-input-unsupported {
1390
+ padding: 8px;
1391
+ font-size: 12px;
1392
+ color: var(--dl-warning, #f59e0b);
1393
+ background: var(--dl-warning-bg, #fffbeb);
1394
+ border-radius: 4px;
1395
+ }
1396
+
1397
+ /* ==========================================================================
1398
+ Text Area
1399
+ ========================================================================== */
1400
+
1401
+ .panel-input-textarea {
1402
+ resize: vertical;
1403
+ min-height: 60px;
1404
+ font-family: var(--dl-font-mono, 'SF Mono', 'Monaco', 'Inconsolata', monospace);
1405
+ }
1406
+
1407
+ /* ==========================================================================
1408
+ Number Input
1409
+ ========================================================================== */
1410
+
1411
+ .panel-input-number {
1412
+ -moz-appearance: textfield;
1413
+ }
1414
+
1415
+ .panel-input-number::-webkit-outer-spin-button,
1416
+ .panel-input-number::-webkit-inner-spin-button {
1417
+ -webkit-appearance: none;
1418
+ margin: 0;
1419
+ }
1420
+
1421
+ /* ==========================================================================
1422
+ Boolean Input (Toggle)
1423
+ ========================================================================== */
1424
+
1425
+ .panel-input-boolean {
1426
+ display: inline-flex;
1427
+ align-items: center;
1428
+ cursor: pointer;
1429
+ }
1430
+
1431
+ .panel-input-checkbox {
1432
+ position: absolute;
1433
+ opacity: 0;
1434
+ width: 0;
1435
+ height: 0;
1436
+ }
1437
+
1438
+ .panel-input-toggle {
1439
+ position: relative;
1440
+ width: 36px;
1441
+ height: 20px;
1442
+ background: var(--dl-bg-toggle-off, #d1d5db);
1443
+ border-radius: 10px;
1444
+ transition: background 0.2s;
1445
+ }
1446
+
1447
+ .panel-input-toggle::after {
1448
+ content: '';
1449
+ position: absolute;
1450
+ top: 2px;
1451
+ left: 2px;
1452
+ width: 16px;
1453
+ height: 16px;
1454
+ background: white;
1455
+ border-radius: 50%;
1456
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2);
1457
+ transition: transform 0.2s;
1458
+ }
1459
+
1460
+ .panel-input-checkbox:checked + .panel-input-toggle {
1461
+ background: var(--dl-primary, #3b82f6);
1462
+ }
1463
+
1464
+ .panel-input-checkbox:checked + .panel-input-toggle::after {
1465
+ transform: translateX(16px);
1466
+ }
1467
+
1468
+ .panel-input-checkbox:focus + .panel-input-toggle {
1469
+ box-shadow: 0 0 0 3px var(--dl-primary-alpha, rgba(59, 130, 246, 0.15));
1470
+ }
1471
+
1472
+ .panel-input-checkbox:disabled + .panel-input-toggle {
1473
+ opacity: 0.5;
1474
+ cursor: not-allowed;
1475
+ }
1476
+
1477
+ /* ==========================================================================
1478
+ Select Input
1479
+ ========================================================================== */
1480
+
1481
+ .panel-input-select-wrapper {
1482
+ position: relative;
1483
+ display: flex;
1484
+ align-items: center;
1485
+ }
1486
+
1487
+ .panel-input-select {
1488
+ appearance: none;
1489
+ padding-right: 28px;
1490
+ cursor: pointer;
1491
+ }
1492
+
1493
+ .panel-input-select:disabled {
1494
+ cursor: not-allowed;
1495
+ }
1496
+
1497
+ .panel-input-select-arrow {
1498
+ position: absolute;
1499
+ right: 10px;
1500
+ font-size: 10px;
1501
+ color: var(--dl-text-tertiary, #999);
1502
+ pointer-events: none;
1503
+ }
1504
+
1505
+ /* ==========================================================================
1506
+ Path Input
1507
+ ========================================================================== */
1508
+
1509
+ .panel-input-path-wrapper {
1510
+ display: flex;
1511
+ align-items: center;
1512
+ background: var(--dl-bg-input, #fff);
1513
+ border: 1px solid var(--dl-border, #e0e0e0);
1514
+ border-radius: 6px;
1515
+ overflow: hidden;
1516
+ transition: border-color 0.15s, box-shadow 0.15s;
1517
+ }
1518
+
1519
+ .panel-input-path-wrapper:focus-within {
1520
+ border-color: var(--dl-primary, #3b82f6);
1521
+ box-shadow: 0 0 0 3px var(--dl-primary-alpha, rgba(59, 130, 246, 0.15));
1522
+ }
1523
+
1524
+ .panel-input-path-prefix {
1525
+ padding: 8px 0 8px 10px;
1526
+ font-size: 13px;
1527
+ font-family: var(--dl-font-mono, 'SF Mono', 'Monaco', 'Inconsolata', monospace);
1528
+ color: var(--dl-text-tertiary, #999);
1529
+ user-select: none;
1530
+ }
1531
+
1532
+ .panel-input-path {
1533
+ border: none;
1534
+ padding-left: 4px;
1535
+ font-family: var(--dl-font-mono, 'SF Mono', 'Monaco', 'Inconsolata', monospace);
1536
+ }
1537
+
1538
+ .panel-input-path:focus {
1539
+ box-shadow: none;
1540
+ }
1541
+
1542
+ /* ==========================================================================
1543
+ Path Array Input
1544
+ ========================================================================== */
1545
+
1546
+ .panel-input-path-array {
1547
+ display: flex;
1548
+ flex-direction: column;
1549
+ gap: 6px;
1550
+ }
1551
+
1552
+ .panel-input-path-segment {
1553
+ display: flex;
1554
+ align-items: center;
1555
+ gap: 4px;
1556
+ }
1557
+
1558
+ .panel-input-segment {
1559
+ flex: 1;
1560
+ font-family: var(--dl-font-mono, 'SF Mono', 'Monaco', 'Inconsolata', monospace);
1561
+ }
1562
+
1563
+ .panel-input-segment-remove {
1564
+ display: flex;
1565
+ align-items: center;
1566
+ justify-content: center;
1567
+ width: 24px;
1568
+ height: 24px;
1569
+ padding: 0;
1570
+ background: transparent;
1571
+ border: none;
1572
+ border-radius: 4px;
1573
+ color: var(--dl-text-tertiary, #999);
1574
+ cursor: pointer;
1575
+ transition: background 0.15s, color 0.15s;
1576
+ }
1577
+
1578
+ .panel-input-segment-remove:hover {
1579
+ background: var(--dl-error-bg, #fef2f2);
1580
+ color: var(--dl-error, #ef4444);
1581
+ }
1582
+
1583
+ .panel-input-segment-remove:disabled {
1584
+ opacity: 0.5;
1585
+ cursor: not-allowed;
1586
+ }
1587
+
1588
+ .panel-input-add-segment {
1589
+ display: flex;
1590
+ align-items: center;
1591
+ gap: 6px;
1592
+ padding: 6px 10px;
1593
+ font-size: 12px;
1594
+ color: var(--dl-primary, #3b82f6);
1595
+ background: transparent;
1596
+ border: 1px dashed var(--dl-border, #e0e0e0);
1597
+ border-radius: 6px;
1598
+ cursor: pointer;
1599
+ transition: background 0.15s, border-color 0.15s;
1600
+ }
1601
+
1602
+ .panel-input-add-segment:hover {
1603
+ background: var(--dl-primary-bg, #eff6ff);
1604
+ border-color: var(--dl-primary, #3b82f6);
1605
+ }
1606
+
1607
+ .panel-input-add-segment:disabled {
1608
+ opacity: 0.5;
1609
+ cursor: not-allowed;
1610
+ }
1611
+
1612
+ .panel-input-path-preview {
1613
+ font-size: 11px;
1614
+ font-family: var(--dl-font-mono, 'SF Mono', 'Monaco', 'Inconsolata', monospace);
1615
+ color: var(--dl-text-tertiary, #999);
1616
+ padding: 4px 0;
1617
+ }
1618
+
1619
+ /* ==========================================================================
1620
+ Expression Input
1621
+ ========================================================================== */
1622
+
1623
+ .panel-input-expression {
1624
+ padding: 10px 12px;
1625
+ background: var(--dl-bg-subtle, #f8f9fa);
1626
+ border: 1px dashed var(--dl-border, #e0e0e0);
1627
+ border-radius: 6px;
1628
+ }
1629
+
1630
+ .panel-input-expression.disabled {
1631
+ opacity: 0.6;
1632
+ }
1633
+
1634
+ .panel-input-expression-content {
1635
+ display: flex;
1636
+ align-items: center;
1637
+ gap: 8px;
1638
+ font-size: 13px;
1639
+ }
1640
+
1641
+ .panel-input-expression-icon {
1642
+ color: var(--dl-primary, #3b82f6);
1643
+ flex-shrink: 0;
1644
+ }
1645
+
1646
+ .panel-input-expression-summary {
1647
+ font-family: var(--dl-font-mono, 'SF Mono', 'Monaco', 'Inconsolata', monospace);
1648
+ color: var(--dl-text-primary, #1a1a1a);
1649
+ overflow: hidden;
1650
+ text-overflow: ellipsis;
1651
+ white-space: nowrap;
1652
+ }
1653
+
1654
+ .panel-input-expression-empty {
1655
+ color: var(--dl-text-placeholder, #bbb);
1656
+ font-style: italic;
1657
+ }
1658
+
1659
+ .panel-input-expression-hint {
1660
+ font-size: 10px;
1661
+ color: var(--dl-text-tertiary, #999);
1662
+ margin-top: 6px;
1663
+ }
1664
+
1665
+ /* ==========================================================================
1666
+ JSON Input
1667
+ ========================================================================== */
1668
+
1669
+ .panel-input-json-wrapper {
1670
+ display: flex;
1671
+ flex-direction: column;
1672
+ }
1673
+
1674
+ .panel-input-json {
1675
+ font-family: var(--dl-font-mono, 'SF Mono', 'Monaco', 'Inconsolata', monospace);
1676
+ font-size: 12px;
1677
+ line-height: 1.5;
1678
+ resize: vertical;
1679
+ min-height: 80px;
1680
+ }
1681
+
1682
+ /* ==========================================================================
1683
+ Panel Renderer
1684
+ ========================================================================== */
1685
+
1686
+ .panel-renderer {
1687
+ display: flex;
1688
+ flex-direction: column;
1689
+ gap: 16px;
1690
+ }
1691
+
1692
+ /* ==========================================================================
1693
+ Section Styles
1694
+ ========================================================================== */
1695
+
1696
+ .panel-section {
1697
+ display: flex;
1698
+ flex-direction: column;
1699
+ }
1700
+
1701
+ .panel-section-header {
1702
+ display: flex;
1703
+ align-items: center;
1704
+ gap: 6px;
1705
+ padding: 8px 0;
1706
+ font-size: 12px;
1707
+ font-weight: 600;
1708
+ color: var(--dl-text-secondary, #666);
1709
+ text-transform: uppercase;
1710
+ letter-spacing: 0.5px;
1711
+ border-bottom: 1px solid var(--dl-border-light, #f0f0f0);
1712
+ margin-bottom: 12px;
1713
+ }
1714
+
1715
+ .panel-section-header.collapsible {
1716
+ cursor: pointer;
1717
+ user-select: none;
1718
+ transition: color 0.15s;
1719
+ }
1720
+
1721
+ .panel-section-header.collapsible:hover {
1722
+ color: var(--dl-text-primary, #1a1a1a);
1723
+ }
1724
+
1725
+ .panel-section-header.collapsible:focus {
1726
+ outline: none;
1727
+ color: var(--dl-primary, #3b82f6);
1728
+ }
1729
+
1730
+ .panel-section-toggle {
1731
+ display: flex;
1732
+ align-items: center;
1733
+ justify-content: center;
1734
+ color: var(--dl-text-tertiary, #999);
1735
+ }
1736
+
1737
+ .panel-section-title {
1738
+ flex: 1;
1739
+ }
1740
+
1741
+ .panel-section-content {
1742
+ display: flex;
1743
+ flex-direction: column;
1744
+ }
1745
+
1746
+ /* ==========================================================================
1747
+ Panel Hints
1748
+ ========================================================================== */
1749
+
1750
+ .panel-hint {
1751
+ display: flex;
1752
+ gap: 10px;
1753
+ padding: 12px;
1754
+ background: var(--dl-bg-subtle, #f8f9fa);
1755
+ border-radius: 8px;
1756
+ border: 1px solid var(--dl-border-light, #f0f0f0);
1757
+ }
1758
+
1759
+ .panel-hint-icon {
1760
+ font-size: 16px;
1761
+ flex-shrink: 0;
1762
+ }
1763
+
1764
+ .panel-hint-content {
1765
+ flex: 1;
1766
+ min-width: 0;
1767
+ }
1768
+
1769
+ .panel-hint-title {
1770
+ font-size: 12px;
1771
+ font-weight: 600;
1772
+ color: var(--dl-text-secondary, #666);
1773
+ margin-bottom: 4px;
1774
+ }
1775
+
1776
+ .panel-hint-description {
1777
+ font-size: 12px;
1778
+ color: var(--dl-text-tertiary, #999);
1779
+ line-height: 1.4;
1780
+ }
1781
+
1782
+ .panel-hint-description code {
1783
+ font-family: var(--dl-font-mono, 'SF Mono', 'Monaco', 'Inconsolata', monospace);
1784
+ font-size: 11px;
1785
+ background: var(--dl-bg-code, #e8e8e8);
1786
+ padding: 1px 4px;
1787
+ border-radius: 3px;
1788
+ }
1789
+
1790
+ /* Chainable hint */
1791
+ .panel-hint-chainable {
1792
+ background: var(--dl-info-bg, #eff6ff);
1793
+ border-color: var(--dl-info-border, #bfdbfe);
1794
+ }
1795
+
1796
+ /* Context variables hint */
1797
+ .panel-hint-context {
1798
+ background: var(--dl-success-bg, #f0fdf4);
1799
+ border-color: var(--dl-success-border, #bbf7d0);
1800
+ }
1801
+
1802
+ .panel-context-list {
1803
+ list-style: none;
1804
+ margin: 0;
1805
+ padding: 0;
1806
+ display: flex;
1807
+ flex-direction: column;
1808
+ gap: 8px;
1809
+ }
1810
+
1811
+ .panel-context-item {
1812
+ display: flex;
1813
+ flex-direction: column;
1814
+ gap: 2px;
1815
+ }
1816
+
1817
+ .panel-context-example {
1818
+ font-family: var(--dl-font-mono, 'SF Mono', 'Monaco', 'Inconsolata', monospace);
1819
+ font-size: 11px;
1820
+ background: var(--dl-bg-code, rgba(0, 0, 0, 0.06));
1821
+ padding: 2px 6px;
1822
+ border-radius: 4px;
1823
+ color: var(--dl-text-primary, #1a1a1a);
1824
+ display: inline-block;
1825
+ width: fit-content;
1826
+ }
1827
+
1828
+ .panel-context-label {
1829
+ font-size: 12px;
1830
+ font-weight: 500;
1831
+ color: var(--dl-text-secondary, #666);
1832
+ }
1833
+
1834
+ .panel-context-description {
1835
+ font-size: 11px;
1836
+ color: var(--dl-text-tertiary, #999);
1837
+ }
1838
+ /* ==========================================================================
1839
+ Properties Panel Styles
1840
+ ========================================================================== */
1841
+
1842
+ /* Floating properties panel - overlays on top of the diagram */
1843
+ .properties-panel {
1844
+ display: flex;
1845
+ flex-direction: column;
1846
+ position: absolute;
1847
+ top: 8px;
1848
+ right: 8px;
1849
+ bottom: 8px;
1850
+ width: 280px;
1851
+ z-index: 50;
1852
+ background: var(--bg-secondary, #ffffff);
1853
+ border: 1px solid var(--border-color, #e0e0e0);
1854
+ border-radius: 8px;
1855
+ box-shadow: 0 4px 16px rgba(0, 0, 0, 0.1), 0 2px 4px rgba(0, 0, 0, 0.06);
1856
+ overflow: hidden;
1857
+ }
1858
+
1859
+ /* Dark mode */
1860
+ [data-theme="dark"] .properties-panel {
1861
+ background: var(--bg-secondary, #1e1e1e);
1862
+ border-color: var(--border-color, #3e3e3e);
1863
+ box-shadow: 0 4px 16px rgba(0, 0, 0, 0.35), 0 2px 4px rgba(0, 0, 0, 0.2);
1864
+ }
1865
+
1866
+ .properties-panel-content {
1867
+ display: flex;
1868
+ flex-direction: column;
1869
+ height: 100%;
1870
+ overflow-y: auto;
1871
+ }
1872
+
1873
+ /* ==========================================================================
1874
+ Header
1875
+ ========================================================================== */
1876
+
1877
+ .properties-panel-header {
1878
+ display: flex;
1879
+ align-items: flex-start;
1880
+ justify-content: space-between;
1881
+ gap: 12px;
1882
+ padding: 16px;
1883
+ border-bottom: 1px solid var(--border-light, #f0f0f0);
1884
+ background: var(--bg-tertiary, #f8f9fa);
1885
+ }
1886
+
1887
+ [data-theme="dark"] .properties-panel-header {
1888
+ border-bottom-color: var(--border-color, #3e3e3e);
1889
+ background: var(--bg-tertiary, #252525);
1890
+ }
1891
+
1892
+ .properties-panel-header-info {
1893
+ flex: 1;
1894
+ min-width: 0;
1895
+ }
1896
+
1897
+ .properties-panel-title {
1898
+ margin: 0;
1899
+ font-size: 16px;
1900
+ font-weight: 600;
1901
+ color: var(--text-primary, #1a1a1a);
1902
+ }
1903
+
1904
+ [data-theme="dark"] .properties-panel-title {
1905
+ color: var(--text-primary, #e0e0e0);
1906
+ }
1907
+
1908
+ .properties-panel-category {
1909
+ display: block;
1910
+ margin-top: 4px;
1911
+ font-size: 12px;
1912
+ color: var(--text-tertiary, #999);
1913
+ }
1914
+
1915
+ .properties-panel-close {
1916
+ display: flex;
1917
+ align-items: center;
1918
+ justify-content: center;
1919
+ width: 28px;
1920
+ height: 28px;
1921
+ padding: 0;
1922
+ background: transparent;
1923
+ border: none;
1924
+ border-radius: 6px;
1925
+ color: var(--text-tertiary, #999);
1926
+ cursor: pointer;
1927
+ transition: background 0.15s, color 0.15s;
1928
+ }
1929
+
1930
+ .properties-panel-close:hover {
1931
+ background: var(--bg-hover, #e8e8e8);
1932
+ color: var(--text-primary, #1a1a1a);
1933
+ }
1934
+
1935
+ [data-theme="dark"] .properties-panel-close:hover {
1936
+ background: var(--bg-hover, #3e3e3e);
1937
+ color: var(--text-primary, #e0e0e0);
1938
+ }
1939
+
1940
+ /* ==========================================================================
1941
+ Sections
1942
+ ========================================================================== */
1943
+
1944
+ .properties-panel-section {
1945
+ padding: 16px;
1946
+ border-bottom: 1px solid var(--border-light, #f0f0f0);
1947
+ }
1948
+
1949
+ [data-theme="dark"] .properties-panel-section {
1950
+ border-bottom-color: var(--border-color, #3e3e3e);
1951
+ }
1952
+
1953
+ .properties-panel-section-header {
1954
+ display: flex;
1955
+ align-items: center;
1956
+ gap: 6px;
1957
+ margin-bottom: 12px;
1958
+ font-size: 11px;
1959
+ font-weight: 600;
1960
+ color: var(--text-tertiary, #999);
1961
+ text-transform: uppercase;
1962
+ letter-spacing: 0.5px;
1963
+ }
1964
+
1965
+ .properties-panel-section-icon {
1966
+ font-size: 14px;
1967
+ }
1968
+
1969
+ /* Collapsible section */
1970
+ .properties-panel-section--collapsible {
1971
+ padding: 0;
1972
+ }
1973
+
1974
+ .properties-panel-section-toggle {
1975
+ display: flex;
1976
+ align-items: center;
1977
+ gap: 6px;
1978
+ width: 100%;
1979
+ padding: 12px 16px;
1980
+ font-size: 11px;
1981
+ font-weight: 600;
1982
+ color: var(--text-tertiary, #999);
1983
+ text-transform: uppercase;
1984
+ letter-spacing: 0.5px;
1985
+ background: transparent;
1986
+ border: none;
1987
+ cursor: pointer;
1988
+ transition: background 0.15s, color 0.15s;
1989
+ }
1990
+
1991
+ .properties-panel-section-toggle:hover {
1992
+ background: var(--bg-hover, #f5f5f5);
1993
+ color: var(--text-secondary, #666);
1994
+ }
1995
+
1996
+ [data-theme="dark"] .properties-panel-section-toggle:hover {
1997
+ background: var(--bg-hover, #3e3e3e);
1998
+ color: var(--text-secondary, #aaa);
1999
+ }
2000
+
2001
+ .properties-panel-section-toggle svg {
2002
+ flex-shrink: 0;
2003
+ }
2004
+
2005
+ .properties-panel-section-content {
2006
+ padding: 0 16px 16px;
2007
+ }
2008
+
2009
+ /* ==========================================================================
2010
+ Help Section
2011
+ ========================================================================== */
2012
+
2013
+ .help-section {
2014
+ display: flex;
2015
+ flex-direction: column;
2016
+ gap: 12px;
2017
+ }
2018
+
2019
+ .help-summary {
2020
+ margin: 0;
2021
+ font-size: 13px;
2022
+ color: var(--text-secondary, #666);
2023
+ line-height: 1.5;
2024
+ }
2025
+
2026
+ [data-theme="dark"] .help-summary {
2027
+ color: var(--text-secondary, #aaa);
2028
+ }
2029
+
2030
+ .help-badges {
2031
+ display: flex;
2032
+ flex-wrap: wrap;
2033
+ gap: 8px;
2034
+ }
2035
+
2036
+ .help-badge {
2037
+ display: inline-flex;
2038
+ align-items: center;
2039
+ gap: 4px;
2040
+ padding: 4px 8px;
2041
+ font-size: 11px;
2042
+ border-radius: 4px;
2043
+ }
2044
+
2045
+ .help-badge code {
2046
+ font-family: var(--dl-font-mono, 'SF Mono', 'Monaco', 'Inconsolata', monospace);
2047
+ }
2048
+
2049
+ .help-badge-arity {
2050
+ background: var(--dl-info-bg, #eff6ff);
2051
+ color: var(--dl-info, #3b82f6);
2052
+ }
2053
+
2054
+ [data-theme="dark"] .help-badge-arity {
2055
+ background: rgba(59, 130, 246, 0.15);
2056
+ color: #60a5fa;
2057
+ }
2058
+
2059
+ .help-badge-return {
2060
+ background: var(--dl-success-bg, #f0fdf4);
2061
+ color: var(--dl-success, #22c55e);
2062
+ }
2063
+
2064
+ [data-theme="dark"] .help-badge-return {
2065
+ background: rgba(34, 197, 94, 0.15);
2066
+ color: #4ade80;
2067
+ }
2068
+
2069
+ .help-examples-toggle {
2070
+ display: flex;
2071
+ align-items: center;
2072
+ gap: 6px;
2073
+ padding: 6px 0;
2074
+ font-size: 12px;
2075
+ color: var(--dl-primary, #3b82f6);
2076
+ background: transparent;
2077
+ border: none;
2078
+ cursor: pointer;
2079
+ transition: color 0.15s;
2080
+ }
2081
+
2082
+ .help-examples-toggle:hover {
2083
+ color: var(--dl-primary-dark, #2563eb);
2084
+ }
2085
+
2086
+ [data-theme="dark"] .help-examples-toggle {
2087
+ color: #60a5fa;
2088
+ }
2089
+
2090
+ [data-theme="dark"] .help-examples-toggle:hover {
2091
+ color: #93c5fd;
2092
+ }
2093
+
2094
+ .help-examples {
2095
+ display: flex;
2096
+ flex-direction: column;
2097
+ gap: 12px;
2098
+ }
2099
+
2100
+ .help-example {
2101
+ padding: 10px;
2102
+ background: var(--dl-bg-subtle, #f8f9fa);
2103
+ border: 1px solid var(--dl-border-light, #f0f0f0);
2104
+ border-radius: 6px;
2105
+ }
2106
+
2107
+ [data-theme="dark"] .help-example {
2108
+ background: #1e1e1e;
2109
+ border-color: #3e3e3e;
2110
+ }
2111
+
2112
+ .help-example-header {
2113
+ display: flex;
2114
+ align-items: center;
2115
+ justify-content: space-between;
2116
+ margin-bottom: 8px;
2117
+ }
2118
+
2119
+ .help-example-title {
2120
+ font-size: 12px;
2121
+ font-weight: 500;
2122
+ color: var(--dl-text-secondary, #666);
2123
+ }
2124
+
2125
+ [data-theme="dark"] .help-example-title {
2126
+ color: #aaa;
2127
+ }
2128
+
2129
+ .help-example-copy {
2130
+ display: flex;
2131
+ align-items: center;
2132
+ justify-content: center;
2133
+ width: 24px;
2134
+ height: 24px;
2135
+ padding: 0;
2136
+ background: transparent;
2137
+ border: none;
2138
+ border-radius: 4px;
2139
+ color: var(--dl-text-tertiary, #999);
2140
+ cursor: pointer;
2141
+ transition: background 0.15s, color 0.15s;
2142
+ }
2143
+
2144
+ .help-example-copy:hover {
2145
+ background: var(--dl-bg-hover, #e8e8e8);
2146
+ color: var(--dl-text-primary, #1a1a1a);
2147
+ }
2148
+
2149
+ [data-theme="dark"] .help-example-copy {
2150
+ color: #888;
2151
+ }
2152
+
2153
+ [data-theme="dark"] .help-example-copy:hover {
2154
+ background: #3e3e3e;
2155
+ color: #e0e0e0;
2156
+ }
2157
+
2158
+ .help-example-code {
2159
+ margin: 0;
2160
+ padding: 8px;
2161
+ font-family: var(--dl-font-mono, 'SF Mono', 'Monaco', 'Inconsolata', monospace);
2162
+ font-size: 11px;
2163
+ line-height: 1.5;
2164
+ background: var(--dl-bg-code, #fff);
2165
+ border: 1px solid var(--dl-border-light, #f0f0f0);
2166
+ border-radius: 4px;
2167
+ overflow-x: auto;
2168
+ color: var(--text-primary, #1a1a1a);
2169
+ }
2170
+
2171
+ [data-theme="dark"] .help-example-code {
2172
+ background: #121212;
2173
+ border-color: #3e3e3e;
2174
+ color: #e0e0e0;
2175
+ }
2176
+
2177
+ .help-example-code code {
2178
+ font-family: inherit;
2179
+ }
2180
+
2181
+ .help-example-data,
2182
+ .help-example-result,
2183
+ .help-example-error {
2184
+ display: flex;
2185
+ align-items: baseline;
2186
+ gap: 6px;
2187
+ margin-top: 6px;
2188
+ font-size: 11px;
2189
+ }
2190
+
2191
+ .help-example-label {
2192
+ color: var(--dl-text-tertiary, #999);
2193
+ flex-shrink: 0;
2194
+ }
2195
+
2196
+ .help-example-data code,
2197
+ .help-example-result code {
2198
+ font-family: var(--dl-font-mono, 'SF Mono', 'Monaco', 'Inconsolata', monospace);
2199
+ color: var(--dl-text-primary, #1a1a1a);
2200
+ }
2201
+
2202
+ [data-theme="dark"] .help-example-data code,
2203
+ [data-theme="dark"] .help-example-result code {
2204
+ color: #e0e0e0;
2205
+ }
2206
+
2207
+ .help-example-error code {
2208
+ font-family: var(--dl-font-mono, 'SF Mono', 'Monaco', 'Inconsolata', monospace);
2209
+ color: var(--dl-error, #ef4444);
2210
+ }
2211
+
2212
+ [data-theme="dark"] .help-example-error code {
2213
+ color: #f87171;
2214
+ }
2215
+
2216
+ .help-example-note {
2217
+ margin-top: 6px;
2218
+ font-size: 11px;
2219
+ font-style: italic;
2220
+ color: var(--dl-text-tertiary, #999);
2221
+ }
2222
+
2223
+ .help-notes {
2224
+ padding-top: 8px;
2225
+ border-top: 1px solid var(--dl-border-light, #f0f0f0);
2226
+ }
2227
+
2228
+ [data-theme="dark"] .help-notes {
2229
+ border-top-color: #3e3e3e;
2230
+ }
2231
+
2232
+ .help-notes-title {
2233
+ font-size: 11px;
2234
+ font-weight: 600;
2235
+ color: var(--dl-text-tertiary, #999);
2236
+ text-transform: uppercase;
2237
+ letter-spacing: 0.5px;
2238
+ margin-bottom: 6px;
2239
+ }
2240
+
2241
+ .help-notes-list {
2242
+ margin: 0;
2243
+ padding-left: 16px;
2244
+ font-size: 12px;
2245
+ color: var(--dl-text-secondary, #666);
2246
+ line-height: 1.6;
2247
+ }
2248
+
2249
+ [data-theme="dark"] .help-notes-list {
2250
+ color: #aaa;
2251
+ }
2252
+
2253
+
2254
+ /* ==========================================================================
2255
+ Footer
2256
+ ========================================================================== */
2257
+
2258
+ .properties-panel-footer {
2259
+ margin-top: auto;
2260
+ padding: 16px;
2261
+ border-top: 1px solid var(--border-light, #f0f0f0);
2262
+ }
2263
+
2264
+ [data-theme="dark"] .properties-panel-footer {
2265
+ border-top-color: var(--border-color, #3e3e3e);
2266
+ }
2267
+
2268
+ .properties-panel-delete {
2269
+ width: 100%;
2270
+ padding: 10px 16px;
2271
+ font-size: 13px;
2272
+ font-weight: 500;
2273
+ color: #ef4444;
2274
+ background: #fef2f2;
2275
+ border: 1px solid #fecaca;
2276
+ border-radius: 6px;
2277
+ cursor: pointer;
2278
+ transition: background 0.15s, border-color 0.15s;
2279
+ }
2280
+
2281
+ [data-theme="dark"] .properties-panel-delete {
2282
+ background: #451a1a;
2283
+ border-color: #7f1d1d;
2284
+ }
2285
+
2286
+ .properties-panel-delete:hover {
2287
+ background: #fee2e2;
2288
+ border-color: #ef4444;
2289
+ }
2290
+
2291
+ [data-theme="dark"] .properties-panel-delete:hover {
2292
+ background: #5c2424;
2293
+ }
2294
+
2295
+ /* ==========================================================================
2296
+ Empty State
2297
+ ========================================================================== */
2298
+
2299
+ .properties-panel-empty {
2300
+ display: flex;
2301
+ flex-direction: column;
2302
+ align-items: center;
2303
+ padding: 32px 16px;
2304
+ text-align: center;
2305
+ }
2306
+
2307
+ .properties-panel-empty-title {
2308
+ margin: 0 0 8px;
2309
+ font-size: 14px;
2310
+ font-weight: 500;
2311
+ color: var(--text-secondary, #666);
2312
+ }
2313
+
2314
+ .properties-panel-empty-hint {
2315
+ margin: 0;
2316
+ font-size: 12px;
2317
+ color: var(--text-tertiary, #999);
2318
+ line-height: 1.5;
2319
+ }
2320
+
2321
+ .properties-panel-empty-divider {
2322
+ width: 100%;
2323
+ height: 1px;
2324
+ margin: 24px 0;
2325
+ background: var(--border-light, #f0f0f0);
2326
+ }
2327
+
2328
+ [data-theme="dark"] .properties-panel-empty-divider {
2329
+ background: var(--border-color, #3e3e3e);
2330
+ }
2331
+
2332
+ .properties-panel-quick-add-title {
2333
+ margin: 0 0 12px;
2334
+ font-size: 12px;
2335
+ font-weight: 500;
2336
+ color: var(--text-secondary, #666);
2337
+ }
2338
+
2339
+ .properties-panel-quick-add {
2340
+ display: flex;
2341
+ flex-direction: column;
2342
+ gap: 8px;
2343
+ width: 100%;
2344
+ }
2345
+
2346
+ .properties-panel-quick-add-btn {
2347
+ display: flex;
2348
+ align-items: center;
2349
+ gap: 10px;
2350
+ width: 100%;
2351
+ padding: 10px 14px;
2352
+ font-size: 13px;
2353
+ color: var(--text-primary, #1a1a1a);
2354
+ background: var(--bg-tertiary, #f8f9fa);
2355
+ border: 1px solid var(--border-color, #e0e0e0);
2356
+ border-radius: 6px;
2357
+ cursor: pointer;
2358
+ transition: background 0.15s, border-color 0.15s;
2359
+ }
2360
+
2361
+ [data-theme="dark"] .properties-panel-quick-add-btn {
2362
+ color: var(--text-primary, #e0e0e0);
2363
+ background: var(--bg-tertiary, #252525);
2364
+ border-color: var(--border-color, #3e3e3e);
2365
+ }
2366
+
2367
+ .properties-panel-quick-add-btn:hover {
2368
+ background: var(--bg-hover, #f0f0f0);
2369
+ border-color: var(--border-color, #d0d0d0);
2370
+ }
2371
+
2372
+ [data-theme="dark"] .properties-panel-quick-add-btn:hover {
2373
+ background: var(--bg-hover, #3e3e3e);
2374
+ }
2375
+
2376
+ .properties-panel-quick-add-btn svg {
2377
+ color: var(--text-tertiary, #999);
2378
+ }
2379
+
2380
+ /* ============================================================================
2381
+ Arguments Section
2382
+ ============================================================================ */
2383
+
2384
+ .arguments-list {
2385
+ display: flex;
2386
+ flex-direction: column;
2387
+ gap: 6px;
2388
+ margin-bottom: 12px;
2389
+ }
2390
+
2391
+ .argument-item {
2392
+ display: flex;
2393
+ align-items: center;
2394
+ gap: 8px;
2395
+ padding: 6px 8px;
2396
+ background: var(--bg-tertiary, #f8f9fa);
2397
+ border: 1px solid var(--border-color, #e0e0e0);
2398
+ border-radius: 6px;
2399
+ }
2400
+
2401
+ [data-theme="dark"] .argument-item {
2402
+ background: var(--bg-tertiary, #252525);
2403
+ border-color: var(--border-color, #3e3e3e);
2404
+ }
2405
+
2406
+ .argument-index {
2407
+ display: flex;
2408
+ align-items: center;
2409
+ justify-content: center;
2410
+ width: 20px;
2411
+ height: 20px;
2412
+ font-size: 11px;
2413
+ font-weight: 600;
2414
+ color: var(--text-tertiary, #888);
2415
+ background: var(--bg-secondary, #f0f0f0);
2416
+ border-radius: 4px;
2417
+ flex-shrink: 0;
2418
+ }
2419
+
2420
+ [data-theme="dark"] .argument-index {
2421
+ background: var(--bg-secondary, #1e1e1e);
2422
+ color: var(--text-tertiary, #888);
2423
+ }
2424
+
2425
+ .argument-value {
2426
+ flex: 1;
2427
+ padding: 4px 8px;
2428
+ font-size: 12px;
2429
+ font-family: 'SF Mono', Monaco, 'Cascadia Code', monospace;
2430
+ color: var(--text-primary, #1a1a1a);
2431
+ background: transparent;
2432
+ border: none;
2433
+ border-radius: 4px;
2434
+ cursor: pointer;
2435
+ text-align: left;
2436
+ overflow: hidden;
2437
+ text-overflow: ellipsis;
2438
+ white-space: nowrap;
2439
+ }
2440
+
2441
+ .argument-value:hover {
2442
+ background: var(--bg-hover, #e8e8e8);
2443
+ }
2444
+
2445
+ [data-theme="dark"] .argument-value {
2446
+ color: var(--text-primary, #e0e0e0);
2447
+ }
2448
+
2449
+ [data-theme="dark"] .argument-value:hover {
2450
+ background: var(--bg-hover, #3e3e3e);
2451
+ }
2452
+
2453
+ .argument-remove {
2454
+ display: flex;
2455
+ align-items: center;
2456
+ justify-content: center;
2457
+ width: 24px;
2458
+ height: 24px;
2459
+ padding: 0;
2460
+ color: var(--text-tertiary, #888);
2461
+ background: transparent;
2462
+ border: none;
2463
+ border-radius: 4px;
2464
+ cursor: pointer;
2465
+ flex-shrink: 0;
2466
+ transition: color 0.15s, background 0.15s;
2467
+ }
2468
+
2469
+ .argument-remove:hover {
2470
+ color: var(--color-error, #dc3545);
2471
+ background: var(--bg-hover, #e8e8e8);
2472
+ }
2473
+
2474
+ [data-theme="dark"] .argument-remove:hover {
2475
+ background: var(--bg-hover, #3e3e3e);
2476
+ }
2477
+
2478
+ .arguments-empty {
2479
+ padding: 12px;
2480
+ font-size: 12px;
2481
+ color: var(--text-tertiary, #888);
2482
+ text-align: center;
2483
+ background: var(--bg-tertiary, #f8f9fa);
2484
+ border: 1px dashed var(--border-color, #e0e0e0);
2485
+ border-radius: 6px;
2486
+ }
2487
+
2488
+ [data-theme="dark"] .arguments-empty {
2489
+ background: var(--bg-tertiary, #252525);
2490
+ border-color: var(--border-color, #3e3e3e);
2491
+ }
2492
+
2493
+ .arguments-add-btn {
2494
+ display: flex;
2495
+ align-items: center;
2496
+ justify-content: center;
2497
+ gap: 6px;
2498
+ width: 100%;
2499
+ padding: 8px 12px;
2500
+ font-size: 12px;
2501
+ font-weight: 500;
2502
+ color: var(--color-primary, #2563eb);
2503
+ background: transparent;
2504
+ border: 1px dashed var(--color-primary, #2563eb);
2505
+ border-radius: 6px;
2506
+ cursor: pointer;
2507
+ transition: background 0.15s, border-style 0.15s;
2508
+ }
2509
+
2510
+ .arguments-add-btn:hover {
2511
+ background: var(--color-primary-light, rgba(37, 99, 235, 0.08));
2512
+ border-style: solid;
2513
+ }
2514
+
2515
+ [data-theme="dark"] .arguments-add-btn {
2516
+ color: var(--color-primary, #60a5fa);
2517
+ border-color: var(--color-primary, #60a5fa);
2518
+ }
2519
+
2520
+ [data-theme="dark"] .arguments-add-btn:hover {
2521
+ background: var(--color-primary-light, rgba(96, 165, 250, 0.1));
2522
+ }
2523
+
2524
+ .arguments-hint {
2525
+ margin-top: 8px;
2526
+ padding: 6px 8px;
2527
+ font-size: 11px;
2528
+ color: var(--text-tertiary, #888);
2529
+ background: var(--bg-tertiary, #f8f9fa);
2530
+ border-radius: 4px;
2531
+ }
2532
+
2533
+ [data-theme="dark"] .arguments-hint {
2534
+ background: var(--bg-tertiary, #252525);
2535
+ }
2536
+
2537
+ /* Inline literal inputs */
2538
+ .argument-literal-input {
2539
+ flex: 1;
2540
+ min-width: 0;
2541
+ }
2542
+
2543
+ .argument-input {
2544
+ width: 100%;
2545
+ padding: 6px 8px;
2546
+ font-size: 12px;
2547
+ font-family: 'SF Mono', Monaco, 'Cascadia Code', monospace;
2548
+ color: var(--text-primary, #1a1a1a);
2549
+ background: var(--bg-primary, #ffffff);
2550
+ border: 1px solid var(--border-color, #d0d0d0);
2551
+ border-radius: 4px;
2552
+ outline: none;
2553
+ transition: border-color 0.15s, box-shadow 0.15s;
2554
+ }
2555
+
2556
+ .argument-input:focus {
2557
+ border-color: var(--color-primary, #2563eb);
2558
+ box-shadow: 0 0 0 2px rgba(37, 99, 235, 0.15);
2559
+ }
2560
+
2561
+ .argument-input:hover:not(:focus) {
2562
+ border-color: var(--border-color-dark, #c0c0c0);
2563
+ }
2564
+
2565
+ [data-theme="dark"] .argument-input {
2566
+ color: var(--text-primary, #e0e0e0);
2567
+ background: var(--bg-primary, #121212);
2568
+ border-color: var(--border-color, #4e4e4e);
2569
+ }
2570
+
2571
+ [data-theme="dark"] .argument-input:focus {
2572
+ border-color: var(--color-primary, #60a5fa);
2573
+ box-shadow: 0 0 0 2px rgba(96, 165, 250, 0.2);
2574
+ }
2575
+
2576
+ [data-theme="dark"] .argument-input:hover:not(:focus) {
2577
+ border-color: var(--border-color-dark, #5e5e5e);
2578
+ }
2579
+
2580
+ /* Number input specific */
2581
+ .argument-input--number {
2582
+ -moz-appearance: textfield;
2583
+ }
2584
+
2585
+ .argument-input--number::-webkit-outer-spin-button,
2586
+ .argument-input--number::-webkit-inner-spin-button {
2587
+ -webkit-appearance: none;
2588
+ margin: 0;
2589
+ }
2590
+
2591
+ /* String input specific */
2592
+ .argument-input--string::placeholder {
2593
+ color: var(--text-muted, #aaa);
2594
+ font-style: italic;
2595
+ }
2596
+
2597
+ /* Boolean and null select */
2598
+ .argument-input--boolean,
2599
+ .argument-input--null {
2600
+ cursor: pointer;
2601
+ /* Remove all native select styling */
2602
+ -webkit-appearance: none;
2603
+ -moz-appearance: none;
2604
+ appearance: none;
2605
+ /* Custom dropdown arrow - use shorthand to override base class */
2606
+ background: var(--bg-primary, #ffffff) url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%23666' stroke-width='2'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E") no-repeat right 8px center / 12px;
2607
+ padding-right: 28px;
2608
+ }
2609
+
2610
+ /* Remove IE dropdown arrow */
2611
+ .argument-input--boolean::-ms-expand,
2612
+ .argument-input--null::-ms-expand {
2613
+ display: none;
2614
+ }
2615
+
2616
+ [data-theme="dark"] .argument-input--boolean,
2617
+ [data-theme="dark"] .argument-input--null {
2618
+ background: var(--bg-primary, #121212) url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%23aaa' stroke-width='2'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E") no-repeat right 8px center / 12px;
2619
+ }
2620
+
2621
+ /* Complex value link button */
2622
+ .argument-value--complex {
2623
+ display: flex;
2624
+ align-items: center;
2625
+ gap: 6px;
2626
+ flex: 1;
2627
+ padding: 6px 8px;
2628
+ font-size: 12px;
2629
+ font-family: 'SF Mono', Monaco, 'Cascadia Code', monospace;
2630
+ color: var(--color-primary, #2563eb);
2631
+ background: var(--bg-primary, #ffffff);
2632
+ border: 1px solid var(--border-color, #d0d0d0);
2633
+ border-radius: 4px;
2634
+ cursor: pointer;
2635
+ text-align: left;
2636
+ overflow: hidden;
2637
+ text-overflow: ellipsis;
2638
+ white-space: nowrap;
2639
+ transition: background 0.15s, border-color 0.15s;
2640
+ }
2641
+
2642
+ .argument-value--complex:hover {
2643
+ background: var(--bg-hover, #f5f5f5);
2644
+ border-color: var(--color-primary, #2563eb);
2645
+ }
2646
+
2647
+ .argument-value--complex svg {
2648
+ flex-shrink: 0;
2649
+ opacity: 0.6;
2650
+ }
2651
+
2652
+ [data-theme="dark"] .argument-value--complex {
2653
+ color: var(--color-primary, #60a5fa);
2654
+ background: var(--bg-primary, #121212);
2655
+ border-color: var(--border-color, #4e4e4e);
2656
+ }
2657
+
2658
+ [data-theme="dark"] .argument-value--complex:hover {
2659
+ background: var(--bg-hover, #2a2a2a);
2660
+ border-color: var(--color-primary, #60a5fa);
2661
+ }
2662
+
2663
+ /* Readonly literal display */
2664
+ .argument-input--readonly {
2665
+ display: block;
2666
+ width: 100%;
2667
+ padding: 6px 8px;
2668
+ font-size: 12px;
2669
+ font-family: 'SF Mono', Monaco, 'Cascadia Code', monospace;
2670
+ color: var(--text-secondary, #666);
2671
+ background: var(--bg-tertiary, #f5f5f5);
2672
+ border: 1px solid var(--border-color, #e0e0e0);
2673
+ border-radius: 4px;
2674
+ }
2675
+
2676
+ [data-theme="dark"] .argument-input--readonly {
2677
+ color: var(--text-secondary, #aaa);
2678
+ background: var(--bg-tertiary, #252525);
2679
+ border-color: var(--border-color, #3e3e3e);
2680
+ }
2681
+
2682
+ /* ==========================================================================
2683
+ Operator List (Empty State with Full Operator Selection)
2684
+ ========================================================================== */
2685
+
2686
+ .properties-panel-search {
2687
+ position: relative;
2688
+ padding: 12px 16px;
2689
+ border-bottom: 1px solid var(--border-light, #f0f0f0);
2690
+ }
2691
+
2692
+ [data-theme="dark"] .properties-panel-search {
2693
+ border-bottom-color: var(--border-color, #3e3e3e);
2694
+ }
2695
+
2696
+ .properties-panel-search-icon {
2697
+ position: absolute;
2698
+ left: 28px;
2699
+ top: 50%;
2700
+ transform: translateY(-50%);
2701
+ color: var(--text-tertiary, #999);
2702
+ pointer-events: none;
2703
+ }
2704
+
2705
+ .properties-panel-search-input {
2706
+ width: 100%;
2707
+ padding: 8px 12px 8px 32px;
2708
+ font-size: 13px;
2709
+ color: var(--text-primary, #1a1a1a);
2710
+ background: var(--bg-tertiary, #f8f9fa);
2711
+ border: 1px solid var(--border-color, #e0e0e0);
2712
+ border-radius: 6px;
2713
+ outline: none;
2714
+ transition: border-color 0.15s, box-shadow 0.15s;
2715
+ }
2716
+
2717
+ .properties-panel-search-input:focus {
2718
+ border-color: var(--color-primary, #2563eb);
2719
+ box-shadow: 0 0 0 2px rgba(37, 99, 235, 0.1);
2720
+ }
2721
+
2722
+ .properties-panel-search-input::placeholder {
2723
+ color: var(--text-tertiary, #999);
2724
+ }
2725
+
2726
+ [data-theme="dark"] .properties-panel-search-input {
2727
+ color: var(--text-primary, #e0e0e0);
2728
+ background: var(--bg-tertiary, #252525);
2729
+ border-color: var(--border-color, #3e3e3e);
2730
+ }
2731
+
2732
+ [data-theme="dark"] .properties-panel-search-input:focus {
2733
+ border-color: var(--color-primary, #60a5fa);
2734
+ box-shadow: 0 0 0 2px rgba(96, 165, 250, 0.15);
2735
+ }
2736
+
2737
+ .properties-panel-operators-list {
2738
+ flex: 1;
2739
+ overflow-y: auto;
2740
+ padding: 8px 0;
2741
+ }
2742
+
2743
+ /* Category styling - reset the block display from header category */
2744
+ .properties-panel-operators-list .properties-panel-category {
2745
+ display: block;
2746
+ margin-top: 0;
2747
+ font-size: inherit;
2748
+ color: inherit;
2749
+ }
2750
+
2751
+ .properties-panel-category-header {
2752
+ display: flex;
2753
+ align-items: center;
2754
+ gap: 8px;
2755
+ width: 100%;
2756
+ padding: 8px 16px;
2757
+ font-size: 12px;
2758
+ font-weight: 600;
2759
+ color: var(--text-secondary, #666);
2760
+ background: transparent;
2761
+ border: none;
2762
+ cursor: pointer;
2763
+ transition: background 0.15s;
2764
+ }
2765
+
2766
+ .properties-panel-category-header:hover {
2767
+ background: var(--bg-hover, #f5f5f5);
2768
+ }
2769
+
2770
+ [data-theme="dark"] .properties-panel-category-header:hover {
2771
+ background: var(--bg-hover, #3e3e3e);
2772
+ }
2773
+
2774
+ .properties-panel-category-header svg {
2775
+ flex-shrink: 0;
2776
+ color: var(--text-tertiary, #999);
2777
+ }
2778
+
2779
+ .properties-panel-category-dot {
2780
+ width: 8px;
2781
+ height: 8px;
2782
+ border-radius: 50%;
2783
+ flex-shrink: 0;
2784
+ }
2785
+
2786
+ .properties-panel-category-label {
2787
+ flex: 1;
2788
+ text-align: left;
2789
+ }
2790
+
2791
+ .properties-panel-category-count {
2792
+ font-size: 11px;
2793
+ font-weight: 400;
2794
+ color: var(--text-tertiary, #999);
2795
+ padding: 2px 6px;
2796
+ background: var(--bg-tertiary, #f0f0f0);
2797
+ border-radius: 10px;
2798
+ }
2799
+
2800
+ [data-theme="dark"] .properties-panel-category-count {
2801
+ background: var(--bg-tertiary, #2e2e2e);
2802
+ }
2803
+
2804
+ .properties-panel-category-items {
2805
+ padding: 4px 8px 8px 24px;
2806
+ }
2807
+
2808
+ .properties-panel-operator-item {
2809
+ display: flex;
2810
+ align-items: center;
2811
+ justify-content: space-between;
2812
+ gap: 8px;
2813
+ width: 100%;
2814
+ padding: 6px 12px;
2815
+ font-size: 12px;
2816
+ color: var(--text-primary, #1a1a1a);
2817
+ background: transparent;
2818
+ border: none;
2819
+ border-radius: 4px;
2820
+ cursor: pointer;
2821
+ transition: background 0.15s;
2822
+ }
2823
+
2824
+ .properties-panel-operator-item:hover {
2825
+ background: var(--bg-hover, #f0f0f0);
2826
+ }
2827
+
2828
+ [data-theme="dark"] .properties-panel-operator-item {
2829
+ color: var(--text-primary, #e0e0e0);
2830
+ }
2831
+
2832
+ [data-theme="dark"] .properties-panel-operator-item:hover {
2833
+ background: var(--bg-hover, #3e3e3e);
2834
+ }
2835
+
2836
+ .properties-panel-operator-name {
2837
+ flex: 1;
2838
+ text-align: left;
2839
+ font-weight: 500;
2840
+ }
2841
+
2842
+ .properties-panel-operator-symbol {
2843
+ font-family: 'SF Mono', Monaco, 'Cascadia Code', monospace;
2844
+ font-size: 11px;
2845
+ color: var(--text-tertiary, #999);
2846
+ padding: 2px 6px;
2847
+ background: var(--bg-tertiary, #f5f5f5);
2848
+ border-radius: 4px;
2849
+ }
2850
+
2851
+ [data-theme="dark"] .properties-panel-operator-symbol {
2852
+ background: var(--bg-tertiary, #2e2e2e);
2853
+ }
2854
+
2855
+ /* ==========================================================================
2856
+ Mobile Bottom Sheet
2857
+ ========================================================================== */
2858
+
2859
+ @media (max-width: 1024px) {
2860
+ .properties-panel {
2861
+ position: fixed;
2862
+ top: auto;
2863
+ left: 0;
2864
+ right: 0;
2865
+ bottom: 52px; /* above mobile nav tab bar */
2866
+ width: 100%;
2867
+ height: 45%;
2868
+ max-height: 340px;
2869
+ border-radius: 12px 12px 0 0;
2870
+ border: none;
2871
+ border-top: 1px solid var(--border-color, #e0e0e0);
2872
+ box-shadow: 0 -4px 16px rgba(0, 0, 0, 0.1);
2873
+ z-index: 200;
2874
+ }
2875
+
2876
+ [data-theme="dark"] .properties-panel {
2877
+ box-shadow: 0 -4px 16px rgba(0, 0, 0, 0.35);
2878
+ }
2879
+
2880
+ .properties-panel-close {
2881
+ width: 44px;
2882
+ height: 44px;
2883
+ }
2884
+
2885
+ .properties-panel-section-toggle {
2886
+ min-height: 44px;
2887
+ }
2888
+
2889
+ .properties-panel-operator-item {
2890
+ min-height: 44px;
2891
+ padding: 8px 12px;
2892
+ }
2893
+
2894
+ .properties-panel-category-header {
2895
+ min-height: 44px;
2896
+ }
779
2897
 
780
- [data-theme="dark"] .debugger-btn {
781
- background: rgba(55, 65, 81, 0.8);
782
- }
2898
+ .properties-panel-quick-add-btn {
2899
+ min-height: 44px;
2900
+ }
783
2901
 
784
- [data-theme="dark"] .debugger-btn:hover:not(:disabled) {
785
- background: rgba(75, 85, 99, 0.9);
2902
+ .properties-panel-delete {
2903
+ min-height: 44px;
2904
+ }
2905
+
2906
+ .arguments-add-btn {
2907
+ min-height: 44px;
2908
+ }
2909
+
2910
+ .argument-remove {
2911
+ width: 44px;
2912
+ height: 44px;
2913
+ }
786
2914
  }
787
2915
 
788
- [data-theme="dark"] .speed-slider {
789
- background: rgba(75, 85, 99, 0.8);
2916
+ /* Landscape mobile: panel on the right side instead of bottom sheet */
2917
+ @media (max-width: 1024px) and (orientation: landscape) {
2918
+ .properties-panel {
2919
+ position: fixed;
2920
+ top: 44px; /* below the header */
2921
+ left: auto;
2922
+ right: 0;
2923
+ bottom: 40px; /* above landscape mobile nav tab bar (40px in landscape) */
2924
+ width: 280px;
2925
+ height: auto;
2926
+ max-height: none;
2927
+ border-radius: 0;
2928
+ border: none;
2929
+ border-left: 1px solid var(--border-color, #e0e0e0);
2930
+ border-top: none;
2931
+ box-shadow: -4px 0 16px rgba(0, 0, 0, 0.1);
2932
+ }
2933
+
2934
+ [data-theme="dark"] .properties-panel {
2935
+ box-shadow: -4px 0 16px rgba(0, 0, 0, 0.35);
2936
+ }
790
2937
  }
791
2938
  /* Base node styles - shared across all node types */
792
2939
  .logic-node {
@@ -884,45 +3031,6 @@ svg.react-flow__connectionline {
884
3031
  opacity: 1;
885
3032
  }
886
3033
 
887
- /* Cell collapse toggle (for vertical cell nodes) */
888
- .cell-collapse-toggle {
889
- background: transparent;
890
- border: none;
891
- color: var(--text-tertiary);
892
- font-size: 10px;
893
- cursor: pointer;
894
- padding: 2px 4px;
895
- opacity: 0.7;
896
- transition: opacity 0.2s;
897
- flex-shrink: 0;
898
- margin-left: auto;
899
- }
900
-
901
- .cell-collapse-toggle:hover {
902
- opacity: 1;
903
- color: var(--text-primary);
904
- }
905
-
906
- /* Collapsed summary in vertical cell row */
907
- .collapsed-summary {
908
- display: flex;
909
- align-items: center;
910
- gap: 4px;
911
- background: var(--bg-hover);
912
- padding: 2px 6px;
913
- border-radius: 3px;
914
- flex: 1;
915
- }
916
-
917
- .collapsed-summary .arg-icon {
918
- font-size: 11px;
919
- }
920
-
921
- .collapsed-summary .arg-label {
922
- font-size: 11px;
923
- color: var(--text-secondary);
924
- }
925
-
926
3034
  /* Expression text for collapsed nodes */
927
3035
  .expression-text {
928
3036
  font-family: 'SF Mono', 'Consolas', monospace;
@@ -2044,8 +4152,107 @@ svg.react-flow__connectionline {
2044
4152
  background: var(--bg-tertiary);
2045
4153
  border-radius: 8px;
2046
4154
  overflow: hidden;
4155
+ display: flex;
4156
+ flex-direction: column;
4157
+ }
4158
+
4159
+ /* Body: contains main canvas (full size) + floating properties panel */
4160
+ .logic-editor-body {
4161
+ flex: 1;
4162
+ min-height: 0;
4163
+ position: relative;
4164
+ }
4165
+
4166
+ .logic-editor-main {
4167
+ width: 100%;
4168
+ height: 100%;
4169
+ }
4170
+
4171
+ /* ============================================================================
4172
+ Toolbar
4173
+ ============================================================================ */
4174
+
4175
+ .logic-editor-toolbar {
4176
+ display: flex;
4177
+ align-items: center;
4178
+ height: 44px;
4179
+ padding: 0 16px;
4180
+ border-bottom: 1px solid var(--border-light, #e8e8e8);
4181
+ background: var(--bg-secondary, #ffffff);
4182
+ flex-shrink: 0;
4183
+ gap: 10px;
4184
+ overflow-x: auto;
4185
+ -webkit-overflow-scrolling: touch;
4186
+ scrollbar-width: none;
4187
+ }
4188
+
4189
+ .logic-editor-toolbar::-webkit-scrollbar {
4190
+ display: none;
4191
+ }
4192
+
4193
+ [data-theme="dark"] .logic-editor-toolbar {
4194
+ background: var(--bg-secondary, #1e1e1e);
4195
+ border-bottom-color: var(--border-color, #3e3e3e);
4196
+ }
4197
+
4198
+ .logic-editor-toolbar-spacer {
4199
+ flex: 1;
4200
+ }
4201
+
4202
+ .logic-editor-toolbar .preserve-structure-toggle {
4203
+ display: flex;
4204
+ align-items: center;
4205
+ gap: 6px;
4206
+ font-size: 12px;
4207
+ color: var(--text-secondary, #666);
4208
+ cursor: pointer;
4209
+ user-select: none;
4210
+ white-space: nowrap;
4211
+ flex-shrink: 0;
4212
+ }
4213
+
4214
+ .logic-editor-toolbar .preserve-structure-toggle input[type="checkbox"] {
4215
+ margin: 0;
4216
+ cursor: pointer;
4217
+ }
4218
+
4219
+ /* Shared toolbar button style (undo/redo, etc.) */
4220
+ .toolbar-btn {
4221
+ display: flex;
4222
+ align-items: center;
4223
+ justify-content: center;
4224
+ width: 28px;
4225
+ height: 28px;
4226
+ padding: 0;
4227
+ background: transparent;
4228
+ border: none;
4229
+ border-radius: 5px;
4230
+ color: var(--text-secondary, #666);
4231
+ cursor: pointer;
4232
+ transition: background 0.15s, color 0.15s;
4233
+ flex-shrink: 0;
4234
+ }
4235
+
4236
+ .toolbar-btn:hover:not(:disabled) {
4237
+ background: var(--bg-hover, #f0f0f0);
4238
+ color: var(--text-primary, #1a1a1a);
4239
+ }
4240
+
4241
+ .toolbar-btn:disabled {
4242
+ opacity: 0.35;
4243
+ cursor: not-allowed;
2047
4244
  }
2048
4245
 
4246
+ [data-theme="dark"] .toolbar-btn {
4247
+ color: var(--text-secondary, #aaa);
4248
+ }
4249
+
4250
+ [data-theme="dark"] .toolbar-btn:hover:not(:disabled) {
4251
+ background: var(--bg-hover, #3e3e3e);
4252
+ color: var(--text-primary, #e0e0e0);
4253
+ }
4254
+
4255
+
2049
4256
  .logic-editor .react-flow {
2050
4257
  width: 100%;
2051
4258
  height: 100%;
@@ -2123,6 +4330,257 @@ svg.react-flow__connectionline {
2123
4330
  .logic-editor .react-flow__attribution {
2124
4331
  display: none;
2125
4332
  }
4333
+
4334
+ /* Mobile toolbar adjustments */
4335
+ @media (max-width: 1024px) {
4336
+ .logic-editor-toolbar {
4337
+ padding: 0 8px;
4338
+ gap: 6px;
4339
+ }
4340
+
4341
+ .logic-editor-toolbar-spacer {
4342
+ flex: 0 0 4px;
4343
+ }
4344
+
4345
+ .toolbar-btn {
4346
+ width: 40px;
4347
+ height: 40px;
4348
+ }
4349
+
4350
+ .preserve-structure-toggle span {
4351
+ font-size: 11px;
4352
+ }
4353
+
4354
+ .context-menu-item {
4355
+ min-height: 44px;
4356
+ padding: 10px 12px;
4357
+ }
4358
+ }
4359
+
4360
+ /* (Undo/Redo now uses .toolbar-btn inline in toolbar) */
4361
+
4362
+ /* ============================================================================
4363
+ Add Argument Button (shared by OperatorNode and VerticalCellNode)
4364
+ ============================================================================ */
4365
+
4366
+ .add-arg-button {
4367
+ display: flex;
4368
+ align-items: center;
4369
+ justify-content: center;
4370
+ gap: 4px;
4371
+ padding: 4px 8px;
4372
+ margin: 4px 8px 8px;
4373
+ border: 1.5px dashed var(--color-primary, #2563eb);
4374
+ border-radius: 4px;
4375
+ background: transparent;
4376
+ color: var(--color-primary, #2563eb);
4377
+ font-size: 11px;
4378
+ font-family: inherit;
4379
+ cursor: pointer;
4380
+ opacity: 0.85;
4381
+ transition: all 0.15s ease;
4382
+ }
4383
+
4384
+ .add-arg-button:hover {
4385
+ background: var(--color-primary, #2563eb);
4386
+ color: white;
4387
+ border-style: solid;
4388
+ opacity: 1;
4389
+ }
4390
+
4391
+ .add-arg-button-label {
4392
+ font-weight: 500;
4393
+ white-space: nowrap;
4394
+ }
4395
+
4396
+ /* Vertical cell variant - full width */
4397
+ .add-arg-button--vertical {
4398
+ width: calc(100% - 16px);
4399
+ }
4400
+
4401
+ /* Dark mode */
4402
+ [data-theme="dark"] .add-arg-button {
4403
+ border-color: var(--color-primary, #60a5fa);
4404
+ color: var(--color-primary, #60a5fa);
4405
+ }
4406
+
4407
+ [data-theme="dark"] .add-arg-button:hover {
4408
+ background: var(--color-primary, #60a5fa);
4409
+ color: var(--bg-primary, #121212);
4410
+ }
4411
+
4412
+ /* Legacy placeholder - kept for compatibility but using new .add-arg-button is preferred */
4413
+ .operator-arg-placeholder {
4414
+ position: absolute;
4415
+ right: -4px;
4416
+ transform: translateY(-50%);
4417
+ width: 16px;
4418
+ height: 16px;
4419
+ padding: 0;
4420
+ display: flex;
4421
+ align-items: center;
4422
+ justify-content: center;
4423
+ border: 1.5px dashed var(--color-primary, #2563eb);
4424
+ border-radius: 50%;
4425
+ background: var(--bg-primary, #fff);
4426
+ color: var(--color-primary, #2563eb);
4427
+ cursor: pointer;
4428
+ opacity: 0.7;
4429
+ transition: all 0.15s ease;
4430
+ z-index: 10;
4431
+ }
4432
+
4433
+ .operator-arg-placeholder:hover {
4434
+ opacity: 1;
4435
+ background: var(--color-primary, #2563eb);
4436
+ color: white;
4437
+ border-style: solid;
4438
+ transform: translateY(-50%) scale(1.1);
4439
+ }
4440
+
4441
+ /* Dark mode */
4442
+ [data-theme="dark"] .operator-arg-placeholder {
4443
+ background: var(--bg-secondary, #1e1e1e);
4444
+ border-color: var(--color-primary, #60a5fa);
4445
+ color: var(--color-primary, #60a5fa);
4446
+ }
4447
+
4448
+ [data-theme="dark"] .operator-arg-placeholder:hover {
4449
+ background: var(--color-primary, #60a5fa);
4450
+ color: var(--bg-primary, #121212);
4451
+ }
4452
+
4453
+ /* ============================================================================
4454
+ Context Menu
4455
+ ============================================================================ */
4456
+
4457
+ .context-menu {
4458
+ position: fixed;
4459
+ z-index: 1000;
4460
+ min-width: 180px;
4461
+ max-width: 280px;
4462
+ background: var(--bg-primary, #ffffff);
4463
+ border: 1px solid var(--border-color, #e0e0e0);
4464
+ border-radius: 8px;
4465
+ box-shadow: 0 4px 16px rgba(0, 0, 0, 0.12), 0 2px 4px rgba(0, 0, 0, 0.08);
4466
+ padding: 4px 0;
4467
+ font-size: 13px;
4468
+ outline: none;
4469
+ }
4470
+
4471
+ [data-theme="dark"] .context-menu {
4472
+ background: var(--bg-secondary, #1e1e1e);
4473
+ border-color: var(--border-color, #3e3e3e);
4474
+ box-shadow: 0 4px 16px rgba(0, 0, 0, 0.4), 0 2px 4px rgba(0, 0, 0, 0.2);
4475
+ }
4476
+
4477
+ .context-menu-item {
4478
+ display: flex;
4479
+ align-items: center;
4480
+ gap: 8px;
4481
+ width: 100%;
4482
+ padding: 8px 12px;
4483
+ background: none;
4484
+ border: none;
4485
+ color: var(--text-primary, #1a1a1a);
4486
+ font-size: 13px;
4487
+ font-family: inherit;
4488
+ text-align: left;
4489
+ cursor: pointer;
4490
+ transition: background 0.1s;
4491
+ }
4492
+
4493
+ .context-menu-item:hover,
4494
+ .context-menu-item:focus {
4495
+ background: var(--bg-hover, #f0f0f0);
4496
+ outline: none;
4497
+ }
4498
+
4499
+ .context-menu-item:disabled {
4500
+ color: var(--text-muted, #999);
4501
+ cursor: not-allowed;
4502
+ }
4503
+
4504
+ .context-menu-item:disabled:hover {
4505
+ background: none;
4506
+ }
4507
+
4508
+ [data-theme="dark"] .context-menu-item {
4509
+ color: var(--text-primary, #e0e0e0);
4510
+ }
4511
+
4512
+ [data-theme="dark"] .context-menu-item:hover,
4513
+ [data-theme="dark"] .context-menu-item:focus {
4514
+ background: var(--bg-hover, #3e3e3e);
4515
+ }
4516
+
4517
+ .context-menu-item-icon {
4518
+ display: flex;
4519
+ align-items: center;
4520
+ justify-content: center;
4521
+ width: 16px;
4522
+ height: 16px;
4523
+ flex-shrink: 0;
4524
+ color: var(--text-secondary, #666);
4525
+ }
4526
+
4527
+ [data-theme="dark"] .context-menu-item-icon {
4528
+ color: var(--text-secondary, #aaa);
4529
+ }
4530
+
4531
+ .context-menu-item-label {
4532
+ flex: 1;
4533
+ }
4534
+
4535
+ .context-menu-item-shortcut {
4536
+ font-size: 11px;
4537
+ color: var(--text-muted, #999);
4538
+ margin-left: auto;
4539
+ padding-left: 16px;
4540
+ }
4541
+
4542
+ .context-menu-item-arrow {
4543
+ color: var(--text-muted, #999);
4544
+ margin-left: auto;
4545
+ }
4546
+
4547
+ .context-menu-divider {
4548
+ height: 1px;
4549
+ background: var(--border-light, #e8e8e8);
4550
+ margin: 4px 8px;
4551
+ }
4552
+
4553
+ [data-theme="dark"] .context-menu-divider {
4554
+ background: var(--border-color, #3e3e3e);
4555
+ }
4556
+
4557
+ .context-menu-submenu {
4558
+ position: relative;
4559
+ }
4560
+
4561
+ .context-menu-submenu-content {
4562
+ position: absolute;
4563
+ left: 100%;
4564
+ top: -4px;
4565
+ margin-left: 2px;
4566
+ }
4567
+
4568
+ /* Danger variant for destructive actions */
4569
+ .context-menu-item--danger {
4570
+ color: var(--color-error, #dc2626);
4571
+ }
4572
+
4573
+ .context-menu-item--danger .context-menu-item-icon {
4574
+ color: var(--color-error, #dc2626);
4575
+ }
4576
+
4577
+ .context-menu-item--danger:hover:not(:disabled) {
4578
+ background: rgba(220, 38, 38, 0.1);
4579
+ }
4580
+
4581
+ [data-theme="dark"] .context-menu-item--danger:hover:not(:disabled) {
4582
+ background: rgba(239, 68, 68, 0.15);
4583
+ }
2126
4584
  /* this gets exported as style.css and can be used for the default theming */
2127
4585
  /* these are the necessary styles for React/Svelte Flow, they get used by base.css and style.css */
2128
4586
  .react-flow {