py-data-engine 0.1.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (200) hide show
  1. data_engine/__init__.py +37 -0
  2. data_engine/application/__init__.py +39 -0
  3. data_engine/application/actions.py +42 -0
  4. data_engine/application/catalog.py +151 -0
  5. data_engine/application/control.py +213 -0
  6. data_engine/application/details.py +73 -0
  7. data_engine/application/runtime.py +449 -0
  8. data_engine/application/workspace.py +62 -0
  9. data_engine/authoring/__init__.py +14 -0
  10. data_engine/authoring/builder.py +31 -0
  11. data_engine/authoring/execution/__init__.py +6 -0
  12. data_engine/authoring/execution/app.py +6 -0
  13. data_engine/authoring/execution/context.py +82 -0
  14. data_engine/authoring/execution/continuous.py +176 -0
  15. data_engine/authoring/execution/grouped.py +106 -0
  16. data_engine/authoring/execution/logging.py +83 -0
  17. data_engine/authoring/execution/polling.py +135 -0
  18. data_engine/authoring/execution/runner.py +210 -0
  19. data_engine/authoring/execution/single.py +171 -0
  20. data_engine/authoring/flow.py +361 -0
  21. data_engine/authoring/helpers.py +160 -0
  22. data_engine/authoring/model.py +59 -0
  23. data_engine/authoring/primitives.py +430 -0
  24. data_engine/authoring/services.py +42 -0
  25. data_engine/devtools/__init__.py +3 -0
  26. data_engine/devtools/project_ast_map.py +503 -0
  27. data_engine/docs/__init__.py +1 -0
  28. data_engine/docs/sphinx_source/_static/custom.css +13 -0
  29. data_engine/docs/sphinx_source/api.rst +42 -0
  30. data_engine/docs/sphinx_source/conf.py +37 -0
  31. data_engine/docs/sphinx_source/guides/app-runtime-and-workspaces.md +397 -0
  32. data_engine/docs/sphinx_source/guides/authoring-flow-modules.md +215 -0
  33. data_engine/docs/sphinx_source/guides/configuring-flows.md +185 -0
  34. data_engine/docs/sphinx_source/guides/core-concepts.md +208 -0
  35. data_engine/docs/sphinx_source/guides/database-methods.md +107 -0
  36. data_engine/docs/sphinx_source/guides/duckdb-helpers.md +462 -0
  37. data_engine/docs/sphinx_source/guides/flow-context.md +538 -0
  38. data_engine/docs/sphinx_source/guides/flow-methods.md +206 -0
  39. data_engine/docs/sphinx_source/guides/getting-started.md +271 -0
  40. data_engine/docs/sphinx_source/guides/project-inventory.md +5683 -0
  41. data_engine/docs/sphinx_source/guides/project-map.md +118 -0
  42. data_engine/docs/sphinx_source/guides/recipes.md +268 -0
  43. data_engine/docs/sphinx_source/index.rst +22 -0
  44. data_engine/domain/__init__.py +92 -0
  45. data_engine/domain/actions.py +69 -0
  46. data_engine/domain/catalog.py +128 -0
  47. data_engine/domain/details.py +214 -0
  48. data_engine/domain/diagnostics.py +56 -0
  49. data_engine/domain/errors.py +104 -0
  50. data_engine/domain/inspection.py +99 -0
  51. data_engine/domain/logs.py +118 -0
  52. data_engine/domain/operations.py +172 -0
  53. data_engine/domain/operator.py +72 -0
  54. data_engine/domain/runs.py +155 -0
  55. data_engine/domain/runtime.py +279 -0
  56. data_engine/domain/source_state.py +17 -0
  57. data_engine/domain/support.py +54 -0
  58. data_engine/domain/time.py +23 -0
  59. data_engine/domain/workspace.py +159 -0
  60. data_engine/flow_modules/__init__.py +1 -0
  61. data_engine/flow_modules/flow_module_compiler.py +179 -0
  62. data_engine/flow_modules/flow_module_loader.py +201 -0
  63. data_engine/helpers/__init__.py +25 -0
  64. data_engine/helpers/duckdb.py +705 -0
  65. data_engine/hosts/__init__.py +1 -0
  66. data_engine/hosts/daemon/__init__.py +23 -0
  67. data_engine/hosts/daemon/app.py +221 -0
  68. data_engine/hosts/daemon/bootstrap.py +69 -0
  69. data_engine/hosts/daemon/client.py +465 -0
  70. data_engine/hosts/daemon/commands.py +64 -0
  71. data_engine/hosts/daemon/composition.py +310 -0
  72. data_engine/hosts/daemon/constants.py +15 -0
  73. data_engine/hosts/daemon/entrypoints.py +97 -0
  74. data_engine/hosts/daemon/lifecycle.py +191 -0
  75. data_engine/hosts/daemon/manager.py +272 -0
  76. data_engine/hosts/daemon/ownership.py +126 -0
  77. data_engine/hosts/daemon/runtime_commands.py +188 -0
  78. data_engine/hosts/daemon/runtime_control.py +31 -0
  79. data_engine/hosts/daemon/server.py +84 -0
  80. data_engine/hosts/daemon/shared_state.py +147 -0
  81. data_engine/hosts/daemon/state_sync.py +101 -0
  82. data_engine/platform/__init__.py +1 -0
  83. data_engine/platform/identity.py +35 -0
  84. data_engine/platform/local_settings.py +146 -0
  85. data_engine/platform/theme.py +259 -0
  86. data_engine/platform/workspace_models.py +190 -0
  87. data_engine/platform/workspace_policy.py +333 -0
  88. data_engine/runtime/__init__.py +1 -0
  89. data_engine/runtime/file_watch.py +185 -0
  90. data_engine/runtime/ledger_models.py +116 -0
  91. data_engine/runtime/runtime_db.py +938 -0
  92. data_engine/runtime/shared_state.py +523 -0
  93. data_engine/services/__init__.py +49 -0
  94. data_engine/services/daemon.py +64 -0
  95. data_engine/services/daemon_state.py +40 -0
  96. data_engine/services/flow_catalog.py +102 -0
  97. data_engine/services/flow_execution.py +48 -0
  98. data_engine/services/ledger.py +85 -0
  99. data_engine/services/logs.py +65 -0
  100. data_engine/services/runtime_binding.py +105 -0
  101. data_engine/services/runtime_execution.py +126 -0
  102. data_engine/services/runtime_history.py +62 -0
  103. data_engine/services/settings.py +58 -0
  104. data_engine/services/shared_state.py +28 -0
  105. data_engine/services/theme.py +59 -0
  106. data_engine/services/workspace_provisioning.py +224 -0
  107. data_engine/services/workspaces.py +74 -0
  108. data_engine/ui/__init__.py +3 -0
  109. data_engine/ui/cli/__init__.py +19 -0
  110. data_engine/ui/cli/app.py +161 -0
  111. data_engine/ui/cli/commands_doctor.py +178 -0
  112. data_engine/ui/cli/commands_run.py +80 -0
  113. data_engine/ui/cli/commands_start.py +100 -0
  114. data_engine/ui/cli/commands_workspace.py +97 -0
  115. data_engine/ui/cli/dependencies.py +44 -0
  116. data_engine/ui/cli/parser.py +56 -0
  117. data_engine/ui/gui/__init__.py +25 -0
  118. data_engine/ui/gui/app.py +116 -0
  119. data_engine/ui/gui/bootstrap.py +487 -0
  120. data_engine/ui/gui/bootstrapper.py +140 -0
  121. data_engine/ui/gui/cache_models.py +23 -0
  122. data_engine/ui/gui/control_support.py +185 -0
  123. data_engine/ui/gui/controllers/__init__.py +6 -0
  124. data_engine/ui/gui/controllers/flows.py +439 -0
  125. data_engine/ui/gui/controllers/runtime.py +245 -0
  126. data_engine/ui/gui/dialogs/__init__.py +12 -0
  127. data_engine/ui/gui/dialogs/messages.py +88 -0
  128. data_engine/ui/gui/dialogs/previews.py +222 -0
  129. data_engine/ui/gui/helpers/__init__.py +62 -0
  130. data_engine/ui/gui/helpers/inspection.py +81 -0
  131. data_engine/ui/gui/helpers/lifecycle.py +112 -0
  132. data_engine/ui/gui/helpers/scroll.py +28 -0
  133. data_engine/ui/gui/helpers/theming.py +87 -0
  134. data_engine/ui/gui/icons/dark_light.svg +12 -0
  135. data_engine/ui/gui/icons/documentation.svg +1 -0
  136. data_engine/ui/gui/icons/failed.svg +3 -0
  137. data_engine/ui/gui/icons/group.svg +4 -0
  138. data_engine/ui/gui/icons/home.svg +2 -0
  139. data_engine/ui/gui/icons/manual.svg +2 -0
  140. data_engine/ui/gui/icons/poll.svg +2 -0
  141. data_engine/ui/gui/icons/schedule.svg +4 -0
  142. data_engine/ui/gui/icons/settings.svg +2 -0
  143. data_engine/ui/gui/icons/started.svg +3 -0
  144. data_engine/ui/gui/icons/success.svg +3 -0
  145. data_engine/ui/gui/icons/view-log.svg +3 -0
  146. data_engine/ui/gui/icons.py +50 -0
  147. data_engine/ui/gui/launcher.py +48 -0
  148. data_engine/ui/gui/presenters/__init__.py +72 -0
  149. data_engine/ui/gui/presenters/docs.py +140 -0
  150. data_engine/ui/gui/presenters/logs.py +58 -0
  151. data_engine/ui/gui/presenters/runtime_projection.py +29 -0
  152. data_engine/ui/gui/presenters/sidebar.py +88 -0
  153. data_engine/ui/gui/presenters/steps.py +148 -0
  154. data_engine/ui/gui/presenters/workspace.py +39 -0
  155. data_engine/ui/gui/presenters/workspace_binding.py +75 -0
  156. data_engine/ui/gui/presenters/workspace_settings.py +182 -0
  157. data_engine/ui/gui/preview_models.py +37 -0
  158. data_engine/ui/gui/render_support.py +241 -0
  159. data_engine/ui/gui/rendering/__init__.py +12 -0
  160. data_engine/ui/gui/rendering/artifacts.py +95 -0
  161. data_engine/ui/gui/rendering/icons.py +50 -0
  162. data_engine/ui/gui/runtime.py +47 -0
  163. data_engine/ui/gui/state_support.py +193 -0
  164. data_engine/ui/gui/support.py +214 -0
  165. data_engine/ui/gui/surface.py +209 -0
  166. data_engine/ui/gui/theme.py +720 -0
  167. data_engine/ui/gui/widgets/__init__.py +34 -0
  168. data_engine/ui/gui/widgets/config.py +41 -0
  169. data_engine/ui/gui/widgets/logs.py +62 -0
  170. data_engine/ui/gui/widgets/panels.py +507 -0
  171. data_engine/ui/gui/widgets/sidebar.py +130 -0
  172. data_engine/ui/gui/widgets/steps.py +84 -0
  173. data_engine/ui/tui/__init__.py +5 -0
  174. data_engine/ui/tui/app.py +222 -0
  175. data_engine/ui/tui/bootstrap.py +475 -0
  176. data_engine/ui/tui/bootstrapper.py +117 -0
  177. data_engine/ui/tui/controllers/__init__.py +6 -0
  178. data_engine/ui/tui/controllers/flows.py +349 -0
  179. data_engine/ui/tui/controllers/runtime.py +167 -0
  180. data_engine/ui/tui/runtime.py +34 -0
  181. data_engine/ui/tui/state_support.py +141 -0
  182. data_engine/ui/tui/support.py +63 -0
  183. data_engine/ui/tui/theme.py +204 -0
  184. data_engine/ui/tui/widgets.py +123 -0
  185. data_engine/views/__init__.py +109 -0
  186. data_engine/views/actions.py +80 -0
  187. data_engine/views/artifacts.py +58 -0
  188. data_engine/views/flow_display.py +69 -0
  189. data_engine/views/logs.py +54 -0
  190. data_engine/views/models.py +96 -0
  191. data_engine/views/presentation.py +133 -0
  192. data_engine/views/runs.py +62 -0
  193. data_engine/views/state.py +39 -0
  194. data_engine/views/status.py +13 -0
  195. data_engine/views/text.py +109 -0
  196. py_data_engine-0.1.0.dist-info/METADATA +330 -0
  197. py_data_engine-0.1.0.dist-info/RECORD +200 -0
  198. py_data_engine-0.1.0.dist-info/WHEEL +5 -0
  199. py_data_engine-0.1.0.dist-info/entry_points.txt +2 -0
  200. py_data_engine-0.1.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,720 @@
