@memberjunction/ng-dashboards 6.2.0-edge.2 → 6.2.0-edge.4

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 (229) hide show
  1. package/dist/AI/components/analytics/realtime/realtime-transcripts-data.d.ts +4 -3
  2. package/dist/AI/components/analytics/realtime/realtime-transcripts-data.d.ts.map +1 -1
  3. package/dist/AI/components/analytics/realtime/realtime-transcripts-data.js +8 -5
  4. package/dist/AI/components/analytics/realtime/realtime-transcripts-data.js.map +1 -1
  5. package/dist/AI/components/duplicates/compare-value.component.d.ts +67 -0
  6. package/dist/AI/components/duplicates/compare-value.component.d.ts.map +1 -0
  7. package/dist/AI/components/duplicates/compare-value.component.js +168 -0
  8. package/dist/AI/components/duplicates/compare-value.component.js.map +1 -0
  9. package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts +49 -3
  10. package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts.map +1 -1
  11. package/dist/AI/components/duplicates/duplicate-detection-resource.component.js +287 -169
  12. package/dist/AI/components/duplicates/duplicate-detection-resource.component.js.map +1 -1
  13. package/dist/AI/components/duplicates/duplicate-detection-run-scope.d.ts +77 -0
  14. package/dist/AI/components/duplicates/duplicate-detection-run-scope.d.ts.map +1 -0
  15. package/dist/AI/components/duplicates/duplicate-detection-run-scope.js +116 -0
  16. package/dist/AI/components/duplicates/duplicate-detection-run-scope.js.map +1 -0
  17. package/dist/AI/components/prompts/model-prompt-priority-matrix.component.d.ts +1 -0
  18. package/dist/AI/components/prompts/model-prompt-priority-matrix.component.d.ts.map +1 -1
  19. package/dist/AI/components/prompts/model-prompt-priority-matrix.component.js +16 -4
  20. package/dist/AI/components/prompts/model-prompt-priority-matrix.component.js.map +1 -1
  21. package/dist/AI/components/tags/tags-resource.component.d.ts +2 -0
  22. package/dist/AI/components/tags/tags-resource.component.d.ts.map +1 -1
  23. package/dist/AI/components/tags/tags-resource.component.js +12 -6
  24. package/dist/AI/components/tags/tags-resource.component.js.map +1 -1
  25. package/dist/AI/components/vectors/vector-index-auto.d.ts +29 -0
  26. package/dist/AI/components/vectors/vector-index-auto.d.ts.map +1 -0
  27. package/dist/AI/components/vectors/vector-index-auto.js +59 -0
  28. package/dist/AI/components/vectors/vector-index-auto.js.map +1 -0
  29. package/dist/AI/components/vectors/vector-management-resource.component.d.ts +9 -0
  30. package/dist/AI/components/vectors/vector-management-resource.component.d.ts.map +1 -1
  31. package/dist/AI/components/vectors/vector-management-resource.component.js +65 -20
  32. package/dist/AI/components/vectors/vector-management-resource.component.js.map +1 -1
  33. package/dist/Actions/components/actions-overview.component.d.ts.map +1 -1
  34. package/dist/Actions/components/actions-overview.component.js +7 -3
  35. package/dist/Actions/components/actions-overview.component.js.map +1 -1
  36. package/dist/Actions/components/categories-list-view.component.d.ts.map +1 -1
  37. package/dist/Actions/components/categories-list-view.component.js +3 -2
  38. package/dist/Actions/components/categories-list-view.component.js.map +1 -1
  39. package/dist/ComponentStudio/component-studio-dashboard.component.d.ts.map +1 -1
  40. package/dist/ComponentStudio/component-studio-dashboard.component.js +1 -0
  41. package/dist/ComponentStudio/component-studio-dashboard.component.js.map +1 -1
  42. package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.d.ts +0 -3
  43. package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.d.ts.map +1 -1
  44. package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.js +5 -14
  45. package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.js.map +1 -1
  46. package/dist/ComponentStudio/components/artifact-load-dialog.component.d.ts.map +1 -1
  47. package/dist/ComponentStudio/components/artifact-load-dialog.component.js +1 -0
  48. package/dist/ComponentStudio/components/artifact-load-dialog.component.js.map +1 -1
  49. package/dist/ComponentStudio/components/artifact-selection-dialog.component.d.ts.map +1 -1
  50. package/dist/ComponentStudio/components/artifact-selection-dialog.component.js +1 -0
  51. package/dist/ComponentStudio/components/artifact-selection-dialog.component.js.map +1 -1
  52. package/dist/ComponentStudio/components/form-override-dialog.component.d.ts +12 -1
  53. package/dist/ComponentStudio/components/form-override-dialog.component.d.ts.map +1 -1
  54. package/dist/ComponentStudio/components/form-override-dialog.component.js +128 -81
  55. package/dist/ComponentStudio/components/form-override-dialog.component.js.map +1 -1
  56. package/dist/Credentials/components/credentials-list-resource.component.d.ts +2 -0
  57. package/dist/Credentials/components/credentials-list-resource.component.d.ts.map +1 -1
  58. package/dist/Credentials/components/credentials-list-resource.component.js +12 -10
  59. package/dist/Credentials/components/credentials-list-resource.component.js.map +1 -1
  60. package/dist/DashboardBrowser/dashboard-browser-agent-context.d.ts +14 -43
  61. package/dist/DashboardBrowser/dashboard-browser-agent-context.d.ts.map +1 -1
  62. package/dist/DashboardBrowser/dashboard-browser-agent-context.js +6 -29
  63. package/dist/DashboardBrowser/dashboard-browser-agent-context.js.map +1 -1
  64. package/dist/DashboardBrowser/dashboard-browser-resource.component.d.ts +174 -321
  65. package/dist/DashboardBrowser/dashboard-browser-resource.component.d.ts.map +1 -1
  66. package/dist/DashboardBrowser/dashboard-browser-resource.component.js +522 -1195
  67. package/dist/DashboardBrowser/dashboard-browser-resource.component.js.map +1 -1
  68. package/dist/DashboardBrowser/dashboard-library-filter.d.ts +116 -0
  69. package/dist/DashboardBrowser/dashboard-library-filter.d.ts.map +1 -0
  70. package/dist/DashboardBrowser/dashboard-library-filter.js +277 -0
  71. package/dist/DashboardBrowser/dashboard-library-filter.js.map +1 -0
  72. package/dist/DashboardBrowser/dashboard-share-dialog.component.d.ts +1 -1
  73. package/dist/DashboardBrowser/dashboard-share-dialog.component.js.map +1 -1
  74. package/dist/DashboardBrowser/dashboards-agent-tools.d.ts +26 -0
  75. package/dist/DashboardBrowser/dashboards-agent-tools.d.ts.map +1 -0
  76. package/dist/DashboardBrowser/dashboards-agent-tools.js +32 -0
  77. package/dist/DashboardBrowser/dashboards-agent-tools.js.map +1 -0
  78. package/dist/DashboardBrowser/dashboards-categories-resource.component.d.ts +58 -0
  79. package/dist/DashboardBrowser/dashboards-categories-resource.component.d.ts.map +1 -0
  80. package/dist/DashboardBrowser/dashboards-categories-resource.component.js +391 -0
  81. package/dist/DashboardBrowser/dashboards-categories-resource.component.js.map +1 -0
  82. package/dist/DashboardBrowser/dashboards-categories.helpers.d.ts +37 -0
  83. package/dist/DashboardBrowser/dashboards-categories.helpers.d.ts.map +1 -0
  84. package/dist/DashboardBrowser/dashboards-categories.helpers.js +68 -0
  85. package/dist/DashboardBrowser/dashboards-categories.helpers.js.map +1 -0
  86. package/dist/DashboardEditor/dashboard-editor.component.d.ts +295 -0
  87. package/dist/DashboardEditor/dashboard-editor.component.d.ts.map +1 -0
  88. package/dist/DashboardEditor/dashboard-editor.component.js +1022 -0
  89. package/dist/DashboardEditor/dashboard-editor.component.js.map +1 -0
  90. package/dist/DashboardEditor/dashboard-editor.types.d.ts +23 -0
  91. package/dist/DashboardEditor/dashboard-editor.types.d.ts.map +1 -0
  92. package/dist/DashboardEditor/dashboard-editor.types.js +3 -0
  93. package/dist/DashboardEditor/dashboard-editor.types.js.map +1 -0
  94. package/dist/DashboardEditor/dashboard-viewer-factory.d.ts +11 -0
  95. package/dist/DashboardEditor/dashboard-viewer-factory.d.ts.map +1 -0
  96. package/dist/DashboardEditor/dashboard-viewer-factory.js +17 -0
  97. package/dist/DashboardEditor/dashboard-viewer-factory.js.map +1 -0
  98. package/dist/DataExplorer/data-explorer-dashboard.component.d.ts +30 -0
  99. package/dist/DataExplorer/data-explorer-dashboard.component.d.ts.map +1 -1
  100. package/dist/DataExplorer/data-explorer-dashboard.component.js +349 -232
  101. package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
  102. package/dist/DataExplorer/services/explorer-state.service.d.ts +1 -1
  103. package/dist/DataExplorer/services/explorer-state.service.js +2 -5
  104. package/dist/DataExplorer/services/explorer-state.service.js.map +1 -1
  105. package/dist/FormBuilder/form-builder-resource.component.d.ts +0 -14
  106. package/dist/FormBuilder/form-builder-resource.component.d.ts.map +1 -1
  107. package/dist/FormBuilder/form-builder-resource.component.js +7 -29
  108. package/dist/FormBuilder/form-builder-resource.component.js.map +1 -1
  109. package/dist/Home/home-agent-context.d.ts +29 -10
  110. package/dist/Home/home-agent-context.d.ts.map +1 -1
  111. package/dist/Home/home-agent-context.js +50 -24
  112. package/dist/Home/home-agent-context.js.map +1 -1
  113. package/dist/Home/home-dashboard-switcher.component.d.ts +95 -0
  114. package/dist/Home/home-dashboard-switcher.component.d.ts.map +1 -0
  115. package/dist/Home/home-dashboard-switcher.component.js +442 -0
  116. package/dist/Home/home-dashboard-switcher.component.js.map +1 -0
  117. package/dist/Home/home-dashboard.component.d.ts +330 -17
  118. package/dist/Home/home-dashboard.component.d.ts.map +1 -1
  119. package/dist/Home/home-dashboard.component.js +1702 -1014
  120. package/dist/Home/home-dashboard.component.js.map +1 -1
  121. package/dist/Home/home-menus.d.ts +38 -0
  122. package/dist/Home/home-menus.d.ts.map +1 -0
  123. package/dist/Home/home-menus.js +53 -0
  124. package/dist/Home/home-menus.js.map +1 -0
  125. package/dist/Home/home-pinned-dashboards.d.ts +33 -0
  126. package/dist/Home/home-pinned-dashboards.d.ts.map +1 -0
  127. package/dist/Home/home-pinned-dashboards.js +76 -0
  128. package/dist/Home/home-pinned-dashboards.js.map +1 -0
  129. package/dist/PredictiveStudio/components/ps-production.component.d.ts +5 -1
  130. package/dist/PredictiveStudio/components/ps-production.component.d.ts.map +1 -1
  131. package/dist/PredictiveStudio/components/ps-production.component.js +64 -41
  132. package/dist/PredictiveStudio/components/ps-production.component.js.map +1 -1
  133. package/dist/QueryBrowser/query-browser-resource.component.d.ts.map +1 -1
  134. package/dist/QueryBrowser/query-browser-resource.component.js +3 -2
  135. package/dist/QueryBrowser/query-browser-resource.component.js.map +1 -1
  136. package/dist/RealtimeRecordings/realtime-recordings-dashboard.component.js +2 -2
  137. package/dist/RealtimeRecordings/realtime-recordings-dashboard.component.js.map +1 -1
  138. package/dist/TelephonyOperations/telephony-operations-agent-context.d.ts +107 -0
  139. package/dist/TelephonyOperations/telephony-operations-agent-context.d.ts.map +1 -0
  140. package/dist/TelephonyOperations/telephony-operations-agent-context.js +216 -0
  141. package/dist/TelephonyOperations/telephony-operations-agent-context.js.map +1 -0
  142. package/dist/TelephonyOperations/telephony-operations-dashboard.component.d.ts +58 -0
  143. package/dist/TelephonyOperations/telephony-operations-dashboard.component.d.ts.map +1 -0
  144. package/dist/TelephonyOperations/telephony-operations-dashboard.component.js +812 -0
  145. package/dist/TelephonyOperations/telephony-operations-dashboard.component.js.map +1 -0
  146. package/dist/Testing/components/testing-explorer.component.d.ts.map +1 -1
  147. package/dist/Testing/components/testing-explorer.component.js +7 -7
  148. package/dist/Testing/components/testing-explorer.component.js.map +1 -1
  149. package/dist/WorkQueue/components/work-queue-bindings.component.d.ts +37 -0
  150. package/dist/WorkQueue/components/work-queue-bindings.component.d.ts.map +1 -0
  151. package/dist/WorkQueue/components/work-queue-bindings.component.js +210 -0
  152. package/dist/WorkQueue/components/work-queue-bindings.component.js.map +1 -0
  153. package/dist/WorkQueue/components/work-queue-dead-letters.component.d.ts +70 -0
  154. package/dist/WorkQueue/components/work-queue-dead-letters.component.d.ts.map +1 -0
  155. package/dist/WorkQueue/components/work-queue-dead-letters.component.js +496 -0
  156. package/dist/WorkQueue/components/work-queue-dead-letters.component.js.map +1 -0
  157. package/dist/WorkQueue/components/work-queue-discard-dialog.component.d.ts +22 -0
  158. package/dist/WorkQueue/components/work-queue-discard-dialog.component.d.ts.map +1 -0
  159. package/dist/WorkQueue/components/work-queue-discard-dialog.component.js +99 -0
  160. package/dist/WorkQueue/components/work-queue-discard-dialog.component.js.map +1 -0
  161. package/dist/WorkQueue/components/work-queue-overview.component.d.ts +29 -0
  162. package/dist/WorkQueue/components/work-queue-overview.component.d.ts.map +1 -0
  163. package/dist/WorkQueue/components/work-queue-overview.component.js +278 -0
  164. package/dist/WorkQueue/components/work-queue-overview.component.js.map +1 -0
  165. package/dist/WorkQueue/components/work-queue-partitions.component.d.ts +59 -0
  166. package/dist/WorkQueue/components/work-queue-partitions.component.d.ts.map +1 -0
  167. package/dist/WorkQueue/components/work-queue-partitions.component.js +359 -0
  168. package/dist/WorkQueue/components/work-queue-partitions.component.js.map +1 -0
  169. package/dist/WorkQueue/services/work-queue-operator.service.d.ts +22 -0
  170. package/dist/WorkQueue/services/work-queue-operator.service.d.ts.map +1 -0
  171. package/dist/WorkQueue/services/work-queue-operator.service.js +44 -0
  172. package/dist/WorkQueue/services/work-queue-operator.service.js.map +1 -0
  173. package/dist/WorkQueue/work-queue-agent-context.d.ts +67 -0
  174. package/dist/WorkQueue/work-queue-agent-context.d.ts.map +1 -0
  175. package/dist/WorkQueue/work-queue-agent-context.js +119 -0
  176. package/dist/WorkQueue/work-queue-agent-context.js.map +1 -0
  177. package/dist/WorkQueue/work-queue-dashboard.component.d.ts +94 -0
  178. package/dist/WorkQueue/work-queue-dashboard.component.d.ts.map +1 -0
  179. package/dist/WorkQueue/work-queue-dashboard.component.js +545 -0
  180. package/dist/WorkQueue/work-queue-dashboard.component.js.map +1 -0
  181. package/dist/WorkQueue/work-queue-types.d.ts +40 -0
  182. package/dist/WorkQueue/work-queue-types.d.ts.map +1 -0
  183. package/dist/WorkQueue/work-queue-types.js +2 -0
  184. package/dist/WorkQueue/work-queue-types.js.map +1 -0
  185. package/dist/ai-dashboards.module.d.ts +21 -20
  186. package/dist/ai-dashboards.module.d.ts.map +1 -1
  187. package/dist/ai-dashboards.module.js +4 -1
  188. package/dist/ai-dashboards.module.js.map +1 -1
  189. package/dist/core-dashboards.module.d.ts +69 -61
  190. package/dist/core-dashboards.module.d.ts.map +1 -1
  191. package/dist/core-dashboards.module.js +29 -2
  192. package/dist/core-dashboards.module.js.map +1 -1
  193. package/dist/data-explorer-dashboards.module.d.ts +1 -1
  194. package/dist/data-explorer-dashboards.module.d.ts.map +1 -1
  195. package/dist/data-explorer-dashboards.module.js +3 -1
  196. package/dist/data-explorer-dashboards.module.js.map +1 -1
  197. package/dist/module.d.ts +14 -13
  198. package/dist/module.d.ts.map +1 -1
  199. package/dist/module.js +7 -0
  200. package/dist/module.js.map +1 -1
  201. package/dist/public-api.d.ts +6 -0
  202. package/dist/public-api.d.ts.map +1 -1
  203. package/dist/public-api.js +9 -0
  204. package/dist/public-api.js.map +1 -1
  205. package/dist/shared/dashboard-library-changes.d.ts +23 -0
  206. package/dist/shared/dashboard-library-changes.d.ts.map +1 -0
  207. package/dist/shared/dashboard-library-changes.js +26 -0
  208. package/dist/shared/dashboard-library-changes.js.map +1 -0
  209. package/dist/shared/dashboard-owner-names.d.ts +17 -0
  210. package/dist/shared/dashboard-owner-names.d.ts.map +1 -0
  211. package/dist/shared/dashboard-owner-names.js +65 -0
  212. package/dist/shared/dashboard-owner-names.js.map +1 -0
  213. package/dist/shared/dashboard-recents.d.ts +34 -0
  214. package/dist/shared/dashboard-recents.d.ts.map +1 -0
  215. package/dist/shared/dashboard-recents.js +87 -0
  216. package/dist/shared/dashboard-recents.js.map +1 -0
  217. package/dist/shared/dashboards-app-install.d.ts +59 -0
  218. package/dist/shared/dashboards-app-install.d.ts.map +1 -0
  219. package/dist/shared/dashboards-app-install.js +97 -0
  220. package/dist/shared/dashboards-app-install.js.map +1 -0
  221. package/dist/shared/dashboards-app.helpers.d.ts +42 -0
  222. package/dist/shared/dashboards-app.helpers.d.ts.map +1 -0
  223. package/dist/shared/dashboards-app.helpers.js +143 -0
  224. package/dist/shared/dashboards-app.helpers.js.map +1 -0
  225. package/dist/work-queue-dashboards.module.d.ts +23 -0
  226. package/dist/work-queue-dashboards.module.d.ts.map +1 -0
  227. package/dist/work-queue-dashboards.module.js +92 -0
  228. package/dist/work-queue-dashboards.module.js.map +1 -0
  229. package/package.json +73 -66
