@memberjunction/ng-dashboards 5.22.0 → 5.24.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (245) hide show
  1. package/README.md +51 -0
  2. package/dist/AI/components/agents/agent-configuration.component.d.ts.map +1 -1
  3. package/dist/AI/components/agents/agent-configuration.component.js +364 -362
  4. package/dist/AI/components/agents/agent-configuration.component.js.map +1 -1
  5. package/dist/AI/components/agents/agent-editor.component.js +2 -2
  6. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts +947 -64
  7. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts.map +1 -1
  8. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js +7645 -430
  9. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js.map +1 -1
  10. package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts +285 -6
  11. package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts.map +1 -1
  12. package/dist/AI/components/duplicates/duplicate-detection-resource.component.js +2454 -277
  13. package/dist/AI/components/duplicates/duplicate-detection-resource.component.js.map +1 -1
  14. package/dist/AI/components/execution-monitoring.component.d.ts.map +1 -1
  15. package/dist/AI/components/execution-monitoring.component.js +191 -197
  16. package/dist/AI/components/execution-monitoring.component.js.map +1 -1
  17. package/dist/AI/components/models/model-management.component.js +9 -8
  18. package/dist/AI/components/models/model-management.component.js.map +1 -1
  19. package/dist/AI/components/prompts/prompt-management.component.js +305 -299
  20. package/dist/AI/components/prompts/prompt-management.component.js.map +1 -1
  21. package/dist/AI/components/system/system-configuration.component.js +319 -313
  22. package/dist/AI/components/system/system-configuration.component.js.map +1 -1
  23. package/dist/AI/components/vectors/vector-management-resource.component.d.ts +20 -2
  24. package/dist/AI/components/vectors/vector-management-resource.component.d.ts.map +1 -1
  25. package/dist/AI/components/vectors/vector-management-resource.component.js +419 -232
  26. package/dist/AI/components/vectors/vector-management-resource.component.js.map +1 -1
  27. package/dist/APIKeys/api-applications-panel.component.js +10 -12
  28. package/dist/APIKeys/api-applications-panel.component.js.map +1 -1
  29. package/dist/APIKeys/api-key-create-dialog.component.js +13 -19
  30. package/dist/APIKeys/api-key-create-dialog.component.js.map +1 -1
  31. package/dist/APIKeys/api-key-edit-panel.component.js +12 -14
  32. package/dist/APIKeys/api-key-edit-panel.component.js.map +1 -1
  33. package/dist/APIKeys/api-scopes-panel.component.js +61 -68
  34. package/dist/APIKeys/api-scopes-panel.component.js.map +1 -1
  35. package/dist/APIKeys/api-usage-panel.component.js +10 -11
  36. package/dist/APIKeys/api-usage-panel.component.js.map +1 -1
  37. package/dist/Actions/components/actions-list-view.component.js +82 -96
  38. package/dist/Actions/components/actions-list-view.component.js.map +1 -1
  39. package/dist/Actions/components/actions-overview.component.js +130 -134
  40. package/dist/Actions/components/actions-overview.component.js.map +1 -1
  41. package/dist/Actions/components/categories-list-view.component.d.ts.map +1 -1
  42. package/dist/Actions/components/categories-list-view.component.js +40 -46
  43. package/dist/Actions/components/categories-list-view.component.js.map +1 -1
  44. package/dist/Actions/components/code-management.component.js +2 -2
  45. package/dist/Actions/components/code-management.component.js.map +1 -1
  46. package/dist/Actions/components/entity-integration.component.js +2 -2
  47. package/dist/Actions/components/entity-integration.component.js.map +1 -1
  48. package/dist/Actions/components/execution-monitoring.component.js +127 -132
  49. package/dist/Actions/components/execution-monitoring.component.js.map +1 -1
  50. package/dist/Actions/components/executions-list-view.component.js +2 -2
  51. package/dist/Actions/components/executions-list-view.component.js.map +1 -1
  52. package/dist/Actions/components/explorer/action-card.component.js +11 -17
  53. package/dist/Actions/components/explorer/action-card.component.js.map +1 -1
  54. package/dist/Actions/components/explorer/action-explorer.component.js +5 -11
  55. package/dist/Actions/components/explorer/action-explorer.component.js.map +1 -1
  56. package/dist/Actions/components/explorer/action-list-item.component.js +8 -10
  57. package/dist/Actions/components/explorer/action-list-item.component.js.map +1 -1
  58. package/dist/Actions/components/explorer/action-toolbar.component.js +112 -133
  59. package/dist/Actions/components/explorer/action-toolbar.component.js.map +1 -1
  60. package/dist/Actions/components/explorer/action-tree-panel.component.js +63 -83
  61. package/dist/Actions/components/explorer/action-tree-panel.component.js.map +1 -1
  62. package/dist/Actions/components/explorer/new-action-panel.component.js +17 -21
  63. package/dist/Actions/components/explorer/new-action-panel.component.js.map +1 -1
  64. package/dist/Actions/components/explorer/new-category-panel.component.js +17 -21
  65. package/dist/Actions/components/explorer/new-category-panel.component.js.map +1 -1
  66. package/dist/Actions/components/scheduled-actions.component.js +2 -2
  67. package/dist/Actions/components/scheduled-actions.component.js.map +1 -1
  68. package/dist/Actions/components/security-permissions.component.js +2 -2
  69. package/dist/Actions/components/security-permissions.component.js.map +1 -1
  70. package/dist/ComponentStudio/component-studio-dashboard.component.d.ts +13 -5
  71. package/dist/ComponentStudio/component-studio-dashboard.component.d.ts.map +1 -1
  72. package/dist/ComponentStudio/component-studio-dashboard.component.js +168 -145
  73. package/dist/ComponentStudio/component-studio-dashboard.component.js.map +1 -1
  74. package/dist/ComponentStudio/components/artifact-load-dialog.component.d.ts +4 -5
  75. package/dist/ComponentStudio/components/artifact-load-dialog.component.d.ts.map +1 -1
  76. package/dist/ComponentStudio/components/artifact-load-dialog.component.js +197 -200
  77. package/dist/ComponentStudio/components/artifact-load-dialog.component.js.map +1 -1
  78. package/dist/ComponentStudio/components/artifact-selection-dialog.component.d.ts +5 -7
  79. package/dist/ComponentStudio/components/artifact-selection-dialog.component.d.ts.map +1 -1
  80. package/dist/ComponentStudio/components/artifact-selection-dialog.component.js +142 -148
  81. package/dist/ComponentStudio/components/artifact-selection-dialog.component.js.map +1 -1
  82. package/dist/ComponentStudio/components/browser/component-browser.component.js +153 -166
  83. package/dist/ComponentStudio/components/browser/component-browser.component.js.map +1 -1
  84. package/dist/ComponentStudio/components/editors/code-editor-panel.component.js +15 -20
  85. package/dist/ComponentStudio/components/editors/code-editor-panel.component.js.map +1 -1
  86. package/dist/ComponentStudio/components/editors/data-requirements-editor.component.js +16 -21
  87. package/dist/ComponentStudio/components/editors/data-requirements-editor.component.js.map +1 -1
  88. package/dist/ComponentStudio/components/editors/requirements-editor.component.js +18 -23
  89. package/dist/ComponentStudio/components/editors/requirements-editor.component.js.map +1 -1
  90. package/dist/ComponentStudio/components/editors/spec-editor.component.js +25 -30
  91. package/dist/ComponentStudio/components/editors/spec-editor.component.js.map +1 -1
  92. package/dist/ComponentStudio/components/new-component-dialog/new-component-dialog.component.js +10 -11
  93. package/dist/ComponentStudio/components/new-component-dialog/new-component-dialog.component.js.map +1 -1
  94. package/dist/ComponentStudio/components/save-version-dialog/save-version-dialog.component.d.ts.map +1 -1
  95. package/dist/ComponentStudio/components/save-version-dialog/save-version-dialog.component.js +24 -35
  96. package/dist/ComponentStudio/components/save-version-dialog/save-version-dialog.component.js.map +1 -1
  97. package/dist/ComponentStudio/components/text-import-dialog.component.js +15 -17
  98. package/dist/ComponentStudio/components/text-import-dialog.component.js.map +1 -1
  99. package/dist/Credentials/components/credentials-categories-resource.component.js +7 -6
  100. package/dist/Credentials/components/credentials-categories-resource.component.js.map +1 -1
  101. package/dist/Credentials/components/credentials-list-resource.component.js +6 -5
  102. package/dist/Credentials/components/credentials-list-resource.component.js.map +1 -1
  103. package/dist/Credentials/components/credentials-types-resource.component.js +7 -6
  104. package/dist/Credentials/components/credentials-types-resource.component.js.map +1 -1
  105. package/dist/DashboardBrowser/dashboard-share-dialog.component.js +9 -9
  106. package/dist/DashboardBrowser/dashboard-share-dialog.component.js.map +1 -1
  107. package/dist/DataExplorer/data-explorer-dashboard.component.d.ts.map +1 -1
  108. package/dist/DataExplorer/data-explorer-dashboard.component.js +17 -17
  109. package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
  110. package/dist/Home/home-dashboard.component.js +4 -4
  111. package/dist/Home/home-dashboard.component.js.map +1 -1
  112. package/dist/Integration/components/activity/activity.component.d.ts.map +1 -1
  113. package/dist/Integration/components/activity/activity.component.js +1 -0
  114. package/dist/Integration/components/activity/activity.component.js.map +1 -1
  115. package/dist/Integration/components/connections/connections.component.d.ts.map +1 -1
  116. package/dist/Integration/components/connections/connections.component.js +5 -4
  117. package/dist/Integration/components/connections/connections.component.js.map +1 -1
  118. package/dist/Integration/components/mapping-workspace/mapping-workspace.component.d.ts.map +1 -1
  119. package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js +247 -259
  120. package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js.map +1 -1
  121. package/dist/Integration/components/overview/overview.component.d.ts.map +1 -1
  122. package/dist/Integration/components/overview/overview.component.js +1 -0
  123. package/dist/Integration/components/overview/overview.component.js.map +1 -1
  124. package/dist/Integration/components/pipelines/pipelines.component.d.ts.map +1 -1
  125. package/dist/Integration/components/pipelines/pipelines.component.js +1 -0
  126. package/dist/Integration/components/pipelines/pipelines.component.js.map +1 -1
  127. package/dist/Integration/components/schedules/schedules.component.d.ts.map +1 -1
  128. package/dist/Integration/components/schedules/schedules.component.js +1 -0
  129. package/dist/Integration/components/schedules/schedules.component.js.map +1 -1
  130. package/dist/Integration/components/widgets/integration-card.component.js +7 -9
  131. package/dist/Integration/components/widgets/integration-card.component.js.map +1 -1
  132. package/dist/Integration/integration.module.d.ts +6 -10
  133. package/dist/Integration/integration.module.d.ts.map +1 -1
  134. package/dist/Integration/integration.module.js +12 -20
  135. package/dist/Integration/integration.module.js.map +1 -1
  136. package/dist/KnowledgeHub/components/analytics/analytics-resource.component.d.ts +411 -0
  137. package/dist/KnowledgeHub/components/analytics/analytics-resource.component.d.ts.map +1 -0
  138. package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js +4266 -0
  139. package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js.map +1 -0
  140. package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.d.ts +140 -0
  141. package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.d.ts.map +1 -0
  142. package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js +780 -0
  143. package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js.map +1 -0
  144. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.d.ts +8 -2
  145. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.d.ts.map +1 -1
  146. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js +246 -195
  147. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js.map +1 -1
  148. package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.d.ts +75 -0
  149. package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.d.ts.map +1 -0
  150. package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.js +601 -0
  151. package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.js.map +1 -0
  152. package/dist/KnowledgeHub/components/search/knowledge-search-resource.component.d.ts +93 -12
  153. package/dist/KnowledgeHub/components/search/knowledge-search-resource.component.d.ts.map +1 -1
  154. package/dist/KnowledgeHub/components/search/knowledge-search-resource.component.js +637 -107
  155. package/dist/KnowledgeHub/components/search/knowledge-search-resource.component.js.map +1 -1
  156. package/dist/KnowledgeHub/index.d.ts +3 -0
  157. package/dist/KnowledgeHub/index.d.ts.map +1 -1
  158. package/dist/KnowledgeHub/index.js +3 -0
  159. package/dist/KnowledgeHub/index.js.map +1 -1
  160. package/dist/Lists/components/lists-browse-resource.component.d.ts.map +1 -1
  161. package/dist/Lists/components/lists-browse-resource.component.js +9 -7
  162. package/dist/Lists/components/lists-browse-resource.component.js.map +1 -1
  163. package/dist/Lists/components/lists-my-lists-resource.component.js +5 -4
  164. package/dist/Lists/components/lists-my-lists-resource.component.js.map +1 -1
  165. package/dist/Lists/components/lists-operations-resource.component.js +10 -9
  166. package/dist/Lists/components/lists-operations-resource.component.js.map +1 -1
  167. package/dist/MCP/components/mcp-connection-dialog.component.js +141 -132
  168. package/dist/MCP/components/mcp-connection-dialog.component.js.map +1 -1
  169. package/dist/MCP/components/mcp-log-detail-panel.component.js +4 -4
  170. package/dist/MCP/components/mcp-log-detail-panel.component.js.map +1 -1
  171. package/dist/MCP/components/mcp-server-dialog.component.js +141 -128
  172. package/dist/MCP/components/mcp-server-dialog.component.js.map +1 -1
  173. package/dist/MCP/components/mcp-test-tool-dialog.component.js +210 -218
  174. package/dist/MCP/components/mcp-test-tool-dialog.component.js.map +1 -1
  175. package/dist/MCP/mcp-dashboard.component.js +2 -2
  176. package/dist/MCP/mcp-dashboard.component.js.map +1 -1
  177. package/dist/MCP/mcp.module.d.ts +6 -9
  178. package/dist/MCP/mcp.module.d.ts.map +1 -1
  179. package/dist/MCP/mcp.module.js +20 -22
  180. package/dist/MCP/mcp.module.js.map +1 -1
  181. package/dist/Scheduling/components/scheduling-activity.component.js +5 -4
  182. package/dist/Scheduling/components/scheduling-activity.component.js.map +1 -1
  183. package/dist/Scheduling/components/scheduling-jobs.component.js +6 -5
  184. package/dist/Scheduling/components/scheduling-jobs.component.js.map +1 -1
  185. package/dist/Scheduling/components/scheduling-overview.component.js +93 -92
  186. package/dist/Scheduling/components/scheduling-overview.component.js.map +1 -1
  187. package/dist/Testing/testing-dashboard.component.js +9 -10
  188. package/dist/Testing/testing-dashboard.component.js.map +1 -1
  189. package/dist/__tests__/analytics-resource.test.d.ts +2 -0
  190. package/dist/__tests__/analytics-resource.test.d.ts.map +1 -0
  191. package/dist/__tests__/analytics-resource.test.js +181 -0
  192. package/dist/__tests__/analytics-resource.test.js.map +1 -0
  193. package/dist/__tests__/scheduling.test.d.ts +2 -0
  194. package/dist/__tests__/scheduling.test.d.ts.map +1 -0
  195. package/dist/__tests__/scheduling.test.js +205 -0
  196. package/dist/__tests__/scheduling.test.js.map +1 -0
  197. package/dist/actions-dashboards.module.d.ts +8 -13
  198. package/dist/actions-dashboards.module.d.ts.map +1 -1
  199. package/dist/actions-dashboards.module.js +6 -27
  200. package/dist/actions-dashboards.module.js.map +1 -1
  201. package/dist/ai-dashboards.module.d.ts +20 -20
  202. package/dist/ai-dashboards.module.d.ts.map +1 -1
  203. package/dist/ai-dashboards.module.js +43 -44
  204. package/dist/ai-dashboards.module.js.map +1 -1
  205. package/dist/communication-dashboards.module.d.ts +4 -8
  206. package/dist/communication-dashboards.module.d.ts.map +1 -1
  207. package/dist/communication-dashboards.module.js +0 -19
  208. package/dist/communication-dashboards.module.js.map +1 -1
  209. package/dist/component-studio-dashboards.module.d.ts +7 -11
  210. package/dist/component-studio-dashboards.module.d.ts.map +1 -1
  211. package/dist/component-studio-dashboards.module.js +22 -34
  212. package/dist/component-studio-dashboards.module.js.map +1 -1
  213. package/dist/core-dashboards.module.d.ts +12 -18
  214. package/dist/core-dashboards.module.d.ts.map +1 -1
  215. package/dist/core-dashboards.module.js +15 -31
  216. package/dist/core-dashboards.module.js.map +1 -1
  217. package/dist/credentials-dashboards.module.d.ts +5 -8
  218. package/dist/credentials-dashboards.module.d.ts.map +1 -1
  219. package/dist/credentials-dashboards.module.js +3 -19
  220. package/dist/credentials-dashboards.module.js.map +1 -1
  221. package/dist/data-explorer-dashboards.module.d.ts +7 -13
  222. package/dist/data-explorer-dashboards.module.d.ts.map +1 -1
  223. package/dist/data-explorer-dashboards.module.js +0 -27
  224. package/dist/data-explorer-dashboards.module.js.map +1 -1
  225. package/dist/lists-dashboards.module.d.ts +5 -8
  226. package/dist/lists-dashboards.module.d.ts.map +1 -1
  227. package/dist/lists-dashboards.module.js +3 -19
  228. package/dist/lists-dashboards.module.js.map +1 -1
  229. package/dist/public-api.d.ts +2 -0
  230. package/dist/public-api.d.ts.map +1 -1
  231. package/dist/public-api.js +2 -0
  232. package/dist/public-api.js.map +1 -1
  233. package/dist/scheduling-dashboards.module.d.ts +6 -10
  234. package/dist/scheduling-dashboards.module.d.ts.map +1 -1
  235. package/dist/scheduling-dashboards.module.js +3 -23
  236. package/dist/scheduling-dashboards.module.js.map +1 -1
  237. package/dist/shared/entity-field-display.d.ts +44 -0
  238. package/dist/shared/entity-field-display.d.ts.map +1 -0
  239. package/dist/shared/entity-field-display.js +118 -0
  240. package/dist/shared/entity-field-display.js.map +1 -0
  241. package/dist/testing-dashboards.module.d.ts +7 -13
  242. package/dist/testing-dashboards.module.d.ts.map +1 -1
  243. package/dist/testing-dashboards.module.js +0 -27
  244. package/dist/testing-dashboards.module.js.map +1 -1
  245. package/package.json +48 -55
@@ -2,29 +2,28 @@ import { Component, Output, EventEmitter } from '@angular/core';
2
2
  import * as i0 from "@angular/core";
3
3
  import * as i1 from "../../services/component-studio-state.service";
4
4
  import * as i2 from "@angular/common";