1
+ """Qt stylesheet adapter over the shared Data Engine theme tokens."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from data_engine.platform.theme import (
6
+ DEFAULT_THEME,
7
+ GITHUB_DARK,
8
+ GITHUB_LIGHT,
9
+ THEMES,
10
+ ThemePalette,
11
+ resolve_theme_name,
12
+ system_theme_name,
13
+ theme_button_text,
14
+ toggle_theme_name,
15
+ )
16
+
17
+
18
+ def stylesheet(theme_name: str = DEFAULT_THEME) -> str:
19
+ """Return the application stylesheet for the requested theme."""
20
+ palette = THEMES[resolve_theme_name(theme_name)]
21
+ return f"""
22
+ QWidget {{
23
+ background: {palette.app_bg};
24
+ color: {palette.text};
25
+ font-family: Helvetica, Arial;
26
+ font-size: 14px;
27
+ }}
28
+ QMainWindow {{
29
+ background: {palette.window_bg};
30
+ }}
31
+ QStatusBar {{
32
+ background: {palette.window_bg};
33
+ color: {palette.muted_text};
34
+ }}
35
+ QFrame#workspacePanel, QFrame#sidebarPanel {{
36
+ background: {palette.panel_bg};
37
+ border: 1px solid {palette.panel_border};
38
+ border-radius: 5px;
39
+ }}
40
+ QFrame#navRail {{
41
+ background: {palette.panel_bg};
42
+ border: 1px solid {palette.panel_border};
43
+ border-radius: 5px;
44
+ }}
45
+ QFrame#inspectorPanel {{
46
+ background: transparent;
47
+ border: none;
48
+ }}
49
+ QFrame#actionBar {{
50
+ background: transparent;
51
+ border: none;
52
+ }}
53
+ QFrame#actionBarGroup {{
54
+ background: {palette.panel_bg};
55
+ border: 1px solid {palette.panel_border};
56
+ border-radius: 5px;
57
+ }}
58
+ QTabWidget#viewStack,
59
+ QTabWidget#viewStack::pane,
60
+ QTabWidget#viewStack > QStackedWidget,
61
+ QTabWidget#viewStack > QStackedWidget > QWidget {{
62
+ background: transparent;
63
+ border: none;
64
+ }}
65
+ QTabWidget#rightTabs, QTabWidget#rightTabs QWidget, QTabWidget#rightTabs QStackedWidget {{
66
+ background: {palette.panel_bg};
67
+ border: none;
68
+ }}
69
+ QWidget#configTab {{
70
+ background: {palette.panel_bg};
71
+ border: none;
72
+ }}
73
+ QFrame#configRow {{
74
+ background: transparent;
75
+ border: none;
76
+ border-bottom: 1px solid {palette.panel_border};
77
+ border-radius: 5px;
78
+ }}
79
+ QScrollArea#sidebarScroll, QWidget#sidebarContent {{
80
+ background: transparent;
81
+ border: none;
82
+ }}
83
+ QScrollArea#sidebarScroll QScrollBar:vertical {{
84
+ width: 0px;
85
+ background: transparent;
86
+ }}
87
+ QFrame#sidebarCueTop, QFrame#sidebarCueBottom {{
88
+ border: none;
89
+ min-height: 8px;
90
+ max-height: 8px;
91
+ background: transparent;
92
+ }}
93
+ QFrame#sidebarCueTop {{
94
+ border-top: 1px solid transparent;
95
+ border-bottom: 1px solid {palette.panel_border};
96
+ }}
97
+ QFrame#sidebarCueBottom {{
98
+ border-top: 1px solid {palette.panel_border};
99
+ border-bottom: 1px solid transparent;
100
+ }}
101
+ QFrame#sidebarGroupRow, QFrame#sidebarFlowRow {{
102
+ background: transparent;
103
+ border: none;
104
+ border-radius: 5px;
105
+ }}
106
+ QFrame#sidebarGroupRow {{
107
+ border-top: 1px solid {palette.panel_border};
108
+ padding: 0px;
109
+ }}
110
+ QFrame#sidebarGroupRow[hovered="true"] {{
111
+ background: transparent;
112
+ border-top: 1px solid {palette.hover_border};
113
+ }}
114
+ QFrame#sidebarFlowRow[hovered="true"] {{
115
+ background: {palette.hover_bg};
116
+ border: 1px solid {palette.hover_border};
117
+ }}
118
+ QFrame#sidebarFlowRow[selected="true"] {{
119
+ background: {palette.button_checked_bg};
120
+ border: 1px solid {palette.button_checked_border};
121
+ }}
122
+ QFrame#sidebarFlowRow[selected="true"][hovered="true"] {{
123
+ background: {palette.button_checked_bg};
124
+ border: 1px solid {palette.button_checked_border};
125
+ }}
126
+ QLabel#sidebarIcon {{
127
+ background: transparent;
128
+ }}
129
+ QLabel#sidebarGroupTitle {{
130
+ background: transparent;
131
+ color: {palette.text};
132
+ font-size: 12px;
133
+ font-weight: 700;
134
+ }}
135
+ QLabel#sidebarGroupMeta {{
136
+ background: transparent;
137
+ color: {palette.muted_text};
138
+ font-size: 10px;
139
+ font-weight: 600;
140
+ }}
141
+ QLabel#sidebarFlowCode {{
142
+ background: transparent;
143
+ color: {palette.text};
144
+ font-size: 11px;
145
+ font-weight: 700;
146
+ }}
147
+ QFrame#sidebarFlowRow[selected="true"] QLabel#sidebarFlowCode,
148
+ QFrame#sidebarFlowRow[selected="true"] QLabel#sidebarFlowMeta,
149
+ QFrame#sidebarFlowRow[selected="true"] QLabel#sidebarFlowNumber,
150
+ QFrame#sidebarFlowRow[selected="true"] QLabel#sidebarStateDot {{
151
+ color: {palette.text};
152
+ }}
153
+ QLabel#sidebarFlowNumber {{
154
+ background: transparent;
155
+ color: {palette.section_text};
156
+ font-size: 10px;
157
+ font-weight: 700;
158
+ min-width: 22px;
159
+ }}
160
+ QLabel#sidebarFlowMeta {{
161
+ background: transparent;
162
+ color: {palette.muted_text};
163
+ font-size: 9px;
164
+ font-weight: 600;
165
+ }}
166
+ QLabel#sidebarFlowMeta[stateColor="success"] {{
167
+ color: {palette.accent_text};
168
+ }}
169
+ QLabel#sidebarFlowMeta[stateColor="warning"] {{
170
+ color: {palette.warning_text};
171
+ }}
172
+ QLabel#sidebarFlowMeta[stateColor="error"] {{
173
+ color: {palette.error_text};
174
+ }}
175
+ QLabel#sidebarStateDot {{
176
+ background: transparent;
177
+ color: {palette.muted_text};
178
+ font-size: 10px;
179
+ }}
180
+ QLabel#sidebarStateDot[stateColor="success"] {{
181
+ color: {palette.accent_text};
182
+ }}
183
+ QLabel#sidebarStateDot[stateColor="warning"] {{
184
+ color: {palette.warning_text};
185
+ }}
186
+ QLabel#sidebarStateDot[stateColor="error"] {{
187
+ color: {palette.error_text};
188
+ }}
189
+ QFrame#operationList {{
190
+ background: transparent;
191
+ border: none;
192
+ }}
193
+ QScrollArea#operationScroll {{
194
+ background: transparent;
195
+ border: none;
196
+ }}
197
+ QScrollArea#operationScroll QScrollBar:vertical {{
198
+ width: 0px;
199
+ background: transparent;
200
+ }}
201
+ QFrame#operationCard {{
202
+ background: {palette.panel_bg};
203
+ border: 1px solid {palette.panel_border};
204
+ border-radius: 5px;
205
+ }}
206
+ QFrame#operationCard[stepState="running"] {{
207
+ background: {palette.button_hover};
208
+ border: 1px solid {palette.button_checked_border};
209
+ }}
210
+ QFrame#operationCard[stepState="success"] {{
211
+ background: {palette.panel_bg};
212
+ border: 1px solid {palette.panel_border};
213
+ }}
214
+ QFrame#operationCard[flashState="complete"] {{
215
+ background: {palette.button_hover};
216
+ border: 1px solid {palette.accent_text};
217
+ }}
218
+ QFrame#operationCard[stepState="failed"] {{
219
+ background: {palette.panel_bg};
220
+ border: 1px solid {palette.error_text};
221
+ }}
222
+ QFrame#operationCueTop, QFrame#operationCueBottom {{
223
+ border: none;
224
+ min-height: 8px;
225
+ max-height: 8px;
226
+ background: transparent;
227
+ }}
228
+ QFrame#operationCueTop {{
229
+ border-top: 1px solid transparent;
230
+ border-bottom: 1px solid {palette.panel_border};
231
+ }}
232
+ QFrame#operationCueBottom {{
233
+ border-top: 1px solid {palette.panel_border};
234
+ border-bottom: 1px solid transparent;
235
+ }}
236
+ QLabel#windowTitle {{
237
+ background: transparent;
238
+ font-size: 30px;
239
+ font-weight: 700;
240
+ color: {palette.text};
241
+ }}
242
+ QFrame#appLogoFrame {{
243
+ background: {palette.panel_bg};
244
+ border: 1px solid {palette.panel_border};
245
+ border-radius: 5px;
246
+ }}
247
+ QLabel#appLogoGlyph {{
248
+ background: transparent;
249
+ border: none;
250
+ }}
251
+ QLabel#windowSubtitle, QLabel#heroMeta {{
252
+ background: transparent;
253
+ color: {palette.muted_text};
254
+ }}
255
+ QFrame#heroHeader {{
256
+ background: transparent;
257
+ border: none;
258
+ }}
259
+ QLabel#heroTitle {{
260
+ background: transparent;
261
+ font-size: 24px;
262
+ font-weight: 700;
263
+ color: {palette.text};
264
+ }}
265
+ QLabel#selectionTitle {{
266
+ background: transparent;
267
+ color: {palette.text};
268
+ font-size: 20px;
269
+ font-weight: 700;
270
+ }}
271
+ QLabel#heroMeta {{
272
+ font-size: 11px;
273
+ font-weight: 700;
274
+ letter-spacing: 0.08em;
275
+ text-transform: uppercase;
276
+ }}
277
+ QLabel#sectionTitle {{
278
+ background: transparent;
279
+ color: {palette.section_text};
280
+ font-size: 12px;
281
+ font-weight: 700;
282
+ letter-spacing: 0.12em;
283
+ text-transform: uppercase;
284
+ }}
285
+ QLabel#sectionMeta {{
286
+ background: transparent;
287
+ color: {palette.muted_text};
288
+ font-size: 11px;
289
+ font-weight: 600;
290
+ }}
291
+ QLabel#workspaceCountsFooter {{
292
+ background: transparent;
293
+ color: {palette.muted_text};
294
+ font-size: 9px;
295
+ font-weight: 600;
296
+ }}
297
+ QLabel#fieldLabel {{
298
+ background: transparent;
299
+ color: {palette.section_text};
300
+ font-size: 10px;
301
+ font-weight: 700;
302
+ text-transform: uppercase;
303
+ }}
304
+ QLabel#fieldValue, QLabel#bodyText {{
305
+ background: transparent;
306
+ color: {palette.text};
307
+ font-size: 12px;
308
+ }}
309
+ QLabel#operationStep {{
310
+ background: transparent;
311
+ color: {palette.section_text};
312
+ font-size: 11px;
313
+ font-weight: 700;
314
+ letter-spacing: 0.08em;
315
+ }}
316
+ QLabel#operationTitle {{
317
+ background: transparent;
318
+ color: {palette.text};
319
+ font-size: 13px;
320
+ font-weight: 600;
321
+ }}
322
+ QFrame#operationCard[flashState="complete"] QLabel#operationTitle,
323
+ QFrame#operationCard[flashState="complete"] QLabel#operationStep,
324
+ QFrame#operationCard[flashState="complete"] QLabel#operationDuration {{
325
+ color: {palette.text};
326
+ }}
327
+ QFrame#operationCard[stepState="running"] QLabel#operationTitle {{
328
+ color: {palette.text};
329
+ }}
330
+ QLabel#operationDuration {{
331
+ background: transparent;
332
+ color: {palette.muted_text};
333
+ font-size: 12px;
334
+ font-weight: 500;
335
+ min-width: 52px;
336
+ }}
337
+ QLabel#errorText {{
338
+ background: transparent;
339
+ color: {palette.error_text};
340
+ font-weight: 600;
341
+ }}
342
+ QFrame#summaryBadge {{
343
+ background: transparent;
344
+ border: none;
345
+ border-radius: 0px;
346
+ }}
347
+ QFrame#summaryItem {{
348
+ background: transparent;
349
+ border: none;
350
+ }}
351
+ QLabel#summaryIcon {{
352
+ background: transparent;
353
+ border: none;
354
+ min-width: 14px;
355
+ max-width: 14px;
356
+ }}
357
+ QLabel#summaryValue {{
358
+ background: transparent;
359
+ font-weight: 700;
360
+ }}
361
+ QLabel#summaryValue[summaryColor="#0969da"] {{
362
+ color: #0969da;
363
+ }}
364
+ QLabel#summaryValue[summaryColor="{palette.warning_text}"] {{
365
+ color: {palette.warning_text};
366
+ }}
367
+ QLabel#summaryValue[summaryColor="#cf222e"] {{
368
+ color: #cf222e;
369
+ }}
370
+ QPushButton {{
371
+ background: {palette.button_bg};
372
+ border: 1px solid {palette.panel_border};
373
+ border-radius: 5px;
374
+ padding: 8px 14px;
375
+ color: {palette.text};
376
+ font-weight: 600;
377
+ }}
378
+ QToolButton#navButton {{
379
+ background: transparent;
380
+ border: 1px solid transparent;
381
+ border-radius: 5px;
382
+ padding: 0px;
383
+ color: {palette.muted_text};
384
+ }}
385
+ QToolButton#navButton:hover {{
386
+ background: {palette.hover_bg};
387
+ border-color: {palette.hover_border};
388
+ color: {palette.text};
389
+ }}
390
+ QToolButton#navButton:checked {{
391
+ background: {palette.selection_bg};
392
+ border-color: {palette.selection_border};
393
+ color: {palette.selection_text};
394
+ }}
395
+ QPushButton#inspectOutputButton {{
396
+ background: {palette.summary_bg};
397
+ border: 1px solid {palette.summary_border};
398
+ border-radius: 5px;
399
+ padding: 2px 8px;
400
+ color: {palette.muted_text};
401
+ font-size: 11px;
402
+ font-weight: 700;
403
+ }}
404
+ QPushButton#inspectOutputButton:hover {{
405
+ background: {palette.button_hover};
406
+ border-color: {palette.hover_border};
407
+ color: {palette.text};
408
+ }}
409
+ QPushButton#inspectOutputButton:disabled {{
410
+ color: transparent;
411
+ background: transparent;
412
+ border-color: transparent;
413
+ }}
414
+ QPushButton:hover {{
415
+ background: {palette.button_hover};
416
+ }}
417
+ QPushButton#requestControlButton {{
418
+ background: {palette.request_control_bg};
419
+ border: 1px solid {palette.request_control_border};
420
+ color: #ffffff;
421
+ }}
422
+ QPushButton#requestControlButton:hover {{
423
+ background: {palette.request_control_hover};
424
+ }}
425
+ QPushButton#requestControlButton:disabled {{
426
+ background: {palette.button_disabled_bg};
427
+ border-color: {palette.button_disabled_border};
428
+ color: {palette.button_disabled_text};
429
+ }}
430
+ QPushButton#engineButton[engineState="stopped"] {{
431
+ background: {palette.engine_start_bg};
432
+ border: 1px solid {palette.engine_start_border};
433
+ color: #ffffff;
434
+ }}
435
+ QPushButton#engineButton[engineState="stopped"]:hover {{
436
+ background: {palette.engine_start_hover};
437
+ }}
438
+ QPushButton#engineButton[engineState="stopped"]:disabled {{
439
+ background: {palette.button_disabled_bg};
440
+ border-color: {palette.button_disabled_border};
441
+ color: {palette.button_disabled_text};
442
+ }}
443
+ QPushButton#engineButton[engineState="running"] {{
444
+ background: {palette.engine_stop_bg};
445
+ border: 1px solid {palette.engine_stop_border};
446
+ color: #ffffff;
447
+ }}
448
+ QPushButton#engineButton[engineState="running"]:hover {{
449
+ background: {palette.engine_stop_hover};
450
+ }}
451
+ QPushButton#engineButton[engineState="running"]:disabled {{
452
+ background: {palette.button_disabled_bg};
453
+ border-color: {palette.button_disabled_border};
454
+ color: {palette.button_disabled_text};
455
+ }}
456
+ QPushButton:checked {{
457
+ background: {palette.button_checked_bg};
458
+ border-color: {palette.button_checked_border};
459
+ color: {palette.text};
460
+ }}
461
+ QPushButton:disabled {{
462
+ color: {palette.button_disabled_text};
463
+ background: {palette.button_disabled_bg};
464
+ border-color: {palette.button_disabled_border};
465
+ }}
466
+ QLineEdit {{
467
+ background: {palette.input_bg};
468
+ border: 1px solid {palette.input_border};
469
+ border-radius: 5px;
470
+ padding: 9px 12px;
471
+ color: {palette.text};
472
+ }}
473
+ QListWidget, QTextEdit {{
474
+ background: transparent;
475
+ border: 1px solid {palette.input_border};
476
+ border-radius: 5px;
477
+ color: {palette.text};
478
+ }}
479
+ QListWidget#logList {{
480
+ background: transparent;
481
+ border: none;
482
+ border-radius: 0px;
483
+ }}
484
+ QListWidget#logList::item {{
485
+ padding: 0px;
486
+ margin: 0px 0px 4px 0px;
487
+ border: none;
488
+ }}
489
+ QListWidget#runLogList {{
490
+ background: transparent;
491
+ border: none;
492
+ border-radius: 0px;
493
+ outline: 0;
494
+ }}
495
+ QListWidget#runLogList::item {{
496
+ padding: 0px;
497
+ margin: 0px;
498
+ border: none;
499
+ }}
500
+ QFrame#logRow, QFrame#logRunRow {{
501
+ background: {palette.panel_bg};
502
+ border: 1px solid {palette.panel_border};
503
+ border-radius: 5px;
504
+ }}
505
+ QFrame#rawLogRow {{
506
+ background: {palette.panel_bg};
507
+ border: 1px solid {palette.panel_border};
508
+ border-radius: 5px;
509
+ }}
510
+ QLabel#logCaret {{
511
+ background: transparent;
512
+ color: {palette.muted_text};
513
+ font-size: 11px;
514
+ font-weight: 700;
515
+ min-width: 12px;
516
+ }}
517
+ QLabel#logPrimary {{
518
+ background: transparent;
519
+ color: {palette.text};
520
+ font-size: 11px;
521
+ font-weight: 700;
522
+ }}
523
+ QLabel#logDuration {{
524
+ background: transparent;
525
+ color: {palette.muted_text};
526
+ font-size: 10px;
527
+ font-weight: 400;
528
+ }}
529
+ QLabel#logSource {{
530
+ background: transparent;
531
+ color: {palette.muted_text};
532
+ font-size: 10px;
533
+ font-weight: 600;
534
+ }}
535
+ QPushButton#logIconButton {{
536
+ background: transparent;
537
+ border: 1px solid transparent;
538
+ border-radius: 5px;
539
+ padding: 2px;
540
+ min-width: 22px;
541
+ max-width: 22px;
542
+ min-height: 22px;
543
+ max-height: 22px;
544
+ }}
545
+ QPushButton#logIconButton:hover {{
546
+ background: {palette.hover_bg};
547
+ border-color: {palette.hover_border};
548
+ }}
549
+ QPushButton#logIconButton:disabled {{
550
+ background: transparent;
551
+ border-color: transparent;
552
+ }}
553
+ QLabel#logStatus {{
554
+ background: {palette.button_bg};
555
+ border: 1px solid {palette.panel_border};
556
+ border-radius: 5px;
557
+ color: {palette.selection_text};
558
+ font-size: 10px;
559
+ font-weight: 700;
560
+ padding: 1px 6px;
561
+ min-height: 16px;
562
+ }}
563
+ QLabel#logStatus[stateColor="success"] {{
564
+ background: {palette.accent_text};
565
+ border-color: {palette.accent_text};
566
+ color: #ffffff;
567
+ }}
568
+ QLabel#logStatus[stateColor="started"] {{
569
+ background: {palette.selection_bg};
570
+ border-color: {palette.selection_bg};
571
+ color: #ffffff;
572
+ }}
573
+ QLabel#logStatus[stateColor="warning"] {{
574
+ background: {palette.warning_text};
575
+ border-color: {palette.warning_text};
576
+ color: #ffffff;
577
+ }}
578
+ QLabel#logStatus[stateColor="error"] {{
579
+ background: {palette.error_text};
580
+ border-color: {palette.error_text};
581
+ color: #ffffff;
582
+ }}
583
+ QLabel#logStatusIcon {{
584
+ background: transparent;
585
+ min-width: 16px;
586
+ max-width: 16px;
587
+ }}
588
+ QDialog#outputPreviewDialog {{
589
+ background: {palette.app_bg};
590
+ }}
591
+ QFrame#outputPreviewHeader {{
592
+ background: {palette.panel_bg};
593
+ border: 1px solid {palette.panel_border};
594
+ border-radius: 5px;
595
+ }}
596
+ QFrame#configPreviewBody {{
597
+ background: {palette.panel_bg};
598
+ border: 1px solid {palette.panel_border};
599
+ border-radius: 5px;
600
+ }}
601
+ QLabel#outputPreviewPath {{
602
+ background: transparent;
603
+ color: {palette.muted_text};
604
+ }}
605
+ QFrame#rawLogRow {{
606
+ background: {palette.panel_bg};
607
+ border: 1px solid {palette.panel_border};
608
+ border-radius: 5px;
609
+ }}
610
+ QWidget#rawLogInspectSlot, QWidget#rawLogIconSlot {{
611
+ background: transparent;
612
+ border: none;
613
+ }}
614
+ QLabel#rawLogTimestamp {{
615
+ background: transparent;
616
+ color: {palette.muted_text};
617
+ font-size: 10px;
618
+ font-weight: 600;
619
+ min-width: 72px;
620
+ }}
621
+ QLabel#rawLogMessage {{
622
+ background: transparent;
623
+ color: {palette.text};
624
+ font-size: 11px;
625
+ font-weight: 500;
626
+ }}
627
+ QLabel#rawLogStatusIcon {{
628
+ background: transparent;
629
+ min-width: 14px;
630
+ max-width: 14px;
631
+ }}
632
+ QLabel#rawLogSource {{
633
+ background: transparent;
634
+ color: {palette.muted_text};
635
+ font-size: 10px;
636
+ font-weight: 600;
637
+ }}
638
+ QTableWidget#outputPreviewTable {{
639
+ background: {palette.panel_bg};
640
+ alternate-background-color: {palette.tab_bg};
641
+ border: 1px solid {palette.input_border};
642
+ border-radius: 5px;
643
+ gridline-color: transparent;
644
+ selection-background-color: {palette.selection_bg};
645
+ selection-color: {palette.selection_text};
646
+ }}
647
+ QTableWidget#outputPreviewTable::item {{
648
+ padding: 6px 8px;
649
+ border: none;
650
+ }}
651
+ QTableWidget#outputPreviewTable QHeaderView::section {{
652
+ background: {palette.summary_bg};
653
+ color: {palette.text};
654
+ border: none;
655
+ border-bottom: 1px solid {palette.panel_border};
656
+ padding: 8px 10px;
657
+ font-weight: 700;
658
+ }}
659
+ QTextEdit#outputPreviewText {{
660
+ background: {palette.panel_bg};
661
+ }}
662
+ QListWidget::item {{
663
+ padding: 4px 6px;
664
+ border-radius: 5px;
665
+ }}
666
+ QListWidget::item:hover {{
667
+ background: {palette.hover_bg};
668
+ color: {palette.text};
669
+ }}
670
+ QListWidget::item:selected {{
671
+ background: {palette.selection_bg};
672
+ color: {palette.selection_text};
673
+ }}
674
+ QTabWidget::pane {{
675
+ background: transparent;
676
+ border: none;
677
+ margin-top: 2px;
678
+ }}
679
+ QTabBar::tab {{
680
+ background: transparent;
681
+ border: none;
682
+ padding: 8px 14px;
683
+ margin-right: 10px;
684
+ color: {palette.muted_text};
685
+ font-weight: 600;
686
+ border-radius: 5px;
687
+ }}
688
+ QTabBar::tab:hover {{
689
+ background: {palette.tab_hover_bg};
690
+ color: {palette.text};
691
+ }}
692
+ QTabBar::tab:selected {{
693
+ background: {palette.tab_selected_bg};
694
+ color: {palette.text};
695
+ border-bottom: 2px solid {palette.text};
696
+ }}
697
+ QProgressBar {{
698
+ background: {palette.progress_bg};
699
+ border: 1px solid {palette.input_border};
700
+ border-radius: 5px;
701
+ }}
702
+ QProgressBar::chunk {{
703
+ background: {palette.progress_chunk};
704
+ border-radius: 5px;
705
+ }}
706
+ """
707
+
708
+
709
+ __all__ = [
710
+ "DEFAULT_THEME",
711
+ "GITHUB_DARK",
712
+ "GITHUB_LIGHT",
713
+ "THEMES",
714
+ "ThemePalette",
715
+ "resolve_theme_name",
716
+ "stylesheet",
717
+ "system_theme_name",
718
+ "theme_button_text",
719
+ "toggle_theme_name",
720
+ ]