@goplasmatic/datalogic-ui 4.0.21 → 5.0.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.
Files changed (38) hide show
  1. package/README.md +35 -15
  2. package/dist/components/logic-editor/DataLogicEditor.d.ts +1 -1
  3. package/dist/components/logic-editor/DataLogicEditor.d.ts.map +1 -1
  4. package/dist/components/logic-editor/EditorToolbar.d.ts +3 -3
  5. package/dist/components/logic-editor/EditorToolbar.d.ts.map +1 -1
  6. package/dist/components/logic-editor/UndoRedoToolbar.d.ts.map +1 -1
  7. package/dist/components/logic-editor/config/operators/utility.d.ts.map +1 -1
  8. package/dist/components/logic-editor/context/editor/useClipboardState.d.ts.map +1 -1
  9. package/dist/components/logic-editor/context/editor/useHistoryState.d.ts.map +1 -1
  10. package/dist/components/logic-editor/debugger-controls/DebuggerControls.d.ts.map +1 -1
  11. package/dist/components/logic-editor/hooks/index.d.ts +1 -1
  12. package/dist/components/logic-editor/hooks/index.d.ts.map +1 -1
  13. package/dist/components/logic-editor/hooks/useLogicEditor.d.ts +3 -3
  14. package/dist/components/logic-editor/hooks/useLogicEditor.d.ts.map +1 -1
  15. package/dist/components/logic-editor/hooks/useWasmEvaluator.d.ts +8 -3
  16. package/dist/components/logic-editor/hooks/useWasmEvaluator.d.ts.map +1 -1
  17. package/dist/components/logic-editor/types/editor.d.ts +18 -6
  18. package/dist/components/logic-editor/types/editor.d.ts.map +1 -1
  19. package/dist/components/logic-editor/types/index.d.ts +1 -1
  20. package/dist/components/logic-editor/types/index.d.ts.map +1 -1
  21. package/dist/components/logic-editor/types/trace.d.ts +22 -0
  22. package/dist/components/logic-editor/types/trace.d.ts.map +1 -1
  23. package/dist/components/logic-editor/utils/converters/types.d.ts +2 -2
  24. package/dist/components/logic-editor/utils/converters/types.d.ts.map +1 -1
  25. package/dist/components/logic-editor/utils/jsonlogic-to-nodes.d.ts +2 -2
  26. package/dist/components/logic-editor/utils/jsonlogic-to-nodes.d.ts.map +1 -1
  27. package/dist/components/logic-editor/utils/trace/node-type.d.ts +1 -1
  28. package/dist/components/logic-editor/utils/trace/node-type.d.ts.map +1 -1
  29. package/dist/components/logic-editor/utils/trace/types.d.ts +3 -3
  30. package/dist/components/logic-editor/utils/trace/types.d.ts.map +1 -1
  31. package/dist/datalogic_wasm-CF1jcNAu.js +634 -0
  32. package/dist/datalogic_wasm-Dj9TEPTG.cjs +637 -0
  33. package/dist/index.cjs +868 -388
  34. package/dist/index.js +869 -389
  35. package/dist/styles.css +302 -136
  36. package/package.json +32 -29
  37. package/dist/datalogic_wasm-Ckkdrc0z.cjs +0 -383
  38. package/dist/datalogic_wasm-daWVf40b.js +0 -380
package/dist/styles.css CHANGED
@@ -6,42 +6,43 @@
6
6
  */
7
7
 
