@skygraph/styles 0.2.4 → 0.6.6

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 (68) hide show
  1. package/README.md +98 -98
  2. package/components/autocomplete.css +35 -35
  3. package/components/autofield.css +67 -67
  4. package/components/avatar.css +37 -37
  5. package/components/badge.css +102 -102
  6. package/components/breadcrumb.css +29 -29
  7. package/components/button.css +181 -181
  8. package/components/calendar.css +408 -408
  9. package/components/carousel.css +102 -102
  10. package/components/cascader.css +380 -380
  11. package/components/charts.css +408 -408
  12. package/components/checkbox.css +114 -114
  13. package/components/collapse.css +166 -166
  14. package/components/colorpicker.css +252 -252
  15. package/components/context-menu.css +95 -95
  16. package/components/descriptions.css +82 -82
  17. package/components/diagram.css +435 -435
  18. package/components/drawer.css +124 -124
  19. package/components/dropdown.css +110 -110
  20. package/components/empty.css +25 -25
  21. package/components/event-timeline.css +134 -134
  22. package/components/field.css +35 -35
  23. package/components/form.css +115 -115
  24. package/components/gantt.css +166 -166
  25. package/components/input-number.css +76 -76
  26. package/components/input-password.css +104 -104
  27. package/components/input.css +211 -211
  28. package/components/list.css +366 -366
  29. package/components/mentions.css +54 -54
  30. package/components/menu.css +326 -326
  31. package/components/modal.css +1 -0
  32. package/components/notification.css +128 -128
  33. package/components/pagination.css +162 -162
  34. package/components/popconfirm.css +95 -95
  35. package/components/progress.css +116 -116
  36. package/components/radio.css +95 -95
  37. package/components/rate.css +48 -48
  38. package/components/resource-calendar.css +224 -224
  39. package/components/result.css +45 -45
  40. package/components/schema-form-editor.css +433 -433
  41. package/components/search-input.css +112 -112
  42. package/components/segmented.css +76 -76
  43. package/components/select.css +181 -181
  44. package/components/skeleton.css +72 -72
  45. package/components/slider.css +51 -51
  46. package/components/spin.css +102 -102
  47. package/components/steps.css +194 -194
  48. package/components/switch.css +75 -75
  49. package/components/table.css +9 -1
  50. package/components/tabs.css +137 -137
  51. package/components/tag.css +61 -61
  52. package/components/textarea.css +22 -22
  53. package/components/timeline.css +169 -169
  54. package/components/timepicker.css +224 -224
  55. package/components/tooltip.css +91 -91
  56. package/components/transfer.css +140 -140
  57. package/components/tree.css +601 -601
  58. package/components/treeselect.css +221 -221
  59. package/components/upload.css +124 -124
  60. package/index.css +70 -70
  61. package/index.d.ts +9 -9
  62. package/package.json +1 -1
  63. package/print.css +88 -88
  64. package/reset.css +17 -17
  65. package/themes/dark.css +17 -17
  66. package/themes/default.css +14 -14
  67. package/tokens.css +310 -310
  68. package/transitions.css +158 -158
