pycforge-sdk 0.6.3__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 (559) hide show
  1. pycforge_sdk/__init__.py +6 -0
  2. pycforge_sdk/__main__.py +3 -0
  3. pycforge_sdk/catalogue.py +287 -0
  4. pycforge_sdk/cli.py +114 -0
  5. pycforge_sdk/connection.py +136 -0
  6. pycforge_sdk/discovery.py +227 -0
  7. pycforge_sdk/editing.py +84 -0
  8. pycforge_sdk/engine_launch.py +45 -0
  9. pycforge_sdk/engine_worker.py +53 -0
  10. pycforge_sdk/gui/__init__.py +1 -0
  11. pycforge_sdk/gui/__main__.py +3 -0
  12. pycforge_sdk/gui/app.py +36 -0
  13. pycforge_sdk/gui/dialogs.py +310 -0
  14. pycforge_sdk/gui/editor.py +412 -0
  15. pycforge_sdk/gui/help/index.html +9 -0
  16. pycforge_sdk/gui/identity.py +139 -0
  17. pycforge_sdk/gui/jobs.py +146 -0
  18. pycforge_sdk/gui/reference.py +39 -0
  19. pycforge_sdk/gui/resources/sdk-mark.png +0 -0
  20. pycforge_sdk/gui/scanner.py +134 -0
  21. pycforge_sdk/gui/startup.py +118 -0
  22. pycforge_sdk/gui/visual/__init__.py +1 -0
  23. pycforge_sdk/gui/visual/action_contract.py +550 -0
  24. pycforge_sdk/gui/visual/icons.py +117 -0
  25. pycforge_sdk/gui/visual/qt_actions.py +501 -0
  26. pycforge_sdk/gui/visual/qt_branding.py +47 -0
  27. pycforge_sdk/gui/visual/qt_dialog_chrome.py +337 -0
  28. pycforge_sdk/gui/visual/qt_file_icons.py +130 -0
  29. pycforge_sdk/gui/visual/qt_icons.py +80 -0
  30. pycforge_sdk/gui/visual/qt_screen_geometry.py +166 -0
  31. pycforge_sdk/gui/visual/qt_title_controls.py +333 -0
  32. pycforge_sdk/gui/visual/qt_window_chrome.py +314 -0
  33. pycforge_sdk/gui/visual/qt_window_resize.py +93 -0
  34. pycforge_sdk/gui/visual/qt_workspace_widgets.py +448 -0
  35. pycforge_sdk/gui/visual/resources/icons/128/add-document.png +0 -0
  36. pycforge_sdk/gui/visual/resources/icons/128/brand-mark.png +0 -0
  37. pycforge_sdk/gui/visual/resources/icons/128/bundle-search.png +0 -0
  38. pycforge_sdk/gui/visual/resources/icons/128/cancel.png +0 -0
  39. pycforge_sdk/gui/visual/resources/icons/128/check.png +0 -0
  40. pycforge_sdk/gui/visual/resources/icons/128/chevron-right.png +0 -0
  41. pycforge_sdk/gui/visual/resources/icons/128/close.png +0 -0
  42. pycforge_sdk/gui/visual/resources/icons/128/collapse-all.png +0 -0
  43. pycforge_sdk/gui/visual/resources/icons/128/command-palette.png +0 -0
  44. pycforge_sdk/gui/visual/resources/icons/128/convert.png +0 -0
  45. pycforge_sdk/gui/visual/resources/icons/128/copy.png +0 -0
  46. pycforge_sdk/gui/visual/resources/icons/128/cut.png +0 -0
  47. pycforge_sdk/gui/visual/resources/icons/128/decision-trace.png +0 -0
  48. pycforge_sdk/gui/visual/resources/icons/128/details.png +0 -0
  49. pycforge_sdk/gui/visual/resources/icons/128/diagnostics.png +0 -0
  50. pycforge_sdk/gui/visual/resources/icons/128/duplicate-line.png +0 -0
  51. pycforge_sdk/gui/visual/resources/icons/128/exit.png +0 -0
  52. pycforge_sdk/gui/visual/resources/icons/128/expand-all.png +0 -0
  53. pycforge_sdk/gui/visual/resources/icons/128/export.png +0 -0
  54. pycforge_sdk/gui/visual/resources/icons/128/find.png +0 -0
  55. pycforge_sdk/gui/visual/resources/icons/128/go-to-line.png +0 -0
  56. pycforge_sdk/gui/visual/resources/icons/128/go-to-output.png +0 -0
  57. pycforge_sdk/gui/visual/resources/icons/128/go-to-source.png +0 -0
  58. pycforge_sdk/gui/visual/resources/icons/128/help.png +0 -0
  59. pycforge_sdk/gui/visual/resources/icons/128/history.png +0 -0
  60. pycforge_sdk/gui/visual/resources/icons/128/indent.png +0 -0
  61. pycforge_sdk/gui/visual/resources/icons/128/link-c.png +0 -0
  62. pycforge_sdk/gui/visual/resources/icons/128/mappings.png +0 -0
  63. pycforge_sdk/gui/visual/resources/icons/128/module.png +0 -0
  64. pycforge_sdk/gui/visual/resources/icons/128/move-down.png +0 -0
  65. pycforge_sdk/gui/visual/resources/icons/128/move-line-down.png +0 -0
  66. pycforge_sdk/gui/visual/resources/icons/128/move-line-up.png +0 -0
  67. pycforge_sdk/gui/visual/resources/icons/128/move-up.png +0 -0
  68. pycforge_sdk/gui/visual/resources/icons/128/next.png +0 -0
  69. pycforge_sdk/gui/visual/resources/icons/128/open.png +0 -0
  70. pycforge_sdk/gui/visual/resources/icons/128/outdent.png +0 -0
  71. pycforge_sdk/gui/visual/resources/icons/128/outline.png +0 -0
  72. pycforge_sdk/gui/visual/resources/icons/128/paste.png +0 -0
  73. pycforge_sdk/gui/visual/resources/icons/128/previous.png +0 -0
  74. pycforge_sdk/gui/visual/resources/icons/128/primary-module.png +0 -0
  75. pycforge_sdk/gui/visual/resources/icons/128/redo.png +0 -0
  76. pycforge_sdk/gui/visual/resources/icons/128/remove-document.png +0 -0
  77. pycforge_sdk/gui/visual/resources/icons/128/replace.png +0 -0
  78. pycforge_sdk/gui/visual/resources/icons/128/save-as.png +0 -0
  79. pycforge_sdk/gui/visual/resources/icons/128/save.png +0 -0
  80. pycforge_sdk/gui/visual/resources/icons/128/select-all.png +0 -0
  81. pycforge_sdk/gui/visual/resources/icons/128/settings.png +0 -0
  82. pycforge_sdk/gui/visual/resources/icons/128/show-c.png +0 -0
  83. pycforge_sdk/gui/visual/resources/icons/128/split-view.png +0 -0
  84. pycforge_sdk/gui/visual/resources/icons/128/summary.png +0 -0
  85. pycforge_sdk/gui/visual/resources/icons/128/telemetry.png +0 -0
  86. pycforge_sdk/gui/visual/resources/icons/128/toggle-comment.png +0 -0
  87. pycforge_sdk/gui/visual/resources/icons/128/toggle-fold.png +0 -0
  88. pycforge_sdk/gui/visual/resources/icons/128/tools.png +0 -0
  89. pycforge_sdk/gui/visual/resources/icons/128/undo.png +0 -0
  90. pycforge_sdk/gui/visual/resources/icons/128/whitespace.png +0 -0
  91. pycforge_sdk/gui/visual/resources/icons/16/add-document.png +0 -0
  92. pycforge_sdk/gui/visual/resources/icons/16/brand-mark.png +0 -0
  93. pycforge_sdk/gui/visual/resources/icons/16/bundle-search.png +0 -0
  94. pycforge_sdk/gui/visual/resources/icons/16/cancel.png +0 -0
  95. pycforge_sdk/gui/visual/resources/icons/16/check.png +0 -0
  96. pycforge_sdk/gui/visual/resources/icons/16/chevron-right.png +0 -0
  97. pycforge_sdk/gui/visual/resources/icons/16/close.png +0 -0
  98. pycforge_sdk/gui/visual/resources/icons/16/collapse-all.png +0 -0
  99. pycforge_sdk/gui/visual/resources/icons/16/command-palette.png +0 -0
  100. pycforge_sdk/gui/visual/resources/icons/16/convert.png +0 -0
  101. pycforge_sdk/gui/visual/resources/icons/16/copy.png +0 -0
  102. pycforge_sdk/gui/visual/resources/icons/16/cut.png +0 -0
  103. pycforge_sdk/gui/visual/resources/icons/16/decision-trace.png +0 -0
  104. pycforge_sdk/gui/visual/resources/icons/16/details.png +0 -0
  105. pycforge_sdk/gui/visual/resources/icons/16/diagnostics.png +0 -0
  106. pycforge_sdk/gui/visual/resources/icons/16/duplicate-line.png +0 -0
  107. pycforge_sdk/gui/visual/resources/icons/16/exit.png +0 -0
  108. pycforge_sdk/gui/visual/resources/icons/16/expand-all.png +0 -0
  109. pycforge_sdk/gui/visual/resources/icons/16/export.png +0 -0
  110. pycforge_sdk/gui/visual/resources/icons/16/find.png +0 -0
  111. pycforge_sdk/gui/visual/resources/icons/16/go-to-line.png +0 -0
  112. pycforge_sdk/gui/visual/resources/icons/16/go-to-output.png +0 -0
  113. pycforge_sdk/gui/visual/resources/icons/16/go-to-source.png +0 -0
  114. pycforge_sdk/gui/visual/resources/icons/16/help.png +0 -0
  115. pycforge_sdk/gui/visual/resources/icons/16/history.png +0 -0
  116. pycforge_sdk/gui/visual/resources/icons/16/indent.png +0 -0
  117. pycforge_sdk/gui/visual/resources/icons/16/link-c.png +0 -0
  118. pycforge_sdk/gui/visual/resources/icons/16/mappings.png +0 -0
  119. pycforge_sdk/gui/visual/resources/icons/16/module.png +0 -0
  120. pycforge_sdk/gui/visual/resources/icons/16/move-down.png +0 -0
  121. pycforge_sdk/gui/visual/resources/icons/16/move-line-down.png +0 -0
  122. pycforge_sdk/gui/visual/resources/icons/16/move-line-up.png +0 -0
  123. pycforge_sdk/gui/visual/resources/icons/16/move-up.png +0 -0
  124. pycforge_sdk/gui/visual/resources/icons/16/next.png +0 -0
  125. pycforge_sdk/gui/visual/resources/icons/16/open.png +0 -0
  126. pycforge_sdk/gui/visual/resources/icons/16/outdent.png +0 -0
  127. pycforge_sdk/gui/visual/resources/icons/16/outline.png +0 -0
  128. pycforge_sdk/gui/visual/resources/icons/16/paste.png +0 -0
  129. pycforge_sdk/gui/visual/resources/icons/16/previous.png +0 -0
  130. pycforge_sdk/gui/visual/resources/icons/16/primary-module.png +0 -0
  131. pycforge_sdk/gui/visual/resources/icons/16/redo.png +0 -0
  132. pycforge_sdk/gui/visual/resources/icons/16/remove-document.png +0 -0
  133. pycforge_sdk/gui/visual/resources/icons/16/replace.png +0 -0
  134. pycforge_sdk/gui/visual/resources/icons/16/save-as.png +0 -0
  135. pycforge_sdk/gui/visual/resources/icons/16/save.png +0 -0
  136. pycforge_sdk/gui/visual/resources/icons/16/select-all.png +0 -0
  137. pycforge_sdk/gui/visual/resources/icons/16/settings.png +0 -0
  138. pycforge_sdk/gui/visual/resources/icons/16/show-c.png +0 -0
  139. pycforge_sdk/gui/visual/resources/icons/16/split-view.png +0 -0
  140. pycforge_sdk/gui/visual/resources/icons/16/summary.png +0 -0
  141. pycforge_sdk/gui/visual/resources/icons/16/telemetry.png +0 -0
  142. pycforge_sdk/gui/visual/resources/icons/16/toggle-comment.png +0 -0
  143. pycforge_sdk/gui/visual/resources/icons/16/toggle-fold.png +0 -0
  144. pycforge_sdk/gui/visual/resources/icons/16/tools.png +0 -0
  145. pycforge_sdk/gui/visual/resources/icons/16/undo.png +0 -0
  146. pycforge_sdk/gui/visual/resources/icons/16/whitespace.png +0 -0
  147. pycforge_sdk/gui/visual/resources/icons/20/add-document.png +0 -0
  148. pycforge_sdk/gui/visual/resources/icons/20/brand-mark.png +0 -0
  149. pycforge_sdk/gui/visual/resources/icons/20/bundle-search.png +0 -0
  150. pycforge_sdk/gui/visual/resources/icons/20/cancel.png +0 -0
  151. pycforge_sdk/gui/visual/resources/icons/20/check.png +0 -0
  152. pycforge_sdk/gui/visual/resources/icons/20/chevron-right.png +0 -0
  153. pycforge_sdk/gui/visual/resources/icons/20/close.png +0 -0
  154. pycforge_sdk/gui/visual/resources/icons/20/collapse-all.png +0 -0
  155. pycforge_sdk/gui/visual/resources/icons/20/command-palette.png +0 -0
  156. pycforge_sdk/gui/visual/resources/icons/20/convert.png +0 -0
  157. pycforge_sdk/gui/visual/resources/icons/20/copy.png +0 -0
  158. pycforge_sdk/gui/visual/resources/icons/20/cut.png +0 -0
  159. pycforge_sdk/gui/visual/resources/icons/20/decision-trace.png +0 -0
  160. pycforge_sdk/gui/visual/resources/icons/20/details.png +0 -0
  161. pycforge_sdk/gui/visual/resources/icons/20/diagnostics.png +0 -0
  162. pycforge_sdk/gui/visual/resources/icons/20/duplicate-line.png +0 -0
  163. pycforge_sdk/gui/visual/resources/icons/20/exit.png +0 -0
  164. pycforge_sdk/gui/visual/resources/icons/20/expand-all.png +0 -0
  165. pycforge_sdk/gui/visual/resources/icons/20/export.png +0 -0
  166. pycforge_sdk/gui/visual/resources/icons/20/find.png +0 -0
  167. pycforge_sdk/gui/visual/resources/icons/20/go-to-line.png +0 -0
  168. pycforge_sdk/gui/visual/resources/icons/20/go-to-output.png +0 -0
  169. pycforge_sdk/gui/visual/resources/icons/20/go-to-source.png +0 -0
  170. pycforge_sdk/gui/visual/resources/icons/20/help.png +0 -0
  171. pycforge_sdk/gui/visual/resources/icons/20/history.png +0 -0
  172. pycforge_sdk/gui/visual/resources/icons/20/indent.png +0 -0
  173. pycforge_sdk/gui/visual/resources/icons/20/link-c.png +0 -0
  174. pycforge_sdk/gui/visual/resources/icons/20/mappings.png +0 -0
  175. pycforge_sdk/gui/visual/resources/icons/20/module.png +0 -0
  176. pycforge_sdk/gui/visual/resources/icons/20/move-down.png +0 -0
  177. pycforge_sdk/gui/visual/resources/icons/20/move-line-down.png +0 -0
  178. pycforge_sdk/gui/visual/resources/icons/20/move-line-up.png +0 -0
  179. pycforge_sdk/gui/visual/resources/icons/20/move-up.png +0 -0
  180. pycforge_sdk/gui/visual/resources/icons/20/next.png +0 -0
  181. pycforge_sdk/gui/visual/resources/icons/20/open.png +0 -0
  182. pycforge_sdk/gui/visual/resources/icons/20/outdent.png +0 -0
  183. pycforge_sdk/gui/visual/resources/icons/20/outline.png +0 -0
  184. pycforge_sdk/gui/visual/resources/icons/20/paste.png +0 -0
  185. pycforge_sdk/gui/visual/resources/icons/20/previous.png +0 -0
  186. pycforge_sdk/gui/visual/resources/icons/20/primary-module.png +0 -0
  187. pycforge_sdk/gui/visual/resources/icons/20/redo.png +0 -0
  188. pycforge_sdk/gui/visual/resources/icons/20/remove-document.png +0 -0
  189. pycforge_sdk/gui/visual/resources/icons/20/replace.png +0 -0
  190. pycforge_sdk/gui/visual/resources/icons/20/save-as.png +0 -0
  191. pycforge_sdk/gui/visual/resources/icons/20/save.png +0 -0
  192. pycforge_sdk/gui/visual/resources/icons/20/select-all.png +0 -0
  193. pycforge_sdk/gui/visual/resources/icons/20/settings.png +0 -0
  194. pycforge_sdk/gui/visual/resources/icons/20/show-c.png +0 -0
  195. pycforge_sdk/gui/visual/resources/icons/20/split-view.png +0 -0
  196. pycforge_sdk/gui/visual/resources/icons/20/summary.png +0 -0
  197. pycforge_sdk/gui/visual/resources/icons/20/telemetry.png +0 -0
  198. pycforge_sdk/gui/visual/resources/icons/20/toggle-comment.png +0 -0
  199. pycforge_sdk/gui/visual/resources/icons/20/toggle-fold.png +0 -0
  200. pycforge_sdk/gui/visual/resources/icons/20/tools.png +0 -0
  201. pycforge_sdk/gui/visual/resources/icons/20/undo.png +0 -0
  202. pycforge_sdk/gui/visual/resources/icons/20/whitespace.png +0 -0
  203. pycforge_sdk/gui/visual/resources/icons/24/add-document.png +0 -0
  204. pycforge_sdk/gui/visual/resources/icons/24/brand-mark.png +0 -0
  205. pycforge_sdk/gui/visual/resources/icons/24/bundle-search.png +0 -0
  206. pycforge_sdk/gui/visual/resources/icons/24/cancel.png +0 -0
  207. pycforge_sdk/gui/visual/resources/icons/24/check.png +0 -0
  208. pycforge_sdk/gui/visual/resources/icons/24/chevron-right.png +0 -0
  209. pycforge_sdk/gui/visual/resources/icons/24/close.png +0 -0
  210. pycforge_sdk/gui/visual/resources/icons/24/collapse-all.png +0 -0
  211. pycforge_sdk/gui/visual/resources/icons/24/command-palette.png +0 -0
  212. pycforge_sdk/gui/visual/resources/icons/24/convert.png +0 -0
  213. pycforge_sdk/gui/visual/resources/icons/24/copy.png +0 -0
  214. pycforge_sdk/gui/visual/resources/icons/24/cut.png +0 -0
  215. pycforge_sdk/gui/visual/resources/icons/24/decision-trace.png +0 -0
  216. pycforge_sdk/gui/visual/resources/icons/24/details.png +0 -0
  217. pycforge_sdk/gui/visual/resources/icons/24/diagnostics.png +0 -0
  218. pycforge_sdk/gui/visual/resources/icons/24/duplicate-line.png +0 -0
  219. pycforge_sdk/gui/visual/resources/icons/24/exit.png +0 -0
  220. pycforge_sdk/gui/visual/resources/icons/24/expand-all.png +0 -0
  221. pycforge_sdk/gui/visual/resources/icons/24/export.png +0 -0
  222. pycforge_sdk/gui/visual/resources/icons/24/find.png +0 -0
  223. pycforge_sdk/gui/visual/resources/icons/24/go-to-line.png +0 -0
  224. pycforge_sdk/gui/visual/resources/icons/24/go-to-output.png +0 -0
  225. pycforge_sdk/gui/visual/resources/icons/24/go-to-source.png +0 -0
  226. pycforge_sdk/gui/visual/resources/icons/24/help.png +0 -0
  227. pycforge_sdk/gui/visual/resources/icons/24/history.png +0 -0
  228. pycforge_sdk/gui/visual/resources/icons/24/indent.png +0 -0
  229. pycforge_sdk/gui/visual/resources/icons/24/link-c.png +0 -0
  230. pycforge_sdk/gui/visual/resources/icons/24/mappings.png +0 -0
  231. pycforge_sdk/gui/visual/resources/icons/24/module.png +0 -0
  232. pycforge_sdk/gui/visual/resources/icons/24/move-down.png +0 -0
  233. pycforge_sdk/gui/visual/resources/icons/24/move-line-down.png +0 -0
  234. pycforge_sdk/gui/visual/resources/icons/24/move-line-up.png +0 -0
  235. pycforge_sdk/gui/visual/resources/icons/24/move-up.png +0 -0
  236. pycforge_sdk/gui/visual/resources/icons/24/next.png +0 -0
  237. pycforge_sdk/gui/visual/resources/icons/24/open.png +0 -0
  238. pycforge_sdk/gui/visual/resources/icons/24/outdent.png +0 -0
  239. pycforge_sdk/gui/visual/resources/icons/24/outline.png +0 -0
  240. pycforge_sdk/gui/visual/resources/icons/24/paste.png +0 -0
  241. pycforge_sdk/gui/visual/resources/icons/24/previous.png +0 -0
  242. pycforge_sdk/gui/visual/resources/icons/24/primary-module.png +0 -0
  243. pycforge_sdk/gui/visual/resources/icons/24/redo.png +0 -0
  244. pycforge_sdk/gui/visual/resources/icons/24/remove-document.png +0 -0
  245. pycforge_sdk/gui/visual/resources/icons/24/replace.png +0 -0
  246. pycforge_sdk/gui/visual/resources/icons/24/save-as.png +0 -0
  247. pycforge_sdk/gui/visual/resources/icons/24/save.png +0 -0
  248. pycforge_sdk/gui/visual/resources/icons/24/select-all.png +0 -0
  249. pycforge_sdk/gui/visual/resources/icons/24/settings.png +0 -0
  250. pycforge_sdk/gui/visual/resources/icons/24/show-c.png +0 -0
  251. pycforge_sdk/gui/visual/resources/icons/24/split-view.png +0 -0
  252. pycforge_sdk/gui/visual/resources/icons/24/summary.png +0 -0
  253. pycforge_sdk/gui/visual/resources/icons/24/telemetry.png +0 -0
  254. pycforge_sdk/gui/visual/resources/icons/24/toggle-comment.png +0 -0
  255. pycforge_sdk/gui/visual/resources/icons/24/toggle-fold.png +0 -0
  256. pycforge_sdk/gui/visual/resources/icons/24/tools.png +0 -0
  257. pycforge_sdk/gui/visual/resources/icons/24/undo.png +0 -0
  258. pycforge_sdk/gui/visual/resources/icons/24/whitespace.png +0 -0
  259. pycforge_sdk/gui/visual/resources/icons/256/add-document.png +0 -0
  260. pycforge_sdk/gui/visual/resources/icons/256/brand-mark.png +0 -0
  261. pycforge_sdk/gui/visual/resources/icons/256/bundle-search.png +0 -0
  262. pycforge_sdk/gui/visual/resources/icons/256/cancel.png +0 -0
  263. pycforge_sdk/gui/visual/resources/icons/256/check.png +0 -0
  264. pycforge_sdk/gui/visual/resources/icons/256/chevron-right.png +0 -0
  265. pycforge_sdk/gui/visual/resources/icons/256/close.png +0 -0
  266. pycforge_sdk/gui/visual/resources/icons/256/collapse-all.png +0 -0
  267. pycforge_sdk/gui/visual/resources/icons/256/command-palette.png +0 -0
  268. pycforge_sdk/gui/visual/resources/icons/256/convert.png +0 -0
  269. pycforge_sdk/gui/visual/resources/icons/256/copy.png +0 -0
  270. pycforge_sdk/gui/visual/resources/icons/256/cut.png +0 -0
  271. pycforge_sdk/gui/visual/resources/icons/256/decision-trace.png +0 -0
  272. pycforge_sdk/gui/visual/resources/icons/256/details.png +0 -0
  273. pycforge_sdk/gui/visual/resources/icons/256/diagnostics.png +0 -0
  274. pycforge_sdk/gui/visual/resources/icons/256/duplicate-line.png +0 -0
  275. pycforge_sdk/gui/visual/resources/icons/256/exit.png +0 -0
  276. pycforge_sdk/gui/visual/resources/icons/256/expand-all.png +0 -0
  277. pycforge_sdk/gui/visual/resources/icons/256/export.png +0 -0
  278. pycforge_sdk/gui/visual/resources/icons/256/find.png +0 -0
  279. pycforge_sdk/gui/visual/resources/icons/256/go-to-line.png +0 -0
  280. pycforge_sdk/gui/visual/resources/icons/256/go-to-output.png +0 -0
  281. pycforge_sdk/gui/visual/resources/icons/256/go-to-source.png +0 -0
  282. pycforge_sdk/gui/visual/resources/icons/256/help.png +0 -0
  283. pycforge_sdk/gui/visual/resources/icons/256/history.png +0 -0
  284. pycforge_sdk/gui/visual/resources/icons/256/indent.png +0 -0
  285. pycforge_sdk/gui/visual/resources/icons/256/link-c.png +0 -0
  286. pycforge_sdk/gui/visual/resources/icons/256/mappings.png +0 -0
  287. pycforge_sdk/gui/visual/resources/icons/256/module.png +0 -0
  288. pycforge_sdk/gui/visual/resources/icons/256/move-down.png +0 -0
  289. pycforge_sdk/gui/visual/resources/icons/256/move-line-down.png +0 -0
  290. pycforge_sdk/gui/visual/resources/icons/256/move-line-up.png +0 -0
  291. pycforge_sdk/gui/visual/resources/icons/256/move-up.png +0 -0
  292. pycforge_sdk/gui/visual/resources/icons/256/next.png +0 -0
  293. pycforge_sdk/gui/visual/resources/icons/256/open.png +0 -0
  294. pycforge_sdk/gui/visual/resources/icons/256/outdent.png +0 -0
  295. pycforge_sdk/gui/visual/resources/icons/256/outline.png +0 -0
  296. pycforge_sdk/gui/visual/resources/icons/256/paste.png +0 -0
  297. pycforge_sdk/gui/visual/resources/icons/256/previous.png +0 -0
  298. pycforge_sdk/gui/visual/resources/icons/256/primary-module.png +0 -0
  299. pycforge_sdk/gui/visual/resources/icons/256/redo.png +0 -0
  300. pycforge_sdk/gui/visual/resources/icons/256/remove-document.png +0 -0
  301. pycforge_sdk/gui/visual/resources/icons/256/replace.png +0 -0
  302. pycforge_sdk/gui/visual/resources/icons/256/save-as.png +0 -0
  303. pycforge_sdk/gui/visual/resources/icons/256/save.png +0 -0
  304. pycforge_sdk/gui/visual/resources/icons/256/select-all.png +0 -0
  305. pycforge_sdk/gui/visual/resources/icons/256/settings.png +0 -0
  306. pycforge_sdk/gui/visual/resources/icons/256/show-c.png +0 -0
  307. pycforge_sdk/gui/visual/resources/icons/256/split-view.png +0 -0
  308. pycforge_sdk/gui/visual/resources/icons/256/summary.png +0 -0
  309. pycforge_sdk/gui/visual/resources/icons/256/telemetry.png +0 -0
  310. pycforge_sdk/gui/visual/resources/icons/256/toggle-comment.png +0 -0
  311. pycforge_sdk/gui/visual/resources/icons/256/toggle-fold.png +0 -0
  312. pycforge_sdk/gui/visual/resources/icons/256/tools.png +0 -0
  313. pycforge_sdk/gui/visual/resources/icons/256/undo.png +0 -0
  314. pycforge_sdk/gui/visual/resources/icons/256/whitespace.png +0 -0
  315. pycforge_sdk/gui/visual/resources/icons/32/add-document.png +0 -0
  316. pycforge_sdk/gui/visual/resources/icons/32/brand-mark.png +0 -0
  317. pycforge_sdk/gui/visual/resources/icons/32/bundle-search.png +0 -0
  318. pycforge_sdk/gui/visual/resources/icons/32/cancel.png +0 -0
  319. pycforge_sdk/gui/visual/resources/icons/32/check.png +0 -0
  320. pycforge_sdk/gui/visual/resources/icons/32/chevron-right.png +0 -0
  321. pycforge_sdk/gui/visual/resources/icons/32/close.png +0 -0
  322. pycforge_sdk/gui/visual/resources/icons/32/collapse-all.png +0 -0
  323. pycforge_sdk/gui/visual/resources/icons/32/command-palette.png +0 -0
  324. pycforge_sdk/gui/visual/resources/icons/32/convert.png +0 -0
  325. pycforge_sdk/gui/visual/resources/icons/32/copy.png +0 -0
  326. pycforge_sdk/gui/visual/resources/icons/32/cut.png +0 -0
  327. pycforge_sdk/gui/visual/resources/icons/32/decision-trace.png +0 -0
  328. pycforge_sdk/gui/visual/resources/icons/32/details.png +0 -0
  329. pycforge_sdk/gui/visual/resources/icons/32/diagnostics.png +0 -0
  330. pycforge_sdk/gui/visual/resources/icons/32/duplicate-line.png +0 -0
  331. pycforge_sdk/gui/visual/resources/icons/32/exit.png +0 -0
  332. pycforge_sdk/gui/visual/resources/icons/32/expand-all.png +0 -0
  333. pycforge_sdk/gui/visual/resources/icons/32/export.png +0 -0
  334. pycforge_sdk/gui/visual/resources/icons/32/find.png +0 -0
  335. pycforge_sdk/gui/visual/resources/icons/32/go-to-line.png +0 -0
  336. pycforge_sdk/gui/visual/resources/icons/32/go-to-output.png +0 -0
  337. pycforge_sdk/gui/visual/resources/icons/32/go-to-source.png +0 -0
  338. pycforge_sdk/gui/visual/resources/icons/32/help.png +0 -0
  339. pycforge_sdk/gui/visual/resources/icons/32/history.png +0 -0
  340. pycforge_sdk/gui/visual/resources/icons/32/indent.png +0 -0
  341. pycforge_sdk/gui/visual/resources/icons/32/link-c.png +0 -0
  342. pycforge_sdk/gui/visual/resources/icons/32/mappings.png +0 -0
  343. pycforge_sdk/gui/visual/resources/icons/32/module.png +0 -0
  344. pycforge_sdk/gui/visual/resources/icons/32/move-down.png +0 -0
  345. pycforge_sdk/gui/visual/resources/icons/32/move-line-down.png +0 -0
  346. pycforge_sdk/gui/visual/resources/icons/32/move-line-up.png +0 -0
  347. pycforge_sdk/gui/visual/resources/icons/32/move-up.png +0 -0
  348. pycforge_sdk/gui/visual/resources/icons/32/next.png +0 -0
  349. pycforge_sdk/gui/visual/resources/icons/32/open.png +0 -0
  350. pycforge_sdk/gui/visual/resources/icons/32/outdent.png +0 -0
  351. pycforge_sdk/gui/visual/resources/icons/32/outline.png +0 -0
  352. pycforge_sdk/gui/visual/resources/icons/32/paste.png +0 -0
  353. pycforge_sdk/gui/visual/resources/icons/32/previous.png +0 -0
  354. pycforge_sdk/gui/visual/resources/icons/32/primary-module.png +0 -0
  355. pycforge_sdk/gui/visual/resources/icons/32/redo.png +0 -0
  356. pycforge_sdk/gui/visual/resources/icons/32/remove-document.png +0 -0
  357. pycforge_sdk/gui/visual/resources/icons/32/replace.png +0 -0
  358. pycforge_sdk/gui/visual/resources/icons/32/save-as.png +0 -0
  359. pycforge_sdk/gui/visual/resources/icons/32/save.png +0 -0
  360. pycforge_sdk/gui/visual/resources/icons/32/select-all.png +0 -0
  361. pycforge_sdk/gui/visual/resources/icons/32/settings.png +0 -0
  362. pycforge_sdk/gui/visual/resources/icons/32/show-c.png +0 -0
  363. pycforge_sdk/gui/visual/resources/icons/32/split-view.png +0 -0
  364. pycforge_sdk/gui/visual/resources/icons/32/summary.png +0 -0
  365. pycforge_sdk/gui/visual/resources/icons/32/telemetry.png +0 -0
  366. pycforge_sdk/gui/visual/resources/icons/32/toggle-comment.png +0 -0
  367. pycforge_sdk/gui/visual/resources/icons/32/toggle-fold.png +0 -0
  368. pycforge_sdk/gui/visual/resources/icons/32/tools.png +0 -0
  369. pycforge_sdk/gui/visual/resources/icons/32/undo.png +0 -0
  370. pycforge_sdk/gui/visual/resources/icons/32/whitespace.png +0 -0
  371. pycforge_sdk/gui/visual/resources/icons/48/add-document.png +0 -0
  372. pycforge_sdk/gui/visual/resources/icons/48/brand-mark.png +0 -0
  373. pycforge_sdk/gui/visual/resources/icons/48/bundle-search.png +0 -0
  374. pycforge_sdk/gui/visual/resources/icons/48/cancel.png +0 -0
  375. pycforge_sdk/gui/visual/resources/icons/48/check.png +0 -0
  376. pycforge_sdk/gui/visual/resources/icons/48/chevron-right.png +0 -0
  377. pycforge_sdk/gui/visual/resources/icons/48/close.png +0 -0
  378. pycforge_sdk/gui/visual/resources/icons/48/collapse-all.png +0 -0
  379. pycforge_sdk/gui/visual/resources/icons/48/command-palette.png +0 -0
  380. pycforge_sdk/gui/visual/resources/icons/48/convert.png +0 -0
  381. pycforge_sdk/gui/visual/resources/icons/48/copy.png +0 -0
  382. pycforge_sdk/gui/visual/resources/icons/48/cut.png +0 -0
  383. pycforge_sdk/gui/visual/resources/icons/48/decision-trace.png +0 -0
  384. pycforge_sdk/gui/visual/resources/icons/48/details.png +0 -0
  385. pycforge_sdk/gui/visual/resources/icons/48/diagnostics.png +0 -0
  386. pycforge_sdk/gui/visual/resources/icons/48/duplicate-line.png +0 -0
  387. pycforge_sdk/gui/visual/resources/icons/48/exit.png +0 -0
  388. pycforge_sdk/gui/visual/resources/icons/48/expand-all.png +0 -0
  389. pycforge_sdk/gui/visual/resources/icons/48/export.png +0 -0
  390. pycforge_sdk/gui/visual/resources/icons/48/find.png +0 -0
  391. pycforge_sdk/gui/visual/resources/icons/48/go-to-line.png +0 -0
  392. pycforge_sdk/gui/visual/resources/icons/48/go-to-output.png +0 -0
  393. pycforge_sdk/gui/visual/resources/icons/48/go-to-source.png +0 -0
  394. pycforge_sdk/gui/visual/resources/icons/48/help.png +0 -0
  395. pycforge_sdk/gui/visual/resources/icons/48/history.png +0 -0
  396. pycforge_sdk/gui/visual/resources/icons/48/indent.png +0 -0
  397. pycforge_sdk/gui/visual/resources/icons/48/link-c.png +0 -0
  398. pycforge_sdk/gui/visual/resources/icons/48/mappings.png +0 -0
  399. pycforge_sdk/gui/visual/resources/icons/48/module.png +0 -0
  400. pycforge_sdk/gui/visual/resources/icons/48/move-down.png +0 -0
  401. pycforge_sdk/gui/visual/resources/icons/48/move-line-down.png +0 -0
  402. pycforge_sdk/gui/visual/resources/icons/48/move-line-up.png +0 -0
  403. pycforge_sdk/gui/visual/resources/icons/48/move-up.png +0 -0
  404. pycforge_sdk/gui/visual/resources/icons/48/next.png +0 -0
  405. pycforge_sdk/gui/visual/resources/icons/48/open.png +0 -0
  406. pycforge_sdk/gui/visual/resources/icons/48/outdent.png +0 -0
  407. pycforge_sdk/gui/visual/resources/icons/48/outline.png +0 -0
  408. pycforge_sdk/gui/visual/resources/icons/48/paste.png +0 -0
  409. pycforge_sdk/gui/visual/resources/icons/48/previous.png +0 -0
  410. pycforge_sdk/gui/visual/resources/icons/48/primary-module.png +0 -0
  411. pycforge_sdk/gui/visual/resources/icons/48/redo.png +0 -0
  412. pycforge_sdk/gui/visual/resources/icons/48/remove-document.png +0 -0
  413. pycforge_sdk/gui/visual/resources/icons/48/replace.png +0 -0
  414. pycforge_sdk/gui/visual/resources/icons/48/save-as.png +0 -0
  415. pycforge_sdk/gui/visual/resources/icons/48/save.png +0 -0
  416. pycforge_sdk/gui/visual/resources/icons/48/select-all.png +0 -0
  417. pycforge_sdk/gui/visual/resources/icons/48/settings.png +0 -0
  418. pycforge_sdk/gui/visual/resources/icons/48/show-c.png +0 -0
  419. pycforge_sdk/gui/visual/resources/icons/48/split-view.png +0 -0
  420. pycforge_sdk/gui/visual/resources/icons/48/summary.png +0 -0
  421. pycforge_sdk/gui/visual/resources/icons/48/telemetry.png +0 -0
  422. pycforge_sdk/gui/visual/resources/icons/48/toggle-comment.png +0 -0
  423. pycforge_sdk/gui/visual/resources/icons/48/toggle-fold.png +0 -0
  424. pycforge_sdk/gui/visual/resources/icons/48/tools.png +0 -0
  425. pycforge_sdk/gui/visual/resources/icons/48/undo.png +0 -0
  426. pycforge_sdk/gui/visual/resources/icons/48/whitespace.png +0 -0
  427. pycforge_sdk/gui/visual/resources/icons/64/add-document.png +0 -0
  428. pycforge_sdk/gui/visual/resources/icons/64/brand-mark.png +0 -0
  429. pycforge_sdk/gui/visual/resources/icons/64/bundle-search.png +0 -0
  430. pycforge_sdk/gui/visual/resources/icons/64/cancel.png +0 -0
  431. pycforge_sdk/gui/visual/resources/icons/64/check.png +0 -0
  432. pycforge_sdk/gui/visual/resources/icons/64/chevron-right.png +0 -0
  433. pycforge_sdk/gui/visual/resources/icons/64/close.png +0 -0
  434. pycforge_sdk/gui/visual/resources/icons/64/collapse-all.png +0 -0
  435. pycforge_sdk/gui/visual/resources/icons/64/command-palette.png +0 -0
  436. pycforge_sdk/gui/visual/resources/icons/64/convert.png +0 -0
  437. pycforge_sdk/gui/visual/resources/icons/64/copy.png +0 -0
  438. pycforge_sdk/gui/visual/resources/icons/64/cut.png +0 -0
  439. pycforge_sdk/gui/visual/resources/icons/64/decision-trace.png +0 -0
  440. pycforge_sdk/gui/visual/resources/icons/64/details.png +0 -0
  441. pycforge_sdk/gui/visual/resources/icons/64/diagnostics.png +0 -0
  442. pycforge_sdk/gui/visual/resources/icons/64/duplicate-line.png +0 -0
  443. pycforge_sdk/gui/visual/resources/icons/64/exit.png +0 -0
  444. pycforge_sdk/gui/visual/resources/icons/64/expand-all.png +0 -0
  445. pycforge_sdk/gui/visual/resources/icons/64/export.png +0 -0
  446. pycforge_sdk/gui/visual/resources/icons/64/find.png +0 -0
  447. pycforge_sdk/gui/visual/resources/icons/64/go-to-line.png +0 -0
  448. pycforge_sdk/gui/visual/resources/icons/64/go-to-output.png +0 -0
  449. pycforge_sdk/gui/visual/resources/icons/64/go-to-source.png +0 -0
  450. pycforge_sdk/gui/visual/resources/icons/64/help.png +0 -0
  451. pycforge_sdk/gui/visual/resources/icons/64/history.png +0 -0
  452. pycforge_sdk/gui/visual/resources/icons/64/indent.png +0 -0
  453. pycforge_sdk/gui/visual/resources/icons/64/link-c.png +0 -0
  454. pycforge_sdk/gui/visual/resources/icons/64/mappings.png +0 -0
  455. pycforge_sdk/gui/visual/resources/icons/64/module.png +0 -0
  456. pycforge_sdk/gui/visual/resources/icons/64/move-down.png +0 -0
  457. pycforge_sdk/gui/visual/resources/icons/64/move-line-down.png +0 -0
  458. pycforge_sdk/gui/visual/resources/icons/64/move-line-up.png +0 -0
  459. pycforge_sdk/gui/visual/resources/icons/64/move-up.png +0 -0
  460. pycforge_sdk/gui/visual/resources/icons/64/next.png +0 -0
  461. pycforge_sdk/gui/visual/resources/icons/64/open.png +0 -0
  462. pycforge_sdk/gui/visual/resources/icons/64/outdent.png +0 -0
  463. pycforge_sdk/gui/visual/resources/icons/64/outline.png +0 -0
  464. pycforge_sdk/gui/visual/resources/icons/64/paste.png +0 -0
  465. pycforge_sdk/gui/visual/resources/icons/64/previous.png +0 -0
  466. pycforge_sdk/gui/visual/resources/icons/64/primary-module.png +0 -0
  467. pycforge_sdk/gui/visual/resources/icons/64/redo.png +0 -0
  468. pycforge_sdk/gui/visual/resources/icons/64/remove-document.png +0 -0
  469. pycforge_sdk/gui/visual/resources/icons/64/replace.png +0 -0
  470. pycforge_sdk/gui/visual/resources/icons/64/save-as.png +0 -0
  471. pycforge_sdk/gui/visual/resources/icons/64/save.png +0 -0
  472. pycforge_sdk/gui/visual/resources/icons/64/select-all.png +0 -0
  473. pycforge_sdk/gui/visual/resources/icons/64/settings.png +0 -0
  474. pycforge_sdk/gui/visual/resources/icons/64/show-c.png +0 -0
  475. pycforge_sdk/gui/visual/resources/icons/64/split-view.png +0 -0
  476. pycforge_sdk/gui/visual/resources/icons/64/summary.png +0 -0
  477. pycforge_sdk/gui/visual/resources/icons/64/telemetry.png +0 -0
  478. pycforge_sdk/gui/visual/resources/icons/64/toggle-comment.png +0 -0
  479. pycforge_sdk/gui/visual/resources/icons/64/toggle-fold.png +0 -0
  480. pycforge_sdk/gui/visual/resources/icons/64/tools.png +0 -0
  481. pycforge_sdk/gui/visual/resources/icons/64/undo.png +0 -0
  482. pycforge_sdk/gui/visual/resources/icons/64/whitespace.png +0 -0
  483. pycforge_sdk/gui/visual/resources/icons/96/add-document.png +0 -0
  484. pycforge_sdk/gui/visual/resources/icons/96/brand-mark.png +0 -0
  485. pycforge_sdk/gui/visual/resources/icons/96/bundle-search.png +0 -0
  486. pycforge_sdk/gui/visual/resources/icons/96/cancel.png +0 -0
  487. pycforge_sdk/gui/visual/resources/icons/96/check.png +0 -0
  488. pycforge_sdk/gui/visual/resources/icons/96/chevron-right.png +0 -0
  489. pycforge_sdk/gui/visual/resources/icons/96/close.png +0 -0
  490. pycforge_sdk/gui/visual/resources/icons/96/collapse-all.png +0 -0
  491. pycforge_sdk/gui/visual/resources/icons/96/command-palette.png +0 -0
  492. pycforge_sdk/gui/visual/resources/icons/96/convert.png +0 -0
  493. pycforge_sdk/gui/visual/resources/icons/96/copy.png +0 -0
  494. pycforge_sdk/gui/visual/resources/icons/96/cut.png +0 -0
  495. pycforge_sdk/gui/visual/resources/icons/96/decision-trace.png +0 -0
  496. pycforge_sdk/gui/visual/resources/icons/96/details.png +0 -0
  497. pycforge_sdk/gui/visual/resources/icons/96/diagnostics.png +0 -0
  498. pycforge_sdk/gui/visual/resources/icons/96/duplicate-line.png +0 -0
  499. pycforge_sdk/gui/visual/resources/icons/96/exit.png +0 -0
  500. pycforge_sdk/gui/visual/resources/icons/96/expand-all.png +0 -0
  501. pycforge_sdk/gui/visual/resources/icons/96/export.png +0 -0
  502. pycforge_sdk/gui/visual/resources/icons/96/find.png +0 -0
  503. pycforge_sdk/gui/visual/resources/icons/96/go-to-line.png +0 -0
  504. pycforge_sdk/gui/visual/resources/icons/96/go-to-output.png +0 -0
  505. pycforge_sdk/gui/visual/resources/icons/96/go-to-source.png +0 -0
  506. pycforge_sdk/gui/visual/resources/icons/96/help.png +0 -0
  507. pycforge_sdk/gui/visual/resources/icons/96/history.png +0 -0
  508. pycforge_sdk/gui/visual/resources/icons/96/indent.png +0 -0
  509. pycforge_sdk/gui/visual/resources/icons/96/link-c.png +0 -0
  510. pycforge_sdk/gui/visual/resources/icons/96/mappings.png +0 -0
  511. pycforge_sdk/gui/visual/resources/icons/96/module.png +0 -0
  512. pycforge_sdk/gui/visual/resources/icons/96/move-down.png +0 -0
  513. pycforge_sdk/gui/visual/resources/icons/96/move-line-down.png +0 -0
  514. pycforge_sdk/gui/visual/resources/icons/96/move-line-up.png +0 -0
  515. pycforge_sdk/gui/visual/resources/icons/96/move-up.png +0 -0
  516. pycforge_sdk/gui/visual/resources/icons/96/next.png +0 -0
  517. pycforge_sdk/gui/visual/resources/icons/96/open.png +0 -0
  518. pycforge_sdk/gui/visual/resources/icons/96/outdent.png +0 -0
  519. pycforge_sdk/gui/visual/resources/icons/96/outline.png +0 -0
  520. pycforge_sdk/gui/visual/resources/icons/96/paste.png +0 -0
  521. pycforge_sdk/gui/visual/resources/icons/96/previous.png +0 -0
  522. pycforge_sdk/gui/visual/resources/icons/96/primary-module.png +0 -0
  523. pycforge_sdk/gui/visual/resources/icons/96/redo.png +0 -0
  524. pycforge_sdk/gui/visual/resources/icons/96/remove-document.png +0 -0
  525. pycforge_sdk/gui/visual/resources/icons/96/replace.png +0 -0
  526. pycforge_sdk/gui/visual/resources/icons/96/save-as.png +0 -0
  527. pycforge_sdk/gui/visual/resources/icons/96/save.png +0 -0
  528. pycforge_sdk/gui/visual/resources/icons/96/select-all.png +0 -0
  529. pycforge_sdk/gui/visual/resources/icons/96/settings.png +0 -0
  530. pycforge_sdk/gui/visual/resources/icons/96/show-c.png +0 -0
  531. pycforge_sdk/gui/visual/resources/icons/96/split-view.png +0 -0
  532. pycforge_sdk/gui/visual/resources/icons/96/summary.png +0 -0
  533. pycforge_sdk/gui/visual/resources/icons/96/telemetry.png +0 -0
  534. pycforge_sdk/gui/visual/resources/icons/96/toggle-comment.png +0 -0
  535. pycforge_sdk/gui/visual/resources/icons/96/toggle-fold.png +0 -0
  536. pycforge_sdk/gui/visual/resources/icons/96/tools.png +0 -0
  537. pycforge_sdk/gui/visual/resources/icons/96/undo.png +0 -0
  538. pycforge_sdk/gui/visual/resources/icons/96/whitespace.png +0 -0
  539. pycforge_sdk/gui/visual/theme.py +204 -0
  540. pycforge_sdk/gui/visual/theme_steel_stylesheet.py +901 -0
  541. pycforge_sdk/gui/visual/theme_stylesheet.py +597 -0
  542. pycforge_sdk/gui/visual/theme_workspace_stylesheet.py +169 -0
  543. pycforge_sdk/gui/visual/visual_tokens.py +146 -0
  544. pycforge_sdk/gui/widgets.py +68 -0
  545. pycforge_sdk/gui/window.py +559 -0
  546. pycforge_sdk/native.py +42 -0
  547. pycforge_sdk/package_metadata.py +21 -0
  548. pycforge_sdk/process.py +58 -0
  549. pycforge_sdk/project.py +143 -0
  550. pycforge_sdk/readiness.py +106 -0
  551. pycforge_sdk/results.py +45 -0
  552. pycforge_sdk/service.py +454 -0
  553. pycforge_sdk/workbench.py +88 -0
  554. pycforge_sdk-0.6.3.dist-info/METADATA +221 -0
  555. pycforge_sdk-0.6.3.dist-info/RECORD +559 -0
  556. pycforge_sdk-0.6.3.dist-info/WHEEL +5 -0
  557. pycforge_sdk-0.6.3.dist-info/entry_points.txt +5 -0
  558. pycforge_sdk-0.6.3.dist-info/licenses/LICENSE +674 -0
  559. pycforge_sdk-0.6.3.dist-info/top_level.txt +1 -0