8
8
  .logic-editor {
9
- /* Light theme (default) */
10
- --bg-primary: #f5f5f5;
9
+ /* Light theme (default) — zinc-leaning neutrals */
10
+ --bg-primary: #fafafa;
11
11
  --bg-secondary: #ffffff;
12
- --bg-tertiary: #fafafa;
13
- --bg-hover: #f0f0f0;
14
- --bg-active: #e8e8e8;
12
+ --bg-tertiary: #f6f6f7;
13
+ --bg-hover: #f0f0f1;
14
+ --bg-active: #e8e8ea;
15
15
 
16
- --text-primary: #333333;
17
- --text-secondary: #555555;
18
- --text-tertiary: #666666;
19
- --text-muted: #999999;
20
- --text-placeholder: #aaaaaa;
16
+ --text-primary: #18181b;
17
+ --text-secondary: #3f3f46;
18
+ --text-tertiary: #71717a;
19
+ --text-muted: #a1a1aa;
20
+ --text-placeholder: #c4c4c7;
21
21
 
22
- --border-primary: #e0e0e0;
23
- --border-secondary: #dddddd;
24
- --border-light: #eeeeee;
22
+ --border-primary: rgba(0, 0, 0, 0.10);
23
+ --border-secondary: rgba(0, 0, 0, 0.06);
24
+ --border-light: rgba(0, 0, 0, 0.04);
25
25
 
26
- --accent-blue: #3b82f6;
27
- --accent-blue-light: #dbeafe;
26
+ --accent-blue: #6366f1;
27
+ --accent-blue-light: #e0e7ff;
28
+ --accent-blue-hover: #4f46e5;
28
29
 
29
30
  --accent-amber: #f59e0b;
30
31
  --accent-amber-light: #fef3c7;
31
32
 
32
33
  /* Status colors */
33
- --success-bg: #d1fae5;
34
- --success-text: #059669;
34
+ --success-bg: #ecfdf5;
35
+ --success-text: #047857;
35
36
  --success-border: #a7f3d0;
36
37
 
37
- --error-bg: #fee2e2;
38
- --error-bg-light: #fef2f2;
39
- --error-bg-lighter: #fff5f5;
38
+ --error-bg: #fef2f2;
39
+ --error-bg-light: #fff7f7;
40
+ --error-bg-lighter: #fffafa;
40
41
  --error-text: #dc2626;
41
42
  --error-border: #fecaca;
42
43
 
43
- --warning-bg: #fef3c7;
44
- --warning-text: #d97706;
44
+ --warning-bg: #fffbeb;
45
+ --warning-text: #b45309;
45
46
  --warning-border: #fde68a;
46
47
 
47
48
  /* Syntax highlighting */
@@ -53,10 +54,10 @@
53
54
  --syntax-bracket: #24292f;
54
55
  --syntax-punctuation: #24292f;
55
56
 
56
- /* Node colors - these stay consistent */
57
+ /* Node colors */
57
58
  --node-bg: #ffffff;
58
- --node-shadow: rgba(0, 0, 0, 0.1);
59
- --node-shadow-hover: rgba(0, 0, 0, 0.15);
59
+ --node-shadow: 0 1px 3px rgba(0, 0, 0, 0.06), 0 1px 2px rgba(0, 0, 0, 0.04);
60
+ --node-shadow-hover: 0 4px 12px rgba(0, 0, 0, 0.08), 0 2px 4px rgba(0, 0, 0, 0.05);
60
61
 
61
62
  /* Code background */
62
63
  --code-bg: #f8f9fa;
@@ -79,7 +80,26 @@
79
80
  --debug-value-array: #7c3aed;
80
81
  --debug-value-null: #6b7280;
81
82
 
82
- font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, sans-serif;
83
+ /* Radius scale */
84
+ --radius-sm: 6px;
85
+ --radius-md: 10px;
86
+ --radius-lg: 14px;
87
+
88
+ /* Shadow elevation scale (layered: ambient + key) */
89
+ --shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.04);
90
+ --shadow-md: 0 2px 4px rgba(0, 0, 0, 0.04), 0 4px 12px rgba(0, 0, 0, 0.06);
91
+ --shadow-lg: 0 4px 8px rgba(0, 0, 0, 0.06), 0 12px 32px rgba(0, 0, 0, 0.10);
92
+
93
+ /* Motion */
94
+ --motion-fast: 120ms;
95
+ --motion-base: 180ms;
96
+ --motion-slow: 260ms;
97
+ --ease-out: cubic-bezier(0.4, 0, 0.2, 1);
98
+
99
+ /* Focus ring */
100
+ --focus-ring: 0 0 0 2px var(--accent-blue);
101
+
102
+ font-family: -apple-system, BlinkMacSystemFont, 'Inter', 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, sans-serif;
83
103
  line-height: 1.5;
84
104
  font-weight: 400;
85
105
  color: var(--text-primary);
@@ -87,6 +107,7 @@
87
107
  text-rendering: optimizeLegibility;
88
108
  -webkit-font-smoothing: antialiased;
89
109
  -moz-osx-font-smoothing: grayscale;
110
+ font-feature-settings: 'cv11', 'ss01';
90
111
  }
91
112
 
92
113
  .logic-editor *,
@@ -100,40 +121,41 @@
100
121
  }
101
122
 