@@ -1,601 +1,601 @@
1
- /* === Tree === */
2
-
3
- .sg-tree {
4
- font-size: var(--sg-font-size);
5
- color: var(--sg-color-text);
6
- line-height: var(--sg-line-height);
7
- position: relative;
8
- outline: none;
9
- }
10
-
11
- .sg-tree:focus-visible {
12
- outline: 2px solid var(--sg-color-primary);
13
- outline-offset: -2px;
14
- border-radius: var(--sg-border-radius);
15
- }
16
-
17
- .sg-tree-empty {
18
- padding: var(--sg-padding-lg);
19
- text-align: center;
20
- color: var(--sg-color-text-tertiary);
21
- }
22
-
23
- /* ═══════════════════════════════════════════
24
- SEARCH BAR
25
- ═══════════════════════════════════════════ */
26
-
27
- .sg-tree-search {
28
- position: relative;
29
- margin-bottom: var(--sg-margin-sm);
30
- }
31
-
32
- .sg-tree-search-input {
33
- width: 100%;
34
- height: 32px;
35
- padding: 0 28px 0 var(--sg-padding-sm);
36
- border: 1px solid var(--sg-color-border);
37
- border-radius: var(--sg-border-radius);
38
- background: var(--sg-color-bg-container);
39
- color: var(--sg-color-text);
40
- font-size: var(--sg-font-size);
41
- outline: none;
42
- transition:
43
- border-color var(--sg-transition-duration) var(--sg-transition-timing),
44
- box-shadow var(--sg-transition-duration) var(--sg-transition-timing);
45
- box-sizing: border-box;
46
- }
47
-
48
- .sg-tree-search-input::placeholder {
49
- color: var(--sg-color-text-tertiary);
50
- }
51
-
52
- .sg-tree-search-input:focus {
53
- border-color: var(--sg-color-primary);
54
- box-shadow: 0 0 0 2px var(--sg-color-primary-bg);
55
- }
56
-
57
- .sg-tree-search-clear {
58
- position: absolute;
59
- right: 6px;
60
- top: 50%;
61
- transform: translateY(-50%);
62
- width: 20px;
63
- height: 20px;
64
- display: flex;
65
- align-items: center;
66
- justify-content: center;
67
- border: none;
68
- background: none;
69
- color: var(--sg-color-text-tertiary);
70
- cursor: pointer;
71
- font-size: 14px;
72
- border-radius: 50%;
73
- padding: 0;
74
- line-height: 1;
75
- transition:
76
- color var(--sg-transition-duration) var(--sg-transition-timing),
77
- background var(--sg-transition-duration) var(--sg-transition-timing);
78
- }
79
-
80
- .sg-tree-search-clear:hover {
81
- color: var(--sg-color-text);
82
- background: var(--sg-color-bg-hover);
83
- }
84
-
85
- /* ═══════════════════════════════════════════
86
- TOOLBAR
87
- ═══════════════════════════════════════════ */
88
-
89
- .sg-tree-toolbar {
90
- display: flex;
91
- align-items: center;
92
- justify-content: space-between;
93
- padding: var(--sg-padding-xs) 0;
94
- margin-bottom: var(--sg-margin-xs);
95
- border-bottom: 1px solid var(--sg-color-border);
96
- }
97
-
98
- .sg-tree-toolbar-actions {
99
- display: flex;
100
- align-items: center;
101
- gap: 2px;
102
- }
103
-
104
- .sg-tree-toolbar-btn {
105
- display: inline-flex;
106
- align-items: center;
107
- justify-content: center;
108
- width: 26px;
109
- height: 26px;
110
- border: none;
111
- background: none;
112
- color: var(--sg-color-text-secondary);
113
- cursor: pointer;
114
- border-radius: var(--sg-border-radius-sm);
115
- font-size: 14px;
116
- padding: 0;
117
- transition:
118
- color var(--sg-transition-duration) var(--sg-transition-timing),
119
- background var(--sg-transition-duration) var(--sg-transition-timing);
120
- }
121
-
122
- .sg-tree-toolbar-btn:hover {
123
- color: var(--sg-color-primary);
124
- background: var(--sg-color-bg-hover);
125
- }
126
-
127
- .sg-tree-toolbar-divider {
128
- width: 1px;
129
- height: 16px;
130
- background: var(--sg-color-border);
131
- margin: 0 4px;
132
- }
133
-
134
- .sg-tree-toolbar-extra {
135
- display: flex;
136
- align-items: center;
137
- }
138
-
139
- /* ═══════════════════════════════════════════
140
- NODE
141
- ═══════════════════════════════════════════ */
142
-
143
- .sg-tree-node {
144
- display: flex;
145
- align-items: center;
146
- padding: 2px 4px;
147
- cursor: default;
148
- transition: background-color var(--sg-transition-duration) var(--sg-transition-timing);
149
- border-radius: var(--sg-border-radius-sm);
150
- min-height: 28px;
151
- position: relative;
152
- user-select: none;
153
- }
154
-
155
- .sg-tree-node:hover {
156
- background: var(--sg-color-bg-hover);
157
- }
158
-
159
- .sg-tree-node-selected {
160
- background: var(--sg-color-primary-bg);
161
- }
162
-
163
- .sg-tree-node-selected:hover {
164
- background: var(--sg-color-primary-bg);
165
- }
166
-
167
- .sg-tree-node-disabled {
168
- color: var(--sg-color-text-disabled);
169
- cursor: not-allowed;
170
- }
171
-
172
- .sg-tree-node-disabled:hover {
173
- background: transparent;
174
- }
175
-
176
- .sg-tree-disabled .sg-tree-node {
177
- color: var(--sg-color-text-disabled);
178
- cursor: not-allowed;
179
- }
180
-
181
- .sg-tree-disabled .sg-tree-node:hover {
182
- background: transparent;
183
- }
184
-
185
- /* Focused node */
186
-
187
- .sg-tree-node-focused {
188
- outline: 2px solid var(--sg-color-primary);
189
- outline-offset: -2px;
190
- z-index: 1;
191
- }
192
-
193
- .sg-tree-node-focused.sg-tree-node-selected {
194
- outline-color: var(--sg-color-primary);
195
- }
196
-
197
- /* Dragging state */
198
-
199
- .sg-tree-node-dragging {
200
- opacity: 0.4;
201
- }
202
-
203
- /* Block node */
204
-
205
- .sg-tree-block-node .sg-tree-node {
206
- display: flex;
207
- }
208
-
209
- .sg-tree-block-node .sg-tree-title {
210
- flex: 1;
211
- }
212
-
213
- /* ═══════════════════════════════════════════
214
- SWITCHER
215
- ═══════════════════════════════════════════ */
216
-
217
- .sg-tree-switcher {
218
- display: inline-flex;
219
- align-items: center;
220
- justify-content: center;
221
- width: 24px;
222
- height: 24px;
223
- flex-shrink: 0;
224
- cursor: pointer;
225
- user-select: none;
226
- color: var(--sg-color-text-secondary);
227
- font-size: 12px;
228
- }
229
-
230
- .sg-tree-switcher-arrow {
231
- transition: transform 0.2s ease;
232
- }
233
-
234
- .sg-tree-switcher-arrow-open {
235
- transform: rotate(90deg);
236
- }
237
-
238
- .sg-tree-switcher-open {
239
- /* reserved */
240
- }
241
-
242
- .sg-tree-switcher-close {
243
- /* reserved */
244
- }
245
-
246
- .sg-tree-switcher-noop {
247
- cursor: default;
248
- width: 24px;
249
- }
250
-
251
- .sg-tree-switcher-leaf {
252
- cursor: default;
253
- color: var(--sg-color-text-tertiary);
254
- font-size: 10px;
255
- }
256
-
257
- .sg-tree-switcher-leaf-icon {
258
- cursor: default;
259
- }
260
-
261
- .sg-tree-switcher-loading {
262
- cursor: default;
263
- }
264
-
265
- .sg-tree-switcher:hover:not(.sg-tree-switcher-noop):not(.sg-tree-switcher-leaf):not(
266
- .sg-tree-switcher-loading
267
- ) {
268
- color: var(--sg-color-primary);
269
- }
270
-
271
- /* ═══════════════════════════════════════════
272
- CHECKBOX IN TREE
273
- ═══════════════════════════════════════════ */
274
-
275
- .sg-tree-node .sg-checkbox {
276
- margin-right: var(--sg-margin-xs);
277
- flex-shrink: 0;
278
- }
279
-
280
- /* ═══════════════════════════════════════════
281
- ICON
282
- ═══════════════════════════════════════════ */
283
-
284
- .sg-tree-icon {
285
- display: inline-flex;
286
- align-items: center;
287
- justify-content: center;
288
- width: 20px;
289
- height: 20px;
290
- margin-right: var(--sg-margin-xs);
291
- flex-shrink: 0;
292
- font-size: var(--sg-font-size);
293
- }
294
-
295
- /* ═══════════════════════════════════════════
296
- TITLE
297
- ═══════════════════════════════════════════ */
298
-
299
- .sg-tree-title {
300
- display: inline-flex;
301
- align-items: center;
302
- padding: 0 var(--sg-padding-xs);
303
- border-radius: var(--sg-border-radius-sm);
304
- white-space: nowrap;
305
- overflow: hidden;
306
- text-overflow: ellipsis;
307
- min-height: 22px;
308
- }
309
-
310
- .sg-tree-title-selectable {
311
- cursor: pointer;
312
- }
313
-
314
- .sg-tree-title-selectable:hover {
315
- color: var(--sg-color-primary);
316
- }
317
-
318
- .sg-tree-node-selected .sg-tree-title {
319
- color: var(--sg-color-primary);
320
- font-weight: 500;
321
- }
322
-
323
- /* ═══════════════════════════════════════════
324
- SEARCH HIGHLIGHT
325
- ═══════════════════════════════════════════ */
326
-
327
- .sg-tree-highlight {
328
- color: var(--sg-color-error);
329
- font-weight: 600;
330
- background: var(--sg-color-warning-bg, rgba(255, 200, 0, 0.15));
331
- border-radius: 2px;
332
- padding: 0 1px;
333
- }
334
-
335
- /* ═══════════════════════════════════════════
336
- INLINE EDIT
337
- ═══════════════════════════════════════════ */
338
-
339
- .sg-tree-node-editing .sg-tree-title {
340
- padding: 0;
341
- }
342
-
343
- .sg-tree-edit-input {
344
- height: 22px;
345
- padding: 0 var(--sg-padding-xs);
346
- border: 1px solid var(--sg-color-primary);
347
- border-radius: var(--sg-border-radius-sm);
348
- background: var(--sg-color-bg-container);
349
- color: var(--sg-color-text);
350
- font-size: var(--sg-font-size);
351
- font-family: inherit;
352
- outline: none;
353
- box-shadow: 0 0 0 2px var(--sg-color-primary-bg);
354
- min-width: 80px;
355
- box-sizing: border-box;
356
- }
357
-
358
- /* ═══════════════════════════════════════════
359
- NODE ACTIONS (hover buttons)
360
- ═══════════════════════════════════════════ */
361
-
362
- .sg-tree-actions {
363
- display: none;
364
- align-items: center;
365
- gap: 2px;
366
- margin-left: auto;
367
- padding-left: var(--sg-padding-xs);
368
- flex-shrink: 0;
369
- }
370
-
371
- .sg-tree-node:hover .sg-tree-actions,
372
- .sg-tree-node-focused .sg-tree-actions {
373
- display: flex;
374
- }
375
-
376
- .sg-tree-action-btn {
377
- display: inline-flex;
378
- align-items: center;
379
- justify-content: center;
380
- width: 22px;
381
- height: 22px;
382
- border: none;
383
- background: none;
384
- color: var(--sg-color-text-secondary);
385
- cursor: pointer;
386
- border-radius: var(--sg-border-radius-sm);
387
- font-size: 12px;
388
- padding: 0;
389
- transition:
390
- color var(--sg-transition-duration) var(--sg-transition-timing),
391
- background var(--sg-transition-duration) var(--sg-transition-timing);
392
- }
393
-
394
- .sg-tree-action-btn:hover {
395
- color: var(--sg-color-primary);
396
- background: var(--sg-color-bg-hover);
397
- }
398
-
399
- .sg-tree-action-danger:hover {
400
- color: var(--sg-color-error);
401
- }
402
-
403
- /*
404
- * Специфичность выше, чем у `.sg-tree-action-btn:hover`, чтобы победить :hover-состояние
405
- * в disabled-ветке без `!important`.
406
- */
407
- .sg-tree-action-btn.sg-tree-action-disabled,
408
- .sg-tree-action-btn.sg-tree-action-disabled:hover {
409
- color: var(--sg-color-text-disabled);
410
- cursor: not-allowed;
411
- background: none;
412
- }
413
-
414
- /* ═══════════════════════════════════════════
415
- STATUS INDICATORS
416
- ═══════════════════════════════════════════ */
417
-
418
- .sg-tree-status {
419
- display: inline-block;
420
- width: 6px;
421
- height: 6px;
422
- border-radius: 50%;
423
- margin-right: 6px;
424
- flex-shrink: 0;
425
- }
426
-
427
- .sg-tree-status-success {
428
- background: var(--sg-color-success);
429
- }
430
- .sg-tree-status-warning {
431
- background: var(--sg-color-warning);
432
- }
433
- .sg-tree-status-error {
434
- background: var(--sg-color-error);
435
- }
436
- .sg-tree-status-info {
437
- background: var(--sg-color-primary);
438
- }
439
-
440
- .sg-tree-node-status-success {
441
- border-left: 2px solid var(--sg-color-success);
442
- }
443
- .sg-tree-node-status-warning {
444
- border-left: 2px solid var(--sg-color-warning);
445
- }
446
- .sg-tree-node-status-error {
447
- border-left: 2px solid var(--sg-color-error);
448
- }
449
- .sg-tree-node-status-info {
450
- border-left: 2px solid var(--sg-color-primary);
451
- }
452
-
453
- /* ═══════════════════════════════════════════
454
- CONNECTING LINES (tree guide lines)
455
- ═══════════════════════════════════════════ */
456
-
457
- .sg-tree-show-line .sg-tree-node {
458
- position: relative;
459
- }
460
-
461
- .sg-tree-indent-line {
462
- position: absolute;
463
- top: 0;
464
- bottom: 0;
465
- width: 1px;
466
- background: var(--sg-color-border);
467
- }
468
-
469
- .sg-tree-indent-line-hidden {
470
- display: none;
471
- }
472
-
473
- .sg-tree-indent-branch {
474
- position: absolute;
475
- top: 0;
476
- width: 12px;
477
- height: 50%;
478
- border-left: 1px solid var(--sg-color-border);
479
- border-bottom: 1px solid var(--sg-color-border);
480
- border-bottom-left-radius: 4px;
481
- }
482
-
483
- .sg-tree-indent-branch-last {
484
- /* same styles, parent line will be hidden via indent-line-hidden */
485
- }
486
-
487
- /* ═══════════════════════════════════════════
488
- DIRECTORY MODE
489
- ═══════════════════════════════════════════ */
490
-
491
- .sg-tree-directory .sg-tree-node {
492
- padding: 2px 8px;
493
- }
494
-
495
- .sg-tree-directory .sg-tree-node-selected {
496
- background: var(--sg-color-primary);
497
- }
498
-
499
- .sg-tree-directory .sg-tree-node-selected .sg-tree-title,
500
- .sg-tree-directory .sg-tree-node-selected .sg-tree-icon {
501
- color: var(--sg-color-white);
502
- }
503
-
504
- .sg-tree-directory .sg-tree-node-selected .sg-tree-switcher {
505
- color: var(--sg-color-white);
506
- }
507
-
508
- .sg-tree-directory .sg-tree-node-selected .sg-tree-status {
509
- box-shadow: 0 0 0 1px var(--sg-color-white);
510
- }
511
-
512
- .sg-tree-directory .sg-tree-node-selected .sg-tree-actions .sg-tree-action-btn {
513
- color: rgba(255, 255, 255, 0.7);
514
- }
515
-
516
- .sg-tree-directory .sg-tree-node-selected .sg-tree-actions .sg-tree-action-btn:hover {
517
- color: var(--sg-color-white);
518
- background: rgba(255, 255, 255, 0.15);
519
- }
520
-
521
- /* ═══════════════════════════════════════════
522
- DRAG & DROP
523
- ═══════════════════════════════════════════ */
524
-
525
- .sg-tree-node-draggable {
526
- cursor: grab;
527
- }
528
-
529
- .sg-tree-node-draggable:active {
530
- cursor: grabbing;
531
- }
532
-
533
- .sg-tree-node-drop-inner {
534
- background: var(--sg-color-primary-bg);
535
- outline: 1px dashed var(--sg-color-primary);
536
- outline-offset: -1px;
537
- }
538
-
539
- /* Drop indicators use an inset box-shadow rather than a real border so the
540
- * node box size never changes mid-drag. A 2px border re-flowed the row on
541
- * every `dragover`, which shifted the hit-box and made the indicator (and
542
- * the whole tree) flicker/jitter. box-shadow paints without affecting
543
- * layout — same 2px line, no reflow. */
544
- .sg-tree-node-drop-before {
545
- box-shadow: inset 0 2px 0 var(--sg-color-primary);
546
- }
547
-
548
- .sg-tree-node-drop-after {
549
- box-shadow: inset 0 -2px 0 var(--sg-color-primary);
550
- }
551
-
552
- /* ═══════════════════════════════════════════
553
- ANIMATION
554
- ═══════════════════════════════════════════ */
555
-
556
- .sg-tree-animated .sg-tree-node {
557
- animation: sg-tree-node-in 0.2s ease-out;
558
- }
559
-
560
- @keyframes sg-tree-node-in {
561
- from {
562
- opacity: 0;
563
- transform: translateY(-4px);
564
- }
565
- to {
566
- opacity: 1;
567
- transform: translateY(0);
568
- }
569
- }
570
-
571
- /* ═══════════════════════════════════════════
572
- VIRTUAL SCROLL
573
- ═══════════════════════════════════════════ */
574
-
575
- .sg-tree-virtual-container {
576
- will-change: transform;
577
- outline: none;
578
- }
579
-
580
- .sg-tree-virtual-container:focus-visible {
581
- outline: 2px solid var(--sg-color-primary);
582
- outline-offset: -2px;
583
- border-radius: var(--sg-border-radius);
584
- }
585
-
586
- .sg-tree-virtual-container::-webkit-scrollbar {
587
- width: 6px;
588
- }
589
-
590
- .sg-tree-virtual-container::-webkit-scrollbar-thumb {
591
- background: var(--sg-color-border);
592
- border-radius: 3px;
593
- }
594
-
595
- .sg-tree-virtual-container::-webkit-scrollbar-thumb:hover {
596
- background: var(--sg-color-text-tertiary);
597
- }
598
-
599
- .sg-tree-virtual-container::-webkit-scrollbar-track {
600
- background: transparent;
601
- }
1
+ /* === Tree === */
2
+
3
+ .sg-tree {
4
+ font-size: var(--sg-font-size);
5
+ color: var(--sg-color-text);
6
+ line-height: var(--sg-line-height);
7
+ position: relative;
8
+ outline: none;
9
+ }
10
+
11
+ .sg-tree:focus-visible {
12
+ outline: 2px solid var(--sg-color-primary);
13
+ outline-offset: -2px;
14
+ border-radius: var(--sg-border-radius);
15
+ }
16
+
17
+ .sg-tree-empty {
18
+ padding: var(--sg-padding-lg);
19
+ text-align: center;
20
+ color: var(--sg-color-text-tertiary);
21
+ }
22
+
23
+ /* ═══════════════════════════════════════════
24
+ SEARCH BAR
25
+ ═══════════════════════════════════════════ */
26
+
27
+ .sg-tree-search {
28
+ position: relative;
29
+ margin-bottom: var(--sg-margin-sm);
30
+ }
31
+
32
+ .sg-tree-search-input {
33
+ width: 100%;
34
+ height: 32px;
35
+ padding: 0 28px 0 var(--sg-padding-sm);
36
+ border: 1px solid var(--sg-color-border);
37
+ border-radius: var(--sg-border-radius);
38
+ background: var(--sg-color-bg-container);
39
+ color: var(--sg-color-text);
40
+ font-size: var(--sg-font-size);
41
+ outline: none;
42
+ transition:
43
+ border-color var(--sg-transition-duration) var(--sg-transition-timing),
44
+ box-shadow var(--sg-transition-duration) var(--sg-transition-timing);
45
+ box-sizing: border-box;
46
+ }
47
+
48
+ .sg-tree-search-input::placeholder {
49
+ color: var(--sg-color-text-tertiary);
50
+ }
51
+
52
+ .sg-tree-search-input:focus {
53
+ border-color: var(--sg-color-primary);
54
+ box-shadow: 0 0 0 2px var(--sg-color-primary-bg);
55
+ }
56
+
57
+ .sg-tree-search-clear {
58
+ position: absolute;
59
+ right: 6px;
60
+ top: 50%;
61
+ transform: translateY(-50%);
62
+ width: 20px;
63
+ height: 20px;
64
+ display: flex;
65
+ align-items: center;
66
+ justify-content: center;
67
+ border: none;
68
+ background: none;
69
+ color: var(--sg-color-text-tertiary);
70
+ cursor: pointer;
71
+ font-size: 14px;
72
+ border-radius: 50%;
73
+ padding: 0;
74
+ line-height: 1;
75
+ transition:
76
+ color var(--sg-transition-duration) var(--sg-transition-timing),
77
+ background var(--sg-transition-duration) var(--sg-transition-timing);
78
+ }
79
+
80
+ .sg-tree-search-clear:hover {
81
+ color: var(--sg-color-text);
82
+ background: var(--sg-color-bg-hover);
83
+ }
84
+
85
+ /* ═══════════════════════════════════════════
86
+ TOOLBAR
87
+ ═══════════════════════════════════════════ */
88
+
89
+ .sg-tree-toolbar {
90
+ display: flex;
91
+ align-items: center;
92
+ justify-content: space-between;
93
+ padding: var(--sg-padding-xs) 0;
94
+ margin-bottom: var(--sg-margin-xs);
95
+ border-bottom: 1px solid var(--sg-color-border);
96
+ }
97
+
98
+ .sg-tree-toolbar-actions {
99
+ display: flex;
100
+ align-items: center;
101
+ gap: 2px;
102
+ }
103
+
104
+ .sg-tree-toolbar-btn {
105
+ display: inline-flex;
106
+ align-items: center;
107
+ justify-content: center;
108
+ width: 26px;
109
+ height: 26px;
110
+ border: none;
111
+ background: none;
112
+ color: var(--sg-color-text-secondary);
113
+ cursor: pointer;
114
+ border-radius: var(--sg-border-radius-sm);
115
+ font-size: 14px;
116
+ padding: 0;
117
+ transition:
118
+ color var(--sg-transition-duration) var(--sg-transition-timing),
119
+ background var(--sg-transition-duration) var(--sg-transition-timing);
120
+ }
121
+
122
+ .sg-tree-toolbar-btn:hover {
123
+ color: var(--sg-color-primary);
124
+ background: var(--sg-color-bg-hover);
125
+ }
126
+
127
+ .sg-tree-toolbar-divider {
128
+ width: 1px;
129
+ height: 16px;
130
+ background: var(--sg-color-border);
131
+ margin: 0 4px;
132
+ }
133
+
134
+ .sg-tree-toolbar-extra {
135
+ display: flex;
136
+ align-items: center;
137
+ }
138
+
139
+ /* ═══════════════════════════════════════════
140
+ NODE
141
+ ═══════════════════════════════════════════ */
142
+
143
+ .sg-tree-node {
144
+ display: flex;
145
+ align-items: center;
146
+ padding: 2px 4px;
147
+ cursor: default;
148
+ transition: background-color var(--sg-transition-duration) var(--sg-transition-timing);
149
+ border-radius: var(--sg-border-radius-sm);
150
+ min-height: 28px;
151
+ position: relative;
152
+ user-select: none;
153
+ }
154
+
155
+ .sg-tree-node:hover {
156
+ background: var(--sg-color-bg-hover);
157
+ }
158
+
159
+ .sg-tree-node-selected {
160
+ background: var(--sg-color-primary-bg);
161
+ }
162
+
163
+ .sg-tree-node-selected:hover {
164
+ background: var(--sg-color-primary-bg);
165
+ }
166
+
167
+ .sg-tree-node-disabled {
168
+ color: var(--sg-color-text-disabled);
169
+ cursor: not-allowed;
170
+ }
171
+
172
+ .sg-tree-node-disabled:hover {
173
+ background: transparent;
174
+ }
175
+
176
+ .sg-tree-disabled .sg-tree-node {
177
+ color: var(--sg-color-text-disabled);
178
+ cursor: not-allowed;
179
+ }
180
+
181
+ .sg-tree-disabled .sg-tree-node:hover {
182
+ background: transparent;
183
+ }
184
+
185
+ /* Focused node */
186
+
187
+ .sg-tree-node-focused {
188
+ outline: 2px solid var(--sg-color-primary);
189
+ outline-offset: -2px;
190
+ z-index: 1;
191
+ }
192
+
193
+ .sg-tree-node-focused.sg-tree-node-selected {
194
+ outline-color: var(--sg-color-primary);
195
+ }
196
+
197
+ /* Dragging state */
198
+
199
+ .sg-tree-node-dragging {
200
+ opacity: 0.4;
201
+ }
202
+
203
+ /* Block node */
204
+
205
+ .sg-tree-block-node .sg-tree-node {
206
+ display: flex;
207
+ }
208
+
209
+ .sg-tree-block-node .sg-tree-title {
210
+ flex: 1;
211
+ }
212
+
213
+ /* ═══════════════════════════════════════════
214
+ SWITCHER
215
+ ═══════════════════════════════════════════ */
216
+
217
+ .sg-tree-switcher {
218
+ display: inline-flex;
219
+ align-items: center;
220
+ justify-content: center;
221
+ width: 24px;
222
+ height: 24px;
223
+ flex-shrink: 0;
224
+ cursor: pointer;
225
+ user-select: none;
226
+ color: var(--sg-color-text-secondary);
227
+ font-size: 12px;
228
+ }
229
+
230
+ .sg-tree-switcher-arrow {
231
+ transition: transform 0.2s ease;
232
+ }
233
+
234
+ .sg-tree-switcher-arrow-open {
235
+ transform: rotate(90deg);
236
+ }
237
+
238
+ .sg-tree-switcher-open {
239
+ /* reserved */
240
+ }
241
+
242
+ .sg-tree-switcher-close {
243
+ /* reserved */
244
+ }
245
+
246
+ .sg-tree-switcher-noop {
247
+ cursor: default;
248
+ width: 24px;
249
+ }
250
+
251
+ .sg-tree-switcher-leaf {
252
+ cursor: default;
253
+ color: var(--sg-color-text-tertiary);
254
+ font-size: 10px;
255
+ }
256
+
257
+ .sg-tree-switcher-leaf-icon {
258
+ cursor: default;
259
+ }
260
+
261
+ .sg-tree-switcher-loading {
262
+ cursor: default;
263
+ }
264
+
265
+ .sg-tree-switcher:hover:not(.sg-tree-switcher-noop):not(.sg-tree-switcher-leaf):not(
266
+ .sg-tree-switcher-loading
267
+ ) {
268
+ color: var(--sg-color-primary);
269
+ }
270
+
271
+ /* ═══════════════════════════════════════════
272
+ CHECKBOX IN TREE
273
+ ═══════════════════════════════════════════ */
274
+
275
+ .sg-tree-node .sg-checkbox {
276
+ margin-right: var(--sg-margin-xs);
277
+ flex-shrink: 0;
278
+ }
279
+
280
+ /* ═══════════════════════════════════════════
281
+ ICON
282
+ ═══════════════════════════════════════════ */
283
+
284
+ .sg-tree-icon {
285
+ display: inline-flex;
286
+ align-items: center;
287
+ justify-content: center;
288
+ width: 20px;
289
+ height: 20px;
290
+ margin-right: var(--sg-margin-xs);
291
+ flex-shrink: 0;
292
+ font-size: var(--sg-font-size);
293
+ }
294
+
295
+ /* ═══════════════════════════════════════════
296
+ TITLE
297
+ ═══════════════════════════════════════════ */
298
+
299
+ .sg-tree-title {
300
+ display: inline-flex;
301
+ align-items: center;
302
+ padding: 0 var(--sg-padding-xs);
303
+ border-radius: var(--sg-border-radius-sm);
304
+ white-space: nowrap;
305
+ overflow: hidden;
306
+ text-overflow: ellipsis;
307
+ min-height: 22px;
308
+ }
309
+
310
+ .sg-tree-title-selectable {
311
+ cursor: pointer;
312
+ }
313
+
314
+ .sg-tree-title-selectable:hover {
315
+ color: var(--sg-color-primary);
316
+ }
317
+
318
+ .sg-tree-node-selected .sg-tree-title {
319
+ color: var(--sg-color-primary);
320
+ font-weight: 500;
321
+ }
322
+
323
+ /* ═══════════════════════════════════════════
324
+ SEARCH HIGHLIGHT
325
+ ═══════════════════════════════════════════ */
326
+
327
+ .sg-tree-highlight {
328
+ color: var(--sg-color-error);
329
+ font-weight: 600;
330
+ background: var(--sg-color-warning-bg, rgba(255, 200, 0, 0.15));
331
+ border-radius: 2px;
332
+ padding: 0 1px;
333
+ }
334
+
335
+ /* ═══════════════════════════════════════════
336
+ INLINE EDIT
337
+ ═══════════════════════════════════════════ */
338
+
339
+ .sg-tree-node-editing .sg-tree-title {
340
+ padding: 0;
341
+ }
342
+
343
+ .sg-tree-edit-input {
344
+ height: 22px;
345
+ padding: 0 var(--sg-padding-xs);
346
+ border: 1px solid var(--sg-color-primary);
347
+ border-radius: var(--sg-border-radius-sm);
348
+ background: var(--sg-color-bg-container);
349
+ color: var(--sg-color-text);
350
+ font-size: var(--sg-font-size);
351
+ font-family: inherit;
352
+ outline: none;
353
+ box-shadow: 0 0 0 2px var(--sg-color-primary-bg);
354
+ min-width: 80px;
355
+ box-sizing: border-box;
356
+ }
357
+
358
+ /* ═══════════════════════════════════════════
359
+ NODE ACTIONS (hover buttons)
360
+ ═══════════════════════════════════════════ */
361
+
362
+ .sg-tree-actions {
363
+ display: none;
364
+ align-items: center;
365
+ gap: 2px;
366
+ margin-left: auto;
367
+ padding-left: var(--sg-padding-xs);
368
+ flex-shrink: 0;
369
+ }
370
+
371
+ .sg-tree-node:hover .sg-tree-actions,
372
+ .sg-tree-node-focused .sg-tree-actions {
373
+ display: flex;
374
+ }
375
+
376
+ .sg-tree-action-btn {
377
+ display: inline-flex;
378
+ align-items: center;
379
+ justify-content: center;
380
+ width: 22px;
381
+ height: 22px;
382
+ border: none;
383
+ background: none;
384
+ color: var(--sg-color-text-secondary);
385
+ cursor: pointer;
386
+ border-radius: var(--sg-border-radius-sm);
387
+ font-size: 12px;
388
+ padding: 0;
389
+ transition:
390
+ color var(--sg-transition-duration) var(--sg-transition-timing),
391
+ background var(--sg-transition-duration) var(--sg-transition-timing);
392
+ }
393
+
394
+ .sg-tree-action-btn:hover {
395
+ color: var(--sg-color-primary);
396
+ background: var(--sg-color-bg-hover);
397
+ }
398
+
399
+ .sg-tree-action-danger:hover {
400
+ color: var(--sg-color-error);
401
+ }
402
+
403
+ /*
404
+ * Специфичность выше, чем у `.sg-tree-action-btn:hover`, чтобы победить :hover-состояние
405
+ * в disabled-ветке без `!important`.
406
+ */
407
+ .sg-tree-action-btn.sg-tree-action-disabled,
408
+ .sg-tree-action-btn.sg-tree-action-disabled:hover {
409
+ color: var(--sg-color-text-disabled);
410
+ cursor: not-allowed;
411
+ background: none;
412
+ }
413
+
414
+ /* ═══════════════════════════════════════════
415
+ STATUS INDICATORS
416
+ ═══════════════════════════════════════════ */
417
+
418
+ .sg-tree-status {
419
+ display: inline-block;
420
+ width: 6px;
421
+ height: 6px;
422
+ border-radius: 50%;
423
+ margin-right: 6px;
424
+ flex-shrink: 0;
425
+ }
426
+
427
+ .sg-tree-status-success {
428
+ background: var(--sg-color-success);
429
+ }
430
+ .sg-tree-status-warning {
431
+ background: var(--sg-color-warning);
432
+ }
433
+ .sg-tree-status-error {
434
+ background: var(--sg-color-error);
435
+ }
436
+ .sg-tree-status-info {
437
+ background: var(--sg-color-primary);
438
+ }
439
+
440
+ .sg-tree-node-status-success {
441
+ border-left: 2px solid var(--sg-color-success);
442
+ }
443
+ .sg-tree-node-status-warning {
444
+ border-left: 2px solid var(--sg-color-warning);
445
+ }
446
+ .sg-tree-node-status-error {
447
+ border-left: 2px solid var(--sg-color-error);
448
+ }
449
+ .sg-tree-node-status-info {
450
+ border-left: 2px solid var(--sg-color-primary);
451
+ }
452
+
453
+ /* ═══════════════════════════════════════════
454
+ CONNECTING LINES (tree guide lines)
455
+ ═══════════════════════════════════════════ */
456
+
457
+ .sg-tree-show-line .sg-tree-node {
458
+ position: relative;
459
+ }
460
+
461
+ .sg-tree-indent-line {
462
+ position: absolute;
463
+ top: 0;
464
+ bottom: 0;
465
+ width: 1px;
466
+ background: var(--sg-color-border);
467
+ }
468
+
469
+ .sg-tree-indent-line-hidden {
470
+ display: none;
471
+ }
472
+
473
+ .sg-tree-indent-branch {
474
+ position: absolute;
475
+ top: 0;
476
+ width: 12px;
477
+ height: 50%;
478
+ border-left: 1px solid var(--sg-color-border);
479
+ border-bottom: 1px solid var(--sg-color-border);
480
+ border-bottom-left-radius: 4px;
481
+ }
482
+
483
+ .sg-tree-indent-branch-last {
484
+ /* same styles, parent line will be hidden via indent-line-hidden */
485
+ }
486
+
487
+ /* ═══════════════════════════════════════════
488
+ DIRECTORY MODE
489
+ ═══════════════════════════════════════════ */
490
+
491
+ .sg-tree-directory .sg-tree-node {
492
+ padding: 2px 8px;
493
+ }
494
+
495
+ .sg-tree-directory .sg-tree-node-selected {
496
+ background: var(--sg-color-primary);
497
+ }
498
+
499
+ .sg-tree-directory .sg-tree-node-selected .sg-tree-title,
500
+ .sg-tree-directory .sg-tree-node-selected .sg-tree-icon {
501
+ color: var(--sg-color-white);
502
+ }
503
+
504
+ .sg-tree-directory .sg-tree-node-selected .sg-tree-switcher {
505
+ color: var(--sg-color-white);
506
+ }
507
+
508
+ .sg-tree-directory .sg-tree-node-selected .sg-tree-status {
509
+ box-shadow: 0 0 0 1px var(--sg-color-white);
510
+ }
511
+
512
+ .sg-tree-directory .sg-tree-node-selected .sg-tree-actions .sg-tree-action-btn {
513
+ color: rgba(255, 255, 255, 0.7);
514
+ }
515
+
516
+ .sg-tree-directory .sg-tree-node-selected .sg-tree-actions .sg-tree-action-btn:hover {
517
+ color: var(--sg-color-white);
518
+ background: rgba(255, 255, 255, 0.15);
519
+ }
520
+
521
+ /* ═══════════════════════════════════════════
522
+ DRAG & DROP
523
+ ═══════════════════════════════════════════ */
524
+
525
+ .sg-tree-node-draggable {
526
+ cursor: grab;
527
+ }
528
+
529
+ .sg-tree-node-draggable:active {
530
+ cursor: grabbing;
531
+ }
532
+
533
+ .sg-tree-node-drop-inner {
534
+ background: var(--sg-color-primary-bg);
535
+ outline: 1px dashed var(--sg-color-primary);
536
+ outline-offset: -1px;
537
+ }
538
+
539
+ /* Drop indicators use an inset box-shadow rather than a real border so the
540
+ * node box size never changes mid-drag. A 2px border re-flowed the row on
541
+ * every `dragover`, which shifted the hit-box and made the indicator (and
542
+ * the whole tree) flicker/jitter. box-shadow paints without affecting
543
+ * layout — same 2px line, no reflow. */
544
+ .sg-tree-node-drop-before {
545
+ box-shadow: inset 0 2px 0 var(--sg-color-primary);
546
+ }
547
+
548
+ .sg-tree-node-drop-after {
549
+ box-shadow: inset 0 -2px 0 var(--sg-color-primary);
550
+ }
551
+
552
+ /* ═══════════════════════════════════════════
553
+ ANIMATION
554
+ ═══════════════════════════════════════════ */
555
+
556
+ .sg-tree-animated .sg-tree-node {
557
+ animation: sg-tree-node-in 0.2s ease-out;
558
+ }
559
+
560
+ @keyframes sg-tree-node-in {
561
+ from {
562
+ opacity: 0;
563
+ transform: translateY(-4px);
564
+ }
565
+ to {
566
+ opacity: 1;
567
+ transform: translateY(0);
568
+ }
569
+ }
570
+
571
+ /* ═══════════════════════════════════════════
572
+ VIRTUAL SCROLL
573
+ ═══════════════════════════════════════════ */
574
+
575
+ .sg-tree-virtual-container {
576
+ will-change: transform;
577
+ outline: none;
578
+ }
579
+
580
+ .sg-tree-virtual-container:focus-visible {
581
+ outline: 2px solid var(--sg-color-primary);
582
+ outline-offset: -2px;
583
+ border-radius: var(--sg-border-radius);
584
+ }
585
+
586
+ .sg-tree-virtual-container::-webkit-scrollbar {
587
+ width: 6px;
588
+ }
589
+
590
+ .sg-tree-virtual-container::-webkit-scrollbar-thumb {
591
+ background: var(--sg-color-border);
592
+ border-radius: 3px;
593
+ }
594
+
595
+ .sg-tree-virtual-container::-webkit-scrollbar-thumb:hover {
596
+ background: var(--sg-color-text-tertiary);
597
+ }
598
+
599
+ .sg-tree-virtual-container::-webkit-scrollbar-track {
600
+ background: transparent;
601
+ }