@@ -0,0 +1,597 @@
1
+ """Build the PyCForge Qt stylesheet from semantic visual tokens."""
2
+
3
+ from __future__ import annotations
4
+ from string import Template
5
+ from .icons import pycforge_icon_path
6
+ from .theme_steel_stylesheet import build_steel_stylesheet
7
+ from .theme_workspace_stylesheet import build_workspace_stylesheet
8
+ from .visual_tokens import PYCFORGE_COLORS, PyCForgeColors, color_tokens
9
+
10
+
11
+ _PYCFORGE_QSS_TEMPLATE = Template(
12
+ r"""
13
+ QMainWindow, QDialog {
14
+ background: ${canvas};
15
+ color: ${text};
16
+ }
17
+ QWidget {
18
+ color: ${text};
19
+ selection-background-color: ${selection};
20
+ selection-color: ${text};
21
+ }
22
+ QWidget#workspaceShell, QWidget[role="workspace-shell"] { background: transparent; }
23
+ QFrame#DocumentNavigator {
24
+ background: ${surface};
25
+ border: 1px solid ${border};
26
+ border-right: 1px solid ${border_strong};
27
+ border-radius: 8px;
28
+ }
29
+ QFrame#editorPanel, QFrame#detailsPanel, QFrame[role="panel"] {
30
+ background: ${surface};
31
+ border: 1px solid ${border};
32
+ border-radius: 8px;
33
+ }
34
+ QLabel {
35
+ background: transparent;
36
+ color: ${text_soft};
37
+ }
38
+ QLabel#PanelEyebrow {
39
+ color: ${blue_bright};
40
+ font-weight: 700;
41
+ padding: 3px 0 5px 0;
42
+ border-bottom: 1px solid ${blue_dim};
43
+ }
44
+ QLabel#MutedLabel { color: ${text_muted}; padding: 2px 3px; }
45
+ QLabel#PathLabel { color: ${text_muted}; font-style: italic; padding: 2px 4px; }
46
+ QLabel#ActiveModuleLabel {
47
+ color: ${violet_bright};
48
+ font-weight: 600;
49
+ padding: 2px 6px;
50
+ border-left: 2px solid ${violet_dim};
51
+ }
52
+ QLabel[role="panel-title"] {
53
+ color: ${text};
54
+ font-weight: 600;
55
+ padding: 4px 2px 5px 2px;
56
+ border-bottom: 1px solid ${blue_dim};
57
+ }
58
+ QFrame#SourceEditorSurface, QFrame#GeneratedCPanel {
59
+ background: ${void};
60
+ border: 1px solid ${border};
61
+ border-radius: 7px;
62
+ }
63
+ QFrame#GeneratedCPanel { border-top: 2px solid ${warm_dim}; }
64
+ QPlainTextEdit#PythonSourceEditor, QPlainTextEdit#PythonSourceEditorSecondary, QPlainTextEdit#GeneratedCEditor {
65
+ border: 0;
66
+ border-radius: 0;
67
+ padding: 0;
68
+ placeholder-text-color: ${text_muted};
69
+ }
70
+ QPlainTextEdit#GeneratedCEditor { background: ${void}; color: ${text_soft}; }
71
+ QLabel[status="neutral"], QLabel[role="status-chip"] {
72
+ color: ${text_soft};
73
+ background: ${surface_active};
74
+ border: 1px solid ${border_strong};
75
+ border-radius: 9px;
76
+ padding: 2px 8px;
77
+ }
78
+ QLabel[status="success"] {
79
+ color: ${success_bright};
80
+ background: ${success_dim};
81
+ border: 1px solid ${success};
82
+ border-radius: 9px;
83
+ padding: 2px 8px;
84
+ }
85
+ QLabel[status="warning"] {
86
+ color: ${warning_bright};
87
+ background: ${warning_dim};
88
+ border: 1px solid ${warning};
89
+ border-radius: 9px;
90
+ padding: 2px 8px;
91
+ }
92
+ QLabel[status="error"] {
93
+ color: ${error_bright};
94
+ background: ${error_dim};
95
+ border: 1px solid ${error};
96
+ border-radius: 9px;
97
+ padding: 2px 8px;
98
+ }
99
+ QFrame#ToastBanner { border-radius: 7px; padding: 1px; }
100
+ QFrame#ToastBanner QLabel {
101
+ color: ${text}; background: transparent; font-weight: 500;
102
+ }
103
+ QFrame#ToastBanner QToolButton {
104
+ min-width: 22px;
105
+ min-height: 22px;
106
+ padding: 2px;
107
+ color: ${text_soft};
108
+ background: transparent;
109
+ border: 1px solid transparent;
110
+ }
111
+ QFrame#ToastBanner QToolButton:hover,
112
+ QFrame#ToastBanner QToolButton:focus {
113
+ color: ${text};
114
+ background: ${surface_hover};
115
+ border-color: ${focus_ring};
116
+ }
117
+ QFrame#ToastBanner[tone="info"] {
118
+ color: ${text_soft};
119
+ background: ${blue_dim};
120
+ border: 1px solid ${blue};
121
+ border-left: 3px solid ${blue};
122
+ }
123
+ QFrame#ToastBanner[tone="success"] {
124
+ color: ${success_bright};
125
+ background: ${success_dim};
126
+ border: 1px solid ${success};
127
+ border-left: 3px solid ${success};
128
+ }
129
+ QFrame#ToastBanner[tone="warning"] {
130
+ color: ${warning_bright};
131
+ background: ${warning_dim};
132
+ border: 1px solid ${warning};
133
+ border-left: 3px solid ${warning};
134
+ }
135
+ QFrame#ToastBanner[tone="error"] {
136
+ color: ${error_bright};
137
+ background: ${error_dim};
138
+ border: 1px solid ${error};
139
+ border-left: 3px solid ${error};
140
+ }
141
+ QFrame#ToastBanner[tone="info"] QLabel { color: ${text_soft}; }
142
+ QFrame#ToastBanner[tone="success"] QLabel { color: ${success_bright}; }
143
+ QFrame#ToastBanner[tone="warning"] QLabel { color: ${warning_bright}; }
144
+ QFrame#ToastBanner[tone="error"] QLabel { color: ${error_bright}; }
145
+ QFrame#ToastBanner[tone="info"] QToolButton { color: ${text_soft}; }
146
+ QFrame#ToastBanner[tone="success"] QToolButton { color: ${success_bright}; }
147
+ QFrame#ToastBanner[tone="warning"] QToolButton { color: ${warning_bright}; }
148
+ QFrame#ToastBanner[tone="error"] QToolButton { color: ${error_bright}; }
149
+ QFrame#ToastBanner[tone="info"] QToolButton:hover, QFrame#ToastBanner[tone="info"] QToolButton:focus,
150
+ QFrame#ToastBanner[tone="info"] QToolButton:pressed { background: ${blue_dim}; border-color: ${blue}; }
151
+ QFrame#ToastBanner[tone="success"] QToolButton:hover, QFrame#ToastBanner[tone="success"] QToolButton:focus,
152
+ QFrame#ToastBanner[tone="success"] QToolButton:pressed { background: ${success_dim}; border-color: ${success}; }
153
+ QFrame#ToastBanner[tone="warning"] QToolButton:hover, QFrame#ToastBanner[tone="warning"] QToolButton:focus,
154
+ QFrame#ToastBanner[tone="warning"] QToolButton:pressed { background: ${warning_dim}; border-color: ${warning}; }
155
+ QFrame#ToastBanner[tone="error"] QToolButton:hover, QFrame#ToastBanner[tone="error"] QToolButton:focus,
156
+ QFrame#ToastBanner[tone="error"] QToolButton:pressed { background: ${error_dim}; border-color: ${error}; }
157
+ QMenuBar {
158
+ color: ${text_soft};
159
+ background: ${surface_raised};
160
+ border: 0;
161
+ border-bottom: 1px solid ${border_strong};
162
+ padding: 3px 6px;
163
+ spacing: 3px;
164
+ }
165
+ QMenuBar::item {
166
+ background: transparent;
167
+ border: 1px solid transparent;
168
+ border-radius: 5px;
169
+ padding: 6px 10px;
170
+ }
171
+ QMenuBar::item:selected, QMenuBar::item:pressed {
172
+ color: ${text};
173
+ background: ${surface_active};
174
+ border-color: ${border_strong};
175
+ border-bottom: 2px solid ${warm};
176
+ }
177
+ QMenuBar::item:disabled { color: ${text_disabled}; }
178
+ QMenu, QMenu#PyCForgeMenu, QComboBox QAbstractItemView {
179
+ color: ${text};
180
+ background: ${surface};
181
+ border: 1px solid ${border_strong};
182
+ border-radius: 9px;
183
+ padding: 6px;
184
+ selection-background-color: ${selection};
185
+ selection-color: ${text};
186
+ }
187
+ QMenu::item, QMenu#PyCForgeMenu::item {
188
+ min-height: 18px;
189
+ padding: 7px 36px 7px 38px;
190
+ margin: 1px 3px;
191
+ border: 1px solid transparent;
192
+ border-radius: 5px;
193
+ }
194
+ QMenu::item:selected, QMenu#PyCForgeMenu::item:selected {
195
+ color: ${text};
196
+ background: ${selection};
197
+ border: 1px solid ${border_strong};
198
+ border-left: 3px solid ${blue_bright};
199
+ }
200
+ QMenu::item:pressed, QMenu#PyCForgeMenu::item:pressed {
201
+ color: ${text};
202
+ background: ${selection_active};
203
+ border-left: 3px solid ${blue_bright};
204
+ border-bottom: 2px solid ${warm};
205
+ }
206
+ QMenu::item:disabled, QMenu#PyCForgeMenu::item:disabled {
207
+ color: ${text_disabled}; background: transparent;
208
+ border-color: transparent;
209
+ }
210
+ QMenu#PyCForgeMenu[pycforgeTone="primary"]::item:selected {
211
+ background: ${selection_active};
212
+ color: ${text}; border-left: 3px solid ${warm_bright};
213
+ }
214
+ QMenu#PyCForgeMenu[pycforgeTone="danger"]::item:selected { color: ${error_bright}; background: ${error_dim}; border-left: 3px solid ${error}; }
215
+ QMenu::separator { height: 1px; margin: 6px 12px; background: ${border}; }
216
+ QMenu::icon { left: 12px; width: 18px; height: 18px; }
217
+ QMenu::indicator {
218
+ width: 15px;
219
+ height: 15px;
220
+ left: 12px;
221
+ border: 1px solid ${border_strong};
222
+ border-radius: 4px;
223
+ background: ${canvas};
224
+ }
225
+ QMenu::indicator:checked {
226
+ image: url("${check_icon}");
227
+ background: ${blue_dim};
228
+ border: 1px solid ${blue_bright};
229
+ }
230
+ QMenu::right-arrow {
231
+ image: url("${chevron_icon}");
232
+ width: 14px;
233
+ height: 14px;
234
+ right: 10px;
235
+ }
236
+ QMenu::scroller {
237
+ height: 18px;
238
+ background: ${surface_active};
239
+ border: 1px solid ${border};
240
+ }
241
+ QToolBar {
242
+ color: ${text};
243
+ background: ${surface_raised};
244
+ border: 0;
245
+ border-bottom: 1px solid ${border_strong};
246
+ spacing: 5px;
247
+ padding: 7px 9px;
248
+ }
249
+ QToolBar::separator { width: 1px; margin: 4px 7px; background: ${border}; }
250
+ QPushButton, QToolButton {
251
+ color: ${text_soft};
252
+ background: ${surface_raised};
253
+ border: 1px solid ${border_strong};
254
+ border-radius: 6px;
255
+ padding: 6px 10px;
256
+ min-height: 18px;
257
+ }
258
+ QPushButton:hover, QToolButton:hover {
259
+ color: ${text};
260
+ background: ${surface_hover};
261
+ border-color: ${blue};
262
+ border-bottom: 2px solid ${blue};
263
+ }
264
+ QPushButton:focus, QToolButton:focus {
265
+ color: ${text};
266
+ border: 1px solid ${focus_ring};
267
+ border-bottom: 2px solid ${violet};
268
+ }
269
+ QPushButton:pressed, QToolButton:pressed,
270
+ QPushButton:checked, QToolButton:checked {
271
+ color: ${text};
272
+ background: ${blue_dim};
273
+ border-color: ${blue};
274
+ border-bottom: 2px solid ${warm};
275
+ }
276
+ QPushButton:disabled, QToolButton:disabled {
277
+ color: ${text_disabled};
278
+ background: ${surface};
279
+ border-color: ${border};
280
+ }
281
+ QPushButton[role="primary"], QToolButton[role="primary"] {
282
+ color: ${text};
283
+ background: ${selection_active};
284
+ border-color: ${blue_bright};
285
+ font-weight: 600;
286
+ }
287
+ QPushButton[role="danger"], QToolButton[role="danger"] {
288
+ color: ${error_bright}; background: ${error_dim}; border-color: ${error};
289
+ }
290
+ QToolButton#IconButton {
291
+ min-width: 28px;
292
+ max-width: 28px;
293
+ min-height: 28px;
294
+ max-height: 28px;
295
+ padding: 2px;
296
+ border-radius: 6px;
297
+ }
298
+ QPlainTextEdit, QTextEdit, QLineEdit, QSpinBox, QComboBox {
299
+ color: ${text};
300
+ background: ${canvas};
301
+ border: 1px solid ${border};
302
+ border-radius: 6px;
303
+ padding: 5px 7px;
304
+ }
305
+ QPlainTextEdit:focus, QTextEdit:focus, QLineEdit:focus,
306
+ QSpinBox:focus, QComboBox:focus {
307
+ background: ${surface};
308
+ border: 1px solid ${blue};
309
+ border-bottom: 2px solid ${violet};
310
+ }
311
+ QPlainTextEdit:read-only, QTextEdit:read-only {
312
+ color: ${text_soft};
313
+ background: ${void};
314
+ border-color: ${border};
315
+ }
316
+ QLineEdit[state="error"], QPlainTextEdit[state="error"] {
317
+ border: 1px solid ${error};
318
+ border-bottom: 2px solid ${error};
319
+ background: ${error_dim};
320
+ }
321
+ QLineEdit[state="warning"], QPlainTextEdit[state="warning"] {
322
+ border: 1px solid ${warning};
323
+ border-bottom: 2px solid ${warning};
324
+ background: ${warning_dim};
325
+ }
326
+ QLineEdit[state="success"], QPlainTextEdit[state="success"] {
327
+ border: 1px solid ${success};
328
+ border-bottom: 2px solid ${success};
329
+ background: ${success_dim};
330
+ }
331
+ QLineEdit:disabled, QPlainTextEdit:disabled, QTextEdit:disabled,
332
+ QComboBox:disabled, QSpinBox:disabled {
333
+ color: ${text_disabled};
334
+ background: ${surface};
335
+ border-color: ${border};
336
+ }
337
+ QLineEdit#NavigatorFilter {
338
+ background: ${void}; border-bottom: 2px solid ${blue_dim};
339
+ }
340
+ QWidget#findReplaceBar, QFrame#findReplaceBar,
341
+ QWidget[role="find-bar"], QFrame[role="find-bar"] {
342
+ color: ${text};
343
+ background: ${surface};
344
+ border: 1px solid ${border_strong};
345
+ border-bottom: 2px solid ${warm_dim};
346
+ border-radius: 7px;
347
+ }
348
+ QListWidget#DocumentList {
349
+ color: ${text_soft};
350
+ background: ${void};
351
+ border: 1px solid ${border};
352
+ border-radius: 6px;
353
+ outline: 0;
354
+ padding: 3px;
355
+ }
356
+ QListWidget#DocumentList:focus {
357
+ border: 1px solid ${blue}; border-bottom: 2px solid ${violet};
358
+ }
359
+ QListWidget#DocumentList::item {
360
+ border: 1px solid transparent;
361
+ border-bottom: 1px solid ${surface_raised};
362
+ border-radius: 5px;
363
+ padding: 8px 7px;
364
+ margin: 1px 0;
365
+ }
366
+ QListWidget#DocumentList::item:hover {
367
+ color: ${text};
368
+ background: ${surface_hover};
369
+ border-color: ${border_strong};
370
+ }
371
+ QListWidget#DocumentList::item:selected {
372
+ color: ${text};
373
+ background: ${selection};
374
+ border: 1px solid ${blue};
375
+ border-left: 3px solid ${blue_bright};
376
+ }
377
+ QListWidget#DocumentList::item:disabled {
378
+ color: ${text_disabled}; background: ${surface};
379
+ }
380
+ QTabWidget::pane {
381
+ background: ${surface};
382
+ border: 1px solid ${border};
383
+ border-top: 1px solid ${border_strong};
384
+ border-radius: 6px;
385
+ top: -1px;
386
+ }
387
+ QTabBar::tab {
388
+ color: ${text_muted};
389
+ background: ${canvas};
390
+ border: 1px solid ${border};
391
+ border-bottom: 1px solid ${border_strong};
392
+ padding: 8px 13px;
393
+ min-width: 72px;
394
+ }
395
+ QTabBar::tab:hover {
396
+ color: ${text};
397
+ background: ${surface_active};
398
+ border-bottom: 2px solid ${blue};
399
+ }
400
+ QTabBar::tab:selected {
401
+ color: ${text};
402
+ background: ${surface_hover};
403
+ border-color: ${border_strong};
404
+ border-bottom: 2px solid ${violet};
405
+ }
406
+ QTabBar::tab:disabled { color: ${text_disabled}; background: ${canvas}; }
407
+ QSplitter::handle { background: ${surface_raised}; border: 0; }
408
+ QSplitter::handle:horizontal {
409
+ width: 5px;
410
+ border-left: 1px solid ${border};
411
+ border-right: 1px solid ${blue_dim};
412
+ }
413
+ QSplitter::handle:vertical {
414
+ height: 5px;
415
+ border-top: 1px solid ${border};
416
+ border-bottom: 1px solid ${blue_dim};
417
+ }
418
+ QSplitter::handle:hover { background: ${border_strong}; }
419
+ QTreeView, QListView, QTableView {
420
+ color: ${text_soft};
421
+ background: ${canvas};
422
+ alternate-background-color: ${surface};
423
+ border: 1px solid ${border};
424
+ gridline-color: ${border};
425
+ outline: 0;
426
+ }
427
+ QTreeView::branch:has-children:closed, QTreeWidget::branch:has-children:closed { image: url("${chevron_icon}"); }
428
+ QTreeView::branch:has-children:open, QTreeWidget::branch:has-children:open { image: url("${tree_open_icon}"); }
429
+ QTreeView::branch:!has-children, QTreeWidget::branch:!has-children { image: none; }
430
+ QTreeView:focus, QListView:focus, QTableView:focus {
431
+ border: 1px solid ${blue}; border-bottom: 2px solid ${violet};
432
+ }
433
+ QWidget#DiagnosticsView, QWidget#MappingsView, QWidget#InspectorTree {
434
+ background: ${canvas};
435
+ border: 0;
436
+ }
437
+ QWidget#DiagnosticsView QLineEdit,
438
+ QWidget#MappingsView QLineEdit,
439
+ QWidget#InspectorTree QLineEdit {
440
+ background: ${void};
441
+ border-color: ${border_strong};
442
+ border-bottom: 2px solid ${blue_dim};
443
+ }
444
+ QWidget#DiagnosticsView QLineEdit:focus,
445
+ QWidget#MappingsView QLineEdit:focus,
446
+ QWidget#InspectorTree QLineEdit:focus {
447
+ border-color: ${blue};
448
+ border-bottom: 2px solid ${violet};
449
+ }
450
+ QTreeWidget#DiagnosticsTree, QTreeWidget#MappingsTree,
451
+ QWidget#InspectorTree QTreeWidget {
452
+ background: ${void};
453
+ border: 1px solid ${border};
454
+ border-radius: 6px;
455
+ }
456
+ QTreeWidget#DiagnosticsTree:focus,
457
+ QTreeWidget#MappingsTree:focus,
458
+ QWidget#InspectorTree QTreeWidget:focus {
459
+ border: 1px solid ${blue};
460
+ border-bottom: 2px solid ${violet};
461
+ }
462
+ QTextBrowser#DiagnosticDetails {
463
+ color: ${text_soft};
464
+ background: ${surface};
465
+ border: 1px solid ${border_strong};
466
+ border-left: 2px solid ${violet};
467
+ border-radius: 6px;
468
+ padding: 7px;
469
+ }
470
+ QTreeView::item, QListView::item, QTableView::item { padding: 4px; }
471
+ QTreeView::item:hover, QListView::item:hover, QTableView::item:hover {
472
+ color: ${text}; background: ${surface_hover};
473
+ }
474
+ QTreeView::item:selected, QListView::item:selected, QTableView::item:selected {
475
+ color: ${text};
476
+ background: ${selection};
477
+ border-left: 2px solid ${blue_bright};
478
+ }
479
+ QTreeView::item:selected:focus,
480
+ QListView::item:selected:focus,
481
+ QTableView::item:selected:focus {
482
+ border: 1px solid ${focus_ring};
483
+ border-left: 3px solid ${violet};
484
+ }
485
+ QHeaderView::section {
486
+ color: ${text_soft};
487
+ background: ${surface_raised};
488
+ border: 0;
489
+ border-right: 1px solid ${border};
490
+ border-bottom: 1px solid ${border_strong};
491
+ padding: 6px 8px;
492
+ }
493
+ QScrollBar:vertical { background: ${canvas}; width: 14px; margin: 1px; }
494
+ QScrollBar:horizontal { background: ${canvas}; height: 14px; margin: 1px; }
495
+ QScrollBar::handle:vertical, QScrollBar::handle:horizontal {
496
+ background: ${border_strong};
497
+ border: 1px solid ${text_disabled};
498
+ border-radius: 2px;
499
+ }
500
+ QScrollBar::handle:vertical { min-height: 28px; }
501
+ QScrollBar::handle:horizontal { min-width: 28px; }
502
+ QAbstractScrollArea::corner { background: ${canvas}; border: 0; }
503
+ QScrollBar::handle:vertical:hover, QScrollBar::handle:horizontal:hover {
504
+ background: ${selection_active}; border-color: ${blue};
505
+ }
506
+ QScrollBar::add-line, QScrollBar::sub-line,
507
+ QScrollBar::add-page, QScrollBar::sub-page {
508
+ background: none;
509
+ border: none;
510
+ width: 0;
511
+ height: 0;
512
+ }
513
+ QStatusBar {
514
+ color: ${text_soft};
515
+ background: ${canvas};
516
+ border-top: 1px solid ${border_strong};
517
+ }
518
+ QStatusBar::item { border: 0; }
519
+ QProgressBar {
520
+ color: ${text};
521
+ background: ${void};
522
+ border: 1px solid ${border};
523
+ border-radius: 6px;
524
+ text-align: center;
525
+ min-height: 16px;
526
+ }
527
+ QProgressBar::chunk {
528
+ background: ${blue};
529
+ border-radius: 5px;
530
+ }
531
+ QCheckBox, QRadioButton { color: ${text_soft}; spacing: 7px; }
532
+ QCheckBox::indicator, QRadioButton::indicator { width: 15px; height: 15px; background: ${canvas}; border: 1px solid ${border_strong}; }
533
+ QCheckBox::indicator:checked { image: url("${check_icon}"); background: ${selection}; border: 2px solid ${blue}; }
534
+ QCheckBox::indicator:checked:disabled { image: url("${check_icon}"); background: ${surface_active}; border: 1px solid ${border_strong}; }
535
+ QRadioButton::indicator { border-radius: 8px; }
536
+ QRadioButton::indicator:checked {
537
+ background: ${blue};
538
+ border: 4px solid ${surface_active};
539
+ }
540
+ QCheckBox::indicator:focus, QRadioButton::indicator:focus {
541
+ border-color: ${focus_ring};
542
+ }
543
+ QToolTip {
544
+ color: ${text};
545
+ background: ${surface_active};
546
+ border: 1px solid ${blue};
547
+ font-size: 10pt;
548
+ padding: 3px 6px;
549
+ }
550
+ QDockWidget {
551
+ color: ${text}; titlebar-close-icon: none; titlebar-normal-icon: none;
552
+ }
553
+ QDockWidget::title {
554
+ color: ${text_soft};
555
+ background: ${surface_raised};
556
+ border-bottom: 1px solid ${border_strong};
557
+ padding: 6px;
558
+ }
559
+ QMainWindow[visualMode="high-contrast"],
560
+ QDialog[visualMode="high-contrast"] { background: ${void}; }
561
+ QWidget[visualMode="high-contrast"] QMenu,
562
+ QWidget[visualMode="high-contrast"] QToolButton,
563
+ QWidget[visualMode="high-contrast"] QPushButton,
564
+ QWidget[visualMode="high-contrast"] QLineEdit,
565
+ QWidget[visualMode="high-contrast"] QPlainTextEdit,
566
+ QWidget[visualMode="high-contrast"] QTreeView,
567
+ QWidget[visualMode="high-contrast"] QListView {
568
+ border-color: ${text_muted};
569
+ }
570
+ QWidget[visualMode="high-contrast"] QMenu::item:selected,
571
+ QWidget[visualMode="high-contrast"] QTreeView::item:selected,
572
+ QWidget[visualMode="high-contrast"] QListView::item:selected {
573
+ color: ${text};
574
+ background: ${selection_active};
575
+ border: 2px solid ${focus_ring};
576
+ }
577
+ """
578
+ )
579
+
580
+
581
+ def build_pycforge_stylesheet(
582
+ colors: PyCForgeColors = PYCFORGE_COLORS,
583
+ ) -> str:
584
+ """Return the complete deterministic stylesheet for *colors*."""
585
+
586
+ values = dict(color_tokens(colors))
587
+ values.update({
588
+ "check_icon": pycforge_icon_path("check").as_posix(),
589
+ "chevron_icon": pycforge_icon_path("chevron-right").as_posix(),
590
+ "tree_open_icon": pycforge_icon_path("next-match").as_posix(),
591
+ })
592
+ foundation = _PYCFORGE_QSS_TEMPLATE.substitute(values).strip()
593
+ workspace = build_workspace_stylesheet(colors).strip()
594
+ steel = build_steel_stylesheet(colors).strip()
595
+ return foundation + "\n" + workspace + "\n" + steel + "\n"
596
+
597
+ __all__ = ["build_pycforge_stylesheet"]