5
- import * as i3 from "@progress/kendo-angular-buttons";
6
- import * as i4 from "@progress/kendo-angular-inputs";
7
- import * as i5 from "@memberjunction/ng-shared-generic";
5
+ import * as i3 from "@memberjunction/ng-shared-generic";
6
+ import * as i4 from "@memberjunction/ng-ui-components";
8
7
  function ComponentBrowserComponent_Conditional_11_Template(rf, ctx) { if (rf & 1) {
9
8
  const _r1 = i0.ɵɵgetCurrentView();
10
- i0.ɵɵelementStart(0, "div", 8)(1, "button", 21);
9
+ i0.ɵɵelementStart(0, "div", 9)(1, "button", 23);
11
10
  i0.ɵɵlistener("click", function ComponentBrowserComponent_Conditional_11_Template_button_click_1_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnImportFromArtifact()); });
12
- i0.ɵɵelement(2, "i", 22);
11
+ i0.ɵɵelement(2, "i", 24);
13
12
  i0.ɵɵtext(3, " From Artifact ");
14
13
  i0.ɵɵelementEnd();
15
- i0.ɵɵelementStart(4, "button", 21);
14
+ i0.ɵɵelementStart(4, "button", 23);
16
15
  i0.ɵɵlistener("click", function ComponentBrowserComponent_Conditional_11_Template_button_click_4_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnImportFromFile()); });
17
- i0.ɵɵelement(5, "i", 23);
16
+ i0.ɵɵelement(5, "i", 25);
18
17
  i0.ɵɵtext(6, " From File ");
19
18
  i0.ɵɵelementEnd();
20
- i0.ɵɵelementStart(7, "button", 21);
19
+ i0.ɵɵelementStart(7, "button", 23);
21
20
  i0.ɵɵlistener("click", function ComponentBrowserComponent_Conditional_11_Template_button_click_7_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnImportFromText()); });
22
- i0.ɵɵelement(8, "i", 24);
21
+ i0.ɵɵelement(8, "i", 26);
23
22
  i0.ɵɵtext(9, " From Text ");
24
23
  i0.ɵɵelementEnd()();
25
24
  } }
