@rs-x/react-components 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.css ADDED
@@ -0,0 +1,1692 @@
1
+ /* src/components/expression-change-history-view/expression-change-history-view.component.css */
2
+ .changeHistoryRoot {
3
+ display: flex;
4
+ flex-direction: column;
5
+ min-height: 0;
6
+ min-width: 0;
7
+ }
8
+ .changeHistoryEmpty {
9
+ opacity: 0.7;
10
+ font-style: italic;
11
+ padding: var(--sp-5);
12
+ color: var(--muted);
13
+ }
14
+ .changeHistoryAccordion {
15
+ border: 1px solid var(--border);
16
+ border-radius: var(--r-lg);
17
+ background-color: var(--surface-solid);
18
+ overflow: hidden;
19
+ min-height: 0;
20
+ min-width: 0;
21
+ box-shadow: var(--shadow-1);
22
+ }
23
+ .changeHistoryAccordionScroll {
24
+ max-height: 100%;
25
+ overflow: auto;
26
+ padding: var(--sp-4);
27
+ display: flex;
28
+ flex-direction: column;
29
+ gap: var(--sp-3);
30
+ }
31
+ .changeSet {
32
+ background-color: var(--surface);
33
+ border: 1px solid var(--border);
34
+ border-radius: var(--r-md);
35
+ overflow: hidden;
36
+ transition:
37
+ background-color var(--t-med) var(--ease),
38
+ border-color var(--t-med) var(--ease),
39
+ box-shadow var(--t-med) var(--ease);
40
+ }
41
+ .changeSet.isActive {
42
+ border-color: var(--chg-active-border);
43
+ background-color: var(--chg-active-bg);
44
+ box-shadow: var(--chg-active-shadow);
45
+ }
46
+ @supports not (background-color: color-mix(in srgb, black 50%, white 50%)) {
47
+ .changeSet.isActive {
48
+ background-color: var(--surface-2);
49
+ }
50
+ }
51
+ .changeSetHeader {
52
+ width: 100%;
53
+ border: none;
54
+ color: inherit;
55
+ cursor: pointer;
56
+ background-color: var(--surface-2);
57
+ display: flex;
58
+ align-items: center;
59
+ justify-content: space-between;
60
+ gap: var(--sp-6);
61
+ padding: var(--sp-5) var(--sp-6);
62
+ position: relative;
63
+ text-align: left;
64
+ transition: background-color var(--t-med) var(--ease), box-shadow var(--t-med) var(--ease);
65
+ }
66
+ .changeSetHeader:hover {
67
+ background-color: var(--surface-2);
68
+ }
69
+ .changeSetHeader:focus-visible {
70
+ outline: none;
71
+ box-shadow: var(--shadow-focus);
72
+ }
73
+ .changeSet.isActive .changeSetHeader::before {
74
+ content: "";
75
+ position: absolute;
76
+ left: 0;
77
+ top: var(--sp-3);
78
+ bottom: var(--sp-3);
79
+ width: 3px;
80
+ border-radius: 999px;
81
+ background-color: var(--chg-active-rail);
82
+ }
83
+ .changeSet.nonClickable {
84
+ pointer-events: none;
85
+ }
86
+ .changeSetHeaderLeft {
87
+ display: flex;
88
+ align-items: center;
89
+ gap: var(--sp-4);
90
+ min-width: 0;
91
+ flex: 1 1 auto;
92
+ }
93
+ .changeSetBadge {
94
+ font-weight: 800;
95
+ font-size: 14px;
96
+ padding: 3px 8px;
97
+ border-radius: 999px;
98
+ background-color: var(--surface);
99
+ border: 1px solid var(--border);
100
+ color: var(--text);
101
+ flex: 0 0 auto;
102
+ }
103
+ .changeSetHeaderMeta {
104
+ display: flex;
105
+ align-items: baseline;
106
+ gap: var(--sp-4);
107
+ min-width: 0;
108
+ }
109
+ .changeSetExpr {
110
+ font-weight: 800;
111
+ font-size: 13px;
112
+ color: var(--chg-expr-color);
113
+ white-space: nowrap;
114
+ overflow: hidden;
115
+ text-overflow: ellipsis;
116
+ min-width: 0;
117
+ max-width: 100%;
118
+ }
119
+ @supports not (color: color-mix(in srgb, black 50%, white 50%)) {
120
+ .changeSetExpr {
121
+ color: var(--text);
122
+ opacity: 0.9;
123
+ }
124
+ }
125
+ .changeSetSteps {
126
+ font-size: 12px;
127
+ color: var(--muted-2);
128
+ flex: 0 0 auto;
129
+ }
130
+ .changeSetHeaderRight {
131
+ display: flex;
132
+ align-items: center;
133
+ gap: var(--sp-4);
134
+ flex: 0 0 260px;
135
+ justify-content: flex-end;
136
+ }
137
+ .changeSetChevron {
138
+ display: inline-flex;
139
+ justify-content: center;
140
+ width: 20px;
141
+ color: var(--muted-2);
142
+ transition: transform var(--t-med) var(--ease);
143
+ }
144
+ .changeSetChevron.isOpen {
145
+ transform: rotate(90deg);
146
+ }
147
+ .changeSetBody {
148
+ padding: var(--sp-3) var(--sp-6) var(--sp-4) var(--sp-6);
149
+ border-top: 1px solid var(--border-soft);
150
+ background-color: var(--chg-body-bg);
151
+ }
152
+ @supports not (background-color: color-mix(in srgb, black 50%, white 50%)) {
153
+ .changeSetBody {
154
+ background-color: var(--surface-solid);
155
+ }
156
+ }
157
+ .valueDiff {
158
+ display: inline-flex;
159
+ align-items: center;
160
+ gap: var(--sp-3);
161
+ white-space: nowrap;
162
+ font-variant-numeric: tabular-nums;
163
+ }
164
+ .valueDiff.isHeader {
165
+ font-size: 13px;
166
+ font-weight: 700;
167
+ }
168
+ .valueDiff.isRow {
169
+ font-size: 12px;
170
+ font-weight: 700;
171
+ }
172
+ .valueDiffOld,
173
+ .valueDiffNew {
174
+ text-align: right;
175
+ }
176
+ .valueDiffArrow {
177
+ text-align: center;
178
+ color: var(--muted-2);
179
+ }
180
+ .valueDiffOld {
181
+ color: var(--chg-diff-old);
182
+ }
183
+ .valueDiffNew {
184
+ color: var(--chg-diff-new);
185
+ }
186
+ @supports not (color: color-mix(in srgb, black 50%, white 50%)) {
187
+ .valueDiffOld,
188
+ .valueDiffNew {
189
+ color: var(--text);
190
+ opacity: 0.9;
191
+ }
192
+ }
193
+ .valueDiffOld.isUnset,
194
+ .valueDiffNew.isUnset {
195
+ opacity: 0.55;
196
+ font-style: italic;
197
+ color: var(--muted-2);
198
+ }
199
+ .changePath {
200
+ display: flex;
201
+ flex-direction: column;
202
+ gap: 0;
203
+ }
204
+ .changeStep {
205
+ display: grid;
206
+ grid-template-columns: 26px 1fr;
207
+ gap: var(--sp-4);
208
+ min-width: 0;
209
+ padding: var(--sp-4) 0;
210
+ border-bottom: 1px solid var(--border);
211
+ }
212
+ .changeStep:last-child {
213
+ border-bottom: none;
214
+ }
215
+ .changeStepRail {
216
+ position: relative;
217
+ display: flex;
218
+ align-items: flex-start;
219
+ justify-content: center;
220
+ }
221
+ .changeStepDot {
222
+ width: 10px;
223
+ height: 10px;
224
+ border-radius: 999px;
225
+ background-color: var(--surface-2);
226
+ border: 2px solid var(--border-soft);
227
+ margin-top: 6px;
228
+ }
229
+ .changeStepDot.isTrigger {
230
+ background-color: var(--chg-step-dot-trigger-bg);
231
+ box-shadow: var(--chg-step-dot-trigger-ring);
232
+ border-color: var(--chg-step-dot-trigger-border);
233
+ }
234
+ .changeStepLine {
235
+ position: absolute;
236
+ top: 18px;
237
+ bottom: -8px;
238
+ width: 2px;
239
+ background-color: var(--border-soft);
240
+ }
241
+ .changeStepCard {
242
+ border: none;
243
+ background: transparent;
244
+ border-radius: 0;
245
+ min-width: 0;
246
+ }
247
+ .changeStepHeader {
248
+ display: flex;
249
+ align-items: center;
250
+ justify-content: space-between;
251
+ gap: var(--sp-4);
252
+ min-width: 0;
253
+ }
254
+ .changeStepHeaderLeft {
255
+ display: flex;
256
+ align-items: center;
257
+ gap: var(--sp-3);
258
+ min-width: 0;
259
+ }
260
+ .changeStepExpr {
261
+ font-weight: 800;
262
+ font-size: 13px;
263
+ color: var(--chg-expr-color);
264
+ min-width: 0;
265
+ white-space: nowrap;
266
+ overflow: hidden;
267
+ text-overflow: ellipsis;
268
+ }
269
+ @supports not (color: color-mix(in srgb, black 50%, white 50%)) {
270
+ .changeStepExpr {
271
+ color: var(--text);
272
+ opacity: 0.9;
273
+ }
274
+ }
275
+ .changeStepTag {
276
+ font-size: 11px;
277
+ padding: 2px 7px;
278
+ border-radius: 999px;
279
+ background-color: var(--surface);
280
+ border: 1px solid var(--border);
281
+ color: var(--muted);
282
+ flex: 0 0 auto;
283
+ }
284
+ .changeStepTag.derived {
285
+ opacity: 0.85;
286
+ }
287
+ .changeStepHeaderRight {
288
+ flex: 0 0 260px;
289
+ display: flex;
290
+ justify-content: flex-end;
291
+ }
292
+
293
+ /* src/components/code-viewer/code-viewer.component.css */
294
+ .rsxCodeViewer {
295
+ display: grid;
296
+ gap: 0.55rem;
297
+ }
298
+ .rsxCodeViewerPre {
299
+ margin: 0;
300
+ max-width: 100%;
301
+ overflow-x: auto;
302
+ overflow-y: hidden;
303
+ }
304
+ .rsxCodeViewerSyntax {
305
+ display: block;
306
+ color: var(--code-token-identifier, var(--text, #0b1324));
307
+ }
308
+ .rsxCodeViewerSyntax .tok-keyword {
309
+ color: var(--code-token-keyword, #365fff);
310
+ }
311
+ .rsxCodeViewerSyntax .tok-type {
312
+ color: var(--code-token-type, #8246e5);
313
+ }
314
+ .rsxCodeViewerSyntax .tok-literal {
315
+ color: var(--code-token-literal, #0e7a8e);
316
+ }
317
+ .rsxCodeViewerSyntax .tok-number {
318
+ color: var(--code-token-number, #0f9b60);
319
+ }
320
+ .rsxCodeViewerSyntax .tok-string {
321
+ color: var(--code-token-string, #b14d26);
322
+ }
323
+ .rsxCodeViewerSyntax .tok-comment {
324
+ color: var(--code-token-comment, rgba(19, 32, 61, 0.56));
325
+ }
326
+ .rsxCodeViewerSyntax .tok-operator {
327
+ color: var(--code-token-operator, #5f6a84);
328
+ }
329
+ .rsxCodeViewerSyntax .tok-identifier {
330
+ color: var(--code-token-identifier, var(--text, #0b1324));
331
+ }
332
+ .rsxCodeViewerActions {
333
+ display: flex;
334
+ justify-content: flex-end;
335
+ }
336
+ .rsxCodeViewerToggle {
337
+ border: 1px solid var(--border-soft, rgba(10, 25, 55, 0.14));
338
+ border-radius: 9px;
339
+ background: var(--surface-solid, #ffffff);
340
+ color: var(--text, #0b1324);
341
+ font: inherit;
342
+ font-size: 0.875rem;
343
+ font-weight: 700;
344
+ line-height: 1.2;
345
+ padding: 0.38rem 0.64rem;
346
+ cursor: pointer;
347
+ transition:
348
+ background var(--t-fast, 160ms) var(--ease, ease),
349
+ border-color var(--t-fast, 160ms) var(--ease, ease),
350
+ color var(--t-fast, 160ms) var(--ease, ease);
351
+ }
352
+ .rsxCodeViewerToggle:hover {
353
+ border-color: color-mix(in srgb, var(--brand, #0b66ff) 30%, var(--border-soft, rgba(10, 25, 55, 0.14)));
354
+ background: color-mix(in srgb, var(--surface-solid, #ffffff) 90%, var(--surface-2, rgba(255, 255, 255, 0.72)));
355
+ }
356
+
357
+ /* src/components/data-table/data-table.component.css */
358
+ .rsxDataTable {
359
+ min-width: 0;
360
+ }
361
+ .rsxDataTableControls {
362
+ display: flex;
363
+ align-items: center;
364
+ gap: 0.6rem;
365
+ margin-bottom: 0.75rem;
366
+ }
367
+ .rsxDataTableFilterLabel {
368
+ color: var(--muted, rgba(16, 24, 40, 0.68));
369
+ font-size: 0.875rem;
370
+ font-weight: 700;
371
+ }
372
+ .rsxDataTableFilterLabelSrOnly {
373
+ position: absolute;
374
+ width: 1px;
375
+ height: 1px;
376
+ padding: 0;
377
+ margin: -1px;
378
+ overflow: hidden;
379
+ clip: rect(0, 0, 0, 0);
380
+ white-space: nowrap;
381
+ border: 0;
382
+ }
383
+ .rsxDataTableFilterInput {
384
+ width: min(100%, 360px);
385
+ border: 1px solid var(--border-soft, rgba(10, 25, 55, 0.1));
386
+ border-radius: 10px;
387
+ padding: 0.42rem 0.62rem;
388
+ background: var(--surface-solid, #ffffff);
389
+ color: var(--text, #0b1324);
390
+ font: inherit;
391
+ }
392
+ .rsxDataTableFilterInput::placeholder {
393
+ color: var(--muted, rgba(16, 24, 40, 0.68));
394
+ }
395
+ .rsxDataTableWrap {
396
+ width: 100%;
397
+ overflow: auto;
398
+ }
399
+ .rsxDataTableTable {
400
+ width: 100%;
401
+ border-collapse: collapse;
402
+ min-width: 720px;
403
+ }
404
+ .rsxDataTableTable th,
405
+ .rsxDataTableTable td {
406
+ text-align: left;
407
+ vertical-align: top;
408
+ padding: 0.75rem 0.9rem;
409
+ border-bottom: 1px solid var(--border-soft, rgba(10, 25, 55, 0.1));
410
+ }
411
+ .rsxDataTableTable th {
412
+ background: var(--surface-2, rgba(255, 255, 255, 0.72));
413
+ color: var(--text, #0b1324);
414
+ font-weight: 800;
415
+ }
416
+ .rsxDataTableSortButton {
417
+ display: inline-flex;
418
+ align-items: center;
419
+ gap: 0.3rem;
420
+ border: none;
421
+ padding: 0;
422
+ background: transparent;
423
+ color: inherit;
424
+ font: inherit;
425
+ font-weight: inherit;
426
+ cursor: pointer;
427
+ }
428
+ .rsxDataTableSortMarker {
429
+ color: var(--muted, rgba(16, 24, 40, 0.68));
430
+ font-size: 0.82em;
431
+ line-height: 1;
432
+ min-width: 0.72em;
433
+ opacity: 0.35;
434
+ }
435
+ .rsxDataTableSortButton.isActive .rsxDataTableSortMarker {
436
+ opacity: 0.9;
437
+ }
438
+ .rsxDataTableEmptyCell {
439
+ color: var(--muted, rgba(16, 24, 40, 0.68));
440
+ }
441
+
442
+ /* src/components/error-panel/error-panel.component.css */
443
+ .errorPanel {
444
+ display: flex;
445
+ flex-direction: column;
446
+ min-height: 0;
447
+ min-width: 0;
448
+ }
449
+ .errorPanelBody {
450
+ display: flex;
451
+ flex-direction: column;
452
+ gap: var(--sp-3);
453
+ padding: var(--sp-4) var(--sp-6);
454
+ }
455
+ .errorPanelList {
456
+ list-style: none;
457
+ margin: 0;
458
+ padding: 0;
459
+ display: flex;
460
+ flex-direction: column;
461
+ gap: var(--sp-3);
462
+ }
463
+ .errorPanelItem {
464
+ margin: 0;
465
+ padding: var(--sp-3) var(--sp-4);
466
+ border-radius: var(--r-sm, 6px);
467
+ border: 1px solid var(--err-item-border);
468
+ background: var(--err-item-bg);
469
+ color: var(--err-item-text);
470
+ line-height: 1.45;
471
+ white-space: pre-wrap;
472
+ word-break: break-word;
473
+ }
474
+ .errorPanelEmpty {
475
+ margin: 0;
476
+ color: var(--muted);
477
+ font-style: italic;
478
+ }
479
+
480
+ /* src/components/expression-tree-view/expression-tree-view.component.css */
481
+ .exprTreeRoot {
482
+ position: relative;
483
+ width: 100%;
484
+ height: 100%;
485
+ min-width: 0;
486
+ min-height: 0;
487
+ background: var(--panel-surface);
488
+ color: var(--text);
489
+ font-family: var(--font-sans);
490
+ border: none;
491
+ border-radius: 0;
492
+ overflow: hidden;
493
+ }
494
+ .exprTreeViewport {
495
+ width: 100%;
496
+ height: 100%;
497
+ overflow: auto;
498
+ min-width: 0;
499
+ min-height: 0;
500
+ }
501
+ .exprTreeSpacer {
502
+ position: relative;
503
+ }
504
+ .exprTreeZoomLayer {
505
+ position: absolute;
506
+ top: 0;
507
+ left: 0;
508
+ will-change: transform;
509
+ }
510
+ .exprTreeCanvas {
511
+ position: relative;
512
+ isolation: isolate;
513
+ }
514
+ .exprTreeLines {
515
+ position: absolute;
516
+ top: 0;
517
+ left: 0;
518
+ z-index: 10;
519
+ pointer-events: none;
520
+ overflow: visible;
521
+ display: block;
522
+ }
523
+ .exprTreeLines path.exprTreePath {
524
+ fill: none;
525
+ stroke: var(--expr-tree-path-stroke);
526
+ stroke-width: var(--expr-tree-path-stroke-width);
527
+ stroke-linecap: round;
528
+ stroke-linejoin: round;
529
+ opacity: 1;
530
+ vector-effect: non-scaling-stroke;
531
+ shape-rendering: geometricPrecision;
532
+ transition:
533
+ stroke var(--t-med) var(--ease),
534
+ stroke-width var(--t-med) var(--ease),
535
+ opacity var(--t-med) var(--ease),
536
+ filter var(--t-med) var(--ease);
537
+ }
538
+ html[data-theme=dark] .exprTreeLines path.exprTreePath {
539
+ stroke: var(--expr-tree-path-stroke-dark);
540
+ }
541
+ .exprTreeLines path.exprTreePath.isSelected {
542
+ stroke: var(--brand);
543
+ stroke-width: var(--expr-tree-path-selected-stroke-width);
544
+ filter: var(--expr-tree-path-selected-shadow);
545
+ }
546
+ html[data-theme=dark] .exprTreeLines path.exprTreePath.isSelected {
547
+ stroke: var(--brand);
548
+ filter: var(--expr-tree-path-selected-shadow-dark);
549
+ }
550
+ .exprTreeLines path.exprTreePath.isActive {
551
+ stroke: var(--brand-2);
552
+ stroke-width: var(--expr-tree-path-active-stroke-width);
553
+ filter: var(--expr-tree-path-active-shadow);
554
+ animation: exprActivePathPulse 420ms var(--ease) 2;
555
+ }
556
+ html[data-theme=dark] .exprTreeLines path.exprTreePath.isActive {
557
+ stroke: var(--brand-2);
558
+ filter: var(--expr-tree-path-active-shadow-dark);
559
+ animation: none;
560
+ }
561
+ @keyframes exprActivePathPulse {
562
+ 0% {
563
+ opacity: 0.72;
564
+ }
565
+ 50% {
566
+ opacity: 1;
567
+ }
568
+ 100% {
569
+ opacity: 0.86;
570
+ }
571
+ }
572
+ .exprNode {
573
+ position: absolute;
574
+ z-index: 20;
575
+ border: 1px solid var(--border);
576
+ border-radius: var(--r-md);
577
+ background:
578
+ linear-gradient(
579
+ 180deg,
580
+ var(--surface),
581
+ var(--surface-2));
582
+ box-shadow: 0 1px 3px rgba(16, 24, 40, 0.08), 0 6px 18px rgba(16, 24, 40, 0.06);
583
+ overflow: hidden;
584
+ transition:
585
+ transform var(--t-med) var(--ease),
586
+ box-shadow var(--t-med) var(--ease),
587
+ border-color var(--t-med) var(--ease),
588
+ background var(--t-med) var(--ease),
589
+ filter var(--t-med) var(--ease);
590
+ }
591
+ .exprNodeHeader {
592
+ padding: var(--sp-3) var(--sp-5);
593
+ border-bottom: 1px solid var(--border-soft);
594
+ display: flex;
595
+ align-items: center;
596
+ gap: var(--sp-4);
597
+ background:
598
+ linear-gradient(
599
+ 180deg,
600
+ var(--surface),
601
+ var(--surface-2));
602
+ }
603
+ .exprNodeDot {
604
+ width: var(--expr-node-dot-size);
605
+ height: var(--expr-node-dot-size);
606
+ border-radius: var(--expr-node-dot-radius);
607
+ background: var(--brand);
608
+ box-shadow: var(--expr-node-dot-ring-shadow);
609
+ flex: 0 0 auto;
610
+ transition: background-color var(--t-med) var(--ease), box-shadow var(--t-med) var(--ease);
611
+ }
612
+ html[data-theme=dark] .exprNodeDot {
613
+ box-shadow: var(--expr-node-dot-ring-shadow-dark);
614
+ }
615
+ .exprNodeHeaderText {
616
+ display: flex;
617
+ flex-direction: column;
618
+ min-width: 0;
619
+ width: 100%;
620
+ }
621
+ .exprNodeTitleRow {
622
+ display: flex;
623
+ align-items: center;
624
+ gap: var(--sp-4);
625
+ min-width: 0;
626
+ width: 100%;
627
+ }
628
+ .exprNodeTitle {
629
+ font-size: 0.84rem;
630
+ font-weight: 800;
631
+ letter-spacing: -0.01em;
632
+ color: var(--text);
633
+ white-space: nowrap;
634
+ overflow: hidden;
635
+ text-overflow: ellipsis;
636
+ max-width: 100%;
637
+ }
638
+ .exprNodeType {
639
+ font-size: 0.68rem;
640
+ padding: 0.2rem 0.5rem;
641
+ border-radius: 999px;
642
+ border: 1px solid var(--border-soft);
643
+ background: var(--surface-solid);
644
+ color: var(--muted);
645
+ flex: 0 0 auto;
646
+ }
647
+ .exprNodeTitleRowRight {
648
+ display: inline-flex;
649
+ align-items: center;
650
+ gap: var(--sp-3);
651
+ margin-left: auto;
652
+ flex: 0 0 auto;
653
+ }
654
+ .exprNodeBody {
655
+ padding: var(--sp-3) var(--sp-5);
656
+ height: calc(100% - var(--expr-node-body-header-offset));
657
+ overflow: auto;
658
+ background:
659
+ linear-gradient(
660
+ 180deg,
661
+ var(--surface),
662
+ var(--surface-2));
663
+ }
664
+ .exprNodePre {
665
+ margin: 0;
666
+ font-size: 0.76rem;
667
+ line-height: 1.5;
668
+ tab-size: 2;
669
+ white-space: pre-wrap;
670
+ overflow-wrap: anywhere;
671
+ word-break: break-word;
672
+ color: var(--text);
673
+ }
674
+ .exprNodeMuted {
675
+ font-size: 0.78rem;
676
+ color: var(--muted);
677
+ }
678
+ .exprNode.isSelected {
679
+ border-color: var(--expr-node-selected-border);
680
+ box-shadow:
681
+ var(--shadow-1),
682
+ var(--expr-node-selected-ring),
683
+ var(--expr-node-selected-glow);
684
+ }
685
+ html[data-theme=dark] .exprNode.isSelected {
686
+ border-color: var(--expr-node-selected-border-dark);
687
+ box-shadow:
688
+ var(--shadow-1),
689
+ var(--expr-node-selected-ring-dark),
690
+ var(--expr-node-selected-glow-dark);
691
+ }
692
+ .exprNode.isSelected .exprNodeDot {
693
+ background: var(--brand);
694
+ box-shadow: var(--expr-node-selected-dot-ring), var(--expr-node-selected-dot-glow);
695
+ }
696
+ html[data-theme=dark] .exprNode.isSelected .exprNodeDot {
697
+ box-shadow: var(--expr-node-selected-dot-ring-dark), var(--expr-node-selected-dot-glow-dark);
698
+ }
699
+ .exprNode.isActive {
700
+ border-color: var(--expr-node-active-border);
701
+ transform: translateY(var(--expr-node-hover-lift));
702
+ box-shadow:
703
+ var(--shadow-1),
704
+ var(--expr-node-active-ring),
705
+ var(--expr-node-active-glow);
706
+ animation: exprPulse 520ms var(--ease);
707
+ }
708
+ html[data-theme=dark] .exprNode.isActive {
709
+ border-color: var(--expr-node-active-border-dark);
710
+ box-shadow:
711
+ var(--shadow-1),
712
+ var(--expr-node-active-ring-dark),
713
+ var(--expr-node-active-glow-dark);
714
+ }
715
+ .exprNode.isActive .exprNodeDot {
716
+ background: var(--brand-2);
717
+ box-shadow: var(--expr-node-active-dot-ring), var(--expr-node-active-dot-glow);
718
+ }
719
+ html[data-theme=dark] .exprNode.isActive .exprNodeDot {
720
+ box-shadow: var(--expr-node-active-dot-ring-dark), var(--expr-node-active-dot-glow-dark);
721
+ }
722
+ @keyframes exprPulse {
723
+ 0% {
724
+ transform: translateY(var(--expr-node-hover-lift)) scale(1);
725
+ }
726
+ 45% {
727
+ transform: translateY(var(--expr-node-hover-lift)) scale(var(--expr-node-pulse-scale));
728
+ }
729
+ 100% {
730
+ transform: translateY(var(--expr-node-hover-lift)) scale(1);
731
+ }
732
+ }
733
+ .exprNode.exprNode--async .exprNodeHeader {
734
+ background: var(--expr-node-async-header);
735
+ }
736
+ html[data-theme=dark] .exprNode.exprNode--async .exprNodeHeader {
737
+ background: var(--expr-node-async-header-dark);
738
+ }
739
+ .exprNode.exprNode--async .exprNodeDot {
740
+ background: var(--brand-2);
741
+ box-shadow: var(--expr-node-async-dot-shadow);
742
+ animation: exprAsyncDotPulse 1.6s var(--ease) infinite;
743
+ }
744
+ html[data-theme=dark] .exprNode.exprNode--async .exprNodeDot {
745
+ box-shadow: var(--expr-node-async-dot-shadow-dark);
746
+ }
747
+ @keyframes exprAsyncDotPulse {
748
+ 0% {
749
+ box-shadow: var(--expr-node-async-dot-pulse-start);
750
+ }
751
+ 70% {
752
+ box-shadow: var(--expr-node-async-dot-pulse-mid);
753
+ }
754
+ 100% {
755
+ box-shadow: var(--expr-node-async-dot-pulse-end);
756
+ }
757
+ }
758
+ html[data-theme=dark] .exprNodeAsyncPill {
759
+ border-color: var(--expr-node-async-pill-border-dark);
760
+ background: var(--expr-node-async-pill-bg-dark);
761
+ color: var(--brand-2);
762
+ }
763
+ .exprNodeAsyncPill {
764
+ display: inline-flex;
765
+ align-items: center;
766
+ gap: var(--expr-node-async-pill-gap);
767
+ height: var(--expr-node-async-pill-height);
768
+ padding: 0 var(--expr-node-async-pill-px);
769
+ border-radius: var(--expr-node-async-pill-radius);
770
+ font-size: 0.62rem;
771
+ font-weight: 700;
772
+ letter-spacing: 0.04em;
773
+ text-transform: uppercase;
774
+ border: 1px solid var(--expr-node-async-pill-border);
775
+ background: var(--expr-node-async-pill-bg);
776
+ color: var(--brand-2);
777
+ }
778
+ .exprNodeAsyncLabel {
779
+ user-select: none;
780
+ }
781
+ .exprNodeAsyncPulse {
782
+ width: var(--expr-node-async-pulse-size);
783
+ height: var(--expr-node-async-pulse-size);
784
+ border-radius: 999px;
785
+ background: currentColor;
786
+ }
787
+ @media (prefers-reduced-motion: reduce) {
788
+ .exprNode.exprNode--async .exprNodeDot {
789
+ animation: none;
790
+ box-shadow: var(--expr-node-dot-ring-shadow);
791
+ }
792
+ html[data-theme=dark] .exprNode.exprNode--async .exprNodeDot {
793
+ box-shadow: var(--expr-node-dot-ring-shadow-dark);
794
+ }
795
+ }
796
+
797
+ /* src/components/left-accent-card/left-accent-card.component.css */
798
+ .rsxLeftAccentCard {
799
+ position: relative;
800
+ min-width: 0;
801
+ --rsx-left-accent-offset-top: 0.625rem;
802
+ --rsx-left-accent-offset-bottom: 0.625rem;
803
+ --rsx-left-accent-offset-y: 0.625rem;
804
+ --rsx-left-accent-width: 4px;
805
+ --rsx-left-accent:
806
+ linear-gradient(
807
+
808
+ 180deg,
809
+ color-mix(in srgb, var(--brand, #0b66ff) 62%, transparent),
810
+ color-mix(in srgb, var(--brand-2, #2bb6a9) 56%, transparent) );
811
+ }
812
+ .rsxLeftAccentCard::before {
813
+ content: "";
814
+ position: absolute;
815
+ left: 0;
816
+ top: var(--rsx-left-accent-offset-top, var(--rsx-left-accent-offset-y));
817
+ bottom: var(--rsx-left-accent-offset-bottom, var(--rsx-left-accent-offset-y));
818
+ width: var(--rsx-left-accent-width);
819
+ border-radius: 999px;
820
+ background: var(--rsx-left-accent);
821
+ }
822
+ .rsxLeftAccentCard--brand {
823
+ --rsx-left-accent:
824
+ linear-gradient(
825
+
826
+ 180deg,
827
+ color-mix(in srgb, var(--brand, #0b66ff) 62%, transparent),
828
+ color-mix(in srgb, var(--brand-2, #2bb6a9) 56%, transparent) );
829
+ }
830
+ .rsxLeftAccentCard--active {
831
+ --rsx-left-accent:
832
+ linear-gradient(
833
+
834
+ 180deg,
835
+ color-mix(in srgb, var(--brand, #0b66ff) 70%, transparent),
836
+ color-mix(in srgb, var(--brand, #0b66ff) 45%, transparent) );
837
+ }
838
+ .rsxLeftAccentCard--done {
839
+ --rsx-left-accent:
840
+ linear-gradient(
841
+
842
+ 180deg,
843
+ color-mix(in srgb, var(--brand-2, #2bb6a9) 72%, transparent),
844
+ color-mix(in srgb, #39d353 55%, transparent) );
845
+ }
846
+ .rsxLeftAccentCard--mostly {
847
+ --rsx-left-accent:
848
+ linear-gradient(
849
+
850
+ 180deg,
851
+ color-mix(in srgb, var(--brand-2, #2bb6a9) 55%, transparent),
852
+ color-mix(in srgb, var(--brand, #0b66ff) 48%, transparent) );
853
+ }
854
+ .rsxLeftAccentCard--planned {
855
+ --rsx-left-accent:
856
+ linear-gradient(
857
+
858
+ 180deg,
859
+ color-mix(in srgb, var(--muted, #6b7280) 60%, transparent),
860
+ color-mix(in srgb, var(--muted, #6b7280) 44%, transparent) );
861
+ }
862
+
863
+ /* src/components/notification-toast/notification-toast.component.css */
864
+ .notificationToastHost {
865
+ position: fixed;
866
+ top: var(--sp-6);
867
+ right: var(--sp-6);
868
+ z-index: 1400;
869
+ pointer-events: none;
870
+ }
871
+ .notificationToast {
872
+ min-width: 260px;
873
+ max-width: min(92vw, 460px);
874
+ border-radius: 12px;
875
+ border: 1px solid var(--border);
876
+ background: var(--surface-solid);
877
+ color: var(--text);
878
+ box-shadow: var(--shadow-1);
879
+ padding: var(--sp-4) var(--sp-5);
880
+ pointer-events: auto;
881
+ }
882
+ .notificationToastTitle {
883
+ font-weight: 800;
884
+ margin-bottom: var(--sp-1);
885
+ }
886
+ .notificationToastMessage {
887
+ line-height: 1.45;
888
+ color: var(--muted);
889
+ white-space: pre-wrap;
890
+ word-break: break-word;
891
+ }
892
+ .notificationToast--success {
893
+ border-color: color-mix(in srgb, var(--brand-2) 45%, var(--border));
894
+ }
895
+ .notificationToast--error {
896
+ border-color: color-mix(in srgb, #ef4444 45%, var(--border));
897
+ }
898
+
899
+ /* src/components/ts-editor/ts-editor.component.css */
900
+ .monaco-placeholder {
901
+ opacity: 0.5;
902
+ color: var(--muted);
903
+ white-space: pre;
904
+ pointer-events: none;
905
+ }
906
+ .tsEditorShell {
907
+ display: flex;
908
+ flex-direction: column;
909
+ height: 100%;
910
+ min-height: 0;
911
+ min-width: 0;
912
+ background: transparent;
913
+ border: none;
914
+ border-radius: inherit;
915
+ box-shadow: none;
916
+ overflow: hidden;
917
+ }
918
+ .tsEditorBody {
919
+ display: flex;
920
+ flex: 1;
921
+ min-height: 0;
922
+ min-width: 0;
923
+ background: var(--panel-surface);
924
+ overflow: hidden;
925
+ }
926
+ .editor-wrapper {
927
+ flex: 1;
928
+ height: 100%;
929
+ min-height: 0;
930
+ min-width: 0;
931
+ overflow: hidden;
932
+ border-top: none;
933
+ }
934
+ .tsEditorHeader {
935
+ display: flex;
936
+ align-items: center;
937
+ justify-content: space-between;
938
+ gap: var(--sp-6);
939
+ padding: var(--sp-4) var(--sp-6);
940
+ border-bottom: 1px solid var(--panel-divider-color);
941
+ background: var(--panel-header-surface);
942
+ }
943
+ .tsEditorHeaderLeft {
944
+ display: flex;
945
+ align-items: center;
946
+ gap: var(--sp-6);
947
+ min-width: 0;
948
+ flex: 1 1 auto;
949
+ }
950
+ .tsEditorTitle {
951
+ color: var(--text);
952
+ font-weight: 900;
953
+ font-size: 1rem;
954
+ letter-spacing: -0.02em;
955
+ white-space: nowrap;
956
+ flex: 0 0 auto;
957
+ }
958
+ .tsEditorInputGroup {
959
+ display: flex;
960
+ align-items: center;
961
+ gap: var(--sp-4);
962
+ min-width: 0;
963
+ flex: 1 1 auto;
964
+ }
965
+ .tsEditorInput {
966
+ height: 2.75rem;
967
+ width: var(--ts-editor-input-width);
968
+ max-width: min(100%, 28rem);
969
+ min-width: 0;
970
+ padding: 0 var(--sp-4);
971
+ border-radius: var(--ts-editor-input-radius);
972
+ border: 1px solid var(--border);
973
+ background: var(--surface-solid);
974
+ color: var(--text);
975
+ outline: none;
976
+ transition:
977
+ border-color var(--t-med) var(--ease),
978
+ box-shadow var(--t-med) var(--ease),
979
+ background var(--t-med) var(--ease);
980
+ }
981
+ .tsEditorInput::placeholder {
982
+ color: var(--muted);
983
+ }
984
+ .tsEditorInput:focus {
985
+ border-color: var(--border);
986
+ box-shadow: 0 0 0 var(--ts-editor-input-focus-ring-width) var(--focus);
987
+ }
988
+ .tsEditorHeaderRight {
989
+ display: flex;
990
+ align-items: center;
991
+ gap: var(--sp-3);
992
+ flex: 0 0 auto;
993
+ }
994
+ .tsEditorHeaderRight .btn {
995
+ display: inline-flex;
996
+ align-items: center;
997
+ }
998
+ .tsEditorHeaderRight .btn svg {
999
+ width: 0.95rem;
1000
+ height: 0.95rem;
1001
+ flex: 0 0 auto;
1002
+ }
1003
+ .tsEditorCompileBtn:disabled {
1004
+ opacity: 0.55;
1005
+ box-shadow: none;
1006
+ }
1007
+ .tsEditorShell .monaco-editor {
1008
+ padding-top: var(--sp-2);
1009
+ }
1010
+ .tsEditorShell .overflow-guard {
1011
+ border-radius: 0;
1012
+ }
1013
+ .tsEditorShell .monaco-editor .monaco-hover {
1014
+ pointer-events: none;
1015
+ }
1016
+ @media (max-width: 900px) {
1017
+ .tsEditorHeader {
1018
+ align-items: flex-start;
1019
+ flex-direction: column;
1020
+ }
1021
+ .tsEditorHeaderLeft {
1022
+ width: 100%;
1023
+ flex-wrap: wrap;
1024
+ }
1025
+ .tsEditorInputGroup {
1026
+ width: 100%;
1027
+ }
1028
+ .tsEditorInput {
1029
+ width: 100%;
1030
+ max-width: 100%;
1031
+ }
1032
+ .tsEditorHeaderRight {
1033
+ width: 100%;
1034
+ justify-content: flex-end;
1035
+ flex-wrap: wrap;
1036
+ }
1037
+ }
1038
+ @media (max-width: 640px) {
1039
+ .tsEditorHeader {
1040
+ padding: var(--sp-4);
1041
+ }
1042
+ .tsEditorHeaderRight {
1043
+ justify-content: stretch;
1044
+ }
1045
+ .tsEditorHeaderRight .btn {
1046
+ flex: 1 1 auto;
1047
+ }
1048
+ }
1049
+
1050
+ /* src/styles/theme-tokens.css */
1051
+ .app {
1052
+ --font-sans:
1053
+ ui-sans-serif,
1054
+ system-ui,
1055
+ -apple-system,
1056
+ Segoe UI,
1057
+ Roboto,
1058
+ Helvetica,
1059
+ Arial,
1060
+ "Apple Color Emoji",
1061
+ "Segoe UI Emoji";
1062
+ --font-mono:
1063
+ ui-monospace,
1064
+ SFMono-Regular,
1065
+ Menlo,
1066
+ Monaco,
1067
+ Consolas,
1068
+ "Liberation Mono",
1069
+ "Courier New",
1070
+ monospace;
1071
+ --sp-1: 0.25rem;
1072
+ --sp-2: 0.5rem;
1073
+ --sp-3: 0.75rem;
1074
+ --sp-4: 1rem;
1075
+ --sp-5: 1.25rem;
1076
+ --sp-6: 1.5rem;
1077
+ --sp-7: 2rem;
1078
+ --sp-8: 2.5rem;
1079
+ --sp-9: 3rem;
1080
+ --sp-10: 4rem;
1081
+ --sp-11: 5rem;
1082
+ --r-md: 1rem;
1083
+ --r-lg: 1.25rem;
1084
+ --r-xl: 1.75rem;
1085
+ --bg: #f6f8fc;
1086
+ --brand: #0b66ff;
1087
+ --brand-2: #2bb6a9;
1088
+ --surface: rgba(255, 255, 255, 0.86);
1089
+ --surface-2: rgba(255, 255, 255, 0.72);
1090
+ --surface-solid: #ffffff;
1091
+ --text: #0b1324;
1092
+ --fg: var(--text);
1093
+ --muted: rgba(11, 19, 36, 0.66);
1094
+ --muted-2: rgba(11, 19, 36, 0.54);
1095
+ --border: rgba(10, 25, 55, 0.14);
1096
+ --border-soft: rgba(10, 25, 55, 0.1);
1097
+ --sep: var(--border-soft);
1098
+ --focus: rgba(11, 102, 255, 0.35);
1099
+ --shadow-1: 0 1px 2px rgba(16, 24, 40, 0.06), 0 12px 34px rgba(16, 24, 40, 0.1);
1100
+ --shadow-2: 0 2px 10px rgba(16, 24, 40, 0.08), 0 18px 52px rgba(16, 24, 40, 0.12);
1101
+ --shadow-focus: 0 0 0 3px var(--focus);
1102
+ --ease: cubic-bezier(0.2, 0.8, 0.2, 1);
1103
+ --t-fast: 160ms;
1104
+ --t-med: 240ms;
1105
+ --code-surface: #0b0f1a;
1106
+ --btn-bg: var(--brand);
1107
+ --btn-fg: #ffffff;
1108
+ --btn-bg-hover: #0a5ae0;
1109
+ --control-h: 32px;
1110
+ --icon-btn-size: 30px;
1111
+ --icon-size-sm: 14px;
1112
+ --panel-gap: 0px;
1113
+ --splitter-size: 1px;
1114
+ --splitter-color: var(--border-soft);
1115
+ --splitter-color-hover: var(--border);
1116
+ --splitter-glow: transparent;
1117
+ --zoom-select-w: 110px;
1118
+ --panel-surface: var(--surface-solid);
1119
+ --panel-header-surface:
1120
+ linear-gradient(
1121
+
1122
+ 180deg,
1123
+ var(--surface),
1124
+ var(--surface-solid) );
1125
+ --panel-border-color: color-mix(in srgb, var(--border-soft) 84%, transparent);
1126
+ --panel-divider-color: color-mix( in srgb, var(--border-soft) 88%, transparent );
1127
+ --panel: var(--surface-solid);
1128
+ --panel-header: var(--surface-2);
1129
+ --surface-1: var(--surface);
1130
+ --border-1: var(--border);
1131
+ --border-2: var(--border-soft);
1132
+ --shadow-panel: var(--shadow-1);
1133
+ --chg-active-border: color-mix(in srgb, var(--brand) 55%, transparent);
1134
+ --chg-active-bg: color-mix(in srgb, var(--surface) 70%, var(--brand) 30%);
1135
+ --chg-active-shadow: 0 0 0 1px color-mix(in srgb, var(--brand) 16%, transparent);
1136
+ --chg-active-rail: color-mix(in srgb, var(--brand) 92%, transparent);
1137
+ --chg-expr-color: color-mix(in srgb, var(--text) 72%, var(--brand) 28%);
1138
+ --chg-diff-old: color-mix(in srgb, var(--text) 58%, #ef4444 42%);
1139
+ --chg-diff-new: color-mix(in srgb, var(--text) 55%, var(--brand-2) 45%);
1140
+ --chg-step-dot-trigger-bg: color-mix(in srgb, var(--brand) 95%, transparent);
1141
+ --chg-step-dot-trigger-ring: 0 0 0 3px color-mix(in srgb, var(--brand) 12%, transparent);
1142
+ --chg-step-dot-trigger-border: color-mix( in srgb, var(--brand) 40%, transparent );
1143
+ --chg-body-bg: color-mix(in srgb, var(--surface-solid) 86%, var(--bg) 14%);
1144
+ --err-item-bg: color-mix( in srgb, var(--surface) 82%, var(--surface-solid) 18% );
1145
+ --err-item-border: color-mix(in srgb, var(--border) 82%, var(--brand) 18%);
1146
+ --err-item-text: color-mix(in srgb, var(--text) 78%, #ef4444 22%);
1147
+ --ts-editor-input-width: 320px;
1148
+ --ts-editor-input-radius: 14px;
1149
+ --ts-editor-input-focus-ring-width: 3px;
1150
+ --expr-tree-path-stroke: rgba(11, 19, 36, 0.18);
1151
+ --expr-tree-path-stroke-dark: rgba(237, 242, 255, 0.22);
1152
+ --expr-tree-path-stroke-width: 2px;
1153
+ --expr-tree-path-selected-stroke-width: 3.2px;
1154
+ --expr-tree-path-active-stroke-width: 5.2px;
1155
+ --expr-tree-path-selected-shadow: drop-shadow( 0 0 6px rgba(11, 102, 255, 0.24) );
1156
+ --expr-tree-path-selected-shadow-dark: drop-shadow( 0 0 6px rgba(122, 182, 255, 0.28) );
1157
+ --expr-tree-path-active-shadow: drop-shadow(0 0 10px rgba(43, 182, 169, 0.44)) drop-shadow(0 0 22px rgba(43, 182, 169, 0.22));
1158
+ --expr-tree-path-active-shadow-dark: drop-shadow( 0 0 8px rgba(73, 217, 200, 0.34) ) drop-shadow(0 0 16px rgba(73, 217, 200, 0.18));
1159
+ --expr-node-dot-size: 10px;
1160
+ --expr-node-dot-radius: 999px;
1161
+ --expr-node-dot-ring-size: 4px;
1162
+ --expr-node-dot-ring-shadow: 0 0 0 var(--expr-node-dot-ring-size) rgba(11, 102, 255, 0.12);
1163
+ --expr-node-dot-ring-shadow-dark: 0 0 0 var(--expr-node-dot-ring-size) rgba(122, 182, 255, 0.14);
1164
+ --expr-node-selected-border: rgba(11, 102, 255, 0.38);
1165
+ --expr-node-selected-border-dark: rgba(122, 182, 255, 0.42);
1166
+ --expr-node-selected-ring: 0 0 0 2px rgba(11, 102, 255, 0.14);
1167
+ --expr-node-selected-ring-dark: 0 0 0 2px rgba(122, 182, 255, 0.16);
1168
+ --expr-node-selected-glow: 0 0 18px rgba(11, 102, 255, 0.08);
1169
+ --expr-node-selected-glow-dark: 0 0 18px rgba(122, 182, 255, 0.1);
1170
+ --expr-node-selected-dot-ring: 0 0 0 4px rgba(11, 102, 255, 0.18);
1171
+ --expr-node-selected-dot-ring-dark: 0 0 0 4px rgba(122, 182, 255, 0.2);
1172
+ --expr-node-selected-dot-glow: 0 0 12px rgba(11, 102, 255, 0.1);
1173
+ --expr-node-selected-dot-glow-dark: 0 0 12px rgba(122, 182, 255, 0.12);
1174
+ --expr-node-active-border: rgba(43, 182, 169, 0.72);
1175
+ --expr-node-active-border-dark: rgba(73, 217, 200, 0.6);
1176
+ --expr-node-active-ring: 0 0 0 2px rgba(43, 182, 169, 0.22);
1177
+ --expr-node-active-ring-dark: 0 0 0 2px rgba(73, 217, 200, 0.18);
1178
+ --expr-node-active-glow: 0 0 24px rgba(43, 182, 169, 0.2);
1179
+ --expr-node-active-glow-dark: 0 0 22px rgba(73, 217, 200, 0.14);
1180
+ --expr-node-active-dot-ring: 0 0 0 4px rgba(43, 182, 169, 0.24);
1181
+ --expr-node-active-dot-ring-dark: 0 0 0 4px rgba(73, 217, 200, 0.2);
1182
+ --expr-node-active-dot-glow: 0 0 18px rgba(43, 182, 169, 0.22);
1183
+ --expr-node-active-dot-glow-dark: 0 0 16px rgba(73, 217, 200, 0.16);
1184
+ --expr-node-async-header:
1185
+ linear-gradient(
1186
+
1187
+ 90deg,
1188
+ rgba(43, 182, 169, 0.08) 0%,
1189
+ var(--surface) 55% );
1190
+ --expr-node-async-header-dark:
1191
+ linear-gradient(
1192
+
1193
+ 90deg,
1194
+ rgba(73, 217, 200, 0.1) 0%,
1195
+ var(--surface) 55% );
1196
+ --expr-node-async-dot-shadow: 0 0 0 0 rgba(43, 182, 169, 0);
1197
+ --expr-node-async-dot-shadow-dark: 0 0 0 0 rgba(73, 217, 200, 0);
1198
+ --expr-node-async-dot-pulse-start: 0 0 0 0 rgba(43, 182, 169, 0.32);
1199
+ --expr-node-async-dot-pulse-mid: 0 0 0 8px rgba(43, 182, 169, 0);
1200
+ --expr-node-async-dot-pulse-end: 0 0 0 0 rgba(43, 182, 169, 0);
1201
+ --expr-node-async-pill-border: rgba(43, 182, 169, 0.3);
1202
+ --expr-node-async-pill-bg: rgba(43, 182, 169, 0.1);
1203
+ --expr-node-async-pill-border-dark: rgba(73, 217, 200, 0.34);
1204
+ --expr-node-async-pill-bg-dark: rgba(73, 217, 200, 0.12);
1205
+ --expr-node-async-pill-gap: 6px;
1206
+ --expr-node-async-pill-height: 18px;
1207
+ --expr-node-async-pill-px: 8px;
1208
+ --expr-node-async-pill-radius: 999px;
1209
+ --expr-node-async-pulse-size: 6px;
1210
+ --expr-node-hover-lift: -1px;
1211
+ --expr-node-pulse-scale: 1.015;
1212
+ --expr-node-body-header-offset: 40px;
1213
+ }
1214
+ html[data-theme=dark] .app {
1215
+ --bg: #070b14;
1216
+ --surface: rgba(12, 18, 35, 0.82);
1217
+ --surface-2: rgba(12, 18, 35, 0.68);
1218
+ --surface-solid: #0c1223;
1219
+ --text: #edf2ff;
1220
+ --fg: var(--text);
1221
+ --muted: rgba(237, 242, 255, 0.7);
1222
+ --muted-2: rgba(237, 242, 255, 0.54);
1223
+ --border: rgba(237, 242, 255, 0.16);
1224
+ --border-soft: rgba(237, 242, 255, 0.12);
1225
+ --sep: var(--border-soft);
1226
+ --brand: #7ab6ff;
1227
+ --brand-2: #49d9c8;
1228
+ --shadow-1: 0 1px 2px rgba(0, 0, 0, 0.22), 0 12px 34px rgba(0, 0, 0, 0.32);
1229
+ --shadow-2: 0 2px 10px rgba(0, 0, 0, 0.24), 0 18px 52px rgba(0, 0, 0, 0.34);
1230
+ --shadow-focus: 0 0 0 3px var(--focus);
1231
+ --code-surface: #050711;
1232
+ --btn-bg: #1d5cff;
1233
+ --btn-bg-hover: #184fe0;
1234
+ --splitter-color: var(--border-soft);
1235
+ --splitter-color-hover: var(--border);
1236
+ --splitter-glow: transparent;
1237
+ --panel-surface: color-mix(in srgb, var(--surface-solid) 86%, var(--bg) 14%);
1238
+ --panel-header-surface:
1239
+ linear-gradient(
1240
+
1241
+ 180deg,
1242
+ rgba(12, 18, 35, 0.9),
1243
+ rgba(12, 18, 35, 0.82) );
1244
+ --panel-border-color: rgba(237, 242, 255, 0.08);
1245
+ --panel-divider-color: rgba(237, 242, 255, 0.07);
1246
+ --panel: var(--surface-solid);
1247
+ --panel-header: var(--surface-2);
1248
+ --surface-1: var(--surface);
1249
+ --border-1: var(--border);
1250
+ --border-2: var(--border-soft);
1251
+ --shadow-panel: var(--shadow-1);
1252
+ --chg-active-border: color-mix(in srgb, var(--brand) 62%, transparent);
1253
+ --chg-active-bg: color-mix(in srgb, var(--surface) 74%, var(--brand) 26%);
1254
+ --chg-active-shadow: 0 0 0 1px color-mix(in srgb, var(--brand) 24%, transparent);
1255
+ --chg-active-rail: color-mix(in srgb, var(--brand) 96%, transparent);
1256
+ --chg-expr-color: color-mix(in srgb, var(--text) 76%, var(--brand) 24%);
1257
+ --chg-diff-old: color-mix(in srgb, var(--text) 62%, #f87171 38%);
1258
+ --chg-diff-new: color-mix(in srgb, var(--text) 58%, var(--brand-2) 42%);
1259
+ --chg-step-dot-trigger-bg: color-mix(in srgb, var(--brand) 96%, transparent);
1260
+ --chg-step-dot-trigger-ring: 0 0 0 3px color-mix(in srgb, var(--brand) 20%, transparent);
1261
+ --chg-step-dot-trigger-border: color-mix( in srgb, var(--brand) 48%, transparent );
1262
+ --chg-body-bg: color-mix(in srgb, var(--surface-solid) 86%, var(--bg) 14%);
1263
+ --err-item-bg: color-mix( in srgb, var(--surface) 86%, var(--surface-solid) 14% );
1264
+ --err-item-border: color-mix(in srgb, var(--border) 70%, #f87171 30%);
1265
+ --err-item-text: color-mix(in srgb, var(--text) 72%, #f87171 28%);
1266
+ }
1267
+
1268
+ /* src/styles/component-shell.css */
1269
+ .app {
1270
+ height: 100%;
1271
+ margin: 0;
1272
+ padding: var(--sp-4);
1273
+ font-family: var(--font-sans);
1274
+ background: transparent;
1275
+ color: var(--text);
1276
+ min-height: 0;
1277
+ min-width: 0;
1278
+ }
1279
+ .panels-container {
1280
+ height: 100%;
1281
+ width: 100%;
1282
+ display: flex;
1283
+ min-height: 0;
1284
+ min-width: 0;
1285
+ }
1286
+ .panel-stack {
1287
+ display: flex;
1288
+ flex-direction: column;
1289
+ height: 100%;
1290
+ width: 100%;
1291
+ flex: 1;
1292
+ min-height: 0;
1293
+ min-width: 0;
1294
+ }
1295
+ .panel {
1296
+ display: flex;
1297
+ flex-direction: column;
1298
+ overflow: hidden;
1299
+ background: var(--panel-surface);
1300
+ border-radius: 10px;
1301
+ margin: var(--panel-gap);
1302
+ box-shadow: none;
1303
+ border: 1px solid var(--panel-border-color);
1304
+ min-height: 0;
1305
+ min-width: 0;
1306
+ }
1307
+ .panelPlain {
1308
+ background: transparent;
1309
+ border: none;
1310
+ border-radius: 0;
1311
+ box-shadow: none;
1312
+ }
1313
+ .panelFlat {
1314
+ border-radius: 0;
1315
+ }
1316
+ .panelElevated {
1317
+ box-shadow: var(--shadow-1);
1318
+ }
1319
+ .panel-header {
1320
+ padding: var(--sp-4) var(--sp-6);
1321
+ font-weight: 800;
1322
+ letter-spacing: -0.01em;
1323
+ background: var(--panel-header-surface);
1324
+ border-bottom: 1px solid var(--panel-divider-color);
1325
+ display: flex;
1326
+ align-items: center;
1327
+ justify-content: space-between;
1328
+ gap: var(--sp-4);
1329
+ min-width: 0;
1330
+ width: 100%;
1331
+ }
1332
+ .panel-header-row {
1333
+ flex-wrap: nowrap;
1334
+ width: 100%;
1335
+ min-width: 0;
1336
+ }
1337
+ .editor-wrapper,
1338
+ .panel-body {
1339
+ flex: 1;
1340
+ overflow: auto;
1341
+ padding: 0;
1342
+ min-height: 0;
1343
+ min-width: 0;
1344
+ }
1345
+ .panel-content {
1346
+ flex: 1;
1347
+ position: relative;
1348
+ overflow: hidden;
1349
+ min-height: 0;
1350
+ min-width: 0;
1351
+ }
1352
+ .scroll-host {
1353
+ position: absolute;
1354
+ inset: 0;
1355
+ overflow: auto;
1356
+ overflow-x: hidden;
1357
+ padding: var(--sp-3);
1358
+ }
1359
+ .separator {
1360
+ position: relative;
1361
+ width: 10px;
1362
+ cursor: col-resize;
1363
+ background-color: transparent;
1364
+ border-radius: 0;
1365
+ transition: background-color var(--t-med) var(--ease), box-shadow var(--t-med) var(--ease);
1366
+ }
1367
+ .separator-horizontal {
1368
+ position: relative;
1369
+ height: 10px;
1370
+ cursor: row-resize;
1371
+ background-color: transparent;
1372
+ border-radius: 0;
1373
+ flex-shrink: 0;
1374
+ transition: background-color var(--t-med) var(--ease), box-shadow var(--t-med) var(--ease);
1375
+ }
1376
+ .separator::before {
1377
+ content: "";
1378
+ position: absolute;
1379
+ top: 0;
1380
+ bottom: 0;
1381
+ left: 50%;
1382
+ width: var(--splitter-size);
1383
+ transform: translateX(-50%);
1384
+ background: var(--splitter-color);
1385
+ }
1386
+ .separator-horizontal::before {
1387
+ content: "";
1388
+ position: absolute;
1389
+ left: 0;
1390
+ right: 0;
1391
+ top: 50%;
1392
+ height: var(--splitter-size);
1393
+ transform: translateY(-50%);
1394
+ background: var(--splitter-color);
1395
+ }
1396
+ .separator:hover,
1397
+ .separator-horizontal:hover,
1398
+ .separator[data-resize-handle-active=pointer],
1399
+ .separator-horizontal[data-resize-handle-active=pointer],
1400
+ .separator[data-resize-handle-active=keyboard],
1401
+ .separator-horizontal[data-resize-handle-active=keyboard] {
1402
+ box-shadow: none;
1403
+ }
1404
+ .separator:hover::before,
1405
+ .separator-horizontal:hover::before,
1406
+ .separator[data-resize-handle-active=pointer]::before,
1407
+ .separator-horizontal[data-resize-handle-active=pointer]::before,
1408
+ .separator[data-resize-handle-active=keyboard]::before,
1409
+ .separator-horizontal[data-resize-handle-active=keyboard]::before {
1410
+ background: var(--splitter-color-hover);
1411
+ }
1412
+ .btn {
1413
+ display: inline-flex;
1414
+ align-items: center;
1415
+ justify-content: center;
1416
+ gap: var(--sp-2);
1417
+ padding: 0.82rem 1.18rem;
1418
+ border-radius: 14px;
1419
+ border: 1px solid transparent;
1420
+ font-weight: 800;
1421
+ line-height: 1;
1422
+ white-space: nowrap;
1423
+ transition:
1424
+ transform var(--t-fast) var(--ease),
1425
+ background var(--t-med) var(--ease),
1426
+ border-color var(--t-med) var(--ease),
1427
+ box-shadow var(--t-med) var(--ease);
1428
+ }
1429
+ .btn:hover {
1430
+ text-decoration: none;
1431
+ }
1432
+ .btn:active {
1433
+ transform: translateY(1px);
1434
+ }
1435
+ .btnSm {
1436
+ padding: 0.68rem 0.98rem;
1437
+ border-radius: 14px;
1438
+ font-weight: 850;
1439
+ }
1440
+ .btnPrimary {
1441
+ background: var(--btn-bg);
1442
+ color: var(--btn-fg);
1443
+ box-shadow: var(--shadow-1);
1444
+ border-color: color-mix(in srgb, var(--btn-bg) 70%, transparent);
1445
+ }
1446
+ .btnPrimary:hover {
1447
+ background: var(--btn-bg-hover);
1448
+ }
1449
+ .btnGhost {
1450
+ background: var(--surface-2);
1451
+ color: var(--text);
1452
+ border-color: var(--border);
1453
+ box-shadow: none;
1454
+ }
1455
+ .btnGhost:hover {
1456
+ box-shadow: var(--shadow-1);
1457
+ }
1458
+ .icon-btn {
1459
+ width: var(--icon-btn-size);
1460
+ height: var(--icon-btn-size);
1461
+ padding: 0;
1462
+ display: flex;
1463
+ align-items: center;
1464
+ justify-content: center;
1465
+ border-radius: var(--r-xs, 4px);
1466
+ border: 1px solid var(--border);
1467
+ background: var(--surface);
1468
+ color: var(--text);
1469
+ opacity: 0.9;
1470
+ transition:
1471
+ opacity var(--t-fast) var(--ease),
1472
+ background-color var(--t-fast) var(--ease),
1473
+ border-color var(--t-fast) var(--ease),
1474
+ transform var(--t-fast) var(--ease);
1475
+ }
1476
+ .icon-btn svg {
1477
+ width: var(--icon-size-sm);
1478
+ height: var(--icon-size-sm);
1479
+ display: block;
1480
+ opacity: 0.95;
1481
+ }
1482
+ .icon-btn:hover {
1483
+ opacity: 1;
1484
+ background: var(--surface-2);
1485
+ border-color: var(--border-soft);
1486
+ }
1487
+ .icon-btn:active {
1488
+ transform: translateY(1px);
1489
+ }
1490
+ .exprTreeHeaderTitle {
1491
+ display: flex;
1492
+ align-items: center;
1493
+ gap: var(--sp-4);
1494
+ flex: 1 1 auto;
1495
+ min-width: 0;
1496
+ overflow: hidden;
1497
+ }
1498
+ .exprTreeHeaderExpr {
1499
+ font-weight: 600;
1500
+ font-size: 0.9em;
1501
+ opacity: 0.9;
1502
+ white-space: nowrap;
1503
+ overflow: hidden;
1504
+ text-overflow: ellipsis;
1505
+ min-width: 0;
1506
+ max-width: 420px;
1507
+ }
1508
+ .exprTreeHeaderControls {
1509
+ display: flex;
1510
+ align-items: center;
1511
+ gap: var(--sp-4);
1512
+ flex: 0 0 auto;
1513
+ min-width: 0;
1514
+ }
1515
+ .exprTreeHeaderQuickActions {
1516
+ display: inline-flex;
1517
+ align-items: center;
1518
+ gap: var(--sp-2);
1519
+ padding: 0.2rem;
1520
+ border: 1px solid var(--border-soft);
1521
+ border-radius: 999px;
1522
+ background: var(--surface);
1523
+ }
1524
+ .exprTreeActionBtn {
1525
+ display: inline-flex;
1526
+ align-items: center;
1527
+ justify-content: center;
1528
+ height: 1.8rem;
1529
+ padding: 0 var(--sp-3);
1530
+ border-radius: 999px;
1531
+ border: 1px solid transparent;
1532
+ background: transparent;
1533
+ color: var(--muted);
1534
+ font-size: 0.74rem;
1535
+ font-weight: 700;
1536
+ letter-spacing: 0.01em;
1537
+ white-space: nowrap;
1538
+ transition:
1539
+ color var(--t-fast) var(--ease),
1540
+ background-color var(--t-fast) var(--ease),
1541
+ border-color var(--t-fast) var(--ease);
1542
+ }
1543
+ .exprTreeActionBtn:hover {
1544
+ color: var(--text);
1545
+ background: var(--surface-2);
1546
+ border-color: var(--border);
1547
+ }
1548
+ .exprTreeActionBtn:active {
1549
+ transform: translateY(1px);
1550
+ }
1551
+ .exprTreeHeaderZoom {
1552
+ display: inline-flex;
1553
+ align-items: center;
1554
+ gap: var(--sp-3);
1555
+ font-size: 0.9em;
1556
+ opacity: 0.9;
1557
+ white-space: nowrap;
1558
+ }
1559
+ .exprTreeHeaderZoom select {
1560
+ width: var(--zoom-select-w);
1561
+ min-width: var(--zoom-select-w);
1562
+ max-width: var(--zoom-select-w);
1563
+ height: var(--control-h);
1564
+ padding: 0 var(--sp-4);
1565
+ border-radius: var(--r-xs, 4px);
1566
+ background: var(--surface-solid);
1567
+ border: 1px solid var(--border);
1568
+ color: var(--text);
1569
+ font-weight: 600;
1570
+ }
1571
+ .exprTreeHeaderZoom select:focus {
1572
+ border-color: var(--brand);
1573
+ box-shadow: 0 0 0 2px var(--focus);
1574
+ outline: none;
1575
+ }
1576
+ .exprTreeHeaderZoom select:focus-visible {
1577
+ outline: none;
1578
+ }
1579
+ @media (max-width: 900px) {
1580
+ .app {
1581
+ padding: var(--sp-3);
1582
+ }
1583
+ .exprTreeHeaderQuickActions {
1584
+ display: none;
1585
+ }
1586
+ }
1587
+
1588
+ /* src/components/ts-editor-with-error-panel/ts-editor-with-error-panel.component.css */
1589
+ .tsEditorWithErrorPanel {
1590
+ height: 100%;
1591
+ min-height: 0;
1592
+ min-width: 0;
1593
+ }
1594
+ .tsEditorWithErrorPanel > .panels-container {
1595
+ height: 100%;
1596
+ }
1597
+ .tsEditorWithErrorPanel > .panels-container > .panel {
1598
+ margin: 0;
1599
+ border: none;
1600
+ box-shadow: none;
1601
+ background: transparent;
1602
+ }
1603
+ .tsEditorWithErrorPanel > .panels-container > .panel > .panel-stack > .panel {
1604
+ margin: 0;
1605
+ border: 1px solid var(--panel-border-color);
1606
+ box-shadow: none;
1607
+ border-radius: 0;
1608
+ background: var(--panel-surface);
1609
+ }
1610
+ .tsEditorHost {
1611
+ position: relative;
1612
+ height: 100%;
1613
+ min-height: 0;
1614
+ overflow: hidden;
1615
+ }
1616
+ .tsEditorLoadingOverlay {
1617
+ position: absolute;
1618
+ inset: 0;
1619
+ display: flex;
1620
+ align-items: center;
1621
+ justify-content: center;
1622
+ gap: var(--sp-3);
1623
+ background: color-mix(in srgb, var(--surface-solid) 75%, transparent);
1624
+ color: var(--text);
1625
+ font-size: 0.95rem;
1626
+ font-weight: 600;
1627
+ pointer-events: none;
1628
+ }
1629
+ .tsEditorLoadingSpinner {
1630
+ width: 18px;
1631
+ height: 18px;
1632
+ border: 2px solid color-mix(in srgb, var(--border) 75%, transparent);
1633
+ border-top-color: var(--brand);
1634
+ border-radius: 50%;
1635
+ animation: tsEditorSpinner 0.8s linear infinite;
1636
+ }
1637
+ @keyframes tsEditorSpinner {
1638
+ to {
1639
+ transform: rotate(360deg);
1640
+ }
1641
+ }
1642
+
1643
+ /* src/components/tabs/tabs.component.css */
1644
+ .rsxTabs {
1645
+ min-width: 0;
1646
+ }
1647
+ .rsxTabsList {
1648
+ display: flex;
1649
+ flex-wrap: wrap;
1650
+ gap: 0.45rem;
1651
+ align-items: stretch;
1652
+ }
1653
+ .rsxTabsTrigger {
1654
+ border: 1px solid color-mix(in srgb, var(--border-soft, #d7dee8) 82%, transparent);
1655
+ background: color-mix(in srgb, var(--surface-solid, #ffffff) 82%, var(--surface-2, #f3f6fa));
1656
+ color: var(--text, #102030);
1657
+ border-radius: 12px;
1658
+ text-align: center;
1659
+ padding: 0.72rem 0.8rem;
1660
+ font-weight: 700;
1661
+ font-size: 0.98rem;
1662
+ cursor: pointer;
1663
+ transition:
1664
+ background var(--t-med, 160ms) var(--ease, ease),
1665
+ color var(--t-med, 160ms) var(--ease, ease),
1666
+ border-color var(--t-med, 160ms) var(--ease, ease),
1667
+ transform var(--t-fast, 100ms) var(--ease, ease);
1668
+ display: inline-flex;
1669
+ justify-content: center;
1670
+ align-items: center;
1671
+ }
1672
+ .rsxTabsTrigger:hover:not(:disabled) {
1673
+ background: color-mix(in srgb, var(--brand, #0b66ff) 10%, var(--surface-solid, #ffffff));
1674
+ border-color: color-mix(in srgb, var(--brand, #0b66ff) 26%, var(--border-soft, #d7dee8));
1675
+ }
1676
+ .rsxTabsTrigger:disabled {
1677
+ cursor: not-allowed;
1678
+ opacity: 0.6;
1679
+ }
1680
+ .rsxTabsTrigger.isActive,
1681
+ .rsxTabsTrigger[data-state=active] {
1682
+ background: color-mix(in srgb, var(--brand, #0b66ff) 84%, #ffffff);
1683
+ color: #fff;
1684
+ border-color: color-mix(in srgb, var(--brand, #0b66ff) 84%, #ffffff);
1685
+ box-shadow: 0 8px 18px color-mix(in srgb, var(--brand, #0b66ff) 22%, transparent);
1686
+ transform: translateY(-1px);
1687
+ }
1688
+ .rsxTabsTriggerLabel {
1689
+ font-size: 0.96rem;
1690
+ font-weight: 800;
1691
+ line-height: 1.1;
1692
+ }