102
123
  .logic-editor[data-theme="dark"] {
103
- --bg-primary: #1a1a1a;
104
- --bg-secondary: #242424;
105
- --bg-tertiary: #2a2a2a;
106
- --bg-hover: #333333;
107
- --bg-active: #404040;
108
-
109
- --text-primary: #e5e5e5;
110
- --text-secondary: #cccccc;
111
- --text-tertiary: #b3b3b3;
112
- --text-muted: #888888;
113
- --text-placeholder: #666666;
114
-
115
- --border-primary: #404040;
116
- --border-secondary: #4a4a4a;
117
- --border-light: #333333;
118
-
119
- --accent-blue: #60a5fa;
120
- --accent-blue-light: #1e3a5f;
124
+ --bg-primary: #0c0c0d;
125
+ --bg-secondary: #161618;
126
+ --bg-tertiary: #1c1c1f;
127
+ --bg-hover: #242427;
128
+ --bg-active: #2c2c30;
129
+
130
+ --text-primary: #fafafa;
131
+ --text-secondary: #d4d4d8;
132
+ --text-tertiary: #a1a1aa;
133
+ --text-muted: #71717a;
134
+ --text-placeholder: #52525b;
135
+
136
+ --border-primary: rgba(255, 255, 255, 0.10);
137
+ --border-secondary: rgba(255, 255, 255, 0.06);
138
+ --border-light: rgba(255, 255, 255, 0.04);
139
+
140
+ --accent-blue: #818cf8;
141
+ --accent-blue-light: #1e1b4b;
142
+ --accent-blue-hover: #a5b4fc;
121
143
 
122
144
  --accent-amber: #fbbf24;
123
- --accent-amber-light: #451a03;
145
+ --accent-amber-light: #422006;
124
146
 
125
147
  /* Status colors - darker variants */
126
- --success-bg: #064e3b;
148
+ --success-bg: #052e1c;
127
149
  --success-text: #6ee7b7;
128
150
  --success-border: #065f46;
129
151
 
130
- --error-bg: #450a0a;
131
- --error-bg-light: #3f0a0a;
132
- --error-bg-lighter: #350a0a;
152
+ --error-bg: #2c0a0c;
153
+ --error-bg-light: #240a0c;
154
+ --error-bg-lighter: #1a0a0c;
133
155
  --error-text: #fca5a5;
134
156
  --error-border: #7f1d1d;
135
157
 
136
- --warning-bg: #451a03;
158
+ --warning-bg: #2a1c05;
137
159
  --warning-text: #fcd34d;
138
160
  --warning-border: #78350f;
139
161
 
@@ -147,9 +169,9 @@
147
169
  --syntax-punctuation: #c9d1d9;
148
170
 
149
171
  /* Node colors */
150
- --node-bg: #2d2d2d;
151
- --node-shadow: rgba(0, 0, 0, 0.3);
152
- --node-shadow-hover: rgba(0, 0, 0, 0.4);
172
+ --node-bg: #18181b;
173
+ --node-shadow: 0 1px 3px rgba(0, 0, 0, 0.4), 0 1px 2px rgba(0, 0, 0, 0.3);
174
+ --node-shadow-hover: 0 8px 24px rgba(0, 0, 0, 0.5), 0 2px 6px rgba(0, 0, 0, 0.3);
153
175
 
154
176
  /* Code background */
155
177
  --code-bg: #1f1f1f;
@@ -171,6 +193,11 @@
171
193
  --debug-value-string: #86efac;
172
194
  --debug-value-array: #d8b4fe;
173
195
  --debug-value-null: #9ca3af;
196
+
197
+ /* Dark mode shadow tweaks */
198
+ --shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.3);
199
+ --shadow-md: 0 2px 4px rgba(0, 0, 0, 0.3), 0 4px 12px rgba(0, 0, 0, 0.5);
200
+ --shadow-lg: 0 4px 8px rgba(0, 0, 0, 0.4), 0 12px 32px rgba(0, 0, 0, 0.6);
174
201
  }