26
25
  function ComponentBrowserComponent_Conditional_15_Template(rf, ctx) { if (rf & 1) {
27
- i0.ɵɵelementStart(0, "span", 12);
26
+ i0.ɵɵelementStart(0, "span", 13);
28
27
  i0.ɵɵtext(1);
29
28
  i0.ɵɵelementEnd();
30
29
  } if (rf & 2) {
@@ -32,11 +31,8 @@ function ComponentBrowserComponent_Conditional_15_Template(rf, ctx) { if (rf & 1
32
31
  i0.ɵɵadvance();
33
32
  i0.ɵɵtextInterpolate(ctx_r1.State.GetActiveFilterCount());
34
33
  } }
35
- function ComponentBrowserComponent_ng_template_20_Template(rf, ctx) { if (rf & 1) {
36
- i0.ɵɵelement(0, "i", 25);
37
- } }
38
- function ComponentBrowserComponent_Conditional_21_Conditional_16_Template(rf, ctx) { if (rf & 1) {
39
- i0.ɵɵelementStart(0, "span", 34);
34
+ function ComponentBrowserComponent_Conditional_22_Conditional_16_Template(rf, ctx) { if (rf & 1) {
35
+ i0.ɵɵelementStart(0, "span", 35);
40
36
  i0.ɵɵtext(1);
41
37
  i0.ɵɵelementEnd();
42
38
  } if (rf & 2) {
@@ -44,14 +40,14 @@ function ComponentBrowserComponent_Conditional_21_Conditional_16_Template(rf, ct
44
40
  i0.ɵɵadvance();
45
41
  i0.ɵɵtextInterpolate1("(", ctx_r1.State.GetDeprecatedCount(), ")");
46
42
  } }
47
- function ComponentBrowserComponent_Conditional_21_Conditional_17_For_5_Template(rf, ctx) { if (rf & 1) {
43
+ function ComponentBrowserComponent_Conditional_22_Conditional_17_For_5_Template(rf, ctx) { if (rf & 1) {
48
44
  const _r4 = i0.ɵɵgetCurrentView();
49
- i0.ɵɵelementStart(0, "button", 39);
50
- i0.ɵɵlistener("click", function ComponentBrowserComponent_Conditional_21_Conditional_17_For_5_Template_button_click_0_listener() { const category_r5 = i0.ɵɵrestoreView(_r4).$implicit; const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.State.ToggleCategory(category_r5.name)); });
51
- i0.ɵɵelementStart(1, "span", 40);
45
+ i0.ɵɵelementStart(0, "button", 40);
46
+ i0.ɵɵlistener("click", function ComponentBrowserComponent_Conditional_22_Conditional_17_For_5_Template_button_click_0_listener() { const category_r5 = i0.ɵɵrestoreView(_r4).$implicit; const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.State.ToggleCategory(category_r5.name)); });
47
+ i0.ɵɵelementStart(1, "span", 41);
52
48
  i0.ɵɵtext(2);
53
49
  i0.ɵɵelementEnd();
54
- i0.ɵɵelementStart(3, "span", 41);
50
+ i0.ɵɵelementStart(3, "span", 42);
55
51
  i0.ɵɵtext(4);
56
52
  i0.ɵɵelementEnd()();
57
53
  } if (rf & 2) {
@@ -64,37 +60,37 @@ function ComponentBrowserComponent_Conditional_21_Conditional_17_For_5_Template(
64
60
  i0.ɵɵadvance(2);
65
61
  i0.ɵɵtextInterpolate(category_r5.count);
66
62
  } }
67
- function ComponentBrowserComponent_Conditional_21_Conditional_17_Conditional_6_Conditional_1_Template(rf, ctx) { if (rf & 1) {
68
- i0.ɵɵelement(0, "i", 43);
63
+ function ComponentBrowserComponent_Conditional_22_Conditional_17_Conditional_6_Conditional_1_Template(rf, ctx) { if (rf & 1) {
64
+ i0.ɵɵelement(0, "i", 44);
69
65
  i0.ɵɵtext(1, " Show less ");
70
66
  } }
71
- function ComponentBrowserComponent_Conditional_21_Conditional_17_Conditional_6_Conditional_2_Template(rf, ctx) { if (rf & 1) {
72
- i0.ɵɵelement(0, "i", 44);
67
+ function ComponentBrowserComponent_Conditional_22_Conditional_17_Conditional_6_Conditional_2_Template(rf, ctx) { if (rf & 1) {
68
+ i0.ɵɵelement(0, "i", 45);
73
69
  i0.ɵɵtext(1);
74
70
  } if (rf & 2) {
75
71
  const ctx_r1 = i0.ɵɵnextContext(4);
76
72
  i0.ɵɵadvance();
77
73
  i0.ɵɵtextInterpolate1(" Show ", ctx_r1.State.AvailableCategories.length - 5, " more ");
78
74
  } }
79
- function ComponentBrowserComponent_Conditional_21_Conditional_17_Conditional_6_Template(rf, ctx) { if (rf & 1) {
75
+ function ComponentBrowserComponent_Conditional_22_Conditional_17_Conditional_6_Template(rf, ctx) { if (rf & 1) {
80
76
  const _r6 = i0.ɵɵgetCurrentView();
81
- i0.ɵɵelementStart(0, "button", 42);
82
- i0.ɵɵlistener("click", function ComponentBrowserComponent_Conditional_21_Conditional_17_Conditional_6_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r6); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.State.ToggleShowAllCategories()); });
83
- i0.ɵɵconditionalCreate(1, ComponentBrowserComponent_Conditional_21_Conditional_17_Conditional_6_Conditional_1_Template, 2, 0)(2, ComponentBrowserComponent_Conditional_21_Conditional_17_Conditional_6_Conditional_2_Template, 2, 1);
77
+ i0.ɵɵelementStart(0, "button", 43);
78
+ i0.ɵɵlistener("click", function ComponentBrowserComponent_Conditional_22_Conditional_17_Conditional_6_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r6); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.State.ToggleShowAllCategories()); });
79
+ i0.ɵɵconditionalCreate(1, ComponentBrowserComponent_Conditional_22_Conditional_17_Conditional_6_Conditional_1_Template, 2, 0)(2, ComponentBrowserComponent_Conditional_22_Conditional_17_Conditional_6_Conditional_2_Template, 2, 1);
84
80
  i0.ɵɵelementEnd();
85
81
  } if (rf & 2) {
86
82
  const ctx_r1 = i0.ɵɵnextContext(3);
87
83
  i0.ɵɵadvance();
88
84
  i0.ɵɵconditional(ctx_r1.State.ShowAllCategories ? 1 : 2);
89
85
  } }
90
- function ComponentBrowserComponent_Conditional_21_Conditional_17_Template(rf, ctx) { if (rf & 1) {
91
- i0.ɵɵelementStart(0, "div", 27)(1, "label", 28);
86
+ function ComponentBrowserComponent_Conditional_22_Conditional_17_Template(rf, ctx) { if (rf & 1) {
87
+ i0.ɵɵelementStart(0, "div", 28)(1, "label", 29);
92
88
  i0.ɵɵtext(2, "Categories");
93
89
  i0.ɵɵelementEnd();
94
- i0.ɵɵelementStart(3, "div", 36);
95
- i0.ɵɵrepeaterCreate(4, ComponentBrowserComponent_Conditional_21_Conditional_17_For_5_Template, 5, 6, "button", 37, i0.ɵɵcomponentInstance().TrackByCategoryName, true);
90
+ i0.ɵɵelementStart(3, "div", 37);
91
+ i0.ɵɵrepeaterCreate(4, ComponentBrowserComponent_Conditional_22_Conditional_17_For_5_Template, 5, 6, "button", 38, i0.ɵɵcomponentInstance().TrackByCategoryName, true);
96
92
  i0.ɵɵelementEnd();
97
- i0.ɵɵconditionalCreate(6, ComponentBrowserComponent_Conditional_21_Conditional_17_Conditional_6_Template, 3, 1, "button", 38);
93
+ i0.ɵɵconditionalCreate(6, ComponentBrowserComponent_Conditional_22_Conditional_17_Conditional_6_Template, 3, 1, "button", 39);
98
94
  i0.ɵɵelementEnd();
99
95
  } if (rf & 2) {
100
96
  const ctx_r1 = i0.ɵɵnextContext(2);
@@ -103,36 +99,36 @@ function ComponentBrowserComponent_Conditional_21_Conditional_17_Template(rf, ct
103
99
  i0.ɵɵadvance(2);
104
100
  i0.ɵɵconditional(ctx_r1.State.AvailableCategories.length > 5 ? 6 : -1);
105
101
  } }
106
- function ComponentBrowserComponent_Conditional_21_Conditional_18_Template(rf, ctx) { if (rf & 1) {
102
+ function ComponentBrowserComponent_Conditional_22_Conditional_18_Template(rf, ctx) { if (rf & 1) {
107
103
  const _r7 = i0.ɵɵgetCurrentView();
108
- i0.ɵɵelementStart(0, "div", 35)(1, "button", 45);
109
- i0.ɵɵlistener("click", function ComponentBrowserComponent_Conditional_21_Conditional_18_Template_button_click_1_listener() { i0.ɵɵrestoreView(_r7); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.State.ClearAllFilters()); });
110
- i0.ɵɵelement(2, "i", 46);
104
+ i0.ɵɵelementStart(0, "div", 36)(1, "button", 46);
105
+ i0.ɵɵlistener("click", function ComponentBrowserComponent_Conditional_22_Conditional_18_Template_button_click_1_listener() { i0.ɵɵrestoreView(_r7); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.State.ClearAllFilters()); });
106
+ i0.ɵɵelement(2, "i", 47);
111
107
  i0.ɵɵtext(3, " Clear All Filters ");
112
108
  i0.ɵɵelementEnd()();
113
109
  } }
114
- function ComponentBrowserComponent_Conditional_21_Template(rf, ctx) { if (rf & 1) {
110
+ function ComponentBrowserComponent_Conditional_22_Template(rf, ctx) { if (rf & 1) {
115
111
  const _r3 = i0.ɵɵgetCurrentView();
116
- i0.ɵɵelementStart(0, "div", 17)(1, "div", 26)(2, "div", 27)(3, "label", 28);
112
+ i0.ɵɵelementStart(0, "div", 19)(1, "div", 27)(2, "div", 28)(3, "label", 29);
117
113
  i0.ɵɵtext(4, "Quick Filters");
118
114
  i0.ɵɵelementEnd();
119
- i0.ɵɵelementStart(5, "div", 29)(6, "label", 30)(7, "input", 31);
120
- i0.ɵɵlistener("change", function ComponentBrowserComponent_Conditional_21_Template_input_change_7_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.State.ToggleShowOnlyFavorites()); });
115
+ i0.ɵɵelementStart(5, "div", 30)(6, "label", 31)(7, "input", 32);
116
+ i0.ɵɵlistener("change", function ComponentBrowserComponent_Conditional_22_Template_input_change_7_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.State.ToggleShowOnlyFavorites()); });
121
117
  i0.ɵɵelementEnd();
122
- i0.ɵɵelement(8, "i", 32);
118
+ i0.ɵɵelement(8, "i", 33);
123
119
  i0.ɵɵelementStart(9, "span");
124
120
  i0.ɵɵtext(10, "Favorites only");
125
121
  i0.ɵɵelementEnd()();
126
- i0.ɵɵelementStart(11, "label", 30)(12, "input", 31);
127
- i0.ɵɵlistener("change", function ComponentBrowserComponent_Conditional_21_Template_input_change_12_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.State.ToggleShowDeprecatedComponents()); });
122
+ i0.ɵɵelementStart(11, "label", 31)(12, "input", 32);
123
+ i0.ɵɵlistener("change", function ComponentBrowserComponent_Conditional_22_Template_input_change_12_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.State.ToggleShowDeprecatedComponents()); });
128
124
  i0.ɵɵelementEnd();
129
- i0.ɵɵelement(13, "i", 33);
125
+ i0.ɵɵelement(13, "i", 34);
130
126
  i0.ɵɵelementStart(14, "span");
131
127
  i0.ɵɵtext(15, "Show deprecated ");
132
- i0.ɵɵconditionalCreate(16, ComponentBrowserComponent_Conditional_21_Conditional_16_Template, 2, 1, "span", 34);
128
+ i0.ɵɵconditionalCreate(16, ComponentBrowserComponent_Conditional_22_Conditional_16_Template, 2, 1, "span", 35);
133
129
  i0.ɵɵelementEnd()()()();
134
- i0.ɵɵconditionalCreate(17, ComponentBrowserComponent_Conditional_21_Conditional_17_Template, 7, 1, "div", 27);
135
- i0.ɵɵconditionalCreate(18, ComponentBrowserComponent_Conditional_21_Conditional_18_Template, 4, 0, "div", 35);
130
+ i0.ɵɵconditionalCreate(17, ComponentBrowserComponent_Conditional_22_Conditional_17_Template, 7, 1, "div", 28);
131
+ i0.ɵɵconditionalCreate(18, ComponentBrowserComponent_Conditional_22_Conditional_18_Template, 4, 0, "div", 36);
136
132
  i0.ɵɵelementEnd()();
137
133
  } if (rf & 2) {
138
134
  const ctx_r1 = i0.ɵɵnextContext();
@@ -147,41 +143,41 @@ function ComponentBrowserComponent_Conditional_21_Template(rf, ctx) { if (rf & 1
147
143
  i0.ɵɵadvance();
148
144
  i0.ɵɵconditional(ctx_r1.State.GetActiveFilterCount() > 0 ? 18 : -1);
149
145
  } }
150
- function ComponentBrowserComponent_Conditional_23_Template(rf, ctx) { if (rf & 1) {
151
- i0.ɵɵelementStart(0, "div", 19);
152
- i0.ɵɵelement(1, "mj-loading", 47);
146
+ function ComponentBrowserComponent_Conditional_24_Template(rf, ctx) { if (rf & 1) {
147
+ i0.ɵɵelementStart(0, "div", 21);
148
+ i0.ɵɵelement(1, "mj-loading", 48);
153
149
  i0.ɵɵelementEnd();
154
150
  } }
155
- function ComponentBrowserComponent_Conditional_24_Conditional_1_Template(rf, ctx) { if (rf & 1) {
156
- i0.ɵɵelement(0, "i", 48);
157
- i0.ɵɵelementStart(1, "p", 49);
151
+ function ComponentBrowserComponent_Conditional_25_Conditional_1_Template(rf, ctx) { if (rf & 1) {
152
+ i0.ɵɵelement(0, "i", 49);
153
+ i0.ɵɵelementStart(1, "p", 50);
158
154
  i0.ɵɵtext(2, "No components found");
159
155
  i0.ɵɵelementEnd();
160
- i0.ɵɵelementStart(3, "p", 50);
156
+ i0.ɵɵelementStart(3, "p", 51);
161
157
  i0.ɵɵtext(4, "Create a new component or import one to get started.");
162
158
  i0.ɵɵelementEnd();
163
159
  } }
164
- function ComponentBrowserComponent_Conditional_24_Conditional_2_Template(rf, ctx) { if (rf & 1) {
165
- i0.ɵɵelement(0, "i", 51);
166
- i0.ɵɵelementStart(1, "p", 49);
160
+ function ComponentBrowserComponent_Conditional_25_Conditional_2_Template(rf, ctx) { if (rf & 1) {
161
+ i0.ɵɵelement(0, "i", 52);
162
+ i0.ɵɵelementStart(1, "p", 50);
167
163
  i0.ɵɵtext(2, "No matching components");
168
164
  i0.ɵɵelementEnd();
169
- i0.ɵɵelementStart(3, "p", 50);
165
+ i0.ɵɵelementStart(3, "p", 51);
170
166
  i0.ɵɵtext(4, "Try adjusting your search or filters.");
171
167
  i0.ɵɵelementEnd();
172
168
  } }
173
- function ComponentBrowserComponent_Conditional_24_Template(rf, ctx) { if (rf & 1) {
174
- i0.ɵɵelementStart(0, "div", 20);
175
- i0.ɵɵconditionalCreate(1, ComponentBrowserComponent_Conditional_24_Conditional_1_Template, 5, 0)(2, ComponentBrowserComponent_Conditional_24_Conditional_2_Template, 5, 0);
169
+ function ComponentBrowserComponent_Conditional_25_Template(rf, ctx) { if (rf & 1) {
170
+ i0.ɵɵelementStart(0, "div", 22);
171
+ i0.ɵɵconditionalCreate(1, ComponentBrowserComponent_Conditional_25_Conditional_1_Template, 5, 0)(2, ComponentBrowserComponent_Conditional_25_Conditional_2_Template, 5, 0);
176
172
  i0.ɵɵelementEnd();
177
173
  } if (rf & 2) {
178
174
  const ctx_r1 = i0.ɵɵnextContext();
179
175
  i0.ɵɵadvance();
180
176
  i0.ɵɵconditional(ctx_r1.State.AllComponents.length === 0 ? 1 : 2);
181
177
  } }
182
- function ComponentBrowserComponent_Conditional_25_For_1_Conditional_8_Template(rf, ctx) { if (rf & 1) {
183
- i0.ɵɵelementStart(0, "span", 60);
184
- i0.ɵɵelement(1, "i", 56);
178
+ function ComponentBrowserComponent_Conditional_26_For_1_Conditional_8_Template(rf, ctx) { if (rf & 1) {
179
+ i0.ɵɵelementStart(0, "span", 61);
180
+ i0.ɵɵelement(1, "i", 57);
185
181
  i0.ɵɵtext(2);
186
182
  i0.ɵɵelementEnd();
187
183
  } if (rf & 2) {
@@ -193,17 +189,17 @@ function ComponentBrowserComponent_Conditional_25_For_1_Conditional_8_Template(r
193
189
  i0.ɵɵadvance();
194
190
  i0.ɵɵtextInterpolate1(" ", ctx_r1.GetFileBadgeLabel(component_r9), " ");
195
191
  } }
196
- function ComponentBrowserComponent_Conditional_25_For_1_Conditional_18_Conditional_1_Template(rf, ctx) { if (rf & 1) {
197
- i0.ɵɵelement(0, "i", 72);
198
- } }
199
- function ComponentBrowserComponent_Conditional_25_For_1_Conditional_18_Conditional_2_Template(rf, ctx) { if (rf & 1) {
192
+ function ComponentBrowserComponent_Conditional_26_For_1_Conditional_18_Conditional_1_Template(rf, ctx) { if (rf & 1) {
200
193
  i0.ɵɵelement(0, "i", 73);
201
194
  } }
202
- function ComponentBrowserComponent_Conditional_25_For_1_Conditional_18_Template(rf, ctx) { if (rf & 1) {
195
+ function ComponentBrowserComponent_Conditional_26_For_1_Conditional_18_Conditional_2_Template(rf, ctx) { if (rf & 1) {
196
+ i0.ɵɵelement(0, "i", 74);
197
+ } }
198
+ function ComponentBrowserComponent_Conditional_26_For_1_Conditional_18_Template(rf, ctx) { if (rf & 1) {
203
199
  const _r10 = i0.ɵɵgetCurrentView();
204
- i0.ɵɵelementStart(0, "button", 71);
205
- i0.ɵɵlistener("click", function ComponentBrowserComponent_Conditional_25_For_1_Conditional_18_Template_button_click_0_listener($event) { i0.ɵɵrestoreView(_r10); const component_r9 = i0.ɵɵnextContext().$implicit; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.OnToggleFavorite(component_r9, $event)); });
206
- i0.ɵɵconditionalCreate(1, ComponentBrowserComponent_Conditional_25_For_1_Conditional_18_Conditional_1_Template, 1, 0, "i", 72)(2, ComponentBrowserComponent_Conditional_25_For_1_Conditional_18_Conditional_2_Template, 1, 0, "i", 73);
200
+ i0.ɵɵelementStart(0, "button", 72);
201
+ i0.ɵɵlistener("click", function ComponentBrowserComponent_Conditional_26_For_1_Conditional_18_Template_button_click_0_listener($event) { i0.ɵɵrestoreView(_r10); const component_r9 = i0.ɵɵnextContext().$implicit; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.OnToggleFavorite(component_r9, $event)); });
202
+ i0.ɵɵconditionalCreate(1, ComponentBrowserComponent_Conditional_26_For_1_Conditional_18_Conditional_1_Template, 1, 0, "i", 73)(2, ComponentBrowserComponent_Conditional_26_For_1_Conditional_18_Conditional_2_Template, 1, 0, "i", 74);
207
203
  i0.ɵɵelementEnd();
208
204
  } if (rf & 2) {
209
205
  const component_r9 = i0.ɵɵnextContext().$implicit;
@@ -213,21 +209,21 @@ function ComponentBrowserComponent_Conditional_25_For_1_Conditional_18_Template(
213
209
  i0.ɵɵadvance();
214
210
  i0.ɵɵconditional(ctx_r1.State.IsFavorite(component_r9) ? 1 : 2);
215
211
  } }
216
- function ComponentBrowserComponent_Conditional_25_For_1_Conditional_19_Template(rf, ctx) { if (rf & 1) {
212
+ function ComponentBrowserComponent_Conditional_26_For_1_Conditional_19_Template(rf, ctx) { if (rf & 1) {
217
213
  const _r11 = i0.ɵɵgetCurrentView();
218
- i0.ɵɵelementStart(0, "button", 74);
219
- i0.ɵɵlistener("click", function ComponentBrowserComponent_Conditional_25_For_1_Conditional_19_Template_button_click_0_listener($event) { i0.ɵɵrestoreView(_r11); const component_r9 = i0.ɵɵnextContext().$implicit; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.OnRemoveFileComponent(component_r9, $event)); });
220
- i0.ɵɵelement(1, "i", 46);
214
+ i0.ɵɵelementStart(0, "button", 75);
215
+ i0.ɵɵlistener("click", function ComponentBrowserComponent_Conditional_26_For_1_Conditional_19_Template_button_click_0_listener($event) { i0.ɵɵrestoreView(_r11); const component_r9 = i0.ɵɵnextContext().$implicit; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.OnRemoveFileComponent(component_r9, $event)); });
216
+ i0.ɵɵelement(1, "i", 47);
221
217
  i0.ɵɵelementEnd();
222
218
  } }
223
- function ComponentBrowserComponent_Conditional_25_For_1_Conditional_21_Template(rf, ctx) { if (rf & 1) {
224
- i0.ɵɵelement(0, "i", 43);
225
- } }
226
- function ComponentBrowserComponent_Conditional_25_For_1_Conditional_22_Template(rf, ctx) { if (rf & 1) {
219
+ function ComponentBrowserComponent_Conditional_26_For_1_Conditional_21_Template(rf, ctx) { if (rf & 1) {
227
220
  i0.ɵɵelement(0, "i", 44);
228
221
  } }
229
- function ComponentBrowserComponent_Conditional_25_For_1_Conditional_23_Conditional_1_Template(rf, ctx) { if (rf & 1) {
230
- i0.ɵɵelementStart(0, "div", 75)(1, "p");
222
+ function ComponentBrowserComponent_Conditional_26_For_1_Conditional_22_Template(rf, ctx) { if (rf & 1) {
223
+ i0.ɵɵelement(0, "i", 45);
224
+ } }
225
+ function ComponentBrowserComponent_Conditional_26_For_1_Conditional_23_Conditional_1_Template(rf, ctx) { if (rf & 1) {
226
+ i0.ɵɵelementStart(0, "div", 76)(1, "p");
231
227
  i0.ɵɵtext(2);
232
228
  i0.ɵɵelementEnd()();
233
229
  } if (rf & 2) {
@@ -236,11 +232,11 @@ function ComponentBrowserComponent_Conditional_25_For_1_Conditional_23_Condition
236
232
  i0.ɵɵadvance(2);
237
233
  i0.ɵɵtextInterpolate(ctx_r1.State.GetComponentDescription(component_r9));
238
234
  } }
239
- function ComponentBrowserComponent_Conditional_25_For_1_Conditional_23_Conditional_18_Template(rf, ctx) { if (rf & 1) {
240
- i0.ɵɵelementStart(0, "div", 77)(1, "span", 78);
235
+ function ComponentBrowserComponent_Conditional_26_For_1_Conditional_23_Conditional_18_Template(rf, ctx) { if (rf & 1) {
236
+ i0.ɵɵelementStart(0, "div", 78)(1, "span", 79);
241
237
  i0.ɵɵtext(2, "Loaded");
242
238
  i0.ɵɵelementEnd();
243
- i0.ɵɵelementStart(3, "span", 79);
239
+ i0.ɵɵelementStart(3, "span", 80);
244
240
  i0.ɵɵtext(4);
245
241
  i0.ɵɵpipe(5, "date");
246
242
  i0.ɵɵelementEnd()();
@@ -250,11 +246,11 @@ function ComponentBrowserComponent_Conditional_25_For_1_Conditional_23_Condition
250
246
  i0.ɵɵadvance(4);
251
247
  i0.ɵɵtextInterpolate(i0.ɵɵpipeBind2(5, 1, ctx_r1.State.GetComponentLoadedAt(component_r9), "short"));
252
248
  } }
253
- function ComponentBrowserComponent_Conditional_25_For_1_Conditional_23_Conditional_19_Template(rf, ctx) { if (rf & 1) {
254
- i0.ɵɵelementStart(0, "div", 77)(1, "span", 78);
249
+ function ComponentBrowserComponent_Conditional_26_For_1_Conditional_23_Conditional_19_Template(rf, ctx) { if (rf & 1) {
250
+ i0.ɵɵelementStart(0, "div", 78)(1, "span", 79);
255
251
  i0.ɵɵtext(2, "Updated");
256
252
  i0.ɵɵelementEnd();
257
- i0.ɵɵelementStart(3, "span", 79);
253
+ i0.ɵɵelementStart(3, "span", 80);
258
254
  i0.ɵɵtext(4);
259
255
  i0.ɵɵpipe(5, "date");
260
256
  i0.ɵɵelementEnd()();
@@ -264,61 +260,55 @@ function ComponentBrowserComponent_Conditional_25_For_1_Conditional_23_Condition
264
260
  i0.ɵɵadvance(4);
265
261
  i0.ɵɵtextInterpolate(i0.ɵɵpipeBind2(5, 1, ctx_r1.State.GetComponentUpdatedAt(component_r9), "short"));
266
262
  } }
267
- function ComponentBrowserComponent_Conditional_25_For_1_Conditional_23_Conditional_21_Template(rf, ctx) { if (rf & 1) {
263
+ function ComponentBrowserComponent_Conditional_26_For_1_Conditional_23_Conditional_21_Template(rf, ctx) { if (rf & 1) {
268
264
  const _r12 = i0.ɵɵgetCurrentView();
269
- i0.ɵɵelementStart(0, "button", 3);
270
- i0.ɵɵlistener("click", function ComponentBrowserComponent_Conditional_25_For_1_Conditional_23_Conditional_21_Template_button_click_0_listener($event) { i0.ɵɵrestoreView(_r12); const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.OnStopComponent($event)); });
271
- i0.ɵɵelement(1, "i", 83);
265
+ i0.ɵɵelementStart(0, "button", 85);
266
+ i0.ɵɵlistener("click", function ComponentBrowserComponent_Conditional_26_For_1_Conditional_23_Conditional_21_Template_button_click_0_listener($event) { i0.ɵɵrestoreView(_r12); const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.OnStopComponent($event)); });
267
+ i0.ɵɵelement(1, "i", 86);
272
268
  i0.ɵɵtext(2, " Stop ");
273
269
  i0.ɵɵelementEnd();
274
- } if (rf & 2) {
275
- i0.ɵɵproperty("themeColor", "error");
276
270
  } }
277
- function ComponentBrowserComponent_Conditional_25_For_1_Conditional_23_Conditional_22_Template(rf, ctx) { if (rf & 1) {
271
+ function ComponentBrowserComponent_Conditional_26_For_1_Conditional_23_Conditional_22_Template(rf, ctx) { if (rf & 1) {
278
272
  const _r13 = i0.ɵɵgetCurrentView();
279
- i0.ɵɵelementStart(0, "button", 84);
280
- i0.ɵɵlistener("click", function ComponentBrowserComponent_Conditional_25_For_1_Conditional_23_Conditional_22_Template_button_click_0_listener($event) { i0.ɵɵrestoreView(_r13); const component_r9 = i0.ɵɵnextContext(2).$implicit; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.OnSwitchComponent(component_r9, $event)); });
281
- i0.ɵɵelement(1, "i", 85);
273
+ i0.ɵɵelementStart(0, "button", 87);
274
+ i0.ɵɵlistener("click", function ComponentBrowserComponent_Conditional_26_For_1_Conditional_23_Conditional_22_Template_button_click_0_listener($event) { i0.ɵɵrestoreView(_r13); const component_r9 = i0.ɵɵnextContext(2).$implicit; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.OnSwitchComponent(component_r9, $event)); });
275
+ i0.ɵɵelement(1, "i", 88);
282
276
  i0.ɵɵtext(2, " Switch To This ");
283
277
  i0.ɵɵelementEnd();
284
- } if (rf & 2) {
285
- i0.ɵɵproperty("themeColor", "base");
286
278
  } }
287
- function ComponentBrowserComponent_Conditional_25_For_1_Conditional_23_Conditional_23_Template(rf, ctx) { if (rf & 1) {
279
+ function ComponentBrowserComponent_Conditional_26_For_1_Conditional_23_Conditional_23_Template(rf, ctx) { if (rf & 1) {
288
280
  const _r14 = i0.ɵɵgetCurrentView();
289
281
  i0.ɵɵelementStart(0, "button", 3);
290
- i0.ɵɵlistener("click", function ComponentBrowserComponent_Conditional_25_For_1_Conditional_23_Conditional_23_Template_button_click_0_listener($event) { i0.ɵɵrestoreView(_r14); const component_r9 = i0.ɵɵnextContext(2).$implicit; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.OnRunComponent(component_r9, $event)); });
291
- i0.ɵɵelement(1, "i", 86);
282
+ i0.ɵɵlistener("click", function ComponentBrowserComponent_Conditional_26_For_1_Conditional_23_Conditional_23_Template_button_click_0_listener($event) { i0.ɵɵrestoreView(_r14); const component_r9 = i0.ɵɵnextContext(2).$implicit; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.OnRunComponent(component_r9, $event)); });
283
+ i0.ɵɵelement(1, "i", 89);
292
284
  i0.ɵɵtext(2, " Run ");
293
285
  i0.ɵɵelementEnd();
294
- } if (rf & 2) {
295
- i0.ɵɵproperty("themeColor", "primary");
296
286
  } }
297
- function ComponentBrowserComponent_Conditional_25_For_1_Conditional_23_Template(rf, ctx) { if (rf & 1) {
298
- i0.ɵɵelementStart(0, "div", 70);
299
- i0.ɵɵconditionalCreate(1, ComponentBrowserComponent_Conditional_25_For_1_Conditional_23_Conditional_1_Template, 3, 1, "div", 75);
300
- i0.ɵɵelementStart(2, "div", 76)(3, "div", 77)(4, "span", 78);
287
+ function ComponentBrowserComponent_Conditional_26_For_1_Conditional_23_Template(rf, ctx) { if (rf & 1) {
288
+ i0.ɵɵelementStart(0, "div", 71);
289
+ i0.ɵɵconditionalCreate(1, ComponentBrowserComponent_Conditional_26_For_1_Conditional_23_Conditional_1_Template, 3, 1, "div", 76);
290
+ i0.ɵɵelementStart(2, "div", 77)(3, "div", 78)(4, "span", 79);
301
291
  i0.ɵɵtext(5, "Type");
302
292
  i0.ɵɵelementEnd();
303
- i0.ɵɵelementStart(6, "span", 79);
293
+ i0.ɵɵelementStart(6, "span", 80);
304
294
  i0.ɵɵtext(7);
305
295
  i0.ɵɵelementEnd()();
306
- i0.ɵɵelementStart(8, "div", 77)(9, "span", 78);
296
+ i0.ɵɵelementStart(8, "div", 78)(9, "span", 79);
307
297
  i0.ɵɵtext(10, "Version");
308
298
  i0.ɵɵelementEnd();
309
- i0.ɵɵelementStart(11, "span", 79);
299
+ i0.ɵɵelementStart(11, "span", 80);
310
300
  i0.ɵɵtext(12);
311
301
  i0.ɵɵelementEnd()();
312
- i0.ɵɵelementStart(13, "div", 77)(14, "span", 78);
302
+ i0.ɵɵelementStart(13, "div", 78)(14, "span", 79);
313
303
  i0.ɵɵtext(15, "Status");
314
304
  i0.ɵɵelementEnd();
315
- i0.ɵɵelementStart(16, "span", 79);
305
+ i0.ɵɵelementStart(16, "span", 80);
316
306
  i0.ɵɵtext(17);
317
307
  i0.ɵɵelementEnd()();
318
- i0.ɵɵconditionalCreate(18, ComponentBrowserComponent_Conditional_25_For_1_Conditional_23_Conditional_18_Template, 6, 4, "div", 77)(19, ComponentBrowserComponent_Conditional_25_For_1_Conditional_23_Conditional_19_Template, 6, 4, "div", 77);
308
+ i0.ɵɵconditionalCreate(18, ComponentBrowserComponent_Conditional_26_For_1_Conditional_23_Conditional_18_Template, 6, 4, "div", 78)(19, ComponentBrowserComponent_Conditional_26_For_1_Conditional_23_Conditional_19_Template, 6, 4, "div", 78);
319
309
  i0.ɵɵelementEnd();
320
- i0.ɵɵelementStart(20, "div", 80);
321
- i0.ɵɵconditionalCreate(21, ComponentBrowserComponent_Conditional_25_For_1_Conditional_23_Conditional_21_Template, 3, 1, "button", 81)(22, ComponentBrowserComponent_Conditional_25_For_1_Conditional_23_Conditional_22_Template, 3, 1, "button", 82)(23, ComponentBrowserComponent_Conditional_25_For_1_Conditional_23_Conditional_23_Template, 3, 1, "button", 81);
310
+ i0.ɵɵelementStart(20, "div", 81);
311
+ i0.ɵɵconditionalCreate(21, ComponentBrowserComponent_Conditional_26_For_1_Conditional_23_Conditional_21_Template, 3, 0, "button", 82)(22, ComponentBrowserComponent_Conditional_26_For_1_Conditional_23_Conditional_22_Template, 3, 0, "button", 83)(23, ComponentBrowserComponent_Conditional_26_For_1_Conditional_23_Conditional_23_Template, 3, 0, "button", 84);
322
312
  i0.ɵɵelementEnd()();
323
313
  } if (rf & 2) {
324
314
  const component_r9 = i0.ɵɵnextContext().$implicit;
@@ -336,35 +326,35 @@ function ComponentBrowserComponent_Conditional_25_For_1_Conditional_23_Template(
336
326
  i0.ɵɵadvance(3);
337
327
  i0.ɵɵconditional(ctx_r1.IsComponentRunning(component_r9) ? 21 : ctx_r1.IsAnotherComponentRunning(component_r9) ? 22 : 23);
338
328
  } }
339
- function ComponentBrowserComponent_Conditional_25_For_1_Template(rf, ctx) { if (rf & 1) {
329
+ function ComponentBrowserComponent_Conditional_26_For_1_Template(rf, ctx) { if (rf & 1) {
340
330
  const _r8 = i0.ɵɵgetCurrentView();
341
- i0.ɵɵelementStart(0, "div", 53)(1, "div", 54);
342
- i0.ɵɵlistener("click", function ComponentBrowserComponent_Conditional_25_For_1_Template_div_click_1_listener() { const component_r9 = i0.ɵɵrestoreView(_r8).$implicit; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.ToggleComponentExpansion(component_r9)); });
343
- i0.ɵɵelementStart(2, "div", 55);
344
- i0.ɵɵelement(3, "i", 56);
331
+ i0.ɵɵelementStart(0, "div", 54)(1, "div", 55);
332
+ i0.ɵɵlistener("click", function ComponentBrowserComponent_Conditional_26_For_1_Template_div_click_1_listener() { const component_r9 = i0.ɵɵrestoreView(_r8).$implicit; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.ToggleComponentExpansion(component_r9)); });
333
+ i0.ɵɵelementStart(2, "div", 56);
334
+ i0.ɵɵelement(3, "i", 57);
345
335
  i0.ɵɵelementEnd();
346
- i0.ɵɵelementStart(4, "div", 57)(5, "div", 58)(6, "span", 59);
336
+ i0.ɵɵelementStart(4, "div", 58)(5, "div", 59)(6, "span", 60);
347
337
  i0.ɵɵtext(7);
348
338
  i0.ɵɵelementEnd();
349
- i0.ɵɵconditionalCreate(8, ComponentBrowserComponent_Conditional_25_For_1_Conditional_8_Template, 3, 3, "span", 60);
339
+ i0.ɵɵconditionalCreate(8, ComponentBrowserComponent_Conditional_26_For_1_Conditional_8_Template, 3, 3, "span", 61);
350
340
  i0.ɵɵelementEnd();
351
- i0.ɵɵelementStart(9, "div", 61)(10, "span", 62);
341
+ i0.ɵɵelementStart(9, "div", 62)(10, "span", 63);
352
342
  i0.ɵɵtext(11);
353
343
  i0.ɵɵelementEnd();
354
- i0.ɵɵelementStart(12, "span", 63);
344
+ i0.ɵɵelementStart(12, "span", 64);
355
345
  i0.ɵɵtext(13);
356
346
  i0.ɵɵelementEnd();
357
- i0.ɵɵelementStart(14, "span", 64);
358
- i0.ɵɵelement(15, "i", 65);
347
+ i0.ɵɵelementStart(14, "span", 65);
348
+ i0.ɵɵelement(15, "i", 66);
359
349
  i0.ɵɵtext(16);
360
350
  i0.ɵɵelementEnd()()();
361
- i0.ɵɵelementStart(17, "div", 66);
362
- i0.ɵɵconditionalCreate(18, ComponentBrowserComponent_Conditional_25_For_1_Conditional_18_Template, 3, 4, "button", 67);
363
- i0.ɵɵconditionalCreate(19, ComponentBrowserComponent_Conditional_25_For_1_Conditional_19_Template, 2, 0, "button", 68);
364
- i0.ɵɵelementStart(20, "div", 69);
365
- i0.ɵɵconditionalCreate(21, ComponentBrowserComponent_Conditional_25_For_1_Conditional_21_Template, 1, 0, "i", 43)(22, ComponentBrowserComponent_Conditional_25_For_1_Conditional_22_Template, 1, 0, "i", 44);
351
+ i0.ɵɵelementStart(17, "div", 67);
352
+ i0.ɵɵconditionalCreate(18, ComponentBrowserComponent_Conditional_26_For_1_Conditional_18_Template, 3, 4, "button", 68);
353
+ i0.ɵɵconditionalCreate(19, ComponentBrowserComponent_Conditional_26_For_1_Conditional_19_Template, 2, 0, "button", 69);
354
+ i0.ɵɵelementStart(20, "div", 70);
355
+ i0.ɵɵconditionalCreate(21, ComponentBrowserComponent_Conditional_26_For_1_Conditional_21_Template, 1, 0, "i", 44)(22, ComponentBrowserComponent_Conditional_26_For_1_Conditional_22_Template, 1, 0, "i", 45);
366
356
  i0.ɵɵelementEnd()()();
367
- i0.ɵɵconditionalCreate(23, ComponentBrowserComponent_Conditional_25_For_1_Conditional_23_Template, 24, 6, "div", 70);
357
+ i0.ɵɵconditionalCreate(23, ComponentBrowserComponent_Conditional_26_For_1_Conditional_23_Template, 24, 6, "div", 71);
368
358
  i0.ɵɵelementEnd();
369
359
  } if (rf & 2) {
370
360
  const component_r9 = ctx.$implicit;
@@ -398,8 +388,8 @@ function ComponentBrowserComponent_Conditional_25_For_1_Template(rf, ctx) { if (
398
388
  i0.ɵɵadvance(2);
399
389
  i0.ɵɵconditional(ctx_r1.IsExpanded(component_r9) ? 23 : -1);
400
390
  } }
401
- function ComponentBrowserComponent_Conditional_25_Template(rf, ctx) { if (rf & 1) {
402
- i0.ɵɵrepeaterCreate(0, ComponentBrowserComponent_Conditional_25_For_1_Template, 24, 22, "div", 52, i0.ɵɵcomponentInstance().TrackByComponentId, true);
391
+ function ComponentBrowserComponent_Conditional_26_Template(rf, ctx) { if (rf & 1) {
392
+ i0.ɵɵrepeaterCreate(0, ComponentBrowserComponent_Conditional_26_For_1_Template, 24, 22, "div", 53, i0.ɵɵcomponentInstance().TrackByComponentId, true);
403
393
  } if (rf & 2) {
404
394
  const ctx_r1 = i0.ɵɵnextContext();
405
395
  i0.ɵɵrepeater(ctx_r1.State.FilteredComponents);
@@ -568,44 +558,41 @@ export class ComponentBrowserComponent {
568
558
  return category.name;
569
559
  }
570
560
  static ɵfac = function ComponentBrowserComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || ComponentBrowserComponent)(i0.ɵɵdirectiveInject(i1.ComponentStudioStateService), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); };
571
- static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ComponentBrowserComponent, selectors: [["mj-component-browser"]], outputs: { NewComponent: "NewComponent", ImportFromFile: "ImportFromFile", ImportFromText: "ImportFromText", ImportFromArtifact: "ImportFromArtifact" }, standalone: false, decls: 26, vars: 15, consts: [[1, "component-browser"], [1, "browser-header"], [1, "header-top-row"], ["kendoButton", "", 3, "click", "themeColor"], [1, "fa-solid", "fa-plus"], [1, "import-dropdown"], [1, "fa-solid", "fa-file-import"], [1, "fa-solid", "fa-chevron-down", "dropdown-chevron"], [1, "dropdown-menu"], [1, "header-controls-row"], [1, "filter-toggle-btn", 3, "click", "title"], [1, "fa-solid", "fa-sliders"], [1, "filter-count-badge"], [1, "component-count"], [1, "search-box"], ["placeholder", "Search components...", 3, "valueChange", "value", "clearButton"], ["kendoTextBoxPrefixTemplate", ""], [1, "filter-panel"], [1, "component-list"], [1, "loading-state"], [1, "empty-state"], [1, "dropdown-item", 3, "click"], [1, "fa-solid", "fa-database"], [1, "fa-solid", "fa-file"], [1, "fa-solid", "fa-keyboard"], [1, "fa-solid", "fa-search", "search-icon"], [1, "filter-panel-content"], [1, "filter-section"], [1, "filter-section-label"], [1, "filter-options"], [1, "filter-checkbox"], ["type", "checkbox", 3, "change", "checked"], [1, "fa-solid", "fa-star", "filter-icon", "favorites-icon"], [1, "fa-solid", "fa-archive", "filter-icon", "deprecated-icon"], [1, "deprecated-count"], [1, "filter-panel-footer"], [1, "category-pills"], [1, "category-pill", 3, "active", "--pill-color"], [1, "show-more-btn"], [1, "category-pill", 3, "click"], [1, "pill-name"], [1, "pill-count"], [1, "show-more-btn", 3, "click"], [1, "fa-solid", "fa-chevron-up"], [1, "fa-solid", "fa-chevron-down"], [1, "clear-all-btn", 3, "click"], [1, "fa-solid", "fa-times"], ["text", "Loading components...", "size", "small"], [1, "fa-solid", "fa-puzzle-piece", "empty-icon"], [1, "empty-title"], [1, "empty-subtitle"], [1, "fa-solid", "fa-filter", "empty-icon"], [1, "component-card", 3, "expanded", "running", "file-loaded"], [1, "component-card"], [1, "card-header", 3, "click"], [1, "card-type-icon"], [1, "fa-solid", 3, "ngClass"], [1, "card-body"], [1, "card-title-row"], [1, "card-name"], [1, "file-badge", 3, "title"], [1, "card-meta-row"], [1, "version-badge"], [1, "status-badge", 3, "ngClass"], [1, "namespace-chip", 3, "title"], [1, "fa-solid", "fa-folder-tree"], [1, "card-end"], [1, "favorite-btn", 3, "is-favorite", "title"], ["title", "Remove imported component", 1, "remove-btn"], [1, "card-chevron"], [1, "card-details"], [1, "favorite-btn", 3, "click", "title"], [1, "fa-solid", "fa-star"], [1, "fa-regular", "fa-star"], ["title", "Remove imported component", 1, "remove-btn", 3, "click"], [1, "detail-description"], [1, "detail-info-grid"], [1, "info-item"], [1, "info-label"], [1, "info-value"], [1, "detail-actions"], ["kendoButton", "", 3, "themeColor"], ["kendoButton", "", "title", "Stop current component and run this one", 3, "themeColor"], [1, "fa-solid", "fa-stop"], ["kendoButton", "", "title", "Stop current component and run this one", 3, "click", "themeColor"], [1, "fa-solid", "fa-exchange-alt"], [1, "fa-solid", "fa-play"]], template: function ComponentBrowserComponent_Template(rf, ctx) { if (rf & 1) {
561
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ComponentBrowserComponent, selectors: [["mj-component-browser"]], outputs: { NewComponent: "NewComponent", ImportFromFile: "ImportFromFile", ImportFromText: "ImportFromText", ImportFromArtifact: "ImportFromArtifact" }, standalone: false, decls: 27, vars: 12, consts: [[1, "component-browser"], [1, "browser-header"], [1, "header-top-row"], ["mjButton", "", "variant", "primary", 3, "click"], [1, "fa-solid", "fa-plus"], [1, "import-dropdown"], ["mjButton", "", 3, "click"], [1, "fa-solid", "fa-file-import"], [1, "fa-solid", "fa-chevron-down", "dropdown-chevron"], [1, "dropdown-menu"], [1, "header-controls-row"], [1, "filter-toggle-btn", 3, "click", "title"], [1, "fa-solid", "fa-sliders"], [1, "filter-count-badge"], [1, "component-count"], [1, "search-box"], [1, "search-input-wrapper"], [1, "fa-solid", "fa-search", "search-icon"], ["type", "text", "placeholder", "Search components...", 1, "mj-input", 3, "input", "value"], [1, "filter-panel"], [1, "component-list"], [1, "loading-state"], [1, "empty-state"], [1, "dropdown-item", 3, "click"], [1, "fa-solid", "fa-database"], [1, "fa-solid", "fa-file"], [1, "fa-solid", "fa-keyboard"], [1, "filter-panel-content"], [1, "filter-section"], [1, "filter-section-label"], [1, "filter-options"], [1, "filter-checkbox"], ["type", "checkbox", 3, "change", "checked"], [1, "fa-solid", "fa-star", "filter-icon", "favorites-icon"], [1, "fa-solid", "fa-archive", "filter-icon", "deprecated-icon"], [1, "deprecated-count"], [1, "filter-panel-footer"], [1, "category-pills"], [1, "category-pill", 3, "active", "--pill-color"], [1, "show-more-btn"], [1, "category-pill", 3, "click"], [1, "pill-name"], [1, "pill-count"], [1, "show-more-btn", 3, "click"], [1, "fa-solid", "fa-chevron-up"], [1, "fa-solid", "fa-chevron-down"], [1, "clear-all-btn", 3, "click"], [1, "fa-solid", "fa-times"], ["text", "Loading components...", "size", "small"], [1, "fa-solid", "fa-puzzle-piece", "empty-icon"], [1, "empty-title"], [1, "empty-subtitle"], [1, "fa-solid", "fa-filter", "empty-icon"], [1, "component-card", 3, "expanded", "running", "file-loaded"], [1, "component-card"], [1, "card-header", 3, "click"], [1, "card-type-icon"], [1, "fa-solid", 3, "ngClass"], [1, "card-body"], [1, "card-title-row"], [1, "card-name"], [1, "file-badge", 3, "title"], [1, "card-meta-row"], [1, "version-badge"], [1, "status-badge", 3, "ngClass"], [1, "namespace-chip", 3, "title"], [1, "fa-solid", "fa-folder-tree"], [1, "card-end"], [1, "favorite-btn", 3, "is-favorite", "title"], ["title", "Remove imported component", 1, "remove-btn"], [1, "card-chevron"], [1, "card-details"], [1, "favorite-btn", 3, "click", "title"], [1, "fa-solid", "fa-star"], [1, "fa-regular", "fa-star"], ["title", "Remove imported component", 1, "remove-btn", 3, "click"], [1, "detail-description"], [1, "detail-info-grid"], [1, "info-item"], [1, "info-label"], [1, "info-value"], [1, "detail-actions"], ["mjButton", "", "variant", "danger"], ["mjButton", "", "title", "Stop current component and run this one"], ["mjButton", "", "variant", "primary"], ["mjButton", "", "variant", "danger", 3, "click"], [1, "fa-solid", "fa-stop"], ["mjButton", "", "title", "Stop current component and run this one", 3, "click"], [1, "fa-solid", "fa-exchange-alt"], [1, "fa-solid", "fa-play"]], template: function ComponentBrowserComponent_Template(rf, ctx) { if (rf & 1) {
572
562
  i0.ɵɵelementStart(0, "div", 0)(1, "div", 1)(2, "div", 2)(3, "button", 3);
573
563
  i0.ɵɵlistener("click", function ComponentBrowserComponent_Template_button_click_3_listener() { return ctx.OnNewComponent(); });
574
564
  i0.ɵɵelement(4, "i", 4);
575
565
  i0.ɵɵtext(5, " New Component ");
576
566
  i0.ɵɵelementEnd();
577
- i0.ɵɵelementStart(6, "div", 5)(7, "button", 3);
567
+ i0.ɵɵelementStart(6, "div", 5)(7, "button", 6);
578
568
  i0.ɵɵlistener("click", function ComponentBrowserComponent_Template_button_click_7_listener() { return ctx.ToggleImportDropdown(); });
579
- i0.ɵɵelement(8, "i", 6);
569
+ i0.ɵɵelement(8, "i", 7);
580
570
  i0.ɵɵtext(9, " Import ");
581
- i0.ɵɵelement(10, "i", 7);
571
+ i0.ɵɵelement(10, "i", 8);
582
572
  i0.ɵɵelementEnd();
583
- i0.ɵɵconditionalCreate(11, ComponentBrowserComponent_Conditional_11_Template, 10, 0, "div", 8);
573
+ i0.ɵɵconditionalCreate(11, ComponentBrowserComponent_Conditional_11_Template, 10, 0, "div", 9);
584
574
  i0.ɵɵelementEnd()();
585
- i0.ɵɵelementStart(12, "div", 9)(13, "button", 10);
575
+ i0.ɵɵelementStart(12, "div", 10)(13, "button", 11);
586
576
  i0.ɵɵlistener("click", function ComponentBrowserComponent_Template_button_click_13_listener() { return ctx.State.ToggleFilterPanel(); });
587
- i0.ɵɵelement(14, "i", 11);
588
- i0.ɵɵconditionalCreate(15, ComponentBrowserComponent_Conditional_15_Template, 2, 1, "span", 12);
577
+ i0.ɵɵelement(14, "i", 12);
578
+ i0.ɵɵconditionalCreate(15, ComponentBrowserComponent_Conditional_15_Template, 2, 1, "span", 13);
589
579
  i0.ɵɵelementEnd();
590
- i0.ɵɵelementStart(16, "span", 13);
580
+ i0.ɵɵelementStart(16, "span", 14);
591
581
  i0.ɵɵtext(17);
592
582
  i0.ɵɵelementEnd()()();
593
- i0.ɵɵelementStart(18, "div", 14)(19, "kendo-textbox", 15);
594
- i0.ɵɵlistener("valueChange", function ComponentBrowserComponent_Template_kendo_textbox_valueChange_19_listener($event) { return ctx.OnSearchChange($event); });
595
- i0.ɵɵtemplate(20, ComponentBrowserComponent_ng_template_20_Template, 1, 0, "ng-template", 16);
596
- i0.ɵɵelementEnd()();
597
- i0.ɵɵconditionalCreate(21, ComponentBrowserComponent_Conditional_21_Template, 19, 5, "div", 17);
598
- i0.ɵɵelementStart(22, "div", 18);
599
- i0.ɵɵconditionalCreate(23, ComponentBrowserComponent_Conditional_23_Template, 2, 0, "div", 19)(24, ComponentBrowserComponent_Conditional_24_Template, 3, 1, "div", 20)(25, ComponentBrowserComponent_Conditional_25_Template, 2, 0);
583
+ i0.ɵɵelementStart(18, "div", 15)(19, "div", 16);
584
+ i0.ɵɵelement(20, "i", 17);
585
+ i0.ɵɵelementStart(21, "input", 18);
586
+ i0.ɵɵlistener("input", function ComponentBrowserComponent_Template_input_input_21_listener($event) { return ctx.OnSearchChange($event.target.value); });
587
+ i0.ɵɵelementEnd()()();
588
+ i0.ɵɵconditionalCreate(22, ComponentBrowserComponent_Conditional_22_Template, 19, 5, "div", 19);
589
+ i0.ɵɵelementStart(23, "div", 20);
590
+ i0.ɵɵconditionalCreate(24, ComponentBrowserComponent_Conditional_24_Template, 2, 0, "div", 21)(25, ComponentBrowserComponent_Conditional_25_Template, 3, 1, "div", 22)(26, ComponentBrowserComponent_Conditional_26_Template, 2, 0);
600
591
  i0.ɵɵelementEnd()();
601
592
  } if (rf & 2) {
602
- i0.ɵɵadvance(3);
603
- i0.ɵɵproperty("themeColor", "primary");
604
- i0.ɵɵadvance(3);
593
+ i0.ɵɵadvance(6);
605
594
  i0.ɵɵclassProp("open", ctx.ImportDropdownOpen);
606
- i0.ɵɵadvance();
607
- i0.ɵɵproperty("themeColor", "base");
608
- i0.ɵɵadvance(4);
595
+ i0.ɵɵadvance(5);
609
596
  i0.ɵɵconditional(ctx.ImportDropdownOpen ? 11 : -1);
610
597
  i0.ɵɵadvance(2);
611
598
  i0.ɵɵclassProp("active", ctx.State.IsFilterPanelExpanded || ctx.State.GetActiveFilterCount() > 0);
@@ -614,17 +601,17 @@ export class ComponentBrowserComponent {
614
601
  i0.ɵɵconditional(ctx.State.GetActiveFilterCount() > 0 ? 15 : -1);
615
602
  i0.ɵɵadvance(2);
616
603
  i0.ɵɵtextInterpolate2(" ", ctx.State.FilteredComponents.length, " of ", ctx.State.AllComponents.length, " ");
604
+ i0.ɵɵadvance(4);
605
+ i0.ɵɵproperty("value", ctx.State.SearchQuery);
606
+ i0.ɵɵadvance();
607
+ i0.ɵɵconditional(ctx.State.IsFilterPanelExpanded ? 22 : -1);
617
608
  i0.ɵɵadvance(2);
618
- i0.ɵɵproperty("value", ctx.State.SearchQuery)("clearButton", true);
619
- i0.ɵɵadvance(2);
620
- i0.ɵɵconditional(ctx.State.IsFilterPanelExpanded ? 21 : -1);
621
- i0.ɵɵadvance(2);
622
- i0.ɵɵconditional(ctx.State.IsLoading ? 23 : ctx.State.FilteredComponents.length === 0 ? 24 : 25);
623
- } }, dependencies: [i2.NgClass, i3.ButtonComponent, i4.TextBoxComponent, i4.TextBoxPrefixTemplateDirective, i5.LoadingComponent, i2.DatePipe], styles: ["\n\n\n\n\n\n\n[_nghost-%COMP%] {\n display: flex;\n flex-direction: column;\n height: 100%;\n overflow: hidden;\n}\n\n.component-browser[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n height: 100%;\n background: var(--mj-bg-surface-sunken);\n overflow: hidden;\n}\n\n\n\n\n\n\n\n\n.browser-header[_ngcontent-%COMP%] {\n padding: 12px 14px 8px;\n border-bottom: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n flex-shrink: 0;\n}\n\n.browser-header[_ngcontent-%COMP%] .header-top-row[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: 8px;\n}\n\n.browser-header[_ngcontent-%COMP%] .header-controls-row[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.browser-header[_ngcontent-%COMP%] .component-count[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-secondary);\n margin-left: auto;\n}\n\n\n\n\n\n\n\n\n.import-dropdown[_ngcontent-%COMP%] {\n position: relative;\n}\n\n.import-dropdown[_ngcontent-%COMP%] .dropdown-chevron[_ngcontent-%COMP%] {\n margin-left: 4px;\n font-size: 10px;\n}\n\n.import-dropdown[_ngcontent-%COMP%] .dropdown-menu[_ngcontent-%COMP%] {\n position: absolute;\n top: 100%;\n left: 0;\n z-index: 1000;\n min-width: 180px;\n margin-top: 4px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 4px;\n box-shadow: var(--mj-shadow-md);\n overflow: hidden;\n}\n\n.import-dropdown[_ngcontent-%COMP%] .dropdown-menu[_ngcontent-%COMP%] .dropdown-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n width: 100%;\n padding: 8px 14px;\n border: none;\n background: none;\n font-size: 13px;\n color: var(--mj-text-primary);\n cursor: pointer;\n text-align: left;\n transition: background 0.15s;\n}\n\n.import-dropdown[_ngcontent-%COMP%] .dropdown-menu[_ngcontent-%COMP%] .dropdown-item[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-sunken);\n}\n\n.import-dropdown[_ngcontent-%COMP%] .dropdown-menu[_ngcontent-%COMP%] .dropdown-item[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n width: 16px;\n text-align: center;\n color: var(--mj-text-secondary);\n}\n\n\n\n\n\n\n\n\n.filter-toggle-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 4px;\n padding: 5px 10px;\n border: 1px solid var(--mj-border-default);\n border-radius: 4px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 13px;\n cursor: pointer;\n transition: all 0.15s;\n position: relative;\n}\n\n.filter-toggle-btn[_ngcontent-%COMP%]:hover {\n border-color: var(--mj-text-secondary);\n color: var(--mj-text-primary);\n}\n\n.filter-toggle-btn.active[_ngcontent-%COMP%] {\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n}\n\n.filter-toggle-btn[_ngcontent-%COMP%] .filter-count-badge[_ngcontent-%COMP%] {\n position: absolute;\n top: -6px;\n right: -6px;\n min-width: 16px;\n height: 16px;\n padding: 0 4px;\n border-radius: 8px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n font-size: 10px;\n font-weight: 600;\n line-height: 16px;\n text-align: center;\n}\n\n\n\n\n\n\n\n\n.search-box[_ngcontent-%COMP%] {\n padding: 8px 14px;\n flex-shrink: 0;\n}\n\n.search-box[_ngcontent-%COMP%] .search-icon[_ngcontent-%COMP%] {\n color: var(--mj-text-secondary);\n margin-left: 6px;\n}\n\n\n\n\n\n\n\n\n.filter-panel[_ngcontent-%COMP%] {\n border-bottom: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n flex-shrink: 0;\n}\n\n.filter-panel[_ngcontent-%COMP%] .filter-panel-content[_ngcontent-%COMP%] {\n padding: 8px 14px 12px;\n}\n\n.filter-section[_ngcontent-%COMP%] {\n margin-bottom: 10px;\n}\n\n.filter-section[_ngcontent-%COMP%]:last-child {\n margin-bottom: 0;\n}\n\n.filter-section[_ngcontent-%COMP%] .filter-section-label[_ngcontent-%COMP%] {\n display: block;\n font-size: 11px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n margin-bottom: 6px;\n}\n\n.filter-options[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.filter-checkbox[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 4px 6px;\n border-radius: 4px;\n cursor: pointer;\n font-size: 13px;\n color: var(--mj-text-secondary);\n transition: background 0.15s;\n}\n\n.filter-checkbox[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-sunken);\n}\n\n.filter-checkbox[_ngcontent-%COMP%] input[type=\"checkbox\"][_ngcontent-%COMP%] {\n width: 14px;\n height: 14px;\n accent-color: var(--mj-brand-primary);\n cursor: pointer;\n}\n\n.filter-checkbox[_ngcontent-%COMP%] .filter-icon[_ngcontent-%COMP%] {\n font-size: 12px;\n}\n\n.filter-checkbox[_ngcontent-%COMP%] .favorites-icon[_ngcontent-%COMP%] {\n color: var(--mj-status-warning);\n}\n\n.filter-checkbox[_ngcontent-%COMP%] .deprecated-icon[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n}\n\n.filter-checkbox[_ngcontent-%COMP%] .deprecated-count[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n font-size: 12px;\n}\n\n\n\n\n\n\n\n\n.category-pills[_ngcontent-%COMP%] {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n}\n\n.category-pill[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 3px 10px;\n border: 1px solid var(--mj-border-default);\n border-radius: 14px;\n background: var(--mj-bg-surface);\n font-size: 12px;\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: all 0.15s;\n}\n\n.category-pill[_ngcontent-%COMP%] .pill-name[_ngcontent-%COMP%] {\n max-width: 120px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.category-pill[_ngcontent-%COMP%] .pill-count[_ngcontent-%COMP%] {\n font-size: 10px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n background: var(--mj-bg-surface-sunken);\n padding: 0 5px;\n border-radius: 8px;\n line-height: 16px;\n}\n\n.category-pill[_ngcontent-%COMP%]:hover {\n border-color: var(--pill-color, var(--mj-brand-primary));\n background: var(--mj-bg-surface);\n}\n\n.category-pill.active[_ngcontent-%COMP%] {\n border-color: var(--pill-color, var(--mj-brand-primary));\n background: var(--pill-color, var(--mj-brand-primary));\n color: var(--mj-text-inverse);\n}\n\n.category-pill.active[_ngcontent-%COMP%] .pill-count[_ngcontent-%COMP%] {\n background: rgba(255, 255, 255, 0.25);\n color: var(--mj-text-inverse);\n}\n\n.show-more-btn[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n margin-top: 6px;\n padding: 2px 0;\n border: none;\n background: none;\n font-size: 12px;\n color: var(--mj-brand-primary);\n cursor: pointer;\n}\n\n.show-more-btn[_ngcontent-%COMP%]:hover {\n color: var(--mj-brand-primary);\n text-decoration: underline;\n}\n\n.filter-panel-footer[_ngcontent-%COMP%] {\n margin-top: 8px;\n padding-top: 8px;\n border-top: 1px solid var(--mj-border-default);\n}\n\n.clear-all-btn[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 4px 10px;\n border: none;\n border-radius: 4px;\n background: none;\n font-size: 12px;\n color: var(--mj-status-error);\n cursor: pointer;\n transition: background 0.15s;\n}\n\n.clear-all-btn[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-status-error) 10%, var(--mj-bg-surface));\n}\n\n\n\n\n\n\n\n\n.component-list[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n padding: 8px 10px;\n}\n\n\n\n\n\n\n\n\n.loading-state[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 40px 20px;\n}\n\n.empty-state[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 40px 20px;\n text-align: center;\n}\n\n.empty-state[_ngcontent-%COMP%] .empty-icon[_ngcontent-%COMP%] {\n font-size: 32px;\n color: var(--mj-border-default);\n margin-bottom: 12px;\n}\n\n.empty-state[_ngcontent-%COMP%] .empty-title[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n margin: 0 0 4px;\n}\n\n.empty-state[_ngcontent-%COMP%] .empty-subtitle[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--mj-text-secondary);\n margin: 0;\n}\n\n\n\n\n\n\n\n\n.component-card[_ngcontent-%COMP%] {\n margin-bottom: 6px;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n background: var(--mj-bg-surface);\n transition: all 0.15s;\n overflow: hidden;\n}\n\n.component-card[_ngcontent-%COMP%]:hover {\n box-shadow: var(--mj-shadow-sm);\n border-color: var(--mj-border-default);\n}\n\n\n\n.component-card.running[_ngcontent-%COMP%] {\n border-left: 3px solid var(--mj-status-success);\n}\n\n\n\n.component-card.file-loaded[_ngcontent-%COMP%] {\n border-style: dashed;\n border-color: var(--mj-text-muted);\n}\n\n.component-card.file-loaded[_ngcontent-%COMP%]:hover {\n border-color: var(--mj-text-secondary);\n}\n\n\n\n.component-card.expanded[_ngcontent-%COMP%] {\n border-color: var(--mj-brand-primary);\n box-shadow: var(--mj-shadow-sm);\n}\n\n.component-card.expanded.running[_ngcontent-%COMP%] {\n border-color: var(--mj-brand-primary);\n border-left: 3px solid var(--mj-status-success);\n}\n\n.component-card.expanded.file-loaded[_ngcontent-%COMP%] {\n border-style: solid;\n border-color: var(--mj-brand-primary);\n}\n\n\n\n\n\n\n\n\n.card-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-start;\n gap: 10px;\n padding: 10px 12px;\n cursor: pointer;\n user-select: none;\n}\n\n.card-header[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface);\n}\n\n.card-type-icon[_ngcontent-%COMP%] {\n flex-shrink: 0;\n width: 32px;\n height: 32px;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 16px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 4px;\n margin-top: 2px;\n}\n\n.card-body[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n}\n\n.card-title-row[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n flex-wrap: wrap;\n margin-bottom: 4px;\n}\n\n.card-name[_ngcontent-%COMP%] {\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-primary);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.file-badge[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 3px;\n padding: 1px 6px;\n border-radius: 4px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n font-size: 10px;\n font-weight: 500;\n white-space: nowrap;\n max-width: 120px;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.card-meta-row[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n flex-wrap: wrap;\n}\n\n.version-badge[_ngcontent-%COMP%] {\n font-size: 11px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n background: var(--mj-bg-surface-sunken);\n padding: 1px 6px;\n border-radius: 4px;\n}\n\n.status-badge[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n padding: 1px 7px;\n border-radius: 4px;\n font-size: 10px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.3px;\n}\n\n.status-badge.published[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n}\n\n.status-badge.draft[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n.status-badge.deprecated[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n}\n\n.status-badge.file[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-warning) 15%, var(--mj-bg-surface));\n color: var(--mj-status-warning);\n}\n\n.status-badge.text[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n.status-badge.artifact[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n.namespace-chip[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 3px;\n padding: 1px 7px;\n border-radius: 10px;\n font-size: 10px;\n font-weight: 500;\n color: var(--mj-text-inverse);\n max-width: 160px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.namespace-chip[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 9px;\n opacity: 0.8;\n}\n\n\n\n\n\n\n\n\n.card-end[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 2px;\n flex-shrink: 0;\n margin-top: 2px;\n}\n\n.favorite-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n border: none;\n border-radius: 4px;\n background: none;\n color: var(--mj-border-default);\n font-size: 14px;\n cursor: pointer;\n transition: all 0.15s;\n}\n\n.favorite-btn[_ngcontent-%COMP%]:hover {\n color: var(--mj-status-warning);\n background: color-mix(in srgb, var(--mj-status-warning) 10%, var(--mj-bg-surface));\n}\n\n.favorite-btn.is-favorite[_ngcontent-%COMP%] {\n color: var(--mj-status-warning);\n}\n\n.remove-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n border: none;\n border-radius: 4px;\n background: none;\n color: var(--mj-border-default);\n font-size: 12px;\n cursor: pointer;\n transition: all 0.15s;\n}\n\n.remove-btn[_ngcontent-%COMP%]:hover {\n color: var(--mj-status-error);\n background: color-mix(in srgb, var(--mj-status-error) 10%, var(--mj-bg-surface));\n}\n\n.card-chevron[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n color: var(--mj-text-secondary);\n font-size: 11px;\n}\n\n\n\n\n\n\n\n\n.card-details[_ngcontent-%COMP%] {\n padding: 0 12px 12px;\n border-top: 1px solid var(--mj-border-default);\n}\n\n.detail-description[_ngcontent-%COMP%] {\n padding: 8px 0;\n}\n\n.detail-description[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 13px;\n color: var(--mj-text-secondary);\n line-height: 1.5;\n}\n\n.detail-info-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 6px 16px;\n padding: 8px 0;\n}\n\n.detail-info-grid[_ngcontent-%COMP%] .info-item[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 1px;\n}\n\n.detail-info-grid[_ngcontent-%COMP%] .info-label[_ngcontent-%COMP%] {\n font-size: 10px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.4px;\n}\n\n.detail-info-grid[_ngcontent-%COMP%] .info-value[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--mj-text-primary);\n}\n\n.detail-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n padding-top: 8px;\n border-top: 1px solid var(--mj-border-default);\n}"] });
609
+ i0.ɵɵconditional(ctx.State.IsLoading ? 24 : ctx.State.FilteredComponents.length === 0 ? 25 : 26);
610
+ } }, dependencies: [i2.NgClass, i3.LoadingComponent, i4.MJButtonDirective, i2.DatePipe], styles: ["\n\n\n\n\n\n\n[_nghost-%COMP%] {\n display: flex;\n flex-direction: column;\n height: 100%;\n overflow: hidden;\n}\n\n.component-browser[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n height: 100%;\n background: var(--mj-bg-surface-sunken);\n overflow: hidden;\n}\n\n\n\n\n\n\n\n\n.browser-header[_ngcontent-%COMP%] {\n padding: 12px 14px 8px;\n border-bottom: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n flex-shrink: 0;\n}\n\n.browser-header[_ngcontent-%COMP%] .header-top-row[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: 8px;\n}\n\n.browser-header[_ngcontent-%COMP%] .header-controls-row[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.browser-header[_ngcontent-%COMP%] .component-count[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-secondary);\n margin-left: auto;\n}\n\n\n\n\n\n\n\n\n.import-dropdown[_ngcontent-%COMP%] {\n position: relative;\n}\n\n.import-dropdown[_ngcontent-%COMP%] .dropdown-chevron[_ngcontent-%COMP%] {\n margin-left: 4px;\n font-size: 10px;\n}\n\n.import-dropdown[_ngcontent-%COMP%] .dropdown-menu[_ngcontent-%COMP%] {\n position: absolute;\n top: 100%;\n left: 0;\n z-index: 1000;\n min-width: 180px;\n margin-top: 4px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 4px;\n box-shadow: var(--mj-shadow-md);\n overflow: hidden;\n}\n\n.import-dropdown[_ngcontent-%COMP%] .dropdown-menu[_ngcontent-%COMP%] .dropdown-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n width: 100%;\n padding: 8px 14px;\n border: none;\n background: none;\n font-size: 13px;\n color: var(--mj-text-primary);\n cursor: pointer;\n text-align: left;\n transition: background 0.15s;\n}\n\n.import-dropdown[_ngcontent-%COMP%] .dropdown-menu[_ngcontent-%COMP%] .dropdown-item[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-sunken);\n}\n\n.import-dropdown[_ngcontent-%COMP%] .dropdown-menu[_ngcontent-%COMP%] .dropdown-item[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n width: 16px;\n text-align: center;\n color: var(--mj-text-secondary);\n}\n\n\n\n\n\n\n\n\n.filter-toggle-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 4px;\n padding: 5px 10px;\n border: 1px solid var(--mj-border-default);\n border-radius: 4px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 13px;\n cursor: pointer;\n transition: all 0.15s;\n position: relative;\n}\n\n.filter-toggle-btn[_ngcontent-%COMP%]:hover {\n border-color: var(--mj-text-secondary);\n color: var(--mj-text-primary);\n}\n\n.filter-toggle-btn.active[_ngcontent-%COMP%] {\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n}\n\n.filter-toggle-btn[_ngcontent-%COMP%] .filter-count-badge[_ngcontent-%COMP%] {\n position: absolute;\n top: -6px;\n right: -6px;\n min-width: 16px;\n height: 16px;\n padding: 0 4px;\n border-radius: 8px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n font-size: 10px;\n font-weight: 600;\n line-height: 16px;\n text-align: center;\n}\n\n\n\n\n\n\n\n\n.search-box[_ngcontent-%COMP%] {\n padding: 8px 14px;\n flex-shrink: 0;\n}\n\n.search-box[_ngcontent-%COMP%] .search-icon[_ngcontent-%COMP%] {\n color: var(--mj-text-secondary);\n margin-left: 6px;\n}\n\n\n\n\n\n\n\n\n.filter-panel[_ngcontent-%COMP%] {\n border-bottom: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n flex-shrink: 0;\n}\n\n.filter-panel[_ngcontent-%COMP%] .filter-panel-content[_ngcontent-%COMP%] {\n padding: 8px 14px 12px;\n}\n\n.filter-section[_ngcontent-%COMP%] {\n margin-bottom: 10px;\n}\n\n.filter-section[_ngcontent-%COMP%]:last-child {\n margin-bottom: 0;\n}\n\n.filter-section[_ngcontent-%COMP%] .filter-section-label[_ngcontent-%COMP%] {\n display: block;\n font-size: 11px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n margin-bottom: 6px;\n}\n\n.filter-options[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.filter-checkbox[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 4px 6px;\n border-radius: 4px;\n cursor: pointer;\n font-size: 13px;\n color: var(--mj-text-secondary);\n transition: background 0.15s;\n}\n\n.filter-checkbox[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-sunken);\n}\n\n.filter-checkbox[_ngcontent-%COMP%] input[type=\"checkbox\"][_ngcontent-%COMP%] {\n width: 14px;\n height: 14px;\n accent-color: var(--mj-brand-primary);\n cursor: pointer;\n}\n\n.filter-checkbox[_ngcontent-%COMP%] .filter-icon[_ngcontent-%COMP%] {\n font-size: 12px;\n}\n\n.filter-checkbox[_ngcontent-%COMP%] .favorites-icon[_ngcontent-%COMP%] {\n color: var(--mj-status-warning);\n}\n\n.filter-checkbox[_ngcontent-%COMP%] .deprecated-icon[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n}\n\n.filter-checkbox[_ngcontent-%COMP%] .deprecated-count[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n font-size: 12px;\n}\n\n\n\n\n\n\n\n\n.category-pills[_ngcontent-%COMP%] {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n}\n\n.category-pill[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 3px 10px;\n border: 1px solid var(--mj-border-default);\n border-radius: 14px;\n background: var(--mj-bg-surface);\n font-size: 12px;\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: all 0.15s;\n}\n\n.category-pill[_ngcontent-%COMP%] .pill-name[_ngcontent-%COMP%] {\n max-width: 120px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.category-pill[_ngcontent-%COMP%] .pill-count[_ngcontent-%COMP%] {\n font-size: 10px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n background: var(--mj-bg-surface-sunken);\n padding: 0 5px;\n border-radius: 8px;\n line-height: 16px;\n}\n\n.category-pill[_ngcontent-%COMP%]:hover {\n border-color: var(--pill-color, var(--mj-brand-primary));\n background: var(--mj-bg-surface);\n}\n\n.category-pill.active[_ngcontent-%COMP%] {\n border-color: var(--pill-color, var(--mj-brand-primary));\n background: var(--pill-color, var(--mj-brand-primary));\n color: var(--mj-text-inverse);\n}\n\n.category-pill.active[_ngcontent-%COMP%] .pill-count[_ngcontent-%COMP%] {\n background: rgba(255, 255, 255, 0.25);\n color: var(--mj-text-inverse);\n}\n\n.show-more-btn[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n margin-top: 6px;\n padding: 2px 0;\n border: none;\n background: none;\n font-size: 12px;\n color: var(--mj-brand-primary);\n cursor: pointer;\n}\n\n.show-more-btn[_ngcontent-%COMP%]:hover {\n color: var(--mj-brand-primary);\n text-decoration: underline;\n}\n\n.filter-panel-footer[_ngcontent-%COMP%] {\n margin-top: 8px;\n padding-top: 8px;\n border-top: 1px solid var(--mj-border-default);\n}\n\n.clear-all-btn[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 4px 10px;\n border: none;\n border-radius: 4px;\n background: none;\n font-size: 12px;\n color: var(--mj-status-error);\n cursor: pointer;\n transition: background 0.15s;\n}\n\n.clear-all-btn[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-status-error) 10%, var(--mj-bg-surface));\n}\n\n\n\n\n\n\n\n\n.component-list[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n padding: 8px 10px;\n}\n\n\n\n\n\n\n\n\n.loading-state[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 40px 20px;\n}\n\n.empty-state[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 40px 20px;\n text-align: center;\n}\n\n.empty-state[_ngcontent-%COMP%] .empty-icon[_ngcontent-%COMP%] {\n font-size: 32px;\n color: var(--mj-border-default);\n margin-bottom: 12px;\n}\n\n.empty-state[_ngcontent-%COMP%] .empty-title[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n margin: 0 0 4px;\n}\n\n.empty-state[_ngcontent-%COMP%] .empty-subtitle[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--mj-text-secondary);\n margin: 0;\n}\n\n\n\n\n\n\n\n\n.component-card[_ngcontent-%COMP%] {\n margin-bottom: 6px;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n background: var(--mj-bg-surface);\n transition: all 0.15s;\n overflow: hidden;\n}\n\n.component-card[_ngcontent-%COMP%]:hover {\n box-shadow: var(--mj-shadow-sm);\n border-color: var(--mj-border-default);\n}\n\n\n\n.component-card.running[_ngcontent-%COMP%] {\n border-left: 3px solid var(--mj-status-success);\n}\n\n\n\n.component-card.file-loaded[_ngcontent-%COMP%] {\n border-style: dashed;\n border-color: var(--mj-text-muted);\n}\n\n.component-card.file-loaded[_ngcontent-%COMP%]:hover {\n border-color: var(--mj-text-secondary);\n}\n\n\n\n.component-card.expanded[_ngcontent-%COMP%] {\n border-color: var(--mj-brand-primary);\n box-shadow: var(--mj-shadow-sm);\n}\n\n.component-card.expanded.running[_ngcontent-%COMP%] {\n border-color: var(--mj-brand-primary);\n border-left: 3px solid var(--mj-status-success);\n}\n\n.component-card.expanded.file-loaded[_ngcontent-%COMP%] {\n border-style: solid;\n border-color: var(--mj-brand-primary);\n}\n\n\n\n\n\n\n\n\n.card-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-start;\n gap: 10px;\n padding: 10px 12px;\n cursor: pointer;\n user-select: none;\n}\n\n.card-header[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface);\n}\n\n.card-type-icon[_ngcontent-%COMP%] {\n flex-shrink: 0;\n width: 32px;\n height: 32px;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 16px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 4px;\n margin-top: 2px;\n}\n\n.card-body[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n}\n\n.card-title-row[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n flex-wrap: wrap;\n margin-bottom: 4px;\n}\n\n.card-name[_ngcontent-%COMP%] {\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-primary);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.file-badge[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 3px;\n padding: 1px 6px;\n border-radius: 4px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n font-size: 10px;\n font-weight: 500;\n white-space: nowrap;\n max-width: 120px;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.card-meta-row[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n flex-wrap: wrap;\n}\n\n.version-badge[_ngcontent-%COMP%] {\n font-size: 11px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n background: var(--mj-bg-surface-sunken);\n padding: 1px 6px;\n border-radius: 4px;\n}\n\n.status-badge[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n padding: 1px 7px;\n border-radius: 4px;\n font-size: 10px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.3px;\n}\n\n.status-badge.published[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n}\n\n.status-badge.draft[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n.status-badge.deprecated[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n}\n\n.status-badge.file[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-warning) 15%, var(--mj-bg-surface));\n color: var(--mj-status-warning);\n}\n\n.status-badge.text[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n.status-badge.artifact[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n.namespace-chip[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 3px;\n padding: 1px 7px;\n border-radius: 10px;\n font-size: 10px;\n font-weight: 500;\n color: var(--mj-text-inverse);\n max-width: 160px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.namespace-chip[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 9px;\n opacity: 0.8;\n}\n\n\n\n\n\n\n\n\n.card-end[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 2px;\n flex-shrink: 0;\n margin-top: 2px;\n}\n\n.favorite-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n border: none;\n border-radius: 4px;\n background: none;\n color: var(--mj-border-default);\n font-size: 14px;\n cursor: pointer;\n transition: all 0.15s;\n}\n\n.favorite-btn[_ngcontent-%COMP%]:hover {\n color: var(--mj-status-warning);\n background: color-mix(in srgb, var(--mj-status-warning) 10%, var(--mj-bg-surface));\n}\n\n.favorite-btn.is-favorite[_ngcontent-%COMP%] {\n color: var(--mj-status-warning);\n}\n\n.remove-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n border: none;\n border-radius: 4px;\n background: none;\n color: var(--mj-border-default);\n font-size: 12px;\n cursor: pointer;\n transition: all 0.15s;\n}\n\n.remove-btn[_ngcontent-%COMP%]:hover {\n color: var(--mj-status-error);\n background: color-mix(in srgb, var(--mj-status-error) 10%, var(--mj-bg-surface));\n}\n\n.card-chevron[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n color: var(--mj-text-secondary);\n font-size: 11px;\n}\n\n\n\n\n\n\n\n\n.card-details[_ngcontent-%COMP%] {\n padding: 0 12px 12px;\n border-top: 1px solid var(--mj-border-default);\n}\n\n.detail-description[_ngcontent-%COMP%] {\n padding: 8px 0;\n}\n\n.detail-description[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 13px;\n color: var(--mj-text-secondary);\n line-height: 1.5;\n}\n\n.detail-info-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 6px 16px;\n padding: 8px 0;\n}\n\n.detail-info-grid[_ngcontent-%COMP%] .info-item[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 1px;\n}\n\n.detail-info-grid[_ngcontent-%COMP%] .info-label[_ngcontent-%COMP%] {\n font-size: 10px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.4px;\n}\n\n.detail-info-grid[_ngcontent-%COMP%] .info-value[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--mj-text-primary);\n}\n\n.detail-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n padding-top: 8px;\n border-top: 1px solid var(--mj-border-default);\n}"] });
624
611
  }
625
612
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ComponentBrowserComponent, [{
626
613
  type: Component,
627
- args: [{ standalone: false, selector: 'mj-component-browser', template: "<div class=\"component-browser\">\n\n <!-- Header -->\n <div class=\"browser-header\">\n <div class=\"header-top-row\">\n <button kendoButton\n [themeColor]=\"'primary'\"\n (click)=\"OnNewComponent()\">\n <i class=\"fa-solid fa-plus\"></i> New Component\n </button>\n <div class=\"import-dropdown\" [class.open]=\"ImportDropdownOpen\">\n <button kendoButton\n [themeColor]=\"'base'\"\n (click)=\"ToggleImportDropdown()\">\n <i class=\"fa-solid fa-file-import\"></i> Import\n <i class=\"fa-solid fa-chevron-down dropdown-chevron\"></i>\n </button>\n @if (ImportDropdownOpen) {\n <div class=\"dropdown-menu\">\n <button class=\"dropdown-item\" (click)=\"OnImportFromArtifact()\">\n <i class=\"fa-solid fa-database\"></i> From Artifact\n </button>\n <button class=\"dropdown-item\" (click)=\"OnImportFromFile()\">\n <i class=\"fa-solid fa-file\"></i> From File\n </button>\n <button class=\"dropdown-item\" (click)=\"OnImportFromText()\">\n <i class=\"fa-solid fa-keyboard\"></i> From Text\n </button>\n </div>\n }\n </div>\n </div>\n\n <div class=\"header-controls-row\">\n <button\n class=\"filter-toggle-btn\"\n [class.active]=\"State.IsFilterPanelExpanded || State.GetActiveFilterCount() > 0\"\n (click)=\"State.ToggleFilterPanel()\"\n [title]=\"State.IsFilterPanelExpanded ? 'Hide filters' : 'Show filters'\">\n <i class=\"fa-solid fa-sliders\"></i>\n @if (State.GetActiveFilterCount() > 0) {\n <span class=\"filter-count-badge\">{{ State.GetActiveFilterCount() }}</span>\n }\n </button>\n <span class=\"component-count\">\n {{ State.FilteredComponents.length }} of {{ State.AllComponents.length }}\n </span>\n </div>\n </div>\n\n <!-- Search -->\n <div class=\"search-box\">\n <kendo-textbox\n [value]=\"State.SearchQuery\"\n (valueChange)=\"OnSearchChange($event)\"\n placeholder=\"Search components...\"\n [clearButton]=\"true\">\n <ng-template kendoTextBoxPrefixTemplate>\n <i class=\"fa-solid fa-search search-icon\"></i>\n </ng-template>\n </kendo-textbox>\n </div>\n\n <!-- Collapsible Filter Panel -->\n @if (State.IsFilterPanelExpanded) {\n <div class=\"filter-panel\">\n <div class=\"filter-panel-content\">\n\n <!-- Quick Filters -->\n <div class=\"filter-section\">\n <label class=\"filter-section-label\">Quick Filters</label>\n <div class=\"filter-options\">\n <label class=\"filter-checkbox\">\n <input type=\"checkbox\"\n [checked]=\"State.ShowOnlyFavorites\"\n (change)=\"State.ToggleShowOnlyFavorites()\">\n <i class=\"fa-solid fa-star filter-icon favorites-icon\"></i>\n <span>Favorites only</span>\n </label>\n <label class=\"filter-checkbox\">\n <input type=\"checkbox\"\n [checked]=\"State.ShowDeprecatedComponents\"\n (change)=\"State.ToggleShowDeprecatedComponents()\">\n <i class=\"fa-solid fa-archive filter-icon deprecated-icon\"></i>\n <span>Show deprecated\n @if (State.GetDeprecatedCount() > 0) {\n <span class=\"deprecated-count\">({{ State.GetDeprecatedCount() }})</span>\n }\n </span>\n </label>\n </div>\n </div>\n\n <!-- Category Pills -->\n @if (State.AvailableCategories.length > 0) {\n <div class=\"filter-section\">\n <label class=\"filter-section-label\">Categories</label>\n <div class=\"category-pills\">\n @for (category of State.GetVisibleCategories(); track TrackByCategoryName($index, category)) {\n <button\n class=\"category-pill\"\n [class.active]=\"State.IsCategorySelected(category.name)\"\n [style.--pill-color]=\"category.color\"\n (click)=\"State.ToggleCategory(category.name)\">\n <span class=\"pill-name\">{{ category.name }}</span>\n <span class=\"pill-count\">{{ category.count }}</span>\n </button>\n }\n </div>\n @if (State.AvailableCategories.length > 5) {\n <button\n class=\"show-more-btn\"\n (click)=\"State.ToggleShowAllCategories()\">\n @if (State.ShowAllCategories) {\n <i class=\"fa-solid fa-chevron-up\"></i> Show less\n } @else {\n <i class=\"fa-solid fa-chevron-down\"></i> Show {{ State.AvailableCategories.length - 5 }} more\n }\n </button>\n }\n </div>\n }\n\n <!-- Clear All -->\n @if (State.GetActiveFilterCount() > 0) {\n <div class=\"filter-panel-footer\">\n <button class=\"clear-all-btn\" (click)=\"State.ClearAllFilters()\">\n <i class=\"fa-solid fa-times\"></i> Clear All Filters\n </button>\n </div>\n }\n </div>\n </div>\n }\n\n <!-- Component Card List -->\n <div class=\"component-list\">\n @if (State.IsLoading) {\n <div class=\"loading-state\">\n <mj-loading text=\"Loading components...\" size=\"small\"></mj-loading>\n </div>\n } @else if (State.FilteredComponents.length === 0) {\n <div class=\"empty-state\">\n @if (State.AllComponents.length === 0) {\n <i class=\"fa-solid fa-puzzle-piece empty-icon\"></i>\n <p class=\"empty-title\">No components found</p>\n <p class=\"empty-subtitle\">Create a new component or import one to get started.</p>\n } @else {\n <i class=\"fa-solid fa-filter empty-icon\"></i>\n <p class=\"empty-title\">No matching components</p>\n <p class=\"empty-subtitle\">Try adjusting your search or filters.</p>\n }\n </div>\n } @else {\n @for (component of State.FilteredComponents; track TrackByComponentId($index, component)) {\n <div class=\"component-card\"\n [class.expanded]=\"IsExpanded(component)\"\n [class.running]=\"IsComponentRunning(component)\"\n [class.file-loaded]=\"State.IsFileLoadedComponent(component)\">\n\n <!-- Card Header (always visible) -->\n <div class=\"card-header\" (click)=\"ToggleComponentExpansion(component)\">\n <div class=\"card-type-icon\"\n [style.color]=\"State.GetComponentTypeColor(State.GetComponentType(component))\">\n <i class=\"fa-solid\"\n [ngClass]=\"State.GetComponentTypeIcon(State.GetComponentType(component))\"></i>\n </div>\n\n <div class=\"card-body\">\n <div class=\"card-title-row\">\n <span class=\"card-name\">{{ State.GetComponentName(component) }}</span>\n @if (State.IsFileLoadedComponent(component)) {\n <span class=\"file-badge\" [title]=\"GetFileBadgeTooltip(component)\">\n <i class=\"fa-solid\" [ngClass]=\"GetFileBadgeIcon(component)\"></i>\n {{ GetFileBadgeLabel(component) }}\n </span>\n }\n </div>\n <div class=\"card-meta-row\">\n <span class=\"version-badge\">v{{ State.GetComponentVersion(component) }}</span>\n <span class=\"status-badge\" [ngClass]=\"GetStatusBadgeClass(component)\">\n {{ GetStatusLabel(component) }}\n </span>\n <span class=\"namespace-chip\"\n [style.background-color]=\"State.GetNamespaceColor(State.GetComponentNamespace(component))\"\n [title]=\"State.GetComponentNamespace(component) || 'Uncategorized'\">\n <i class=\"fa-solid fa-folder-tree\"></i>\n {{ State.FormatNamespace(State.GetComponentNamespace(component)) }}\n </span>\n </div>\n </div>\n\n <div class=\"card-end\">\n @if (!State.IsFileLoadedComponent(component)) {\n <button\n class=\"favorite-btn\"\n [class.is-favorite]=\"State.IsFavorite(component)\"\n (click)=\"OnToggleFavorite(component, $event)\"\n [title]=\"State.IsFavorite(component) ? 'Remove from favorites' : 'Add to favorites'\">\n @if (State.IsFavorite(component)) {\n <i class=\"fa-solid fa-star\"></i>\n } @else {\n <i class=\"fa-regular fa-star\"></i>\n }\n </button>\n }\n @if (State.IsFileLoadedComponent(component)) {\n <button\n class=\"remove-btn\"\n (click)=\"OnRemoveFileComponent($any(component), $event)\"\n title=\"Remove imported component\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n }\n <div class=\"card-chevron\">\n @if (IsExpanded(component)) {\n <i class=\"fa-solid fa-chevron-up\"></i>\n } @else {\n <i class=\"fa-solid fa-chevron-down\"></i>\n }\n </div>\n </div>\n </div>\n\n <!-- Card Details (expanded) -->\n @if (IsExpanded(component)) {\n <div class=\"card-details\">\n @if (State.GetComponentDescription(component)) {\n <div class=\"detail-description\">\n <p>{{ State.GetComponentDescription(component) }}</p>\n </div>\n }\n\n <div class=\"detail-info-grid\">\n <div class=\"info-item\">\n <span class=\"info-label\">Type</span>\n <span class=\"info-value\">{{ State.GetComponentType(component) || 'Unknown' }}</span>\n </div>\n <div class=\"info-item\">\n <span class=\"info-label\">Version</span>\n <span class=\"info-value\">{{ State.GetComponentVersion(component) }}</span>\n </div>\n <div class=\"info-item\">\n <span class=\"info-label\">Status</span>\n <span class=\"info-value\">{{ State.GetComponentStatus(component) || 'Draft' }}</span>\n </div>\n @if (State.IsFileLoadedComponent(component)) {\n <div class=\"info-item\">\n <span class=\"info-label\">Loaded</span>\n <span class=\"info-value\">{{ State.GetComponentLoadedAt(component) | date:'short' }}</span>\n </div>\n } @else if (State.GetComponentUpdatedAt(component)) {\n <div class=\"info-item\">\n <span class=\"info-label\">Updated</span>\n <span class=\"info-value\">{{ State.GetComponentUpdatedAt(component) | date:'short' }}</span>\n </div>\n }\n </div>\n\n <div class=\"detail-actions\">\n @if (IsComponentRunning(component)) {\n <button kendoButton\n [themeColor]=\"'error'\"\n (click)=\"OnStopComponent($event)\">\n <i class=\"fa-solid fa-stop\"></i> Stop\n </button>\n } @else if (IsAnotherComponentRunning(component)) {\n <button kendoButton\n [themeColor]=\"'base'\"\n title=\"Stop current component and run this one\"\n (click)=\"OnSwitchComponent(component, $event)\">\n <i class=\"fa-solid fa-exchange-alt\"></i> Switch To This\n </button>\n } @else {\n <button kendoButton\n [themeColor]=\"'primary'\"\n (click)=\"OnRunComponent(component, $event)\">\n <i class=\"fa-solid fa-play\"></i> Run\n </button>\n }\n </div>\n </div>\n }\n </div>\n }\n }\n </div>\n</div>\n", styles: ["/* ============================================================ */\n/* Component Browser - Left Panel */\n/* ============================================================ */\n\n:host {\n display: flex;\n flex-direction: column;\n height: 100%;\n overflow: hidden;\n}\n\n.component-browser {\n display: flex;\n flex-direction: column;\n height: 100%;\n background: var(--mj-bg-surface-sunken);\n overflow: hidden;\n}\n\n/* ============================================================ */\n/* Header */\n/* ============================================================ */\n\n.browser-header {\n padding: 12px 14px 8px;\n border-bottom: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n flex-shrink: 0;\n}\n\n.browser-header .header-top-row {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: 8px;\n}\n\n.browser-header .header-controls-row {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.browser-header .component-count {\n font-size: 12px;\n color: var(--mj-text-secondary);\n margin-left: auto;\n}\n\n/* ============================================================ */\n/* Import Dropdown */\n/* ============================================================ */\n\n.import-dropdown {\n position: relative;\n}\n\n.import-dropdown .dropdown-chevron {\n margin-left: 4px;\n font-size: 10px;\n}\n\n.import-dropdown .dropdown-menu {\n position: absolute;\n top: 100%;\n left: 0;\n z-index: 1000;\n min-width: 180px;\n margin-top: 4px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 4px;\n box-shadow: var(--mj-shadow-md);\n overflow: hidden;\n}\n\n.import-dropdown .dropdown-menu .dropdown-item {\n display: flex;\n align-items: center;\n gap: 8px;\n width: 100%;\n padding: 8px 14px;\n border: none;\n background: none;\n font-size: 13px;\n color: var(--mj-text-primary);\n cursor: pointer;\n text-align: left;\n transition: background 0.15s;\n}\n\n.import-dropdown .dropdown-menu .dropdown-item:hover {\n background: var(--mj-bg-surface-sunken);\n}\n\n.import-dropdown .dropdown-menu .dropdown-item i {\n width: 16px;\n text-align: center;\n color: var(--mj-text-secondary);\n}\n\n/* ============================================================ */\n/* Filter Toggle Button */\n/* ============================================================ */\n\n.filter-toggle-btn {\n display: flex;\n align-items: center;\n gap: 4px;\n padding: 5px 10px;\n border: 1px solid var(--mj-border-default);\n border-radius: 4px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 13px;\n cursor: pointer;\n transition: all 0.15s;\n position: relative;\n}\n\n.filter-toggle-btn:hover {\n border-color: var(--mj-text-secondary);\n color: var(--mj-text-primary);\n}\n\n.filter-toggle-btn.active {\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n}\n\n.filter-toggle-btn .filter-count-badge {\n position: absolute;\n top: -6px;\n right: -6px;\n min-width: 16px;\n height: 16px;\n padding: 0 4px;\n border-radius: 8px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n font-size: 10px;\n font-weight: 600;\n line-height: 16px;\n text-align: center;\n}\n\n/* ============================================================ */\n/* Search Box */\n/* ============================================================ */\n\n.search-box {\n padding: 8px 14px;\n flex-shrink: 0;\n}\n\n.search-box .search-icon {\n color: var(--mj-text-secondary);\n margin-left: 6px;\n}\n\n/* ============================================================ */\n/* Filter Panel */\n/* ============================================================ */\n\n.filter-panel {\n border-bottom: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n flex-shrink: 0;\n}\n\n.filter-panel .filter-panel-content {\n padding: 8px 14px 12px;\n}\n\n.filter-section {\n margin-bottom: 10px;\n}\n\n.filter-section:last-child {\n margin-bottom: 0;\n}\n\n.filter-section .filter-section-label {\n display: block;\n font-size: 11px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n margin-bottom: 6px;\n}\n\n.filter-options {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.filter-checkbox {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 4px 6px;\n border-radius: 4px;\n cursor: pointer;\n font-size: 13px;\n color: var(--mj-text-secondary);\n transition: background 0.15s;\n}\n\n.filter-checkbox:hover {\n background: var(--mj-bg-surface-sunken);\n}\n\n.filter-checkbox input[type=\"checkbox\"] {\n width: 14px;\n height: 14px;\n accent-color: var(--mj-brand-primary);\n cursor: pointer;\n}\n\n.filter-checkbox .filter-icon {\n font-size: 12px;\n}\n\n.filter-checkbox .favorites-icon {\n color: var(--mj-status-warning);\n}\n\n.filter-checkbox .deprecated-icon {\n color: var(--mj-text-muted);\n}\n\n.filter-checkbox .deprecated-count {\n color: var(--mj-text-muted);\n font-size: 12px;\n}\n\n/* ============================================================ */\n/* Category Pills */\n/* ============================================================ */\n\n.category-pills {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n}\n\n.category-pill {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 3px 10px;\n border: 1px solid var(--mj-border-default);\n border-radius: 14px;\n background: var(--mj-bg-surface);\n font-size: 12px;\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: all 0.15s;\n}\n\n.category-pill .pill-name {\n max-width: 120px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.category-pill .pill-count {\n font-size: 10px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n background: var(--mj-bg-surface-sunken);\n padding: 0 5px;\n border-radius: 8px;\n line-height: 16px;\n}\n\n.category-pill:hover {\n border-color: var(--pill-color, var(--mj-brand-primary));\n background: var(--mj-bg-surface);\n}\n\n.category-pill.active {\n border-color: var(--pill-color, var(--mj-brand-primary));\n background: var(--pill-color, var(--mj-brand-primary));\n color: var(--mj-text-inverse);\n}\n\n.category-pill.active .pill-count {\n background: rgba(255, 255, 255, 0.25);\n color: var(--mj-text-inverse);\n}\n\n.show-more-btn {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n margin-top: 6px;\n padding: 2px 0;\n border: none;\n background: none;\n font-size: 12px;\n color: var(--mj-brand-primary);\n cursor: pointer;\n}\n\n.show-more-btn:hover {\n color: var(--mj-brand-primary);\n text-decoration: underline;\n}\n\n.filter-panel-footer {\n margin-top: 8px;\n padding-top: 8px;\n border-top: 1px solid var(--mj-border-default);\n}\n\n.clear-all-btn {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 4px 10px;\n border: none;\n border-radius: 4px;\n background: none;\n font-size: 12px;\n color: var(--mj-status-error);\n cursor: pointer;\n transition: background 0.15s;\n}\n\n.clear-all-btn:hover {\n background: color-mix(in srgb, var(--mj-status-error) 10%, var(--mj-bg-surface));\n}\n\n/* ============================================================ */\n/* Component List (scrollable) */\n/* ============================================================ */\n\n.component-list {\n flex: 1;\n overflow-y: auto;\n padding: 8px 10px;\n}\n\n/* ============================================================ */\n/* Loading & Empty States */\n/* ============================================================ */\n\n.loading-state {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 40px 20px;\n}\n\n.empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 40px 20px;\n text-align: center;\n}\n\n.empty-state .empty-icon {\n font-size: 32px;\n color: var(--mj-border-default);\n margin-bottom: 12px;\n}\n\n.empty-state .empty-title {\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n margin: 0 0 4px;\n}\n\n.empty-state .empty-subtitle {\n font-size: 13px;\n color: var(--mj-text-secondary);\n margin: 0;\n}\n\n/* ============================================================ */\n/* Component Card */\n/* ============================================================ */\n\n.component-card {\n margin-bottom: 6px;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n background: var(--mj-bg-surface);\n transition: all 0.15s;\n overflow: hidden;\n}\n\n.component-card:hover {\n box-shadow: var(--mj-shadow-sm);\n border-color: var(--mj-border-default);\n}\n\n/* Running state: green left border */\n.component-card.running {\n border-left: 3px solid var(--mj-status-success);\n}\n\n/* File-loaded state: dashed border */\n.component-card.file-loaded {\n border-style: dashed;\n border-color: var(--mj-text-muted);\n}\n\n.component-card.file-loaded:hover {\n border-color: var(--mj-text-secondary);\n}\n\n/* Expanded state: blue border */\n.component-card.expanded {\n border-color: var(--mj-brand-primary);\n box-shadow: var(--mj-shadow-sm);\n}\n\n.component-card.expanded.running {\n border-color: var(--mj-brand-primary);\n border-left: 3px solid var(--mj-status-success);\n}\n\n.component-card.expanded.file-loaded {\n border-style: solid;\n border-color: var(--mj-brand-primary);\n}\n\n/* ============================================================ */\n/* Card Header */\n/* ============================================================ */\n\n.card-header {\n display: flex;\n align-items: flex-start;\n gap: 10px;\n padding: 10px 12px;\n cursor: pointer;\n user-select: none;\n}\n\n.card-header:hover {\n background: var(--mj-bg-surface);\n}\n\n.card-type-icon {\n flex-shrink: 0;\n width: 32px;\n height: 32px;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 16px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 4px;\n margin-top: 2px;\n}\n\n.card-body {\n flex: 1;\n min-width: 0;\n}\n\n.card-title-row {\n display: flex;\n align-items: center;\n gap: 6px;\n flex-wrap: wrap;\n margin-bottom: 4px;\n}\n\n.card-name {\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-primary);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.file-badge {\n display: inline-flex;\n align-items: center;\n gap: 3px;\n padding: 1px 6px;\n border-radius: 4px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n font-size: 10px;\n font-weight: 500;\n white-space: nowrap;\n max-width: 120px;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.card-meta-row {\n display: flex;\n align-items: center;\n gap: 6px;\n flex-wrap: wrap;\n}\n\n.version-badge {\n font-size: 11px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n background: var(--mj-bg-surface-sunken);\n padding: 1px 6px;\n border-radius: 4px;\n}\n\n.status-badge {\n display: inline-flex;\n align-items: center;\n padding: 1px 7px;\n border-radius: 4px;\n font-size: 10px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.3px;\n}\n\n.status-badge.published {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n}\n\n.status-badge.draft {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n.status-badge.deprecated {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n}\n\n.status-badge.file {\n background: color-mix(in srgb, var(--mj-status-warning) 15%, var(--mj-bg-surface));\n color: var(--mj-status-warning);\n}\n\n.status-badge.text {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n.status-badge.artifact {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n.namespace-chip {\n display: inline-flex;\n align-items: center;\n gap: 3px;\n padding: 1px 7px;\n border-radius: 10px;\n font-size: 10px;\n font-weight: 500;\n color: var(--mj-text-inverse);\n max-width: 160px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.namespace-chip i {\n font-size: 9px;\n opacity: 0.8;\n}\n\n/* ============================================================ */\n/* Card End (favorite, remove, chevron) */\n/* ============================================================ */\n\n.card-end {\n display: flex;\n align-items: center;\n gap: 2px;\n flex-shrink: 0;\n margin-top: 2px;\n}\n\n.favorite-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n border: none;\n border-radius: 4px;\n background: none;\n color: var(--mj-border-default);\n font-size: 14px;\n cursor: pointer;\n transition: all 0.15s;\n}\n\n.favorite-btn:hover {\n color: var(--mj-status-warning);\n background: color-mix(in srgb, var(--mj-status-warning) 10%, var(--mj-bg-surface));\n}\n\n.favorite-btn.is-favorite {\n color: var(--mj-status-warning);\n}\n\n.remove-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n border: none;\n border-radius: 4px;\n background: none;\n color: var(--mj-border-default);\n font-size: 12px;\n cursor: pointer;\n transition: all 0.15s;\n}\n\n.remove-btn:hover {\n color: var(--mj-status-error);\n background: color-mix(in srgb, var(--mj-status-error) 10%, var(--mj-bg-surface));\n}\n\n.card-chevron {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n color: var(--mj-text-secondary);\n font-size: 11px;\n}\n\n/* ============================================================ */\n/* Card Details (expanded content) */\n/* ============================================================ */\n\n.card-details {\n padding: 0 12px 12px;\n border-top: 1px solid var(--mj-border-default);\n}\n\n.detail-description {\n padding: 8px 0;\n}\n\n.detail-description p {\n margin: 0;\n font-size: 13px;\n color: var(--mj-text-secondary);\n line-height: 1.5;\n}\n\n.detail-info-grid {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 6px 16px;\n padding: 8px 0;\n}\n\n.detail-info-grid .info-item {\n display: flex;\n flex-direction: column;\n gap: 1px;\n}\n\n.detail-info-grid .info-label {\n font-size: 10px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.4px;\n}\n\n.detail-info-grid .info-value {\n font-size: 13px;\n color: var(--mj-text-primary);\n}\n\n.detail-actions {\n display: flex;\n gap: 8px;\n padding-top: 8px;\n border-top: 1px solid var(--mj-border-default);\n}\n"] }]
614
+ args: [{ standalone: false, selector: 'mj-component-browser', template: "<div class=\"component-browser\">\n\n <!-- Header -->\n <div class=\"browser-header\">\n <div class=\"header-top-row\">\n <button mjButton variant=\"primary\"\n (click)=\"OnNewComponent()\">\n <i class=\"fa-solid fa-plus\"></i> New Component\n </button>\n <div class=\"import-dropdown\" [class.open]=\"ImportDropdownOpen\">\n <button mjButton\n (click)=\"ToggleImportDropdown()\">\n <i class=\"fa-solid fa-file-import\"></i> Import\n <i class=\"fa-solid fa-chevron-down dropdown-chevron\"></i>\n </button>\n @if (ImportDropdownOpen) {\n <div class=\"dropdown-menu\">\n <button class=\"dropdown-item\" (click)=\"OnImportFromArtifact()\">\n <i class=\"fa-solid fa-database\"></i> From Artifact\n </button>\n <button class=\"dropdown-item\" (click)=\"OnImportFromFile()\">\n <i class=\"fa-solid fa-file\"></i> From File\n </button>\n <button class=\"dropdown-item\" (click)=\"OnImportFromText()\">\n <i class=\"fa-solid fa-keyboard\"></i> From Text\n </button>\n </div>\n }\n </div>\n </div>\n\n <div class=\"header-controls-row\">\n <button\n class=\"filter-toggle-btn\"\n [class.active]=\"State.IsFilterPanelExpanded || State.GetActiveFilterCount() > 0\"\n (click)=\"State.ToggleFilterPanel()\"\n [title]=\"State.IsFilterPanelExpanded ? 'Hide filters' : 'Show filters'\">\n <i class=\"fa-solid fa-sliders\"></i>\n @if (State.GetActiveFilterCount() > 0) {\n <span class=\"filter-count-badge\">{{ State.GetActiveFilterCount() }}</span>\n }\n </button>\n <span class=\"component-count\">\n {{ State.FilteredComponents.length }} of {{ State.AllComponents.length }}\n </span>\n </div>\n </div>\n\n <!-- Search -->\n <div class=\"search-box\">\n <div class=\"search-input-wrapper\">\n <i class=\"fa-solid fa-search search-icon\"></i>\n <input\n type=\"text\"\n class=\"mj-input\"\n [value]=\"State.SearchQuery\"\n (input)=\"OnSearchChange($any($event.target).value)\"\n placeholder=\"Search components...\">\n </div>\n </div>\n\n <!-- Collapsible Filter Panel -->\n @if (State.IsFilterPanelExpanded) {\n <div class=\"filter-panel\">\n <div class=\"filter-panel-content\">\n\n <!-- Quick Filters -->\n <div class=\"filter-section\">\n <label class=\"filter-section-label\">Quick Filters</label>\n <div class=\"filter-options\">\n <label class=\"filter-checkbox\">\n <input type=\"checkbox\"\n [checked]=\"State.ShowOnlyFavorites\"\n (change)=\"State.ToggleShowOnlyFavorites()\">\n <i class=\"fa-solid fa-star filter-icon favorites-icon\"></i>\n <span>Favorites only</span>\n </label>\n <label class=\"filter-checkbox\">\n <input type=\"checkbox\"\n [checked]=\"State.ShowDeprecatedComponents\"\n (change)=\"State.ToggleShowDeprecatedComponents()\">\n <i class=\"fa-solid fa-archive filter-icon deprecated-icon\"></i>\n <span>Show deprecated\n @if (State.GetDeprecatedCount() > 0) {\n <span class=\"deprecated-count\">({{ State.GetDeprecatedCount() }})</span>\n }\n </span>\n </label>\n </div>\n </div>\n\n <!-- Category Pills -->\n @if (State.AvailableCategories.length > 0) {\n <div class=\"filter-section\">\n <label class=\"filter-section-label\">Categories</label>\n <div class=\"category-pills\">\n @for (category of State.GetVisibleCategories(); track TrackByCategoryName($index, category)) {\n <button\n class=\"category-pill\"\n [class.active]=\"State.IsCategorySelected(category.name)\"\n [style.--pill-color]=\"category.color\"\n (click)=\"State.ToggleCategory(category.name)\">\n <span class=\"pill-name\">{{ category.name }}</span>\n <span class=\"pill-count\">{{ category.count }}</span>\n </button>\n }\n </div>\n @if (State.AvailableCategories.length > 5) {\n <button\n class=\"show-more-btn\"\n (click)=\"State.ToggleShowAllCategories()\">\n @if (State.ShowAllCategories) {\n <i class=\"fa-solid fa-chevron-up\"></i> Show less\n } @else {\n <i class=\"fa-solid fa-chevron-down\"></i> Show {{ State.AvailableCategories.length - 5 }} more\n }\n </button>\n }\n </div>\n }\n\n <!-- Clear All -->\n @if (State.GetActiveFilterCount() > 0) {\n <div class=\"filter-panel-footer\">\n <button class=\"clear-all-btn\" (click)=\"State.ClearAllFilters()\">\n <i class=\"fa-solid fa-times\"></i> Clear All Filters\n </button>\n </div>\n }\n </div>\n </div>\n }\n\n <!-- Component Card List -->\n <div class=\"component-list\">\n @if (State.IsLoading) {\n <div class=\"loading-state\">\n <mj-loading text=\"Loading components...\" size=\"small\"></mj-loading>\n </div>\n } @else if (State.FilteredComponents.length === 0) {\n <div class=\"empty-state\">\n @if (State.AllComponents.length === 0) {\n <i class=\"fa-solid fa-puzzle-piece empty-icon\"></i>\n <p class=\"empty-title\">No components found</p>\n <p class=\"empty-subtitle\">Create a new component or import one to get started.</p>\n } @else {\n <i class=\"fa-solid fa-filter empty-icon\"></i>\n <p class=\"empty-title\">No matching components</p>\n <p class=\"empty-subtitle\">Try adjusting your search or filters.</p>\n }\n </div>\n } @else {\n @for (component of State.FilteredComponents; track TrackByComponentId($index, component)) {\n <div class=\"component-card\"\n [class.expanded]=\"IsExpanded(component)\"\n [class.running]=\"IsComponentRunning(component)\"\n [class.file-loaded]=\"State.IsFileLoadedComponent(component)\">\n\n <!-- Card Header (always visible) -->\n <div class=\"card-header\" (click)=\"ToggleComponentExpansion(component)\">\n <div class=\"card-type-icon\"\n [style.color]=\"State.GetComponentTypeColor(State.GetComponentType(component))\">\n <i class=\"fa-solid\"\n [ngClass]=\"State.GetComponentTypeIcon(State.GetComponentType(component))\"></i>\n </div>\n\n <div class=\"card-body\">\n <div class=\"card-title-row\">\n <span class=\"card-name\">{{ State.GetComponentName(component) }}</span>\n @if (State.IsFileLoadedComponent(component)) {\n <span class=\"file-badge\" [title]=\"GetFileBadgeTooltip(component)\">\n <i class=\"fa-solid\" [ngClass]=\"GetFileBadgeIcon(component)\"></i>\n {{ GetFileBadgeLabel(component) }}\n </span>\n }\n </div>\n <div class=\"card-meta-row\">\n <span class=\"version-badge\">v{{ State.GetComponentVersion(component) }}</span>\n <span class=\"status-badge\" [ngClass]=\"GetStatusBadgeClass(component)\">\n {{ GetStatusLabel(component) }}\n </span>\n <span class=\"namespace-chip\"\n [style.background-color]=\"State.GetNamespaceColor(State.GetComponentNamespace(component))\"\n [title]=\"State.GetComponentNamespace(component) || 'Uncategorized'\">\n <i class=\"fa-solid fa-folder-tree\"></i>\n {{ State.FormatNamespace(State.GetComponentNamespace(component)) }}\n </span>\n </div>\n </div>\n\n <div class=\"card-end\">\n @if (!State.IsFileLoadedComponent(component)) {\n <button\n class=\"favorite-btn\"\n [class.is-favorite]=\"State.IsFavorite(component)\"\n (click)=\"OnToggleFavorite(component, $event)\"\n [title]=\"State.IsFavorite(component) ? 'Remove from favorites' : 'Add to favorites'\">\n @if (State.IsFavorite(component)) {\n <i class=\"fa-solid fa-star\"></i>\n } @else {\n <i class=\"fa-regular fa-star\"></i>\n }\n </button>\n }\n @if (State.IsFileLoadedComponent(component)) {\n <button\n class=\"remove-btn\"\n (click)=\"OnRemoveFileComponent($any(component), $event)\"\n title=\"Remove imported component\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n }\n <div class=\"card-chevron\">\n @if (IsExpanded(component)) {\n <i class=\"fa-solid fa-chevron-up\"></i>\n } @else {\n <i class=\"fa-solid fa-chevron-down\"></i>\n }\n </div>\n </div>\n </div>\n\n <!-- Card Details (expanded) -->\n @if (IsExpanded(component)) {\n <div class=\"card-details\">\n @if (State.GetComponentDescription(component)) {\n <div class=\"detail-description\">\n <p>{{ State.GetComponentDescription(component) }}</p>\n </div>\n }\n\n <div class=\"detail-info-grid\">\n <div class=\"info-item\">\n <span class=\"info-label\">Type</span>\n <span class=\"info-value\">{{ State.GetComponentType(component) || 'Unknown' }}</span>\n </div>\n <div class=\"info-item\">\n <span class=\"info-label\">Version</span>\n <span class=\"info-value\">{{ State.GetComponentVersion(component) }}</span>\n </div>\n <div class=\"info-item\">\n <span class=\"info-label\">Status</span>\n <span class=\"info-value\">{{ State.GetComponentStatus(component) || 'Draft' }}</span>\n </div>\n @if (State.IsFileLoadedComponent(component)) {\n <div class=\"info-item\">\n <span class=\"info-label\">Loaded</span>\n <span class=\"info-value\">{{ State.GetComponentLoadedAt(component) | date:'short' }}</span>\n </div>\n } @else if (State.GetComponentUpdatedAt(component)) {\n <div class=\"info-item\">\n <span class=\"info-label\">Updated</span>\n <span class=\"info-value\">{{ State.GetComponentUpdatedAt(component) | date:'short' }}</span>\n </div>\n }\n </div>\n\n <div class=\"detail-actions\">\n @if (IsComponentRunning(component)) {\n <button mjButton variant=\"danger\"\n (click)=\"OnStopComponent($event)\">\n <i class=\"fa-solid fa-stop\"></i> Stop\n </button>\n } @else if (IsAnotherComponentRunning(component)) {\n <button mjButton\n title=\"Stop current component and run this one\"\n (click)=\"OnSwitchComponent(component, $event)\">\n <i class=\"fa-solid fa-exchange-alt\"></i> Switch To This\n </button>\n } @else {\n <button mjButton variant=\"primary\"\n (click)=\"OnRunComponent(component, $event)\">\n <i class=\"fa-solid fa-play\"></i> Run\n </button>\n }\n </div>\n </div>\n }\n </div>\n }\n }\n </div>\n</div>\n", styles: ["/* ============================================================ */\n/* Component Browser - Left Panel */\n/* ============================================================ */\n\n:host {\n display: flex;\n flex-direction: column;\n height: 100%;\n overflow: hidden;\n}\n\n.component-browser {\n display: flex;\n flex-direction: column;\n height: 100%;\n background: var(--mj-bg-surface-sunken);\n overflow: hidden;\n}\n\n/* ============================================================ */\n/* Header */\n/* ============================================================ */\n\n.browser-header {\n padding: 12px 14px 8px;\n border-bottom: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n flex-shrink: 0;\n}\n\n.browser-header .header-top-row {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: 8px;\n}\n\n.browser-header .header-controls-row {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.browser-header .component-count {\n font-size: 12px;\n color: var(--mj-text-secondary);\n margin-left: auto;\n}\n\n/* ============================================================ */\n/* Import Dropdown */\n/* ============================================================ */\n\n.import-dropdown {\n position: relative;\n}\n\n.import-dropdown .dropdown-chevron {\n margin-left: 4px;\n font-size: 10px;\n}\n\n.import-dropdown .dropdown-menu {\n position: absolute;\n top: 100%;\n left: 0;\n z-index: 1000;\n min-width: 180px;\n margin-top: 4px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 4px;\n box-shadow: var(--mj-shadow-md);\n overflow: hidden;\n}\n\n.import-dropdown .dropdown-menu .dropdown-item {\n display: flex;\n align-items: center;\n gap: 8px;\n width: 100%;\n padding: 8px 14px;\n border: none;\n background: none;\n font-size: 13px;\n color: var(--mj-text-primary);\n cursor: pointer;\n text-align: left;\n transition: background 0.15s;\n}\n\n.import-dropdown .dropdown-menu .dropdown-item:hover {\n background: var(--mj-bg-surface-sunken);\n}\n\n.import-dropdown .dropdown-menu .dropdown-item i {\n width: 16px;\n text-align: center;\n color: var(--mj-text-secondary);\n}\n\n/* ============================================================ */\n/* Filter Toggle Button */\n/* ============================================================ */\n\n.filter-toggle-btn {\n display: flex;\n align-items: center;\n gap: 4px;\n padding: 5px 10px;\n border: 1px solid var(--mj-border-default);\n border-radius: 4px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 13px;\n cursor: pointer;\n transition: all 0.15s;\n position: relative;\n}\n\n.filter-toggle-btn:hover {\n border-color: var(--mj-text-secondary);\n color: var(--mj-text-primary);\n}\n\n.filter-toggle-btn.active {\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n}\n\n.filter-toggle-btn .filter-count-badge {\n position: absolute;\n top: -6px;\n right: -6px;\n min-width: 16px;\n height: 16px;\n padding: 0 4px;\n border-radius: 8px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n font-size: 10px;\n font-weight: 600;\n line-height: 16px;\n text-align: center;\n}\n\n/* ============================================================ */\n/* Search Box */\n/* ============================================================ */\n\n.search-box {\n padding: 8px 14px;\n flex-shrink: 0;\n}\n\n.search-box .search-icon {\n color: var(--mj-text-secondary);\n margin-left: 6px;\n}\n\n/* ============================================================ */\n/* Filter Panel */\n/* ============================================================ */\n\n.filter-panel {\n border-bottom: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n flex-shrink: 0;\n}\n\n.filter-panel .filter-panel-content {\n padding: 8px 14px 12px;\n}\n\n.filter-section {\n margin-bottom: 10px;\n}\n\n.filter-section:last-child {\n margin-bottom: 0;\n}\n\n.filter-section .filter-section-label {\n display: block;\n font-size: 11px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n margin-bottom: 6px;\n}\n\n.filter-options {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.filter-checkbox {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 4px 6px;\n border-radius: 4px;\n cursor: pointer;\n font-size: 13px;\n color: var(--mj-text-secondary);\n transition: background 0.15s;\n}\n\n.filter-checkbox:hover {\n background: var(--mj-bg-surface-sunken);\n}\n\n.filter-checkbox input[type=\"checkbox\"] {\n width: 14px;\n height: 14px;\n accent-color: var(--mj-brand-primary);\n cursor: pointer;\n}\n\n.filter-checkbox .filter-icon {\n font-size: 12px;\n}\n\n.filter-checkbox .favorites-icon {\n color: var(--mj-status-warning);\n}\n\n.filter-checkbox .deprecated-icon {\n color: var(--mj-text-muted);\n}\n\n.filter-checkbox .deprecated-count {\n color: var(--mj-text-muted);\n font-size: 12px;\n}\n\n/* ============================================================ */\n/* Category Pills */\n/* ============================================================ */\n\n.category-pills {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n}\n\n.category-pill {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 3px 10px;\n border: 1px solid var(--mj-border-default);\n border-radius: 14px;\n background: var(--mj-bg-surface);\n font-size: 12px;\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: all 0.15s;\n}\n\n.category-pill .pill-name {\n max-width: 120px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.category-pill .pill-count {\n font-size: 10px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n background: var(--mj-bg-surface-sunken);\n padding: 0 5px;\n border-radius: 8px;\n line-height: 16px;\n}\n\n.category-pill:hover {\n border-color: var(--pill-color, var(--mj-brand-primary));\n background: var(--mj-bg-surface);\n}\n\n.category-pill.active {\n border-color: var(--pill-color, var(--mj-brand-primary));\n background: var(--pill-color, var(--mj-brand-primary));\n color: var(--mj-text-inverse);\n}\n\n.category-pill.active .pill-count {\n background: rgba(255, 255, 255, 0.25);\n color: var(--mj-text-inverse);\n}\n\n.show-more-btn {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n margin-top: 6px;\n padding: 2px 0;\n border: none;\n background: none;\n font-size: 12px;\n color: var(--mj-brand-primary);\n cursor: pointer;\n}\n\n.show-more-btn:hover {\n color: var(--mj-brand-primary);\n text-decoration: underline;\n}\n\n.filter-panel-footer {\n margin-top: 8px;\n padding-top: 8px;\n border-top: 1px solid var(--mj-border-default);\n}\n\n.clear-all-btn {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 4px 10px;\n border: none;\n border-radius: 4px;\n background: none;\n font-size: 12px;\n color: var(--mj-status-error);\n cursor: pointer;\n transition: background 0.15s;\n}\n\n.clear-all-btn:hover {\n background: color-mix(in srgb, var(--mj-status-error) 10%, var(--mj-bg-surface));\n}\n\n/* ============================================================ */\n/* Component List (scrollable) */\n/* ============================================================ */\n\n.component-list {\n flex: 1;\n overflow-y: auto;\n padding: 8px 10px;\n}\n\n/* ============================================================ */\n/* Loading & Empty States */\n/* ============================================================ */\n\n.loading-state {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 40px 20px;\n}\n\n.empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 40px 20px;\n text-align: center;\n}\n\n.empty-state .empty-icon {\n font-size: 32px;\n color: var(--mj-border-default);\n margin-bottom: 12px;\n}\n\n.empty-state .empty-title {\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n margin: 0 0 4px;\n}\n\n.empty-state .empty-subtitle {\n font-size: 13px;\n color: var(--mj-text-secondary);\n margin: 0;\n}\n\n/* ============================================================ */\n/* Component Card */\n/* ============================================================ */\n\n.component-card {\n margin-bottom: 6px;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n background: var(--mj-bg-surface);\n transition: all 0.15s;\n overflow: hidden;\n}\n\n.component-card:hover {\n box-shadow: var(--mj-shadow-sm);\n border-color: var(--mj-border-default);\n}\n\n/* Running state: green left border */\n.component-card.running {\n border-left: 3px solid var(--mj-status-success);\n}\n\n/* File-loaded state: dashed border */\n.component-card.file-loaded {\n border-style: dashed;\n border-color: var(--mj-text-muted);\n}\n\n.component-card.file-loaded:hover {\n border-color: var(--mj-text-secondary);\n}\n\n/* Expanded state: blue border */\n.component-card.expanded {\n border-color: var(--mj-brand-primary);\n box-shadow: var(--mj-shadow-sm);\n}\n\n.component-card.expanded.running {\n border-color: var(--mj-brand-primary);\n border-left: 3px solid var(--mj-status-success);\n}\n\n.component-card.expanded.file-loaded {\n border-style: solid;\n border-color: var(--mj-brand-primary);\n}\n\n/* ============================================================ */\n/* Card Header */\n/* ============================================================ */\n\n.card-header {\n display: flex;\n align-items: flex-start;\n gap: 10px;\n padding: 10px 12px;\n cursor: pointer;\n user-select: none;\n}\n\n.card-header:hover {\n background: var(--mj-bg-surface);\n}\n\n.card-type-icon {\n flex-shrink: 0;\n width: 32px;\n height: 32px;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 16px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 4px;\n margin-top: 2px;\n}\n\n.card-body {\n flex: 1;\n min-width: 0;\n}\n\n.card-title-row {\n display: flex;\n align-items: center;\n gap: 6px;\n flex-wrap: wrap;\n margin-bottom: 4px;\n}\n\n.card-name {\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-primary);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.file-badge {\n display: inline-flex;\n align-items: center;\n gap: 3px;\n padding: 1px 6px;\n border-radius: 4px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n font-size: 10px;\n font-weight: 500;\n white-space: nowrap;\n max-width: 120px;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.card-meta-row {\n display: flex;\n align-items: center;\n gap: 6px;\n flex-wrap: wrap;\n}\n\n.version-badge {\n font-size: 11px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n background: var(--mj-bg-surface-sunken);\n padding: 1px 6px;\n border-radius: 4px;\n}\n\n.status-badge {\n display: inline-flex;\n align-items: center;\n padding: 1px 7px;\n border-radius: 4px;\n font-size: 10px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.3px;\n}\n\n.status-badge.published {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n}\n\n.status-badge.draft {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n.status-badge.deprecated {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n}\n\n.status-badge.file {\n background: color-mix(in srgb, var(--mj-status-warning) 15%, var(--mj-bg-surface));\n color: var(--mj-status-warning);\n}\n\n.status-badge.text {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n.status-badge.artifact {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n.namespace-chip {\n display: inline-flex;\n align-items: center;\n gap: 3px;\n padding: 1px 7px;\n border-radius: 10px;\n font-size: 10px;\n font-weight: 500;\n color: var(--mj-text-inverse);\n max-width: 160px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.namespace-chip i {\n font-size: 9px;\n opacity: 0.8;\n}\n\n/* ============================================================ */\n/* Card End (favorite, remove, chevron) */\n/* ============================================================ */\n\n.card-end {\n display: flex;\n align-items: center;\n gap: 2px;\n flex-shrink: 0;\n margin-top: 2px;\n}\n\n.favorite-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n border: none;\n border-radius: 4px;\n background: none;\n color: var(--mj-border-default);\n font-size: 14px;\n cursor: pointer;\n transition: all 0.15s;\n}\n\n.favorite-btn:hover {\n color: var(--mj-status-warning);\n background: color-mix(in srgb, var(--mj-status-warning) 10%, var(--mj-bg-surface));\n}\n\n.favorite-btn.is-favorite {\n color: var(--mj-status-warning);\n}\n\n.remove-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n border: none;\n border-radius: 4px;\n background: none;\n color: var(--mj-border-default);\n font-size: 12px;\n cursor: pointer;\n transition: all 0.15s;\n}\n\n.remove-btn:hover {\n color: var(--mj-status-error);\n background: color-mix(in srgb, var(--mj-status-error) 10%, var(--mj-bg-surface));\n}\n\n.card-chevron {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n color: var(--mj-text-secondary);\n font-size: 11px;\n}\n\n/* ============================================================ */\n/* Card Details (expanded content) */\n/* ============================================================ */\n\n.card-details {\n padding: 0 12px 12px;\n border-top: 1px solid var(--mj-border-default);\n}\n\n.detail-description {\n padding: 8px 0;\n}\n\n.detail-description p {\n margin: 0;\n font-size: 13px;\n color: var(--mj-text-secondary);\n line-height: 1.5;\n}\n\n.detail-info-grid {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 6px 16px;\n padding: 8px 0;\n}\n\n.detail-info-grid .info-item {\n display: flex;\n flex-direction: column;\n gap: 1px;\n}\n\n.detail-info-grid .info-label {\n font-size: 10px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.4px;\n}\n\n.detail-info-grid .info-value {\n font-size: 13px;\n color: var(--mj-text-primary);\n}\n\n.detail-actions {\n display: flex;\n gap: 8px;\n padding-top: 8px;\n border-top: 1px solid var(--mj-border-default);\n}\n"] }]
628
615
  }], () => [{ type: i1.ComponentStudioStateService }, { type: i0.ChangeDetectorRef }], { NewComponent: [{
629
616
  type: Output
630
617
  }], ImportFromFile: [{