scitex 2.7.3__py3-none-any.whl → 2.8.1__py3-none-any.whl

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 (160) hide show
  1. scitex/__version__.py +1 -1
  2. scitex/dev/plt/__init__.py +0 -0
  3. scitex/dev/plt/plot_mpl_axhline.py +0 -0
  4. scitex/dev/plt/plot_mpl_axhspan.py +0 -0
  5. scitex/dev/plt/plot_mpl_axvline.py +0 -0
  6. scitex/dev/plt/plot_mpl_axvspan.py +0 -0
  7. scitex/dev/plt/plot_mpl_bar.py +0 -0
  8. scitex/dev/plt/plot_mpl_barh.py +0 -0
  9. scitex/dev/plt/plot_mpl_boxplot.py +0 -0
  10. scitex/dev/plt/plot_mpl_contour.py +0 -0
  11. scitex/dev/plt/plot_mpl_contourf.py +0 -0
  12. scitex/dev/plt/plot_mpl_errorbar.py +0 -0
  13. scitex/dev/plt/plot_mpl_eventplot.py +0 -0
  14. scitex/dev/plt/plot_mpl_fill.py +0 -0
  15. scitex/dev/plt/plot_mpl_fill_between.py +0 -0
  16. scitex/dev/plt/plot_mpl_hexbin.py +0 -0
  17. scitex/dev/plt/plot_mpl_hist.py +0 -0
  18. scitex/dev/plt/plot_mpl_hist2d.py +0 -0
  19. scitex/dev/plt/plot_mpl_imshow.py +0 -0
  20. scitex/dev/plt/plot_mpl_pcolormesh.py +0 -0
  21. scitex/dev/plt/plot_mpl_pie.py +0 -0
  22. scitex/dev/plt/plot_mpl_plot.py +0 -0
  23. scitex/dev/plt/plot_mpl_quiver.py +0 -0
  24. scitex/dev/plt/plot_mpl_scatter.py +0 -0
  25. scitex/dev/plt/plot_mpl_stackplot.py +0 -0
  26. scitex/dev/plt/plot_mpl_stem.py +0 -0
  27. scitex/dev/plt/plot_mpl_step.py +0 -0
  28. scitex/dev/plt/plot_mpl_violinplot.py +0 -0
  29. scitex/dev/plt/plot_sns_barplot.py +0 -0
  30. scitex/dev/plt/plot_sns_boxplot.py +0 -0
  31. scitex/dev/plt/plot_sns_heatmap.py +0 -0
  32. scitex/dev/plt/plot_sns_histplot.py +0 -0
  33. scitex/dev/plt/plot_sns_kdeplot.py +0 -0
  34. scitex/dev/plt/plot_sns_lineplot.py +0 -0
  35. scitex/dev/plt/plot_sns_scatterplot.py +0 -0
  36. scitex/dev/plt/plot_sns_stripplot.py +0 -0
  37. scitex/dev/plt/plot_sns_swarmplot.py +0 -0
  38. scitex/dev/plt/plot_sns_violinplot.py +0 -0
  39. scitex/dev/plt/plot_stx_bar.py +0 -0
  40. scitex/dev/plt/plot_stx_barh.py +0 -0
  41. scitex/dev/plt/plot_stx_box.py +0 -0
  42. scitex/dev/plt/plot_stx_boxplot.py +0 -0
  43. scitex/dev/plt/plot_stx_conf_mat.py +0 -0
  44. scitex/dev/plt/plot_stx_contour.py +0 -0
  45. scitex/dev/plt/plot_stx_ecdf.py +0 -0
  46. scitex/dev/plt/plot_stx_errorbar.py +0 -0
  47. scitex/dev/plt/plot_stx_fill_between.py +0 -0
  48. scitex/dev/plt/plot_stx_fillv.py +0 -0
  49. scitex/dev/plt/plot_stx_heatmap.py +0 -0
  50. scitex/dev/plt/plot_stx_image.py +0 -0
  51. scitex/dev/plt/plot_stx_imshow.py +0 -0
  52. scitex/dev/plt/plot_stx_joyplot.py +0 -0
  53. scitex/dev/plt/plot_stx_kde.py +0 -0
  54. scitex/dev/plt/plot_stx_line.py +0 -0
  55. scitex/dev/plt/plot_stx_mean_ci.py +0 -0
  56. scitex/dev/plt/plot_stx_mean_std.py +0 -0
  57. scitex/dev/plt/plot_stx_median_iqr.py +0 -0
  58. scitex/dev/plt/plot_stx_raster.py +0 -0
  59. scitex/dev/plt/plot_stx_rectangle.py +0 -0
  60. scitex/dev/plt/plot_stx_scatter.py +0 -0
  61. scitex/dev/plt/plot_stx_shaded_line.py +0 -0
  62. scitex/dev/plt/plot_stx_violin.py +0 -0
  63. scitex/dev/plt/plot_stx_violinplot.py +0 -0
  64. scitex/diagram/README.md +197 -0
  65. scitex/diagram/__init__.py +48 -0
  66. scitex/diagram/_compile.py +312 -0
  67. scitex/diagram/_diagram.py +355 -0
  68. scitex/diagram/_presets.py +173 -0
  69. scitex/diagram/_schema.py +182 -0
  70. scitex/diagram/_split.py +278 -0
  71. scitex/fig/editor/__init__.py +5 -2
  72. scitex/fig/editor/_dearpygui_editor.py +1 -1
  73. scitex/fig/editor/_mpl_editor.py +1 -1
  74. scitex/fig/editor/_qt_editor.py +1 -1
  75. scitex/fig/editor/_tkinter_editor.py +1 -1
  76. scitex/fig/editor/edit/__init__.py +50 -0
  77. scitex/fig/editor/edit/backend_detector.py +109 -0
  78. scitex/fig/editor/edit/bundle_resolver.py +240 -0
  79. scitex/fig/editor/edit/editor_launcher.py +239 -0
  80. scitex/fig/editor/edit/manual_handler.py +53 -0
  81. scitex/fig/editor/edit/panel_loader.py +232 -0
  82. scitex/fig/editor/edit/path_resolver.py +67 -0
  83. scitex/fig/editor/flask_editor/_bbox.py +23 -0
  84. scitex/fig/editor/flask_editor/_core.py +908 -103
  85. scitex/fig/editor/flask_editor/_renderer.py +74 -0
  86. scitex/fig/editor/flask_editor/static/css/base/reset.css +41 -0
  87. scitex/fig/editor/flask_editor/static/css/base/typography.css +16 -0
  88. scitex/fig/editor/flask_editor/static/css/base/variables.css +85 -0
  89. scitex/fig/editor/flask_editor/static/css/components/buttons.css +217 -0
  90. scitex/fig/editor/flask_editor/static/css/components/context-menu.css +93 -0
  91. scitex/fig/editor/flask_editor/static/css/components/dropdown.css +57 -0
  92. scitex/fig/editor/flask_editor/static/css/components/forms.css +112 -0
  93. scitex/fig/editor/flask_editor/static/css/components/modal.css +59 -0
  94. scitex/fig/editor/flask_editor/static/css/components/sections.css +212 -0
  95. scitex/fig/editor/flask_editor/static/css/features/canvas.css +176 -0
  96. scitex/fig/editor/flask_editor/static/css/features/element-inspector.css +190 -0
  97. scitex/fig/editor/flask_editor/static/css/features/loading.css +59 -0
  98. scitex/fig/editor/flask_editor/static/css/features/overlay.css +45 -0
  99. scitex/fig/editor/flask_editor/static/css/features/panel-grid.css +95 -0
  100. scitex/fig/editor/flask_editor/static/css/features/selection.css +101 -0
  101. scitex/fig/editor/flask_editor/static/css/features/statistics.css +138 -0
  102. scitex/fig/editor/flask_editor/static/css/index.css +31 -0
  103. scitex/fig/editor/flask_editor/static/css/layout/container.css +7 -0
  104. scitex/fig/editor/flask_editor/static/css/layout/controls.css +56 -0
  105. scitex/fig/editor/flask_editor/static/css/layout/preview.css +78 -0
  106. scitex/fig/editor/flask_editor/static/js/alignment/axis.js +314 -0
  107. scitex/fig/editor/flask_editor/static/js/alignment/basic.js +107 -0
  108. scitex/fig/editor/flask_editor/static/js/alignment/distribute.js +54 -0
  109. scitex/fig/editor/flask_editor/static/js/canvas/canvas.js +172 -0
  110. scitex/fig/editor/flask_editor/static/js/canvas/dragging.js +258 -0
  111. scitex/fig/editor/flask_editor/static/js/canvas/resize.js +48 -0
  112. scitex/fig/editor/flask_editor/static/js/canvas/selection.js +71 -0
  113. scitex/fig/editor/flask_editor/static/js/core/api.js +288 -0
  114. scitex/fig/editor/flask_editor/static/js/core/state.js +143 -0
  115. scitex/fig/editor/flask_editor/static/js/core/utils.js +245 -0
  116. scitex/fig/editor/flask_editor/static/js/dev/element-inspector.js +992 -0
  117. scitex/fig/editor/flask_editor/static/js/editor/bbox.js +339 -0
  118. scitex/fig/editor/flask_editor/static/js/editor/element-drag.js +286 -0
  119. scitex/fig/editor/flask_editor/static/js/editor/overlay.js +371 -0
  120. scitex/fig/editor/flask_editor/static/js/editor/preview.js +293 -0
  121. scitex/fig/editor/flask_editor/static/js/main.js +426 -0
  122. scitex/fig/editor/flask_editor/static/js/shortcuts/context-menu.js +152 -0
  123. scitex/fig/editor/flask_editor/static/js/shortcuts/keyboard.js +265 -0
  124. scitex/fig/editor/flask_editor/static/js/ui/controls.js +184 -0
  125. scitex/fig/editor/flask_editor/static/js/ui/download.js +57 -0
  126. scitex/fig/editor/flask_editor/static/js/ui/help.js +100 -0
  127. scitex/fig/editor/flask_editor/static/js/ui/theme.js +34 -0
  128. scitex/fig/editor/flask_editor/templates/__init__.py +95 -5
  129. scitex/fig/editor/flask_editor/templates/_html.py +27 -9
  130. scitex/fig/editor/flask_editor/templates/_scripts.py +1928 -131
  131. scitex/fig/editor/flask_editor/templates/_styles.py +363 -51
  132. scitex/fig/io/_bundle.py +97 -12
  133. scitex/io/__init__.py +12 -0
  134. scitex/io/_bundle.py +69 -10
  135. scitex/io/_zip_bundle.py +439 -0
  136. scitex/plt/_subplots/_AxisWrapperMixins/_AdjustmentMixin/__init__.py +0 -0
  137. scitex/plt/_subplots/_AxisWrapperMixins/_AdjustmentMixin/_labels.py +0 -0
  138. scitex/plt/_subplots/_AxisWrapperMixins/_AdjustmentMixin/_metadata.py +0 -0
  139. scitex/plt/_subplots/_AxisWrapperMixins/_AdjustmentMixin/_visual.py +0 -0
  140. scitex/plt/_subplots/_AxisWrapperMixins/_MatplotlibPlotMixin/__init__.py +0 -0
  141. scitex/plt/_subplots/_AxisWrapperMixins/_MatplotlibPlotMixin/_base.py +0 -0
  142. scitex/plt/_subplots/_AxisWrapperMixins/_MatplotlibPlotMixin/_scientific.py +0 -0
  143. scitex/plt/_subplots/_AxisWrapperMixins/_MatplotlibPlotMixin/_statistical.py +0 -0
  144. scitex/plt/_subplots/_AxisWrapperMixins/_MatplotlibPlotMixin/_stx_aliases.py +0 -0
  145. scitex/plt/_subplots/_AxisWrapperMixins/_RawMatplotlibMixin.py +0 -0
  146. scitex/plt/_subplots/_AxisWrapperMixins/_SeabornMixin/__init__.py +0 -0
  147. scitex/plt/_subplots/_AxisWrapperMixins/_SeabornMixin/_base.py +0 -0
  148. scitex/plt/_subplots/_AxisWrapperMixins/_SeabornMixin/_wrappers.py +0 -0
  149. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_bar.py +0 -0
  150. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_barh.py +0 -0
  151. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_errorbar.py +0 -0
  152. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_scatter.py +0 -0
  153. scitex/plt/io/_layered_bundle.py +0 -0
  154. scitex/schema/_plot.py +0 -0
  155. {scitex-2.7.3.dist-info → scitex-2.8.1.dist-info}/METADATA +1 -1
  156. {scitex-2.7.3.dist-info → scitex-2.8.1.dist-info}/RECORD +78 -22
  157. scitex/fig/editor/_edit.py +0 -751
  158. {scitex-2.7.3.dist-info → scitex-2.8.1.dist-info}/WHEEL +0 -0
  159. {scitex-2.7.3.dist-info → scitex-2.8.1.dist-info}/entry_points.txt +0 -0
  160. {scitex-2.7.3.dist-info → scitex-2.8.1.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,45 @@
1
+ /* =============================================================================
2
+ * Debug Overlays
3
+ * ============================================================================= */
4
+
5
+ /* Debug mode - show all hit areas */
6
+ .debug-rect {
7
+ fill: rgba(255, 0, 0, 0.15);
8
+ stroke: rgba(255, 0, 0, 0.6);
9
+ stroke-width: 1;
10
+ stroke-dasharray: 4 2;
11
+ pointer-events: none;
12
+ }
13
+
14
+ .debug-rect-trace {
15
+ fill: rgba(0, 255, 0, 0.15);
16
+ stroke: rgba(0, 200, 0, 0.8);
17
+ stroke-width: 1;
18
+ stroke-dasharray: 3 2;
19
+ pointer-events: none;
20
+ }
21
+
22
+ .debug-rect-legend {
23
+ fill: rgba(255, 165, 0, 0.2);
24
+ stroke: rgba(255, 140, 0, 0.8);
25
+ stroke-width: 1;
26
+ stroke-dasharray: 3 2;
27
+ pointer-events: none;
28
+ }
29
+
30
+ .debug-label {
31
+ font-size: 8px;
32
+ fill: rgba(255, 0, 0, 0.9);
33
+ pointer-events: none;
34
+ font-family: monospace;
35
+ }
36
+
37
+ .debug-path {
38
+ fill: none;
39
+ stroke: rgba(0, 200, 0, 0.7);
40
+ stroke-width: 2;
41
+ stroke-linecap: round;
42
+ stroke-linejoin: round;
43
+ stroke-dasharray: 5 3;
44
+ pointer-events: none;
45
+ }
@@ -0,0 +1,95 @@
1
+ /* =============================================================================
2
+ * Panel Grid View (for multi-panel figz bundles)
3
+ * ============================================================================= */
4
+ .panel-grid-section {
5
+ width: 100%;
6
+ margin-bottom: 20px;
7
+ background: var(--workspace-bg-elevated);
8
+ border-radius: 8px;
9
+ padding: 16px;
10
+ box-shadow: 0 2px 8px rgba(0,0,0,0.1);
11
+ }
12
+
13
+ .panel-grid-header {
14
+ display: flex;
15
+ justify-content: space-between;
16
+ align-items: center;
17
+ margin-bottom: 12px;
18
+ }
19
+
20
+ .panel-grid-header h3 {
21
+ font-size: 1em;
22
+ font-weight: 600;
23
+ color: var(--text-primary);
24
+ margin: 0;
25
+ }
26
+
27
+ .panel-grid {
28
+ display: grid;
29
+ grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
30
+ gap: 12px;
31
+ }
32
+
33
+ .panel-card {
34
+ background: var(--preview-bg);
35
+ background-size: 16px 16px;
36
+ background-position: 0 0, 0 8px, 8px -8px, -8px 0px;
37
+ border-radius: 6px;
38
+ overflow: hidden;
39
+ cursor: pointer;
40
+ transition: all 0.2s ease;
41
+ border: 2px solid transparent;
42
+ position: relative;
43
+ }
44
+
45
+ .panel-card:hover {
46
+ border-color: var(--color-cta);
47
+ transform: translateY(-2px);
48
+ box-shadow: 0 4px 12px rgba(0,0,0,0.15);
49
+ }
50
+
51
+ .panel-card.active {
52
+ border-color: var(--status-success);
53
+ box-shadow: 0 0 0 2px var(--status-success);
54
+ }
55
+
56
+ .panel-card img {
57
+ width: 100%;
58
+ height: auto;
59
+ display: block;
60
+ }
61
+
62
+ .panel-card-container {
63
+ position: relative;
64
+ display: inline-block;
65
+ width: 100%;
66
+ }
67
+
68
+ .panel-card-overlay {
69
+ position: absolute;
70
+ top: 0;
71
+ left: 0;
72
+ pointer-events: none;
73
+ z-index: 5;
74
+ }
75
+
76
+ .panel-card-label {
77
+ position: absolute;
78
+ top: 6px;
79
+ left: 6px;
80
+ background: rgba(0,0,0,0.7);
81
+ color: white;
82
+ padding: 3px 8px;
83
+ border-radius: 4px;
84
+ font-size: 0.75em;
85
+ font-weight: 600;
86
+ }
87
+
88
+ .panel-card-loading {
89
+ display: flex;
90
+ align-items: center;
91
+ justify-content: center;
92
+ min-height: 120px;
93
+ color: var(--text-muted);
94
+ font-size: 0.85em;
95
+ }
@@ -0,0 +1,101 @@
1
+ /* =============================================================================
2
+ * Selection & Hover States
3
+ * ============================================================================= */
4
+
5
+ /* Color-neutral hover/selection: white outline with glow works with any element color */
6
+ .hover-rect {
7
+ fill: none;
8
+ stroke: rgba(255, 255, 255, 0.9);
9
+ stroke-width: 2;
10
+ pointer-events: none;
11
+ filter: drop-shadow(0 0 3px rgba(0, 0, 0, 0.5)) drop-shadow(0 0 1px rgba(255, 255, 255, 0.8));
12
+ }
13
+
14
+ .selected-rect {
15
+ fill: none;
16
+ stroke: rgba(255, 255, 255, 1);
17
+ stroke-width: 2;
18
+ stroke-dasharray: 4 2;
19
+ pointer-events: none;
20
+ filter: drop-shadow(0 0 4px rgba(0, 0, 0, 0.7)) drop-shadow(0 0 2px rgba(255, 255, 255, 1));
21
+ }
22
+
23
+ .hover-label {
24
+ font-size: 10px;
25
+ fill: rgba(255, 255, 255, 0.9);
26
+ pointer-events: none;
27
+ filter: drop-shadow(0 0 2px rgba(0, 0, 0, 0.8));
28
+ }
29
+
30
+ .selected-label {
31
+ font-size: 10px;
32
+ fill: rgba(255, 255, 255, 1);
33
+ pointer-events: none;
34
+ filter: drop-shadow(0 0 3px rgba(0, 0, 0, 0.9));
35
+ }
36
+
37
+ .hover-path {
38
+ fill: none;
39
+ stroke: rgba(255, 255, 255, 0.9);
40
+ stroke-width: 6;
41
+ stroke-linecap: round;
42
+ stroke-linejoin: round;
43
+ pointer-events: none;
44
+ filter: drop-shadow(0 0 3px rgba(0, 0, 0, 0.6));
45
+ }
46
+
47
+ .selected-path {
48
+ fill: none;
49
+ stroke: rgba(255, 255, 255, 1);
50
+ stroke-width: 6;
51
+ stroke-linecap: round;
52
+ stroke-linejoin: round;
53
+ stroke-dasharray: 8 4;
54
+ pointer-events: none;
55
+ filter: drop-shadow(0 0 4px rgba(0, 0, 0, 0.7));
56
+ }
57
+
58
+ /* Hover scatter: White ring around points */
59
+ .hover-scatter {
60
+ fill: none;
61
+ stroke: rgba(255, 255, 255, 0.9);
62
+ stroke-width: 3;
63
+ pointer-events: none;
64
+ filter: drop-shadow(0 0 2px rgba(0, 0, 0, 0.6));
65
+ }
66
+
67
+ /* Selected scatter: Dashed white ring */
68
+ .selected-scatter {
69
+ fill: none;
70
+ stroke: rgba(255, 255, 255, 1);
71
+ stroke-width: 3;
72
+ stroke-dasharray: 3 2;
73
+ pointer-events: none;
74
+ filter: drop-shadow(0 0 3px rgba(0, 0, 0, 0.7));
75
+ }
76
+
77
+ /* Panel selection styling */
78
+ .panel-canvas-item.active {
79
+ outline: 3px solid var(--accent-primary, #4a90d9);
80
+ outline-offset: 2px;
81
+ z-index: 100;
82
+ }
83
+
84
+ /* Multi-selection (Ctrl+Click) - same as active but slightly different to distinguish */
85
+ .panel-canvas-item.selected {
86
+ outline: 3px solid var(--accent-primary, #4a90d9);
87
+ outline-offset: 2px;
88
+ z-index: 100;
89
+ }
90
+
91
+ /* Both active and selected */
92
+ .panel-canvas-item.active.selected {
93
+ outline: 3px solid var(--accent-primary, #4a90d9);
94
+ outline-offset: 2px;
95
+ z-index: 100;
96
+ }
97
+
98
+ .panel-canvas-item:hover:not(.active):not(.selected) {
99
+ outline: 2px dashed var(--accent-secondary, #6ab04c);
100
+ outline-offset: 2px;
101
+ }
@@ -0,0 +1,138 @@
1
+ /* =============================================================================
2
+ * Statistics Section
3
+ * ============================================================================= */
4
+ #stats-container {
5
+ font-family: 'JetBrains Mono', 'Fira Code', 'Monaco', monospace;
6
+ font-size: 11px;
7
+ line-height: 1.5;
8
+ }
9
+
10
+ .stats-loading {
11
+ color: var(--text-muted);
12
+ font-style: italic;
13
+ padding: 10px;
14
+ text-align: center;
15
+ }
16
+
17
+ .stats-empty {
18
+ color: var(--text-muted);
19
+ padding: 10px;
20
+ text-align: center;
21
+ background: var(--bg-muted);
22
+ border-radius: 4px;
23
+ }
24
+
25
+ .stats-card {
26
+ background: var(--bg-surface);
27
+ border: 1px solid var(--workspace-border-subtle);
28
+ border-radius: 6px;
29
+ padding: 12px;
30
+ margin-bottom: 10px;
31
+ }
32
+
33
+ .stats-card-header {
34
+ display: flex;
35
+ justify-content: space-between;
36
+ align-items: center;
37
+ margin-bottom: 8px;
38
+ padding-bottom: 8px;
39
+ border-bottom: 1px solid var(--workspace-border-subtle);
40
+ }
41
+
42
+ .stats-card-title {
43
+ font-weight: 600;
44
+ font-size: 12px;
45
+ color: var(--text-primary);
46
+ }
47
+
48
+ .stats-significance {
49
+ display: inline-block;
50
+ padding: 2px 8px;
51
+ border-radius: 4px;
52
+ font-weight: bold;
53
+ font-size: 11px;
54
+ }
55
+
56
+ .stats-significance.sig-high {
57
+ background: #dcfce7;
58
+ color: #166534;
59
+ }
60
+
61
+ .stats-significance.sig-medium {
62
+ background: #fef9c3;
63
+ color: #854d0e;
64
+ }
65
+
66
+ .stats-significance.sig-low {
67
+ background: #fee2e2;
68
+ color: #991b1b;
69
+ }
70
+
71
+ .stats-significance.sig-ns {
72
+ background: var(--bg-muted);
73
+ color: var(--text-muted);
74
+ }
75
+
76
+ .stats-row {
77
+ display: flex;
78
+ justify-content: space-between;
79
+ padding: 3px 0;
80
+ }
81
+
82
+ .stats-label {
83
+ color: var(--text-secondary);
84
+ }
85
+
86
+ .stats-value {
87
+ font-weight: 500;
88
+ color: var(--text-primary);
89
+ }
90
+
91
+ .stats-groups {
92
+ display: grid;
93
+ grid-template-columns: 1fr 1fr;
94
+ gap: 8px;
95
+ margin-top: 8px;
96
+ padding-top: 8px;
97
+ border-top: 1px dashed var(--workspace-border-subtle);
98
+ }
99
+
100
+ .stats-group {
101
+ background: var(--bg-muted);
102
+ padding: 8px;
103
+ border-radius: 4px;
104
+ font-size: 10px;
105
+ }
106
+
107
+ .stats-group-name {
108
+ font-weight: 600;
109
+ margin-bottom: 4px;
110
+ color: var(--text-primary);
111
+ }
112
+
113
+ .stats-correction-badge {
114
+ display: inline-block;
115
+ background: var(--color-cta);
116
+ color: white;
117
+ padding: 2px 6px;
118
+ border-radius: 3px;
119
+ font-size: 9px;
120
+ margin-left: 6px;
121
+ }
122
+
123
+ .stats-summary-header {
124
+ background: var(--scitex-01);
125
+ color: var(--text-inverse);
126
+ padding: 10px 12px;
127
+ border-radius: 6px 6px 0 0;
128
+ font-weight: 600;
129
+ margin-bottom: 0;
130
+ }
131
+
132
+ .stats-summary-body {
133
+ background: var(--bg-surface);
134
+ border: 1px solid var(--scitex-01);
135
+ border-top: none;
136
+ border-radius: 0 0 6px 6px;
137
+ padding: 12px;
138
+ }
@@ -0,0 +1,31 @@
1
+ /* =============================================================================
2
+ * SciTeX Flask Editor - Main CSS Index
3
+ * Modular CSS architecture with proper cascade order
4
+ * ============================================================================= */
5
+
6
+ /* Base styles (variables, reset, typography) */
7
+ @import url('base/variables.css');
8
+ @import url('base/reset.css');
9
+ @import url('base/typography.css');
10
+
11
+ /* Layout (container, preview, controls) */
12
+ @import url('layout/container.css');
13
+ @import url('layout/preview.css');
14
+ @import url('layout/controls.css');
15
+
16
+ /* Components (buttons, forms, sections, dropdowns, modals, context menus) */
17
+ @import url('components/buttons.css');
18
+ @import url('components/forms.css');
19
+ @import url('components/sections.css');
20
+ @import url('components/dropdown.css');
21
+ @import url('components/modal.css');
22
+ @import url('components/context-menu.css');
23
+
24
+ /* Features (canvas, panel-grid, selection, overlay, loading, statistics) */
25
+ @import url('features/canvas.css');
26
+ @import url('features/panel-grid.css');
27
+ @import url('features/selection.css');
28
+ @import url('features/overlay.css');
29
+ @import url('features/loading.css');
30
+ @import url('features/statistics.css');
31
+ @import url('features/element-inspector.css');
@@ -0,0 +1,7 @@
1
+ /* =============================================================================
2
+ * Main Container Layout
3
+ * ============================================================================= */
4
+ .container {
5
+ display: flex;
6
+ height: 100vh;
7
+ }
@@ -0,0 +1,56 @@
1
+ /* =============================================================================
2
+ * Controls Panel
3
+ * ============================================================================= */
4
+ .controls {
5
+ flex: 1;
6
+ min-width: 320px;
7
+ max-width: 420px;
8
+ background: var(--workspace-bg-elevated);
9
+ border-left: 1px solid var(--workspace-border-default);
10
+ overflow-y: auto;
11
+ display: flex;
12
+ flex-direction: column;
13
+ }
14
+
15
+ .controls-header {
16
+ padding: 12px 16px;
17
+ border-bottom: 1px solid var(--workspace-border-subtle);
18
+ display: flex;
19
+ justify-content: space-between;
20
+ align-items: center;
21
+ background: var(--bg-surface);
22
+ position: sticky;
23
+ top: 0;
24
+ z-index: 10;
25
+ }
26
+
27
+ .controls-header h1 {
28
+ font-size: 1.0em;
29
+ font-weight: 600;
30
+ color: var(--status-success);
31
+ }
32
+
33
+ .controls-body {
34
+ padding: 0 14px 14px;
35
+ flex: 1;
36
+ }
37
+
38
+ /* Theme toggle */
39
+ .theme-toggle {
40
+ background: transparent;
41
+ border: 1px solid var(--border-muted);
42
+ color: var(--text-secondary);
43
+ cursor: pointer;
44
+ font-size: 16px;
45
+ padding: 6px 10px;
46
+ border-radius: 6px;
47
+ transition: all 0.2s;
48
+ display: flex;
49
+ align-items: center;
50
+ gap: 6px;
51
+ }
52
+
53
+ .theme-toggle:hover {
54
+ background: var(--bg-muted);
55
+ border-color: var(--border-default);
56
+ }
@@ -0,0 +1,78 @@
1
+ /* =============================================================================
2
+ * Preview Panel
3
+ * ============================================================================= */
4
+ .preview {
5
+ flex: 2;
6
+ padding: 20px;
7
+ display: flex;
8
+ align-items: center;
9
+ justify-content: center;
10
+ background: var(--workspace-bg-secondary);
11
+ flex-direction: column;
12
+ align-items: stretch;
13
+ overflow-y: auto;
14
+ }
15
+
16
+ .preview-wrapper {
17
+ background: var(--preview-bg);
18
+ background-size: 20px 20px;
19
+ background-position: 0 0, 0 10px, 10px -10px, -10px 0px;
20
+ border-radius: 8px;
21
+ padding: 10px;
22
+ box-shadow: 0 4px 20px rgba(0,0,0,0.15);
23
+ flex-shrink: 0;
24
+ }
25
+
26
+ .preview img {
27
+ max-width: 100%;
28
+ max-height: calc(100vh - 80px);
29
+ display: block;
30
+ }
31
+
32
+ /* Hover overlay for interactive selection */
33
+ .preview-container {
34
+ position: relative;
35
+ display: inline-block;
36
+ }
37
+
38
+ .hover-overlay {
39
+ position: absolute;
40
+ top: 0;
41
+ left: 0;
42
+ pointer-events: none;
43
+ }
44
+
45
+ /* Preview area adjustments when panel header is visible */
46
+ .preview-wrapper:has(.preview-header:not([style*="display: none"])) {
47
+ border-radius: 0 0 8px 8px;
48
+ }
49
+
50
+ /* Panel Navigation Header */
51
+ .preview-header {
52
+ display: flex;
53
+ justify-content: space-between;
54
+ align-items: center;
55
+ padding: 8px 12px;
56
+ background: var(--workspace-bg-elevated);
57
+ border-radius: 8px 8px 0 0;
58
+ border-bottom: 1px solid var(--workspace-border-subtle);
59
+ }
60
+
61
+ #current-panel-name {
62
+ font-weight: 600;
63
+ color: var(--text-primary);
64
+ font-size: 0.9em;
65
+ }
66
+
67
+ .panel-nav {
68
+ display: flex;
69
+ align-items: center;
70
+ gap: 8px;
71
+ }
72
+
73
+ #panel-indicator {
74
+ font-size: 0.8em;
75
+ color: var(--text-muted);
76
+ min-width: 50px;
77
+ text-align: center;
78
+ }