175
202
  /*
176
203
  * ReactFlow base styles - bundled locally so they're included in the library's styles.css
@@ -1095,6 +1122,57 @@ svg.react-flow__connectionline {
1095
1122
  color: var(--text-tertiary, #888);
1096
1123
  text-align: center;
1097
1124
  }
1125
+ .dl-tooltip-wrap {
1126
+ display: inline-flex;
1127
+ align-items: center;
1128
+ }
1129
+
1130
+ .dl-tooltip {
1131
+ pointer-events: none;
1132
+ z-index: 9999;
1133
+ display: inline-flex;
1134
+ align-items: center;
1135
+ gap: 6px;
1136
+ max-width: 280px;
1137
+ padding: 5px 8px;
1138
+ font-family: -apple-system, BlinkMacSystemFont, 'Inter', 'Segoe UI', Roboto, sans-serif;
1139
+ font-size: 11px;
1140
+ font-weight: 500;
1141
+ line-height: 1.3;
1142
+ letter-spacing: 0.1px;
1143
+ white-space: nowrap;
1144
+ color: #fafafa;
1145
+ background: rgba(20, 20, 22, 0.95);
1146
+ border: 1px solid rgba(255, 255, 255, 0.06);
1147
+ border-radius: var(--radius-sm, 6px);
1148
+ box-shadow:
1149
+ 0 2px 4px rgba(0, 0, 0, 0.08),
1150
+ 0 4px 12px rgba(0, 0, 0, 0.16);
1151
+ transition: opacity 120ms cubic-bezier(0.4, 0, 0.2, 1);
1152
+ }
1153
+
1154
+ .dl-tooltip-label {
1155
+ color: inherit;
1156
+ }
1157
+
1158
+ .dl-tooltip-shortcut {
1159
+ display: inline-flex;
1160
+ align-items: center;
1161
+ padding: 0 5px;
1162
+ height: 16px;
1163
+ font-size: 10px;
1164
+ font-weight: 600;
1165
+ color: rgba(250, 250, 250, 0.65);
1166
+ background: rgba(255, 255, 255, 0.08);
1167
+ border-radius: 3px;
1168
+ }
1169
+
1170
+ /* Don't show tooltips on touch / no-hover devices */
1171
+ @media (hover: none), (pointer: coarse) {
1172
+ .dl-tooltip {
1173
+ display: none;
1174
+ }
1175
+ }
1098
1176
  /* Inline variant (used in toolbar) */
