flexdesk 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +195 -0
- package/THIRD_PARTY_LICENSES.md +53 -0
- package/css/base.css +3439 -0
- package/css/flexdesk.css +5797 -0
- package/css/overrides.css +2349 -0
- package/css/reset.css +46 -0
- package/css/tokens.css +137 -0
- package/dist/charts.js +780 -0
- package/dist/charts.js.map +7 -0
- package/dist/chunk-3PHCPZHT.js +222 -0
- package/dist/chunk-3PHCPZHT.js.map +7 -0
- package/dist/chunk-CT4YXXLP.js +1770 -0
- package/dist/chunk-CT4YXXLP.js.map +7 -0
- package/dist/chunk-DRYCDMEG.js +2217 -0
- package/dist/chunk-DRYCDMEG.js.map +7 -0
- package/dist/chunk-DVU44T77.js +855 -0
- package/dist/chunk-DVU44T77.js.map +7 -0
- package/dist/chunk-FL5KFNQH.js +640 -0
- package/dist/chunk-FL5KFNQH.js.map +7 -0
- package/dist/chunk-FOOS3T5L.js +117 -0
- package/dist/chunk-FOOS3T5L.js.map +7 -0
- package/dist/chunk-JYWURG5T.js +32 -0
- package/dist/chunk-JYWURG5T.js.map +7 -0
- package/dist/chunk-TLZUUFOE.js +276 -0
- package/dist/chunk-TLZUUFOE.js.map +7 -0
- package/dist/chunk-UCJ2WD4D.js +625 -0
- package/dist/chunk-UCJ2WD4D.js.map +7 -0
- package/dist/chunk-WVFGV5FT.js +205 -0
- package/dist/chunk-WVFGV5FT.js.map +7 -0
- package/dist/core.js +1098 -0
- package/dist/core.js.map +7 -0
- package/dist/editor.js +1661 -0
- package/dist/editor.js.map +7 -0
- package/dist/flexdesk.css +5797 -0
- package/dist/host.js +132 -0
- package/dist/host.js.map +7 -0
- package/dist/reset.css +46 -0
- package/dist/tile_registry-6WZPTUZV.js +28 -0
- package/dist/tile_registry-6WZPTUZV.js.map +7 -0
- package/dist/tiles.js +2068 -0
- package/dist/tiles.js.map +7 -0
- package/dist/tokens.css +137 -0
- package/dist/widgets.js +5438 -0
- package/dist/widgets.js.map +7 -0
- package/dist/wm.js +4830 -0
- package/dist/wm.js.map +7 -0
- package/package.json +80 -0
- package/src/charts/chart_types.js +699 -0
- package/src/charts/data_series_plot_window.js +761 -0
- package/src/charts/downsample.js +119 -0
- package/src/charts/plot_config.js +176 -0
- package/src/charts/plot_popout_window.js +1560 -0
- package/src/charts/plotly_wrapper.js +432 -0
- package/src/core/event_bus.js +230 -0
- package/src/core/logging.js +300 -0
- package/src/core/settings.js +813 -0
- package/src/core/state_guard.js +382 -0
- package/src/core/state_guard_config.js +309 -0
- package/src/core/state_machine.js +258 -0
- package/src/editor/editor_pane.js +264 -0
- package/src/editor/monaco_editor_factory.js +449 -0
- package/src/editor/monaco_loader.js +74 -0
- package/src/editor/notebook_search.js +460 -0
- package/src/editor/notebook_tab_bar.js +456 -0
- package/src/editor/notebook_undo_manager.js +108 -0
- package/src/editor/split_pane_container.js +197 -0
- package/src/help/help_modal.js +409 -0
- package/src/help/help_registry.js +65 -0
- package/src/host/host.js +69 -0
- package/src/host/pywebview_host.js +133 -0
- package/src/tiles/config_schema.js +256 -0
- package/src/tiles/layout_persistence.js +662 -0
- package/src/tiles/tile_base.js +785 -0
- package/src/tiles/tile_grid.js +905 -0
- package/src/tiles/tile_registry.js +136 -0
- package/src/tiling/command_palette.js +328 -0
- package/src/tiling/content_registry.js +110 -0
- package/src/tiling/desktops.js +133 -0
- package/src/tiling/entity_sources.js +179 -0
- package/src/tiling/keymap.js +156 -0
- package/src/tiling/kind_taxonomy.js +172 -0
- package/src/tiling/landing_table.js +717 -0
- package/src/tiling/loading_overlay.js +33 -0
- package/src/tiling/nav_panel.js +142 -0
- package/src/tiling/page_factory.js +215 -0
- package/src/tiling/panel_keys.js +145 -0
- package/src/tiling/shell.js +437 -0
- package/src/tiling/tile_breadcrumb.js +222 -0
- package/src/tiling/tile_renderer.js +459 -0
- package/src/tiling/tile_tab_menu.js +340 -0
- package/src/tiling/tile_tree.js +880 -0
- package/src/tiling/wm.js +1352 -0
- package/src/ui/base/component_base.js +30 -0
- package/src/ui/base/controller_base.js +48 -0
- package/src/ui/base/page_base.js +102 -0
- package/src/ui/components/about_dialog.js +224 -0
- package/src/ui/components/action_dropdown.js +389 -0
- package/src/ui/components/attribute_list_editor.js +652 -0
- package/src/ui/components/autocomplete_field.js +732 -0
- package/src/ui/components/computing_status_window.js +81 -0
- package/src/ui/components/confirm_dialog.js +307 -0
- package/src/ui/components/context_menu.js +87 -0
- package/src/ui/components/data_table.js +2228 -0
- package/src/ui/components/detail_header.js +177 -0
- package/src/ui/components/drag_reorder.js +0 -0
- package/src/ui/components/gallery_picker.js +147 -0
- package/src/ui/components/inline_renamer.js +129 -0
- package/src/ui/components/managed_window.js +804 -0
- package/src/ui/components/modal.js +512 -0
- package/src/ui/components/notification_history.js +264 -0
- package/src/ui/components/slide_out_panel.js +185 -0
- package/src/ui/components/slider_field.js +122 -0
- package/src/ui/components/sortable_list.js +309 -0
- package/src/ui/components/table_state_store.js +81 -0
- package/src/ui/components/toast.js +59 -0
- package/src/ui/components/tree_view.js +460 -0
- package/src/ui/components/window_taskbar.js +143 -0
- package/src/ui/controllers/panel_state_machine.js +634 -0
- package/src/ui/controllers/window_chrome_controller.js +659 -0
- package/src/ui/notification_center.js +576 -0
- package/src/ui/utils/overlay_scrollbar.js +492 -0
- package/src/ui/utils/raf_resize_observer.js +31 -0
- package/src/ui/utils/tooltip_service.js +406 -0
package/css/base.css
ADDED
|
@@ -0,0 +1,3439 @@
|
|
|
1
|
+
/* twm — the framework's default styling. Loads EARLY: an embedder is entitled to override any of it.
|
|
2
|
+
*
|
|
3
|
+
* GENERATED by scripts/css_extract.py — do not edit by hand.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
/* ── from main_new.css ───────────────────────── */
|
|
7
|
+
/* Status popup listing invalid items */
|
|
8
|
+
.twm-status-popup {
|
|
9
|
+
position: fixed;
|
|
10
|
+
left: 12px;
|
|
11
|
+
bottom: 44px; /* above the bottom bar */
|
|
12
|
+
width: 420px;
|
|
13
|
+
background: transparent;
|
|
14
|
+
color: #ddd;
|
|
15
|
+
z-index: var(--z-modal);
|
|
16
|
+
}
|
|
17
|
+
.twm-status-popup .twm-close-btn {
|
|
18
|
+
background: transparent;
|
|
19
|
+
color: #ccc;
|
|
20
|
+
border: none;
|
|
21
|
+
cursor: pointer;
|
|
22
|
+
font-size: var(--font-size-lg);
|
|
23
|
+
}
|
|
24
|
+
.twm-status-popup .twm-tab-group { background: rgba(255,255,255,0.02); border: 1px solid #2a2a2a; border-radius: var(--radius-lg); }
|
|
25
|
+
.twm-status-popup .twm-tab-group-header { display: flex; align-items: center; gap: var(--space-md); padding: var(--space-md) 10px; border-bottom: 1px solid #2a2a2a; }
|
|
26
|
+
.twm-status-popup .twm-tab-group-header .twm-tab-name { font-weight: 600; color: #d0d0d0; }
|
|
27
|
+
.twm-status-popup .twm-tab-group-header .twm-pill-count { margin-left: auto; background: var(--surface-2); border: 1px solid #444; color: #ddd; padding: 1px 6px; border-radius: var(--radius-pill); font-size: var(--font-size-xs); line-height: 16px; }
|
|
28
|
+
.twm-status-popup .twm-tab-group .twm-issue-list { list-style: none; padding: var(--space-xs) 6px; margin: 0; }
|
|
29
|
+
.twm-status-popup .twm-tab-group .twm-issue-list li { padding: var(--space-sm) 6px; border-radius: var(--radius-md); }
|
|
30
|
+
.twm-status-popup .twm-tab-group .twm-issue-list li:hover { background: rgba(255,255,255,0.06); }
|
|
31
|
+
/* Error-log style list */
|
|
32
|
+
.twm-status-popup .twm-issue-list { list-style: none; padding-left: 0; margin: 0; }
|
|
33
|
+
.twm-status-popup .twm-issue-list li { padding: var(--space-sm) 8px; border-radius: var(--radius-md); }
|
|
34
|
+
.twm-status-popup .twm-issue-list li:hover { background: rgba(255,255,255,0.06); }
|
|
35
|
+
.twm-status-popup .twm-status-row { display: grid; grid-template-columns: auto auto 1fr; align-items: center; gap: var(--space-md); }
|
|
36
|
+
/* Tab Close Confirmation Popover */
|
|
37
|
+
.twm-tab-close-popover {
|
|
38
|
+
position: fixed;
|
|
39
|
+
z-index: 5000;
|
|
40
|
+
background: var(--surface-2);
|
|
41
|
+
color: var(--text-primary);
|
|
42
|
+
border: 1px solid var(--surface-3);
|
|
43
|
+
border-radius: var(--radius-sm);
|
|
44
|
+
box-shadow: 0 4px 12px rgba(0,0,0,0.45);
|
|
45
|
+
padding: 10px 12px;
|
|
46
|
+
font-size: var(--font-size-sm);
|
|
47
|
+
pointer-events: auto;
|
|
48
|
+
--arrow-left: 16px;
|
|
49
|
+
width: 240px;
|
|
50
|
+
max-width: 240px;
|
|
51
|
+
overflow-wrap: anywhere;
|
|
52
|
+
}
|
|
53
|
+
/* Large Status Details Popover */
|
|
54
|
+
.twm-status-details-popover {
|
|
55
|
+
position: fixed;
|
|
56
|
+
z-index: 5000;
|
|
57
|
+
background: var(--surface-2);
|
|
58
|
+
color: var(--text-primary);
|
|
59
|
+
border: 1px solid var(--surface-3);
|
|
60
|
+
border-radius: var(--radius-sm);
|
|
61
|
+
box-shadow: 0 4px 12px rgba(0,0,0,0.45);
|
|
62
|
+
width: 520px;
|
|
63
|
+
max-width: min(90vw, 680px);
|
|
64
|
+
max-height: min(90vh, 680px);
|
|
65
|
+
padding: 10px 12px;
|
|
66
|
+
display: flex;
|
|
67
|
+
flex-direction: column;
|
|
68
|
+
}
|
|
69
|
+
.twm-status-details-popover .twm-details-header {
|
|
70
|
+
display: flex;
|
|
71
|
+
align-items: center;
|
|
72
|
+
justify-content: space-between;
|
|
73
|
+
font-weight: 600;
|
|
74
|
+
margin-bottom: var(--space-md);
|
|
75
|
+
}
|
|
76
|
+
.twm-status-details-popover .twm-details-header .twm-close-btn {
|
|
77
|
+
background: transparent;
|
|
78
|
+
color: #aaa;
|
|
79
|
+
border: none;
|
|
80
|
+
font-size: var(--font-size-lg);
|
|
81
|
+
cursor: pointer;
|
|
82
|
+
}
|
|
83
|
+
.twm-status-details-popover .twm-details-body {
|
|
84
|
+
overflow: auto;
|
|
85
|
+
padding: var(--space-xs) 2px 2px 2px;
|
|
86
|
+
}
|
|
87
|
+
.twm-status-details-popover .twm-tab-group {
|
|
88
|
+
margin-bottom: 10px;
|
|
89
|
+
}
|
|
90
|
+
.twm-status-details-popover .twm-tab-group-header {
|
|
91
|
+
display: flex;
|
|
92
|
+
align-items: center;
|
|
93
|
+
gap: var(--space-sm);
|
|
94
|
+
font-size: 12.5px;
|
|
95
|
+
color: #ddd;
|
|
96
|
+
margin-bottom: var(--space-xs);
|
|
97
|
+
}
|
|
98
|
+
.twm-status-details-popover .twm-tab-group-header .twm-pill-count {
|
|
99
|
+
background: #444;
|
|
100
|
+
color: #ddd;
|
|
101
|
+
border-radius: var(--radius-pill);
|
|
102
|
+
padding: 0 6px;
|
|
103
|
+
font-size: var(--font-size-xs);
|
|
104
|
+
margin-left: auto;
|
|
105
|
+
}
|
|
106
|
+
.twm-status-details-popover .twm-issue-list {
|
|
107
|
+
list-style: none;
|
|
108
|
+
margin: 0;
|
|
109
|
+
padding: 0;
|
|
110
|
+
}
|
|
111
|
+
.twm-status-details-popover .twm-issue-item {
|
|
112
|
+
padding: var(--space-sm) 4px;
|
|
113
|
+
border-radius: var(--radius-sm);
|
|
114
|
+
}
|
|
115
|
+
.twm-status-details-popover .twm-issue-item:hover {
|
|
116
|
+
background: rgba(255,255,255,0.06);
|
|
117
|
+
}
|
|
118
|
+
.twm-status-details-popover .twm-node-cell .twm-node-name {
|
|
119
|
+
font-weight: 500;
|
|
120
|
+
}
|
|
121
|
+
.twm-preview-table-wrap { border: 1px solid #2a2a2a; border-radius: var(--radius-sm); }
|
|
122
|
+
.twm-status-popup .twm-pill-count {
|
|
123
|
+
margin-left: var(--space-xs);
|
|
124
|
+
background: var(--surface-2);
|
|
125
|
+
border: 1px solid #444;
|
|
126
|
+
color: #ddd;
|
|
127
|
+
padding: 1px 6px;
|
|
128
|
+
border-radius: var(--radius-pill);
|
|
129
|
+
font-size: var(--font-size-xs);
|
|
130
|
+
line-height: 16px;
|
|
131
|
+
}
|
|
132
|
+
.twm-status-popup .twm-node-cell { display: inline-flex; align-items: center; gap: var(--space-sm); color: #cfcfcf; }
|
|
133
|
+
.twm-status-popup .twm-node-cell .twm-node-name { font-weight: 500; }
|
|
134
|
+
.twm-status-popup .twm-msg-cell { display: inline-flex; align-items: center; gap: var(--space-sm); color: #ddd; min-width: 0; }
|
|
135
|
+
/* Styled tooltip for has-tooltip elements - uses JS-driven positioning */
|
|
136
|
+
.twm-has-tooltip { position: relative; }
|
|
137
|
+
/* Hide CSS-based tooltip, use JS tooltip instead for proper stacking */
|
|
138
|
+
.twm-has-tooltip[data-tooltip]::after,
|
|
139
|
+
.twm-has-tooltip[data-tooltip]::before {
|
|
140
|
+
display: none;
|
|
141
|
+
}
|
|
142
|
+
/* LaTeX-rendered tooltip (JS-driven, positioned dynamically) */
|
|
143
|
+
.twm-latex-tooltip {
|
|
144
|
+
position: fixed;
|
|
145
|
+
z-index: var(--z-toast);
|
|
146
|
+
background: #2b2b2b;
|
|
147
|
+
color: var(--text-body);
|
|
148
|
+
border: 1px solid #454545;
|
|
149
|
+
border-radius: var(--radius-md);
|
|
150
|
+
padding: 10px 14px;
|
|
151
|
+
box-shadow: 0 4px 20px rgba(0,0,0,0.45), 0 0 1px rgba(255,255,255,0.1);
|
|
152
|
+
pointer-events: none;
|
|
153
|
+
opacity: 0;
|
|
154
|
+
transition: opacity 120ms ease-out;
|
|
155
|
+
max-width: 320px;
|
|
156
|
+
font-size: var(--font-size-sm);
|
|
157
|
+
line-height: 1.5;
|
|
158
|
+
}
|
|
159
|
+
/* Tooltip header (first line) styling */
|
|
160
|
+
.twm-latex-tooltip strong {
|
|
161
|
+
display: block;
|
|
162
|
+
color: var(--text-bright);
|
|
163
|
+
font-size: var(--font-size-md);
|
|
164
|
+
font-weight: 600;
|
|
165
|
+
margin-bottom: var(--space-xs);
|
|
166
|
+
font-family: 'SF Mono', 'Monaco', 'Consolas', monospace;
|
|
167
|
+
}
|
|
168
|
+
/* Arrow base (border color) */
|
|
169
|
+
.twm-latex-tooltip::before {
|
|
170
|
+
content: '';
|
|
171
|
+
position: absolute;
|
|
172
|
+
width: 0;
|
|
173
|
+
height: 0;
|
|
174
|
+
display: block;
|
|
175
|
+
}
|
|
176
|
+
/* Arrow fill (background color) */
|
|
177
|
+
.twm-latex-tooltip::after {
|
|
178
|
+
content: '';
|
|
179
|
+
position: absolute;
|
|
180
|
+
width: 0;
|
|
181
|
+
height: 0;
|
|
182
|
+
display: block;
|
|
183
|
+
}
|
|
184
|
+
/* Top placement - arrow uses --notch-offset for dynamic positioning */
|
|
185
|
+
.twm-latex-tooltip[data-placement="top"]::before {
|
|
186
|
+
bottom: -7px;
|
|
187
|
+
left: calc(50% + var(--notch-offset, 0px));
|
|
188
|
+
transform: translateX(-50%);
|
|
189
|
+
border-left: 7px solid transparent;
|
|
190
|
+
border-right: 7px solid transparent;
|
|
191
|
+
border-top: 7px solid #454545;
|
|
192
|
+
border-bottom: 0;
|
|
193
|
+
}
|
|
194
|
+
.twm-latex-tooltip[data-placement="top"]::after {
|
|
195
|
+
bottom: -5px;
|
|
196
|
+
left: calc(50% + var(--notch-offset, 0px));
|
|
197
|
+
transform: translateX(-50%);
|
|
198
|
+
border-left: 6px solid transparent;
|
|
199
|
+
border-right: 6px solid transparent;
|
|
200
|
+
border-top: 6px solid #2b2b2b;
|
|
201
|
+
border-bottom: 0;
|
|
202
|
+
}
|
|
203
|
+
/* Bottom placement - arrow uses --notch-offset for dynamic positioning */
|
|
204
|
+
.twm-latex-tooltip[data-placement="bottom"]::before {
|
|
205
|
+
top: -7px;
|
|
206
|
+
left: calc(50% + var(--notch-offset, 0px));
|
|
207
|
+
transform: translateX(-50%);
|
|
208
|
+
border-left: 7px solid transparent;
|
|
209
|
+
border-right: 7px solid transparent;
|
|
210
|
+
border-bottom: 7px solid #454545;
|
|
211
|
+
border-top: 0;
|
|
212
|
+
}
|
|
213
|
+
.twm-latex-tooltip[data-placement="bottom"]::after {
|
|
214
|
+
top: -5px;
|
|
215
|
+
left: calc(50% + var(--notch-offset, 0px));
|
|
216
|
+
transform: translateX(-50%);
|
|
217
|
+
border-left: 6px solid transparent;
|
|
218
|
+
border-right: 6px solid transparent;
|
|
219
|
+
border-bottom: 6px solid #2b2b2b;
|
|
220
|
+
border-top: 0;
|
|
221
|
+
}
|
|
222
|
+
/* Left placement - arrow uses --notch-offset for dynamic positioning */
|
|
223
|
+
.twm-latex-tooltip[data-placement="left"]::before {
|
|
224
|
+
top: calc(50% + var(--notch-offset, 0px));
|
|
225
|
+
right: -7px;
|
|
226
|
+
transform: translateY(-50%);
|
|
227
|
+
border-top: 7px solid transparent;
|
|
228
|
+
border-bottom: 7px solid transparent;
|
|
229
|
+
border-left: 7px solid #454545;
|
|
230
|
+
border-right: 0;
|
|
231
|
+
}
|
|
232
|
+
.twm-latex-tooltip[data-placement="left"]::after {
|
|
233
|
+
top: calc(50% + var(--notch-offset, 0px));
|
|
234
|
+
right: -5px;
|
|
235
|
+
transform: translateY(-50%);
|
|
236
|
+
border-top: 6px solid transparent;
|
|
237
|
+
border-bottom: 6px solid transparent;
|
|
238
|
+
border-left: 6px solid #2b2b2b;
|
|
239
|
+
border-right: 0;
|
|
240
|
+
}
|
|
241
|
+
/* Right placement - arrow uses --notch-offset for dynamic positioning */
|
|
242
|
+
.twm-latex-tooltip[data-placement="right"]::before {
|
|
243
|
+
top: calc(50% + var(--notch-offset, 0px));
|
|
244
|
+
left: -7px;
|
|
245
|
+
transform: translateY(-50%);
|
|
246
|
+
border-top: 7px solid transparent;
|
|
247
|
+
border-bottom: 7px solid transparent;
|
|
248
|
+
border-right: 7px solid #454545;
|
|
249
|
+
border-left: 0;
|
|
250
|
+
}
|
|
251
|
+
.twm-latex-tooltip[data-placement="right"]::after {
|
|
252
|
+
top: calc(50% + var(--notch-offset, 0px));
|
|
253
|
+
left: -5px;
|
|
254
|
+
transform: translateY(-50%);
|
|
255
|
+
border-top: 6px solid transparent;
|
|
256
|
+
border-bottom: 6px solid transparent;
|
|
257
|
+
border-right: 6px solid #2b2b2b;
|
|
258
|
+
border-left: 0;
|
|
259
|
+
}
|
|
260
|
+
/* Notification center (js_new) */
|
|
261
|
+
.twm-notification-center {
|
|
262
|
+
display: flex;
|
|
263
|
+
flex-direction: column;
|
|
264
|
+
gap: var(--space-lg);
|
|
265
|
+
pointer-events: none;
|
|
266
|
+
min-width: 300px;
|
|
267
|
+
width: 100%;
|
|
268
|
+
}
|
|
269
|
+
.twm-notification-center__list {
|
|
270
|
+
display: flex;
|
|
271
|
+
flex-direction: column;
|
|
272
|
+
gap: var(--space-lg);
|
|
273
|
+
}
|
|
274
|
+
.twm-notification__header {
|
|
275
|
+
display: flex;
|
|
276
|
+
align-items: center;
|
|
277
|
+
gap: var(--space-md);
|
|
278
|
+
margin-bottom: var(--space-sm);
|
|
279
|
+
}
|
|
280
|
+
.twm-notification__title {
|
|
281
|
+
font-weight: 600;
|
|
282
|
+
font-size: var(--font-size-md);
|
|
283
|
+
color: #f5f5f5;
|
|
284
|
+
}
|
|
285
|
+
.twm-notification__timestamp {
|
|
286
|
+
margin-left: auto;
|
|
287
|
+
font-size: var(--font-size-xs);
|
|
288
|
+
color: #8c8c8c;
|
|
289
|
+
}
|
|
290
|
+
.twm-notification__close {
|
|
291
|
+
width: 22px;
|
|
292
|
+
height: 22px;
|
|
293
|
+
border: none;
|
|
294
|
+
border-radius: var(--radius-sm);
|
|
295
|
+
background: rgba(255, 255, 255, 0.06);
|
|
296
|
+
color: #999;
|
|
297
|
+
cursor: pointer;
|
|
298
|
+
display: inline-flex;
|
|
299
|
+
align-items: center;
|
|
300
|
+
justify-content: center;
|
|
301
|
+
padding: 0;
|
|
302
|
+
flex-shrink: 0;
|
|
303
|
+
margin-left: var(--space-xs);
|
|
304
|
+
transition: background var(--transition-fast), color var(--transition-fast);
|
|
305
|
+
}
|
|
306
|
+
.twm-notification__close:hover {
|
|
307
|
+
background: rgba(255, 255, 255, 0.14);
|
|
308
|
+
color: var(--text-bright);
|
|
309
|
+
}
|
|
310
|
+
.twm-notification__body {
|
|
311
|
+
font-size: var(--font-size-sm);
|
|
312
|
+
line-height: 1.45;
|
|
313
|
+
}
|
|
314
|
+
.twm-notification__description {
|
|
315
|
+
margin-top: var(--space-sm);
|
|
316
|
+
font-size: var(--font-size-xs);
|
|
317
|
+
color: #bcbcbc;
|
|
318
|
+
}
|
|
319
|
+
.twm-notification__actions {
|
|
320
|
+
display: flex;
|
|
321
|
+
flex-wrap: wrap;
|
|
322
|
+
gap: var(--space-sm);
|
|
323
|
+
justify-content: flex-end;
|
|
324
|
+
margin-top: 10px;
|
|
325
|
+
}
|
|
326
|
+
.twm-notification__action-btn {
|
|
327
|
+
border: 1px solid #3a3a3a;
|
|
328
|
+
background: #2a2a2c;
|
|
329
|
+
color: var(--text-primary);
|
|
330
|
+
border-radius: var(--radius-sm);
|
|
331
|
+
padding: var(--space-xs) 10px;
|
|
332
|
+
font-size: var(--font-size-xs);
|
|
333
|
+
cursor: pointer;
|
|
334
|
+
}
|
|
335
|
+
.twm-notification__action-btn:hover {
|
|
336
|
+
background: var(--accent);
|
|
337
|
+
border-color: var(--accent);
|
|
338
|
+
}
|
|
339
|
+
/* Notification history (bottom bar bell + popover) */
|
|
340
|
+
.twm-notification-history__trigger {
|
|
341
|
+
display: flex;
|
|
342
|
+
align-items: center;
|
|
343
|
+
justify-content: center;
|
|
344
|
+
position: relative;
|
|
345
|
+
background: transparent;
|
|
346
|
+
border: none;
|
|
347
|
+
color: #b5b5b5;
|
|
348
|
+
cursor: pointer;
|
|
349
|
+
height: 20px;
|
|
350
|
+
padding: 0 6px;
|
|
351
|
+
}
|
|
352
|
+
.twm-notification-history__trigger:hover {
|
|
353
|
+
color: var(--text-bright);
|
|
354
|
+
background: rgba(255, 255, 255, 0.08);
|
|
355
|
+
}
|
|
356
|
+
.twm-notification-history__badge {
|
|
357
|
+
position: absolute;
|
|
358
|
+
top: -4px;
|
|
359
|
+
right: -2px;
|
|
360
|
+
min-width: 14px;
|
|
361
|
+
height: 14px;
|
|
362
|
+
border-radius: 7px;
|
|
363
|
+
background: var(--accent);
|
|
364
|
+
color: var(--text-bright);
|
|
365
|
+
font-size: 9px;
|
|
366
|
+
font-weight: 600;
|
|
367
|
+
display: flex;
|
|
368
|
+
align-items: center;
|
|
369
|
+
justify-content: center;
|
|
370
|
+
padding: 0 3px;
|
|
371
|
+
line-height: 1;
|
|
372
|
+
}
|
|
373
|
+
.twm-notification-history__panel {
|
|
374
|
+
position: fixed;
|
|
375
|
+
z-index: 9999;
|
|
376
|
+
width: 360px;
|
|
377
|
+
max-height: 420px;
|
|
378
|
+
background: #1f1f20;
|
|
379
|
+
border: 1px solid #2f2f31;
|
|
380
|
+
border-radius: var(--radius-lg);
|
|
381
|
+
box-shadow: 0 12px 32px rgba(0, 0, 0, 0.45);
|
|
382
|
+
display: flex;
|
|
383
|
+
flex-direction: column;
|
|
384
|
+
animation: notification-in 160ms ease-out;
|
|
385
|
+
}
|
|
386
|
+
.twm-notification-history__header {
|
|
387
|
+
display: flex;
|
|
388
|
+
align-items: center;
|
|
389
|
+
padding: 10px 12px;
|
|
390
|
+
border-bottom: 1px solid #2f2f31;
|
|
391
|
+
gap: var(--space-md);
|
|
392
|
+
}
|
|
393
|
+
.twm-notification-history__title {
|
|
394
|
+
font-size: var(--font-size-md);
|
|
395
|
+
font-weight: 600;
|
|
396
|
+
color: #f5f5f5;
|
|
397
|
+
flex: 1;
|
|
398
|
+
}
|
|
399
|
+
.twm-notification-history__clear-btn,
|
|
400
|
+
.twm-notification-history__close-btn {
|
|
401
|
+
width: 20px;
|
|
402
|
+
height: 20px;
|
|
403
|
+
border: none;
|
|
404
|
+
border-radius: var(--radius-sm);
|
|
405
|
+
background: transparent;
|
|
406
|
+
color: #b5b5b5;
|
|
407
|
+
cursor: pointer;
|
|
408
|
+
display: inline-flex;
|
|
409
|
+
align-items: center;
|
|
410
|
+
justify-content: center;
|
|
411
|
+
padding: 0;
|
|
412
|
+
}
|
|
413
|
+
.twm-notification-history__clear-btn:hover,
|
|
414
|
+
.twm-notification-history__close-btn:hover {
|
|
415
|
+
background: rgba(255, 255, 255, 0.08);
|
|
416
|
+
color: var(--text-bright);
|
|
417
|
+
}
|
|
418
|
+
.twm-notification-history__list {
|
|
419
|
+
overflow-y: auto;
|
|
420
|
+
flex: 1;
|
|
421
|
+
padding: var(--space-md);
|
|
422
|
+
display: flex;
|
|
423
|
+
flex-direction: column;
|
|
424
|
+
gap: var(--space-sm);
|
|
425
|
+
}
|
|
426
|
+
.twm-notification-history__item {
|
|
427
|
+
background: #252527;
|
|
428
|
+
border: 1px solid #2f2f31;
|
|
429
|
+
border-left: 3px solid #4fc1ff;
|
|
430
|
+
border-radius: var(--radius-md);
|
|
431
|
+
padding: var(--space-md) 10px;
|
|
432
|
+
font-size: var(--font-size-sm);
|
|
433
|
+
}
|
|
434
|
+
.twm-notification-history__item-header {
|
|
435
|
+
display: flex;
|
|
436
|
+
align-items: center;
|
|
437
|
+
gap: var(--space-sm);
|
|
438
|
+
margin-bottom: var(--space-xs);
|
|
439
|
+
}
|
|
440
|
+
.twm-notification-history__item-title {
|
|
441
|
+
font-weight: 600;
|
|
442
|
+
font-size: var(--font-size-sm);
|
|
443
|
+
color: var(--text-primary);
|
|
444
|
+
}
|
|
445
|
+
.twm-notification-history__item-time {
|
|
446
|
+
margin-left: auto;
|
|
447
|
+
font-size: 10px;
|
|
448
|
+
color: #8c8c8c;
|
|
449
|
+
}
|
|
450
|
+
.twm-notification-history__item-body {
|
|
451
|
+
color: #bcbcbc;
|
|
452
|
+
line-height: 1.4;
|
|
453
|
+
}
|
|
454
|
+
.twm-notification-history__empty {
|
|
455
|
+
text-align: center;
|
|
456
|
+
color: #6c6c6c;
|
|
457
|
+
padding: var(--space-2xl) 12px;
|
|
458
|
+
font-size: var(--font-size-sm);
|
|
459
|
+
}
|
|
460
|
+
.twm-data-page__search {
|
|
461
|
+
min-width: 200px;
|
|
462
|
+
padding: var(--space-md) 10px;
|
|
463
|
+
border-radius: var(--radius-md);
|
|
464
|
+
border: 1px solid #323234;
|
|
465
|
+
background: #141415;
|
|
466
|
+
color: inherit;
|
|
467
|
+
}
|
|
468
|
+
/* ==========================================================================
|
|
469
|
+
Preview Table - Unified data table component
|
|
470
|
+
Used for: series preview, import wizard preview, scenario results
|
|
471
|
+
========================================================================== */
|
|
472
|
+
|
|
473
|
+
.twm-preview-table-wrap {
|
|
474
|
+
border: 1px solid #2a2a2a;
|
|
475
|
+
border-radius: var(--radius-sm);
|
|
476
|
+
}
|
|
477
|
+
/* The body wrap's 1px border insets the body table by 1px on the left.
|
|
478
|
+
* The header table sits in a separate wrap, so give that wrap a matching
|
|
479
|
+
* 1px (transparent) left/right border or the two tables' columns would
|
|
480
|
+
* sit 1px apart — a constant header/body offset even at rest. */
|
|
481
|
+
.twm-preview-table-header-wrap {
|
|
482
|
+
border-left: 1px solid transparent;
|
|
483
|
+
border-right: 1px solid transparent;
|
|
484
|
+
}
|
|
485
|
+
.twm-preview-table-wrap--wizard {
|
|
486
|
+
max-height: none;
|
|
487
|
+
flex: 1;
|
|
488
|
+
min-height: 0;
|
|
489
|
+
overflow: auto;
|
|
490
|
+
}
|
|
491
|
+
.twm-preview-table {
|
|
492
|
+
width: 100%;
|
|
493
|
+
border-collapse: collapse;
|
|
494
|
+
font-size: var(--font-size-sm);
|
|
495
|
+
}
|
|
496
|
+
.twm-preview-table th,
|
|
497
|
+
.twm-preview-table td {
|
|
498
|
+
border-bottom: 1px solid #2a2a2a;
|
|
499
|
+
padding: var(--space-sm) 8px;
|
|
500
|
+
white-space: nowrap;
|
|
501
|
+
/* Never spill text past the column. Once columns are locked to fixed
|
|
502
|
+
* widths, over-long content is clipped with an ellipsis; the full
|
|
503
|
+
* value is available via a hover tooltip the DataTable attaches. */
|
|
504
|
+
overflow: hidden;
|
|
505
|
+
text-overflow: ellipsis;
|
|
506
|
+
}
|
|
507
|
+
/* Drag-to-resize: a thin grab handle on the right edge of each header
|
|
508
|
+
* cell. Square (no radius), highlights on hover / during the drag. */
|
|
509
|
+
.twm-preview-table th.twm-dt-col {
|
|
510
|
+
position: relative;
|
|
511
|
+
}
|
|
512
|
+
.twm-preview-table th .twm-dt-col-resizer {
|
|
513
|
+
position: absolute;
|
|
514
|
+
top: 0;
|
|
515
|
+
right: 0;
|
|
516
|
+
width: 6px;
|
|
517
|
+
height: 100%;
|
|
518
|
+
cursor: col-resize;
|
|
519
|
+
user-select: none;
|
|
520
|
+
z-index: 2;
|
|
521
|
+
}
|
|
522
|
+
.twm-preview-table th .twm-dt-col-resizer:hover,
|
|
523
|
+
body.twm-dt-col-resizing .twm-preview-table th .twm-dt-col-resizer {
|
|
524
|
+
background: rgba(203, 75, 22, 0.35);
|
|
525
|
+
}
|
|
526
|
+
body.twm-dt-col-resizing {
|
|
527
|
+
cursor: col-resize;
|
|
528
|
+
user-select: none;
|
|
529
|
+
}
|
|
530
|
+
/* Transient measurement pass (DataTable._syncHeaderWidths): let every
|
|
531
|
+
* column expand to its natural content width so we can read it, ignoring
|
|
532
|
+
* the fixed/pinned caps (the 150px first column, the 80px min on the rest)
|
|
533
|
+
* and the filter-row inputs. Toggled on for a single synchronous reflow,
|
|
534
|
+
* then removed before paint — never visible. */
|
|
535
|
+
.twm-preview-table.twm-dt-measuring {
|
|
536
|
+
table-layout: auto !important;
|
|
537
|
+
width: max-content !important;
|
|
538
|
+
}
|
|
539
|
+
.twm-preview-table.twm-dt-measuring th,
|
|
540
|
+
.twm-preview-table.twm-dt-measuring td {
|
|
541
|
+
width: auto !important;
|
|
542
|
+
min-width: 0 !important;
|
|
543
|
+
max-width: none !important;
|
|
544
|
+
}
|
|
545
|
+
.twm-preview-table.twm-dt-measuring .twm-data-table__filter-row {
|
|
546
|
+
display: none !important;
|
|
547
|
+
}
|
|
548
|
+
.twm-preview-table th {
|
|
549
|
+
position: sticky;
|
|
550
|
+
top: 0;
|
|
551
|
+
background: #222;
|
|
552
|
+
color: #aaa;
|
|
553
|
+
font-weight: 600;
|
|
554
|
+
text-align: left;
|
|
555
|
+
}
|
|
556
|
+
.twm-preview-table td {
|
|
557
|
+
font-family: "JetBrains Mono", "Cascadia Mono", Consolas, monospace;
|
|
558
|
+
font-variant-numeric: tabular-nums;
|
|
559
|
+
}
|
|
560
|
+
/* Time column (first column) styling */
|
|
561
|
+
.twm-preview-table th:first-child,
|
|
562
|
+
.twm-preview-table td:first-child {
|
|
563
|
+
width: 120px;
|
|
564
|
+
min-width: 100px;
|
|
565
|
+
font-weight: 500;
|
|
566
|
+
color: #bbb;
|
|
567
|
+
}
|
|
568
|
+
/* Data columns have flexible width */
|
|
569
|
+
.twm-preview-table th:not(:first-child),
|
|
570
|
+
.twm-preview-table td:not(:first-child) {
|
|
571
|
+
width: auto;
|
|
572
|
+
min-width: 80px;
|
|
573
|
+
}
|
|
574
|
+
/* Alternating row backgrounds */
|
|
575
|
+
.twm-preview-table tbody tr:nth-child(even) {
|
|
576
|
+
background: rgba(255, 255, 255, 0.02);
|
|
577
|
+
}
|
|
578
|
+
/* Hover state (disabled in wizard via modifier) */
|
|
579
|
+
.twm-preview-table:not(.twm-preview-table--readonly) tr:hover td {
|
|
580
|
+
background: rgba(255, 255, 255, 0.04);
|
|
581
|
+
}
|
|
582
|
+
/* Wizard mode: uniform column widths, no selection */
|
|
583
|
+
.twm-preview-table-wrap--wizard .twm-preview-table {
|
|
584
|
+
table-layout: auto;
|
|
585
|
+
min-width: 600px;
|
|
586
|
+
}
|
|
587
|
+
.twm-preview-table-wrap--wizard .twm-preview-table th,
|
|
588
|
+
.twm-preview-table-wrap--wizard .twm-preview-table td {
|
|
589
|
+
overflow: hidden;
|
|
590
|
+
text-overflow: ellipsis;
|
|
591
|
+
}
|
|
592
|
+
/* Wizard mode: first column same as others */
|
|
593
|
+
.twm-preview-table-wrap--wizard .twm-preview-table th:first-child,
|
|
594
|
+
.twm-preview-table-wrap--wizard .twm-preview-table td:first-child {
|
|
595
|
+
width: auto;
|
|
596
|
+
min-width: auto;
|
|
597
|
+
}
|
|
598
|
+
.twm-expression-field {
|
|
599
|
+
display: flex;
|
|
600
|
+
flex-direction: column;
|
|
601
|
+
gap: var(--space-sm);
|
|
602
|
+
}
|
|
603
|
+
.twm-expression-field__helper {
|
|
604
|
+
font-size: var(--font-size-xs);
|
|
605
|
+
color: #8c8c8c;
|
|
606
|
+
}
|
|
607
|
+
.twm-slider-field {
|
|
608
|
+
display: flex;
|
|
609
|
+
flex-direction: column;
|
|
610
|
+
gap: var(--space-sm);
|
|
611
|
+
position: relative;
|
|
612
|
+
z-index: 1;
|
|
613
|
+
}
|
|
614
|
+
.twm-slider-field__input {
|
|
615
|
+
width: 100%;
|
|
616
|
+
height: 20px;
|
|
617
|
+
cursor: pointer;
|
|
618
|
+
-webkit-appearance: none;
|
|
619
|
+
appearance: none;
|
|
620
|
+
background: transparent;
|
|
621
|
+
margin: 0;
|
|
622
|
+
position: relative;
|
|
623
|
+
z-index: 2;
|
|
624
|
+
touch-action: pan-x; /* Allow horizontal sliding/panning */
|
|
625
|
+
pointer-events: auto !important;
|
|
626
|
+
}
|
|
627
|
+
.twm-slider-field__input::-webkit-slider-runnable-track {
|
|
628
|
+
height: 6px;
|
|
629
|
+
background: rgba(255, 255, 255, 0.15);
|
|
630
|
+
border-radius: var(--radius-sm);
|
|
631
|
+
cursor: pointer;
|
|
632
|
+
}
|
|
633
|
+
.twm-slider-field__input::-webkit-slider-thumb {
|
|
634
|
+
-webkit-appearance: none;
|
|
635
|
+
width: 16px;
|
|
636
|
+
height: 16px;
|
|
637
|
+
border-radius: 50%;
|
|
638
|
+
background: #569cd6;
|
|
639
|
+
margin-top: -5px;
|
|
640
|
+
cursor: grab;
|
|
641
|
+
border: 2px solid var(--surface-0);
|
|
642
|
+
}
|
|
643
|
+
.twm-slider-field__input::-webkit-slider-thumb:active {
|
|
644
|
+
cursor: grabbing;
|
|
645
|
+
background: #6eb3e9;
|
|
646
|
+
}
|
|
647
|
+
.twm-slider-field__input::-moz-range-track {
|
|
648
|
+
height: 6px;
|
|
649
|
+
background: rgba(255, 255, 255, 0.15);
|
|
650
|
+
border-radius: var(--radius-sm);
|
|
651
|
+
cursor: pointer;
|
|
652
|
+
}
|
|
653
|
+
.twm-slider-field__input::-moz-range-thumb {
|
|
654
|
+
width: 16px;
|
|
655
|
+
height: 16px;
|
|
656
|
+
border-radius: 50%;
|
|
657
|
+
background: #569cd6;
|
|
658
|
+
cursor: grab;
|
|
659
|
+
border: 2px solid var(--surface-0);
|
|
660
|
+
}
|
|
661
|
+
/* ===== Sortable List Component ===== */
|
|
662
|
+
.twm-sortable-list {
|
|
663
|
+
display: flex;
|
|
664
|
+
flex-direction: column;
|
|
665
|
+
gap: var(--space-sm);
|
|
666
|
+
}
|
|
667
|
+
.twm-sortable-list__items {
|
|
668
|
+
display: flex;
|
|
669
|
+
flex-direction: column;
|
|
670
|
+
gap: var(--space-sm);
|
|
671
|
+
}
|
|
672
|
+
.twm-sortable-list__row {
|
|
673
|
+
display: flex;
|
|
674
|
+
align-items: center;
|
|
675
|
+
gap: var(--space-md);
|
|
676
|
+
padding: var(--space-sm) 8px;
|
|
677
|
+
background: #2a2a2c;
|
|
678
|
+
border: 1px solid #3a3a3c;
|
|
679
|
+
border-radius: var(--radius-md);
|
|
680
|
+
transition: border-color var(--transition-normal), background var(--transition-normal);
|
|
681
|
+
}
|
|
682
|
+
.twm-sortable-list__row:hover {
|
|
683
|
+
border-color: #454547;
|
|
684
|
+
}
|
|
685
|
+
.twm-sortable-list__handle {
|
|
686
|
+
cursor: grab;
|
|
687
|
+
color: #6e6e70;
|
|
688
|
+
display: flex;
|
|
689
|
+
align-items: center;
|
|
690
|
+
padding: var(--space-xxs);
|
|
691
|
+
opacity: 0.6;
|
|
692
|
+
transition: opacity var(--transition-normal), color var(--transition-normal);
|
|
693
|
+
}
|
|
694
|
+
.twm-sortable-list__handle:hover {
|
|
695
|
+
opacity: 1;
|
|
696
|
+
color: #8c8c8c;
|
|
697
|
+
}
|
|
698
|
+
.twm-sortable-list__handle:active {
|
|
699
|
+
cursor: grabbing;
|
|
700
|
+
}
|
|
701
|
+
.twm-sortable-list__drop {
|
|
702
|
+
height: 2px;
|
|
703
|
+
margin: 1px 0;
|
|
704
|
+
background: #569cd6;
|
|
705
|
+
pointer-events: none;
|
|
706
|
+
}
|
|
707
|
+
.twm-sortable-list__content {
|
|
708
|
+
flex: 1;
|
|
709
|
+
min-width: 0;
|
|
710
|
+
}
|
|
711
|
+
.twm-sortable-list__remove {
|
|
712
|
+
display: flex;
|
|
713
|
+
align-items: center;
|
|
714
|
+
padding: var(--space-xs);
|
|
715
|
+
background: transparent;
|
|
716
|
+
border: none;
|
|
717
|
+
color: #8c8c8c;
|
|
718
|
+
cursor: pointer;
|
|
719
|
+
border-radius: var(--radius-sm);
|
|
720
|
+
transition: color var(--transition-normal), background var(--transition-normal);
|
|
721
|
+
}
|
|
722
|
+
.twm-sortable-list__remove:hover {
|
|
723
|
+
color: #f14c4c;
|
|
724
|
+
background: rgba(241, 76, 76, 0.1);
|
|
725
|
+
}
|
|
726
|
+
.twm-sortable-list__remove:disabled {
|
|
727
|
+
opacity: 0.4;
|
|
728
|
+
cursor: not-allowed;
|
|
729
|
+
}
|
|
730
|
+
.twm-sortable-list__remove:disabled:hover {
|
|
731
|
+
color: #8c8c8c;
|
|
732
|
+
background: transparent;
|
|
733
|
+
}
|
|
734
|
+
.twm-sortable-list__add {
|
|
735
|
+
display: flex;
|
|
736
|
+
align-items: center;
|
|
737
|
+
justify-content: center;
|
|
738
|
+
gap: var(--space-sm);
|
|
739
|
+
padding: var(--space-md) 14px;
|
|
740
|
+
border-radius: var(--radius-md);
|
|
741
|
+
border: 1px solid #454547;
|
|
742
|
+
background: #2a2a2c;
|
|
743
|
+
color: #b0b0b0;
|
|
744
|
+
font-size: var(--font-size-sm);
|
|
745
|
+
font-weight: 500;
|
|
746
|
+
cursor: pointer;
|
|
747
|
+
transition: border-color var(--transition-normal), color var(--transition-normal), background var(--transition-normal);
|
|
748
|
+
margin-top: var(--space-md);
|
|
749
|
+
}
|
|
750
|
+
.twm-sortable-list__add:hover {
|
|
751
|
+
border-color: #569cd6;
|
|
752
|
+
color: #569cd6;
|
|
753
|
+
background: rgba(86, 156, 214, 0.12);
|
|
754
|
+
}
|
|
755
|
+
.twm-sortable-list__add:active {
|
|
756
|
+
background: rgba(86, 156, 214, 0.2);
|
|
757
|
+
}
|
|
758
|
+
.twm-sortable-list__empty {
|
|
759
|
+
padding: var(--space-xl);
|
|
760
|
+
text-align: center;
|
|
761
|
+
color: #6e6e70;
|
|
762
|
+
font-size: var(--font-size-sm);
|
|
763
|
+
font-style: italic;
|
|
764
|
+
border: 1px dashed #3a3a3c;
|
|
765
|
+
border-radius: var(--radius-md);
|
|
766
|
+
background: rgba(42, 42, 44, 0.5);
|
|
767
|
+
}
|
|
768
|
+
.twm-sortable-list__input {
|
|
769
|
+
flex: 1;
|
|
770
|
+
min-width: 0;
|
|
771
|
+
padding: var(--space-xs) 8px;
|
|
772
|
+
background: var(--surface-0);
|
|
773
|
+
border: 1px solid #3a3a3c;
|
|
774
|
+
border-radius: var(--radius-sm);
|
|
775
|
+
color: var(--text-secondary);
|
|
776
|
+
font-size: var(--font-size-sm);
|
|
777
|
+
font-family: 'Consolas', 'Monaco', monospace;
|
|
778
|
+
}
|
|
779
|
+
.twm-sortable-list__input:focus {
|
|
780
|
+
outline: none;
|
|
781
|
+
border-color: #569cd6;
|
|
782
|
+
}
|
|
783
|
+
/* Global Top Bar (fixed at top) */
|
|
784
|
+
.twm-global-top-bar {
|
|
785
|
+
position: fixed;
|
|
786
|
+
top: 0;
|
|
787
|
+
left: 0;
|
|
788
|
+
right: 0;
|
|
789
|
+
height: 35px;
|
|
790
|
+
min-height: 35px; /* Prevent shrinking */
|
|
791
|
+
max-height: 35px; /* Prevent growing */
|
|
792
|
+
display: flex;
|
|
793
|
+
justify-content: space-between;
|
|
794
|
+
align-items: center;
|
|
795
|
+
background-color: #323233;
|
|
796
|
+
color: var(--text-body);
|
|
797
|
+
border-bottom: 1px solid var(--surface-0);
|
|
798
|
+
padding: 0 0px;
|
|
799
|
+
width: 100%;
|
|
800
|
+
box-sizing: border-box;
|
|
801
|
+
z-index: 7000; /* Above managed windows (6000-6999), backdrop (1500), and content */
|
|
802
|
+
overflow: visible; /* allow dropdowns to extend below */
|
|
803
|
+
}
|
|
804
|
+
/* Prevent flex wrapping and enable shrink on sections */
|
|
805
|
+
.twm-global-top-bar, .twm-global-top-bar .twm-bar-left, .twm-global-top-bar .twm-bar-center, .twm-global-top-bar .twm-bar-right {
|
|
806
|
+
min-width: 0; /* allow flex children to shrink */
|
|
807
|
+
}
|
|
808
|
+
.twm-bar-center {
|
|
809
|
+
white-space: nowrap;
|
|
810
|
+
overflow: hidden;
|
|
811
|
+
text-overflow: ellipsis;
|
|
812
|
+
}
|
|
813
|
+
.twm-panel-toggles { flex-wrap: nowrap; }
|
|
814
|
+
.twm-global-bottom-bar {
|
|
815
|
+
display: flex;
|
|
816
|
+
justify-content: space-between;
|
|
817
|
+
align-items: center;
|
|
818
|
+
background-color: var(--surface-0);
|
|
819
|
+
color: var(--text-bright);
|
|
820
|
+
height: 20px;
|
|
821
|
+
padding: 0 0px;
|
|
822
|
+
width: 100%;
|
|
823
|
+
box-sizing: border-box;
|
|
824
|
+
position: fixed;
|
|
825
|
+
bottom: 0;
|
|
826
|
+
left: 0;
|
|
827
|
+
z-index: var(--z-modal);
|
|
828
|
+
border-top: 1px solid var(--surface-3);
|
|
829
|
+
}
|
|
830
|
+
/* Left, Center, and Right Sections */
|
|
831
|
+
.twm-bar-left {
|
|
832
|
+
flex: 1;
|
|
833
|
+
display: flex;
|
|
834
|
+
align-items: center;
|
|
835
|
+
justify-content: flex-start;
|
|
836
|
+
padding: 0;
|
|
837
|
+
}
|
|
838
|
+
/* Generic status indicator styles (bottom bar left) */
|
|
839
|
+
.twm-status-indicator {
|
|
840
|
+
display: inline-flex;
|
|
841
|
+
align-items: center;
|
|
842
|
+
justify-content: center;
|
|
843
|
+
gap: var(--space-sm);
|
|
844
|
+
height: 100%;
|
|
845
|
+
line-height: 20px; /* match .global-bottom-bar height */
|
|
846
|
+
padding: 0 10px; /* inner padding for readability */
|
|
847
|
+
margin: 0;
|
|
848
|
+
border-radius: 0;
|
|
849
|
+
font-size: var(--font-size-sm);
|
|
850
|
+
font-weight: 500;
|
|
851
|
+
color: var(--text-bright);
|
|
852
|
+
cursor: pointer;
|
|
853
|
+
user-select: none;
|
|
854
|
+
transition: background-color 0.2s;
|
|
855
|
+
}
|
|
856
|
+
.twm-bar-center {
|
|
857
|
+
flex: 2;
|
|
858
|
+
display: flex;
|
|
859
|
+
align-items: center;
|
|
860
|
+
justify-content: center;
|
|
861
|
+
}
|
|
862
|
+
.twm-bar-right {
|
|
863
|
+
flex: 1;
|
|
864
|
+
display: flex;
|
|
865
|
+
align-items: center;
|
|
866
|
+
justify-content: flex-end;
|
|
867
|
+
padding-right: 10px;
|
|
868
|
+
}
|
|
869
|
+
.twm-panel-toggles {
|
|
870
|
+
display: flex;
|
|
871
|
+
gap: 5px;
|
|
872
|
+
}
|
|
873
|
+
.twm-panel-toggle-btn {
|
|
874
|
+
background: transparent;
|
|
875
|
+
border: none;
|
|
876
|
+
color: #7f7f7f;
|
|
877
|
+
padding: var(--space-xs) 6px;
|
|
878
|
+
border-radius: var(--radius-sm);
|
|
879
|
+
cursor: pointer;
|
|
880
|
+
display: flex;
|
|
881
|
+
align-items: center;
|
|
882
|
+
justify-content: center;
|
|
883
|
+
transition: background-color 0.2s ease, color 0.2s ease;
|
|
884
|
+
}
|
|
885
|
+
.twm-panel-toggle-btn:hover {
|
|
886
|
+
background-color: #3f4040;
|
|
887
|
+
}
|
|
888
|
+
.twm-panel-toggle-btn:active {
|
|
889
|
+
background: #1a1a1a;
|
|
890
|
+
}
|
|
891
|
+
/* Disabled state for panel toggle buttons: darker color and no hover/active effects */
|
|
892
|
+
.twm-panel-toggle-btn:disabled,
|
|
893
|
+
.twm-panel-toggle-btn[aria-disabled="true"] {
|
|
894
|
+
color: #4d4d4d;
|
|
895
|
+
cursor: not-allowed;
|
|
896
|
+
opacity: 0.7;
|
|
897
|
+
}
|
|
898
|
+
.twm-panel-toggle-btn:disabled:hover,
|
|
899
|
+
.twm-panel-toggle-btn[aria-disabled="true"]:hover {
|
|
900
|
+
background-color: transparent;
|
|
901
|
+
}
|
|
902
|
+
.twm-panel-toggle-btn:disabled:active,
|
|
903
|
+
.twm-panel-toggle-btn[aria-disabled="true"]:active {
|
|
904
|
+
background: transparent;
|
|
905
|
+
}
|
|
906
|
+
/* Fixed-left vertical icon bar */
|
|
907
|
+
.twm-fl-bar {
|
|
908
|
+
display: flex;
|
|
909
|
+
flex-direction: column;
|
|
910
|
+
align-items: stretch;
|
|
911
|
+
gap: var(--space-sm);
|
|
912
|
+
height: 100%;
|
|
913
|
+
}
|
|
914
|
+
.twm-fl-item {
|
|
915
|
+
background: transparent;
|
|
916
|
+
border: none;
|
|
917
|
+
border-left: 2px solid transparent; /* space reserved for active indicator */
|
|
918
|
+
color: #9e9e9e; /* default grey for inactive */
|
|
919
|
+
width: 100%;
|
|
920
|
+
height: 44px;
|
|
921
|
+
display: flex;
|
|
922
|
+
align-items: center;
|
|
923
|
+
justify-content: center;
|
|
924
|
+
cursor: pointer;
|
|
925
|
+
transition: color var(--transition-fast), background var(--transition-fast), border-color var(--transition-fast);
|
|
926
|
+
}
|
|
927
|
+
.twm-fl-item:hover {
|
|
928
|
+
color: var(--text-bright); /* hovered icons become pure white */
|
|
929
|
+
background: transparent;
|
|
930
|
+
}
|
|
931
|
+
.twm-fl-item:focus-visible {
|
|
932
|
+
outline: 2px solid var(--accent-bright);
|
|
933
|
+
outline-offset: -2px;
|
|
934
|
+
}
|
|
935
|
+
/* Unified collapsible arrow system */
|
|
936
|
+
.twm-collapsible-arrow {
|
|
937
|
+
transition: transform 0.2s ease;
|
|
938
|
+
transform: rotate(0deg); /* Default: pointing down (expanded) */
|
|
939
|
+
font-size: 10px;
|
|
940
|
+
display: inline-block;
|
|
941
|
+
text-align: center;
|
|
942
|
+
color: var(--text-secondary);
|
|
943
|
+
}
|
|
944
|
+
/* ── Top-bar Breadcrumb ─────────────────────────────────────── */
|
|
945
|
+
|
|
946
|
+
.twm-topbar-breadcrumb {
|
|
947
|
+
display: flex;
|
|
948
|
+
align-items: center;
|
|
949
|
+
height: 100%;
|
|
950
|
+
padding: 0 4px;
|
|
951
|
+
flex: 1;
|
|
952
|
+
min-width: 0;
|
|
953
|
+
}
|
|
954
|
+
.twm-topbar-breadcrumb__list {
|
|
955
|
+
display: flex;
|
|
956
|
+
align-items: center;
|
|
957
|
+
list-style: none;
|
|
958
|
+
margin: 0;
|
|
959
|
+
padding: 0;
|
|
960
|
+
gap: var(--space-xxs);
|
|
961
|
+
}
|
|
962
|
+
.twm-topbar-breadcrumb__item {
|
|
963
|
+
display: flex;
|
|
964
|
+
align-items: center;
|
|
965
|
+
}
|
|
966
|
+
.twm-topbar-breadcrumb__link {
|
|
967
|
+
display: inline-flex;
|
|
968
|
+
align-items: center;
|
|
969
|
+
gap: var(--space-xs);
|
|
970
|
+
padding: 3px 8px;
|
|
971
|
+
border: none;
|
|
972
|
+
border-radius: var(--radius-sm);
|
|
973
|
+
background: transparent;
|
|
974
|
+
color: var(--text-muted, var(--text-muted));
|
|
975
|
+
font-family: inherit;
|
|
976
|
+
font-size: var(--font-size-sm);
|
|
977
|
+
cursor: pointer;
|
|
978
|
+
white-space: nowrap;
|
|
979
|
+
transition: color var(--transition-normal), background var(--transition-normal);
|
|
980
|
+
}
|
|
981
|
+
.twm-topbar-breadcrumb__link:hover {
|
|
982
|
+
color: #64b5f6;
|
|
983
|
+
background: rgba(100, 181, 246, 0.08);
|
|
984
|
+
}
|
|
985
|
+
/* Brief click-feedback flash applied by tile_breadcrumb.js so users
|
|
986
|
+
* can tell the click landed even before the page swaps. */
|
|
987
|
+
.twm-tile-breadcrumb__link--flash {
|
|
988
|
+
background: rgba(100, 181, 246, 0.35) !important;
|
|
989
|
+
color: #fff !important;
|
|
990
|
+
}
|
|
991
|
+
.twm-topbar-breadcrumb__separator {
|
|
992
|
+
color: #555;
|
|
993
|
+
font-size: var(--font-size-lg);
|
|
994
|
+
margin: 0 1px;
|
|
995
|
+
user-select: none;
|
|
996
|
+
}
|
|
997
|
+
.twm-topbar-breadcrumb__icon {
|
|
998
|
+
font-size: var(--font-size-lg);
|
|
999
|
+
}
|
|
1000
|
+
.twm-topbar-breadcrumb__item--current {
|
|
1001
|
+
display: inline-flex;
|
|
1002
|
+
align-items: center;
|
|
1003
|
+
gap: var(--space-xs);
|
|
1004
|
+
padding: 3px 0;
|
|
1005
|
+
}
|
|
1006
|
+
.twm-topbar-breadcrumb__current {
|
|
1007
|
+
color: var(--text-secondary, #aaa);
|
|
1008
|
+
font-size: var(--font-size-sm);
|
|
1009
|
+
font-weight: 500;
|
|
1010
|
+
white-space: nowrap;
|
|
1011
|
+
}
|
|
1012
|
+
.twm-topbar-breadcrumb__item--current .twm-topbar-breadcrumb__icon {
|
|
1013
|
+
color: var(--text-muted, var(--text-muted));
|
|
1014
|
+
}
|
|
1015
|
+
.twm-menu-bar {
|
|
1016
|
+
display: flex;
|
|
1017
|
+
align-items: center;
|
|
1018
|
+
gap: 1px;
|
|
1019
|
+
min-height: 25px;
|
|
1020
|
+
}
|
|
1021
|
+
.twm-menu-bar button, .twm-arrow-toggle {
|
|
1022
|
+
display: flex;
|
|
1023
|
+
align-items: center;
|
|
1024
|
+
justify-content: center;
|
|
1025
|
+
background-color: inherit;
|
|
1026
|
+
color: #7f7f7f;
|
|
1027
|
+
width: 25px;
|
|
1028
|
+
height: 25px;
|
|
1029
|
+
line-height: 25px;
|
|
1030
|
+
border: none;
|
|
1031
|
+
border-radius: var(--radius-sm);
|
|
1032
|
+
box-sizing: border-box;
|
|
1033
|
+
margin-right: 5px;
|
|
1034
|
+
}
|
|
1035
|
+
.twm-menu-bar button:hover, .twm-arrow-toggle:hover {
|
|
1036
|
+
background-color: #3f4040;
|
|
1037
|
+
}
|
|
1038
|
+
.twm-arrow-toggle {
|
|
1039
|
+
width: 16px;
|
|
1040
|
+
height: 16px;
|
|
1041
|
+
line-height: 16px;
|
|
1042
|
+
margin:3px;
|
|
1043
|
+
padding:0;
|
|
1044
|
+
}
|
|
1045
|
+
.twm-tab-content {
|
|
1046
|
+
flex-grow: 1;
|
|
1047
|
+
overflow: auto;
|
|
1048
|
+
padding: 10px;
|
|
1049
|
+
display: none;
|
|
1050
|
+
background-color: var(--surface-0);
|
|
1051
|
+
}
|
|
1052
|
+
.twm-left-top .twm-tab-content {
|
|
1053
|
+
background-image: radial-gradient(#333333 1px, transparent 1px);
|
|
1054
|
+
background-size: 20px 20px;
|
|
1055
|
+
background-repeat: repeat;
|
|
1056
|
+
}
|
|
1057
|
+
/* Inline tab close confirmation popover */
|
|
1058
|
+
.twm-tab-close-popover {
|
|
1059
|
+
position: fixed;
|
|
1060
|
+
z-index: 5000;
|
|
1061
|
+
background: var(--surface-2);
|
|
1062
|
+
color: var(--text-primary);
|
|
1063
|
+
border: 1px solid var(--surface-3);
|
|
1064
|
+
border-radius: var(--radius-sm);
|
|
1065
|
+
box-shadow: 0 4px 12px rgba(0,0,0,0.45);
|
|
1066
|
+
padding: var(--space-md) 10px;
|
|
1067
|
+
font-size: var(--font-size-sm);
|
|
1068
|
+
pointer-events: auto;
|
|
1069
|
+
--arrow-left: 16px;
|
|
1070
|
+
}
|
|
1071
|
+
/* Arrow pointing UP (popover is BELOW anchor) - default */
|
|
1072
|
+
.twm-tab-close-popover[data-placement="bottom"]::before,
|
|
1073
|
+
.twm-tab-close-popover::before {
|
|
1074
|
+
content: "";
|
|
1075
|
+
position: absolute;
|
|
1076
|
+
top: -6px;
|
|
1077
|
+
left: calc(var(--arrow-left) - 6px);
|
|
1078
|
+
border-left: 6px solid transparent;
|
|
1079
|
+
border-right: 6px solid transparent;
|
|
1080
|
+
border-bottom: 6px solid var(--surface-3); /* border color */
|
|
1081
|
+
}
|
|
1082
|
+
.twm-tab-close-popover[data-placement="bottom"]::after,
|
|
1083
|
+
.twm-tab-close-popover::after {
|
|
1084
|
+
content: "";
|
|
1085
|
+
position: absolute;
|
|
1086
|
+
top: -5px;
|
|
1087
|
+
left: calc(var(--arrow-left) - 5px);
|
|
1088
|
+
border-left: 5px solid transparent;
|
|
1089
|
+
border-right: 5px solid transparent;
|
|
1090
|
+
border-bottom: 5px solid var(--surface-2); /* background color */
|
|
1091
|
+
}
|
|
1092
|
+
/* Arrow pointing DOWN (popover is ABOVE anchor) */
|
|
1093
|
+
.twm-tab-close-popover[data-placement="top"]::before {
|
|
1094
|
+
top: auto;
|
|
1095
|
+
bottom: -6px;
|
|
1096
|
+
border-bottom: none;
|
|
1097
|
+
border-top: 6px solid var(--surface-3); /* border color */
|
|
1098
|
+
}
|
|
1099
|
+
.twm-tab-close-popover[data-placement="top"]::after {
|
|
1100
|
+
top: auto;
|
|
1101
|
+
bottom: -5px;
|
|
1102
|
+
border-bottom: none;
|
|
1103
|
+
border-top: 5px solid var(--surface-2); /* background color */
|
|
1104
|
+
}
|
|
1105
|
+
.twm-left-top {
|
|
1106
|
+
position: relative;
|
|
1107
|
+
background-color: var(--surface-2);
|
|
1108
|
+
overflow: hidden;
|
|
1109
|
+
display: flex;
|
|
1110
|
+
flex-direction: column;
|
|
1111
|
+
flex-grow: 1;
|
|
1112
|
+
flex-shrink: 1;
|
|
1113
|
+
min-height: 100px;
|
|
1114
|
+
}
|
|
1115
|
+
.twm-collapsible-box {
|
|
1116
|
+
border-bottom: 1px solid var(--surface-3);
|
|
1117
|
+
width: 100%;
|
|
1118
|
+
position: relative;
|
|
1119
|
+
}
|
|
1120
|
+
.twm-collapsible-header {
|
|
1121
|
+
display: flex;
|
|
1122
|
+
align-items: center;
|
|
1123
|
+
cursor: pointer;
|
|
1124
|
+
user-select: none;
|
|
1125
|
+
font-weight: bold;
|
|
1126
|
+
font-size: 10px;
|
|
1127
|
+
text-transform: uppercase;
|
|
1128
|
+
}
|
|
1129
|
+
/* Removed: unified collapsible arrow rules above */
|
|
1130
|
+
|
|
1131
|
+
.twm-collapsible-content {
|
|
1132
|
+
display: none;
|
|
1133
|
+
}
|
|
1134
|
+
/* ============================================
|
|
1135
|
+
Autocomplete Field Component (legacy-variable style)
|
|
1136
|
+
============================================ */
|
|
1137
|
+
.twm-autocomplete-field {
|
|
1138
|
+
position: relative;
|
|
1139
|
+
width: 100%;
|
|
1140
|
+
}
|
|
1141
|
+
.twm-autocomplete-field__input-wrapper {
|
|
1142
|
+
display: flex;
|
|
1143
|
+
align-items: stretch;
|
|
1144
|
+
gap: 0;
|
|
1145
|
+
width: 100%;
|
|
1146
|
+
position: relative;
|
|
1147
|
+
border: 1px solid var(--surface-3);
|
|
1148
|
+
border-radius: var(--radius-sm);
|
|
1149
|
+
background-color: var(--surface-1);
|
|
1150
|
+
overflow: hidden;
|
|
1151
|
+
}
|
|
1152
|
+
/* Legacy variable style: magenta border */
|
|
1153
|
+
.twm-autocomplete-field--legacy-variable .twm-autocomplete-field__input-wrapper {
|
|
1154
|
+
border: 1px solid var(--var-border, #d33682);
|
|
1155
|
+
}
|
|
1156
|
+
.twm-autocomplete-field--legacy-variable .twm-autocomplete-field__input-wrapper:focus-within {
|
|
1157
|
+
border-color: var(--var-focus, #e85ba7);
|
|
1158
|
+
box-shadow: 0 0 3px rgba(211, 54, 130, 0.3);
|
|
1159
|
+
}
|
|
1160
|
+
.twm-autocomplete-field__namespace-select {
|
|
1161
|
+
background-color: var(--surface-2);
|
|
1162
|
+
color: var(--text-body);
|
|
1163
|
+
border: none;
|
|
1164
|
+
border-right: 1px solid var(--surface-3);
|
|
1165
|
+
border-radius: 0;
|
|
1166
|
+
padding: var(--space-sm) 24px 6px 10px;
|
|
1167
|
+
font-size: var(--font-size-sm);
|
|
1168
|
+
font-family: 'Courier New', Courier, monospace;
|
|
1169
|
+
outline: none;
|
|
1170
|
+
cursor: pointer;
|
|
1171
|
+
margin: 0;
|
|
1172
|
+
box-sizing: border-box;
|
|
1173
|
+
appearance: none;
|
|
1174
|
+
-webkit-appearance: none;
|
|
1175
|
+
-moz-appearance: none;
|
|
1176
|
+
background-image: url("data:image/svg+xml;charset=UTF-8,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23d4d4d4' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3e%3cpolyline points='6 9 12 15 18 9'%3e%3c/polyline%3e%3c/svg%3e");
|
|
1177
|
+
background-repeat: no-repeat;
|
|
1178
|
+
background-position: right 4px center;
|
|
1179
|
+
background-size: 12px;
|
|
1180
|
+
flex: 0 0 auto;
|
|
1181
|
+
min-width: 60px;
|
|
1182
|
+
max-width: 100px;
|
|
1183
|
+
}
|
|
1184
|
+
.twm-autocomplete-field__namespace-select:hover {
|
|
1185
|
+
background-color: var(--surface-3);
|
|
1186
|
+
}
|
|
1187
|
+
.twm-autocomplete-field__namespace-select:focus {
|
|
1188
|
+
outline: none;
|
|
1189
|
+
background-color: #363636;
|
|
1190
|
+
}
|
|
1191
|
+
.twm-autocomplete-field__input-wrapper .twm-autocomplete-field__input {
|
|
1192
|
+
flex: 1 1 auto;
|
|
1193
|
+
background-color: transparent !important;
|
|
1194
|
+
color: var(--text-body);
|
|
1195
|
+
border: none !important;
|
|
1196
|
+
border-radius: 0 !important;
|
|
1197
|
+
padding: var(--space-sm) 10px;
|
|
1198
|
+
font-size: var(--font-size-sm);
|
|
1199
|
+
font-family: 'Courier New', Courier, monospace;
|
|
1200
|
+
outline: none;
|
|
1201
|
+
margin: 0 !important;
|
|
1202
|
+
box-sizing: border-box;
|
|
1203
|
+
min-width: 0;
|
|
1204
|
+
box-shadow: none !important;
|
|
1205
|
+
}
|
|
1206
|
+
.twm-autocomplete-field__input-wrapper .twm-autocomplete-field__input:focus {
|
|
1207
|
+
outline: none;
|
|
1208
|
+
border: none !important;
|
|
1209
|
+
box-shadow: none !important;
|
|
1210
|
+
}
|
|
1211
|
+
.twm-autocomplete-field__namespace {
|
|
1212
|
+
display: inline-flex;
|
|
1213
|
+
align-items: center;
|
|
1214
|
+
padding: var(--space-xxs) 8px;
|
|
1215
|
+
font-size: var(--font-size-xs);
|
|
1216
|
+
color: #c7f1ff;
|
|
1217
|
+
background: rgba(0, 122, 204, 0.18);
|
|
1218
|
+
border: 1px solid rgba(0, 122, 204, 0.35);
|
|
1219
|
+
border-radius: var(--radius-pill);
|
|
1220
|
+
white-space: nowrap;
|
|
1221
|
+
text-transform: none;
|
|
1222
|
+
cursor: default;
|
|
1223
|
+
box-shadow: inset 0 0 0 1px rgba(0, 122, 204, 0.15);
|
|
1224
|
+
}
|
|
1225
|
+
.twm-autocomplete-field__namespace--toggle {
|
|
1226
|
+
cursor: pointer;
|
|
1227
|
+
background: linear-gradient(90deg, rgba(0, 122, 204, 0.24) 0%, rgba(0, 122, 204, 0.12) 100%);
|
|
1228
|
+
transition: background var(--transition-fast), color var(--transition-fast), border-color var(--transition-fast);
|
|
1229
|
+
border: 1px solid rgba(0, 122, 204, 0.5);
|
|
1230
|
+
color: #e7f5ff;
|
|
1231
|
+
outline: none;
|
|
1232
|
+
}
|
|
1233
|
+
.twm-autocomplete-field__namespace--toggle[data-scope="all"] {
|
|
1234
|
+
background: linear-gradient(90deg, rgba(255, 140, 0, 0.35) 0%, rgba(255, 196, 0, 0.18) 100%);
|
|
1235
|
+
border-color: rgba(255, 196, 0, 0.6);
|
|
1236
|
+
color: #fff5dc;
|
|
1237
|
+
}
|
|
1238
|
+
.twm-autocomplete-field--scope-all .twm-autocomplete-field__input-wrapper {
|
|
1239
|
+
border-color: rgba(255, 196, 0, 0.55);
|
|
1240
|
+
box-shadow: inset 0 0 0 1px rgba(255, 196, 0, 0.25);
|
|
1241
|
+
}
|
|
1242
|
+
/* Variable autocomplete dropdown - matches legacy .variable-dropdown */
|
|
1243
|
+
.twm-autocomplete-field__dropdown {
|
|
1244
|
+
position: fixed;
|
|
1245
|
+
z-index: 10000000;
|
|
1246
|
+
background: #2a2a2a;
|
|
1247
|
+
border: 1px solid #444;
|
|
1248
|
+
border-radius: var(--radius-sm);
|
|
1249
|
+
max-height: 300px;
|
|
1250
|
+
overflow-y: auto;
|
|
1251
|
+
display: none;
|
|
1252
|
+
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.5);
|
|
1253
|
+
}
|
|
1254
|
+
.twm-autocomplete-field__item {
|
|
1255
|
+
display: flex;
|
|
1256
|
+
align-items: center;
|
|
1257
|
+
gap: var(--space-md);
|
|
1258
|
+
padding: var(--space-md) 12px;
|
|
1259
|
+
cursor: pointer;
|
|
1260
|
+
font-size: var(--font-size-md);
|
|
1261
|
+
color: #ddd;
|
|
1262
|
+
transition: background-color var(--transition-normal);
|
|
1263
|
+
}
|
|
1264
|
+
.twm-autocomplete-field__item:hover {
|
|
1265
|
+
background-color: #3a3a3a;
|
|
1266
|
+
}
|
|
1267
|
+
.twm-autocomplete-field__icon {
|
|
1268
|
+
font-size: var(--font-size-2xl);
|
|
1269
|
+
color: var(--text-muted);
|
|
1270
|
+
flex-shrink: 0;
|
|
1271
|
+
}
|
|
1272
|
+
/* Type-specific icon colors */
|
|
1273
|
+
.twm-autocomplete-field__item[data-type="constant"] .twm-autocomplete-field__icon { color: #4ec9b0; }
|
|
1274
|
+
.twm-autocomplete-field__item[data-type="parameter"] .twm-autocomplete-field__icon,
|
|
1275
|
+
.twm-autocomplete-field__item[data-type="param"] .twm-autocomplete-field__icon { color: #ce9178; }
|
|
1276
|
+
.twm-autocomplete-field__item[data-type="function"] .twm-autocomplete-field__icon { color: #dcdcaa; }
|
|
1277
|
+
.twm-autocomplete-field__item[data-type="stock"] .twm-autocomplete-field__icon { color: #569cd6; }
|
|
1278
|
+
.twm-autocomplete-field__item[data-type="flow"] .twm-autocomplete-field__icon { color: #c586c0; }
|
|
1279
|
+
.twm-autocomplete-field__item[data-type="operation"] .twm-autocomplete-field__icon { color: #9cdcfe; }
|
|
1280
|
+
.twm-autocomplete-field__item[data-type="variable"] .twm-autocomplete-field__icon { color: #4fc1ff; }
|
|
1281
|
+
.twm-autocomplete-field__label {
|
|
1282
|
+
flex: 1;
|
|
1283
|
+
overflow: hidden;
|
|
1284
|
+
text-overflow: ellipsis;
|
|
1285
|
+
white-space: nowrap;
|
|
1286
|
+
}
|
|
1287
|
+
.twm-autocomplete-field__namespace-indicator {
|
|
1288
|
+
color: #6a9fb5;
|
|
1289
|
+
font-size: 10px;
|
|
1290
|
+
flex-shrink: 0;
|
|
1291
|
+
padding: 1px 5px;
|
|
1292
|
+
background: rgba(106, 159, 181, 0.15);
|
|
1293
|
+
border-radius: var(--radius-sm);
|
|
1294
|
+
margin-left: var(--space-sm);
|
|
1295
|
+
}
|
|
1296
|
+
.twm-autocomplete-field__badge {
|
|
1297
|
+
color: var(--text-muted);
|
|
1298
|
+
font-size: var(--font-size-xs);
|
|
1299
|
+
flex-shrink: 0;
|
|
1300
|
+
}
|
|
1301
|
+
.twm-autocomplete-field__helper {
|
|
1302
|
+
margin-top: var(--space-xs);
|
|
1303
|
+
}
|
|
1304
|
+
/* Legacy variable variant - simple clean styling */
|
|
1305
|
+
.twm-autocomplete-field--legacy-variable .twm-autocomplete-field__input-wrapper {
|
|
1306
|
+
border-color: var(--var-border, #d33682);
|
|
1307
|
+
}
|
|
1308
|
+
.twm-autocomplete-field--legacy-variable .twm-autocomplete-field__input-wrapper:focus-within {
|
|
1309
|
+
border-color: var(--var-focus, #e85ba7);
|
|
1310
|
+
box-shadow: 0 0 3px rgba(211, 54, 130, 0.3);
|
|
1311
|
+
}
|
|
1312
|
+
.twm-autocomplete-field--legacy-variable .twm-autocomplete-field__input {
|
|
1313
|
+
font-family: 'Courier New', Courier, monospace;
|
|
1314
|
+
color: var(--text-body);
|
|
1315
|
+
}
|
|
1316
|
+
.twm-autocomplete-field--disabled .twm-autocomplete-field__input {
|
|
1317
|
+
background-color: #1a1a1c;
|
|
1318
|
+
color: #8c8c8c;
|
|
1319
|
+
cursor: not-allowed;
|
|
1320
|
+
opacity: 0.8;
|
|
1321
|
+
}
|
|
1322
|
+
/* Config Hint: Small hint text below inputs */
|
|
1323
|
+
.twm-config-hint {
|
|
1324
|
+
display: block;
|
|
1325
|
+
font-size: var(--font-size-sm);
|
|
1326
|
+
color: var(--text-muted);
|
|
1327
|
+
font-style: italic;
|
|
1328
|
+
margin-top: var(--space-xs);
|
|
1329
|
+
}
|
|
1330
|
+
/* Give autocomplete helper text more breathing room to avoid overlapping adjacent inputs */
|
|
1331
|
+
.twm-autocomplete-field__helper.twm-config-hint {
|
|
1332
|
+
min-height: 28px;
|
|
1333
|
+
line-height: 1.35;
|
|
1334
|
+
margin-top: var(--space-sm);
|
|
1335
|
+
}
|
|
1336
|
+
.twm-context-menu {
|
|
1337
|
+
position: absolute;
|
|
1338
|
+
/* Positioned relative to .container; keep absolute but ensure it overlays other content */
|
|
1339
|
+
background: var(--surface-0);
|
|
1340
|
+
color: var(--text-body);
|
|
1341
|
+
border: 1px solid var(--surface-3);
|
|
1342
|
+
border-radius: var(--radius-md);
|
|
1343
|
+
box-shadow: 0 6px 24px rgba(0,0,0,0.45);
|
|
1344
|
+
z-index: 5000; /* Higher than nodes and selection rectangle */
|
|
1345
|
+
display: none;
|
|
1346
|
+
pointer-events: auto;
|
|
1347
|
+
min-width: 180px;
|
|
1348
|
+
padding: var(--space-sm) 0;
|
|
1349
|
+
backdrop-filter: saturate(120%) blur(2px);
|
|
1350
|
+
}
|
|
1351
|
+
.twm-context-menu-item {
|
|
1352
|
+
padding: var(--space-md) 14px;
|
|
1353
|
+
cursor: pointer;
|
|
1354
|
+
font-family: Segoe UI, Arial, sans-serif;
|
|
1355
|
+
font-size: var(--font-size-md);
|
|
1356
|
+
line-height: 1.2;
|
|
1357
|
+
display: flex;
|
|
1358
|
+
align-items: center;
|
|
1359
|
+
gap: 10px;
|
|
1360
|
+
}
|
|
1361
|
+
.twm-context-menu-item:hover {
|
|
1362
|
+
background: #2a2a2a;
|
|
1363
|
+
}
|
|
1364
|
+
.twm-context-menu-item.twm-delete-node {
|
|
1365
|
+
color: #ff6b6b;
|
|
1366
|
+
}
|
|
1367
|
+
/* Reliable bottom spacing for config hints even when margins collapse */
|
|
1368
|
+
.twm-config-hint::after {
|
|
1369
|
+
content: "";
|
|
1370
|
+
display: block;
|
|
1371
|
+
height: 6px; /* effective bottom gap */
|
|
1372
|
+
}
|
|
1373
|
+
/* Window Chrome and Resize Handles */
|
|
1374
|
+
.twm-resize-handle {
|
|
1375
|
+
position: fixed;
|
|
1376
|
+
z-index: 9999;
|
|
1377
|
+
opacity: 0;
|
|
1378
|
+
transition: opacity 0.2s ease;
|
|
1379
|
+
}
|
|
1380
|
+
.twm-resize-handle:hover {
|
|
1381
|
+
opacity: 0.3;
|
|
1382
|
+
}
|
|
1383
|
+
/* Hide resize handles when maximized */
|
|
1384
|
+
body.twm-window-maximized .twm-resize-handle {
|
|
1385
|
+
display: none;
|
|
1386
|
+
}
|
|
1387
|
+
/* Shared sidebar controls (filter + icon buttons) - used by data, functions, etc. */
|
|
1388
|
+
.twm-sidebar-controls {
|
|
1389
|
+
display: flex;
|
|
1390
|
+
align-items: center;
|
|
1391
|
+
gap: var(--space-xs);
|
|
1392
|
+
padding: var(--space-xs) 8px;
|
|
1393
|
+
border-bottom: 1px solid var(--surface-3);
|
|
1394
|
+
flex-shrink: 0;
|
|
1395
|
+
background: var(--surface-1);
|
|
1396
|
+
}
|
|
1397
|
+
.twm-sidebar-controls .twm-sidebar-search-icon {
|
|
1398
|
+
font-size: var(--font-size-lg);
|
|
1399
|
+
color: var(--text-muted);
|
|
1400
|
+
}
|
|
1401
|
+
.twm-sidebar-controls .twm-data-page__search {
|
|
1402
|
+
flex: 1;
|
|
1403
|
+
min-width: 0;
|
|
1404
|
+
background: transparent;
|
|
1405
|
+
border: none;
|
|
1406
|
+
outline: none;
|
|
1407
|
+
color: var(--text-secondary);
|
|
1408
|
+
font-size: var(--font-size-sm);
|
|
1409
|
+
font-family: inherit;
|
|
1410
|
+
padding: var(--space-xxs) 0;
|
|
1411
|
+
}
|
|
1412
|
+
.twm-sidebar-controls .twm-data-page__search::placeholder {
|
|
1413
|
+
color: var(--text-muted);
|
|
1414
|
+
}
|
|
1415
|
+
/* NOTE: Native scrollbar is hidden - using overlay scrollbar system instead */
|
|
1416
|
+
|
|
1417
|
+
#data-page #data-series-view .twm-preview-table-wrap {
|
|
1418
|
+
flex: 1;
|
|
1419
|
+
min-height: 0;
|
|
1420
|
+
min-width: 0; /* Allow shrinking below content width for overflow to work */
|
|
1421
|
+
overflow: auto;
|
|
1422
|
+
max-height: none;
|
|
1423
|
+
}
|
|
1424
|
+
/* Hide native scrollbar - overlay scrollbar provides the UI */
|
|
1425
|
+
#data-page #data-series-view .twm-preview-table-wrap::-webkit-scrollbar {
|
|
1426
|
+
width: 0;
|
|
1427
|
+
height: 0;
|
|
1428
|
+
}
|
|
1429
|
+
#data-page #data-series-view .twm-preview-table-wrap {
|
|
1430
|
+
scrollbar-width: none; /* Firefox */
|
|
1431
|
+
-ms-overflow-style: none; /* IE/Edge */
|
|
1432
|
+
}
|
|
1433
|
+
/* Pagination Controls */
|
|
1434
|
+
.twm-pagination-controls {
|
|
1435
|
+
display: flex;
|
|
1436
|
+
align-items: center;
|
|
1437
|
+
gap: var(--space-lg);
|
|
1438
|
+
padding: var(--space-md) 0;
|
|
1439
|
+
border-bottom: 1px solid #2a2a2a;
|
|
1440
|
+
font-size: var(--font-size-sm);
|
|
1441
|
+
position: relative; /* anchor for overlay scrollbar */
|
|
1442
|
+
overflow-x: auto; /* allow horizontal scroll on narrow viewports */
|
|
1443
|
+
overflow-y: hidden;
|
|
1444
|
+
scrollbar-width: none; /* Firefox: hide native scrollbar */
|
|
1445
|
+
-ms-overflow-style: none; /* IE/Edge legacy */
|
|
1446
|
+
}
|
|
1447
|
+
.twm-pagination-controls::-webkit-scrollbar {
|
|
1448
|
+
height: 0; /* Chrome/Edge: hide native scrollbar */
|
|
1449
|
+
}
|
|
1450
|
+
.twm-pagination-btn {
|
|
1451
|
+
padding: var(--space-xs) 8px;
|
|
1452
|
+
min-width: 32px;
|
|
1453
|
+
height: 28px;
|
|
1454
|
+
display: inline-flex;
|
|
1455
|
+
align-items: center;
|
|
1456
|
+
justify-content: center;
|
|
1457
|
+
}
|
|
1458
|
+
.twm-pagination-btn:disabled {
|
|
1459
|
+
opacity: 0.3;
|
|
1460
|
+
cursor: not-allowed;
|
|
1461
|
+
}
|
|
1462
|
+
/* Preview Table Styles - Essential for data view */
|
|
1463
|
+
.twm-preview-table-wrap {
|
|
1464
|
+
overflow: auto;
|
|
1465
|
+
border: 1px solid #2a2a2a;
|
|
1466
|
+
border-radius: var(--radius-sm);
|
|
1467
|
+
}
|
|
1468
|
+
.twm-preview-table {
|
|
1469
|
+
width: 100%;
|
|
1470
|
+
border-collapse: separate;
|
|
1471
|
+
border-spacing: 0;
|
|
1472
|
+
font-size: var(--font-size-sm);
|
|
1473
|
+
}
|
|
1474
|
+
.twm-preview-table th, .twm-preview-table td {
|
|
1475
|
+
border-bottom: 1px solid #2a2a2a;
|
|
1476
|
+
padding: var(--space-sm) 8px;
|
|
1477
|
+
white-space: nowrap;
|
|
1478
|
+
}
|
|
1479
|
+
.twm-preview-table th {
|
|
1480
|
+
position: sticky;
|
|
1481
|
+
top: 0;
|
|
1482
|
+
background: #222;
|
|
1483
|
+
color: #aaa;
|
|
1484
|
+
font-weight: 600;
|
|
1485
|
+
z-index: 3;
|
|
1486
|
+
box-shadow: inset 0 -1px 0 #2a2a2a;
|
|
1487
|
+
}
|
|
1488
|
+
/* Header icons for simulation result variables */
|
|
1489
|
+
.twm-preview-table th .twm-header-icon {
|
|
1490
|
+
font-size: var(--font-size-xl);
|
|
1491
|
+
vertical-align: middle;
|
|
1492
|
+
margin-right: var(--space-xs);
|
|
1493
|
+
opacity: 0.7;
|
|
1494
|
+
}
|
|
1495
|
+
.twm-preview-table th .twm-header-icon[title="time"] {
|
|
1496
|
+
color: #6c71c4; /* Purple for time */
|
|
1497
|
+
}
|
|
1498
|
+
.twm-preview-table th .twm-header-icon[title="stock"] {
|
|
1499
|
+
color: #cb4b16; /* Orange for stocks */
|
|
1500
|
+
}
|
|
1501
|
+
.twm-preview-table th .twm-header-icon[title="flow"] {
|
|
1502
|
+
color: #268bd2; /* Blue for flows */
|
|
1503
|
+
}
|
|
1504
|
+
.twm-preview-table th .twm-header-icon[title="indicator"] {
|
|
1505
|
+
color: #859900; /* Green for indicators */
|
|
1506
|
+
}
|
|
1507
|
+
/* DataTable filter row */
|
|
1508
|
+
.twm-preview-table .twm-data-table__filter-row th {
|
|
1509
|
+
position: sticky;
|
|
1510
|
+
top: 32px;
|
|
1511
|
+
background: var(--surface-0);
|
|
1512
|
+
padding: var(--space-xs) 4px 6px;
|
|
1513
|
+
box-shadow: inset 0 -1px 0 var(--border-strong);
|
|
1514
|
+
z-index: 2;
|
|
1515
|
+
font-weight: normal;
|
|
1516
|
+
color: #ccc;
|
|
1517
|
+
}
|
|
1518
|
+
.twm-data-table__filter-wrapper {
|
|
1519
|
+
display: flex;
|
|
1520
|
+
align-items: center;
|
|
1521
|
+
gap: var(--space-xxs);
|
|
1522
|
+
}
|
|
1523
|
+
.twm-data-table__filter-input {
|
|
1524
|
+
flex: 1;
|
|
1525
|
+
min-width: 0;
|
|
1526
|
+
padding: 3px 6px;
|
|
1527
|
+
background: #2a2a2a;
|
|
1528
|
+
color: #ccc;
|
|
1529
|
+
border: 1px solid #3a3a3a;
|
|
1530
|
+
border-radius: var(--radius-sm);
|
|
1531
|
+
font-size: var(--font-size-xs);
|
|
1532
|
+
font-family: inherit;
|
|
1533
|
+
outline: none;
|
|
1534
|
+
box-sizing: border-box;
|
|
1535
|
+
}
|
|
1536
|
+
.twm-data-table__filter-input:focus {
|
|
1537
|
+
border-color: #569cd6;
|
|
1538
|
+
background: #252525;
|
|
1539
|
+
}
|
|
1540
|
+
.twm-data-table__filter-input::placeholder {
|
|
1541
|
+
color: var(--text-dim);
|
|
1542
|
+
font-style: italic;
|
|
1543
|
+
}
|
|
1544
|
+
.twm-data-table__filter-dropdown-btn,
|
|
1545
|
+
.twm-data-table__filter-clear {
|
|
1546
|
+
flex-shrink: 0;
|
|
1547
|
+
background: transparent;
|
|
1548
|
+
border: none;
|
|
1549
|
+
color: var(--text-muted);
|
|
1550
|
+
cursor: pointer;
|
|
1551
|
+
padding: var(--space-xxs);
|
|
1552
|
+
display: flex;
|
|
1553
|
+
align-items: center;
|
|
1554
|
+
justify-content: center;
|
|
1555
|
+
border-radius: 2px;
|
|
1556
|
+
line-height: 1;
|
|
1557
|
+
}
|
|
1558
|
+
.twm-data-table__filter-dropdown-btn:hover,
|
|
1559
|
+
.twm-data-table__filter-clear:hover {
|
|
1560
|
+
color: #ccc;
|
|
1561
|
+
background: rgba(255, 255, 255, 0.08);
|
|
1562
|
+
}
|
|
1563
|
+
/* Filter dropdown panel */
|
|
1564
|
+
.twm-data-table__filter-dropdown {
|
|
1565
|
+
position: fixed;
|
|
1566
|
+
z-index: 10001;
|
|
1567
|
+
background: var(--surface-0);
|
|
1568
|
+
border: 1px solid var(--surface-3);
|
|
1569
|
+
border-radius: var(--radius-md);
|
|
1570
|
+
box-shadow: 0 6px 24px rgba(0, 0, 0, 0.45);
|
|
1571
|
+
padding: var(--space-lg);
|
|
1572
|
+
min-width: 200px;
|
|
1573
|
+
display: flex;
|
|
1574
|
+
flex-direction: column;
|
|
1575
|
+
gap: var(--space-md);
|
|
1576
|
+
}
|
|
1577
|
+
.twm-data-table__filter-dropdown-label {
|
|
1578
|
+
display: block;
|
|
1579
|
+
font-size: var(--font-size-xs);
|
|
1580
|
+
color: #aaa;
|
|
1581
|
+
margin-bottom: var(--space-xxs);
|
|
1582
|
+
}
|
|
1583
|
+
.twm-data-table__filter-dropdown-select,
|
|
1584
|
+
.twm-data-table__filter-dropdown-input {
|
|
1585
|
+
width: 100%;
|
|
1586
|
+
padding: 5px 8px;
|
|
1587
|
+
background: #2a2a2a;
|
|
1588
|
+
color: #ccc;
|
|
1589
|
+
border: 1px solid #3a3a3a;
|
|
1590
|
+
border-radius: var(--radius-sm);
|
|
1591
|
+
font-size: var(--font-size-sm);
|
|
1592
|
+
font-family: inherit;
|
|
1593
|
+
outline: none;
|
|
1594
|
+
box-sizing: border-box;
|
|
1595
|
+
}
|
|
1596
|
+
.twm-data-table__filter-dropdown-select:focus,
|
|
1597
|
+
.twm-data-table__filter-dropdown-input:focus {
|
|
1598
|
+
border-color: #569cd6;
|
|
1599
|
+
}
|
|
1600
|
+
.twm-data-table__filter-dropdown-select {
|
|
1601
|
+
appearance: auto;
|
|
1602
|
+
cursor: pointer;
|
|
1603
|
+
}
|
|
1604
|
+
.twm-data-table__filter-dropdown-between {
|
|
1605
|
+
display: flex;
|
|
1606
|
+
flex-direction: column;
|
|
1607
|
+
gap: var(--space-xs);
|
|
1608
|
+
}
|
|
1609
|
+
.twm-data-table__filter-dropdown-actions {
|
|
1610
|
+
display: flex;
|
|
1611
|
+
justify-content: space-between;
|
|
1612
|
+
gap: var(--space-md);
|
|
1613
|
+
margin-top: var(--space-xs);
|
|
1614
|
+
}
|
|
1615
|
+
.twm-data-table__filter-dropdown-btn-action {
|
|
1616
|
+
flex: 1;
|
|
1617
|
+
padding: 5px 12px;
|
|
1618
|
+
border: 1px solid #3a3a3a;
|
|
1619
|
+
border-radius: var(--radius-sm);
|
|
1620
|
+
font-size: var(--font-size-xs);
|
|
1621
|
+
cursor: pointer;
|
|
1622
|
+
text-align: center;
|
|
1623
|
+
}
|
|
1624
|
+
.twm-data-table__filter-dropdown-btn-action--clear {
|
|
1625
|
+
background: transparent;
|
|
1626
|
+
color: #aaa;
|
|
1627
|
+
}
|
|
1628
|
+
.twm-data-table__filter-dropdown-btn-action--clear:hover {
|
|
1629
|
+
background: rgba(255, 255, 255, 0.06);
|
|
1630
|
+
color: #ccc;
|
|
1631
|
+
}
|
|
1632
|
+
.twm-data-table__filter-dropdown-btn-action--apply {
|
|
1633
|
+
background: var(--accent);
|
|
1634
|
+
color: var(--text-bright);
|
|
1635
|
+
border-color: var(--accent);
|
|
1636
|
+
}
|
|
1637
|
+
.twm-data-table__filter-dropdown-btn-action--apply:hover {
|
|
1638
|
+
background: var(--accent-hover);
|
|
1639
|
+
}
|
|
1640
|
+
.twm-preview-table tr:hover td {
|
|
1641
|
+
background: rgba(255,255,255,0.04);
|
|
1642
|
+
}
|
|
1643
|
+
/* Time column (first column) styling */
|
|
1644
|
+
.twm-preview-table th:first-child,
|
|
1645
|
+
.twm-preview-table td:first-child {
|
|
1646
|
+
width: 150px;
|
|
1647
|
+
min-width: 150px;
|
|
1648
|
+
max-width: 150px;
|
|
1649
|
+
font-weight: 500;
|
|
1650
|
+
color: #bbb;
|
|
1651
|
+
}
|
|
1652
|
+
/* Data columns have flexible width */
|
|
1653
|
+
.twm-preview-table th:not(:first-child),
|
|
1654
|
+
.twm-preview-table td:not(:first-child) {
|
|
1655
|
+
width: auto;
|
|
1656
|
+
min-width: 80px;
|
|
1657
|
+
}
|
|
1658
|
+
.twm-expression-modal__meta {
|
|
1659
|
+
font-size: var(--font-size-xs);
|
|
1660
|
+
color: var(--text-muted);
|
|
1661
|
+
margin-top: var(--space-xs);
|
|
1662
|
+
}
|
|
1663
|
+
.twm-expression-modal__editor {
|
|
1664
|
+
flex: 1;
|
|
1665
|
+
min-height: 200px;
|
|
1666
|
+
max-height: 400px;
|
|
1667
|
+
resize: vertical;
|
|
1668
|
+
border: none;
|
|
1669
|
+
background: #0d0d0d;
|
|
1670
|
+
color: #f0f0f0;
|
|
1671
|
+
font-family: 'Consolas', 'Monaco', 'Courier New', monospace;
|
|
1672
|
+
font-size: var(--font-size-md);
|
|
1673
|
+
line-height: 1.6;
|
|
1674
|
+
padding: var(--space-lg) 16px;
|
|
1675
|
+
border-radius: 0 0 8px 8px;
|
|
1676
|
+
}
|
|
1677
|
+
.twm-expression-modal__editor:focus {
|
|
1678
|
+
outline: none;
|
|
1679
|
+
box-shadow: inset 0 0 0 1px var(--accent);
|
|
1680
|
+
}
|
|
1681
|
+
/* Expression modal window content (for ManagedWindow) */
|
|
1682
|
+
.twm-expression-modal__window-content {
|
|
1683
|
+
display: flex;
|
|
1684
|
+
flex-direction: column;
|
|
1685
|
+
height: 100%;
|
|
1686
|
+
position: relative;
|
|
1687
|
+
}
|
|
1688
|
+
.twm-expression-modal__editor-container {
|
|
1689
|
+
flex: 1;
|
|
1690
|
+
min-height: 0;
|
|
1691
|
+
display: flex;
|
|
1692
|
+
flex-direction: column;
|
|
1693
|
+
}
|
|
1694
|
+
/* Saved indicator - appears in bottom right after autosave */
|
|
1695
|
+
.twm-expression-modal__saved-indicator {
|
|
1696
|
+
position: absolute;
|
|
1697
|
+
bottom: 8px;
|
|
1698
|
+
right: 12px;
|
|
1699
|
+
padding: var(--space-xs) 10px;
|
|
1700
|
+
background: rgba(34, 139, 34, 0.9);
|
|
1701
|
+
color: var(--text-bright);
|
|
1702
|
+
font-size: var(--font-size-sm);
|
|
1703
|
+
font-weight: 500;
|
|
1704
|
+
border-radius: var(--radius-sm);
|
|
1705
|
+
opacity: 0;
|
|
1706
|
+
transform: translateY(4px);
|
|
1707
|
+
transition: opacity 0.2s ease, transform 0.2s ease;
|
|
1708
|
+
pointer-events: none;
|
|
1709
|
+
z-index: var(--z-sticky);
|
|
1710
|
+
}
|
|
1711
|
+
.twm-expression-modal__saved-indicator--visible {
|
|
1712
|
+
opacity: 1;
|
|
1713
|
+
transform: translateY(0);
|
|
1714
|
+
}
|
|
1715
|
+
/* ============================================================================
|
|
1716
|
+
Tree View Component - Reusable hierarchical tree styles
|
|
1717
|
+
Used by: Functions Page, Data Page, and other hierarchical browsers
|
|
1718
|
+
============================================================================ */
|
|
1719
|
+
|
|
1720
|
+
.twm-tree-view {
|
|
1721
|
+
display: flex;
|
|
1722
|
+
flex-direction: column;
|
|
1723
|
+
gap: var(--space-xxs);
|
|
1724
|
+
}
|
|
1725
|
+
/* Tree Category (top-level collapsible section) */
|
|
1726
|
+
.twm-tree-category {
|
|
1727
|
+
user-select: none;
|
|
1728
|
+
}
|
|
1729
|
+
.twm-tree-category > .twm-collapsible-header {
|
|
1730
|
+
display: flex;
|
|
1731
|
+
align-items: center;
|
|
1732
|
+
gap: var(--space-xs);
|
|
1733
|
+
padding: 3px 8px;
|
|
1734
|
+
height: 25px;
|
|
1735
|
+
box-sizing: border-box;
|
|
1736
|
+
font-size: var(--font-size-sm);
|
|
1737
|
+
font-weight: 500;
|
|
1738
|
+
cursor: pointer;
|
|
1739
|
+
color: #ccc;
|
|
1740
|
+
}
|
|
1741
|
+
.twm-tree-category > .twm-collapsible-header:hover {
|
|
1742
|
+
background: rgba(255, 255, 255, 0.05);
|
|
1743
|
+
}
|
|
1744
|
+
.twm-tree-category__icon {
|
|
1745
|
+
width: 18px;
|
|
1746
|
+
height: 18px;
|
|
1747
|
+
display: flex;
|
|
1748
|
+
align-items: center;
|
|
1749
|
+
justify-content: center;
|
|
1750
|
+
flex-shrink: 0;
|
|
1751
|
+
}
|
|
1752
|
+
.twm-tree-category__label {
|
|
1753
|
+
flex: 1;
|
|
1754
|
+
white-space: nowrap;
|
|
1755
|
+
overflow: hidden;
|
|
1756
|
+
text-overflow: ellipsis;
|
|
1757
|
+
}
|
|
1758
|
+
.twm-tree-category__count {
|
|
1759
|
+
font-size: 10px;
|
|
1760
|
+
color: var(--text-dim);
|
|
1761
|
+
font-weight: normal;
|
|
1762
|
+
margin-left: auto;
|
|
1763
|
+
}
|
|
1764
|
+
.twm-tree-category > .twm-collapsible-content {
|
|
1765
|
+
padding-left: var(--space-md);
|
|
1766
|
+
}
|
|
1767
|
+
/* Tree Node (expandable container with children) */
|
|
1768
|
+
.twm-tree-node {
|
|
1769
|
+
user-select: none;
|
|
1770
|
+
}
|
|
1771
|
+
.twm-tree-node__header {
|
|
1772
|
+
display: flex;
|
|
1773
|
+
align-items: center;
|
|
1774
|
+
gap: var(--space-xxs);
|
|
1775
|
+
padding: 5px 8px;
|
|
1776
|
+
box-sizing: border-box;
|
|
1777
|
+
cursor: pointer;
|
|
1778
|
+
font-size: var(--font-size-sm);
|
|
1779
|
+
color: #ccc;
|
|
1780
|
+
border-left: 2px solid transparent;
|
|
1781
|
+
border-bottom: 1px solid rgba(255, 255, 255, 0.05);
|
|
1782
|
+
transition: background 0.16s ease, border-color 0.16s ease;
|
|
1783
|
+
}
|
|
1784
|
+
.twm-tree-node__header:hover {
|
|
1785
|
+
background: rgba(255, 255, 255, 0.04);
|
|
1786
|
+
}
|
|
1787
|
+
.twm-tree-node__toggle {
|
|
1788
|
+
width: 16px;
|
|
1789
|
+
height: 16px;
|
|
1790
|
+
display: flex;
|
|
1791
|
+
align-items: center;
|
|
1792
|
+
justify-content: center;
|
|
1793
|
+
flex-shrink: 0;
|
|
1794
|
+
}
|
|
1795
|
+
.twm-tree-node__icon {
|
|
1796
|
+
width: 16px;
|
|
1797
|
+
height: 16px;
|
|
1798
|
+
display: flex;
|
|
1799
|
+
align-items: center;
|
|
1800
|
+
justify-content: center;
|
|
1801
|
+
flex-shrink: 0;
|
|
1802
|
+
}
|
|
1803
|
+
.twm-tree-node__label {
|
|
1804
|
+
flex: 1;
|
|
1805
|
+
white-space: nowrap;
|
|
1806
|
+
overflow: hidden;
|
|
1807
|
+
text-overflow: ellipsis;
|
|
1808
|
+
}
|
|
1809
|
+
.twm-tree-node__count {
|
|
1810
|
+
font-size: 10px;
|
|
1811
|
+
color: var(--text-dim);
|
|
1812
|
+
margin-left: var(--space-xs);
|
|
1813
|
+
}
|
|
1814
|
+
.twm-tree-node__children {
|
|
1815
|
+
padding-left: var(--space-xl);
|
|
1816
|
+
}
|
|
1817
|
+
.twm-tree-node__actions {
|
|
1818
|
+
display: none;
|
|
1819
|
+
gap: var(--space-xxs);
|
|
1820
|
+
margin-left: auto;
|
|
1821
|
+
}
|
|
1822
|
+
.twm-tree-node__header:hover .twm-tree-node__actions {
|
|
1823
|
+
display: flex;
|
|
1824
|
+
}
|
|
1825
|
+
.twm-tree-node__action-btn {
|
|
1826
|
+
display: flex;
|
|
1827
|
+
align-items: center;
|
|
1828
|
+
justify-content: center;
|
|
1829
|
+
width: 20px;
|
|
1830
|
+
height: 20px;
|
|
1831
|
+
padding: 0;
|
|
1832
|
+
border: none;
|
|
1833
|
+
background: transparent;
|
|
1834
|
+
border-radius: var(--radius-sm);
|
|
1835
|
+
color: var(--text-muted);
|
|
1836
|
+
cursor: pointer;
|
|
1837
|
+
}
|
|
1838
|
+
.twm-tree-node__action-btn:hover {
|
|
1839
|
+
background: rgba(255, 255, 255, 0.1);
|
|
1840
|
+
color: #ccc;
|
|
1841
|
+
}
|
|
1842
|
+
/* Tree Item (leaf node) */
|
|
1843
|
+
.twm-tree-item {
|
|
1844
|
+
display: flex;
|
|
1845
|
+
align-items: center;
|
|
1846
|
+
gap: var(--space-xs);
|
|
1847
|
+
padding: 5px 8px 5px 22px;
|
|
1848
|
+
cursor: pointer;
|
|
1849
|
+
font-size: var(--font-size-sm);
|
|
1850
|
+
color: #ccc;
|
|
1851
|
+
user-select: none;
|
|
1852
|
+
border-left: 2px solid transparent;
|
|
1853
|
+
border-bottom: 1px solid rgba(255, 255, 255, 0.05);
|
|
1854
|
+
transition: background 0.16s ease, border-color 0.16s ease;
|
|
1855
|
+
}
|
|
1856
|
+
.twm-tree-item:last-child {
|
|
1857
|
+
border-bottom: none;
|
|
1858
|
+
}
|
|
1859
|
+
.twm-tree-item:hover {
|
|
1860
|
+
background: rgba(255, 255, 255, 0.04);
|
|
1861
|
+
}
|
|
1862
|
+
.twm-tree-item.twm-filter-match {
|
|
1863
|
+
background: rgba(255, 200, 0, 0.1);
|
|
1864
|
+
}
|
|
1865
|
+
.twm-tree-item__icon {
|
|
1866
|
+
width: 14px;
|
|
1867
|
+
height: 14px;
|
|
1868
|
+
display: flex;
|
|
1869
|
+
align-items: center;
|
|
1870
|
+
justify-content: center;
|
|
1871
|
+
flex-shrink: 0;
|
|
1872
|
+
}
|
|
1873
|
+
.twm-tree-item__icon--symbol {
|
|
1874
|
+
font-family: 'Courier New', monospace;
|
|
1875
|
+
font-style: italic;
|
|
1876
|
+
font-weight: 600;
|
|
1877
|
+
font-size: var(--font-size-xs);
|
|
1878
|
+
color: #9a3a12;
|
|
1879
|
+
}
|
|
1880
|
+
.twm-tree-item__label {
|
|
1881
|
+
flex: 1;
|
|
1882
|
+
white-space: nowrap;
|
|
1883
|
+
overflow: hidden;
|
|
1884
|
+
text-overflow: ellipsis;
|
|
1885
|
+
}
|
|
1886
|
+
.twm-tree-item__subtitle {
|
|
1887
|
+
font-size: 10px;
|
|
1888
|
+
color: var(--text-dim);
|
|
1889
|
+
margin-left: var(--space-xs);
|
|
1890
|
+
}
|
|
1891
|
+
/* ═══════════════════════════════════════════════════════════════════════════
|
|
1892
|
+
Plot Popout Window
|
|
1893
|
+
═══════════════════════════════════════════════════════════════════════════ */
|
|
1894
|
+
|
|
1895
|
+
.twm-plot-window-container {
|
|
1896
|
+
display: flex;
|
|
1897
|
+
flex-direction: column;
|
|
1898
|
+
height: 100%;
|
|
1899
|
+
background: #1a1a1a;
|
|
1900
|
+
position: relative;
|
|
1901
|
+
}
|
|
1902
|
+
.twm-plot-window-container .twm-code-tabs-header {
|
|
1903
|
+
display: flex;
|
|
1904
|
+
align-items: center;
|
|
1905
|
+
height: 35px;
|
|
1906
|
+
background: #2a2a2a;
|
|
1907
|
+
border-bottom: 1px solid var(--surface-0);
|
|
1908
|
+
padding: 0 8px;
|
|
1909
|
+
flex-shrink: 0;
|
|
1910
|
+
}
|
|
1911
|
+
/* Toolbar: modebar controls + action buttons */
|
|
1912
|
+
.twm-plot-window-toolbar {
|
|
1913
|
+
display: flex;
|
|
1914
|
+
align-items: center;
|
|
1915
|
+
gap: var(--space-xxs);
|
|
1916
|
+
flex: 1;
|
|
1917
|
+
min-width: 0;
|
|
1918
|
+
margin-left: var(--space-md);
|
|
1919
|
+
}
|
|
1920
|
+
.twm-plot-window-toolbar__group {
|
|
1921
|
+
display: flex;
|
|
1922
|
+
align-items: center;
|
|
1923
|
+
gap: var(--space-xxs);
|
|
1924
|
+
padding: 0 4px;
|
|
1925
|
+
}
|
|
1926
|
+
.twm-plot-window-toolbar__group + .twm-plot-window-toolbar__group {
|
|
1927
|
+
border-left: 1px solid #444;
|
|
1928
|
+
}
|
|
1929
|
+
.twm-plot-window-toolbar .twm-btn-icon {
|
|
1930
|
+
width: 26px;
|
|
1931
|
+
height: 26px;
|
|
1932
|
+
padding: 0;
|
|
1933
|
+
display: flex;
|
|
1934
|
+
align-items: center;
|
|
1935
|
+
justify-content: center;
|
|
1936
|
+
background: transparent;
|
|
1937
|
+
border: none;
|
|
1938
|
+
border-radius: var(--radius-sm);
|
|
1939
|
+
color: var(--text-muted);
|
|
1940
|
+
cursor: pointer;
|
|
1941
|
+
transition: all var(--transition-normal);
|
|
1942
|
+
}
|
|
1943
|
+
.twm-plot-window-toolbar .twm-btn-icon:hover {
|
|
1944
|
+
background: rgba(255, 255, 255, 0.1);
|
|
1945
|
+
color: var(--text-bright);
|
|
1946
|
+
}
|
|
1947
|
+
.twm-plot-window-toolbar .twm-btn-icon.twm-is-active {
|
|
1948
|
+
color: #4A90D9;
|
|
1949
|
+
background: rgba(74, 144, 217, 0.15);
|
|
1950
|
+
}
|
|
1951
|
+
.twm-plot-window-toolbar .twm-btn-icon.twm-is-active:hover {
|
|
1952
|
+
background: rgba(74, 144, 217, 0.25);
|
|
1953
|
+
}
|
|
1954
|
+
.twm-plot-window-content {
|
|
1955
|
+
flex: 1;
|
|
1956
|
+
min-height: 0;
|
|
1957
|
+
display: flex;
|
|
1958
|
+
flex-direction: column;
|
|
1959
|
+
overflow: hidden;
|
|
1960
|
+
}
|
|
1961
|
+
.twm-plot-tab-content {
|
|
1962
|
+
flex: 1;
|
|
1963
|
+
min-height: 0;
|
|
1964
|
+
display: flex;
|
|
1965
|
+
flex-direction: column;
|
|
1966
|
+
}
|
|
1967
|
+
.twm-plot-tab-content[data-tab="plot"] {
|
|
1968
|
+
padding: var(--space-md);
|
|
1969
|
+
}
|
|
1970
|
+
.twm-plot-tab-content[data-tab="data"] {
|
|
1971
|
+
padding: 0;
|
|
1972
|
+
}
|
|
1973
|
+
.twm-plot-window-chart {
|
|
1974
|
+
flex: 1;
|
|
1975
|
+
min-height: 0;
|
|
1976
|
+
background: var(--surface-0);
|
|
1977
|
+
border-radius: var(--radius-sm);
|
|
1978
|
+
position: relative; /* Anchor for Plotly's positioning */
|
|
1979
|
+
}
|
|
1980
|
+
.twm-plot-window-chart svg {
|
|
1981
|
+
width: auto !important;
|
|
1982
|
+
height: auto !important;
|
|
1983
|
+
z-index: auto !important;
|
|
1984
|
+
}
|
|
1985
|
+
/* Data tab table - use class selectors instead of data-tab */
|
|
1986
|
+
.twm-plot-window-container .twm-plot-tab-content .twm-preview-table-wrap {
|
|
1987
|
+
flex: 1;
|
|
1988
|
+
min-height: 0;
|
|
1989
|
+
max-height: none !important;
|
|
1990
|
+
overflow: auto;
|
|
1991
|
+
border: none;
|
|
1992
|
+
border-radius: 0;
|
|
1993
|
+
max-height: none;
|
|
1994
|
+
}
|
|
1995
|
+
.twm-plot-window-container .twm-plot-tab-content .twm-preview-table {
|
|
1996
|
+
width: 100%;
|
|
1997
|
+
border-collapse: collapse;
|
|
1998
|
+
font-size: var(--font-size-sm);
|
|
1999
|
+
}
|
|
2000
|
+
.twm-plot-window-container .twm-plot-tab-content .twm-preview-table th,
|
|
2001
|
+
.twm-plot-window-container .twm-plot-tab-content .twm-preview-table td {
|
|
2002
|
+
padding: var(--space-sm) 10px;
|
|
2003
|
+
text-align: right;
|
|
2004
|
+
border-bottom: 1px solid #2a2a2a;
|
|
2005
|
+
white-space: nowrap;
|
|
2006
|
+
}
|
|
2007
|
+
.twm-plot-window-container .twm-plot-tab-content .twm-preview-table th:first-child,
|
|
2008
|
+
.twm-plot-window-container .twm-plot-tab-content .twm-preview-table td:first-child {
|
|
2009
|
+
text-align: left;
|
|
2010
|
+
}
|
|
2011
|
+
.twm-plot-window-container .twm-plot-tab-content .twm-preview-table th {
|
|
2012
|
+
background: #252525;
|
|
2013
|
+
color: #ccc;
|
|
2014
|
+
font-weight: 600;
|
|
2015
|
+
position: sticky;
|
|
2016
|
+
top: 0;
|
|
2017
|
+
z-index: 1;
|
|
2018
|
+
}
|
|
2019
|
+
.twm-plot-window-container .twm-plot-tab-content .twm-preview-table tbody tr:nth-child(odd) {
|
|
2020
|
+
background: rgba(255, 255, 255, 0.02);
|
|
2021
|
+
}
|
|
2022
|
+
.twm-plot-window-container .twm-plot-tab-content .twm-preview-table tbody tr:hover {
|
|
2023
|
+
background: rgba(74, 144, 217, 0.1);
|
|
2024
|
+
}
|
|
2025
|
+
.twm-plot-window-container .twm-plot-tab-content .twm-preview-table td {
|
|
2026
|
+
color: #aaa;
|
|
2027
|
+
font-family: "JetBrains Mono", "Cascadia Mono", Consolas, monospace;
|
|
2028
|
+
}
|
|
2029
|
+
/* ── Series visibility toggle panel ────────────────────────────────────── */
|
|
2030
|
+
|
|
2031
|
+
.twm-plot-series-toggle-panel {
|
|
2032
|
+
position: absolute;
|
|
2033
|
+
z-index: var(--z-dropdown);
|
|
2034
|
+
background: #2a2a2a;
|
|
2035
|
+
border: 1px solid #444;
|
|
2036
|
+
border-radius: var(--radius-md);
|
|
2037
|
+
box-shadow: 0 4px 16px rgba(0, 0, 0, 0.4);
|
|
2038
|
+
width: 220px;
|
|
2039
|
+
max-height: 320px;
|
|
2040
|
+
display: flex;
|
|
2041
|
+
flex-direction: column;
|
|
2042
|
+
overflow: hidden;
|
|
2043
|
+
}
|
|
2044
|
+
.twm-plot-series-toggle-panel__header {
|
|
2045
|
+
display: flex;
|
|
2046
|
+
align-items: center;
|
|
2047
|
+
justify-content: space-between;
|
|
2048
|
+
padding: var(--space-md) 10px 6px;
|
|
2049
|
+
border-bottom: 1px solid #3a3a3a;
|
|
2050
|
+
flex-shrink: 0;
|
|
2051
|
+
}
|
|
2052
|
+
.twm-plot-series-toggle-panel__title {
|
|
2053
|
+
font-size: var(--font-size-xs);
|
|
2054
|
+
font-weight: 600;
|
|
2055
|
+
color: #999;
|
|
2056
|
+
text-transform: uppercase;
|
|
2057
|
+
letter-spacing: 0.5px;
|
|
2058
|
+
}
|
|
2059
|
+
.twm-plot-series-toggle-panel__header-actions {
|
|
2060
|
+
display: flex;
|
|
2061
|
+
gap: var(--space-sm);
|
|
2062
|
+
}
|
|
2063
|
+
.twm-plot-series-toggle-panel__action {
|
|
2064
|
+
background: none;
|
|
2065
|
+
border: none;
|
|
2066
|
+
color: #6a9fd8;
|
|
2067
|
+
font-size: var(--font-size-xs);
|
|
2068
|
+
cursor: pointer;
|
|
2069
|
+
padding: 0;
|
|
2070
|
+
}
|
|
2071
|
+
.twm-plot-series-toggle-panel__action:hover {
|
|
2072
|
+
color: #8bb8ea;
|
|
2073
|
+
text-decoration: underline;
|
|
2074
|
+
}
|
|
2075
|
+
.twm-plot-series-toggle-panel__list {
|
|
2076
|
+
overflow-y: auto;
|
|
2077
|
+
padding: var(--space-sm) 4px;
|
|
2078
|
+
display: flex;
|
|
2079
|
+
flex-direction: column;
|
|
2080
|
+
gap: var(--space-xxs);
|
|
2081
|
+
}
|
|
2082
|
+
.twm-plot-series-toggle-panel__item {
|
|
2083
|
+
display: flex;
|
|
2084
|
+
align-items: center;
|
|
2085
|
+
gap: var(--space-sm);
|
|
2086
|
+
padding: var(--space-xs) 6px;
|
|
2087
|
+
border-radius: var(--radius-sm);
|
|
2088
|
+
font-size: var(--font-size-sm);
|
|
2089
|
+
color: #ccc;
|
|
2090
|
+
cursor: pointer;
|
|
2091
|
+
}
|
|
2092
|
+
.twm-plot-series-toggle-panel__item:hover {
|
|
2093
|
+
background: rgba(255, 255, 255, 0.05);
|
|
2094
|
+
}
|
|
2095
|
+
.twm-plot-series-toggle-panel__item input[type="checkbox"] {
|
|
2096
|
+
accent-color: #268bd2;
|
|
2097
|
+
flex-shrink: 0;
|
|
2098
|
+
}
|
|
2099
|
+
.twm-plot-series-toggle-panel__line-indicator {
|
|
2100
|
+
width: 28px;
|
|
2101
|
+
height: 14px;
|
|
2102
|
+
flex-shrink: 0;
|
|
2103
|
+
background: #1a1a2e;
|
|
2104
|
+
border-radius: var(--radius-sm);
|
|
2105
|
+
border: 1px solid rgba(0, 0, 0, 0.3);
|
|
2106
|
+
box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.5);
|
|
2107
|
+
overflow: hidden;
|
|
2108
|
+
}
|
|
2109
|
+
.twm-plot-series-toggle-panel__line-indicator svg {
|
|
2110
|
+
display: block;
|
|
2111
|
+
width: 28px;
|
|
2112
|
+
height: 14px;
|
|
2113
|
+
}
|
|
2114
|
+
.twm-plot-series-toggle-panel__axis-label {
|
|
2115
|
+
font-size: 10px;
|
|
2116
|
+
font-weight: 600;
|
|
2117
|
+
color: var(--text-dim);
|
|
2118
|
+
text-transform: uppercase;
|
|
2119
|
+
letter-spacing: 0.5px;
|
|
2120
|
+
padding: var(--space-sm) 6px 2px;
|
|
2121
|
+
border-top: 1px solid #3a3a3a;
|
|
2122
|
+
}
|
|
2123
|
+
.twm-plot-series-toggle-panel__axis-label:first-child {
|
|
2124
|
+
border-top: none;
|
|
2125
|
+
padding-top: var(--space-xxs);
|
|
2126
|
+
}
|
|
2127
|
+
.twm-plot-series-toggle-panel__label {
|
|
2128
|
+
overflow: hidden;
|
|
2129
|
+
text-overflow: ellipsis;
|
|
2130
|
+
white-space: nowrap;
|
|
2131
|
+
min-width: 0;
|
|
2132
|
+
}
|
|
2133
|
+
/* ═══════════════════════════════════════════════════════════════════════════
|
|
2134
|
+
Data Series Plot Window
|
|
2135
|
+
═══════════════════════════════════════════════════════════════════════════ */
|
|
2136
|
+
|
|
2137
|
+
.twm-data-series-plot-container {
|
|
2138
|
+
display: flex;
|
|
2139
|
+
flex-direction: column;
|
|
2140
|
+
height: 100%;
|
|
2141
|
+
background: #1a1a1a;
|
|
2142
|
+
}
|
|
2143
|
+
.twm-data-series-plot-actions {
|
|
2144
|
+
display: flex;
|
|
2145
|
+
gap: var(--space-xs);
|
|
2146
|
+
padding: var(--space-xs) 8px;
|
|
2147
|
+
border-bottom: 1px solid #2a2a2a;
|
|
2148
|
+
justify-content: flex-end;
|
|
2149
|
+
background: #1a1a1a;
|
|
2150
|
+
flex-shrink: 0;
|
|
2151
|
+
}
|
|
2152
|
+
.twm-data-series-plot-body {
|
|
2153
|
+
display: flex;
|
|
2154
|
+
flex: 1;
|
|
2155
|
+
min-height: 0;
|
|
2156
|
+
}
|
|
2157
|
+
/* Chart area */
|
|
2158
|
+
.twm-data-series-plot-chart {
|
|
2159
|
+
flex: 1;
|
|
2160
|
+
min-width: 0;
|
|
2161
|
+
min-height: 0;
|
|
2162
|
+
background: var(--surface-0);
|
|
2163
|
+
position: relative;
|
|
2164
|
+
}
|
|
2165
|
+
.twm-data-series-plot-chart svg {
|
|
2166
|
+
width: auto !important;
|
|
2167
|
+
height: auto !important;
|
|
2168
|
+
z-index: auto !important;
|
|
2169
|
+
}
|
|
2170
|
+
/* Config panel */
|
|
2171
|
+
.twm-data-series-plot-config {
|
|
2172
|
+
width: 260px;
|
|
2173
|
+
flex-shrink: 0;
|
|
2174
|
+
border-left: 1px solid #2a2a2a;
|
|
2175
|
+
background: var(--surface-0);
|
|
2176
|
+
overflow-y: auto;
|
|
2177
|
+
padding: var(--space-lg);
|
|
2178
|
+
display: flex;
|
|
2179
|
+
flex-direction: column;
|
|
2180
|
+
gap: var(--space-lg);
|
|
2181
|
+
}
|
|
2182
|
+
.twm-data-series-plot-config__section {
|
|
2183
|
+
display: flex;
|
|
2184
|
+
flex-direction: column;
|
|
2185
|
+
gap: var(--space-sm);
|
|
2186
|
+
}
|
|
2187
|
+
.twm-data-series-plot-config__label {
|
|
2188
|
+
font-size: var(--font-size-xs);
|
|
2189
|
+
font-weight: 600;
|
|
2190
|
+
color: #999;
|
|
2191
|
+
text-transform: uppercase;
|
|
2192
|
+
letter-spacing: 0.5px;
|
|
2193
|
+
}
|
|
2194
|
+
.twm-data-series-plot-config select {
|
|
2195
|
+
width: 100%;
|
|
2196
|
+
padding: var(--space-xs) 6px;
|
|
2197
|
+
background: var(--surface-1);
|
|
2198
|
+
border: 1px solid #3a3a3a;
|
|
2199
|
+
border-radius: var(--radius-sm);
|
|
2200
|
+
color: #ccc;
|
|
2201
|
+
font-size: var(--font-size-sm);
|
|
2202
|
+
outline: none;
|
|
2203
|
+
}
|
|
2204
|
+
.twm-data-series-plot-config select:focus {
|
|
2205
|
+
border-color: #268bd2;
|
|
2206
|
+
}
|
|
2207
|
+
.twm-data-series-plot-config__columns {
|
|
2208
|
+
max-height: 200px;
|
|
2209
|
+
overflow-y: auto;
|
|
2210
|
+
display: flex;
|
|
2211
|
+
flex-direction: column;
|
|
2212
|
+
gap: var(--space-xxs);
|
|
2213
|
+
}
|
|
2214
|
+
.twm-data-series-plot-config__column-item {
|
|
2215
|
+
display: flex;
|
|
2216
|
+
align-items: center;
|
|
2217
|
+
gap: var(--space-sm);
|
|
2218
|
+
padding: 3px 4px;
|
|
2219
|
+
border-radius: var(--radius-sm);
|
|
2220
|
+
font-size: var(--font-size-sm);
|
|
2221
|
+
color: #ccc;
|
|
2222
|
+
cursor: pointer;
|
|
2223
|
+
}
|
|
2224
|
+
.twm-data-series-plot-config__column-item:hover {
|
|
2225
|
+
background: rgba(255, 255, 255, 0.04);
|
|
2226
|
+
}
|
|
2227
|
+
.twm-data-series-plot-config__color-swatch {
|
|
2228
|
+
width: 16px;
|
|
2229
|
+
height: 16px;
|
|
2230
|
+
border-radius: 2px;
|
|
2231
|
+
border: 1px solid #444;
|
|
2232
|
+
cursor: pointer;
|
|
2233
|
+
padding: 0;
|
|
2234
|
+
flex-shrink: 0;
|
|
2235
|
+
-webkit-appearance: none;
|
|
2236
|
+
appearance: none;
|
|
2237
|
+
background: none;
|
|
2238
|
+
}
|
|
2239
|
+
.twm-data-series-plot-config__color-swatch::-webkit-color-swatch-wrapper {
|
|
2240
|
+
padding: 0;
|
|
2241
|
+
}
|
|
2242
|
+
.twm-data-series-plot-config__color-swatch::-webkit-color-swatch {
|
|
2243
|
+
border: none;
|
|
2244
|
+
border-radius: 1px;
|
|
2245
|
+
}
|
|
2246
|
+
.twm-data-series-plot-config input[type="checkbox"] {
|
|
2247
|
+
accent-color: #268bd2;
|
|
2248
|
+
flex-shrink: 0;
|
|
2249
|
+
}
|
|
2250
|
+
/* Computing Status Window */
|
|
2251
|
+
.twm-computing-status {
|
|
2252
|
+
display: flex;
|
|
2253
|
+
flex-direction: column;
|
|
2254
|
+
align-items: center;
|
|
2255
|
+
justify-content: center;
|
|
2256
|
+
gap: var(--space-xl);
|
|
2257
|
+
padding: var(--space-2xl);
|
|
2258
|
+
height: 100%;
|
|
2259
|
+
}
|
|
2260
|
+
.twm-computing-status__spinner {
|
|
2261
|
+
width: 32px;
|
|
2262
|
+
height: 32px;
|
|
2263
|
+
border: 3px solid #333;
|
|
2264
|
+
border-top-color: #4a90d9;
|
|
2265
|
+
border-radius: 50%;
|
|
2266
|
+
animation: computing-spin 0.8s linear infinite;
|
|
2267
|
+
}
|
|
2268
|
+
.twm-computing-status__message {
|
|
2269
|
+
font-size: var(--font-size-md);
|
|
2270
|
+
color: #b0b0b0;
|
|
2271
|
+
text-align: center;
|
|
2272
|
+
}
|
|
2273
|
+
.twm-computing-status__cancel-btn {
|
|
2274
|
+
padding: var(--space-sm) 20px;
|
|
2275
|
+
background: transparent;
|
|
2276
|
+
border: 1px solid var(--text-dim);
|
|
2277
|
+
border-radius: var(--radius-sm);
|
|
2278
|
+
color: #ccc;
|
|
2279
|
+
font-size: var(--font-size-sm);
|
|
2280
|
+
cursor: pointer;
|
|
2281
|
+
transition: background var(--transition-normal), border-color var(--transition-normal);
|
|
2282
|
+
}
|
|
2283
|
+
.twm-computing-status__cancel-btn:hover {
|
|
2284
|
+
background: rgba(255, 255, 255, 0.08);
|
|
2285
|
+
border-color: #999;
|
|
2286
|
+
}
|
|
2287
|
+
.twm-computing-status__cancel-btn:disabled {
|
|
2288
|
+
opacity: 0.5;
|
|
2289
|
+
cursor: default;
|
|
2290
|
+
}
|
|
2291
|
+
|
|
2292
|
+
/* ── from etl_page.css ───────────────────────── */
|
|
2293
|
+
#etl-preview-bottom-panel .twm-preview-table-wrap {
|
|
2294
|
+
max-height: none;
|
|
2295
|
+
}
|
|
2296
|
+
/* ─── Run Progress Dialog ─────────────────────────────────────────── */
|
|
2297
|
+
|
|
2298
|
+
.twm-run-progress__body {
|
|
2299
|
+
display: flex;
|
|
2300
|
+
align-items: center;
|
|
2301
|
+
gap: var(--space-xl);
|
|
2302
|
+
padding: var(--space-md) 0;
|
|
2303
|
+
}
|
|
2304
|
+
.twm-run-progress__spinner {
|
|
2305
|
+
width: 24px;
|
|
2306
|
+
height: 24px;
|
|
2307
|
+
border: 3px solid rgba(255, 255, 255, 0.15);
|
|
2308
|
+
border-top-color: var(--accent-color, var(--accent-bright));
|
|
2309
|
+
border-radius: 50%;
|
|
2310
|
+
flex-shrink: 0;
|
|
2311
|
+
animation: etl-spin 0.8s linear infinite;
|
|
2312
|
+
}
|
|
2313
|
+
.twm-run-progress__message {
|
|
2314
|
+
font-size: var(--font-size-md);
|
|
2315
|
+
color: var(--text-primary, #ccc);
|
|
2316
|
+
line-height: 1.4;
|
|
2317
|
+
}
|
|
2318
|
+
.twm-run-progress__stop-actions {
|
|
2319
|
+
display: flex;
|
|
2320
|
+
justify-content: flex-end;
|
|
2321
|
+
padding-top: var(--space-xs);
|
|
2322
|
+
}
|
|
2323
|
+
.twm-run-progress__stop-btn {
|
|
2324
|
+
display: inline-flex;
|
|
2325
|
+
align-items: center;
|
|
2326
|
+
gap: var(--space-xs);
|
|
2327
|
+
background: transparent;
|
|
2328
|
+
border: 1px solid rgba(255, 255, 255, 0.2);
|
|
2329
|
+
color: var(--text-secondary, #aaa);
|
|
2330
|
+
border-radius: var(--radius-sm);
|
|
2331
|
+
padding: var(--space-xs) 12px;
|
|
2332
|
+
font-size: var(--font-size-sm);
|
|
2333
|
+
cursor: pointer;
|
|
2334
|
+
transition: border-color var(--transition-normal), color var(--transition-normal);
|
|
2335
|
+
}
|
|
2336
|
+
.twm-run-progress__stop-btn:hover:not(:disabled) {
|
|
2337
|
+
border-color: #f44336;
|
|
2338
|
+
color: #f44336;
|
|
2339
|
+
}
|
|
2340
|
+
.twm-run-progress__stop-btn:disabled {
|
|
2341
|
+
opacity: 0.5;
|
|
2342
|
+
cursor: default;
|
|
2343
|
+
}
|
|
2344
|
+
|
|
2345
|
+
/* ── from results_widgets.css ───────────────────────── */
|
|
2346
|
+
/* Error State */
|
|
2347
|
+
.twm-tile-error {
|
|
2348
|
+
display: flex;
|
|
2349
|
+
flex-direction: column;
|
|
2350
|
+
align-items: center;
|
|
2351
|
+
justify-content: center;
|
|
2352
|
+
height: 100%;
|
|
2353
|
+
gap: var(--space-md);
|
|
2354
|
+
color: #ff6b6b;
|
|
2355
|
+
font-size: var(--font-size-sm);
|
|
2356
|
+
}
|
|
2357
|
+
/* ===================================================================
|
|
2358
|
+
REUSABLE ACTION DROPDOWN COMPONENT
|
|
2359
|
+
Used by Add Scenario, Add Widget, and other action dropdowns
|
|
2360
|
+
=================================================================== */
|
|
2361
|
+
|
|
2362
|
+
.twm-action-dropdown-menu {
|
|
2363
|
+
/* position/top/left set by ActionDropdown.position() via inline style */
|
|
2364
|
+
position: fixed;
|
|
2365
|
+
min-width: 220px;
|
|
2366
|
+
padding: var(--space-md);
|
|
2367
|
+
background: linear-gradient(145deg, rgba(30, 32, 38, 0.98), rgba(24, 26, 32, 0.96));
|
|
2368
|
+
border: 1px solid rgba(255, 255, 255, 0.12);
|
|
2369
|
+
border-radius: 10px;
|
|
2370
|
+
box-shadow: 0 12px 32px rgba(0, 0, 0, 0.6);
|
|
2371
|
+
z-index: var(--z-toast);
|
|
2372
|
+
opacity: 0;
|
|
2373
|
+
pointer-events: none;
|
|
2374
|
+
transition: opacity 0.16s ease;
|
|
2375
|
+
}
|
|
2376
|
+
.twm-action-dropdown-menu[hidden] {
|
|
2377
|
+
display: none !important;
|
|
2378
|
+
}
|
|
2379
|
+
/* Dropdown options */
|
|
2380
|
+
.twm-action-dropdown-option {
|
|
2381
|
+
display: flex;
|
|
2382
|
+
align-items: center;
|
|
2383
|
+
gap: 10px;
|
|
2384
|
+
width: 100%;
|
|
2385
|
+
padding: 10px 12px;
|
|
2386
|
+
margin-bottom: var(--space-xs);
|
|
2387
|
+
background: rgba(255, 255, 255, 0.03);
|
|
2388
|
+
border: 1px solid transparent;
|
|
2389
|
+
border-radius: var(--radius-md);
|
|
2390
|
+
color: rgba(255, 255, 255, 0.85);
|
|
2391
|
+
font-family: inherit;
|
|
2392
|
+
font-size: var(--font-size-md);
|
|
2393
|
+
cursor: pointer;
|
|
2394
|
+
text-align: left;
|
|
2395
|
+
box-sizing: border-box;
|
|
2396
|
+
transition: background var(--transition-normal), border-color var(--transition-normal);
|
|
2397
|
+
}
|
|
2398
|
+
.twm-action-dropdown-option:last-child {
|
|
2399
|
+
margin-bottom: 0;
|
|
2400
|
+
}
|
|
2401
|
+
.twm-action-dropdown-option:hover,
|
|
2402
|
+
.twm-action-dropdown-option:focus {
|
|
2403
|
+
background: rgba(255, 255, 255, 0.1);
|
|
2404
|
+
border-color: rgba(255, 255, 255, 0.08);
|
|
2405
|
+
outline: none;
|
|
2406
|
+
}
|
|
2407
|
+
.twm-action-dropdown-option .twm-option-icon {
|
|
2408
|
+
font-size: 20px;
|
|
2409
|
+
color: #78b9ff;
|
|
2410
|
+
flex-shrink: 0;
|
|
2411
|
+
}
|
|
2412
|
+
.twm-action-dropdown-option:hover .twm-option-icon,
|
|
2413
|
+
.twm-action-dropdown-option:focus .twm-option-icon {
|
|
2414
|
+
color: #9ecfff;
|
|
2415
|
+
}
|
|
2416
|
+
.twm-action-dropdown-option .twm-option-label {
|
|
2417
|
+
font-weight: 500;
|
|
2418
|
+
white-space: nowrap;
|
|
2419
|
+
overflow: hidden;
|
|
2420
|
+
text-overflow: ellipsis;
|
|
2421
|
+
}
|
|
2422
|
+
.twm-action-dropdown-option .twm-option-desc {
|
|
2423
|
+
font-size: var(--font-size-xs);
|
|
2424
|
+
color: rgba(255, 255, 255, 0.5);
|
|
2425
|
+
white-space: nowrap;
|
|
2426
|
+
overflow: hidden;
|
|
2427
|
+
text-overflow: ellipsis;
|
|
2428
|
+
}
|
|
2429
|
+
|
|
2430
|
+
/* ── from code.css ───────────────────────── */
|
|
2431
|
+
/* Code language tabs */
|
|
2432
|
+
.twm-code-tabs-header {
|
|
2433
|
+
display: flex;
|
|
2434
|
+
align-items: center;
|
|
2435
|
+
height: 35px;
|
|
2436
|
+
background: #2a2a2a;
|
|
2437
|
+
border-bottom: 1px solid var(--surface-0);
|
|
2438
|
+
gap: var(--space-xs);
|
|
2439
|
+
flex: 0 0 auto;
|
|
2440
|
+
}
|
|
2441
|
+
.twm-code-tabs {
|
|
2442
|
+
display: flex;
|
|
2443
|
+
gap: var(--space-xxs);
|
|
2444
|
+
height: 35px;
|
|
2445
|
+
}
|
|
2446
|
+
.twm-code-tab {
|
|
2447
|
+
height: 35px;
|
|
2448
|
+
padding: 0 12px;
|
|
2449
|
+
display: flex;
|
|
2450
|
+
align-items: center;
|
|
2451
|
+
background: transparent;
|
|
2452
|
+
color: var(--text-muted);
|
|
2453
|
+
border: none;
|
|
2454
|
+
border-radius: var(--radius-sm) 3px 0 0;
|
|
2455
|
+
cursor: pointer;
|
|
2456
|
+
font-size: var(--font-size-sm);
|
|
2457
|
+
transition: all var(--transition-normal);
|
|
2458
|
+
position: relative;
|
|
2459
|
+
}
|
|
2460
|
+
.twm-code-tab:hover {
|
|
2461
|
+
background: #333;
|
|
2462
|
+
color: #ccc;
|
|
2463
|
+
}
|
|
2464
|
+
|
|
2465
|
+
/* ── from global_search.css ───────────────────────── */
|
|
2466
|
+
/* Search wrapper - contains icon, input, hint */
|
|
2467
|
+
.twm-global-search-wrapper {
|
|
2468
|
+
display: flex;
|
|
2469
|
+
align-items: center;
|
|
2470
|
+
gap: var(--space-sm);
|
|
2471
|
+
height: 26px;
|
|
2472
|
+
min-width: 200px;
|
|
2473
|
+
max-width: 320px;
|
|
2474
|
+
width: 100%;
|
|
2475
|
+
padding: 0 10px;
|
|
2476
|
+
background: #2b2b2c;
|
|
2477
|
+
border: 1px solid #3a3a3b;
|
|
2478
|
+
border-radius: 5px;
|
|
2479
|
+
transition: border-color var(--transition-normal), background var(--transition-normal);
|
|
2480
|
+
}
|
|
2481
|
+
.twm-global-search-wrapper:focus-within {
|
|
2482
|
+
border-color: var(--accent-bright);
|
|
2483
|
+
background: var(--surface-1);
|
|
2484
|
+
}
|
|
2485
|
+
/* Dropdown container */
|
|
2486
|
+
.twm-global-search-dropdown {
|
|
2487
|
+
position: absolute;
|
|
2488
|
+
top: calc(100% + 4px);
|
|
2489
|
+
left: 50%;
|
|
2490
|
+
transform: translateX(-50%);
|
|
2491
|
+
width: 320px;
|
|
2492
|
+
max-height: 400px;
|
|
2493
|
+
overflow-y: auto;
|
|
2494
|
+
background: #2b2b2c;
|
|
2495
|
+
border: 1px solid #3a3a3b;
|
|
2496
|
+
border-radius: var(--radius-md);
|
|
2497
|
+
box-shadow: 0 4px 16px rgba(0, 0, 0, 0.3);
|
|
2498
|
+
z-index: 3500;
|
|
2499
|
+
}
|
|
2500
|
+
/* Scrollbar styling for dropdown */
|
|
2501
|
+
.twm-global-search-dropdown::-webkit-scrollbar {
|
|
2502
|
+
width: 6px;
|
|
2503
|
+
}
|
|
2504
|
+
.twm-global-search-dropdown::-webkit-scrollbar-track {
|
|
2505
|
+
background: transparent;
|
|
2506
|
+
}
|
|
2507
|
+
.twm-global-search-dropdown::-webkit-scrollbar-thumb {
|
|
2508
|
+
background: #4a4a4a;
|
|
2509
|
+
border-radius: var(--radius-sm);
|
|
2510
|
+
}
|
|
2511
|
+
.twm-global-search-dropdown::-webkit-scrollbar-thumb:hover {
|
|
2512
|
+
background: #5a5a5a;
|
|
2513
|
+
}
|
|
2514
|
+
|
|
2515
|
+
/* ── from zoom_controls.css ───────────────────────── */
|
|
2516
|
+
/**
|
|
2517
|
+
* Zoom Controls Styles
|
|
2518
|
+
*
|
|
2519
|
+
* Styles for the canvas zoom control buttons and global zoom indicator.
|
|
2520
|
+
* Buttons: positioned in the bottom-right corner of the canvas.
|
|
2521
|
+
* Indicator: positioned in the global bottom-right of the application.
|
|
2522
|
+
*/
|
|
2523
|
+
|
|
2524
|
+
/* Ensure .twm-left-top is a positioning context for the zoom controls */
|
|
2525
|
+
.twm-left-top {
|
|
2526
|
+
position: relative;
|
|
2527
|
+
}
|
|
2528
|
+
|
|
2529
|
+
/* ── from managed_window.css ───────────────────────── */
|
|
2530
|
+
/**
|
|
2531
|
+
* Managed Window Styles
|
|
2532
|
+
* Styles for draggable/resizable window component with taskbar integration.
|
|
2533
|
+
*/
|
|
2534
|
+
|
|
2535
|
+
/* ========== Window Container ========== */
|
|
2536
|
+
|
|
2537
|
+
.twm-managed-window {
|
|
2538
|
+
position: fixed;
|
|
2539
|
+
background: #1a1a1a;
|
|
2540
|
+
border: 1px solid var(--surface-3);
|
|
2541
|
+
border-radius: 0;
|
|
2542
|
+
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.5);
|
|
2543
|
+
display: flex;
|
|
2544
|
+
flex-direction: column;
|
|
2545
|
+
overflow: hidden;
|
|
2546
|
+
min-width: 200px;
|
|
2547
|
+
min-height: 100px;
|
|
2548
|
+
/* Enable transitions for minimize/maximize animations */
|
|
2549
|
+
transition: transform 0.2s ease-out, opacity 0.2s ease-out, box-shadow var(--transition-normal);
|
|
2550
|
+
}
|
|
2551
|
+
.twm-managed-window:focus-within {
|
|
2552
|
+
border-color: #505050;
|
|
2553
|
+
}
|
|
2554
|
+
/* Minimize animation class — targets taskbar item via CSS custom properties */
|
|
2555
|
+
.twm-managed-window--minimizing {
|
|
2556
|
+
transform: translate(var(--mw-target-x, 0px), var(--mw-target-y, 100vh)) scale(var(--mw-target-scale, 0.1));
|
|
2557
|
+
opacity: 0;
|
|
2558
|
+
pointer-events: none;
|
|
2559
|
+
}
|
|
2560
|
+
/* Restore animation class — animates from taskbar item position */
|
|
2561
|
+
.twm-managed-window--restoring {
|
|
2562
|
+
animation: windowRestore 0.25s cubic-bezier(0.16, 1, 0.3, 1) forwards;
|
|
2563
|
+
}
|
|
2564
|
+
/* ========== Backdrop (for modal windows) ========== */
|
|
2565
|
+
|
|
2566
|
+
.twm-managed-window__backdrop {
|
|
2567
|
+
position: fixed;
|
|
2568
|
+
/* Position between top bar (35px) and bottom bar (20px) */
|
|
2569
|
+
top: 35px;
|
|
2570
|
+
left: 0;
|
|
2571
|
+
right: 0;
|
|
2572
|
+
bottom: 20px;
|
|
2573
|
+
background: rgba(0, 0, 0, 0.5);
|
|
2574
|
+
backdrop-filter: blur(2px);
|
|
2575
|
+
}
|
|
2576
|
+
/* Per-modal overrides of the dim/blur above are set as inline styles by
|
|
2577
|
+
ManagedWindow from its `backdropBlur` / `backdropOpacity` options — not
|
|
2578
|
+
via modifier classes here. */
|
|
2579
|
+
|
|
2580
|
+
/* ========== Top Bar ========== */
|
|
2581
|
+
|
|
2582
|
+
.twm-managed-window__topbar {
|
|
2583
|
+
height: 28px;
|
|
2584
|
+
min-height: 28px;
|
|
2585
|
+
background: var(--surface-1);
|
|
2586
|
+
border-bottom: 1px solid var(--surface-3);
|
|
2587
|
+
display: flex;
|
|
2588
|
+
align-items: center;
|
|
2589
|
+
padding: 0 8px;
|
|
2590
|
+
cursor: move;
|
|
2591
|
+
user-select: none;
|
|
2592
|
+
gap: var(--space-sm);
|
|
2593
|
+
}
|
|
2594
|
+
/* Non-draggable windows (modals) */
|
|
2595
|
+
.twm-managed-window--no-drag .twm-managed-window__topbar {
|
|
2596
|
+
cursor: default;
|
|
2597
|
+
}
|
|
2598
|
+
.twm-managed-window__icon {
|
|
2599
|
+
font-size: var(--font-size-lg);
|
|
2600
|
+
color: var(--text-muted);
|
|
2601
|
+
flex-shrink: 0;
|
|
2602
|
+
}
|
|
2603
|
+
.twm-managed-window__title {
|
|
2604
|
+
flex: 1;
|
|
2605
|
+
font-size: var(--font-size-sm);
|
|
2606
|
+
font-weight: 500;
|
|
2607
|
+
color: var(--text-secondary);
|
|
2608
|
+
overflow: hidden;
|
|
2609
|
+
text-overflow: ellipsis;
|
|
2610
|
+
white-space: nowrap;
|
|
2611
|
+
}
|
|
2612
|
+
.twm-managed-window__buttons {
|
|
2613
|
+
display: flex;
|
|
2614
|
+
gap: var(--space-xxs);
|
|
2615
|
+
margin-left: auto;
|
|
2616
|
+
}
|
|
2617
|
+
/* Window buttons - white icons on transparent background */
|
|
2618
|
+
/* Use button element + class selector to override global "button" styles from main_new.css */
|
|
2619
|
+
button.twm-managed-window__btn {
|
|
2620
|
+
width: 24px;
|
|
2621
|
+
height: 20px;
|
|
2622
|
+
border: none;
|
|
2623
|
+
background: none;
|
|
2624
|
+
background-color: transparent;
|
|
2625
|
+
color: var(--text-bright);
|
|
2626
|
+
cursor: pointer;
|
|
2627
|
+
border-radius: 0;
|
|
2628
|
+
display: flex;
|
|
2629
|
+
align-items: center;
|
|
2630
|
+
justify-content: center;
|
|
2631
|
+
padding: 0;
|
|
2632
|
+
outline: none;
|
|
2633
|
+
box-shadow: none;
|
|
2634
|
+
transition: background-color 0.1s, color 0.1s;
|
|
2635
|
+
}
|
|
2636
|
+
/* Focus state - no outline */
|
|
2637
|
+
button.twm-managed-window__btn:focus,
|
|
2638
|
+
button.twm-managed-window__btn:focus-visible {
|
|
2639
|
+
outline: none;
|
|
2640
|
+
box-shadow: none;
|
|
2641
|
+
background: none;
|
|
2642
|
+
background-color: transparent;
|
|
2643
|
+
}
|
|
2644
|
+
/* Hover state - dark gray background */
|
|
2645
|
+
button.twm-managed-window__btn:hover {
|
|
2646
|
+
background: var(--surface-3);
|
|
2647
|
+
background-color: var(--surface-3);
|
|
2648
|
+
color: var(--text-bright);
|
|
2649
|
+
}
|
|
2650
|
+
/* Active state */
|
|
2651
|
+
button.twm-managed-window__btn:active {
|
|
2652
|
+
background: #4a4a4a;
|
|
2653
|
+
background-color: #4a4a4a;
|
|
2654
|
+
}
|
|
2655
|
+
/* Close button hover - red */
|
|
2656
|
+
button.twm-managed-window__btn--close:hover {
|
|
2657
|
+
background: #c42b1c;
|
|
2658
|
+
background-color: #c42b1c;
|
|
2659
|
+
color: var(--text-bright);
|
|
2660
|
+
}
|
|
2661
|
+
.twm-managed-window__btn svg {
|
|
2662
|
+
width: 10px;
|
|
2663
|
+
height: 10px;
|
|
2664
|
+
}
|
|
2665
|
+
/* Override global path stroke from main_new.css which sets stroke: #2c3e50 on all paths */
|
|
2666
|
+
/* Need high specificity to beat: path:not(.connection-path):not(.connection-hitbox) = (0,2,1) */
|
|
2667
|
+
.twm-managed-window .twm-managed-window__btn svg path,
|
|
2668
|
+
.twm-managed-window .twm-managed-window__btn svg rect,
|
|
2669
|
+
button.twm-managed-window__btn svg path,
|
|
2670
|
+
button.twm-managed-window__btn svg rect {
|
|
2671
|
+
stroke: var(--text-bright);
|
|
2672
|
+
stroke-width: 1.5;
|
|
2673
|
+
}
|
|
2674
|
+
/* ========== Content Area ========== */
|
|
2675
|
+
|
|
2676
|
+
.twm-managed-window__content {
|
|
2677
|
+
flex: 1;
|
|
2678
|
+
overflow: hidden;
|
|
2679
|
+
position: relative;
|
|
2680
|
+
display: flex;
|
|
2681
|
+
flex-direction: column;
|
|
2682
|
+
}
|
|
2683
|
+
/* ========== Resize Handles ========== */
|
|
2684
|
+
|
|
2685
|
+
.twm-managed-window__resize {
|
|
2686
|
+
position: absolute;
|
|
2687
|
+
z-index: var(--z-sticky);
|
|
2688
|
+
}
|
|
2689
|
+
/* ========== Taskbar in Bottom Bar ========== */
|
|
2690
|
+
|
|
2691
|
+
.twm-bar-windows {
|
|
2692
|
+
display: flex;
|
|
2693
|
+
align-items: center;
|
|
2694
|
+
gap: var(--space-xs);
|
|
2695
|
+
padding: 0 4px;
|
|
2696
|
+
height: 100%;
|
|
2697
|
+
}
|
|
2698
|
+
.twm-bar-windows:empty {
|
|
2699
|
+
display: none;
|
|
2700
|
+
}
|
|
2701
|
+
/* Taskbar dividers */
|
|
2702
|
+
.twm-bar-windows__divider {
|
|
2703
|
+
width: 1px;
|
|
2704
|
+
height: 100%;
|
|
2705
|
+
background: var(--surface-3);
|
|
2706
|
+
}
|
|
2707
|
+
.twm-bar-windows__divider--left {
|
|
2708
|
+
margin-right: var(--space-xs);
|
|
2709
|
+
}
|
|
2710
|
+
.twm-bar-windows__divider--right {
|
|
2711
|
+
margin-left: var(--space-xs);
|
|
2712
|
+
}
|
|
2713
|
+
.twm-bar-windows__item {
|
|
2714
|
+
height: 100%;
|
|
2715
|
+
padding: 0 6px;
|
|
2716
|
+
background: transparent;
|
|
2717
|
+
border: none;
|
|
2718
|
+
border-radius: 0;
|
|
2719
|
+
font-size: var(--font-size-xs);
|
|
2720
|
+
font-family: inherit;
|
|
2721
|
+
color: var(--text-secondary);
|
|
2722
|
+
cursor: pointer;
|
|
2723
|
+
max-width: 160px;
|
|
2724
|
+
display: flex;
|
|
2725
|
+
align-items: center;
|
|
2726
|
+
gap: var(--space-xs);
|
|
2727
|
+
transition: background-color 0.1s, color 0.1s;
|
|
2728
|
+
}
|
|
2729
|
+
.twm-bar-windows__item:hover {
|
|
2730
|
+
/* Solarized blue */
|
|
2731
|
+
background: #268bd2;
|
|
2732
|
+
color: var(--text-bright);
|
|
2733
|
+
}
|
|
2734
|
+
.twm-bar-windows__item:active {
|
|
2735
|
+
background: #1a6aa5;
|
|
2736
|
+
}
|
|
2737
|
+
.twm-bar-windows__item-icon {
|
|
2738
|
+
font-size: var(--font-size-sm);
|
|
2739
|
+
flex-shrink: 0;
|
|
2740
|
+
}
|
|
2741
|
+
.twm-bar-windows__item-title {
|
|
2742
|
+
overflow: hidden;
|
|
2743
|
+
text-overflow: ellipsis;
|
|
2744
|
+
white-space: nowrap;
|
|
2745
|
+
}
|
|
2746
|
+
/* ========== Transitions ========== */
|
|
2747
|
+
|
|
2748
|
+
.twm-managed-window:not(:hover) {
|
|
2749
|
+
box-shadow: 0 4px 16px rgba(0, 0, 0, 0.4);
|
|
2750
|
+
}
|
|
2751
|
+
/* ========== Expression Modal Content ========== */
|
|
2752
|
+
|
|
2753
|
+
.twm-expression-modal__window-content {
|
|
2754
|
+
display: flex;
|
|
2755
|
+
flex-direction: column;
|
|
2756
|
+
height: 100%;
|
|
2757
|
+
overflow: hidden;
|
|
2758
|
+
}
|
|
2759
|
+
.twm-expression-modal__window-content .twm-expression-modal__meta {
|
|
2760
|
+
padding: var(--space-md) 12px;
|
|
2761
|
+
font-size: var(--font-size-xs);
|
|
2762
|
+
color: var(--text-muted);
|
|
2763
|
+
border-bottom: 1px solid #333;
|
|
2764
|
+
flex-shrink: 0;
|
|
2765
|
+
}
|
|
2766
|
+
.twm-expression-modal__window-content .twm-expression-modal__editor-container {
|
|
2767
|
+
flex: 1;
|
|
2768
|
+
overflow: hidden;
|
|
2769
|
+
display: flex;
|
|
2770
|
+
flex-direction: column;
|
|
2771
|
+
padding: 5px;
|
|
2772
|
+
}
|
|
2773
|
+
/* ========== Confirm Dialog Content ========== */
|
|
2774
|
+
|
|
2775
|
+
.twm-confirm-dialog__content {
|
|
2776
|
+
display: flex;
|
|
2777
|
+
flex-direction: column;
|
|
2778
|
+
height: 100%;
|
|
2779
|
+
padding: var(--space-xl);
|
|
2780
|
+
box-sizing: border-box;
|
|
2781
|
+
}
|
|
2782
|
+
.twm-confirm-dialog__body {
|
|
2783
|
+
flex: 1;
|
|
2784
|
+
display: flex;
|
|
2785
|
+
align-items: flex-start;
|
|
2786
|
+
gap: var(--space-lg);
|
|
2787
|
+
}
|
|
2788
|
+
.twm-confirm-dialog__icon {
|
|
2789
|
+
font-size: 32px;
|
|
2790
|
+
color: var(--text-muted);
|
|
2791
|
+
flex-shrink: 0;
|
|
2792
|
+
}
|
|
2793
|
+
.twm-confirm-dialog__message {
|
|
2794
|
+
flex: 1;
|
|
2795
|
+
font-size: var(--font-size-md);
|
|
2796
|
+
color: var(--text-secondary);
|
|
2797
|
+
line-height: 1.5;
|
|
2798
|
+
white-space: pre-wrap;
|
|
2799
|
+
padding-top: var(--space-xs);
|
|
2800
|
+
}
|
|
2801
|
+
.twm-confirm-dialog__actions {
|
|
2802
|
+
display: flex;
|
|
2803
|
+
justify-content: flex-end;
|
|
2804
|
+
gap: var(--space-md);
|
|
2805
|
+
margin-top: var(--space-xl);
|
|
2806
|
+
padding-top: var(--space-lg);
|
|
2807
|
+
border-top: 1px solid #333;
|
|
2808
|
+
}
|
|
2809
|
+
/* Confirm dialog buttons - override global button styles */
|
|
2810
|
+
button.twm-confirm-dialog__btn {
|
|
2811
|
+
padding: var(--space-sm) 16px;
|
|
2812
|
+
border: 1px solid #444;
|
|
2813
|
+
border-radius: var(--radius-sm);
|
|
2814
|
+
font-size: var(--font-size-sm);
|
|
2815
|
+
font-family: inherit;
|
|
2816
|
+
cursor: pointer;
|
|
2817
|
+
transition: background-color var(--transition-normal), border-color var(--transition-normal);
|
|
2818
|
+
}
|
|
2819
|
+
button.twm-confirm-dialog__btn--primary {
|
|
2820
|
+
background: var(--accent);
|
|
2821
|
+
border-color: var(--accent);
|
|
2822
|
+
}
|
|
2823
|
+
button.twm-confirm-dialog__btn--primary:hover {
|
|
2824
|
+
background: var(--accent-hover);
|
|
2825
|
+
border-color: var(--accent-hover);
|
|
2826
|
+
}
|
|
2827
|
+
button.twm-confirm-dialog__btn:focus {
|
|
2828
|
+
outline: 2px solid var(--accent-bright);
|
|
2829
|
+
outline-offset: 2px;
|
|
2830
|
+
}
|
|
2831
|
+
|
|
2832
|
+
/* ── from about_dialog.css ───────────────────────── */
|
|
2833
|
+
/**
|
|
2834
|
+
* About Dialog Styles
|
|
2835
|
+
* Modal dialog showing EcoSim version, license, and third-party credits.
|
|
2836
|
+
*/
|
|
2837
|
+
|
|
2838
|
+
/* ========== Root Container ========== */
|
|
2839
|
+
|
|
2840
|
+
.twm-about-dialog__content {
|
|
2841
|
+
display: flex;
|
|
2842
|
+
flex-direction: column;
|
|
2843
|
+
height: 100%;
|
|
2844
|
+
box-sizing: border-box;
|
|
2845
|
+
}
|
|
2846
|
+
/* ========== Header ========== */
|
|
2847
|
+
|
|
2848
|
+
.twm-about-dialog__header {
|
|
2849
|
+
display: flex;
|
|
2850
|
+
flex-direction: column;
|
|
2851
|
+
align-items: center;
|
|
2852
|
+
gap: var(--space-xs);
|
|
2853
|
+
padding: 20px 16px 16px;
|
|
2854
|
+
border-bottom: 1px solid #333;
|
|
2855
|
+
flex-shrink: 0;
|
|
2856
|
+
}
|
|
2857
|
+
.twm-about-dialog__logo {
|
|
2858
|
+
font-size: 40px;
|
|
2859
|
+
color: var(--accent-bright);
|
|
2860
|
+
}
|
|
2861
|
+
.twm-about-dialog__title {
|
|
2862
|
+
font-size: 20px;
|
|
2863
|
+
font-weight: 600;
|
|
2864
|
+
color: var(--text-secondary);
|
|
2865
|
+
margin: 0;
|
|
2866
|
+
}
|
|
2867
|
+
.twm-about-dialog__version {
|
|
2868
|
+
font-size: var(--font-size-sm);
|
|
2869
|
+
color: var(--text-muted);
|
|
2870
|
+
}
|
|
2871
|
+
.twm-about-dialog__tagline {
|
|
2872
|
+
font-size: var(--font-size-sm);
|
|
2873
|
+
color: var(--text-muted);
|
|
2874
|
+
}
|
|
2875
|
+
/* ========== Scrollable Body ========== */
|
|
2876
|
+
|
|
2877
|
+
.twm-about-dialog__body {
|
|
2878
|
+
flex: 1;
|
|
2879
|
+
overflow-y: auto;
|
|
2880
|
+
padding: var(--space-lg) 16px;
|
|
2881
|
+
min-height: 0;
|
|
2882
|
+
}
|
|
2883
|
+
/* ========== Sections ========== */
|
|
2884
|
+
|
|
2885
|
+
.twm-about-dialog__section {
|
|
2886
|
+
margin-bottom: 14px;
|
|
2887
|
+
}
|
|
2888
|
+
.twm-about-dialog__section:last-child {
|
|
2889
|
+
margin-bottom: 0;
|
|
2890
|
+
}
|
|
2891
|
+
.twm-about-dialog__section-title {
|
|
2892
|
+
font-size: var(--font-size-xs);
|
|
2893
|
+
font-weight: 600;
|
|
2894
|
+
color: var(--text-muted);
|
|
2895
|
+
text-transform: uppercase;
|
|
2896
|
+
letter-spacing: 0.06em;
|
|
2897
|
+
margin-bottom: var(--space-md);
|
|
2898
|
+
}
|
|
2899
|
+
/* ========== Project Links ========== */
|
|
2900
|
+
|
|
2901
|
+
.twm-about-dialog__links {
|
|
2902
|
+
display: flex;
|
|
2903
|
+
flex-direction: column;
|
|
2904
|
+
gap: var(--space-sm);
|
|
2905
|
+
}
|
|
2906
|
+
.twm-about-dialog__link {
|
|
2907
|
+
display: inline-flex;
|
|
2908
|
+
align-items: center;
|
|
2909
|
+
gap: var(--space-sm);
|
|
2910
|
+
font-size: var(--font-size-sm);
|
|
2911
|
+
color: #3794ff;
|
|
2912
|
+
text-decoration: none;
|
|
2913
|
+
cursor: pointer;
|
|
2914
|
+
}
|
|
2915
|
+
.twm-about-dialog__link:hover {
|
|
2916
|
+
text-decoration: underline;
|
|
2917
|
+
color: #4da6ff;
|
|
2918
|
+
}
|
|
2919
|
+
.twm-about-dialog__license-text {
|
|
2920
|
+
font-size: var(--font-size-sm);
|
|
2921
|
+
color: var(--text-muted);
|
|
2922
|
+
display: inline-flex;
|
|
2923
|
+
align-items: center;
|
|
2924
|
+
gap: var(--space-sm);
|
|
2925
|
+
}
|
|
2926
|
+
/* ========== Dependency List ========== */
|
|
2927
|
+
|
|
2928
|
+
.twm-about-dialog__dep-list {
|
|
2929
|
+
display: flex;
|
|
2930
|
+
flex-direction: column;
|
|
2931
|
+
gap: var(--space-xs);
|
|
2932
|
+
}
|
|
2933
|
+
.twm-about-dialog__dep {
|
|
2934
|
+
display: flex;
|
|
2935
|
+
align-items: baseline;
|
|
2936
|
+
gap: var(--space-md);
|
|
2937
|
+
padding: var(--space-xxs) 0;
|
|
2938
|
+
}
|
|
2939
|
+
.twm-about-dialog__dep-name {
|
|
2940
|
+
font-size: var(--font-size-sm);
|
|
2941
|
+
color: #3794ff;
|
|
2942
|
+
text-decoration: none;
|
|
2943
|
+
cursor: pointer;
|
|
2944
|
+
flex-shrink: 0;
|
|
2945
|
+
}
|
|
2946
|
+
.twm-about-dialog__dep-name:hover {
|
|
2947
|
+
text-decoration: underline;
|
|
2948
|
+
color: #4da6ff;
|
|
2949
|
+
}
|
|
2950
|
+
.twm-about-dialog__dep-license {
|
|
2951
|
+
font-size: var(--font-size-xs);
|
|
2952
|
+
color: var(--text-dim);
|
|
2953
|
+
flex-shrink: 0;
|
|
2954
|
+
}
|
|
2955
|
+
/* ========== Footer ========== */
|
|
2956
|
+
|
|
2957
|
+
.twm-about-dialog__footer {
|
|
2958
|
+
display: flex;
|
|
2959
|
+
justify-content: flex-end;
|
|
2960
|
+
padding: 10px 16px;
|
|
2961
|
+
border-top: 1px solid #333;
|
|
2962
|
+
flex-shrink: 0;
|
|
2963
|
+
}
|
|
2964
|
+
button.twm-about-dialog__btn {
|
|
2965
|
+
padding: var(--space-sm) 16px;
|
|
2966
|
+
border: 1px solid #444;
|
|
2967
|
+
border-radius: var(--radius-sm);
|
|
2968
|
+
font-size: var(--font-size-sm);
|
|
2969
|
+
font-family: inherit;
|
|
2970
|
+
cursor: pointer;
|
|
2971
|
+
transition: background-color var(--transition-normal), border-color var(--transition-normal);
|
|
2972
|
+
}
|
|
2973
|
+
button.twm-about-dialog__btn--close {
|
|
2974
|
+
background: var(--accent);
|
|
2975
|
+
border-color: var(--accent);
|
|
2976
|
+
color: var(--text-bright);
|
|
2977
|
+
}
|
|
2978
|
+
button.twm-about-dialog__btn--close:hover {
|
|
2979
|
+
background: var(--accent-hover);
|
|
2980
|
+
border-color: var(--accent-hover);
|
|
2981
|
+
}
|
|
2982
|
+
button.twm-about-dialog__btn--close:focus {
|
|
2983
|
+
outline: 2px solid var(--accent-bright);
|
|
2984
|
+
outline-offset: 2px;
|
|
2985
|
+
}
|
|
2986
|
+
|
|
2987
|
+
/* ── from components/detail_header.css ───────────────────────── */
|
|
2988
|
+
/* ═══════════════════════════════════════════════════════════════════════════
|
|
2989
|
+
DetailHeader — shared header bar for detail views across all pages.
|
|
2990
|
+
Used by: Scenario page, ETL page, Data page, Notebook editors.
|
|
2991
|
+
═══════════════════════════════════════════════════════════════════════════ */
|
|
2992
|
+
|
|
2993
|
+
.twm-detail-header {
|
|
2994
|
+
display: flex;
|
|
2995
|
+
align-items: center;
|
|
2996
|
+
justify-content: space-between;
|
|
2997
|
+
gap: var(--space-xl);
|
|
2998
|
+
padding-bottom: var(--space-lg);
|
|
2999
|
+
flex-wrap: wrap;
|
|
3000
|
+
}
|
|
3001
|
+
.twm-detail-header__title-row {
|
|
3002
|
+
display: flex;
|
|
3003
|
+
align-items: center;
|
|
3004
|
+
gap: 10px;
|
|
3005
|
+
min-width: 0;
|
|
3006
|
+
}
|
|
3007
|
+
.twm-detail-header__icon {
|
|
3008
|
+
font-size: 20px;
|
|
3009
|
+
color: var(--text-muted, var(--text-muted));
|
|
3010
|
+
flex-shrink: 0;
|
|
3011
|
+
}
|
|
3012
|
+
.twm-detail-header__name {
|
|
3013
|
+
font-size: var(--font-size-2xl);
|
|
3014
|
+
font-weight: 600;
|
|
3015
|
+
color: var(--text-primary, #f0f0f0);
|
|
3016
|
+
margin: 0;
|
|
3017
|
+
white-space: nowrap;
|
|
3018
|
+
overflow: hidden;
|
|
3019
|
+
text-overflow: ellipsis;
|
|
3020
|
+
cursor: default;
|
|
3021
|
+
}
|
|
3022
|
+
.twm-detail-header__name[data-renameable] {
|
|
3023
|
+
cursor: text;
|
|
3024
|
+
}
|
|
3025
|
+
.twm-detail-header__name[data-renameable]:hover {
|
|
3026
|
+
color: var(--text-bright);
|
|
3027
|
+
}
|
|
3028
|
+
/* Inline rename input (injected by InlineRenamer) */
|
|
3029
|
+
.twm-detail-header__name .twm-node-edit-input {
|
|
3030
|
+
font: inherit;
|
|
3031
|
+
font-size: var(--font-size-2xl);
|
|
3032
|
+
font-weight: 600;
|
|
3033
|
+
background: var(--surface-1));
|
|
3034
|
+
border: 1px solid var(--accent);
|
|
3035
|
+
border-radius: var(--radius-sm);
|
|
3036
|
+
color: var(--text-primary, #f0f0f0);
|
|
3037
|
+
padding: 0 4px;
|
|
3038
|
+
margin: -2px 0;
|
|
3039
|
+
outline: none;
|
|
3040
|
+
width: 100%;
|
|
3041
|
+
min-width: 100px;
|
|
3042
|
+
}
|
|
3043
|
+
/* ─── Badges ──────────────────────────────────────────────────────────── */
|
|
3044
|
+
|
|
3045
|
+
/* .detail-header__badge* — moved to components/controls.css (Phase 2). */
|
|
3046
|
+
|
|
3047
|
+
/* ─── Subtitle ────────────────────────────────────────────────────────── */
|
|
3048
|
+
|
|
3049
|
+
.twm-detail-header__subtitle {
|
|
3050
|
+
width: 100%;
|
|
3051
|
+
font-size: var(--font-size-sm);
|
|
3052
|
+
color: var(--text-muted, var(--text-muted));
|
|
3053
|
+
margin-top: -8px;
|
|
3054
|
+
padding-left: 30px;
|
|
3055
|
+
}
|
|
3056
|
+
.twm-detail-header__subtitle strong {
|
|
3057
|
+
color: var(--text-primary, var(--text-primary));
|
|
3058
|
+
}
|
|
3059
|
+
/* ─── Actions ─────────────────────────────────────────────────────────── */
|
|
3060
|
+
|
|
3061
|
+
.twm-detail-header__actions {
|
|
3062
|
+
display: flex;
|
|
3063
|
+
align-items: center;
|
|
3064
|
+
gap: var(--space-sm);
|
|
3065
|
+
flex-shrink: 0;
|
|
3066
|
+
}
|
|
3067
|
+
|
|
3068
|
+
/* ── from components/attribute_list_editor.css ───────────────────────── */
|
|
3069
|
+
/* attribute_list_editor.css — generic AttributeSpec list editor.
|
|
3070
|
+
*
|
|
3071
|
+
* The component sets `--cols` on the host element based on the
|
|
3072
|
+
* `showColumns` spec — header strip and row cells share the same
|
|
3073
|
+
* grid template so labels stay aligned with their inputs. Each
|
|
3074
|
+
* cell uses the standard dark-theme tokens; the editor never owns
|
|
3075
|
+
* row chrome (that's SortableList's job).
|
|
3076
|
+
*/
|
|
3077
|
+
|
|
3078
|
+
.twm-attr-editor {
|
|
3079
|
+
display: flex;
|
|
3080
|
+
flex-direction: column;
|
|
3081
|
+
gap: 0.25em;
|
|
3082
|
+
margin-top: 0.25em;
|
|
3083
|
+
}
|
|
3084
|
+
/* Header strip now sits inside a SortableList row chrome so the
|
|
3085
|
+
* `[handle][content][remove]` flex layout matches each data row
|
|
3086
|
+
* exactly — no more hardcoded `padding: 0 2em` that drifted as soon
|
|
3087
|
+
* as space-md or the icon size changed. The placeholder spans
|
|
3088
|
+
* (`.twm-attr-editor__header-placeholder`) reserve the handle + remove
|
|
3089
|
+
* gutters; the inner `__headers` div is the column-grid that aligns
|
|
3090
|
+
* with each row's `.twm-attr-editor__row` grid. */
|
|
3091
|
+
.twm-attr-editor__header-row {
|
|
3092
|
+
background: transparent;
|
|
3093
|
+
border: 1px solid transparent; /* keep height parity with data rows */
|
|
3094
|
+
cursor: default;
|
|
3095
|
+
}
|
|
3096
|
+
.twm-attr-editor__header-row:hover {
|
|
3097
|
+
border-color: transparent;
|
|
3098
|
+
}
|
|
3099
|
+
.twm-attr-editor__header-placeholder {
|
|
3100
|
+
visibility: hidden;
|
|
3101
|
+
pointer-events: none;
|
|
3102
|
+
}
|
|
3103
|
+
.twm-attr-editor__headers {
|
|
3104
|
+
display: grid;
|
|
3105
|
+
grid-template-columns: var(--cols, 1fr);
|
|
3106
|
+
gap: 0.4em;
|
|
3107
|
+
font-size: 0.75em;
|
|
3108
|
+
text-transform: uppercase;
|
|
3109
|
+
letter-spacing: 0.05em;
|
|
3110
|
+
color: var(--ea-text-muted, #888);
|
|
3111
|
+
}
|
|
3112
|
+
.twm-attr-editor__row {
|
|
3113
|
+
display: grid;
|
|
3114
|
+
grid-template-columns: var(--cols, 1fr);
|
|
3115
|
+
gap: 0.4em;
|
|
3116
|
+
align-items: center;
|
|
3117
|
+
/* Overridden rows append `__attention` + `__revert` siblings. We
|
|
3118
|
+
* pull those out of the grid flow (absolute) so the cells keep
|
|
3119
|
+
* their column tracks regardless of override state — otherwise the
|
|
3120
|
+
* grid auto-creates implicit tracks for the extras and shifts every
|
|
3121
|
+
* column. `position: relative` anchors the absolute children. */
|
|
3122
|
+
position: relative;
|
|
3123
|
+
}
|
|
3124
|
+
.twm-attr-editor__cell {
|
|
3125
|
+
background: var(--ea-input-bg, #1e1e1e);
|
|
3126
|
+
color: var(--ea-text, #ddd);
|
|
3127
|
+
border: 1px solid var(--ea-border, #444);
|
|
3128
|
+
padding: 0.25em 0.4em;
|
|
3129
|
+
font: inherit;
|
|
3130
|
+
box-sizing: border-box;
|
|
3131
|
+
min-width: 0;
|
|
3132
|
+
width: 100%;
|
|
3133
|
+
}
|
|
3134
|
+
/* Native <select> defaults render with light-grey chrome on most
|
|
3135
|
+
* browsers even when the background is set. Force the dark palette
|
|
3136
|
+
* + suppress the OS arrow so the type cell matches the surrounding
|
|
3137
|
+
* dark inputs in both closed AND row-tinted states. */
|
|
3138
|
+
.twm-attr-editor select.twm-attr-editor__cell {
|
|
3139
|
+
background-color: var(--ea-input-bg, #1e1e1e);
|
|
3140
|
+
color: var(--ea-text, #ddd);
|
|
3141
|
+
-webkit-appearance: none;
|
|
3142
|
+
-moz-appearance: none;
|
|
3143
|
+
appearance: none;
|
|
3144
|
+
background-image: linear-gradient(45deg, transparent 50%, var(--ea-text-muted, #888) 50%),
|
|
3145
|
+
linear-gradient(135deg, var(--ea-text-muted, #888) 50%, transparent 50%);
|
|
3146
|
+
background-position: calc(100% - 14px) 50%, calc(100% - 10px) 50%;
|
|
3147
|
+
background-size: 4px 4px, 4px 4px;
|
|
3148
|
+
background-repeat: no-repeat;
|
|
3149
|
+
padding-right: 1.5em;
|
|
3150
|
+
}
|
|
3151
|
+
.twm-attr-editor select.twm-attr-editor__cell option {
|
|
3152
|
+
background: var(--ea-input-bg, #1e1e1e);
|
|
3153
|
+
color: var(--ea-text, #ddd);
|
|
3154
|
+
}
|
|
3155
|
+
.twm-attr-editor select.twm-attr-editor__cell optgroup {
|
|
3156
|
+
background: var(--ea-bg-chrome, #161616);
|
|
3157
|
+
color: var(--ea-text-muted, #888);
|
|
3158
|
+
font-style: normal;
|
|
3159
|
+
}
|
|
3160
|
+
.twm-attr-editor__cell--readonly {
|
|
3161
|
+
background: transparent;
|
|
3162
|
+
color: var(--ea-text-muted, #888);
|
|
3163
|
+
font-family: monospace;
|
|
3164
|
+
font-size: 0.85em;
|
|
3165
|
+
border: 1px dashed var(--ea-border, #2a2a2a);
|
|
3166
|
+
}
|
|
3167
|
+
.twm-attr-editor__row input[type="checkbox"].twm-attr-editor__cell {
|
|
3168
|
+
width: auto;
|
|
3169
|
+
justify-self: start;
|
|
3170
|
+
}
|
|
3171
|
+
/* Layer 8.J1 — inheritance state. Each row gets one of three modifiers:
|
|
3172
|
+
*
|
|
3173
|
+
* --inherited: value matches the parent archetype's default. The
|
|
3174
|
+
* row gets a light blue tint AND each input cell tinted
|
|
3175
|
+
* the same so the signal reads against the dark theme.
|
|
3176
|
+
* --overridden: value differs from the parent archetype's default.
|
|
3177
|
+
* Solarized orange tint + attention dot on the left +
|
|
3178
|
+
* revert button on the right.
|
|
3179
|
+
* --neutral: no parent archetype defines this attribute. Default
|
|
3180
|
+
* styling.
|
|
3181
|
+
*
|
|
3182
|
+
* Tinting the inputs (not just the row container) is what makes the
|
|
3183
|
+
* signal actually visible in the dark theme — a 0.10 alpha background
|
|
3184
|
+
* behind dark inputs is invisible. */
|
|
3185
|
+
|
|
3186
|
+
.twm-attr-editor__row {
|
|
3187
|
+
padding: 0.15em 0.25em;
|
|
3188
|
+
border-left: 3px solid transparent;
|
|
3189
|
+
border-radius: 2px;
|
|
3190
|
+
transition: background 120ms, border-color 120ms;
|
|
3191
|
+
}
|
|
3192
|
+
/* Inherited / matching state — same green as the Public API card's
|
|
3193
|
+
* "matches archetype" rows, so the colour grammar reads consistently
|
|
3194
|
+
* across attributes and methods: green = matches the archetype,
|
|
3195
|
+
* orange = overrides, neutral = no parent involved. */
|
|
3196
|
+
.twm-attr-editor__row--inherited {
|
|
3197
|
+
background: rgba(96, 192, 96, 0.15);
|
|
3198
|
+
border-left-color: #60c060;
|
|
3199
|
+
}
|
|
3200
|
+
.twm-attr-editor__row--inherited input.twm-attr-editor__cell {
|
|
3201
|
+
background: rgba(96, 192, 96, 0.08);
|
|
3202
|
+
border-color: rgba(96, 192, 96, 0.40);
|
|
3203
|
+
}
|
|
3204
|
+
.twm-attr-editor__row--inherited select.twm-attr-editor__cell {
|
|
3205
|
+
/* Native <select> can't render a semi-transparent background
|
|
3206
|
+
* reliably (the OS popup picks up the literal colour as its
|
|
3207
|
+
* backing). Keep the dark base, signal "inherited" via border
|
|
3208
|
+
* accent only. */
|
|
3209
|
+
background-color: var(--ea-input-bg, #1e1e1e);
|
|
3210
|
+
border-color: rgba(96, 192, 96, 0.60);
|
|
3211
|
+
}
|
|
3212
|
+
.twm-attr-editor__row--overridden {
|
|
3213
|
+
background: rgba(204, 120, 65, 0.22);
|
|
3214
|
+
border-left-color: #d18138;
|
|
3215
|
+
}
|
|
3216
|
+
.twm-attr-editor__row--overridden input.twm-attr-editor__cell {
|
|
3217
|
+
background: rgba(204, 120, 65, 0.10);
|
|
3218
|
+
border-color: rgba(209, 129, 56, 0.50);
|
|
3219
|
+
color: #f0c189;
|
|
3220
|
+
}
|
|
3221
|
+
.twm-attr-editor__row--overridden select.twm-attr-editor__cell {
|
|
3222
|
+
background-color: var(--ea-input-bg, #1e1e1e);
|
|
3223
|
+
border-color: rgba(209, 129, 56, 0.60);
|
|
3224
|
+
color: #f0c189;
|
|
3225
|
+
}
|
|
3226
|
+
/* R7 — variation-override flag treatments. These additively layer on
|
|
3227
|
+
* top of the inheritance grammar (above), so an `optional` inherited
|
|
3228
|
+
* row keeps its green background AND gets the optional border accent.
|
|
3229
|
+
*
|
|
3230
|
+
* disabled : the archetype declared the slot but turned it off. The
|
|
3231
|
+
* row is greyed out to make clear it's not carried into
|
|
3232
|
+
* descendants.
|
|
3233
|
+
* forced : variations can't override this slot. Cells appear
|
|
3234
|
+
* non-editable; the lock icon (added by JS) signals why.
|
|
3235
|
+
* optional : the value is a suggestion. Green border, NO fill — so
|
|
3236
|
+
* it's visually distinct from `inherited` (green fill).
|
|
3237
|
+
* Variations may override without warning.
|
|
3238
|
+
*/
|
|
3239
|
+
.twm-attr-editor__row--disabled {
|
|
3240
|
+
opacity: 0.55;
|
|
3241
|
+
border-left-color: var(--ea-text-dim, #777);
|
|
3242
|
+
}
|
|
3243
|
+
.twm-attr-editor__row--forced {
|
|
3244
|
+
border-left-color: #b48be0; /* soft purple = locked */
|
|
3245
|
+
}
|
|
3246
|
+
.twm-attr-editor__row--forced input.twm-attr-editor__cell,
|
|
3247
|
+
.twm-attr-editor__row--forced select.twm-attr-editor__cell {
|
|
3248
|
+
background-color: rgba(180, 139, 224, 0.08);
|
|
3249
|
+
border-color: rgba(180, 139, 224, 0.40);
|
|
3250
|
+
}
|
|
3251
|
+
.twm-attr-editor__row--optional {
|
|
3252
|
+
border-left-color: #60c060; /* same green as inherited, ... */
|
|
3253
|
+
background: transparent; /* ...but no fill — that's the cue */
|
|
3254
|
+
}
|
|
3255
|
+
.twm-attr-editor__row--optional input.twm-attr-editor__cell,
|
|
3256
|
+
.twm-attr-editor__row--optional select.twm-attr-editor__cell {
|
|
3257
|
+
background-color: var(--ea-input-bg, #1e1e1e);
|
|
3258
|
+
border-color: rgba(96, 192, 96, 0.50);
|
|
3259
|
+
}
|
|
3260
|
+
.twm-attr-editor__attention {
|
|
3261
|
+
/* Positioned in the row's left gutter so it doesn't push the
|
|
3262
|
+
* cells. The row already has `position: relative`. */
|
|
3263
|
+
position: absolute;
|
|
3264
|
+
left: -14px;
|
|
3265
|
+
top: 50%;
|
|
3266
|
+
transform: translateY(-50%);
|
|
3267
|
+
color: #d18138; /* solarized orange */
|
|
3268
|
+
font-size: 0.85em;
|
|
3269
|
+
pointer-events: none;
|
|
3270
|
+
}
|
|
3271
|
+
.twm-attr-editor__revert {
|
|
3272
|
+
/* Floats over the right edge of the row, outside the column grid.
|
|
3273
|
+
* Sits ABOVE the trailing remove-button gutter that sortable_list
|
|
3274
|
+
* draws, so it stays visible. */
|
|
3275
|
+
position: absolute;
|
|
3276
|
+
right: 24px;
|
|
3277
|
+
top: 50%;
|
|
3278
|
+
transform: translateY(-50%);
|
|
3279
|
+
background: transparent;
|
|
3280
|
+
border: 0;
|
|
3281
|
+
color: var(--ea-text-muted, #888);
|
|
3282
|
+
cursor: pointer;
|
|
3283
|
+
padding: 0.15em 0.35em;
|
|
3284
|
+
font-size: 1.1em;
|
|
3285
|
+
z-index: 1;
|
|
3286
|
+
}
|
|
3287
|
+
.twm-attr-editor__revert:hover {
|
|
3288
|
+
color: #d18138;
|
|
3289
|
+
}
|
|
3290
|
+
|
|
3291
|
+
/* ── from notebook.css ───────────────────────── */
|
|
3292
|
+
.twm-plot-no-data { padding: var(--space-2xl); text-align: center; color: var(--text-muted); font-size: var(--font-size-md); }
|
|
3293
|
+
/* ─── Autocomplete field — notebook variant ──────────────── */
|
|
3294
|
+
|
|
3295
|
+
.twm-autocomplete-field--notebook .twm-autocomplete-field__input-wrapper {
|
|
3296
|
+
border: 1px solid #569cd6;
|
|
3297
|
+
font-size: var(--font-size-sm);
|
|
3298
|
+
}
|
|
3299
|
+
.twm-autocomplete-field--notebook .twm-autocomplete-field__input-wrapper:focus-within {
|
|
3300
|
+
border-color: #79b8f8;
|
|
3301
|
+
box-shadow: 0 0 3px rgba(86, 156, 214, 0.3);
|
|
3302
|
+
}
|
|
3303
|
+
.twm-autocomplete-field--notebook .twm-autocomplete-field__input {
|
|
3304
|
+
font-family: 'Courier New', Courier, monospace;
|
|
3305
|
+
color: var(--text-body);
|
|
3306
|
+
font-size: var(--font-size-sm);
|
|
3307
|
+
}
|
|
3308
|
+
.twm-autocomplete-field--notebook .twm-autocomplete-field__helper {
|
|
3309
|
+
display: none;
|
|
3310
|
+
}
|
|
3311
|
+
/* ═══════════════════════════════════════════════════════════════════════════
|
|
3312
|
+
Tree Item Badge — small status indicator on file tree items
|
|
3313
|
+
═══════════════════════════════════════════════════════════════════════════ */
|
|
3314
|
+
|
|
3315
|
+
.twm-tree-item__badge {
|
|
3316
|
+
display: inline-flex;
|
|
3317
|
+
align-items: center;
|
|
3318
|
+
justify-content: center;
|
|
3319
|
+
min-width: 16px;
|
|
3320
|
+
height: 16px;
|
|
3321
|
+
padding: 0 4px;
|
|
3322
|
+
border-radius: var(--radius-lg);
|
|
3323
|
+
font-size: 9px;
|
|
3324
|
+
font-weight: 600;
|
|
3325
|
+
flex-shrink: 0;
|
|
3326
|
+
margin-left: auto;
|
|
3327
|
+
line-height: 1;
|
|
3328
|
+
}
|
|
3329
|
+
/* Status dot variant (smaller, no text) */
|
|
3330
|
+
.twm-tree-item__status-dot {
|
|
3331
|
+
width: 7px;
|
|
3332
|
+
height: 7px;
|
|
3333
|
+
border-radius: 50%;
|
|
3334
|
+
flex-shrink: 0;
|
|
3335
|
+
margin-left: auto;
|
|
3336
|
+
}
|
|
3337
|
+
|
|
3338
|
+
/* ── from slide_out_panel.css ───────────────────────── */
|
|
3339
|
+
/* ─── SlideOutPanel ─────────────────────────────────────────────────────────
|
|
3340
|
+
Inline slide-out config panel that overlays its host container from
|
|
3341
|
+
the right edge. Host container must have position:relative; overflow:hidden.
|
|
3342
|
+
──────────────────────────────────────────────────────────────────────────── */
|
|
3343
|
+
|
|
3344
|
+
/* Transparent click-catcher behind the panel. Hidden by default
|
|
3345
|
+
* via `visibility: hidden` (not just display) so it's removed
|
|
3346
|
+
* from the accessibility tree + paint pass when the panel is
|
|
3347
|
+
* closed; the `--visible` modifier flips it back on. */
|
|
3348
|
+
.twm-slide-out-panel__backdrop {
|
|
3349
|
+
position: absolute;
|
|
3350
|
+
inset: 0;
|
|
3351
|
+
z-index: 999;
|
|
3352
|
+
visibility: hidden;
|
|
3353
|
+
pointer-events: none;
|
|
3354
|
+
}
|
|
3355
|
+
.twm-slide-out-panel__backdrop--visible {
|
|
3356
|
+
visibility: visible;
|
|
3357
|
+
pointer-events: auto;
|
|
3358
|
+
}
|
|
3359
|
+
/* Panel container. When closed it sits at translateX(100%) off the
|
|
3360
|
+
* right edge of the host; `visibility: hidden` on the closed state
|
|
3361
|
+
* stops the slid-off panel from intercepting clicks or leaking
|
|
3362
|
+
* paint artifacts at the right edge of the workspace. */
|
|
3363
|
+
.twm-slide-out-panel {
|
|
3364
|
+
position: absolute;
|
|
3365
|
+
right: 0;
|
|
3366
|
+
top: 0;
|
|
3367
|
+
height: 100%;
|
|
3368
|
+
z-index: var(--z-modal);
|
|
3369
|
+
display: flex;
|
|
3370
|
+
flex-direction: column;
|
|
3371
|
+
|
|
3372
|
+
background: #212121;
|
|
3373
|
+
border-left: 1px solid #333;
|
|
3374
|
+
box-shadow: -4px 0 12px rgba(0, 0, 0, 0.35);
|
|
3375
|
+
|
|
3376
|
+
min-width: 400px;
|
|
3377
|
+
|
|
3378
|
+
transform: translateX(100%);
|
|
3379
|
+
transition: transform 200ms ease-out, visibility 0s linear 200ms;
|
|
3380
|
+
visibility: hidden;
|
|
3381
|
+
}
|
|
3382
|
+
.twm-slide-out-panel--open {
|
|
3383
|
+
transform: translateX(0);
|
|
3384
|
+
visibility: visible;
|
|
3385
|
+
transition: transform 200ms ease-out, visibility 0s linear 0s;
|
|
3386
|
+
}
|
|
3387
|
+
/* Header bar */
|
|
3388
|
+
.twm-slide-out-panel__header {
|
|
3389
|
+
display: flex;
|
|
3390
|
+
align-items: center;
|
|
3391
|
+
gap: var(--space-sm);
|
|
3392
|
+
padding: var(--space-md) 8px 8px 12px;
|
|
3393
|
+
border-bottom: 1px solid var(--border-strong);
|
|
3394
|
+
flex-shrink: 0;
|
|
3395
|
+
user-select: none;
|
|
3396
|
+
}
|
|
3397
|
+
.twm-slide-out-panel__title {
|
|
3398
|
+
flex: 1;
|
|
3399
|
+
font-size: var(--font-size-sm);
|
|
3400
|
+
font-weight: 600;
|
|
3401
|
+
color: var(--text-secondary);
|
|
3402
|
+
white-space: nowrap;
|
|
3403
|
+
overflow: hidden;
|
|
3404
|
+
text-overflow: ellipsis;
|
|
3405
|
+
}
|
|
3406
|
+
.twm-slide-out-panel__close {
|
|
3407
|
+
flex-shrink: 0;
|
|
3408
|
+
margin-left: auto;
|
|
3409
|
+
}
|
|
3410
|
+
/* Scrollable body */
|
|
3411
|
+
.twm-slide-out-panel__body {
|
|
3412
|
+
flex: 1;
|
|
3413
|
+
overflow-y: auto;
|
|
3414
|
+
padding: var(--space-md);
|
|
3415
|
+
}
|
|
3416
|
+
|
|
3417
|
+
/* ── from plot_config.css ───────────────────────── */
|
|
3418
|
+
.twm-btn-icon {
|
|
3419
|
+
background: transparent;
|
|
3420
|
+
border: none;
|
|
3421
|
+
color: #8a8f98;
|
|
3422
|
+
cursor: pointer;
|
|
3423
|
+
padding: var(--space-xs);
|
|
3424
|
+
border-radius: var(--radius-sm);
|
|
3425
|
+
display: flex;
|
|
3426
|
+
align-items: center;
|
|
3427
|
+
justify-content: center;
|
|
3428
|
+
transition: color var(--transition-normal), background-color var(--transition-normal);
|
|
3429
|
+
}
|
|
3430
|
+
.twm-btn-icon:hover {
|
|
3431
|
+
color: var(--text-bright);
|
|
3432
|
+
background-color: rgba(255, 255, 255, 0.1);
|
|
3433
|
+
}
|
|
3434
|
+
|
|
3435
|
+
/* ── from tiling/host.css ───────────────────────── */
|
|
3436
|
+
@media (max-width: 900px) {
|
|
3437
|
+
.twm-top-nav__label { display: none; }
|
|
3438
|
+
.twm-top-nav__btn { padding: 0 10px; }
|
|
3439
|
+
}
|