@@ -177,6 +177,8 @@ function PSProductionComponent_Conditional_2_Conditional_8_Template(rf, ctx) { i
177
177
  i0.ɵɵclassMap(ctx_r1.deployBadge(ctx_r1.selected.deployState));
178
178
  i0.ɵɵadvance();
179
179
  i0.ɵɵtextInterpolate(ctx_r1.deployLabel(ctx_r1.selected.deployState));
180
+ i0.ɵɵadvance();
181
+ i0.ɵɵproperty("disabled", ctx_r1.selected.deployState === "needs-training")("title", ctx_r1.selected.deployState === "needs-training" ? "Train this model before operating it" : "Operate this model");
180
182
  } }
181
183
  function PSProductionComponent_Conditional_2_Conditional_9_Template(rf, ctx) { if (rf & 1) {
182
184
  const _r8 = i0.ɵɵgetCurrentView();
@@ -222,6 +224,8 @@ function PSProductionComponent_Conditional_2_Conditional_9_Template(rf, ctx) { i
222
224
  i0.ɵɵclassMap(ctx_r1.deployBadge(ctx_r1.selected.deployState));
223
225
  i0.ɵɵadvance();
224
226
  i0.ɵɵtextInterpolate(ctx_r1.deployLabel(ctx_r1.selected.deployState));
227
+ i0.ɵɵadvance();
228
+ i0.ɵɵproperty("disabled", ctx_r1.selected.deployState === "needs-training");
225
229
  } }
226
230
  function PSProductionComponent_Conditional_2_Conditional_18_Template(rf, ctx) { if (rf & 1) {
227
231
  i0.ɵɵelementStart(0, "span", 19);
@@ -234,8 +238,19 @@ function PSProductionComponent_Conditional_2_Conditional_18_Template(rf, ctx) {
234
238
  } }
235
239
  function PSProductionComponent_Conditional_2_Conditional_22_Conditional_1_Template(rf, ctx) { if (rf & 1) {
236
240
  i0.ɵɵelementStart(0, "div", 68);
237
- i0.ɵɵelement(1, "i", 69);
238
- i0.ɵɵelementStart(2, "div", 70);
241
+ i0.ɵɵelement(1, "i", 70);
242
+ i0.ɵɵelementStart(2, "div", 71);
243
+ i0.ɵɵtext(3, "This model ");
244
+ i0.ɵɵelementStart(4, "strong");
245
+ i0.ɵɵtext(5, "needs training");
246
+ i0.ɵɵelementEnd();
247
+ i0.ɵɵtext(6, " \u2014 it has no trained model artifact on this server, so it can't score anything yet. Train its pipeline (Pipelines \u2192 Train), then publish the new model; scoring processes that opt in to auto-train do this on their next run.");
248
+ i0.ɵɵelementEnd()();
249
+ } }
250
+ function PSProductionComponent_Conditional_2_Conditional_22_Conditional_2_Template(rf, ctx) { if (rf & 1) {
251
+ i0.ɵɵelementStart(0, "div", 69);
252
+ i0.ɵɵelement(1, "i", 72);
253
+ i0.ɵɵelementStart(2, "div", 71);
239
254
  i0.ɵɵtext(3, "This model is published but ");
240
255
  i0.ɵɵelementStart(4, "strong");
241
256
  i0.ɵɵtext(5, "not operating");
@@ -247,10 +262,10 @@ function PSProductionComponent_Conditional_2_Conditional_22_Conditional_1_Templa
247
262
  i0.ɵɵtext(9, " above to run it now, schedule it to run regularly, or write predictions back to a column.");
248
263
  i0.ɵɵelementEnd()();
249
264
  } }
250
- function PSProductionComponent_Conditional_2_Conditional_22_Conditional_2_Conditional_0_For_3_Template(rf, ctx) { if (rf & 1) {
251
- i0.ɵɵelementStart(0, "div", 72);
252
- i0.ɵɵelement(1, "i", 73);
253
- i0.ɵɵelementStart(2, "div", 74)(3, "div", 70)(4, "strong");
265
+ function PSProductionComponent_Conditional_2_Conditional_22_Conditional_3_Conditional_0_For_3_Template(rf, ctx) { if (rf & 1) {
266
+ i0.ɵɵelementStart(0, "div", 74);
267
+ i0.ɵɵelement(1, "i", 75);
268
+ i0.ɵɵelementStart(2, "div", 76)(3, "div", 71)(4, "strong");
254
269
  i0.ɵɵtext(5);
255
270
  i0.ɵɵelementEnd();
256
271
  i0.ɵɵtext(6);
@@ -275,27 +290,27 @@ function PSProductionComponent_Conditional_2_Conditional_22_Conditional_2_Condit
275
290
  i0.ɵɵadvance();
276
291
  i0.ɵɵtextInterpolate(b_r9.mode);
277
292
  } }
278
- function PSProductionComponent_Conditional_2_Conditional_22_Conditional_2_Conditional_0_Template(rf, ctx) { if (rf & 1) {
279
- i0.ɵɵelementStart(0, "div", 71);
293
+ function PSProductionComponent_Conditional_2_Conditional_22_Conditional_3_Conditional_0_Template(rf, ctx) { if (rf & 1) {
294
+ i0.ɵɵelementStart(0, "div", 73);
280
295
  i0.ɵɵtext(1, "Scoring bindings");
281
296
  i0.ɵɵelementEnd();
282
- i0.ɵɵrepeaterCreate(2, PSProductionComponent_Conditional_2_Conditional_22_Conditional_2_Conditional_0_For_3_Template, 11, 7, "div", 72, _forTrack1);
297
+ i0.ɵɵrepeaterCreate(2, PSProductionComponent_Conditional_2_Conditional_22_Conditional_3_Conditional_0_For_3_Template, 11, 7, "div", 74, _forTrack1);
283
298
  } if (rf & 2) {
284
299
  const ctx_r1 = i0.ɵɵnextContext(4);
285
300
  i0.ɵɵadvance(2);
286
301
  i0.ɵɵrepeater(ctx_r1.selectedBindings);
287
302
  } }
288
- function PSProductionComponent_Conditional_2_Conditional_22_Conditional_2_Conditional_1_Template(rf, ctx) { if (rf & 1) {
303
+ function PSProductionComponent_Conditional_2_Conditional_22_Conditional_3_Conditional_1_Template(rf, ctx) { if (rf & 1) {
289
304
  i0.ɵɵelementStart(0, "div", 29);
290
305
  i0.ɵɵtext(1, "Scheduled to run, writing generic output to the process run history (no write-back column).");
291
306
  i0.ɵɵelementEnd();
292
307
  } }
293
- function PSProductionComponent_Conditional_2_Conditional_22_Conditional_2_Conditional_2_Template(rf, ctx) { if (rf & 1) {
294
- i0.ɵɵelement(0, "div", 75);
295
- i0.ɵɵelementStart(1, "div", 76)(2, "span", 18);
308
+ function PSProductionComponent_Conditional_2_Conditional_22_Conditional_3_Conditional_2_Template(rf, ctx) { if (rf & 1) {
309
+ i0.ɵɵelement(0, "div", 77);
310
+ i0.ɵɵelementStart(1, "div", 78)(2, "span", 18);
296
311
  i0.ɵɵtext(3, "Last scored");
297
312
  i0.ɵɵelementEnd();
298
- i0.ɵɵelementStart(4, "span", 70);
313
+ i0.ɵɵelementStart(4, "span", 71);
299
314
  i0.ɵɵtext(5);
300
315
  i0.ɵɵpipe(6, "date");
301
316
  i0.ɵɵelementEnd()();
@@ -304,9 +319,9 @@ function PSProductionComponent_Conditional_2_Conditional_22_Conditional_2_Condit
304
319
  i0.ɵɵadvance(5);
305
320
  i0.ɵɵtextInterpolate2("", i0.ɵɵpipeBind2(6, 2, ctx_r1.selected.lastScoredAt, "medium"), "", ctx_r1.selected.lastRowCount != null ? " \u00B7 " + ctx_r1.selected.lastRowCount + " rows" : "");
306
321
  } }
307
- function PSProductionComponent_Conditional_2_Conditional_22_Conditional_2_Template(rf, ctx) { if (rf & 1) {
308
- i0.ɵɵconditionalCreate(0, PSProductionComponent_Conditional_2_Conditional_22_Conditional_2_Conditional_0_Template, 4, 0)(1, PSProductionComponent_Conditional_2_Conditional_22_Conditional_2_Conditional_1_Template, 2, 0, "div", 29);
309
- i0.ɵɵconditionalCreate(2, PSProductionComponent_Conditional_2_Conditional_22_Conditional_2_Conditional_2_Template, 7, 5);
322
+ function PSProductionComponent_Conditional_2_Conditional_22_Conditional_3_Template(rf, ctx) { if (rf & 1) {
323
+ i0.ɵɵconditionalCreate(0, PSProductionComponent_Conditional_2_Conditional_22_Conditional_3_Conditional_0_Template, 4, 0)(1, PSProductionComponent_Conditional_2_Conditional_22_Conditional_3_Conditional_1_Template, 2, 0, "div", 29);
324
+ i0.ɵɵconditionalCreate(2, PSProductionComponent_Conditional_2_Conditional_22_Conditional_3_Conditional_2_Template, 7, 5);
310
325
  } if (rf & 2) {
311
326
  const ctx_r1 = i0.ɵɵnextContext(3);
312
327
  i0.ɵɵconditional(ctx_r1.selectedBindings.length > 0 ? 0 : 1);
@@ -315,16 +330,16 @@ function PSProductionComponent_Conditional_2_Conditional_22_Conditional_2_Templa
315
330
  } }
316
331
  function PSProductionComponent_Conditional_2_Conditional_22_Template(rf, ctx) { if (rf & 1) {
317
332
  i0.ɵɵelementStart(0, "div", 23);
318
- i0.ɵɵconditionalCreate(1, PSProductionComponent_Conditional_2_Conditional_22_Conditional_1_Template, 10, 0, "div", 68)(2, PSProductionComponent_Conditional_2_Conditional_22_Conditional_2_Template, 3, 2);
333
+ i0.ɵɵconditionalCreate(1, PSProductionComponent_Conditional_2_Conditional_22_Conditional_1_Template, 7, 0, "div", 68)(2, PSProductionComponent_Conditional_2_Conditional_22_Conditional_2_Template, 10, 0, "div", 69)(3, PSProductionComponent_Conditional_2_Conditional_22_Conditional_3_Template, 3, 2);
319
334
  i0.ɵɵelementEnd();
320
335
  } if (rf & 2) {
321
336
  const ctx_r1 = i0.ɵɵnextContext(2);
322
337
  i0.ɵɵadvance();
323
- i0.ɵɵconditional(ctx_r1.selected.deployState === "idle" ? 1 : 2);
338
+ i0.ɵɵconditional(ctx_r1.selected.deployState === "needs-training" ? 1 : ctx_r1.selected.deployState === "idle" ? 2 : 3);
324
339
  } }
325
340
  function PSProductionComponent_Conditional_2_Conditional_31_Template(rf, ctx) { if (rf & 1) {
326
341
  const _r10 = i0.ɵɵgetCurrentView();
327
- i0.ɵɵelementStart(0, "div", 16)(1, "button", 77);
342
+ i0.ɵɵelementStart(0, "div", 16)(1, "button", 79);
328
343
  i0.ɵɵlistener("click", function PSProductionComponent_Conditional_2_Conditional_31_Template_button_click_1_listener() { i0.ɵɵrestoreView(_r10); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.toggleRunFocus()); });
329
344
  i0.ɵɵelement(2, "i", 22);
330
345
  i0.ɵɵelementStart(3, "span");
@@ -342,15 +357,15 @@ function PSProductionComponent_Conditional_2_Conditional_31_Template(rf, ctx) {
342
357
  } }
343
358
  function PSProductionComponent_Conditional_2_Conditional_33_Template(rf, ctx) { if (rf & 1) {
344
359
  const _r11 = i0.ɵɵgetCurrentView();
345
- i0.ɵɵelementStart(0, "div", 78)(1, "button", 79);
360
+ i0.ɵɵelementStart(0, "div", 80)(1, "button", 81);
346
361
  i0.ɵɵlistener("click", function PSProductionComponent_Conditional_2_Conditional_33_Template_button_click_1_listener() { i0.ɵɵrestoreView(_r11); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.closeRun()); });
347
- i0.ɵɵelement(2, "i", 80);
362
+ i0.ɵɵelement(2, "i", 82);
348
363
  i0.ɵɵtext(3, " All runs ");
349
364
  i0.ɵɵelementEnd();
350
365
  i0.ɵɵelementStart(4, "span", 64);
351
366
  i0.ɵɵtext(5);
352
367
  i0.ɵɵelementEnd()();
353
- i0.ɵɵelement(6, "ps-predictions-grid", 81);
368
+ i0.ɵɵelement(6, "ps-predictions-grid", 83);
354
369
  } if (rf & 2) {
355
370
  const ctx_r1 = i0.ɵɵnextContext(2);
356
371
  i0.ɵɵadvance(5);
@@ -367,13 +382,13 @@ function PSProductionComponent_Conditional_2_Conditional_35_Template(rf, ctx) {
367
382
  i0.ɵɵelementEnd();
368
383
  } }
369
384
  function PSProductionComponent_Conditional_2_Conditional_36_For_14_Conditional_14_Template(rf, ctx) { if (rf & 1) {
370
- i0.ɵɵelementStart(0, "span", 87);
385
+ i0.ɵɵelementStart(0, "span", 89);
371
386
  i0.ɵɵtext(1, "dry run");
372
387
  i0.ɵɵelementEnd();
373
388
  } }
374
389
  function PSProductionComponent_Conditional_2_Conditional_36_For_14_Template(rf, ctx) { if (rf & 1) {
375
390
  const _r12 = i0.ɵɵgetCurrentView();
376
- i0.ɵɵelementStart(0, "tr", 83);
391
+ i0.ɵɵelementStart(0, "tr", 85);
377
392
  i0.ɵɵlistener("click", function PSProductionComponent_Conditional_2_Conditional_36_For_14_Template_tr_click_0_listener() { const r_r13 = i0.ɵɵrestoreView(_r12).$implicit; const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.openRun(r_r13.ID)); });
378
393
  i0.ɵɵelementStart(1, "td");
379
394
  i0.ɵɵtext(2);
@@ -382,17 +397,17 @@ function PSProductionComponent_Conditional_2_Conditional_36_For_14_Template(rf,
382
397
  i0.ɵɵelementStart(4, "td")(5, "span", 51);
383
398
  i0.ɵɵtext(6);
384
399
  i0.ɵɵelementEnd()();
385
- i0.ɵɵelementStart(7, "td", 84);
400
+ i0.ɵɵelementStart(7, "td", 86);
386
401
  i0.ɵɵtext(8);
387
- i0.ɵɵelementStart(9, "span", 85);
402
+ i0.ɵɵelementStart(9, "span", 87);
388
403
  i0.ɵɵtext(10);
389
404
  i0.ɵɵelementEnd()();
390
405
  i0.ɵɵelementStart(11, "td", 29);
391
406
  i0.ɵɵtext(12);
392
407
  i0.ɵɵelementEnd();
393
- i0.ɵɵelementStart(13, "td", 86);
394
- i0.ɵɵconditionalCreate(14, PSProductionComponent_Conditional_2_Conditional_36_For_14_Conditional_14_Template, 2, 0, "span", 87);
395
- i0.ɵɵelement(15, "i", 88);
408
+ i0.ɵɵelementStart(13, "td", 88);
409
+ i0.ɵɵconditionalCreate(14, PSProductionComponent_Conditional_2_Conditional_36_For_14_Conditional_14_Template, 2, 0, "span", 89);
410
+ i0.ɵɵelement(15, "i", 90);
396
411
  i0.ɵɵelementEnd()();
397
412
  } if (rf & 2) {
398
413
  const r_r13 = ctx.$implicit;
@@ -428,7 +443,7 @@ function PSProductionComponent_Conditional_2_Conditional_36_Template(rf, ctx) {
428
443
  i0.ɵɵelement(11, "th");
429
444
  i0.ɵɵelementEnd()();
430
445
  i0.ɵɵelementStart(12, "tbody");
431
- i0.ɵɵrepeaterCreate(13, PSProductionComponent_Conditional_2_Conditional_36_For_14_Template, 16, 11, "tr", 82, _forTrack2);
446
+ i0.ɵɵrepeaterCreate(13, PSProductionComponent_Conditional_2_Conditional_36_For_14_Template, 16, 11, "tr", 84, _forTrack2);
432
447
  i0.ɵɵelementEnd()();
433
448
  } if (rf & 2) {
434
449
  const ctx_r1 = i0.ɵɵnextContext(2);
@@ -444,7 +459,7 @@ function PSProductionComponent_Conditional_2_Template(rf, ctx) { if (rf & 1) {
444
459
  i0.ɵɵlistener("dragEnd", function PSProductionComponent_Conditional_2_Template_as_split_dragEnd_3_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onSplitDragEnd($event.sizes)); });
445
460
  i0.ɵɵconditionalCreate(4, PSProductionComponent_Conditional_2_Conditional_4_Template, 13, 4, "as-split-area", 8);
446
461
  i0.ɵɵelementStart(5, "as-split-area", 9)(6, "div", 10)(7, "div", 11);
447
- i0.ɵɵconditionalCreate(8, PSProductionComponent_Conditional_2_Conditional_8_Template, 17, 12, "div", 12)(9, PSProductionComponent_Conditional_2_Conditional_9_Template, 17, 10, "div", 13);
462
+ i0.ɵɵconditionalCreate(8, PSProductionComponent_Conditional_2_Conditional_8_Template, 17, 14, "div", 12)(9, PSProductionComponent_Conditional_2_Conditional_9_Template, 17, 11, "div", 13);
448
463
  i0.ɵɵelementEnd();
449
464
  i0.ɵɵelementStart(10, "div", 14)(11, "div", 15);
450
465
  i0.ɵɵlistener("click", function PSProductionComponent_Conditional_2_Template_div_click_11_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.toggleDeploymentCollapse()); });
@@ -462,7 +477,7 @@ function PSProductionComponent_Conditional_2_Template(rf, ctx) { if (rf & 1) {
462
477
  i0.ɵɵlistener("click", function PSProductionComponent_Conditional_2_Template_button_click_20_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); $event.stopPropagation(); return i0.ɵɵresetView(ctx_r1.toggleDeploymentCollapse()); });
463
478
  i0.ɵɵelement(21, "i", 22);
464
479
  i0.ɵɵelementEnd()()();
465
- i0.ɵɵconditionalCreate(22, PSProductionComponent_Conditional_2_Conditional_22_Template, 3, 1, "div", 23);
480
+ i0.ɵɵconditionalCreate(22, PSProductionComponent_Conditional_2_Conditional_22_Template, 4, 1, "div", 23);
466
481
  i0.ɵɵelementEnd();
467
482
  i0.ɵɵelementStart(23, "div", 24)(24, "div", 25)(25, "div", 16);
468
483
  i0.ɵɵelement(26, "i", 26);
@@ -850,7 +865,7 @@ export class PSProductionComponent extends BaseAngularComponent {
850
865
  problemType: m.ProblemType ?? '—',
851
866
  version: m.Version,
852
867
  holdoutMetric,
853
- deployState: bindings.length > 0 ? 'bound' : scheduledCount > 0 ? 'scheduled' : 'idle',
868
+ deployState: !m.ArtifactFileID ? 'needs-training' : bindings.length > 0 ? 'bound' : scheduledCount > 0 ? 'scheduled' : 'idle',
854
869
  bindingCount: bindings.length,
855
870
  processCount: processes.length,
856
871
  scheduledCount,
@@ -1015,6 +1030,7 @@ export class PSProductionComponent extends BaseAngularComponent {
1015
1030
  // ---- display helpers ----
1016
1031
  DeployIcon(state) {
1017
1032
  switch (state) {
1033
+ case 'needs-training': return 'fa-solid fa-triangle-exclamation';
1018
1034
  case 'bound': return 'fa-solid fa-arrow-right-to-bracket';
1019
1035
  case 'scheduled': return 'fa-solid fa-clock';
1020
1036
  case 'idle': return 'fa-solid fa-circle-pause';
@@ -1026,6 +1042,7 @@ export class PSProductionComponent extends BaseAngularComponent {
1026
1042
  }
1027
1043
  DeployLabel(state) {
1028
1044
  switch (state) {
1045
+ case 'needs-training': return 'Needs training';
1029
1046
  case 'bound': return 'Bound';
1030
1047
  case 'scheduled': return 'Scheduled';
1031
1048
  case 'idle': return 'Idle';
@@ -1037,6 +1054,7 @@ export class PSProductionComponent extends BaseAngularComponent {
1037
1054
  }
1038
1055
  DeployBadge(state) {
1039
1056
  switch (state) {
1057
+ case 'needs-training': return 'amber';
1040
1058
  case 'bound': return 'green';
1041
1059
  case 'scheduled': return 'blue';
1042
1060
  case 'idle': return 'gray';
@@ -1068,14 +1086,14 @@ export class PSProductionComponent extends BaseAngularComponent {
1068
1086
  return this.RunBadge(status);
1069
1087
  }
1070
1088
  static ɵfac = /*@__PURE__*/ (() => { let ɵPSProductionComponent_BaseFactory; return function PSProductionComponent_Factory(__ngFactoryType__) { return (ɵPSProductionComponent_BaseFactory || (ɵPSProductionComponent_BaseFactory = i0.ɵɵgetInheritedFactory(PSProductionComponent)))(__ngFactoryType__ || PSProductionComponent); }; })();
1071
- static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: PSProductionComponent, selectors: [["ps-production"]], inputs: { engine: "engine" }, features: [i0.ɵɵInheritDefinitionFeature], decls: 3, vars: 1, consts: [["data-testid", "ps-production-panel", 1, "ps-panel", "ps-production"], ["data-testid", "ps-production-empty", 1, "ps-empty"], [1, "ps-empty-ico"], [1, "fa-solid", "fa-satellite-dish"], ["data-testid", "ps-production-kpis", 1, "prod-kpis"], [1, "prod-layout"], ["data-testid", "ps-production-collapsed-rail", 1, "prod-collapsed-strip"], ["direction", "horizontal", "unit", "percent", 1, "prod-splitter", 3, "dragEnd", "gutterSize"], [3, "size", "minSize", "maxSize"], [3, "size", "minSize"], ["data-testid", "ps-production-detail", 1, "ps-col", "detail"], [1, "ps-card", "prod-header-card"], [1, "ps-card-body", "dh"], [1, "ps-card-body", "dh-compact"], [1, "ps-card", "prod-deployment-card"], [1, "ps-card-head", "clickable", 3, "click"], [2, "display", "flex", "align-items", "center", "gap", "8px"], [1, "fa-solid", "fa-network-wired", 2, "color", "var(--mj-brand-primary)"], [1, "ps-muted", "ps-small"], [1, "ps-badge", "gray", "ps-small"], [2, "display", "flex", "align-items", "center", "gap", "6px"], ["type", "button", 1, "ps-card-collapse-btn", 3, "click", "title"], [1, "fa-solid"], [1, "ps-card-body"], [1, "ps-card", "run-card"], [1, "ps-card-head"], [1, "fa-solid", "fa-clock-rotate-left", 2, "color", "var(--mj-status-info)"], [1, "ps-card-body", "run-card-body"], ["text", "Loading runs...", "size", "small"], [1, "ps-small", "ps-muted"], [1, "runs-table"], [3, "Close", "Visible", "modelId", "modelLabel", "engine", "provider", "currentUser"], [1, "ps-kpi"], [1, "label"], [1, "val"], ["type", "button", "aria-label", "Expand models list", "title", "Expand list", 1, "prod-rail-collapse", 3, "click"], [1, "fa-solid", "fa-chevron-right"], [1, "prod-collapsed-strip-label"], ["data-testid", "ps-production-list", 1, "ps-card", "mlist"], [2, "display", "flex", "gap", "6px", "align-items", "center"], [1, "ps-badge", "gray"], ["type", "button", "title", "Collapse list", "aria-label", "Collapse list", 1, "prod-collapse-btn", 3, "click"], [1, "fa-solid", "fa-chevron-left"], [1, "ps-card-body", 2, "padding", "8px"], ["data-testid", "ps-production-row", 1, "mrow", 3, "sel"], ["data-testid", "ps-production-row", 1, "mrow", 3, "click"], [1, "ico"], [2, "flex", "1", "min-width", "0"], [1, "nm"], [1, "ln2", "ps-muted", "ps-small"], [1, "meta"], [1, "ps-badge"], [1, "ps-mono", "ps-small", "ps-muted"], [1, "big-ico"], ["data-testid", "ps-production-detail-name"], [1, "ps-tag", "ps-mono"], [1, "ps-muted", "ps-small", "sub"], ["mjButton", "", "variant", "primary", "size", "sm", "data-testid", "ps-production-operate", 3, "click"], [1, "fa-solid", "fa-rocket"], ["type", "button", "title", "Collapse model header", "aria-label", "Collapse model header", 1, "ps-card-collapse-btn", 3, "click"], [1, "fa-solid", "fa-chevron-up"], [1, "ps-card-body", "dh-compact", 3, "click"], [1, "mini-ico"], [1, "compact-info"], [1, "ps-tag", "ps-mono", "ps-small"], ["mjButton", "", "variant", "primary", "size", "sm", "data-testid", "ps-production-operate-compact", 3, "click"], ["type", "button", "title", "Expand model header", "aria-label", "Expand model header", 1, "ps-card-collapse-btn", 3, "click"], [1, "fa-solid", "fa-chevron-down"], [1, "ps-callout", "info"], [1, "fa-solid", "fa-circle-info"], [1, "ps-small"], [1, "ps-section-title"], [1, "bind-row"], [1, "fa-solid", "fa-arrow-right-to-bracket", "ps-muted"], [2, "flex", "1"], [1, "ps-divider"], [1, "ps-row", 2, "justify-content", "space-between"], ["type", "button", 1, "ps-focus-toggle-btn", 3, "click", "title"], [1, "run-drill-nav"], ["data-testid", "ps-production-run-back", 1, "run-back", 3, "click"], [1, "fa-solid", "fa-arrow-left"], ["data-testid", "ps-production-run-grid", 3, "modelId", "runId", "entityName", "problemType", "title", "height"], ["data-testid", "ps-production-run", 1, "run-row"], ["data-testid", "ps-production-run", 1, "run-row", 3, "click"], [1, "ps-mono"], [1, "ps-muted"], [1, "run-right"], [1, "ps-tag", "amber"], [1, "fa-solid", "fa-chevron-right", "ps-muted"]], template: function PSProductionComponent_Template(rf, ctx) { if (rf & 1) {
1089
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: PSProductionComponent, selectors: [["ps-production"]], inputs: { engine: "engine" }, features: [i0.ɵɵInheritDefinitionFeature], decls: 3, vars: 1, consts: [["data-testid", "ps-production-panel", 1, "ps-panel", "ps-production"], ["data-testid", "ps-production-empty", 1, "ps-empty"], [1, "ps-empty-ico"], [1, "fa-solid", "fa-satellite-dish"], ["data-testid", "ps-production-kpis", 1, "prod-kpis"], [1, "prod-layout"], ["data-testid", "ps-production-collapsed-rail", 1, "prod-collapsed-strip"], ["direction", "horizontal", "unit", "percent", 1, "prod-splitter", 3, "dragEnd", "gutterSize"], [3, "size", "minSize", "maxSize"], [3, "size", "minSize"], ["data-testid", "ps-production-detail", 1, "ps-col", "detail"], [1, "ps-card", "prod-header-card"], [1, "ps-card-body", "dh"], [1, "ps-card-body", "dh-compact"], [1, "ps-card", "prod-deployment-card"], [1, "ps-card-head", "clickable", 3, "click"], [2, "display", "flex", "align-items", "center", "gap", "8px"], [1, "fa-solid", "fa-network-wired", 2, "color", "var(--mj-brand-primary)"], [1, "ps-muted", "ps-small"], [1, "ps-badge", "gray", "ps-small"], [2, "display", "flex", "align-items", "center", "gap", "6px"], ["type", "button", 1, "ps-card-collapse-btn", 3, "click", "title"], [1, "fa-solid"], [1, "ps-card-body"], [1, "ps-card", "run-card"], [1, "ps-card-head"], [1, "fa-solid", "fa-clock-rotate-left", 2, "color", "var(--mj-status-info)"], [1, "ps-card-body", "run-card-body"], ["text", "Loading runs...", "size", "small"], [1, "ps-small", "ps-muted"], [1, "runs-table"], [3, "Close", "Visible", "modelId", "modelLabel", "engine", "provider", "currentUser"], [1, "ps-kpi"], [1, "label"], [1, "val"], ["type", "button", "aria-label", "Expand models list", "title", "Expand list", 1, "prod-rail-collapse", 3, "click"], [1, "fa-solid", "fa-chevron-right"], [1, "prod-collapsed-strip-label"], ["data-testid", "ps-production-list", 1, "ps-card", "mlist"], [2, "display", "flex", "gap", "6px", "align-items", "center"], [1, "ps-badge", "gray"], ["type", "button", "title", "Collapse list", "aria-label", "Collapse list", 1, "prod-collapse-btn", 3, "click"], [1, "fa-solid", "fa-chevron-left"], [1, "ps-card-body", 2, "padding", "8px"], ["data-testid", "ps-production-row", 1, "mrow", 3, "sel"], ["data-testid", "ps-production-row", 1, "mrow", 3, "click"], [1, "ico"], [2, "flex", "1", "min-width", "0"], [1, "nm"], [1, "ln2", "ps-muted", "ps-small"], [1, "meta"], [1, "ps-badge"], [1, "ps-mono", "ps-small", "ps-muted"], [1, "big-ico"], ["data-testid", "ps-production-detail-name"], [1, "ps-tag", "ps-mono"], [1, "ps-muted", "ps-small", "sub"], ["mjButton", "", "variant", "primary", "size", "sm", "data-testid", "ps-production-operate", 3, "click", "disabled", "title"], [1, "fa-solid", "fa-rocket"], ["type", "button", "title", "Collapse model header", "aria-label", "Collapse model header", 1, "ps-card-collapse-btn", 3, "click"], [1, "fa-solid", "fa-chevron-up"], [1, "ps-card-body", "dh-compact", 3, "click"], [1, "mini-ico"], [1, "compact-info"], [1, "ps-tag", "ps-mono", "ps-small"], ["mjButton", "", "variant", "primary", "size", "sm", "data-testid", "ps-production-operate-compact", 3, "click", "disabled"], ["type", "button", "title", "Expand model header", "aria-label", "Expand model header", 1, "ps-card-collapse-btn", 3, "click"], [1, "fa-solid", "fa-chevron-down"], ["data-testid", "ps-production-needs-training", 1, "ps-callout", "warn"], [1, "ps-callout", "info"], [1, "fa-solid", "fa-triangle-exclamation"], [1, "ps-small"], [1, "fa-solid", "fa-circle-info"], [1, "ps-section-title"], [1, "bind-row"], [1, "fa-solid", "fa-arrow-right-to-bracket", "ps-muted"], [2, "flex", "1"], [1, "ps-divider"], [1, "ps-row", 2, "justify-content", "space-between"], ["type", "button", 1, "ps-focus-toggle-btn", 3, "click", "title"], [1, "run-drill-nav"], ["data-testid", "ps-production-run-back", 1, "run-back", 3, "click"], [1, "fa-solid", "fa-arrow-left"], ["data-testid", "ps-production-run-grid", 3, "modelId", "runId", "entityName", "problemType", "title", "height"], ["data-testid", "ps-production-run", 1, "run-row"], ["data-testid", "ps-production-run", 1, "run-row", 3, "click"], [1, "ps-mono"], [1, "ps-muted"], [1, "run-right"], [1, "ps-tag", "amber"], [1, "fa-solid", "fa-chevron-right", "ps-muted"]], template: function PSProductionComponent_Template(rf, ctx) { if (rf & 1) {
1072
1090
  i0.ɵɵelementStart(0, "div", 0);
1073
1091
  i0.ɵɵconditionalCreate(1, PSProductionComponent_Conditional_1_Template, 7, 0, "div", 1)(2, PSProductionComponent_Conditional_2_Template, 38, 39);
1074
1092
  i0.ɵɵelementEnd();
1075
1093
  } if (rf & 2) {
1076
1094
  i0.ɵɵadvance();
1077
1095
  i0.ɵɵconditional(ctx.models.length === 0 ? 1 : 2);
1078
- } }, dependencies: [CommonModule, AngularSplitModule, i1.SplitComponent, i1.SplitAreaComponent, SharedGenericModule, i2.LoadingComponent, MJButtonDirective, PSOperateDialogComponent, PSPredictionsGridComponent, i3.DatePipe], styles: ["/* ============================================================================\n Predictive Studio \u2014 shared panel styles (design-token compliant)\n Maps the mockup design system onto MemberJunction semantic --mj-* tokens.\n Loaded by every PS panel component (styleUrls) under ViewEncapsulation.None,\n so the class names are global within the PS dashboard subtree.\n No hardcoded colors except the intentional categorical node/algorithm palette\n (declared once as --ps-* custom props below) which must stay distinct across\n light/dark to remain readable as diagram accents.\n ============================================================================ */\n\n/* Categorical accents for DAG node types + algorithm chips. These are\n data-visualization colors that must remain distinct regardless of theme\n (allowed exception #3 in the design-token rules). */\n.ps-panel {\n --ps-node-source: #6b7280;\n --ps-node-feature: #2050c8;\n --ps-node-embedding: #7b3ff0;\n --ps-node-target: #1f9d57;\n --ps-node-algorithm: #d98213;\n /* budget-gauge categorical accents (reuse the node palette so light/dark stay distinct) */\n --ps-gauge-cost: var(--ps-node-algorithm);\n --ps-gauge-iterations: var(--ps-node-feature);\n}\n\n.ps-panel {\n display: block;\n height: 100%;\n}\n\n/* ---- generic layout helpers ---- */\n.ps-row { display: flex; gap: 16px; }\n.ps-col { display: flex; flex-direction: column; gap: 16px; }\n.ps-wrap { flex-wrap: wrap; }\n.ps-spacer { flex: 1; }\n.ps-muted { color: var(--mj-text-muted); }\n.ps-small { font-size: 12.5px; }\n.ps-mono { font-family: ui-monospace, 'SF Mono', Menlo, Consolas, monospace; font-size: 12.5px; }\n.ps-section-title {\n font-size: 12px; text-transform: uppercase; letter-spacing: .06em;\n color: var(--mj-text-muted); margin: 4px 0 2px; font-weight: 700;\n}\n\n/* ---- cards ---- */\n.ps-card {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n overflow: hidden;\n}\n.ps-card-head {\n display: flex; align-items: center; gap: 10px;\n padding: 14px 16px; border-bottom: 1px solid var(--mj-border-subtle);\n}\n.ps-card-head h3 { font-size: 14.5px; margin: 0; font-weight: 650; color: var(--mj-text-primary); }\n.ps-card-body { padding: 16px; }\n\n/* ---- KPI tiles ---- */\n.ps-kpi {\n background: var(--mj-bg-surface); border: 1px solid var(--mj-border-default);\n border-radius: 8px; padding: 16px 18px;\n}\n.ps-kpi .label { font-size: 12px; color: var(--mj-text-muted); font-weight: 600; }\n.ps-kpi .val { font-size: 26px; font-weight: 720; letter-spacing: -.02em; margin-top: 2px; color: var(--mj-text-primary); }\n\n/* ---- badges ---- */\n.ps-badge {\n display: inline-flex; align-items: center; gap: 5px;\n padding: 2px 9px; border-radius: 999px; font-size: 11.5px; font-weight: 650; line-height: 1.7;\n}\n.ps-badge.gray { background: var(--mj-bg-surface-sunken); color: var(--mj-text-secondary); }\n.ps-badge.blue { background: var(--mj-status-info-bg); color: var(--mj-status-info-text); }\n.ps-badge.green { background: var(--mj-status-success-bg); color: var(--mj-status-success-text); }\n.ps-badge.amber { background: var(--mj-status-warning-bg); color: var(--mj-status-warning-text); }\n.ps-badge.red { background: var(--mj-status-error-bg); color: var(--mj-status-error-text); }\n.ps-dot { width: 7px; height: 7px; border-radius: 50%; display: inline-block; }\n\n/* recommendation-level chips (the ranking matrix payoff) */\n.ps-lvl {\n display: inline-flex; align-items: center; justify-content: center;\n min-width: 92px; padding: 4px 10px; border-radius: 7px;\n font-weight: 650; font-size: 11.5px; color: var(--mj-text-inverse);\n}\n.ps-lvl-Primary { background: var(--mj-status-success); }\n.ps-lvl-Strong { background: var(--mj-status-info); }\n.ps-lvl-Viable { background: var(--mj-status-warning); }\n.ps-lvl-Weak { background: var(--mj-text-disabled); }\n.ps-lvl-NotRecommended { background: var(--mj-bg-surface-sunken); color: var(--mj-text-muted); }\n\n/* ---- tags ---- */\n.ps-tag {\n display: inline-block; padding: 2px 8px; border-radius: 6px;\n background: var(--mj-bg-surface-sunken); color: var(--mj-text-secondary);\n font-size: 11.5px; font-weight: 600;\n}\n.ps-tag.muted { opacity: .6; }\n.ps-divider { height: 1px; background: var(--mj-border-subtle); margin: 8px 0; }\n\n/* ---- tables ---- */\n.ps-table { width: 100%; border-collapse: collapse; font-size: 13px; }\n.ps-table th {\n text-align: left; font-size: 11.5px; text-transform: uppercase; letter-spacing: .04em;\n color: var(--mj-text-muted); font-weight: 700; padding: 9px 12px;\n border-bottom: 1px solid var(--mj-border-default);\n}\n.ps-table td { padding: 11px 12px; border-bottom: 1px solid var(--mj-border-subtle); color: var(--mj-text-primary); }\n.ps-table tr:hover td { background: var(--mj-bg-surface-hover); }\n.ps-table .num { text-align: right; font-variant-numeric: tabular-nums; }\n\n.ps-rank {\n width: 22px; height: 22px; border-radius: 6px; background: var(--mj-bg-surface-sunken);\n display: inline-grid; place-items: center; font-weight: 700; font-size: 11.5px; color: var(--mj-text-secondary);\n}\n.ps-rank.gold { background: var(--mj-status-warning-bg); color: var(--mj-status-warning-text); }\n\n/* ---- progress bars ---- */\n.ps-bar { height: 8px; border-radius: 999px; background: var(--mj-bg-surface-sunken); overflow: hidden; }\n.ps-bar > span { display: block; height: 100%; border-radius: 999px; background: var(--mj-brand-primary); }\n.ps-bar.warn > span { background: var(--mj-status-warning); }\n.ps-bar.run > span { background: var(--mj-brand-primary); }\n\n.ps-fbar { display: grid; grid-template-columns: minmax(150px, 1.3fr) 2fr 56px; align-items: center; gap: 14px; padding: 8px 0; }\n.ps-fbar + .ps-fbar { border-top: 1px solid var(--mj-border-subtle); }\n.ps-fbar .track { height: 10px; border-radius: var(--mj-radius-full); background: var(--mj-bg-surface-sunken); overflow: hidden; }\n.ps-fbar .track > span { display: block; height: 100%; border-radius: var(--mj-radius-full); background: var(--mj-brand-primary); }\n.ps-fbar .track > span.warn { background: var(--mj-status-warning); }\n.ps-fbar .name { color: var(--mj-text-primary); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n.ps-fbar > .ps-mono { text-align: right; color: var(--mj-text-secondary); font-variant-numeric: tabular-nums; }\n\n/* gauge */\n.ps-gauge {\n position: relative; width: 64px; height: 64px; border-radius: 50%; flex: 0 0 auto;\n background: conic-gradient(var(--ps-gauge-color, var(--mj-brand-primary)) calc(var(--ps-p, 40) * 1%), var(--mj-bg-surface-sunken) 0);\n display: grid; place-items: center;\n}\n.ps-gauge::after { content: ''; position: absolute; inset: 9px; background: var(--mj-bg-surface); border-radius: 50%; }\n.ps-gauge .g-val { position: relative; font-weight: 720; font-size: 14px; color: var(--mj-text-primary); }\n\n/* warning / info callouts */\n.ps-callout { display: flex; gap: 11px; padding: 12px 14px; border-radius: 10px; border: 1px solid; }\n.ps-callout.warn { background: var(--mj-status-warning-bg); border-color: var(--mj-status-warning-border); color: var(--mj-status-warning-text); }\n.ps-callout.info { background: var(--mj-status-info-bg); border-color: var(--mj-status-info-border); color: var(--mj-status-info-text); }\n.ps-callout.success { background: var(--mj-status-success-bg); border-color: var(--mj-status-success-border); color: var(--mj-status-success-text); }\n.ps-callout i { font-size: 16px; margin-top: 1px; }\n\n/* lifecycle stepper */\n.ps-stepper { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; }\n.ps-step { display: flex; align-items: center; gap: 6px; font-size: 12px; font-weight: 600; color: var(--mj-text-muted); }\n.ps-step .pip {\n width: 22px; height: 22px; border-radius: 50%; border: 2px solid var(--mj-border-strong);\n display: grid; place-items: center; font-size: 11px;\n}\n.ps-step.done { color: var(--mj-status-success-text); }\n.ps-step.done .pip { background: var(--mj-status-success); border-color: var(--mj-status-success); color: var(--mj-text-inverse); }\n.ps-step.curr { color: var(--mj-brand-primary); }\n.ps-step.curr .pip { border-color: var(--mj-brand-primary); color: var(--mj-brand-primary); }\n.ps-step .ln { width: 26px; height: 2px; background: var(--mj-border-strong); }\n\n/* ---- DAG flow canvas ---- */\n.ps-flow {\n position: relative;\n background:\n linear-gradient(var(--mj-border-subtle) 1px, transparent 1px) 0 0 / 22px 22px,\n linear-gradient(90deg, var(--mj-border-subtle) 1px, transparent 1px) 0 0 / 22px 22px,\n var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default); border-radius: 10px;\n min-height: 620px; overflow: hidden;\n}\n.ps-node {\n position: absolute; width: 190px; background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-strong); border-left-width: 3px; border-radius: 8px;\n cursor: pointer;\n}\n.ps-node .nh {\n display: flex; align-items: center; gap: 8px; padding: 9px 11px;\n border-bottom: 1px solid var(--mj-border-subtle); font-weight: 650; font-size: 12.5px; color: var(--mj-text-primary);\n}\n.ps-node .nh i.tile {\n width: 24px; height: 24px; border-radius: 6px; display: grid; place-items: center;\n color: var(--mj-text-inverse); font-size: 12px; flex: 0 0 auto;\n}\n.ps-node .nh .ps-tag { margin-left: auto; }\n.ps-node .nb { padding: 9px 11px; font-size: 12px; color: var(--mj-text-secondary); }\n.ps-node .nb-row { display: flex; justify-content: space-between; gap: 8px; padding: 2px 0; }\n.ps-node .nb-row .k { color: var(--mj-text-muted); }\n.ps-node.src { border-left-color: var(--ps-node-source); }\n.ps-node.src .nh i.tile { background: var(--ps-node-source); }\n.ps-node.feat { border-left-color: var(--ps-node-feature); }\n.ps-node.feat .nh i.tile { background: var(--ps-node-feature); }\n.ps-node.emb { border-left-color: var(--ps-node-embedding); }\n.ps-node.emb .nh i.tile { background: var(--ps-node-embedding); }\n.ps-node.target { border-left-color: var(--ps-node-target); }\n.ps-node.target .nh i.tile { background: var(--ps-node-target); }\n.ps-node.algo { border-left-color: var(--ps-node-algorithm); }\n.ps-node.algo .nh i.tile { background: var(--ps-node-algorithm); }\n.ps-node.output { border-left-color: var(--mj-status-success); }\n.ps-node.output .nh i.tile { background: var(--mj-status-success); }\n.ps-node.selected {\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 18%, transparent);\n}\n.ps-node .port {\n position: absolute; width: 11px; height: 11px; border-radius: 50%;\n background: var(--mj-bg-surface); border: 2px solid var(--mj-brand-primary);\n top: 50%; transform: translateY(-50%);\n}\n.ps-node .port.in { left: -6px; }\n.ps-node .port.out { right: -6px; }\nsvg.ps-edges { position: absolute; inset: 0; width: 100%; height: 100%; pointer-events: none; }\nsvg.ps-edges path { stroke: color-mix(in srgb, var(--mj-brand-primary) 45%, transparent); stroke-width: 2; fill: none; }\n\n/* palette chips */\n.ps-pchip {\n display: inline-flex; align-items: center; gap: 7px; padding: 6px 11px; border-radius: 8px;\n border: 1px dashed var(--mj-border-strong); background: var(--mj-bg-surface);\n font-size: 12.5px; font-weight: 600; color: var(--mj-text-secondary); cursor: grab;\n}\n.ps-pchip i { font-size: 12px; color: var(--mj-text-inverse); width: 20px; height: 20px; border-radius: 5px; display: grid; place-items: center; }\n.ps-pchip.s i { background: var(--ps-node-source); }\n.ps-pchip.f i { background: var(--ps-node-feature); }\n.ps-pchip.e i { background: var(--ps-node-embedding); }\n.ps-pchip.t i { background: var(--ps-node-target); }\n.ps-pchip.a i { background: var(--ps-node-algorithm); }\n\n/* segmented control */\n.ps-seg { display: inline-flex; border: 1px solid var(--mj-border-default); border-radius: 8px; overflow: hidden; }\n.ps-seg button {\n border: none; background: var(--mj-bg-surface); color: var(--mj-text-secondary);\n padding: 6px 12px; font-size: 12.5px; font-weight: 600; cursor: pointer;\n border-right: 1px solid var(--mj-border-default);\n}\n.ps-seg button:last-child { border-right: none; }\n.ps-seg button.on { background: var(--mj-brand-primary); color: var(--mj-text-inverse); }\n\n/* field control */\n.ps-field { margin-bottom: 14px; }\n.ps-field > label {\n display: block; font-size: 11px; text-transform: uppercase; letter-spacing: .04em;\n color: var(--mj-text-muted); font-weight: 700; margin-bottom: 6px;\n}\n.ps-input {\n width: 100%; padding: 8px 10px; border: 1px solid var(--mj-border-default);\n border-radius: 6px; font-size: 13px; background: var(--mj-bg-surface); color: var(--mj-text-primary);\n box-sizing: border-box;\n}\n.ps-input:focus { outline: none; border-color: var(--mj-brand-primary); box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 12%, transparent); }\n\n/* loading container */\n.ps-loading { display: flex; align-items: center; justify-content: center; padding: 60px 0; }\n\n/* ---- empty / prompt states ---- */\n.ps-empty {\n display: flex; flex-direction: column; align-items: center; justify-content: center;\n text-align: center; gap: 10px; padding: 56px 24px; color: var(--mj-text-muted);\n}\n.ps-empty .ps-empty-ico {\n width: 60px; height: 60px; border-radius: 16px; display: grid; place-items: center;\n background: var(--mj-bg-surface-sunken); color: var(--mj-text-disabled); font-size: 24px;\n}\n.ps-empty h3 { margin: 4px 0 0; font-size: 16px; font-weight: 650; color: var(--mj-text-secondary); }\n.ps-empty p { margin: 0; max-width: 420px; font-size: 13px; line-height: 1.5; }\n\n/* ---- confirm modal ---- */\n.ps-modal-backdrop {\n position: fixed; inset: 0; z-index: 1000;\n background: var(--mj-bg-overlay);\n display: flex; align-items: center; justify-content: center; padding: 24px;\n}\n.ps-modal {\n width: 100%; max-width: 480px; background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default); border-radius: 14px;\n box-shadow: var(--mj-shadow-lg, var(--mj-shadow-sm)); overflow: hidden;\n}\n.ps-modal-head {\n display: flex; align-items: center; gap: 12px; padding: 18px 20px;\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n.ps-modal-head .ico {\n width: 38px; height: 38px; border-radius: 10px; display: grid; place-items: center;\n font-size: 16px; flex: 0 0 auto;\n background: var(--mj-status-info-bg); color: var(--mj-status-info-text);\n}\n.ps-modal-head.warn .ico { background: var(--mj-status-warning-bg); color: var(--mj-status-warning-text); }\n.ps-modal-head.danger .ico { background: var(--mj-status-error-bg); color: var(--mj-status-error-text); }\n.ps-modal-head h3 { margin: 0; font-size: 15.5px; font-weight: 650; color: var(--mj-text-primary); }\n.ps-modal-body { padding: 18px 20px; font-size: 13.5px; line-height: 1.55; color: var(--mj-text-secondary); }\n.ps-modal-body .ps-field { margin-top: 14px; margin-bottom: 0; }\n.ps-modal-foot {\n display: flex; align-items: center; gap: 10px; padding: 14px 20px;\n border-top: 1px solid var(--mj-border-subtle); background: var(--mj-bg-surface-card);\n}\n.ps-modal-foot .ps-spacer { flex: 1; }\n", "/* Models in Production \u2014 model-centric control tower (master/detail). All colors via --mj-* tokens. */\n\n.ps-production {\n display: flex;\n flex-direction: column;\n height: 100%;\n min-height: 0;\n width: 100%;\n overflow: hidden;\n gap: 16px;\n padding: 4px;\n}\n\n.prod-kpis {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));\n gap: 14px;\n flex: 0 0 auto;\n}\n\n.prod-layout {\n display: flex;\n flex-direction: row;\n flex: 1;\n min-height: 0;\n height: 100%;\n overflow: hidden;\n position: relative;\n background: var(--mj-bg-page);\n border-radius: var(--mj-radius-lg);\n border: 1px solid var(--mj-border-default);\n}\n\n.prod-splitter {\n width: 100%;\n height: 100%;\n background: var(--mj-bg-page);\n}\n\n.prod-collapsed-strip {\n width: 44px;\n flex: 0 0 44px;\n background: var(--mj-bg-surface);\n border-right: 1px solid var(--mj-border-default);\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 12px;\n padding: 10px 0;\n z-index: 10;\n}\n\n.prod-rail-collapse {\n background: transparent;\n border: 1px solid var(--mj-border-default);\n color: var(--mj-text-secondary);\n border-radius: var(--mj-radius-sm);\n width: 28px;\n height: 28px;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.prod-rail-collapse:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n border-color: var(--mj-brand-primary);\n}\n\n.prod-collapsed-strip-label {\n color: var(--mj-text-muted);\n font-size: 16px;\n margin-top: 8px;\n}\n\n.prod-collapse-btn {\n background: transparent;\n border: 1px solid transparent;\n color: var(--mj-text-muted);\n border-radius: var(--mj-radius-sm);\n width: 26px;\n height: 26px;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.prod-collapse-btn:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n border-color: var(--mj-border-default);\n}\n\n/* master list \u2014 own scroll column */\n.prod-layout .mlist {\n min-height: 0;\n overflow-y: auto;\n align-self: stretch;\n height: 100%;\n border-radius: 0;\n border: none;\n border-right: 1px solid var(--mj-border-default);\n}\n\n.prod-layout .mlist .mrow {\n display: flex;\n align-items: center;\n gap: 11px;\n padding: 10px 10px;\n border-radius: 9px;\n cursor: pointer;\n}\n.prod-layout .mlist .mrow:hover { background: var(--mj-bg-surface-hover); }\n.prod-layout .mlist .mrow.sel { background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface)); }\n.prod-layout .mlist .mrow .ico {\n width: 34px; height: 34px; border-radius: 9px; display: grid; place-items: center;\n color: var(--mj-text-inverse); font-size: 13px; flex: 0 0 auto;\n}\n.prod-layout .mlist .mrow .nm { font-weight: 640; font-size: 14px; color: var(--mj-text-primary); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n.prod-layout .mlist .mrow .ln2 { margin-top: 2px; }\n.prod-layout .mlist .mrow .meta { display: flex; flex-direction: column; align-items: flex-end; gap: 3px; flex: 0 0 auto; }\n\n/* deploy-state icon colors (master + detail) */\n.st-bound { background: var(--mj-status-success); }\n.st-scheduled { background: var(--mj-status-info); }\n.st-idle { background: var(--mj-text-disabled); }\n\n/* detail \u2014 own scroll column */\n.prod-layout .detail {\n min-height: 0;\n overflow-y: auto;\n align-self: stretch;\n height: 100%;\n padding: 14px;\n display: flex;\n flex-direction: column;\n gap: 14px;\n}\n.prod-layout .detail .dh { display: flex; align-items: center; gap: 13px; }\n.prod-layout .detail .dh h2 { margin: 0; font-size: 17px; font-weight: 680; color: var(--mj-text-primary); }\n.prod-layout .detail .dh .sub { margin-top: 3px; }\n.prod-layout .detail .big-ico {\n width: 40px; height: 40px; border-radius: 11px; display: grid; place-items: center;\n color: var(--mj-text-inverse); font-size: 16px; flex: 0 0 auto;\n}\n\n/* binding rows */\n.bind-row { display: flex; align-items: center; gap: 10px; padding: 8px 0; border-bottom: 1px solid var(--mj-border-subtle); }\n.bind-row:last-child { border-bottom: none; }\n\n/* run history table */\n.runs-table { width: 100%; border-collapse: collapse; font-size: 13px; }\n.runs-table th {\n text-align: left; font-size: 11px; text-transform: uppercase; letter-spacing: .04em;\n color: var(--mj-text-muted); font-weight: 700; padding: 6px 8px; border-bottom: 1px solid var(--mj-border-default);\n}\n.runs-table td { padding: 7px 8px; border-bottom: 1px solid var(--mj-border-subtle); color: var(--mj-text-secondary); }\n.runs-table tr:last-child td { border-bottom: none; }\n.runs-table tr.run-row { cursor: pointer; }\n.runs-table tr.run-row:hover td { background: var(--mj-bg-surface-hover); }\n.runs-table .run-right { text-align: right; white-space: nowrap; }\n.runs-table .run-right i { margin-left: 8px; opacity: .5; }\n\n.run-back {\n display: inline-flex; align-items: center; gap: 6px; cursor: pointer;\n background: none; border: none; color: var(--mj-text-link); font-size: 13px; padding: 0 0 10px;\n}\n\n/* collapsible cards and focus mode */\n.prod-header-card.collapsed {\n padding: 0;\n overflow: visible;\n}\n\n.dh-compact {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 6px 14px;\n min-height: 40px;\n box-sizing: border-box;\n cursor: pointer;\n transition: background-color 0.15s ease;\n}\n\n.dh-compact:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.dh-compact .mini-ico {\n width: 24px;\n height: 24px;\n border-radius: 6px;\n display: grid;\n place-items: center;\n color: var(--mj-text-inverse);\n font-size: 11px;\n flex: 0 0 auto;\n}\n\n.dh-compact .compact-info {\n display: flex;\n align-items: center;\n gap: 8px;\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: 13px;\n line-height: 1.4;\n}\n\n.dh-compact .compact-info strong {\n color: var(--mj-text-primary);\n font-size: 13px;\n font-weight: 600;\n}\n\n.prod-deployment-card.collapsed {\n background: var(--mj-bg-surface-card);\n}\n\n.prod-deployment-card.collapsed .ps-card-head {\n min-height: 40px;\n padding: 6px 14px;\n box-sizing: border-box;\n}\n\n.prod-deployment-card .ps-card-head.clickable {\n cursor: pointer;\n user-select: none;\n transition: background-color 0.15s ease;\n}\n\n.prod-deployment-card .ps-card-head.clickable:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.prod-layout .detail.focused-run {\n gap: 8px;\n}\n\n.run-card.focus-fill {\n flex: 1;\n display: flex;\n flex-direction: column;\n min-height: 0;\n}\n\n.run-card.focus-fill .run-card-body {\n flex: 1;\n display: flex;\n flex-direction: column;\n min-height: 0;\n}\n\n.ps-card-collapse-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n border-radius: var(--mj-radius-sm, 6px);\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n color: var(--mj-text-muted);\n cursor: pointer;\n transition: all 0.15s ease;\n padding: 0;\n flex: 0 0 auto;\n}\n\n.ps-card-collapse-btn:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n border-color: var(--mj-border-strong);\n}\n\n.ps-focus-toggle-btn {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 10px;\n border-radius: var(--mj-radius-sm, 6px);\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 12px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.ps-focus-toggle-btn:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n border-color: var(--mj-border-strong);\n}\n\n.ps-focus-toggle-btn.active {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, transparent);\n color: var(--mj-brand-primary);\n border-color: var(--mj-brand-primary);\n font-weight: 600;\n}\n\n.run-drill-nav {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 12px;\n}\n\n/* empty state CTA spacing (shared .ps-empty) */\n.ps-production .ps-empty p { max-width: 520px; }\n\n"], encapsulation: 2 });
1096
+ } }, dependencies: [CommonModule, AngularSplitModule, i1.SplitComponent, i1.SplitAreaComponent, SharedGenericModule, i2.LoadingComponent, MJButtonDirective, PSOperateDialogComponent, PSPredictionsGridComponent, i3.DatePipe], styles: ["/* ============================================================================\n Predictive Studio \u2014 shared panel styles (design-token compliant)\n Maps the mockup design system onto MemberJunction semantic --mj-* tokens.\n Loaded by every PS panel component (styleUrls) under ViewEncapsulation.None,\n so the class names are global within the PS dashboard subtree.\n No hardcoded colors except the intentional categorical node/algorithm palette\n (declared once as --ps-* custom props below) which must stay distinct across\n light/dark to remain readable as diagram accents.\n ============================================================================ */\n\n/* Categorical accents for DAG node types + algorithm chips. These are\n data-visualization colors that must remain distinct regardless of theme\n (allowed exception #3 in the design-token rules). */\n.ps-panel {\n --ps-node-source: #6b7280;\n --ps-node-feature: #2050c8;\n --ps-node-embedding: #7b3ff0;\n --ps-node-target: #1f9d57;\n --ps-node-algorithm: #d98213;\n /* budget-gauge categorical accents (reuse the node palette so light/dark stay distinct) */\n --ps-gauge-cost: var(--ps-node-algorithm);\n --ps-gauge-iterations: var(--ps-node-feature);\n}\n\n.ps-panel {\n display: block;\n height: 100%;\n}\n\n/* ---- generic layout helpers ---- */\n.ps-row { display: flex; gap: 16px; }\n.ps-col { display: flex; flex-direction: column; gap: 16px; }\n.ps-wrap { flex-wrap: wrap; }\n.ps-spacer { flex: 1; }\n.ps-muted { color: var(--mj-text-muted); }\n.ps-small { font-size: 12.5px; }\n.ps-mono { font-family: ui-monospace, 'SF Mono', Menlo, Consolas, monospace; font-size: 12.5px; }\n.ps-section-title {\n font-size: 12px; text-transform: uppercase; letter-spacing: .06em;\n color: var(--mj-text-muted); margin: 4px 0 2px; font-weight: 700;\n}\n\n/* ---- cards ---- */\n.ps-card {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n overflow: hidden;\n}\n.ps-card-head {\n display: flex; align-items: center; gap: 10px;\n padding: 14px 16px; border-bottom: 1px solid var(--mj-border-subtle);\n}\n.ps-card-head h3 { font-size: 14.5px; margin: 0; font-weight: 650; color: var(--mj-text-primary); }\n.ps-card-body { padding: 16px; }\n\n/* ---- KPI tiles ---- */\n.ps-kpi {\n background: var(--mj-bg-surface); border: 1px solid var(--mj-border-default);\n border-radius: 8px; padding: 16px 18px;\n}\n.ps-kpi .label { font-size: 12px; color: var(--mj-text-muted); font-weight: 600; }\n.ps-kpi .val { font-size: 26px; font-weight: 720; letter-spacing: -.02em; margin-top: 2px; color: var(--mj-text-primary); }\n\n/* ---- badges ---- */\n.ps-badge {\n display: inline-flex; align-items: center; gap: 5px;\n padding: 2px 9px; border-radius: 999px; font-size: 11.5px; font-weight: 650; line-height: 1.7;\n}\n.ps-badge.gray { background: var(--mj-bg-surface-sunken); color: var(--mj-text-secondary); }\n.ps-badge.blue { background: var(--mj-status-info-bg); color: var(--mj-status-info-text); }\n.ps-badge.green { background: var(--mj-status-success-bg); color: var(--mj-status-success-text); }\n.ps-badge.amber { background: var(--mj-status-warning-bg); color: var(--mj-status-warning-text); }\n.ps-badge.red { background: var(--mj-status-error-bg); color: var(--mj-status-error-text); }\n.ps-dot { width: 7px; height: 7px; border-radius: 50%; display: inline-block; }\n\n/* recommendation-level chips (the ranking matrix payoff) */\n.ps-lvl {\n display: inline-flex; align-items: center; justify-content: center;\n min-width: 92px; padding: 4px 10px; border-radius: 7px;\n font-weight: 650; font-size: 11.5px; color: var(--mj-text-inverse);\n}\n.ps-lvl-Primary { background: var(--mj-status-success); }\n.ps-lvl-Strong { background: var(--mj-status-info); }\n.ps-lvl-Viable { background: var(--mj-status-warning); }\n.ps-lvl-Weak { background: var(--mj-text-disabled); }\n.ps-lvl-NotRecommended { background: var(--mj-bg-surface-sunken); color: var(--mj-text-muted); }\n\n/* ---- tags ---- */\n.ps-tag {\n display: inline-block; padding: 2px 8px; border-radius: 6px;\n background: var(--mj-bg-surface-sunken); color: var(--mj-text-secondary);\n font-size: 11.5px; font-weight: 600;\n}\n.ps-tag.muted { opacity: .6; }\n.ps-divider { height: 1px; background: var(--mj-border-subtle); margin: 8px 0; }\n\n/* ---- tables ---- */\n.ps-table { width: 100%; border-collapse: collapse; font-size: 13px; }\n.ps-table th {\n text-align: left; font-size: 11.5px; text-transform: uppercase; letter-spacing: .04em;\n color: var(--mj-text-muted); font-weight: 700; padding: 9px 12px;\n border-bottom: 1px solid var(--mj-border-default);\n}\n.ps-table td { padding: 11px 12px; border-bottom: 1px solid var(--mj-border-subtle); color: var(--mj-text-primary); }\n.ps-table tr:hover td { background: var(--mj-bg-surface-hover); }\n.ps-table .num { text-align: right; font-variant-numeric: tabular-nums; }\n\n.ps-rank {\n width: 22px; height: 22px; border-radius: 6px; background: var(--mj-bg-surface-sunken);\n display: inline-grid; place-items: center; font-weight: 700; font-size: 11.5px; color: var(--mj-text-secondary);\n}\n.ps-rank.gold { background: var(--mj-status-warning-bg); color: var(--mj-status-warning-text); }\n\n/* ---- progress bars ---- */\n.ps-bar { height: 8px; border-radius: 999px; background: var(--mj-bg-surface-sunken); overflow: hidden; }\n.ps-bar > span { display: block; height: 100%; border-radius: 999px; background: var(--mj-brand-primary); }\n.ps-bar.warn > span { background: var(--mj-status-warning); }\n.ps-bar.run > span { background: var(--mj-brand-primary); }\n\n.ps-fbar { display: grid; grid-template-columns: minmax(150px, 1.3fr) 2fr 56px; align-items: center; gap: 14px; padding: 8px 0; }\n.ps-fbar + .ps-fbar { border-top: 1px solid var(--mj-border-subtle); }\n.ps-fbar .track { height: 10px; border-radius: var(--mj-radius-full); background: var(--mj-bg-surface-sunken); overflow: hidden; }\n.ps-fbar .track > span { display: block; height: 100%; border-radius: var(--mj-radius-full); background: var(--mj-brand-primary); }\n.ps-fbar .track > span.warn { background: var(--mj-status-warning); }\n.ps-fbar .name { color: var(--mj-text-primary); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n.ps-fbar > .ps-mono { text-align: right; color: var(--mj-text-secondary); font-variant-numeric: tabular-nums; }\n\n/* gauge */\n.ps-gauge {\n position: relative; width: 64px; height: 64px; border-radius: 50%; flex: 0 0 auto;\n background: conic-gradient(var(--ps-gauge-color, var(--mj-brand-primary)) calc(var(--ps-p, 40) * 1%), var(--mj-bg-surface-sunken) 0);\n display: grid; place-items: center;\n}\n.ps-gauge::after { content: ''; position: absolute; inset: 9px; background: var(--mj-bg-surface); border-radius: 50%; }\n.ps-gauge .g-val { position: relative; font-weight: 720; font-size: 14px; color: var(--mj-text-primary); }\n\n/* warning / info callouts */\n.ps-callout { display: flex; gap: 11px; padding: 12px 14px; border-radius: 10px; border: 1px solid; }\n.ps-callout.warn { background: var(--mj-status-warning-bg); border-color: var(--mj-status-warning-border); color: var(--mj-status-warning-text); }\n.ps-callout.info { background: var(--mj-status-info-bg); border-color: var(--mj-status-info-border); color: var(--mj-status-info-text); }\n.ps-callout.success { background: var(--mj-status-success-bg); border-color: var(--mj-status-success-border); color: var(--mj-status-success-text); }\n.ps-callout i { font-size: 16px; margin-top: 1px; }\n\n/* lifecycle stepper */\n.ps-stepper { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; }\n.ps-step { display: flex; align-items: center; gap: 6px; font-size: 12px; font-weight: 600; color: var(--mj-text-muted); }\n.ps-step .pip {\n width: 22px; height: 22px; border-radius: 50%; border: 2px solid var(--mj-border-strong);\n display: grid; place-items: center; font-size: 11px;\n}\n.ps-step.done { color: var(--mj-status-success-text); }\n.ps-step.done .pip { background: var(--mj-status-success); border-color: var(--mj-status-success); color: var(--mj-text-inverse); }\n.ps-step.curr { color: var(--mj-brand-primary); }\n.ps-step.curr .pip { border-color: var(--mj-brand-primary); color: var(--mj-brand-primary); }\n.ps-step .ln { width: 26px; height: 2px; background: var(--mj-border-strong); }\n\n/* ---- DAG flow canvas ---- */\n.ps-flow {\n position: relative;\n background:\n linear-gradient(var(--mj-border-subtle) 1px, transparent 1px) 0 0 / 22px 22px,\n linear-gradient(90deg, var(--mj-border-subtle) 1px, transparent 1px) 0 0 / 22px 22px,\n var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default); border-radius: 10px;\n min-height: 620px; overflow: hidden;\n}\n.ps-node {\n position: absolute; width: 190px; background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-strong); border-left-width: 3px; border-radius: 8px;\n cursor: pointer;\n}\n.ps-node .nh {\n display: flex; align-items: center; gap: 8px; padding: 9px 11px;\n border-bottom: 1px solid var(--mj-border-subtle); font-weight: 650; font-size: 12.5px; color: var(--mj-text-primary);\n}\n.ps-node .nh i.tile {\n width: 24px; height: 24px; border-radius: 6px; display: grid; place-items: center;\n color: var(--mj-text-inverse); font-size: 12px; flex: 0 0 auto;\n}\n.ps-node .nh .ps-tag { margin-left: auto; }\n.ps-node .nb { padding: 9px 11px; font-size: 12px; color: var(--mj-text-secondary); }\n.ps-node .nb-row { display: flex; justify-content: space-between; gap: 8px; padding: 2px 0; }\n.ps-node .nb-row .k { color: var(--mj-text-muted); }\n.ps-node.src { border-left-color: var(--ps-node-source); }\n.ps-node.src .nh i.tile { background: var(--ps-node-source); }\n.ps-node.feat { border-left-color: var(--ps-node-feature); }\n.ps-node.feat .nh i.tile { background: var(--ps-node-feature); }\n.ps-node.emb { border-left-color: var(--ps-node-embedding); }\n.ps-node.emb .nh i.tile { background: var(--ps-node-embedding); }\n.ps-node.target { border-left-color: var(--ps-node-target); }\n.ps-node.target .nh i.tile { background: var(--ps-node-target); }\n.ps-node.algo { border-left-color: var(--ps-node-algorithm); }\n.ps-node.algo .nh i.tile { background: var(--ps-node-algorithm); }\n.ps-node.output { border-left-color: var(--mj-status-success); }\n.ps-node.output .nh i.tile { background: var(--mj-status-success); }\n.ps-node.selected {\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 18%, transparent);\n}\n.ps-node .port {\n position: absolute; width: 11px; height: 11px; border-radius: 50%;\n background: var(--mj-bg-surface); border: 2px solid var(--mj-brand-primary);\n top: 50%; transform: translateY(-50%);\n}\n.ps-node .port.in { left: -6px; }\n.ps-node .port.out { right: -6px; }\nsvg.ps-edges { position: absolute; inset: 0; width: 100%; height: 100%; pointer-events: none; }\nsvg.ps-edges path { stroke: color-mix(in srgb, var(--mj-brand-primary) 45%, transparent); stroke-width: 2; fill: none; }\n\n/* palette chips */\n.ps-pchip {\n display: inline-flex; align-items: center; gap: 7px; padding: 6px 11px; border-radius: 8px;\n border: 1px dashed var(--mj-border-strong); background: var(--mj-bg-surface);\n font-size: 12.5px; font-weight: 600; color: var(--mj-text-secondary); cursor: grab;\n}\n.ps-pchip i { font-size: 12px; color: var(--mj-text-inverse); width: 20px; height: 20px; border-radius: 5px; display: grid; place-items: center; }\n.ps-pchip.s i { background: var(--ps-node-source); }\n.ps-pchip.f i { background: var(--ps-node-feature); }\n.ps-pchip.e i { background: var(--ps-node-embedding); }\n.ps-pchip.t i { background: var(--ps-node-target); }\n.ps-pchip.a i { background: var(--ps-node-algorithm); }\n\n/* segmented control */\n.ps-seg { display: inline-flex; border: 1px solid var(--mj-border-default); border-radius: 8px; overflow: hidden; }\n.ps-seg button {\n border: none; background: var(--mj-bg-surface); color: var(--mj-text-secondary);\n padding: 6px 12px; font-size: 12.5px; font-weight: 600; cursor: pointer;\n border-right: 1px solid var(--mj-border-default);\n}\n.ps-seg button:last-child { border-right: none; }\n.ps-seg button.on { background: var(--mj-brand-primary); color: var(--mj-text-inverse); }\n\n/* field control */\n.ps-field { margin-bottom: 14px; }\n.ps-field > label {\n display: block; font-size: 11px; text-transform: uppercase; letter-spacing: .04em;\n color: var(--mj-text-muted); font-weight: 700; margin-bottom: 6px;\n}\n.ps-input {\n width: 100%; padding: 8px 10px; border: 1px solid var(--mj-border-default);\n border-radius: 6px; font-size: 13px; background: var(--mj-bg-surface); color: var(--mj-text-primary);\n box-sizing: border-box;\n}\n.ps-input:focus { outline: none; border-color: var(--mj-brand-primary); box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 12%, transparent); }\n\n/* loading container */\n.ps-loading { display: flex; align-items: center; justify-content: center; padding: 60px 0; }\n\n/* ---- empty / prompt states ---- */\n.ps-empty {\n display: flex; flex-direction: column; align-items: center; justify-content: center;\n text-align: center; gap: 10px; padding: 56px 24px; color: var(--mj-text-muted);\n}\n.ps-empty .ps-empty-ico {\n width: 60px; height: 60px; border-radius: 16px; display: grid; place-items: center;\n background: var(--mj-bg-surface-sunken); color: var(--mj-text-disabled); font-size: 24px;\n}\n.ps-empty h3 { margin: 4px 0 0; font-size: 16px; font-weight: 650; color: var(--mj-text-secondary); }\n.ps-empty p { margin: 0; max-width: 420px; font-size: 13px; line-height: 1.5; }\n\n/* ---- confirm modal ---- */\n.ps-modal-backdrop {\n position: fixed; inset: 0; z-index: 1000;\n background: var(--mj-bg-overlay);\n display: flex; align-items: center; justify-content: center; padding: 24px;\n}\n.ps-modal {\n width: 100%; max-width: 480px; background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default); border-radius: 14px;\n box-shadow: var(--mj-shadow-lg, var(--mj-shadow-sm)); overflow: hidden;\n}\n.ps-modal-head {\n display: flex; align-items: center; gap: 12px; padding: 18px 20px;\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n.ps-modal-head .ico {\n width: 38px; height: 38px; border-radius: 10px; display: grid; place-items: center;\n font-size: 16px; flex: 0 0 auto;\n background: var(--mj-status-info-bg); color: var(--mj-status-info-text);\n}\n.ps-modal-head.warn .ico { background: var(--mj-status-warning-bg); color: var(--mj-status-warning-text); }\n.ps-modal-head.danger .ico { background: var(--mj-status-error-bg); color: var(--mj-status-error-text); }\n.ps-modal-head h3 { margin: 0; font-size: 15.5px; font-weight: 650; color: var(--mj-text-primary); }\n.ps-modal-body { padding: 18px 20px; font-size: 13.5px; line-height: 1.55; color: var(--mj-text-secondary); }\n.ps-modal-body .ps-field { margin-top: 14px; margin-bottom: 0; }\n.ps-modal-foot {\n display: flex; align-items: center; gap: 10px; padding: 14px 20px;\n border-top: 1px solid var(--mj-border-subtle); background: var(--mj-bg-surface-card);\n}\n.ps-modal-foot .ps-spacer { flex: 1; }\n", "/* Models in Production \u2014 model-centric control tower (master/detail). All colors via --mj-* tokens. */\n\n.ps-production {\n display: flex;\n flex-direction: column;\n height: 100%;\n min-height: 0;\n width: 100%;\n overflow: hidden;\n gap: 16px;\n padding: 4px;\n}\n\n.prod-kpis {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));\n gap: 14px;\n flex: 0 0 auto;\n}\n\n.prod-layout {\n display: flex;\n flex-direction: row;\n flex: 1;\n min-height: 0;\n height: 100%;\n overflow: hidden;\n position: relative;\n background: var(--mj-bg-page);\n border-radius: var(--mj-radius-lg);\n border: 1px solid var(--mj-border-default);\n}\n\n.prod-splitter {\n width: 100%;\n height: 100%;\n background: var(--mj-bg-page);\n}\n\n.prod-collapsed-strip {\n width: 44px;\n flex: 0 0 44px;\n background: var(--mj-bg-surface);\n border-right: 1px solid var(--mj-border-default);\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 12px;\n padding: 10px 0;\n z-index: 10;\n}\n\n.prod-rail-collapse {\n background: transparent;\n border: 1px solid var(--mj-border-default);\n color: var(--mj-text-secondary);\n border-radius: var(--mj-radius-sm);\n width: 28px;\n height: 28px;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.prod-rail-collapse:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n border-color: var(--mj-brand-primary);\n}\n\n.prod-collapsed-strip-label {\n color: var(--mj-text-muted);\n font-size: 16px;\n margin-top: 8px;\n}\n\n.prod-collapse-btn {\n background: transparent;\n border: 1px solid transparent;\n color: var(--mj-text-muted);\n border-radius: var(--mj-radius-sm);\n width: 26px;\n height: 26px;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.prod-collapse-btn:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n border-color: var(--mj-border-default);\n}\n\n/* master list \u2014 own scroll column */\n.prod-layout .mlist {\n min-height: 0;\n overflow-y: auto;\n align-self: stretch;\n height: 100%;\n border-radius: 0;\n border: none;\n border-right: 1px solid var(--mj-border-default);\n}\n\n.prod-layout .mlist .mrow {\n display: flex;\n align-items: center;\n gap: 11px;\n padding: 10px 10px;\n border-radius: 9px;\n cursor: pointer;\n}\n.prod-layout .mlist .mrow:hover { background: var(--mj-bg-surface-hover); }\n.prod-layout .mlist .mrow.sel { background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface)); }\n.prod-layout .mlist .mrow .ico {\n width: 34px; height: 34px; border-radius: 9px; display: grid; place-items: center;\n color: var(--mj-text-inverse); font-size: 13px; flex: 0 0 auto;\n}\n.prod-layout .mlist .mrow .nm { font-weight: 640; font-size: 14px; color: var(--mj-text-primary); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n.prod-layout .mlist .mrow .ln2 { margin-top: 2px; }\n.prod-layout .mlist .mrow .meta { display: flex; flex-direction: column; align-items: flex-end; gap: 3px; flex: 0 0 auto; }\n\n/* deploy-state icon colors (master + detail) */\n.st-needs-training { background: var(--mj-status-warning); }\n.st-bound { background: var(--mj-status-success); }\n.st-scheduled { background: var(--mj-status-info); }\n.st-idle { background: var(--mj-text-disabled); }\n\n/* detail \u2014 own scroll column */\n.prod-layout .detail {\n min-height: 0;\n overflow-y: auto;\n align-self: stretch;\n height: 100%;\n padding: 14px;\n display: flex;\n flex-direction: column;\n gap: 14px;\n}\n.prod-layout .detail .dh { display: flex; align-items: center; gap: 13px; }\n.prod-layout .detail .dh h2 { margin: 0; font-size: 17px; font-weight: 680; color: var(--mj-text-primary); }\n.prod-layout .detail .dh .sub { margin-top: 3px; }\n.prod-layout .detail .big-ico {\n width: 40px; height: 40px; border-radius: 11px; display: grid; place-items: center;\n color: var(--mj-text-inverse); font-size: 16px; flex: 0 0 auto;\n}\n\n/* binding rows */\n.bind-row { display: flex; align-items: center; gap: 10px; padding: 8px 0; border-bottom: 1px solid var(--mj-border-subtle); }\n.bind-row:last-child { border-bottom: none; }\n\n/* run history table */\n.runs-table { width: 100%; border-collapse: collapse; font-size: 13px; }\n.runs-table th {\n text-align: left; font-size: 11px; text-transform: uppercase; letter-spacing: .04em;\n color: var(--mj-text-muted); font-weight: 700; padding: 6px 8px; border-bottom: 1px solid var(--mj-border-default);\n}\n.runs-table td { padding: 7px 8px; border-bottom: 1px solid var(--mj-border-subtle); color: var(--mj-text-secondary); }\n.runs-table tr:last-child td { border-bottom: none; }\n.runs-table tr.run-row { cursor: pointer; }\n.runs-table tr.run-row:hover td { background: var(--mj-bg-surface-hover); }\n.runs-table .run-right { text-align: right; white-space: nowrap; }\n.runs-table .run-right i { margin-left: 8px; opacity: .5; }\n\n.run-back {\n display: inline-flex; align-items: center; gap: 6px; cursor: pointer;\n background: none; border: none; color: var(--mj-text-link); font-size: 13px; padding: 0 0 10px;\n}\n\n/* collapsible cards and focus mode */\n.prod-header-card.collapsed {\n padding: 0;\n overflow: visible;\n}\n\n.dh-compact {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 6px 14px;\n min-height: 40px;\n box-sizing: border-box;\n cursor: pointer;\n transition: background-color 0.15s ease;\n}\n\n.dh-compact:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.dh-compact .mini-ico {\n width: 24px;\n height: 24px;\n border-radius: 6px;\n display: grid;\n place-items: center;\n color: var(--mj-text-inverse);\n font-size: 11px;\n flex: 0 0 auto;\n}\n\n.dh-compact .compact-info {\n display: flex;\n align-items: center;\n gap: 8px;\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: 13px;\n line-height: 1.4;\n}\n\n.dh-compact .compact-info strong {\n color: var(--mj-text-primary);\n font-size: 13px;\n font-weight: 600;\n}\n\n.prod-deployment-card.collapsed {\n background: var(--mj-bg-surface-card);\n}\n\n.prod-deployment-card.collapsed .ps-card-head {\n min-height: 40px;\n padding: 6px 14px;\n box-sizing: border-box;\n}\n\n.prod-deployment-card .ps-card-head.clickable {\n cursor: pointer;\n user-select: none;\n transition: background-color 0.15s ease;\n}\n\n.prod-deployment-card .ps-card-head.clickable:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.prod-layout .detail.focused-run {\n gap: 8px;\n}\n\n.run-card.focus-fill {\n flex: 1;\n display: flex;\n flex-direction: column;\n min-height: 0;\n}\n\n.run-card.focus-fill .run-card-body {\n flex: 1;\n display: flex;\n flex-direction: column;\n min-height: 0;\n}\n\n.ps-card-collapse-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n border-radius: var(--mj-radius-sm, 6px);\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n color: var(--mj-text-muted);\n cursor: pointer;\n transition: all 0.15s ease;\n padding: 0;\n flex: 0 0 auto;\n}\n\n.ps-card-collapse-btn:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n border-color: var(--mj-border-strong);\n}\n\n.ps-focus-toggle-btn {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 10px;\n border-radius: var(--mj-radius-sm, 6px);\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 12px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.ps-focus-toggle-btn:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n border-color: var(--mj-border-strong);\n}\n\n.ps-focus-toggle-btn.active {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, transparent);\n color: var(--mj-brand-primary);\n border-color: var(--mj-brand-primary);\n font-weight: 600;\n}\n\n.run-drill-nav {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 12px;\n}\n\n/* empty state CTA spacing (shared .ps-empty) */\n.ps-production .ps-empty p { max-width: 520px; }\n\n"], encapsulation: 2 });
1079
1097
  }
1080
1098
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(PSProductionComponent, [{
1081
1099
  type: Component,
@@ -1157,7 +1175,7 @@ export class PSProductionComponent extends BaseAngularComponent {
1157
1175
  <div class="ps-muted ps-small sub">{{ selected.algorithm }} · {{ selected.problemType }} · holdout {{ selected.holdoutMetric }}</div>
1158
1176
  </div>
1159
1177
  <span class="ps-badge" [class]="deployBadge(selected.deployState)">{{ deployLabel(selected.deployState) }}</span>
1160
- <button mjButton variant="primary" size="sm" data-testid="ps-production-operate" (click)="operateOpen = true">
1178
+ <button mjButton variant="primary" size="sm" data-testid="ps-production-operate" [disabled]="selected.deployState === 'needs-training'" [title]="selected.deployState === 'needs-training' ? 'Train this model before operating it' : 'Operate this model'" (click)="operateOpen = true">
1161
1179
  <i class="fa-solid fa-rocket"></i> Operate
1162
1180
  </button>
1163
1181
  <button class="ps-card-collapse-btn" type="button" (click)="toggleHeaderCollapse()" title="Collapse model header" aria-label="Collapse model header">
@@ -1173,7 +1191,7 @@ export class PSProductionComponent extends BaseAngularComponent {
1173
1191
  <span class="ps-muted ps-small">· {{ selected.algorithm }}</span>
1174
1192
  </div>
1175
1193
  <span class="ps-badge" [class]="deployBadge(selected.deployState)">{{ deployLabel(selected.deployState) }}</span>
1176
- <button mjButton variant="primary" size="sm" data-testid="ps-production-operate-compact" (click)="$event.stopPropagation(); operateOpen = true">
1194
+ <button mjButton variant="primary" size="sm" data-testid="ps-production-operate-compact" [disabled]="selected.deployState === 'needs-training'" (click)="$event.stopPropagation(); operateOpen = true">
1177
1195
  <i class="fa-solid fa-rocket"></i> Operate
1178
1196
  </button>
1179
1197
  <button class="ps-card-collapse-btn" type="button" (click)="$event.stopPropagation(); toggleHeaderCollapse()" title="Expand model header" aria-label="Expand model header">
@@ -1202,7 +1220,12 @@ export class PSProductionComponent extends BaseAngularComponent {
1202
1220
  </div>
1203
1221
  @if (!isDeploymentCollapsed) {
1204
1222
  <div class="ps-card-body">
1205
- @if (selected.deployState === 'idle') {
1223
+ @if (selected.deployState === 'needs-training') {
1224
+ <div class="ps-callout warn" data-testid="ps-production-needs-training">
1225
+ <i class="fa-solid fa-triangle-exclamation"></i>
1226
+ <div class="ps-small">This model <strong>needs training</strong> — it has no trained model artifact on this server, so it can't score anything yet. Train its pipeline (Pipelines → Train), then publish the new model; scoring processes that opt in to auto-train do this on their next run.</div>
1227
+ </div>
1228
+ } @else if (selected.deployState === 'idle') {
1206
1229
  <div class="ps-callout info">
1207
1230
  <i class="fa-solid fa-circle-info"></i>
1208
1231
  <div class="ps-small">This model is published but <strong>not operating</strong> yet — nothing scores with it. Click <strong>Operate</strong> above to run it now, schedule it to run regularly, or write predictions back to a column.</div>
@@ -1305,9 +1328,9 @@ export class PSProductionComponent extends BaseAngularComponent {
1305
1328
  </ps-operate-dialog>
1306
1329
  }
1307
1330
  </div>
1308
- `, styles: ["/* ============================================================================\n Predictive Studio \u2014 shared panel styles (design-token compliant)\n Maps the mockup design system onto MemberJunction semantic --mj-* tokens.\n Loaded by every PS panel component (styleUrls) under ViewEncapsulation.None,\n so the class names are global within the PS dashboard subtree.\n No hardcoded colors except the intentional categorical node/algorithm palette\n (declared once as --ps-* custom props below) which must stay distinct across\n light/dark to remain readable as diagram accents.\n ============================================================================ */\n\n/* Categorical accents for DAG node types + algorithm chips. These are\n data-visualization colors that must remain distinct regardless of theme\n (allowed exception #3 in the design-token rules). */\n.ps-panel {\n --ps-node-source: #6b7280;\n --ps-node-feature: #2050c8;\n --ps-node-embedding: #7b3ff0;\n --ps-node-target: #1f9d57;\n --ps-node-algorithm: #d98213;\n /* budget-gauge categorical accents (reuse the node palette so light/dark stay distinct) */\n --ps-gauge-cost: var(--ps-node-algorithm);\n --ps-gauge-iterations: var(--ps-node-feature);\n}\n\n.ps-panel {\n display: block;\n height: 100%;\n}\n\n/* ---- generic layout helpers ---- */\n.ps-row { display: flex; gap: 16px; }\n.ps-col { display: flex; flex-direction: column; gap: 16px; }\n.ps-wrap { flex-wrap: wrap; }\n.ps-spacer { flex: 1; }\n.ps-muted { color: var(--mj-text-muted); }\n.ps-small { font-size: 12.5px; }\n.ps-mono { font-family: ui-monospace, 'SF Mono', Menlo, Consolas, monospace; font-size: 12.5px; }\n.ps-section-title {\n font-size: 12px; text-transform: uppercase; letter-spacing: .06em;\n color: var(--mj-text-muted); margin: 4px 0 2px; font-weight: 700;\n}\n\n/* ---- cards ---- */\n.ps-card {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n overflow: hidden;\n}\n.ps-card-head {\n display: flex; align-items: center; gap: 10px;\n padding: 14px 16px; border-bottom: 1px solid var(--mj-border-subtle);\n}\n.ps-card-head h3 { font-size: 14.5px; margin: 0; font-weight: 650; color: var(--mj-text-primary); }\n.ps-card-body { padding: 16px; }\n\n/* ---- KPI tiles ---- */\n.ps-kpi {\n background: var(--mj-bg-surface); border: 1px solid var(--mj-border-default);\n border-radius: 8px; padding: 16px 18px;\n}\n.ps-kpi .label { font-size: 12px; color: var(--mj-text-muted); font-weight: 600; }\n.ps-kpi .val { font-size: 26px; font-weight: 720; letter-spacing: -.02em; margin-top: 2px; color: var(--mj-text-primary); }\n\n/* ---- badges ---- */\n.ps-badge {\n display: inline-flex; align-items: center; gap: 5px;\n padding: 2px 9px; border-radius: 999px; font-size: 11.5px; font-weight: 650; line-height: 1.7;\n}\n.ps-badge.gray { background: var(--mj-bg-surface-sunken); color: var(--mj-text-secondary); }\n.ps-badge.blue { background: var(--mj-status-info-bg); color: var(--mj-status-info-text); }\n.ps-badge.green { background: var(--mj-status-success-bg); color: var(--mj-status-success-text); }\n.ps-badge.amber { background: var(--mj-status-warning-bg); color: var(--mj-status-warning-text); }\n.ps-badge.red { background: var(--mj-status-error-bg); color: var(--mj-status-error-text); }\n.ps-dot { width: 7px; height: 7px; border-radius: 50%; display: inline-block; }\n\n/* recommendation-level chips (the ranking matrix payoff) */\n.ps-lvl {\n display: inline-flex; align-items: center; justify-content: center;\n min-width: 92px; padding: 4px 10px; border-radius: 7px;\n font-weight: 650; font-size: 11.5px; color: var(--mj-text-inverse);\n}\n.ps-lvl-Primary { background: var(--mj-status-success); }\n.ps-lvl-Strong { background: var(--mj-status-info); }\n.ps-lvl-Viable { background: var(--mj-status-warning); }\n.ps-lvl-Weak { background: var(--mj-text-disabled); }\n.ps-lvl-NotRecommended { background: var(--mj-bg-surface-sunken); color: var(--mj-text-muted); }\n\n/* ---- tags ---- */\n.ps-tag {\n display: inline-block; padding: 2px 8px; border-radius: 6px;\n background: var(--mj-bg-surface-sunken); color: var(--mj-text-secondary);\n font-size: 11.5px; font-weight: 600;\n}\n.ps-tag.muted { opacity: .6; }\n.ps-divider { height: 1px; background: var(--mj-border-subtle); margin: 8px 0; }\n\n/* ---- tables ---- */\n.ps-table { width: 100%; border-collapse: collapse; font-size: 13px; }\n.ps-table th {\n text-align: left; font-size: 11.5px; text-transform: uppercase; letter-spacing: .04em;\n color: var(--mj-text-muted); font-weight: 700; padding: 9px 12px;\n border-bottom: 1px solid var(--mj-border-default);\n}\n.ps-table td { padding: 11px 12px; border-bottom: 1px solid var(--mj-border-subtle); color: var(--mj-text-primary); }\n.ps-table tr:hover td { background: var(--mj-bg-surface-hover); }\n.ps-table .num { text-align: right; font-variant-numeric: tabular-nums; }\n\n.ps-rank {\n width: 22px; height: 22px; border-radius: 6px; background: var(--mj-bg-surface-sunken);\n display: inline-grid; place-items: center; font-weight: 700; font-size: 11.5px; color: var(--mj-text-secondary);\n}\n.ps-rank.gold { background: var(--mj-status-warning-bg); color: var(--mj-status-warning-text); }\n\n/* ---- progress bars ---- */\n.ps-bar { height: 8px; border-radius: 999px; background: var(--mj-bg-surface-sunken); overflow: hidden; }\n.ps-bar > span { display: block; height: 100%; border-radius: 999px; background: var(--mj-brand-primary); }\n.ps-bar.warn > span { background: var(--mj-status-warning); }\n.ps-bar.run > span { background: var(--mj-brand-primary); }\n\n.ps-fbar { display: grid; grid-template-columns: minmax(150px, 1.3fr) 2fr 56px; align-items: center; gap: 14px; padding: 8px 0; }\n.ps-fbar + .ps-fbar { border-top: 1px solid var(--mj-border-subtle); }\n.ps-fbar .track { height: 10px; border-radius: var(--mj-radius-full); background: var(--mj-bg-surface-sunken); overflow: hidden; }\n.ps-fbar .track > span { display: block; height: 100%; border-radius: var(--mj-radius-full); background: var(--mj-brand-primary); }\n.ps-fbar .track > span.warn { background: var(--mj-status-warning); }\n.ps-fbar .name { color: var(--mj-text-primary); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n.ps-fbar > .ps-mono { text-align: right; color: var(--mj-text-secondary); font-variant-numeric: tabular-nums; }\n\n/* gauge */\n.ps-gauge {\n position: relative; width: 64px; height: 64px; border-radius: 50%; flex: 0 0 auto;\n background: conic-gradient(var(--ps-gauge-color, var(--mj-brand-primary)) calc(var(--ps-p, 40) * 1%), var(--mj-bg-surface-sunken) 0);\n display: grid; place-items: center;\n}\n.ps-gauge::after { content: ''; position: absolute; inset: 9px; background: var(--mj-bg-surface); border-radius: 50%; }\n.ps-gauge .g-val { position: relative; font-weight: 720; font-size: 14px; color: var(--mj-text-primary); }\n\n/* warning / info callouts */\n.ps-callout { display: flex; gap: 11px; padding: 12px 14px; border-radius: 10px; border: 1px solid; }\n.ps-callout.warn { background: var(--mj-status-warning-bg); border-color: var(--mj-status-warning-border); color: var(--mj-status-warning-text); }\n.ps-callout.info { background: var(--mj-status-info-bg); border-color: var(--mj-status-info-border); color: var(--mj-status-info-text); }\n.ps-callout.success { background: var(--mj-status-success-bg); border-color: var(--mj-status-success-border); color: var(--mj-status-success-text); }\n.ps-callout i { font-size: 16px; margin-top: 1px; }\n\n/* lifecycle stepper */\n.ps-stepper { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; }\n.ps-step { display: flex; align-items: center; gap: 6px; font-size: 12px; font-weight: 600; color: var(--mj-text-muted); }\n.ps-step .pip {\n width: 22px; height: 22px; border-radius: 50%; border: 2px solid var(--mj-border-strong);\n display: grid; place-items: center; font-size: 11px;\n}\n.ps-step.done { color: var(--mj-status-success-text); }\n.ps-step.done .pip { background: var(--mj-status-success); border-color: var(--mj-status-success); color: var(--mj-text-inverse); }\n.ps-step.curr { color: var(--mj-brand-primary); }\n.ps-step.curr .pip { border-color: var(--mj-brand-primary); color: var(--mj-brand-primary); }\n.ps-step .ln { width: 26px; height: 2px; background: var(--mj-border-strong); }\n\n/* ---- DAG flow canvas ---- */\n.ps-flow {\n position: relative;\n background:\n linear-gradient(var(--mj-border-subtle) 1px, transparent 1px) 0 0 / 22px 22px,\n linear-gradient(90deg, var(--mj-border-subtle) 1px, transparent 1px) 0 0 / 22px 22px,\n var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default); border-radius: 10px;\n min-height: 620px; overflow: hidden;\n}\n.ps-node {\n position: absolute; width: 190px; background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-strong); border-left-width: 3px; border-radius: 8px;\n cursor: pointer;\n}\n.ps-node .nh {\n display: flex; align-items: center; gap: 8px; padding: 9px 11px;\n border-bottom: 1px solid var(--mj-border-subtle); font-weight: 650; font-size: 12.5px; color: var(--mj-text-primary);\n}\n.ps-node .nh i.tile {\n width: 24px; height: 24px; border-radius: 6px; display: grid; place-items: center;\n color: var(--mj-text-inverse); font-size: 12px; flex: 0 0 auto;\n}\n.ps-node .nh .ps-tag { margin-left: auto; }\n.ps-node .nb { padding: 9px 11px; font-size: 12px; color: var(--mj-text-secondary); }\n.ps-node .nb-row { display: flex; justify-content: space-between; gap: 8px; padding: 2px 0; }\n.ps-node .nb-row .k { color: var(--mj-text-muted); }\n.ps-node.src { border-left-color: var(--ps-node-source); }\n.ps-node.src .nh i.tile { background: var(--ps-node-source); }\n.ps-node.feat { border-left-color: var(--ps-node-feature); }\n.ps-node.feat .nh i.tile { background: var(--ps-node-feature); }\n.ps-node.emb { border-left-color: var(--ps-node-embedding); }\n.ps-node.emb .nh i.tile { background: var(--ps-node-embedding); }\n.ps-node.target { border-left-color: var(--ps-node-target); }\n.ps-node.target .nh i.tile { background: var(--ps-node-target); }\n.ps-node.algo { border-left-color: var(--ps-node-algorithm); }\n.ps-node.algo .nh i.tile { background: var(--ps-node-algorithm); }\n.ps-node.output { border-left-color: var(--mj-status-success); }\n.ps-node.output .nh i.tile { background: var(--mj-status-success); }\n.ps-node.selected {\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 18%, transparent);\n}\n.ps-node .port {\n position: absolute; width: 11px; height: 11px; border-radius: 50%;\n background: var(--mj-bg-surface); border: 2px solid var(--mj-brand-primary);\n top: 50%; transform: translateY(-50%);\n}\n.ps-node .port.in { left: -6px; }\n.ps-node .port.out { right: -6px; }\nsvg.ps-edges { position: absolute; inset: 0; width: 100%; height: 100%; pointer-events: none; }\nsvg.ps-edges path { stroke: color-mix(in srgb, var(--mj-brand-primary) 45%, transparent); stroke-width: 2; fill: none; }\n\n/* palette chips */\n.ps-pchip {\n display: inline-flex; align-items: center; gap: 7px; padding: 6px 11px; border-radius: 8px;\n border: 1px dashed var(--mj-border-strong); background: var(--mj-bg-surface);\n font-size: 12.5px; font-weight: 600; color: var(--mj-text-secondary); cursor: grab;\n}\n.ps-pchip i { font-size: 12px; color: var(--mj-text-inverse); width: 20px; height: 20px; border-radius: 5px; display: grid; place-items: center; }\n.ps-pchip.s i { background: var(--ps-node-source); }\n.ps-pchip.f i { background: var(--ps-node-feature); }\n.ps-pchip.e i { background: var(--ps-node-embedding); }\n.ps-pchip.t i { background: var(--ps-node-target); }\n.ps-pchip.a i { background: var(--ps-node-algorithm); }\n\n/* segmented control */\n.ps-seg { display: inline-flex; border: 1px solid var(--mj-border-default); border-radius: 8px; overflow: hidden; }\n.ps-seg button {\n border: none; background: var(--mj-bg-surface); color: var(--mj-text-secondary);\n padding: 6px 12px; font-size: 12.5px; font-weight: 600; cursor: pointer;\n border-right: 1px solid var(--mj-border-default);\n}\n.ps-seg button:last-child { border-right: none; }\n.ps-seg button.on { background: var(--mj-brand-primary); color: var(--mj-text-inverse); }\n\n/* field control */\n.ps-field { margin-bottom: 14px; }\n.ps-field > label {\n display: block; font-size: 11px; text-transform: uppercase; letter-spacing: .04em;\n color: var(--mj-text-muted); font-weight: 700; margin-bottom: 6px;\n}\n.ps-input {\n width: 100%; padding: 8px 10px; border: 1px solid var(--mj-border-default);\n border-radius: 6px; font-size: 13px; background: var(--mj-bg-surface); color: var(--mj-text-primary);\n box-sizing: border-box;\n}\n.ps-input:focus { outline: none; border-color: var(--mj-brand-primary); box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 12%, transparent); }\n\n/* loading container */\n.ps-loading { display: flex; align-items: center; justify-content: center; padding: 60px 0; }\n\n/* ---- empty / prompt states ---- */\n.ps-empty {\n display: flex; flex-direction: column; align-items: center; justify-content: center;\n text-align: center; gap: 10px; padding: 56px 24px; color: var(--mj-text-muted);\n}\n.ps-empty .ps-empty-ico {\n width: 60px; height: 60px; border-radius: 16px; display: grid; place-items: center;\n background: var(--mj-bg-surface-sunken); color: var(--mj-text-disabled); font-size: 24px;\n}\n.ps-empty h3 { margin: 4px 0 0; font-size: 16px; font-weight: 650; color: var(--mj-text-secondary); }\n.ps-empty p { margin: 0; max-width: 420px; font-size: 13px; line-height: 1.5; }\n\n/* ---- confirm modal ---- */\n.ps-modal-backdrop {\n position: fixed; inset: 0; z-index: 1000;\n background: var(--mj-bg-overlay);\n display: flex; align-items: center; justify-content: center; padding: 24px;\n}\n.ps-modal {\n width: 100%; max-width: 480px; background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default); border-radius: 14px;\n box-shadow: var(--mj-shadow-lg, var(--mj-shadow-sm)); overflow: hidden;\n}\n.ps-modal-head {\n display: flex; align-items: center; gap: 12px; padding: 18px 20px;\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n.ps-modal-head .ico {\n width: 38px; height: 38px; border-radius: 10px; display: grid; place-items: center;\n font-size: 16px; flex: 0 0 auto;\n background: var(--mj-status-info-bg); color: var(--mj-status-info-text);\n}\n.ps-modal-head.warn .ico { background: var(--mj-status-warning-bg); color: var(--mj-status-warning-text); }\n.ps-modal-head.danger .ico { background: var(--mj-status-error-bg); color: var(--mj-status-error-text); }\n.ps-modal-head h3 { margin: 0; font-size: 15.5px; font-weight: 650; color: var(--mj-text-primary); }\n.ps-modal-body { padding: 18px 20px; font-size: 13.5px; line-height: 1.55; color: var(--mj-text-secondary); }\n.ps-modal-body .ps-field { margin-top: 14px; margin-bottom: 0; }\n.ps-modal-foot {\n display: flex; align-items: center; gap: 10px; padding: 14px 20px;\n border-top: 1px solid var(--mj-border-subtle); background: var(--mj-bg-surface-card);\n}\n.ps-modal-foot .ps-spacer { flex: 1; }\n", "/* Models in Production \u2014 model-centric control tower (master/detail). All colors via --mj-* tokens. */\n\n.ps-production {\n display: flex;\n flex-direction: column;\n height: 100%;\n min-height: 0;\n width: 100%;\n overflow: hidden;\n gap: 16px;\n padding: 4px;\n}\n\n.prod-kpis {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));\n gap: 14px;\n flex: 0 0 auto;\n}\n\n.prod-layout {\n display: flex;\n flex-direction: row;\n flex: 1;\n min-height: 0;\n height: 100%;\n overflow: hidden;\n position: relative;\n background: var(--mj-bg-page);\n border-radius: var(--mj-radius-lg);\n border: 1px solid var(--mj-border-default);\n}\n\n.prod-splitter {\n width: 100%;\n height: 100%;\n background: var(--mj-bg-page);\n}\n\n.prod-collapsed-strip {\n width: 44px;\n flex: 0 0 44px;\n background: var(--mj-bg-surface);\n border-right: 1px solid var(--mj-border-default);\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 12px;\n padding: 10px 0;\n z-index: 10;\n}\n\n.prod-rail-collapse {\n background: transparent;\n border: 1px solid var(--mj-border-default);\n color: var(--mj-text-secondary);\n border-radius: var(--mj-radius-sm);\n width: 28px;\n height: 28px;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.prod-rail-collapse:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n border-color: var(--mj-brand-primary);\n}\n\n.prod-collapsed-strip-label {\n color: var(--mj-text-muted);\n font-size: 16px;\n margin-top: 8px;\n}\n\n.prod-collapse-btn {\n background: transparent;\n border: 1px solid transparent;\n color: var(--mj-text-muted);\n border-radius: var(--mj-radius-sm);\n width: 26px;\n height: 26px;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.prod-collapse-btn:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n border-color: var(--mj-border-default);\n}\n\n/* master list \u2014 own scroll column */\n.prod-layout .mlist {\n min-height: 0;\n overflow-y: auto;\n align-self: stretch;\n height: 100%;\n border-radius: 0;\n border: none;\n border-right: 1px solid var(--mj-border-default);\n}\n\n.prod-layout .mlist .mrow {\n display: flex;\n align-items: center;\n gap: 11px;\n padding: 10px 10px;\n border-radius: 9px;\n cursor: pointer;\n}\n.prod-layout .mlist .mrow:hover { background: var(--mj-bg-surface-hover); }\n.prod-layout .mlist .mrow.sel { background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface)); }\n.prod-layout .mlist .mrow .ico {\n width: 34px; height: 34px; border-radius: 9px; display: grid; place-items: center;\n color: var(--mj-text-inverse); font-size: 13px; flex: 0 0 auto;\n}\n.prod-layout .mlist .mrow .nm { font-weight: 640; font-size: 14px; color: var(--mj-text-primary); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n.prod-layout .mlist .mrow .ln2 { margin-top: 2px; }\n.prod-layout .mlist .mrow .meta { display: flex; flex-direction: column; align-items: flex-end; gap: 3px; flex: 0 0 auto; }\n\n/* deploy-state icon colors (master + detail) */\n.st-bound { background: var(--mj-status-success); }\n.st-scheduled { background: var(--mj-status-info); }\n.st-idle { background: var(--mj-text-disabled); }\n\n/* detail \u2014 own scroll column */\n.prod-layout .detail {\n min-height: 0;\n overflow-y: auto;\n align-self: stretch;\n height: 100%;\n padding: 14px;\n display: flex;\n flex-direction: column;\n gap: 14px;\n}\n.prod-layout .detail .dh { display: flex; align-items: center; gap: 13px; }\n.prod-layout .detail .dh h2 { margin: 0; font-size: 17px; font-weight: 680; color: var(--mj-text-primary); }\n.prod-layout .detail .dh .sub { margin-top: 3px; }\n.prod-layout .detail .big-ico {\n width: 40px; height: 40px; border-radius: 11px; display: grid; place-items: center;\n color: var(--mj-text-inverse); font-size: 16px; flex: 0 0 auto;\n}\n\n/* binding rows */\n.bind-row { display: flex; align-items: center; gap: 10px; padding: 8px 0; border-bottom: 1px solid var(--mj-border-subtle); }\n.bind-row:last-child { border-bottom: none; }\n\n/* run history table */\n.runs-table { width: 100%; border-collapse: collapse; font-size: 13px; }\n.runs-table th {\n text-align: left; font-size: 11px; text-transform: uppercase; letter-spacing: .04em;\n color: var(--mj-text-muted); font-weight: 700; padding: 6px 8px; border-bottom: 1px solid var(--mj-border-default);\n}\n.runs-table td { padding: 7px 8px; border-bottom: 1px solid var(--mj-border-subtle); color: var(--mj-text-secondary); }\n.runs-table tr:last-child td { border-bottom: none; }\n.runs-table tr.run-row { cursor: pointer; }\n.runs-table tr.run-row:hover td { background: var(--mj-bg-surface-hover); }\n.runs-table .run-right { text-align: right; white-space: nowrap; }\n.runs-table .run-right i { margin-left: 8px; opacity: .5; }\n\n.run-back {\n display: inline-flex; align-items: center; gap: 6px; cursor: pointer;\n background: none; border: none; color: var(--mj-text-link); font-size: 13px; padding: 0 0 10px;\n}\n\n/* collapsible cards and focus mode */\n.prod-header-card.collapsed {\n padding: 0;\n overflow: visible;\n}\n\n.dh-compact {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 6px 14px;\n min-height: 40px;\n box-sizing: border-box;\n cursor: pointer;\n transition: background-color 0.15s ease;\n}\n\n.dh-compact:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.dh-compact .mini-ico {\n width: 24px;\n height: 24px;\n border-radius: 6px;\n display: grid;\n place-items: center;\n color: var(--mj-text-inverse);\n font-size: 11px;\n flex: 0 0 auto;\n}\n\n.dh-compact .compact-info {\n display: flex;\n align-items: center;\n gap: 8px;\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: 13px;\n line-height: 1.4;\n}\n\n.dh-compact .compact-info strong {\n color: var(--mj-text-primary);\n font-size: 13px;\n font-weight: 600;\n}\n\n.prod-deployment-card.collapsed {\n background: var(--mj-bg-surface-card);\n}\n\n.prod-deployment-card.collapsed .ps-card-head {\n min-height: 40px;\n padding: 6px 14px;\n box-sizing: border-box;\n}\n\n.prod-deployment-card .ps-card-head.clickable {\n cursor: pointer;\n user-select: none;\n transition: background-color 0.15s ease;\n}\n\n.prod-deployment-card .ps-card-head.clickable:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.prod-layout .detail.focused-run {\n gap: 8px;\n}\n\n.run-card.focus-fill {\n flex: 1;\n display: flex;\n flex-direction: column;\n min-height: 0;\n}\n\n.run-card.focus-fill .run-card-body {\n flex: 1;\n display: flex;\n flex-direction: column;\n min-height: 0;\n}\n\n.ps-card-collapse-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n border-radius: var(--mj-radius-sm, 6px);\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n color: var(--mj-text-muted);\n cursor: pointer;\n transition: all 0.15s ease;\n padding: 0;\n flex: 0 0 auto;\n}\n\n.ps-card-collapse-btn:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n border-color: var(--mj-border-strong);\n}\n\n.ps-focus-toggle-btn {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 10px;\n border-radius: var(--mj-radius-sm, 6px);\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 12px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.ps-focus-toggle-btn:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n border-color: var(--mj-border-strong);\n}\n\n.ps-focus-toggle-btn.active {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, transparent);\n color: var(--mj-brand-primary);\n border-color: var(--mj-brand-primary);\n font-weight: 600;\n}\n\n.run-drill-nav {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 12px;\n}\n\n/* empty state CTA spacing (shared .ps-empty) */\n.ps-production .ps-empty p { max-width: 520px; }\n\n"] }]
1331
+ `, styles: ["/* ============================================================================\n Predictive Studio \u2014 shared panel styles (design-token compliant)\n Maps the mockup design system onto MemberJunction semantic --mj-* tokens.\n Loaded by every PS panel component (styleUrls) under ViewEncapsulation.None,\n so the class names are global within the PS dashboard subtree.\n No hardcoded colors except the intentional categorical node/algorithm palette\n (declared once as --ps-* custom props below) which must stay distinct across\n light/dark to remain readable as diagram accents.\n ============================================================================ */\n\n/* Categorical accents for DAG node types + algorithm chips. These are\n data-visualization colors that must remain distinct regardless of theme\n (allowed exception #3 in the design-token rules). */\n.ps-panel {\n --ps-node-source: #6b7280;\n --ps-node-feature: #2050c8;\n --ps-node-embedding: #7b3ff0;\n --ps-node-target: #1f9d57;\n --ps-node-algorithm: #d98213;\n /* budget-gauge categorical accents (reuse the node palette so light/dark stay distinct) */\n --ps-gauge-cost: var(--ps-node-algorithm);\n --ps-gauge-iterations: var(--ps-node-feature);\n}\n\n.ps-panel {\n display: block;\n height: 100%;\n}\n\n/* ---- generic layout helpers ---- */\n.ps-row { display: flex; gap: 16px; }\n.ps-col { display: flex; flex-direction: column; gap: 16px; }\n.ps-wrap { flex-wrap: wrap; }\n.ps-spacer { flex: 1; }\n.ps-muted { color: var(--mj-text-muted); }\n.ps-small { font-size: 12.5px; }\n.ps-mono { font-family: ui-monospace, 'SF Mono', Menlo, Consolas, monospace; font-size: 12.5px; }\n.ps-section-title {\n font-size: 12px; text-transform: uppercase; letter-spacing: .06em;\n color: var(--mj-text-muted); margin: 4px 0 2px; font-weight: 700;\n}\n\n/* ---- cards ---- */\n.ps-card {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n overflow: hidden;\n}\n.ps-card-head {\n display: flex; align-items: center; gap: 10px;\n padding: 14px 16px; border-bottom: 1px solid var(--mj-border-subtle);\n}\n.ps-card-head h3 { font-size: 14.5px; margin: 0; font-weight: 650; color: var(--mj-text-primary); }\n.ps-card-body { padding: 16px; }\n\n/* ---- KPI tiles ---- */\n.ps-kpi {\n background: var(--mj-bg-surface); border: 1px solid var(--mj-border-default);\n border-radius: 8px; padding: 16px 18px;\n}\n.ps-kpi .label { font-size: 12px; color: var(--mj-text-muted); font-weight: 600; }\n.ps-kpi .val { font-size: 26px; font-weight: 720; letter-spacing: -.02em; margin-top: 2px; color: var(--mj-text-primary); }\n\n/* ---- badges ---- */\n.ps-badge {\n display: inline-flex; align-items: center; gap: 5px;\n padding: 2px 9px; border-radius: 999px; font-size: 11.5px; font-weight: 650; line-height: 1.7;\n}\n.ps-badge.gray { background: var(--mj-bg-surface-sunken); color: var(--mj-text-secondary); }\n.ps-badge.blue { background: var(--mj-status-info-bg); color: var(--mj-status-info-text); }\n.ps-badge.green { background: var(--mj-status-success-bg); color: var(--mj-status-success-text); }\n.ps-badge.amber { background: var(--mj-status-warning-bg); color: var(--mj-status-warning-text); }\n.ps-badge.red { background: var(--mj-status-error-bg); color: var(--mj-status-error-text); }\n.ps-dot { width: 7px; height: 7px; border-radius: 50%; display: inline-block; }\n\n/* recommendation-level chips (the ranking matrix payoff) */\n.ps-lvl {\n display: inline-flex; align-items: center; justify-content: center;\n min-width: 92px; padding: 4px 10px; border-radius: 7px;\n font-weight: 650; font-size: 11.5px; color: var(--mj-text-inverse);\n}\n.ps-lvl-Primary { background: var(--mj-status-success); }\n.ps-lvl-Strong { background: var(--mj-status-info); }\n.ps-lvl-Viable { background: var(--mj-status-warning); }\n.ps-lvl-Weak { background: var(--mj-text-disabled); }\n.ps-lvl-NotRecommended { background: var(--mj-bg-surface-sunken); color: var(--mj-text-muted); }\n\n/* ---- tags ---- */\n.ps-tag {\n display: inline-block; padding: 2px 8px; border-radius: 6px;\n background: var(--mj-bg-surface-sunken); color: var(--mj-text-secondary);\n font-size: 11.5px; font-weight: 600;\n}\n.ps-tag.muted { opacity: .6; }\n.ps-divider { height: 1px; background: var(--mj-border-subtle); margin: 8px 0; }\n\n/* ---- tables ---- */\n.ps-table { width: 100%; border-collapse: collapse; font-size: 13px; }\n.ps-table th {\n text-align: left; font-size: 11.5px; text-transform: uppercase; letter-spacing: .04em;\n color: var(--mj-text-muted); font-weight: 700; padding: 9px 12px;\n border-bottom: 1px solid var(--mj-border-default);\n}\n.ps-table td { padding: 11px 12px; border-bottom: 1px solid var(--mj-border-subtle); color: var(--mj-text-primary); }\n.ps-table tr:hover td { background: var(--mj-bg-surface-hover); }\n.ps-table .num { text-align: right; font-variant-numeric: tabular-nums; }\n\n.ps-rank {\n width: 22px; height: 22px; border-radius: 6px; background: var(--mj-bg-surface-sunken);\n display: inline-grid; place-items: center; font-weight: 700; font-size: 11.5px; color: var(--mj-text-secondary);\n}\n.ps-rank.gold { background: var(--mj-status-warning-bg); color: var(--mj-status-warning-text); }\n\n/* ---- progress bars ---- */\n.ps-bar { height: 8px; border-radius: 999px; background: var(--mj-bg-surface-sunken); overflow: hidden; }\n.ps-bar > span { display: block; height: 100%; border-radius: 999px; background: var(--mj-brand-primary); }\n.ps-bar.warn > span { background: var(--mj-status-warning); }\n.ps-bar.run > span { background: var(--mj-brand-primary); }\n\n.ps-fbar { display: grid; grid-template-columns: minmax(150px, 1.3fr) 2fr 56px; align-items: center; gap: 14px; padding: 8px 0; }\n.ps-fbar + .ps-fbar { border-top: 1px solid var(--mj-border-subtle); }\n.ps-fbar .track { height: 10px; border-radius: var(--mj-radius-full); background: var(--mj-bg-surface-sunken); overflow: hidden; }\n.ps-fbar .track > span { display: block; height: 100%; border-radius: var(--mj-radius-full); background: var(--mj-brand-primary); }\n.ps-fbar .track > span.warn { background: var(--mj-status-warning); }\n.ps-fbar .name { color: var(--mj-text-primary); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n.ps-fbar > .ps-mono { text-align: right; color: var(--mj-text-secondary); font-variant-numeric: tabular-nums; }\n\n/* gauge */\n.ps-gauge {\n position: relative; width: 64px; height: 64px; border-radius: 50%; flex: 0 0 auto;\n background: conic-gradient(var(--ps-gauge-color, var(--mj-brand-primary)) calc(var(--ps-p, 40) * 1%), var(--mj-bg-surface-sunken) 0);\n display: grid; place-items: center;\n}\n.ps-gauge::after { content: ''; position: absolute; inset: 9px; background: var(--mj-bg-surface); border-radius: 50%; }\n.ps-gauge .g-val { position: relative; font-weight: 720; font-size: 14px; color: var(--mj-text-primary); }\n\n/* warning / info callouts */\n.ps-callout { display: flex; gap: 11px; padding: 12px 14px; border-radius: 10px; border: 1px solid; }\n.ps-callout.warn { background: var(--mj-status-warning-bg); border-color: var(--mj-status-warning-border); color: var(--mj-status-warning-text); }\n.ps-callout.info { background: var(--mj-status-info-bg); border-color: var(--mj-status-info-border); color: var(--mj-status-info-text); }\n.ps-callout.success { background: var(--mj-status-success-bg); border-color: var(--mj-status-success-border); color: var(--mj-status-success-text); }\n.ps-callout i { font-size: 16px; margin-top: 1px; }\n\n/* lifecycle stepper */\n.ps-stepper { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; }\n.ps-step { display: flex; align-items: center; gap: 6px; font-size: 12px; font-weight: 600; color: var(--mj-text-muted); }\n.ps-step .pip {\n width: 22px; height: 22px; border-radius: 50%; border: 2px solid var(--mj-border-strong);\n display: grid; place-items: center; font-size: 11px;\n}\n.ps-step.done { color: var(--mj-status-success-text); }\n.ps-step.done .pip { background: var(--mj-status-success); border-color: var(--mj-status-success); color: var(--mj-text-inverse); }\n.ps-step.curr { color: var(--mj-brand-primary); }\n.ps-step.curr .pip { border-color: var(--mj-brand-primary); color: var(--mj-brand-primary); }\n.ps-step .ln { width: 26px; height: 2px; background: var(--mj-border-strong); }\n\n/* ---- DAG flow canvas ---- */\n.ps-flow {\n position: relative;\n background:\n linear-gradient(var(--mj-border-subtle) 1px, transparent 1px) 0 0 / 22px 22px,\n linear-gradient(90deg, var(--mj-border-subtle) 1px, transparent 1px) 0 0 / 22px 22px,\n var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default); border-radius: 10px;\n min-height: 620px; overflow: hidden;\n}\n.ps-node {\n position: absolute; width: 190px; background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-strong); border-left-width: 3px; border-radius: 8px;\n cursor: pointer;\n}\n.ps-node .nh {\n display: flex; align-items: center; gap: 8px; padding: 9px 11px;\n border-bottom: 1px solid var(--mj-border-subtle); font-weight: 650; font-size: 12.5px; color: var(--mj-text-primary);\n}\n.ps-node .nh i.tile {\n width: 24px; height: 24px; border-radius: 6px; display: grid; place-items: center;\n color: var(--mj-text-inverse); font-size: 12px; flex: 0 0 auto;\n}\n.ps-node .nh .ps-tag { margin-left: auto; }\n.ps-node .nb { padding: 9px 11px; font-size: 12px; color: var(--mj-text-secondary); }\n.ps-node .nb-row { display: flex; justify-content: space-between; gap: 8px; padding: 2px 0; }\n.ps-node .nb-row .k { color: var(--mj-text-muted); }\n.ps-node.src { border-left-color: var(--ps-node-source); }\n.ps-node.src .nh i.tile { background: var(--ps-node-source); }\n.ps-node.feat { border-left-color: var(--ps-node-feature); }\n.ps-node.feat .nh i.tile { background: var(--ps-node-feature); }\n.ps-node.emb { border-left-color: var(--ps-node-embedding); }\n.ps-node.emb .nh i.tile { background: var(--ps-node-embedding); }\n.ps-node.target { border-left-color: var(--ps-node-target); }\n.ps-node.target .nh i.tile { background: var(--ps-node-target); }\n.ps-node.algo { border-left-color: var(--ps-node-algorithm); }\n.ps-node.algo .nh i.tile { background: var(--ps-node-algorithm); }\n.ps-node.output { border-left-color: var(--mj-status-success); }\n.ps-node.output .nh i.tile { background: var(--mj-status-success); }\n.ps-node.selected {\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 18%, transparent);\n}\n.ps-node .port {\n position: absolute; width: 11px; height: 11px; border-radius: 50%;\n background: var(--mj-bg-surface); border: 2px solid var(--mj-brand-primary);\n top: 50%; transform: translateY(-50%);\n}\n.ps-node .port.in { left: -6px; }\n.ps-node .port.out { right: -6px; }\nsvg.ps-edges { position: absolute; inset: 0; width: 100%; height: 100%; pointer-events: none; }\nsvg.ps-edges path { stroke: color-mix(in srgb, var(--mj-brand-primary) 45%, transparent); stroke-width: 2; fill: none; }\n\n/* palette chips */\n.ps-pchip {\n display: inline-flex; align-items: center; gap: 7px; padding: 6px 11px; border-radius: 8px;\n border: 1px dashed var(--mj-border-strong); background: var(--mj-bg-surface);\n font-size: 12.5px; font-weight: 600; color: var(--mj-text-secondary); cursor: grab;\n}\n.ps-pchip i { font-size: 12px; color: var(--mj-text-inverse); width: 20px; height: 20px; border-radius: 5px; display: grid; place-items: center; }\n.ps-pchip.s i { background: var(--ps-node-source); }\n.ps-pchip.f i { background: var(--ps-node-feature); }\n.ps-pchip.e i { background: var(--ps-node-embedding); }\n.ps-pchip.t i { background: var(--ps-node-target); }\n.ps-pchip.a i { background: var(--ps-node-algorithm); }\n\n/* segmented control */\n.ps-seg { display: inline-flex; border: 1px solid var(--mj-border-default); border-radius: 8px; overflow: hidden; }\n.ps-seg button {\n border: none; background: var(--mj-bg-surface); color: var(--mj-text-secondary);\n padding: 6px 12px; font-size: 12.5px; font-weight: 600; cursor: pointer;\n border-right: 1px solid var(--mj-border-default);\n}\n.ps-seg button:last-child { border-right: none; }\n.ps-seg button.on { background: var(--mj-brand-primary); color: var(--mj-text-inverse); }\n\n/* field control */\n.ps-field { margin-bottom: 14px; }\n.ps-field > label {\n display: block; font-size: 11px; text-transform: uppercase; letter-spacing: .04em;\n color: var(--mj-text-muted); font-weight: 700; margin-bottom: 6px;\n}\n.ps-input {\n width: 100%; padding: 8px 10px; border: 1px solid var(--mj-border-default);\n border-radius: 6px; font-size: 13px; background: var(--mj-bg-surface); color: var(--mj-text-primary);\n box-sizing: border-box;\n}\n.ps-input:focus { outline: none; border-color: var(--mj-brand-primary); box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 12%, transparent); }\n\n/* loading container */\n.ps-loading { display: flex; align-items: center; justify-content: center; padding: 60px 0; }\n\n/* ---- empty / prompt states ---- */\n.ps-empty {\n display: flex; flex-direction: column; align-items: center; justify-content: center;\n text-align: center; gap: 10px; padding: 56px 24px; color: var(--mj-text-muted);\n}\n.ps-empty .ps-empty-ico {\n width: 60px; height: 60px; border-radius: 16px; display: grid; place-items: center;\n background: var(--mj-bg-surface-sunken); color: var(--mj-text-disabled); font-size: 24px;\n}\n.ps-empty h3 { margin: 4px 0 0; font-size: 16px; font-weight: 650; color: var(--mj-text-secondary); }\n.ps-empty p { margin: 0; max-width: 420px; font-size: 13px; line-height: 1.5; }\n\n/* ---- confirm modal ---- */\n.ps-modal-backdrop {\n position: fixed; inset: 0; z-index: 1000;\n background: var(--mj-bg-overlay);\n display: flex; align-items: center; justify-content: center; padding: 24px;\n}\n.ps-modal {\n width: 100%; max-width: 480px; background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default); border-radius: 14px;\n box-shadow: var(--mj-shadow-lg, var(--mj-shadow-sm)); overflow: hidden;\n}\n.ps-modal-head {\n display: flex; align-items: center; gap: 12px; padding: 18px 20px;\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n.ps-modal-head .ico {\n width: 38px; height: 38px; border-radius: 10px; display: grid; place-items: center;\n font-size: 16px; flex: 0 0 auto;\n background: var(--mj-status-info-bg); color: var(--mj-status-info-text);\n}\n.ps-modal-head.warn .ico { background: var(--mj-status-warning-bg); color: var(--mj-status-warning-text); }\n.ps-modal-head.danger .ico { background: var(--mj-status-error-bg); color: var(--mj-status-error-text); }\n.ps-modal-head h3 { margin: 0; font-size: 15.5px; font-weight: 650; color: var(--mj-text-primary); }\n.ps-modal-body { padding: 18px 20px; font-size: 13.5px; line-height: 1.55; color: var(--mj-text-secondary); }\n.ps-modal-body .ps-field { margin-top: 14px; margin-bottom: 0; }\n.ps-modal-foot {\n display: flex; align-items: center; gap: 10px; padding: 14px 20px;\n border-top: 1px solid var(--mj-border-subtle); background: var(--mj-bg-surface-card);\n}\n.ps-modal-foot .ps-spacer { flex: 1; }\n", "/* Models in Production \u2014 model-centric control tower (master/detail). All colors via --mj-* tokens. */\n\n.ps-production {\n display: flex;\n flex-direction: column;\n height: 100%;\n min-height: 0;\n width: 100%;\n overflow: hidden;\n gap: 16px;\n padding: 4px;\n}\n\n.prod-kpis {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));\n gap: 14px;\n flex: 0 0 auto;\n}\n\n.prod-layout {\n display: flex;\n flex-direction: row;\n flex: 1;\n min-height: 0;\n height: 100%;\n overflow: hidden;\n position: relative;\n background: var(--mj-bg-page);\n border-radius: var(--mj-radius-lg);\n border: 1px solid var(--mj-border-default);\n}\n\n.prod-splitter {\n width: 100%;\n height: 100%;\n background: var(--mj-bg-page);\n}\n\n.prod-collapsed-strip {\n width: 44px;\n flex: 0 0 44px;\n background: var(--mj-bg-surface);\n border-right: 1px solid var(--mj-border-default);\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 12px;\n padding: 10px 0;\n z-index: 10;\n}\n\n.prod-rail-collapse {\n background: transparent;\n border: 1px solid var(--mj-border-default);\n color: var(--mj-text-secondary);\n border-radius: var(--mj-radius-sm);\n width: 28px;\n height: 28px;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.prod-rail-collapse:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n border-color: var(--mj-brand-primary);\n}\n\n.prod-collapsed-strip-label {\n color: var(--mj-text-muted);\n font-size: 16px;\n margin-top: 8px;\n}\n\n.prod-collapse-btn {\n background: transparent;\n border: 1px solid transparent;\n color: var(--mj-text-muted);\n border-radius: var(--mj-radius-sm);\n width: 26px;\n height: 26px;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.prod-collapse-btn:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n border-color: var(--mj-border-default);\n}\n\n/* master list \u2014 own scroll column */\n.prod-layout .mlist {\n min-height: 0;\n overflow-y: auto;\n align-self: stretch;\n height: 100%;\n border-radius: 0;\n border: none;\n border-right: 1px solid var(--mj-border-default);\n}\n\n.prod-layout .mlist .mrow {\n display: flex;\n align-items: center;\n gap: 11px;\n padding: 10px 10px;\n border-radius: 9px;\n cursor: pointer;\n}\n.prod-layout .mlist .mrow:hover { background: var(--mj-bg-surface-hover); }\n.prod-layout .mlist .mrow.sel { background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface)); }\n.prod-layout .mlist .mrow .ico {\n width: 34px; height: 34px; border-radius: 9px; display: grid; place-items: center;\n color: var(--mj-text-inverse); font-size: 13px; flex: 0 0 auto;\n}\n.prod-layout .mlist .mrow .nm { font-weight: 640; font-size: 14px; color: var(--mj-text-primary); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n.prod-layout .mlist .mrow .ln2 { margin-top: 2px; }\n.prod-layout .mlist .mrow .meta { display: flex; flex-direction: column; align-items: flex-end; gap: 3px; flex: 0 0 auto; }\n\n/* deploy-state icon colors (master + detail) */\n.st-needs-training { background: var(--mj-status-warning); }\n.st-bound { background: var(--mj-status-success); }\n.st-scheduled { background: var(--mj-status-info); }\n.st-idle { background: var(--mj-text-disabled); }\n\n/* detail \u2014 own scroll column */\n.prod-layout .detail {\n min-height: 0;\n overflow-y: auto;\n align-self: stretch;\n height: 100%;\n padding: 14px;\n display: flex;\n flex-direction: column;\n gap: 14px;\n}\n.prod-layout .detail .dh { display: flex; align-items: center; gap: 13px; }\n.prod-layout .detail .dh h2 { margin: 0; font-size: 17px; font-weight: 680; color: var(--mj-text-primary); }\n.prod-layout .detail .dh .sub { margin-top: 3px; }\n.prod-layout .detail .big-ico {\n width: 40px; height: 40px; border-radius: 11px; display: grid; place-items: center;\n color: var(--mj-text-inverse); font-size: 16px; flex: 0 0 auto;\n}\n\n/* binding rows */\n.bind-row { display: flex; align-items: center; gap: 10px; padding: 8px 0; border-bottom: 1px solid var(--mj-border-subtle); }\n.bind-row:last-child { border-bottom: none; }\n\n/* run history table */\n.runs-table { width: 100%; border-collapse: collapse; font-size: 13px; }\n.runs-table th {\n text-align: left; font-size: 11px; text-transform: uppercase; letter-spacing: .04em;\n color: var(--mj-text-muted); font-weight: 700; padding: 6px 8px; border-bottom: 1px solid var(--mj-border-default);\n}\n.runs-table td { padding: 7px 8px; border-bottom: 1px solid var(--mj-border-subtle); color: var(--mj-text-secondary); }\n.runs-table tr:last-child td { border-bottom: none; }\n.runs-table tr.run-row { cursor: pointer; }\n.runs-table tr.run-row:hover td { background: var(--mj-bg-surface-hover); }\n.runs-table .run-right { text-align: right; white-space: nowrap; }\n.runs-table .run-right i { margin-left: 8px; opacity: .5; }\n\n.run-back {\n display: inline-flex; align-items: center; gap: 6px; cursor: pointer;\n background: none; border: none; color: var(--mj-text-link); font-size: 13px; padding: 0 0 10px;\n}\n\n/* collapsible cards and focus mode */\n.prod-header-card.collapsed {\n padding: 0;\n overflow: visible;\n}\n\n.dh-compact {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 6px 14px;\n min-height: 40px;\n box-sizing: border-box;\n cursor: pointer;\n transition: background-color 0.15s ease;\n}\n\n.dh-compact:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.dh-compact .mini-ico {\n width: 24px;\n height: 24px;\n border-radius: 6px;\n display: grid;\n place-items: center;\n color: var(--mj-text-inverse);\n font-size: 11px;\n flex: 0 0 auto;\n}\n\n.dh-compact .compact-info {\n display: flex;\n align-items: center;\n gap: 8px;\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: 13px;\n line-height: 1.4;\n}\n\n.dh-compact .compact-info strong {\n color: var(--mj-text-primary);\n font-size: 13px;\n font-weight: 600;\n}\n\n.prod-deployment-card.collapsed {\n background: var(--mj-bg-surface-card);\n}\n\n.prod-deployment-card.collapsed .ps-card-head {\n min-height: 40px;\n padding: 6px 14px;\n box-sizing: border-box;\n}\n\n.prod-deployment-card .ps-card-head.clickable {\n cursor: pointer;\n user-select: none;\n transition: background-color 0.15s ease;\n}\n\n.prod-deployment-card .ps-card-head.clickable:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.prod-layout .detail.focused-run {\n gap: 8px;\n}\n\n.run-card.focus-fill {\n flex: 1;\n display: flex;\n flex-direction: column;\n min-height: 0;\n}\n\n.run-card.focus-fill .run-card-body {\n flex: 1;\n display: flex;\n flex-direction: column;\n min-height: 0;\n}\n\n.ps-card-collapse-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n border-radius: var(--mj-radius-sm, 6px);\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n color: var(--mj-text-muted);\n cursor: pointer;\n transition: all 0.15s ease;\n padding: 0;\n flex: 0 0 auto;\n}\n\n.ps-card-collapse-btn:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n border-color: var(--mj-border-strong);\n}\n\n.ps-focus-toggle-btn {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 10px;\n border-radius: var(--mj-radius-sm, 6px);\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 12px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.ps-focus-toggle-btn:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n border-color: var(--mj-border-strong);\n}\n\n.ps-focus-toggle-btn.active {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, transparent);\n color: var(--mj-brand-primary);\n border-color: var(--mj-brand-primary);\n font-weight: 600;\n}\n\n.run-drill-nav {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 12px;\n}\n\n/* empty state CTA spacing (shared .ps-empty) */\n.ps-production .ps-empty p { max-width: 520px; }\n\n"] }]
1309
1332
  }], null, { engine: [{
1310
1333
  type: Input
1311
1334
  }] }); })();
1312
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(PSProductionComponent, { className: "PSProductionComponent", filePath: "src/PredictiveStudio/components/ps-production.component.ts", lineNumber: 304 }); })();
1335
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(PSProductionComponent, { className: "PSProductionComponent", filePath: "src/PredictiveStudio/components/ps-production.component.ts", lineNumber: 313 }); })();
1313
1336
  //# sourceMappingURL=ps-production.component.js.map