1099
1177
  .dl-debugger-controls--inline {
1100
1178
  display: flex;
@@ -1325,20 +1403,13 @@ svg.react-flow__connectionline {
1325
1403
  bottom: 8px;
1326
1404
  width: 280px;
1327
1405
  z-index: 50;
1328
- background: var(--bg-secondary, #ffffff);
1329
- border: 1px solid var(--border-color, #e0e0e0);
1330
- border-radius: 8px;
1331
- box-shadow: 0 4px 16px rgba(0, 0, 0, 0.1), 0 2px 4px rgba(0, 0, 0, 0.06);
1406
+ background: var(--bg-secondary);
1407
+ border: 1px solid var(--border-primary);
1408
+ border-radius: var(--radius-md);
1409
+ box-shadow: var(--shadow-lg);
1332
1410
  overflow: hidden;
1333
1411
  }
1334
1412
 
1335
- /* Dark mode */
1336
- .logic-editor[data-theme="dark"] .properties-panel {
1337
- background: var(--bg-secondary, #1e1e1e);
1338
- border-color: var(--border-color, #3e3e3e);
1339
- box-shadow: 0 4px 16px rgba(0, 0, 0, 0.35), 0 2px 4px rgba(0, 0, 0, 0.2);
1340
- }
1341
-
1342
1413
  .properties-panel-content {
1343
1414
  display: flex;
1344
1415
  flex-direction: column;
@@ -1397,10 +1468,17 @@ svg.react-flow__connectionline {
1397
1468
  padding: 0;
1398
1469
  background: transparent;
1399
1470
  border: none;
1400
- border-radius: 6px;
1471
+ border-radius: var(--radius-sm);
1401
1472
  color: var(--text-tertiary, #999);
1402
1473
  cursor: pointer;
1403
- transition: background 0.15s, color 0.15s;
1474
+ transition: background var(--motion-fast) var(--ease-out),
1475
+ color var(--motion-fast) var(--ease-out),
1476
+ box-shadow var(--motion-fast) var(--ease-out);
1477
+ }
1478
+
1479
+ .properties-panel-close:focus-visible {
1480
+ outline: none;
1481
+ box-shadow: var(--focus-ring);
1404
1482
  }
1405
1483
 
1406
1484
  .properties-panel-close:hover {
@@ -1746,26 +1824,24 @@ svg.react-flow__connectionline {
1746
1824
  padding: 10px 16px;
1747
1825
  font-size: 13px;
1748
1826
  font-weight: 500;
1749
- color: #ef4444;
1750
- background: #fef2f2;
1751
- border: 1px solid #fecaca;
1752
- border-radius: 6px;
1827
+ color: var(--error-text);
1828
+ background: var(--error-bg);
1829
+ border: 1px solid var(--error-border);
1830
+ border-radius: var(--radius-sm);
1753
1831
  cursor: pointer;
1754
- transition: background 0.15s, border-color 0.15s;
1755
- }
1756
-
1757
- .logic-editor[data-theme="dark"] .properties-panel-delete {
1758
- background: #451a1a;
1759
- border-color: #7f1d1d;
1832
+ transition: background var(--motion-fast) var(--ease-out),
1833
+ border-color var(--motion-fast) var(--ease-out),
1834
+ box-shadow var(--motion-fast) var(--ease-out);
1760
1835
  }
1761
1836
 
1762
1837
  .properties-panel-delete:hover {
1763
- background: #fee2e2;
1764
- border-color: #ef4444;
1838
+ background: var(--error-bg-light);
1839
+ border-color: var(--error-text);
1765
1840
  }
1766
1841
 
1767
- .logic-editor[data-theme="dark"] .properties-panel-delete:hover {
1768
- background: #5c2424;
1842
+ .properties-panel-delete:focus-visible {
1843
+ outline: none;
1844
+ box-shadow: 0 0 0 2px var(--bg-secondary), 0 0 0 4px var(--error-text);
1769
1845
  }
1770
1846
 
1771
1847
  /* ==========================================================================
@@ -2182,17 +2258,18 @@ svg.react-flow__connectionline {
2182
2258
  width: 100%;
2183
2259
  padding: 8px 12px 8px 32px;
2184
2260
  font-size: 13px;
2185
- color: var(--text-primary, #1a1a1a);
2186
- background: var(--bg-tertiary, #f8f9fa);
2187
- border: 1px solid var(--border-color, #e0e0e0);
2188
- border-radius: 6px;
2261
+ color: var(--text-primary);
2262
+ background: var(--bg-tertiary);
2263
+ border: 1px solid var(--border-secondary);
2264
+ border-radius: var(--radius-sm);
2189
2265
  outline: none;
2190
- transition: border-color 0.15s, box-shadow 0.15s;
2266
+ transition: border-color var(--motion-fast) var(--ease-out),
2267
+ box-shadow var(--motion-fast) var(--ease-out);
2191
2268
  }
2192
2269
 
2193
2270
  .properties-panel-search-input:focus {
2194
- border-color: var(--color-primary, #2563eb);
2195
- box-shadow: 0 0 0 2px rgba(37, 99, 235, 0.1);
2271
+ border-color: var(--accent-blue);
2272
+ box-shadow: var(--focus-ring);
2196
2273
  }
2197
2274
 
2198
2275
  .properties-panel-search-input::placeholder {
@@ -2449,18 +2526,19 @@ svg.react-flow__connectionline {
2449
2526
  padding: 8px 10px;
2450
2527
  font-size: 13px;
2451
2528
  font-family: inherit;
2452
- color: var(--dl-text-primary, #1a1a1a);
2453
- background: var(--dl-bg-input, #fff);
2454
- border: 1px solid var(--dl-border, #e0e0e0);
2455
- border-radius: 6px;
2529
+ color: var(--text-primary);
2530
+ background: var(--bg-secondary);
2531
+ border: 1px solid var(--border-secondary);
2532
+ border-radius: var(--radius-sm);
2456
2533
  outline: none;
2457
- transition: border-color 0.15s, box-shadow 0.15s;
2534
+ transition: border-color var(--motion-fast) var(--ease-out),
2535
+ box-shadow var(--motion-fast) var(--ease-out);
2458
2536
  box-sizing: border-box;
2459
2537
  }
2460
2538
 
2461
2539
  .panel-input:focus {
2462
- border-color: var(--dl-primary, #3b82f6);
2463
- box-shadow: 0 0 0 3px var(--dl-primary-alpha, rgba(59, 130, 246, 0.15));
2540
+ border-color: var(--accent-blue);
2541
+ box-shadow: var(--focus-ring);
2464
2542
  }
2465
2543
 
2466
2544
  .panel-input:disabled {
@@ -2559,15 +2637,15 @@ svg.react-flow__connectionline {
2559
2637
  }
2560
2638
 
2561
2639
  .panel-input-checkbox:checked + .panel-input-toggle {
2562
- background: var(--dl-primary, #3b82f6);
2640
+ background: var(--accent-blue);
2563
2641
  }
2564
2642
 
2565
2643
  .panel-input-checkbox:checked + .panel-input-toggle::after {
2566
2644
  transform: translateX(16px);
2567
2645
  }
2568
2646
 
2569
- .panel-input-checkbox:focus + .panel-input-toggle {
2570
- box-shadow: 0 0 0 3px var(--dl-primary-alpha, rgba(59, 130, 246, 0.15));
2647
+ .panel-input-checkbox:focus-visible + .panel-input-toggle {
2648
+ box-shadow: var(--focus-ring);
2571
2649
  }
2572
2650
 
2573
2651
  .panel-input-checkbox:disabled + .panel-input-toggle {
@@ -2610,16 +2688,17 @@ svg.react-flow__connectionline {
2610
2688
  .panel-input-path-wrapper {
2611
2689
  display: flex;
2612
2690
  align-items: center;
2613
- background: var(--dl-bg-input, #fff);
2614
- border: 1px solid var(--dl-border, #e0e0e0);
2615
- border-radius: 6px;
2691
+ background: var(--bg-secondary);
2692
+ border: 1px solid var(--border-secondary);
2693
+ border-radius: var(--radius-sm);
2616
2694
  overflow: hidden;
2617
- transition: border-color 0.15s, box-shadow 0.15s;
2695
+ transition: border-color var(--motion-fast) var(--ease-out),
2696
+ box-shadow var(--motion-fast) var(--ease-out);
2618
2697
  }
2619
2698
 
2620
2699
  .panel-input-path-wrapper:focus-within {
2621
- border-color: var(--dl-primary, #3b82f6);
2622
- box-shadow: 0 0 0 3px var(--dl-primary-alpha, rgba(59, 130, 246, 0.15));
2700
+ border-color: var(--accent-blue);
2701
+ box-shadow: var(--focus-ring);
2623
2702
  }
2624
2703
 
2625
2704
  .panel-input-path-prefix {
@@ -2963,24 +3042,25 @@ svg.react-flow__connectionline {
2963
3042
  ============================================ */
2964
3043
 
2965
3044
  .dl-node {
2966
- border-radius: 8px;
3045
+ border-radius: var(--radius-md);
2967
3046
  border: 2px solid;
2968
- font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
3047
+ font-family: inherit;
2969
3048
  font-size: 13px;
2970
3049
  width: 100%;
2971
3050
  box-sizing: border-box;
2972
- box-shadow: 0 2px 6px var(--node-shadow);
2973
- transition: box-shadow 0.2s, transform 0.1s;
3051
+ box-shadow: var(--node-shadow);
3052
+ transition: box-shadow var(--motion-base) var(--ease-out),
3053
+ transform var(--motion-fast) var(--ease-out);
2974
3054
  background: var(--node-bg) !important;
2975
3055
  position: relative;
2976
3056
  }
2977
3057
 
2978
3058
  .dl-node:hover {
2979
- box-shadow: 0 4px 12px var(--node-shadow-hover);
3059
+ box-shadow: var(--node-shadow-hover);
2980
3060
  }
2981
3061
 
2982
3062
  .dl-node.selected {
2983
- box-shadow: 0 0 0 2px var(--accent-blue), 0 4px 12px var(--node-shadow-hover);
3063
+ box-shadow: 0 0 0 2px var(--accent-blue), var(--node-shadow-hover);
2984
3064
  }
2985
3065
 
2986
3066
  /* ============================================
@@ -3063,7 +3143,7 @@ svg.react-flow__connectionline {
3063
3143
 
3064
3144
  .vertical-cell-header {
3065
3145
  padding: 4px 10px;
3066
- border-radius: 6px 6px 0 0;
3146
+ border-radius: calc(var(--radius-md) - 2px) calc(var(--radius-md) - 2px) 0 0;
3067
3147
  color: white;
3068
3148
  display: flex;
3069
3149
  align-items: center;
@@ -3285,7 +3365,7 @@ svg.react-flow__connectionline {
3285
3365
 
3286
3366
  .structure-node-header {
3287
3367
  padding: 6px 12px;
3288
- border-radius: 6px 6px 0 0;
3368
+ border-radius: calc(var(--radius-md) - 2px) calc(var(--radius-md) - 2px) 0 0;
3289
3369
  color: white;
3290
3370
  display: flex;
3291
3371
  align-items: center;
@@ -3462,11 +3542,11 @@ svg.react-flow__connectionline {
3462
3542
  margin-top: 4px;
3463
3543
  background: var(--debug-popover-bg);
3464
3544
  color: var(--debug-popover-text);
3465
- border-radius: 6px;
3545
+ border-radius: var(--radius-sm);
3466
3546
  padding: 8px 12px;
3467
3547
  font-size: 11px;
3468
3548
  z-index: 1000;
3469
- box-shadow: 0 4px 12px var(--debug-popover-shadow);
3549
+ box-shadow: var(--shadow-md);
3470
3550
  min-width: 150px;
3471
3551
  max-width: 300px;
3472
3552
  max-height: 200px;
@@ -3698,11 +3778,11 @@ svg.react-flow__connectionline {
3698
3778
  position: absolute;
3699
3779
  background: var(--debug-popover-bg);
3700
3780
  color: var(--debug-popover-text);
3701
- border-radius: 8px;
3781
+ border-radius: var(--radius-md);
3702
3782
  padding: 10px 12px;
3703
3783
  font-size: 11px;
3704
3784
  z-index: 9999;
3705
- box-shadow: 0 4px 16px var(--debug-popover-shadow);
3785
+ box-shadow: var(--shadow-lg);
3706
3786
  min-width: 180px;
3707
3787
  max-width: 280px;
3708
3788
  pointer-events: auto;
@@ -3926,7 +4006,7 @@ svg.react-flow__connectionline {
3926
4006
  height: 100%;
3927
4007
  position: relative;
3928
4008
  background: var(--bg-tertiary);
3929
- border-radius: 8px;
4009
+ border-radius: var(--radius-md);
3930
4010
  overflow: hidden;
3931
4011
  display: flex;
3932
4012
  flex-direction: column;
@@ -3957,13 +4037,11 @@ svg.react-flow__connectionline {
3957
4037
  background: var(--bg-secondary, #ffffff);
3958
4038
  flex-shrink: 0;
3959
4039
  gap: 10px;
3960
- overflow-x: auto;
3961
- -webkit-overflow-scrolling: touch;
3962
- scrollbar-width: none;
3963
- }
3964
-
3965
- .logic-editor-toolbar::-webkit-scrollbar {
3966
- display: none;
4040
+ /* Desktop: visible overflow so tooltips on toolbar buttons aren't clipped.
4041
+ Horizontal-scroll behavior is scoped to the mobile breakpoint below. */
4042
+ overflow: visible;
4043
+ position: relative;
4044
+ z-index: 2;
3967
4045
  }
3968
4046
 
3969
4047
  .logic-editor[data-theme="dark"] .logic-editor-toolbar {
@@ -3975,7 +4053,7 @@ svg.react-flow__connectionline {
3975
4053
  flex: 1;
3976
4054
  }
3977
4055
 
3978
- .logic-editor-toolbar .dl-preserve-structure-toggle {
4056
+ .logic-editor-toolbar .dl-templating-toggle {
3979
4057
  display: flex;
3980
4058
  align-items: center;
3981
4059
  gap: 6px;
@@ -3987,7 +4065,7 @@ svg.react-flow__connectionline {
3987
4065
  flex-shrink: 0;
3988
4066
  }
3989
4067
 
3990
- .logic-editor-toolbar .dl-preserve-structure-toggle input[type="checkbox"] {
4068
+ .logic-editor-toolbar .dl-templating-toggle input[type="checkbox"] {
3991
4069
  margin: 0;
3992
4070
  cursor: pointer;
3993
4071
  }
@@ -4002,10 +4080,12 @@ svg.react-flow__connectionline {
4002
4080
  padding: 0;
4003
4081
  background: transparent;
4004
4082
  border: none;
4005
- border-radius: 5px;
4083
+ border-radius: var(--radius-sm);
4006
4084
  color: var(--text-secondary, #666);
4007
4085
  cursor: pointer;
4008
- transition: background 0.15s, color 0.15s;
4086
+ transition: background var(--motion-fast) var(--ease-out),
4087
+ color var(--motion-fast) var(--ease-out),
4088
+ box-shadow var(--motion-fast) var(--ease-out);
4009
4089
  flex-shrink: 0;
4010
4090
  }
4011
4091
 
@@ -4014,6 +4094,11 @@ svg.react-flow__connectionline {
4014
4094
  color: var(--text-primary, #1a1a1a);
4015
4095
  }
4016
4096
 
4097
+ .dl-toolbar-btn:focus-visible {
4098
+ outline: none;
4099
+ box-shadow: var(--focus-ring);
4100
+ }
4101
+
4017
4102
  .dl-toolbar-btn:disabled {
4018
4103
  opacity: 0.35;
4019
4104
  cursor: not-allowed;
@@ -4042,23 +4127,95 @@ svg.react-flow__connectionline {
4042
4127
  text-align: center;
4043
4128
  color: var(--text-tertiary);
4044
4129
  pointer-events: none;
4130
+ max-width: 420px;
4131
+ width: calc(100% - 32px);
4132
+ display: flex;
4133
+ flex-direction: column;
4134
+ align-items: center;
4135
+ gap: 14px;
4136
+ }
4137
+
4138
+ .logic-editor-empty-icon {
4139
+ display: flex;
4140
+ align-items: center;
4141
+ justify-content: center;
4142
+ width: 64px;
4143
+ height: 64px;
4144
+ border-radius: var(--radius-lg);
4145
+ background: var(--bg-secondary);
4146
+ border: 1px solid var(--border-light);
4147
+ color: var(--accent-blue);
4148
+ box-shadow: var(--shadow-sm);
4149
+ margin-bottom: 2px;
4045
4150
  }
4046
4151
 
4047
4152
  .logic-editor-empty p {
4048
4153
  margin: 0;
4049
- font-size: 16px;
4154
+ font-size: 15px;
4155
+ font-weight: 500;
4156
+ color: var(--text-secondary);
4050
4157
  }
4051
4158
 
4052
4159
  .logic-editor-empty-hint {
4053
- margin-top: 8px !important;
4160
+ margin-top: 0 !important;
4054
4161
  font-size: 13px !important;
4162
+ font-weight: 400 !important;
4163
+ color: var(--text-muted) !important;
4164
+ max-width: 320px;
4165
+ }
4166
+
4167
+ .logic-editor-empty-chips {
4168
+ display: flex;
4169
+ flex-wrap: wrap;
4170
+ align-items: center;
4171
+ justify-content: center;
4172
+ gap: 6px;
4173
+ margin-top: 4px;
4174
+ pointer-events: auto;
4175
+ }
4176
+
4177
+ .logic-editor-empty-chips-label {
4178
+ font-size: 11px;
4179
+ font-weight: 600;
4055
4180
  color: var(--text-muted);
4181
+ text-transform: uppercase;
4182
+ letter-spacing: 0.5px;
4183
+ margin-right: 4px;
4184
+ }
4185
+
4186
+ .logic-editor-empty-chip {
4187
+ display: inline-flex;
4188
+ align-items: center;
4189
+ padding: 4px 10px;
4190
+ font-size: 12px;
4191
+ font-family: inherit;
4192
+ font-weight: 500;
4193
+ background: var(--bg-secondary);
4194
+ color: var(--text-secondary);
4195
+ border: 1px solid var(--border-secondary);
4196
+ border-radius: 999px;
4197
+ cursor: pointer;
4198
+ transition: background var(--motion-fast) var(--ease-out),
4199
+ border-color var(--motion-fast) var(--ease-out),
4200
+ color var(--motion-fast) var(--ease-out),
4201
+ box-shadow var(--motion-fast) var(--ease-out);
4202
+ }
4203
+
4204
+ .logic-editor-empty-chip:hover {
4205
+ background: var(--accent-blue-light);
4206
+ border-color: var(--accent-blue);
4207
+ color: var(--accent-blue);
4208
+ }
4209
+
4210
+ .logic-editor-empty-chip:focus-visible {
4211
+ outline: none;
4212
+ box-shadow: var(--focus-ring);
4056
4213
  }
4057
4214
 
4058
4215
  /* ReactFlow overrides */
4059
4216
  .logic-editor .react-flow__controls {
4060
- box-shadow: 0 2px 8px var(--node-shadow);
4061
- border-radius: 8px;
4217
+ box-shadow: var(--shadow-md);
4218
+ border-radius: var(--radius-md);
4062
4219
  overflow: hidden;
4063
4220
  }
4064
4221
 
@@ -4112,6 +4269,15 @@ svg.react-flow__connectionline {
4112
4269
  .logic-editor-toolbar {
4113
4270
  padding: 0 8px;
4114
4271
  gap: 6px;
4272
+ /* Restore horizontal scrolling on narrow viewports where buttons can overflow */
4273
+ overflow-x: auto;
4274
+ overflow-y: hidden;
4275
+ -webkit-overflow-scrolling: touch;
4276
+ scrollbar-width: none;
4277
+ }
4278
+
4279
+ .logic-editor-toolbar::-webkit-scrollbar {
4280
+ display: none;
4115
4281
  }
4116
4282
 
4117
4283
  .logic-editor-toolbar-spacer {
@@ -4123,7 +4289,7 @@ svg.react-flow__connectionline {
4123
4289
  height: 40px;
4124
4290
  }
4125
4291
 
4126
- .dl-preserve-structure-toggle span {
4292
+ .dl-templating-toggle span {
4127
4293
  font-size: 11px;
4128
4294
  }
4129
4295
 
@@ -4194,10 +4360,10 @@ svg.react-flow__connectionline {
4194
4360
  z-index: 1000;
4195
4361
  min-width: 180px;
4196
4362
  max-width: 280px;
4197
- background: var(--bg-primary, #ffffff);
4198
- border: 1px solid var(--border-color, #e0e0e0);
4199
- border-radius: 8px;
4200
- box-shadow: 0 4px 16px rgba(0, 0, 0, 0.12), 0 2px 4px rgba(0, 0, 0, 0.08);
4363
+ background: var(--bg-secondary);
4364
+ border: 1px solid var(--border-primary);
4365
+ border-radius: var(--radius-md);
4366
+ box-shadow: var(--shadow-lg);
4201
4367
  padding: 4px 0;
4202
4368
  font-size: 13px;
4203
4369
  outline: none;