@memberjunction/ng-dashboards 2.89.0 → 2.91.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 (52) hide show
  1. package/dist/AI/components/agents/agent-configuration.component.d.ts +8 -8
  2. package/dist/AI/components/agents/agent-configuration.component.d.ts.map +1 -1
  3. package/dist/AI/components/agents/agent-configuration.component.js.map +1 -1
  4. package/dist/AI/components/agents/agent-editor.component.d.ts +4 -4
  5. package/dist/AI/components/agents/agent-editor.component.d.ts.map +1 -1
  6. package/dist/AI/components/agents/agent-editor.component.js.map +1 -1
  7. package/dist/AI/components/agents/agent-filter-panel.component.d.ts +3 -3
  8. package/dist/AI/components/agents/agent-filter-panel.component.d.ts.map +1 -1
  9. package/dist/AI/components/agents/agent-filter-panel.component.js.map +1 -1
  10. package/dist/AI/components/execution-monitoring.component.js.map +1 -1
  11. package/dist/AI/components/models/model-management-v2.component.d.ts +4 -4
  12. package/dist/AI/components/models/model-management-v2.component.d.ts.map +1 -1
  13. package/dist/AI/components/models/model-management-v2.component.js +2 -2
  14. package/dist/AI/components/models/model-management-v2.component.js.map +1 -1
  15. package/dist/AI/components/prompts/model-prompt-priority-matrix.component.d.ts +7 -7
  16. package/dist/AI/components/prompts/model-prompt-priority-matrix.component.d.ts.map +1 -1
  17. package/dist/AI/components/prompts/model-prompt-priority-matrix.component.js.map +1 -1
  18. package/dist/AI/components/prompts/prompt-management-v2.component.d.ts +4 -4
  19. package/dist/AI/components/prompts/prompt-management-v2.component.d.ts.map +1 -1
  20. package/dist/AI/components/prompts/prompt-management-v2.component.js +1 -1
  21. package/dist/AI/components/prompts/prompt-management-v2.component.js.map +1 -1
  22. package/dist/AI/components/prompts/prompt-version-control.component.d.ts +6 -6
  23. package/dist/AI/components/prompts/prompt-version-control.component.d.ts.map +1 -1
  24. package/dist/AI/components/prompts/prompt-version-control.component.js.map +1 -1
  25. package/dist/AI/services/ai-instrumentation.service.js.map +1 -1
  26. package/dist/Actions/actions-management-dashboard.component.d.ts +1 -0
  27. package/dist/Actions/actions-management-dashboard.component.d.ts.map +1 -1
  28. package/dist/Actions/actions-management-dashboard.component.js +89 -76
  29. package/dist/Actions/actions-management-dashboard.component.js.map +1 -1
  30. package/dist/Actions/components/actions-list-view.component.d.ts +17 -0
  31. package/dist/Actions/components/actions-list-view.component.d.ts.map +1 -1
  32. package/dist/Actions/components/actions-list-view.component.js +303 -83
  33. package/dist/Actions/components/actions-list-view.component.js.map +1 -1
  34. package/dist/Actions/components/actions-overview.component.d.ts +0 -1
  35. package/dist/Actions/components/actions-overview.component.d.ts.map +1 -1
  36. package/dist/Actions/components/actions-overview.component.js +4 -31
  37. package/dist/Actions/components/actions-overview.component.js.map +1 -1
  38. package/dist/Actions/components/execution-monitoring.component.js +5 -5
  39. package/dist/Actions/components/execution-monitoring.component.js.map +1 -1
  40. package/dist/ComponentStudio/component-studio-dashboard.component.d.ts +93 -6
  41. package/dist/ComponentStudio/component-studio-dashboard.component.d.ts.map +1 -1
  42. package/dist/ComponentStudio/component-studio-dashboard.component.js +743 -265
  43. package/dist/ComponentStudio/component-studio-dashboard.component.js.map +1 -1
  44. package/dist/ComponentStudio/components/text-import-dialog.component.d.ts +14 -0
  45. package/dist/ComponentStudio/components/text-import-dialog.component.d.ts.map +1 -0
  46. package/dist/ComponentStudio/components/text-import-dialog.component.js +121 -0
  47. package/dist/ComponentStudio/components/text-import-dialog.component.js.map +1 -0
  48. package/dist/module.d.ts +19 -18
  49. package/dist/module.d.ts.map +1 -1
  50. package/dist/module.js +5 -2
  51. package/dist/module.js.map +1 -1
  52. package/package.json +10 -10
@@ -4,35 +4,38 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
4
4
  else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
5
  return c > 3 && r && Object.defineProperty(target, key, r), r;
6
6
  };
7
- import { Component, ViewChild } from '@angular/core';
7
+ import { Component, ViewChild, HostListener } from '@angular/core';
8
8
  import { BaseDashboard } from '../generic/base-dashboard';
9
9
  import { RegisterClass } from '@memberjunction/global';
10
- import { RunView } from '@memberjunction/core';
10
+ import { RunView, CompositeKey, Metadata } from '@memberjunction/core';
11
11
  import { Subject } from 'rxjs';
12
12
  import { SharedService } from '@memberjunction/ng-shared';
13
13
  import { ParseJSONRecursive } from '@memberjunction/global';
14
+ import { TextImportDialogComponent } from './components/text-import-dialog.component';
14
15
  import * as i0 from "@angular/core";
15
- import * as i1 from "@angular/common";
16
- import * as i2 from "@angular/forms";
17
- import * as i3 from "@progress/kendo-angular-inputs";
18
- import * as i4 from "@progress/kendo-angular-layout";
19
- import * as i5 from "@memberjunction/ng-code-editor";
20
- import * as i6 from "@progress/kendo-angular-buttons";
21
- import * as i7 from "@memberjunction/ng-react";
16
+ import * as i1 from "@progress/kendo-angular-dialog";
17
+ import * as i2 from "@angular/common";
18
+ import * as i3 from "@angular/forms";
19
+ import * as i4 from "@progress/kendo-angular-inputs";
20
+ import * as i5 from "@progress/kendo-angular-layout";
21
+ import * as i6 from "@memberjunction/ng-code-editor";
22
+ import * as i7 from "@progress/kendo-angular-buttons";
23
+ import * as i8 from "@memberjunction/ng-react";
22
24
  const _c0 = ["fileInput"];
23
- function _forTrack0($index, $item) { return this.getComponentId($item); }
24
- const _forTrack1 = ($index, $item) => $item.title;
25
+ const _forTrack0 = ($index, $item) => $item.name;
26
+ function _forTrack1($index, $item) { return this.getComponentId($item); }
27
+ const _forTrack2 = ($index, $item) => $item.title;
25
28
  function ComponentStudioDashboardComponent_Conditional_10_Conditional_1_Template(rf, ctx) { if (rf & 1) {
26
- i0.ɵɵelement(0, "span", 27);
29
+ i0.ɵɵelement(0, "span", 35);
27
30
  i0.ɵɵtext(1, " Show Details ");
28
31
  } }
29
32
  function ComponentStudioDashboardComponent_Conditional_10_Conditional_2_Template(rf, ctx) { if (rf & 1) {
30
- i0.ɵɵelement(0, "span", 28);
33
+ i0.ɵɵelement(0, "span", 36);
31
34
  i0.ɵɵtext(1, " Hide Details ");
32
35
  } }
33
36
  function ComponentStudioDashboardComponent_Conditional_10_Template(rf, ctx) { if (rf & 1) {
34
37
  const _r2 = i0.ɵɵgetCurrentView();
35
- i0.ɵɵelementStart(0, "button", 8);
38
+ i0.ɵɵelementStart(0, "button", 9);
36
39
  i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_10_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r2); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.toggleDetailsPane()); });
37
40
  i0.ɵɵtemplate(1, ComponentStudioDashboardComponent_Conditional_10_Conditional_1_Template, 2, 0)(2, ComponentStudioDashboardComponent_Conditional_10_Conditional_2_Template, 2, 0);
38
41
  i0.ɵɵelementEnd();
@@ -42,228 +45,370 @@ function ComponentStudioDashboardComponent_Conditional_10_Template(rf, ctx) { if
42
45
  i0.ɵɵadvance();
43
46
  i0.ɵɵconditional(ctx_r2.isDetailsPaneCollapsed ? 1 : 2);
44
47
  } }
45
- function ComponentStudioDashboardComponent_ng_template_27_Template(rf, ctx) { if (rf & 1) {
46
- i0.ɵɵelement(0, "i", 29);
48
+ function ComponentStudioDashboardComponent_Conditional_16_Template(rf, ctx) { if (rf & 1) {
49
+ const _r4 = i0.ɵɵgetCurrentView();
50
+ i0.ɵɵelementStart(0, "div", 12)(1, "button", 37);
51
+ i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_16_Template_button_click_1_listener() { i0.ɵɵrestoreView(_r4); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.importFromFile()); });
52
+ i0.ɵɵelement(2, "i", 38);
53
+ i0.ɵɵtext(3, " Import from File ");
54
+ i0.ɵɵelementEnd();
55
+ i0.ɵɵelementStart(4, "button", 37);
56
+ i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_16_Template_button_click_4_listener() { i0.ɵɵrestoreView(_r4); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.importFromText()); });
57
+ i0.ɵɵelement(5, "i", 39);
58
+ i0.ɵɵtext(6, " Import from Text ");
59
+ i0.ɵɵelementEnd()();
60
+ } }
61
+ function ComponentStudioDashboardComponent_Conditional_31_Template(rf, ctx) { if (rf & 1) {
62
+ i0.ɵɵelement(0, "i", 40);
63
+ i0.ɵɵtext(1, " Favorites ");
64
+ } }
65
+ function ComponentStudioDashboardComponent_Conditional_32_Template(rf, ctx) { if (rf & 1) {
66
+ i0.ɵɵelement(0, "i", 41);
67
+ i0.ɵɵtext(1, " All ");
68
+ } }
69
+ function ComponentStudioDashboardComponent_Conditional_36_For_2_Template(rf, ctx) { if (rf & 1) {
70
+ const _r5 = i0.ɵɵgetCurrentView();
71
+ i0.ɵɵelementStart(0, "button", 45);
72
+ i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_36_For_2_Template_button_click_0_listener() { const category_r6 = i0.ɵɵrestoreView(_r5).$implicit; const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.toggleCategory(category_r6.name)); });
73
+ i0.ɵɵelementStart(1, "span", 46);
74
+ i0.ɵɵtext(2);
75
+ i0.ɵɵelementEnd();
76
+ i0.ɵɵelementStart(3, "span", 47);
77
+ i0.ɵɵtext(4);
78
+ i0.ɵɵelementEnd()();
79
+ } if (rf & 2) {
80
+ const category_r6 = ctx.$implicit;
81
+ const ctx_r2 = i0.ɵɵnextContext(2);
82
+ i0.ɵɵstyleProp("--pill-color", category_r6.color);
83
+ i0.ɵɵclassProp("active", ctx_r2.isCategorySelected(category_r6.name));
84
+ i0.ɵɵadvance(2);
85
+ i0.ɵɵtextInterpolate(category_r6.name);
86
+ i0.ɵɵadvance(2);
87
+ i0.ɵɵtextInterpolate(category_r6.count);
88
+ } }
89
+ function ComponentStudioDashboardComponent_Conditional_36_Conditional_3_Conditional_1_Template(rf, ctx) { if (rf & 1) {
90
+ i0.ɵɵelement(0, "i", 49);
91
+ i0.ɵɵtext(1, " Less ");
92
+ } }
93
+ function ComponentStudioDashboardComponent_Conditional_36_Conditional_3_Conditional_2_Template(rf, ctx) { if (rf & 1) {
94
+ i0.ɵɵelement(0, "i", 50);
95
+ i0.ɵɵtext(1);
96
+ } if (rf & 2) {
97
+ const ctx_r2 = i0.ɵɵnextContext(3);
98
+ i0.ɵɵadvance();
99
+ i0.ɵɵtextInterpolate1(" +", ctx_r2.availableCategories.length - 5, " more ");
100
+ } }
101
+ function ComponentStudioDashboardComponent_Conditional_36_Conditional_3_Template(rf, ctx) { if (rf & 1) {
102
+ const _r7 = i0.ɵɵgetCurrentView();
103
+ i0.ɵɵelementStart(0, "button", 48);
104
+ i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_36_Conditional_3_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r7); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.toggleShowAllCategories()); });
105
+ i0.ɵɵtemplate(1, ComponentStudioDashboardComponent_Conditional_36_Conditional_3_Conditional_1_Template, 2, 0)(2, ComponentStudioDashboardComponent_Conditional_36_Conditional_3_Conditional_2_Template, 2, 1);
106
+ i0.ɵɵelementEnd();
107
+ } if (rf & 2) {
108
+ const ctx_r2 = i0.ɵɵnextContext(2);
109
+ i0.ɵɵadvance();
110
+ i0.ɵɵconditional(ctx_r2.showAllCategories ? 1 : 2);
47
111
  } }
48
- function ComponentStudioDashboardComponent_Conditional_29_Template(rf, ctx) { if (rf & 1) {
49
- i0.ɵɵelementStart(0, "div", 21);
50
- i0.ɵɵelement(1, "i", 30);
112
+ function ComponentStudioDashboardComponent_Conditional_36_Conditional_4_Template(rf, ctx) { if (rf & 1) {
113
+ const _r8 = i0.ɵɵgetCurrentView();
114
+ i0.ɵɵelementStart(0, "button", 51);
115
+ i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_36_Conditional_4_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r8); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.clearCategoryFilters()); });
116
+ i0.ɵɵelement(1, "i", 52);
117
+ i0.ɵɵtext(2, " Clear ");
118
+ i0.ɵɵelementEnd();
119
+ } }
120
+ function ComponentStudioDashboardComponent_Conditional_36_Template(rf, ctx) { if (rf & 1) {
121
+ i0.ɵɵelementStart(0, "div", 25);
122
+ i0.ɵɵrepeaterCreate(1, ComponentStudioDashboardComponent_Conditional_36_For_2_Template, 5, 6, "button", 42, _forTrack0);
123
+ i0.ɵɵtemplate(3, ComponentStudioDashboardComponent_Conditional_36_Conditional_3_Template, 3, 1, "button", 43)(4, ComponentStudioDashboardComponent_Conditional_36_Conditional_4_Template, 3, 0, "button", 44);
124
+ i0.ɵɵelementEnd();
125
+ } if (rf & 2) {
126
+ const ctx_r2 = i0.ɵɵnextContext();
127
+ i0.ɵɵadvance();
128
+ i0.ɵɵrepeater(ctx_r2.getVisibleCategories());
129
+ i0.ɵɵadvance(2);
130
+ i0.ɵɵconditional(ctx_r2.availableCategories.length > 5 ? 3 : -1);
131
+ i0.ɵɵadvance();
132
+ i0.ɵɵconditional(ctx_r2.selectedCategories.size > 0 ? 4 : -1);
133
+ } }
134
+ function ComponentStudioDashboardComponent_ng_template_39_Template(rf, ctx) { if (rf & 1) {
135
+ i0.ɵɵelement(0, "i", 53);
136
+ } }
137
+ function ComponentStudioDashboardComponent_Conditional_41_Template(rf, ctx) { if (rf & 1) {
138
+ i0.ɵɵelementStart(0, "div", 30);
139
+ i0.ɵɵelement(1, "i", 54);
51
140
  i0.ɵɵtext(2, " Loading components... ");
52
141
  i0.ɵɵelementEnd();
53
142
  } }
54
- function ComponentStudioDashboardComponent_Conditional_30_Template(rf, ctx) { if (rf & 1) {
55
- i0.ɵɵelementStart(0, "div", 22);
56
- i0.ɵɵelement(1, "i", 31);
57
- i0.ɵɵtext(2, " No components found without custom properties. ");
143
+ function ComponentStudioDashboardComponent_Conditional_42_Template(rf, ctx) { if (rf & 1) {
144
+ i0.ɵɵelementStart(0, "div", 31);
145
+ i0.ɵɵelement(1, "i", 55);
146
+ i0.ɵɵtext(2, " No components found without required custom properties. ");
58
147
  i0.ɵɵelement(3, "br");
59
148
  i0.ɵɵelementStart(4, "small");
60
- i0.ɵɵtext(5, "Only components that don't require custom props can be tested here.");
149
+ i0.ɵɵtext(5, "Components with optional custom props can be tested, but not those with required props.");
61
150
  i0.ɵɵelementEnd()();
62
151
  } }
63
- function ComponentStudioDashboardComponent_Conditional_31_For_1_Conditional_7_Template(rf, ctx) { if (rf & 1) {
64
- i0.ɵɵelementStart(0, "span", 39);
65
- i0.ɵɵelement(1, "i", 50);
66
- i0.ɵɵtext(2);
152
+ function ComponentStudioDashboardComponent_Conditional_43_For_1_Conditional_4_Conditional_1_Template(rf, ctx) { if (rf & 1) {
153
+ i0.ɵɵelement(0, "i", 40);
154
+ } }
155
+ function ComponentStudioDashboardComponent_Conditional_43_For_1_Conditional_4_Conditional_2_Template(rf, ctx) { if (rf & 1) {
156
+ i0.ɵɵelement(0, "i", 41);
157
+ } }
158
+ function ComponentStudioDashboardComponent_Conditional_43_For_1_Conditional_4_Template(rf, ctx) { if (rf & 1) {
159
+ const _r11 = i0.ɵɵgetCurrentView();
160
+ i0.ɵɵelementStart(0, "button", 75);
161
+ i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_43_For_1_Conditional_4_Template_button_click_0_listener($event) { i0.ɵɵrestoreView(_r11); const component_r10 = i0.ɵɵnextContext().$implicit; const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.toggleFavorite(component_r10, $event)); });
162
+ i0.ɵɵtemplate(1, ComponentStudioDashboardComponent_Conditional_43_For_1_Conditional_4_Conditional_1_Template, 1, 0, "i", 40)(2, ComponentStudioDashboardComponent_Conditional_43_For_1_Conditional_4_Conditional_2_Template, 1, 0, "i", 41);
67
163
  i0.ɵɵelementEnd();
68
164
  } if (rf & 2) {
69
- const component_r5 = i0.ɵɵnextContext().$implicit;
165
+ const component_r10 = i0.ɵɵnextContext().$implicit;
70
166
  const ctx_r2 = i0.ɵɵnextContext(2);
71
- i0.ɵɵpropertyInterpolate1("title", "Loaded from ", ctx_r2.getComponentFilename(component_r5), "");
72
- i0.ɵɵadvance(2);
73
- i0.ɵɵtextInterpolate1(" ", ctx_r2.getComponentFilename(component_r5), " ");
167
+ i0.ɵɵclassProp("is-favorite", ctx_r2.isFavorite(component_r10));
168
+ i0.ɵɵproperty("title", ctx_r2.isFavorite(component_r10) ? "Remove from favorites" : "Add to favorites");
169
+ i0.ɵɵadvance();
170
+ i0.ɵɵconditional(ctx_r2.isFavorite(component_r10) ? 1 : 2);
74
171
  } }
75
- function ComponentStudioDashboardComponent_Conditional_31_For_1_Conditional_13_Template(rf, ctx) { if (rf & 1) {
76
- i0.ɵɵelementStart(0, "span", 43);
172
+ function ComponentStudioDashboardComponent_Conditional_43_For_1_Conditional_8_Conditional_1_Template(rf, ctx) { if (rf & 1) {
173
+ i0.ɵɵelement(0, "i", 39);
174
+ i0.ɵɵtext(1, " Text Import ");
175
+ } }
176
+ function ComponentStudioDashboardComponent_Conditional_43_For_1_Conditional_8_Conditional_2_Template(rf, ctx) { if (rf & 1) {
177
+ i0.ɵɵelement(0, "i", 38);
178
+ i0.ɵɵtext(1);
179
+ } if (rf & 2) {
180
+ const component_r10 = i0.ɵɵnextContext(2).$implicit;
181
+ const ctx_r2 = i0.ɵɵnextContext(2);
182
+ i0.ɵɵadvance();
183
+ i0.ɵɵtextInterpolate1(" ", ctx_r2.getComponentFilename(component_r10), " ");
184
+ } }
185
+ function ComponentStudioDashboardComponent_Conditional_43_For_1_Conditional_8_Template(rf, ctx) { if (rf & 1) {
186
+ i0.ɵɵelementStart(0, "span", 64);
187
+ i0.ɵɵtemplate(1, ComponentStudioDashboardComponent_Conditional_43_For_1_Conditional_8_Conditional_1_Template, 2, 0)(2, ComponentStudioDashboardComponent_Conditional_43_For_1_Conditional_8_Conditional_2_Template, 2, 1);
188
+ i0.ɵɵelementEnd();
189
+ } if (rf & 2) {
190
+ const component_r10 = i0.ɵɵnextContext().$implicit;
191
+ const ctx_r2 = i0.ɵɵnextContext(2);
192
+ i0.ɵɵproperty("title", ctx_r2.getComponentStatus(component_r10) === "Text" ? "Imported from text input" : "Loaded from " + ctx_r2.getComponentFilename(component_r10));
193
+ i0.ɵɵadvance();
194
+ i0.ɵɵconditional(ctx_r2.getComponentStatus(component_r10) === "Text" ? 1 : 2);
195
+ } }
196
+ function ComponentStudioDashboardComponent_Conditional_43_For_1_Conditional_14_Conditional_0_Template(rf, ctx) { if (rf & 1) {
197
+ i0.ɵɵelementStart(0, "span", 76);
198
+ i0.ɵɵtext(1, "Text");
199
+ i0.ɵɵelementEnd();
200
+ } }
201
+ function ComponentStudioDashboardComponent_Conditional_43_For_1_Conditional_14_Conditional_1_Template(rf, ctx) { if (rf & 1) {
202
+ i0.ɵɵelementStart(0, "span", 77);
77
203
  i0.ɵɵtext(1, "File");
78
204
  i0.ɵɵelementEnd();
79
205
  } }
80
- function ComponentStudioDashboardComponent_Conditional_31_For_1_Conditional_14_Template(rf, ctx) { if (rf & 1) {
81
- i0.ɵɵelementStart(0, "span", 44);
206
+ function ComponentStudioDashboardComponent_Conditional_43_For_1_Conditional_14_Template(rf, ctx) { if (rf & 1) {
207
+ i0.ɵɵtemplate(0, ComponentStudioDashboardComponent_Conditional_43_For_1_Conditional_14_Conditional_0_Template, 2, 0, "span", 76)(1, ComponentStudioDashboardComponent_Conditional_43_For_1_Conditional_14_Conditional_1_Template, 2, 0, "span", 77);
208
+ } if (rf & 2) {
209
+ const component_r10 = i0.ɵɵnextContext().$implicit;
210
+ const ctx_r2 = i0.ɵɵnextContext(2);
211
+ i0.ɵɵconditional(ctx_r2.getComponentStatus(component_r10) === "Text" ? 0 : 1);
212
+ } }
213
+ function ComponentStudioDashboardComponent_Conditional_43_For_1_Conditional_15_Template(rf, ctx) { if (rf & 1) {
214
+ i0.ɵɵelementStart(0, "span", 68);
82
215
  i0.ɵɵtext(1, "Published");
83
216
  i0.ɵɵelementEnd();
84
217
  } }
85
- function ComponentStudioDashboardComponent_Conditional_31_For_1_Conditional_15_Template(rf, ctx) { if (rf & 1) {
86
- i0.ɵɵelementStart(0, "span", 45);
218
+ function ComponentStudioDashboardComponent_Conditional_43_For_1_Conditional_16_Template(rf, ctx) { if (rf & 1) {
219
+ i0.ɵɵelementStart(0, "span", 69);
87
220
  i0.ɵɵtext(1, "Draft");
88
221
  i0.ɵɵelementEnd();
89
222
  } }
90
- function ComponentStudioDashboardComponent_Conditional_31_For_1_Conditional_17_Template(rf, ctx) { if (rf & 1) {
91
- i0.ɵɵelement(0, "i", 47);
223
+ function ComponentStudioDashboardComponent_Conditional_43_For_1_Conditional_22_Template(rf, ctx) { if (rf & 1) {
224
+ i0.ɵɵelement(0, "i", 49);
92
225
  } }
93
- function ComponentStudioDashboardComponent_Conditional_31_For_1_Conditional_18_Template(rf, ctx) { if (rf & 1) {
94
- i0.ɵɵelement(0, "i", 48);
226
+ function ComponentStudioDashboardComponent_Conditional_43_For_1_Conditional_23_Template(rf, ctx) { if (rf & 1) {
227
+ i0.ɵɵelement(0, "i", 50);
95
228
  } }
96
- function ComponentStudioDashboardComponent_Conditional_31_For_1_Conditional_19_Conditional_1_Template(rf, ctx) { if (rf & 1) {
97
- i0.ɵɵelementStart(0, "div", 51)(1, "label");
229
+ function ComponentStudioDashboardComponent_Conditional_43_For_1_Conditional_24_Conditional_1_Template(rf, ctx) { if (rf & 1) {
230
+ i0.ɵɵelementStart(0, "div", 78)(1, "label");
98
231
  i0.ɵɵtext(2, "Description");
99
232
  i0.ɵɵelementEnd();
100
233
  i0.ɵɵelementStart(3, "p");
101
234
  i0.ɵɵtext(4);
102
235
  i0.ɵɵelementEnd()();
103
236
  } if (rf & 2) {
104
- const component_r5 = i0.ɵɵnextContext(2).$implicit;
237
+ const component_r10 = i0.ɵɵnextContext(2).$implicit;
105
238
  const ctx_r2 = i0.ɵɵnextContext(2);
106
239
  i0.ɵɵadvance(4);
107
- i0.ɵɵtextInterpolate(ctx_r2.getComponentDescription(component_r5));
240
+ i0.ɵɵtextInterpolate(ctx_r2.getComponentDescription(component_r10));
108
241
  } }
109
- function ComponentStudioDashboardComponent_Conditional_31_For_1_Conditional_19_Conditional_21_Template(rf, ctx) { if (rf & 1) {
110
- i0.ɵɵelementStart(0, "div", 53)(1, "span", 54);
242
+ function ComponentStudioDashboardComponent_Conditional_43_For_1_Conditional_24_Conditional_21_Template(rf, ctx) { if (rf & 1) {
243
+ i0.ɵɵelementStart(0, "div", 80)(1, "span", 81);
111
244
  i0.ɵɵtext(2, "Loaded:");
112
245
  i0.ɵɵelementEnd();
113
- i0.ɵɵelementStart(3, "span", 55);
246
+ i0.ɵɵelementStart(3, "span", 82);
114
247
  i0.ɵɵtext(4);
115
248
  i0.ɵɵpipe(5, "date");
116
249
  i0.ɵɵelementEnd()();
117
250
  } if (rf & 2) {
118
- const component_r5 = i0.ɵɵnextContext(2).$implicit;
251
+ const component_r10 = i0.ɵɵnextContext(2).$implicit;
119
252
  const ctx_r2 = i0.ɵɵnextContext(2);
120
253
  i0.ɵɵadvance(4);
121
- i0.ɵɵtextInterpolate(i0.ɵɵpipeBind2(5, 1, ctx_r2.getComponentLoadedAt(component_r5), "short"));
254
+ i0.ɵɵtextInterpolate(i0.ɵɵpipeBind2(5, 1, ctx_r2.getComponentLoadedAt(component_r10), "short"));
122
255
  } }
123
- function ComponentStudioDashboardComponent_Conditional_31_For_1_Conditional_19_Conditional_22_Template(rf, ctx) { if (rf & 1) {
124
- i0.ɵɵelementStart(0, "div", 53)(1, "span", 54);
256
+ function ComponentStudioDashboardComponent_Conditional_43_For_1_Conditional_24_Conditional_22_Template(rf, ctx) { if (rf & 1) {
257
+ i0.ɵɵelementStart(0, "div", 80)(1, "span", 81);
125
258
  i0.ɵɵtext(2, "Updated:");
126
259
  i0.ɵɵelementEnd();
127
- i0.ɵɵelementStart(3, "span", 55);
260
+ i0.ɵɵelementStart(3, "span", 82);
128
261
  i0.ɵɵtext(4);
129
262
  i0.ɵɵpipe(5, "date");
130
263
  i0.ɵɵelementEnd()();
131
264
  } if (rf & 2) {
132
- const component_r5 = i0.ɵɵnextContext(2).$implicit;
265
+ const component_r10 = i0.ɵɵnextContext(2).$implicit;
133
266
  const ctx_r2 = i0.ɵɵnextContext(2);
134
267
  i0.ɵɵadvance(4);
135
- i0.ɵɵtextInterpolate(i0.ɵɵpipeBind2(5, 1, ctx_r2.getComponentUpdatedAt(component_r5), "short"));
268
+ i0.ɵɵtextInterpolate(i0.ɵɵpipeBind2(5, 1, ctx_r2.getComponentUpdatedAt(component_r10), "short"));
136
269
  } }
137
- function ComponentStudioDashboardComponent_Conditional_31_For_1_Conditional_19_Conditional_24_Template(rf, ctx) { if (rf & 1) {
138
- const _r6 = i0.ɵɵgetCurrentView();
139
- i0.ɵɵelementStart(0, "button", 8);
140
- i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_31_For_1_Conditional_19_Conditional_24_Template_button_click_0_listener($event) { i0.ɵɵrestoreView(_r6); const ctx_r2 = i0.ɵɵnextContext(4); ctx_r2.stopComponent(); return i0.ɵɵresetView($event.stopPropagation()); });
141
- i0.ɵɵelement(1, "span", 58);
270
+ function ComponentStudioDashboardComponent_Conditional_43_For_1_Conditional_24_Conditional_24_Template(rf, ctx) { if (rf & 1) {
271
+ const _r12 = i0.ɵɵgetCurrentView();
272
+ i0.ɵɵelementStart(0, "button", 9);
273
+ i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_43_For_1_Conditional_24_Conditional_24_Template_button_click_0_listener($event) { i0.ɵɵrestoreView(_r12); const ctx_r2 = i0.ɵɵnextContext(4); ctx_r2.stopComponent(); return i0.ɵɵresetView($event.stopPropagation()); });
274
+ i0.ɵɵelement(1, "span", 85);
142
275
  i0.ɵɵtext(2, " Stop Component ");
143
276
  i0.ɵɵelementEnd();
144
277
  } if (rf & 2) {
145
278
  i0.ɵɵproperty("themeColor", "error");
146
279
  } }
147
- function ComponentStudioDashboardComponent_Conditional_31_For_1_Conditional_19_Conditional_25_Template(rf, ctx) { if (rf & 1) {
148
- const _r7 = i0.ɵɵgetCurrentView();
149
- i0.ɵɵelementStart(0, "button", 59);
150
- i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_31_For_1_Conditional_19_Conditional_25_Template_button_click_0_listener($event) { i0.ɵɵrestoreView(_r7); const component_r5 = i0.ɵɵnextContext(2).$implicit; const ctx_r2 = i0.ɵɵnextContext(2); ctx_r2.runComponent(component_r5); return i0.ɵɵresetView($event.stopPropagation()); });
151
- i0.ɵɵelement(1, "span", 60);
280
+ function ComponentStudioDashboardComponent_Conditional_43_For_1_Conditional_24_Conditional_25_Template(rf, ctx) { if (rf & 1) {
281
+ const _r13 = i0.ɵɵgetCurrentView();
282
+ i0.ɵɵelementStart(0, "button", 86);
283
+ i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_43_For_1_Conditional_24_Conditional_25_Template_button_click_0_listener($event) { i0.ɵɵrestoreView(_r13); const component_r10 = i0.ɵɵnextContext(2).$implicit; const ctx_r2 = i0.ɵɵnextContext(2); ctx_r2.runComponent(component_r10); return i0.ɵɵresetView($event.stopPropagation()); });
284
+ i0.ɵɵelement(1, "span", 87);
152
285
  i0.ɵɵtext(2, " Switch to This Component ");
153
286
  i0.ɵɵelementEnd();
154
287
  } if (rf & 2) {
155
288
  i0.ɵɵproperty("themeColor", "base");
156
289
  } }
157
- function ComponentStudioDashboardComponent_Conditional_31_For_1_Conditional_19_Conditional_26_Template(rf, ctx) { if (rf & 1) {
158
- const _r8 = i0.ɵɵgetCurrentView();
159
- i0.ɵɵelementStart(0, "button", 8);
160
- i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_31_For_1_Conditional_19_Conditional_26_Template_button_click_0_listener($event) { i0.ɵɵrestoreView(_r8); const component_r5 = i0.ɵɵnextContext(2).$implicit; const ctx_r2 = i0.ɵɵnextContext(2); ctx_r2.runComponent(component_r5); return i0.ɵɵresetView($event.stopPropagation()); });
161
- i0.ɵɵelement(1, "span", 60);
290
+ function ComponentStudioDashboardComponent_Conditional_43_For_1_Conditional_24_Conditional_26_Template(rf, ctx) { if (rf & 1) {
291
+ const _r14 = i0.ɵɵgetCurrentView();
292
+ i0.ɵɵelementStart(0, "button", 9);
293
+ i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_43_For_1_Conditional_24_Conditional_26_Template_button_click_0_listener($event) { i0.ɵɵrestoreView(_r14); const component_r10 = i0.ɵɵnextContext(2).$implicit; const ctx_r2 = i0.ɵɵnextContext(2); ctx_r2.runComponent(component_r10); return i0.ɵɵresetView($event.stopPropagation()); });
294
+ i0.ɵɵelement(1, "span", 87);
162
295
  i0.ɵɵtext(2, " Run Component ");
163
296
  i0.ɵɵelementEnd();
164
297
  } if (rf & 2) {
165
298
  i0.ɵɵproperty("themeColor", "primary");
166
299
  } }
167
- function ComponentStudioDashboardComponent_Conditional_31_For_1_Conditional_19_Template(rf, ctx) { if (rf & 1) {
168
- i0.ɵɵelementStart(0, "div", 49);
169
- i0.ɵɵtemplate(1, ComponentStudioDashboardComponent_Conditional_31_For_1_Conditional_19_Conditional_1_Template, 5, 1, "div", 51);
170
- i0.ɵɵelementStart(2, "div", 51)(3, "label");
300
+ function ComponentStudioDashboardComponent_Conditional_43_For_1_Conditional_24_Template(rf, ctx) { if (rf & 1) {
301
+ i0.ɵɵelementStart(0, "div", 74);
302
+ i0.ɵɵtemplate(1, ComponentStudioDashboardComponent_Conditional_43_For_1_Conditional_24_Conditional_1_Template, 5, 1, "div", 78);
303
+ i0.ɵɵelementStart(2, "div", 78)(3, "label");
171
304
  i0.ɵɵtext(4, "Component Info");
172
305
  i0.ɵɵelementEnd();
173
- i0.ɵɵelementStart(5, "div", 52)(6, "div", 53)(7, "span", 54);
306
+ i0.ɵɵelementStart(5, "div", 79)(6, "div", 80)(7, "span", 81);
174
307
  i0.ɵɵtext(8, "Type:");
175
308
  i0.ɵɵelementEnd();
176
- i0.ɵɵelementStart(9, "span", 55);
309
+ i0.ɵɵelementStart(9, "span", 82);
177
310
  i0.ɵɵtext(10);
178
311
  i0.ɵɵelementEnd()();
179
- i0.ɵɵelementStart(11, "div", 53)(12, "span", 54);
312
+ i0.ɵɵelementStart(11, "div", 80)(12, "span", 81);
180
313
  i0.ɵɵtext(13, "Version:");
181
314
  i0.ɵɵelementEnd();
182
- i0.ɵɵelementStart(14, "span", 55);
315
+ i0.ɵɵelementStart(14, "span", 82);
183
316
  i0.ɵɵtext(15);
184
317
  i0.ɵɵelementEnd()();
185
- i0.ɵɵelementStart(16, "div", 53)(17, "span", 54);
318
+ i0.ɵɵelementStart(16, "div", 80)(17, "span", 81);
186
319
  i0.ɵɵtext(18, "Status:");
187
320
  i0.ɵɵelementEnd();
188
- i0.ɵɵelementStart(19, "span", 55);
321
+ i0.ɵɵelementStart(19, "span", 82);
189
322
  i0.ɵɵtext(20);
190
323
  i0.ɵɵelementEnd()();
191
- i0.ɵɵtemplate(21, ComponentStudioDashboardComponent_Conditional_31_For_1_Conditional_19_Conditional_21_Template, 6, 4, "div", 53)(22, ComponentStudioDashboardComponent_Conditional_31_For_1_Conditional_19_Conditional_22_Template, 6, 4, "div", 53);
324
+ i0.ɵɵtemplate(21, ComponentStudioDashboardComponent_Conditional_43_For_1_Conditional_24_Conditional_21_Template, 6, 4, "div", 80)(22, ComponentStudioDashboardComponent_Conditional_43_For_1_Conditional_24_Conditional_22_Template, 6, 4, "div", 80);
192
325
  i0.ɵɵelementEnd()();
193
- i0.ɵɵelementStart(23, "div", 56);
194
- i0.ɵɵtemplate(24, ComponentStudioDashboardComponent_Conditional_31_For_1_Conditional_19_Conditional_24_Template, 3, 1, "button", 7)(25, ComponentStudioDashboardComponent_Conditional_31_For_1_Conditional_19_Conditional_25_Template, 3, 1, "button", 57)(26, ComponentStudioDashboardComponent_Conditional_31_For_1_Conditional_19_Conditional_26_Template, 3, 1, "button", 7);
326
+ i0.ɵɵelementStart(23, "div", 83);
327
+ i0.ɵɵtemplate(24, ComponentStudioDashboardComponent_Conditional_43_For_1_Conditional_24_Conditional_24_Template, 3, 1, "button", 7)(25, ComponentStudioDashboardComponent_Conditional_43_For_1_Conditional_24_Conditional_25_Template, 3, 1, "button", 84)(26, ComponentStudioDashboardComponent_Conditional_43_For_1_Conditional_24_Conditional_26_Template, 3, 1, "button", 7);
195
328
  i0.ɵɵelementEnd()();
196
329
  } if (rf & 2) {
197
- const component_r5 = i0.ɵɵnextContext().$implicit;
330
+ const component_r10 = i0.ɵɵnextContext().$implicit;
198
331
  const ctx_r2 = i0.ɵɵnextContext(2);
199
332
  i0.ɵɵadvance();
200
- i0.ɵɵconditional(ctx_r2.getComponentDescription(component_r5) ? 1 : -1);
333
+ i0.ɵɵconditional(ctx_r2.getComponentDescription(component_r10) ? 1 : -1);
201
334
  i0.ɵɵadvance(9);
202
- i0.ɵɵtextInterpolate(ctx_r2.getComponentType(component_r5) || "Unknown");
335
+ i0.ɵɵtextInterpolate(ctx_r2.getComponentType(component_r10) || "Unknown");
203
336
  i0.ɵɵadvance(5);
204
- i0.ɵɵtextInterpolate(ctx_r2.getComponentVersion(component_r5));
337
+ i0.ɵɵtextInterpolate(ctx_r2.getComponentVersion(component_r10));
205
338
  i0.ɵɵadvance(5);
206
- i0.ɵɵtextInterpolate(ctx_r2.getComponentStatus(component_r5) || "Draft");
339
+ i0.ɵɵtextInterpolate(ctx_r2.getComponentStatus(component_r10) || "Draft");
207
340
  i0.ɵɵadvance();
208
- i0.ɵɵconditional(ctx_r2.isFileLoadedComponent(component_r5) ? 21 : !ctx_r2.isFileLoadedComponent(component_r5) && ctx_r2.getComponentUpdatedAt(component_r5) ? 22 : -1);
341
+ i0.ɵɵconditional(ctx_r2.isFileLoadedComponent(component_r10) ? 21 : !ctx_r2.isFileLoadedComponent(component_r10) && ctx_r2.getComponentUpdatedAt(component_r10) ? 22 : -1);
209
342
  i0.ɵɵadvance(3);
210
- i0.ɵɵconditional(ctx_r2.selectedComponent && ctx_r2.getComponentId(ctx_r2.selectedComponent) === ctx_r2.getComponentId(component_r5) && ctx_r2.isRunning ? 24 : ctx_r2.isRunning && ctx_r2.selectedComponent && ctx_r2.getComponentId(ctx_r2.selectedComponent) !== ctx_r2.getComponentId(component_r5) ? 25 : 26);
343
+ i0.ɵɵconditional(ctx_r2.selectedComponent && ctx_r2.getComponentId(ctx_r2.selectedComponent) === ctx_r2.getComponentId(component_r10) && ctx_r2.isRunning ? 24 : ctx_r2.isRunning && ctx_r2.selectedComponent && ctx_r2.getComponentId(ctx_r2.selectedComponent) !== ctx_r2.getComponentId(component_r10) ? 25 : 26);
211
344
  } }
212
- function ComponentStudioDashboardComponent_Conditional_31_For_1_Template(rf, ctx) { if (rf & 1) {
213
- const _r4 = i0.ɵɵgetCurrentView();
214
- i0.ɵɵelementStart(0, "div", 33)(1, "div", 34);
215
- i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_31_For_1_Template_div_click_1_listener() { const component_r5 = i0.ɵɵrestoreView(_r4).$implicit; const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.toggleComponentExpansion(component_r5)); });
216
- i0.ɵɵelementStart(2, "div", 35);
217
- i0.ɵɵelement(3, "i", 36);
345
+ function ComponentStudioDashboardComponent_Conditional_43_For_1_Template(rf, ctx) { if (rf & 1) {
346
+ const _r9 = i0.ɵɵgetCurrentView();
347
+ i0.ɵɵelementStart(0, "div", 57)(1, "div", 58);
348
+ i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_43_For_1_Template_div_click_1_listener() { const component_r10 = i0.ɵɵrestoreView(_r9).$implicit; const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.toggleComponentExpansion(component_r10)); });
349
+ i0.ɵɵelementStart(2, "div", 59);
350
+ i0.ɵɵelement(3, "i", 60);
218
351
  i0.ɵɵelementEnd();
219
- i0.ɵɵelementStart(4, "div", 37)(5, "div", 38);
220
- i0.ɵɵtext(6);
221
- i0.ɵɵtemplate(7, ComponentStudioDashboardComponent_Conditional_31_For_1_Conditional_7_Template, 3, 3, "span", 39);
352
+ i0.ɵɵtemplate(4, ComponentStudioDashboardComponent_Conditional_43_For_1_Conditional_4_Template, 3, 4, "button", 61);
353
+ i0.ɵɵelementStart(5, "div", 62)(6, "div", 63);
354
+ i0.ɵɵtext(7);
355
+ i0.ɵɵtemplate(8, ComponentStudioDashboardComponent_Conditional_43_For_1_Conditional_8_Template, 3, 2, "span", 64);
222
356
  i0.ɵɵelementEnd();
223
- i0.ɵɵelementStart(8, "div", 40)(9, "span", 41);
224
- i0.ɵɵtext(10);
357
+ i0.ɵɵelementStart(9, "div", 65)(10, "span", 66);
358
+ i0.ɵɵtext(11);
359
+ i0.ɵɵelementEnd();
360
+ i0.ɵɵelementStart(12, "span", 67);
361
+ i0.ɵɵtext(13);
225
362
  i0.ɵɵelementEnd();
226
- i0.ɵɵelementStart(11, "span", 42);
227
- i0.ɵɵtext(12);
363
+ i0.ɵɵtemplate(14, ComponentStudioDashboardComponent_Conditional_43_For_1_Conditional_14_Template, 2, 1)(15, ComponentStudioDashboardComponent_Conditional_43_For_1_Conditional_15_Template, 2, 0, "span", 68)(16, ComponentStudioDashboardComponent_Conditional_43_For_1_Conditional_16_Template, 2, 0, "span", 69);
228
364
  i0.ɵɵelementEnd();
229
- i0.ɵɵtemplate(13, ComponentStudioDashboardComponent_Conditional_31_For_1_Conditional_13_Template, 2, 0, "span", 43)(14, ComponentStudioDashboardComponent_Conditional_31_For_1_Conditional_14_Template, 2, 0, "span", 44)(15, ComponentStudioDashboardComponent_Conditional_31_For_1_Conditional_15_Template, 2, 0, "span", 45);
230
- i0.ɵɵelementEnd()();
231
- i0.ɵɵelementStart(16, "div", 46);
232
- i0.ɵɵtemplate(17, ComponentStudioDashboardComponent_Conditional_31_For_1_Conditional_17_Template, 1, 0, "i", 47)(18, ComponentStudioDashboardComponent_Conditional_31_For_1_Conditional_18_Template, 1, 0, "i", 48);
365
+ i0.ɵɵelementStart(17, "div", 70)(18, "span", 71);
366
+ i0.ɵɵelement(19, "i", 72);
367
+ i0.ɵɵtext(20);
368
+ i0.ɵɵelementEnd()()();
369
+ i0.ɵɵelementStart(21, "div", 73);
370
+ i0.ɵɵtemplate(22, ComponentStudioDashboardComponent_Conditional_43_For_1_Conditional_22_Template, 1, 0, "i", 49)(23, ComponentStudioDashboardComponent_Conditional_43_For_1_Conditional_23_Template, 1, 0, "i", 50);
233
371
  i0.ɵɵelementEnd()();
234
- i0.ɵɵtemplate(19, ComponentStudioDashboardComponent_Conditional_31_For_1_Conditional_19_Template, 27, 6, "div", 49);
372
+ i0.ɵɵtemplate(24, ComponentStudioDashboardComponent_Conditional_43_For_1_Conditional_24_Template, 27, 6, "div", 74);
235
373
  i0.ɵɵelementEnd();
236
374
  } if (rf & 2) {
237
- const component_r5 = ctx.$implicit;
375
+ const component_r10 = ctx.$implicit;
238
376
  const ctx_r2 = i0.ɵɵnextContext(2);
239
- i0.ɵɵclassProp("expanded", ctx_r2.expandedComponent && ctx_r2.getComponentId(ctx_r2.expandedComponent) === ctx_r2.getComponentId(component_r5))("running", ctx_r2.selectedComponent && ctx_r2.getComponentId(ctx_r2.selectedComponent) === ctx_r2.getComponentId(component_r5) && ctx_r2.isRunning)("file-loaded", ctx_r2.isFileLoadedComponent(component_r5));
377
+ i0.ɵɵclassProp("expanded", ctx_r2.expandedComponent && ctx_r2.getComponentId(ctx_r2.expandedComponent) === ctx_r2.getComponentId(component_r10))("running", ctx_r2.selectedComponent && ctx_r2.getComponentId(ctx_r2.selectedComponent) === ctx_r2.getComponentId(component_r10) && ctx_r2.isRunning)("file-loaded", ctx_r2.isFileLoadedComponent(component_r10));
240
378
  i0.ɵɵadvance(2);
241
- i0.ɵɵstyleProp("color", ctx_r2.getComponentTypeColor(ctx_r2.getComponentType(component_r5)));
379
+ i0.ɵɵstyleProp("color", ctx_r2.getComponentTypeColor(ctx_r2.getComponentType(component_r10)));
380
+ i0.ɵɵadvance();
381
+ i0.ɵɵproperty("ngClass", ctx_r2.getComponentTypeIcon(ctx_r2.getComponentType(component_r10)));
242
382
  i0.ɵɵadvance();
243
- i0.ɵɵproperty("ngClass", ctx_r2.getComponentTypeIcon(ctx_r2.getComponentType(component_r5)));
383
+ i0.ɵɵconditional(!ctx_r2.isFileLoadedComponent(component_r10) ? 4 : -1);
244
384
  i0.ɵɵadvance(3);
245
- i0.ɵɵtextInterpolate1(" ", ctx_r2.getComponentName(component_r5), " ");
385
+ i0.ɵɵtextInterpolate1(" ", ctx_r2.getComponentName(component_r10), " ");
246
386
  i0.ɵɵadvance();
247
- i0.ɵɵconditional(ctx_r2.isFileLoadedComponent(component_r5) ? 7 : -1);
387
+ i0.ɵɵconditional(ctx_r2.isFileLoadedComponent(component_r10) ? 8 : -1);
248
388
  i0.ɵɵadvance(3);
249
- i0.ɵɵtextInterpolate(ctx_r2.getComponentType(component_r5) || "Component");
389
+ i0.ɵɵtextInterpolate(ctx_r2.getComponentType(component_r10) || "Component");
250
390
  i0.ɵɵadvance(2);
251
- i0.ɵɵtextInterpolate1("v", ctx_r2.getComponentVersion(component_r5), "");
391
+ i0.ɵɵtextInterpolate1("v", ctx_r2.getComponentVersion(component_r10), "");
252
392
  i0.ɵɵadvance();
253
- i0.ɵɵconditional(ctx_r2.isFileLoadedComponent(component_r5) ? 13 : ctx_r2.getComponentStatus(component_r5) === "Published" ? 14 : 15);
393
+ i0.ɵɵconditional(ctx_r2.isFileLoadedComponent(component_r10) ? 14 : ctx_r2.getComponentStatus(component_r10) === "Published" ? 15 : 16);
254
394
  i0.ɵɵadvance(4);
255
- i0.ɵɵconditional(ctx_r2.expandedComponent && ctx_r2.getComponentId(ctx_r2.expandedComponent) === ctx_r2.getComponentId(component_r5) ? 17 : 18);
395
+ i0.ɵɵstyleProp("background-color", ctx_r2.getNamespaceColor(ctx_r2.getComponentNamespace(component_r10)));
396
+ i0.ɵɵproperty("title", ctx_r2.getComponentNamespace(component_r10) || "Uncategorized");
256
397
  i0.ɵɵadvance(2);
257
- i0.ɵɵconditional(ctx_r2.expandedComponent && ctx_r2.getComponentId(ctx_r2.expandedComponent) === ctx_r2.getComponentId(component_r5) ? 19 : -1);
398
+ i0.ɵɵtextInterpolate1(" ", ctx_r2.formatNamespace(ctx_r2.getComponentNamespace(component_r10)), " ");
399
+ i0.ɵɵadvance(2);
400
+ i0.ɵɵconditional(ctx_r2.expandedComponent && ctx_r2.getComponentId(ctx_r2.expandedComponent) === ctx_r2.getComponentId(component_r10) ? 22 : 23);
401
+ i0.ɵɵadvance(2);
402
+ i0.ɵɵconditional(ctx_r2.expandedComponent && ctx_r2.getComponentId(ctx_r2.expandedComponent) === ctx_r2.getComponentId(component_r10) ? 24 : -1);
258
403
  } }
259
- function ComponentStudioDashboardComponent_Conditional_31_Template(rf, ctx) { if (rf & 1) {
260
- i0.ɵɵrepeaterCreate(0, ComponentStudioDashboardComponent_Conditional_31_For_1_Template, 20, 16, "div", 32, _forTrack0, true);
404
+ function ComponentStudioDashboardComponent_Conditional_43_Template(rf, ctx) { if (rf & 1) {
405
+ i0.ɵɵrepeaterCreate(0, ComponentStudioDashboardComponent_Conditional_43_For_1_Template, 25, 21, "div", 56, _forTrack1, true);
261
406
  } if (rf & 2) {
262
407
  const ctx_r2 = i0.ɵɵnextContext();
263
408
  i0.ɵɵrepeater(ctx_r2.filteredComponents);
264
409
  } }
265
- function ComponentStudioDashboardComponent_Conditional_34_Conditional_3_Conditional_0_Conditional_18_Template(rf, ctx) { if (rf & 1) {
266
- i0.ɵɵelementStart(0, "details", 77)(1, "summary");
410
+ function ComponentStudioDashboardComponent_Conditional_46_Conditional_3_Conditional_0_Conditional_18_Template(rf, ctx) { if (rf & 1) {
411
+ i0.ɵɵelementStart(0, "details", 103)(1, "summary");
267
412
  i0.ɵɵtext(2, "Technical Details (click to expand)");
268
413
  i0.ɵɵelementEnd();
269
414
  i0.ɵɵelementStart(3, "pre");
@@ -274,21 +419,21 @@ function ComponentStudioDashboardComponent_Conditional_34_Conditional_3_Conditio
274
419
  i0.ɵɵadvance(4);
275
420
  i0.ɵɵtextInterpolate(ctx_r2.formatTechnicalDetails(ctx_r2.currentError.technicalDetails));
276
421
  } }
277
- function ComponentStudioDashboardComponent_Conditional_34_Conditional_3_Conditional_0_Template(rf, ctx) { if (rf & 1) {
278
- const _r10 = i0.ɵɵgetCurrentView();
279
- i0.ɵɵelementStart(0, "div", 68)(1, "div", 70)(2, "div", 71);
280
- i0.ɵɵelement(3, "i", 72);
422
+ function ComponentStudioDashboardComponent_Conditional_46_Conditional_3_Conditional_0_Template(rf, ctx) { if (rf & 1) {
423
+ const _r16 = i0.ɵɵgetCurrentView();
424
+ i0.ɵɵelementStart(0, "div", 94)(1, "div", 96)(2, "div", 97);
425
+ i0.ɵɵelement(3, "i", 98);
281
426
  i0.ɵɵelementStart(4, "h3");
282
427
  i0.ɵɵtext(5, "Component Error");
283
428
  i0.ɵɵelementEnd();
284
- i0.ɵɵelementStart(6, "button", 73);
285
- i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_34_Conditional_3_Conditional_0_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r10); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.copyErrorToClipboard()); });
286
- i0.ɵɵelement(7, "i", 74);
429
+ i0.ɵɵelementStart(6, "button", 99);
430
+ i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_46_Conditional_3_Conditional_0_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r16); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.copyErrorToClipboard()); });
431
+ i0.ɵɵelement(7, "i", 100);
287
432
  i0.ɵɵelementEnd()();
288
- i0.ɵɵelementStart(8, "p", 75);
433
+ i0.ɵɵelementStart(8, "p", 101);
289
434
  i0.ɵɵtext(9, " The component could not be rendered due to the following error: ");
290
435
  i0.ɵɵelementEnd();
291
- i0.ɵɵelementStart(10, "div", 76)(11, "strong");
436
+ i0.ɵɵelementStart(10, "div", 102)(11, "strong");
292
437
  i0.ɵɵtext(12, "Error Type:");
293
438
  i0.ɵɵelementEnd();
294
439
  i0.ɵɵtext(13);
@@ -297,9 +442,9 @@ function ComponentStudioDashboardComponent_Conditional_34_Conditional_3_Conditio
297
442
  i0.ɵɵtext(16, "Message:");
298
443
  i0.ɵɵelementEnd();
299
444
  i0.ɵɵtext(17);
300
- i0.ɵɵtemplate(18, ComponentStudioDashboardComponent_Conditional_34_Conditional_3_Conditional_0_Conditional_18_Template, 5, 1, "details", 77);
445
+ i0.ɵɵtemplate(18, ComponentStudioDashboardComponent_Conditional_46_Conditional_3_Conditional_0_Conditional_18_Template, 5, 1, "details", 103);
301
446
  i0.ɵɵelementEnd();
302
- i0.ɵɵelementStart(19, "div", 78)(20, "strong");
447
+ i0.ɵɵelementStart(19, "div", 104)(20, "strong");
303
448
  i0.ɵɵtext(21, "What to do:");
304
449
  i0.ɵɵelementEnd();
305
450
  i0.ɵɵelementStart(22, "ol")(23, "li");
@@ -314,14 +459,14 @@ function ComponentStudioDashboardComponent_Conditional_34_Conditional_3_Conditio
314
459
  i0.ɵɵelementStart(29, "li");
315
460
  i0.ɵɵtext(30, "Contact your system administrator if the issue persists");
316
461
  i0.ɵɵelementEnd()()();
317
- i0.ɵɵelementStart(31, "div", 79)(32, "button", 80);
318
- i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_34_Conditional_3_Conditional_0_Template_button_click_32_listener() { i0.ɵɵrestoreView(_r10); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.retryComponent()); });
319
- i0.ɵɵelement(33, "span", 81);
462
+ i0.ɵɵelementStart(31, "div", 105)(32, "button", 106);
463
+ i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_46_Conditional_3_Conditional_0_Template_button_click_32_listener() { i0.ɵɵrestoreView(_r16); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.retryComponent()); });
464
+ i0.ɵɵelement(33, "span", 107);
320
465
  i0.ɵɵtext(34, " Retry ");
321
466
  i0.ɵɵelementEnd();
322
- i0.ɵɵelementStart(35, "button", 8);
323
- i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_34_Conditional_3_Conditional_0_Template_button_click_35_listener() { i0.ɵɵrestoreView(_r10); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.stopComponent()); });
324
- i0.ɵɵelement(36, "span", 58);
467
+ i0.ɵɵelementStart(35, "button", 9);
468
+ i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_46_Conditional_3_Conditional_0_Template_button_click_35_listener() { i0.ɵɵrestoreView(_r16); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.stopComponent()); });
469
+ i0.ɵɵelement(36, "span", 85);
325
470
  i0.ɵɵtext(37, " Stop ");
326
471
  i0.ɵɵelementEnd()()()();
327
472
  } if (rf & 2) {
@@ -335,34 +480,34 @@ function ComponentStudioDashboardComponent_Conditional_34_Conditional_3_Conditio
335
480
  i0.ɵɵadvance(17);
336
481
  i0.ɵɵproperty("themeColor", "error");
337
482
  } }
338
- function ComponentStudioDashboardComponent_Conditional_34_Conditional_3_Conditional_1_Template(rf, ctx) { if (rf & 1) {
339
- const _r11 = i0.ɵɵgetCurrentView();
340
- i0.ɵɵelementStart(0, "mj-react-component", 82);
341
- i0.ɵɵlistener("componentEvent", function ComponentStudioDashboardComponent_Conditional_34_Conditional_3_Conditional_1_Template_mj_react_component_componentEvent_0_listener($event) { i0.ɵɵrestoreView(_r11); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.onComponentEvent($event)); })("openEntityRecord", function ComponentStudioDashboardComponent_Conditional_34_Conditional_3_Conditional_1_Template_mj_react_component_openEntityRecord_0_listener($event) { i0.ɵɵrestoreView(_r11); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.onOpenEntityRecord($event)); });
483
+ function ComponentStudioDashboardComponent_Conditional_46_Conditional_3_Conditional_1_Template(rf, ctx) { if (rf & 1) {
484
+ const _r17 = i0.ɵɵgetCurrentView();
485
+ i0.ɵɵelementStart(0, "mj-react-component", 108);
486
+ i0.ɵɵlistener("componentEvent", function ComponentStudioDashboardComponent_Conditional_46_Conditional_3_Conditional_1_Template_mj_react_component_componentEvent_0_listener($event) { i0.ɵɵrestoreView(_r17); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.onComponentEvent($event)); })("openEntityRecord", function ComponentStudioDashboardComponent_Conditional_46_Conditional_3_Conditional_1_Template_mj_react_component_openEntityRecord_0_listener($event) { i0.ɵɵrestoreView(_r17); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.onOpenEntityRecord($event)); });
342
487
  i0.ɵɵelementEnd();
343
488
  } if (rf & 2) {
344
489
  const ctx_r2 = i0.ɵɵnextContext(3);
345
490
  i0.ɵɵproperty("component", ctx_r2.componentSpec);
346
491
  } }
347
- function ComponentStudioDashboardComponent_Conditional_34_Conditional_3_Template(rf, ctx) { if (rf & 1) {
348
- i0.ɵɵtemplate(0, ComponentStudioDashboardComponent_Conditional_34_Conditional_3_Conditional_0_Template, 38, 4, "div", 68)(1, ComponentStudioDashboardComponent_Conditional_34_Conditional_3_Conditional_1_Template, 1, 1, "mj-react-component", 69);
492
+ function ComponentStudioDashboardComponent_Conditional_46_Conditional_3_Template(rf, ctx) { if (rf & 1) {
493
+ i0.ɵɵtemplate(0, ComponentStudioDashboardComponent_Conditional_46_Conditional_3_Conditional_0_Template, 38, 4, "div", 94)(1, ComponentStudioDashboardComponent_Conditional_46_Conditional_3_Conditional_1_Template, 1, 1, "mj-react-component", 95);
349
494
  } if (rf & 2) {
350
495
  const ctx_r2 = i0.ɵɵnextContext(2);
351
496
  i0.ɵɵconditional(ctx_r2.currentError ? 0 : 1);
352
497
  } }
353
- function ComponentStudioDashboardComponent_Conditional_34_Conditional_4_Template(rf, ctx) { if (rf & 1) {
354
- const _r12 = i0.ɵɵgetCurrentView();
355
- i0.ɵɵelementStart(0, "div", 63);
356
- i0.ɵɵelement(1, "i", 83);
498
+ function ComponentStudioDashboardComponent_Conditional_46_Conditional_4_Template(rf, ctx) { if (rf & 1) {
499
+ const _r18 = i0.ɵɵgetCurrentView();
500
+ i0.ɵɵelementStart(0, "div", 90);
501
+ i0.ɵɵelement(1, "i", 109);
357
502
  i0.ɵɵelementStart(2, "h3");
358
503
  i0.ɵɵtext(3);
359
504
  i0.ɵɵelementEnd();
360
505
  i0.ɵɵelementStart(4, "p");
361
506
  i0.ɵɵtext(5);
362
507
  i0.ɵɵelementEnd();
363
- i0.ɵɵelementStart(6, "button", 84);
364
- i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_34_Conditional_4_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r12); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.runComponent(ctx_r2.selectedComponent)); });
365
- i0.ɵɵelement(7, "span", 60);
508
+ i0.ɵɵelementStart(6, "button", 110);
509
+ i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_46_Conditional_4_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r18); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.runComponent(ctx_r2.selectedComponent)); });
510
+ i0.ɵɵelement(7, "span", 87);
366
511
  i0.ɵɵtext(8, " Run Component ");
367
512
  i0.ɵɵelementEnd()();
368
513
  } if (rf & 2) {
@@ -374,43 +519,43 @@ function ComponentStudioDashboardComponent_Conditional_34_Conditional_4_Template
374
519
  i0.ɵɵadvance();
375
520
  i0.ɵɵproperty("themeColor", "primary")("size", "large");
376
521
  } }
377
- function ComponentStudioDashboardComponent_Conditional_34_ng_template_8_Conditional_6_Template(rf, ctx) { if (rf & 1) {
378
- const _r14 = i0.ɵɵgetCurrentView();
379
- i0.ɵɵelementStart(0, "button", 8);
380
- i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_34_ng_template_8_Conditional_6_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r14); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.applySpecChanges()); });
381
- i0.ɵɵelement(1, "span", 91);
522
+ function ComponentStudioDashboardComponent_Conditional_46_ng_template_9_Conditional_6_Template(rf, ctx) { if (rf & 1) {
523
+ const _r20 = i0.ɵɵgetCurrentView();
524
+ i0.ɵɵelementStart(0, "button", 9);
525
+ i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_46_ng_template_9_Conditional_6_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r20); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.applySpecChanges()); });
526
+ i0.ɵɵelement(1, "span", 117);
382
527
  i0.ɵɵtext(2, " Apply Changes ");
383
528
  i0.ɵɵelementEnd();
384
- i0.ɵɵelementStart(3, "button", 80);
385
- i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_34_ng_template_8_Conditional_6_Template_button_click_3_listener() { i0.ɵɵrestoreView(_r14); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.initializeEditors()); });
386
- i0.ɵɵelement(4, "span", 92);
529
+ i0.ɵɵelementStart(3, "button", 106);
530
+ i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_46_ng_template_9_Conditional_6_Template_button_click_3_listener() { i0.ɵɵrestoreView(_r20); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.initializeEditors()); });
531
+ i0.ɵɵelement(4, "span", 52);
387
532
  i0.ɵɵtext(5, " Cancel ");
388
533
  i0.ɵɵelementEnd();
389
534
  } if (rf & 2) {
390
535
  i0.ɵɵproperty("themeColor", "primary");
391
536
  } }
392
- function ComponentStudioDashboardComponent_Conditional_34_ng_template_8_Conditional_7_Template(rf, ctx) { if (rf & 1) {
393
- const _r15 = i0.ɵɵgetCurrentView();
394
- i0.ɵɵelementStart(0, "button", 8);
395
- i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_34_ng_template_8_Conditional_7_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r15); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.refreshComponent()); });
396
- i0.ɵɵelement(1, "span", 11);
537
+ function ComponentStudioDashboardComponent_Conditional_46_ng_template_9_Conditional_7_Template(rf, ctx) { if (rf & 1) {
538
+ const _r21 = i0.ɵɵgetCurrentView();
539
+ i0.ɵɵelementStart(0, "button", 9);
540
+ i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_46_ng_template_9_Conditional_7_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r21); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.refreshComponent()); });
541
+ i0.ɵɵelement(1, "span", 14);
397
542
  i0.ɵɵtext(2, " Refresh Component ");
398
543
  i0.ɵɵelementEnd();
399
544
  } if (rf & 2) {
400
545
  i0.ɵɵproperty("themeColor", "info");
401
546
  } }
402
- function ComponentStudioDashboardComponent_Conditional_34_ng_template_8_Template(rf, ctx) { if (rf & 1) {
403
- const _r13 = i0.ɵɵgetCurrentView();
404
- i0.ɵɵelementStart(0, "div", 85)(1, "div", 86)(2, "h4");
405
- i0.ɵɵelement(3, "i", 87);
547
+ function ComponentStudioDashboardComponent_Conditional_46_ng_template_9_Template(rf, ctx) { if (rf & 1) {
548
+ const _r19 = i0.ɵɵgetCurrentView();
549
+ i0.ɵɵelementStart(0, "div", 111)(1, "div", 112)(2, "h4");
550
+ i0.ɵɵelement(3, "i", 113);
406
551
  i0.ɵɵtext(4, " Component Specification (JSON)");
407
552
  i0.ɵɵelementEnd();
408
- i0.ɵɵelementStart(5, "div", 88);
409
- i0.ɵɵtemplate(6, ComponentStudioDashboardComponent_Conditional_34_ng_template_8_Conditional_6_Template, 6, 1)(7, ComponentStudioDashboardComponent_Conditional_34_ng_template_8_Conditional_7_Template, 3, 1, "button", 7);
553
+ i0.ɵɵelementStart(5, "div", 114);
554
+ i0.ɵɵtemplate(6, ComponentStudioDashboardComponent_Conditional_46_ng_template_9_Conditional_6_Template, 6, 1)(7, ComponentStudioDashboardComponent_Conditional_46_ng_template_9_Conditional_7_Template, 3, 1, "button", 7);
410
555
  i0.ɵɵelementEnd()();
411
- i0.ɵɵelementStart(8, "div", 89)(9, "mj-code-editor", 90);
412
- i0.ɵɵtwoWayListener("ngModelChange", function ComponentStudioDashboardComponent_Conditional_34_ng_template_8_Template_mj_code_editor_ngModelChange_9_listener($event) { i0.ɵɵrestoreView(_r13); const ctx_r2 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r2.editableSpec, $event) || (ctx_r2.editableSpec = $event); return i0.ɵɵresetView($event); });
413
- i0.ɵɵlistener("ngModelChange", function ComponentStudioDashboardComponent_Conditional_34_ng_template_8_Template_mj_code_editor_ngModelChange_9_listener($event) { i0.ɵɵrestoreView(_r13); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.onSpecChange($event)); });
556
+ i0.ɵɵelementStart(8, "div", 115)(9, "mj-code-editor", 116);
557
+ i0.ɵɵtwoWayListener("ngModelChange", function ComponentStudioDashboardComponent_Conditional_46_ng_template_9_Template_mj_code_editor_ngModelChange_9_listener($event) { i0.ɵɵrestoreView(_r19); const ctx_r2 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r2.editableSpec, $event) || (ctx_r2.editableSpec = $event); return i0.ɵɵresetView($event); });
558
+ i0.ɵɵlistener("ngModelChange", function ComponentStudioDashboardComponent_Conditional_46_ng_template_9_Template_mj_code_editor_ngModelChange_9_listener($event) { i0.ɵɵrestoreView(_r19); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.onSpecChange($event)); });
414
559
  i0.ɵɵelementEnd()()();
415
560
  } if (rf & 2) {
416
561
  const ctx_r2 = i0.ɵɵnextContext(2);
@@ -422,58 +567,58 @@ function ComponentStudioDashboardComponent_Conditional_34_ng_template_8_Template
422
567
  i0.ɵɵtwoWayProperty("ngModel", ctx_r2.editableSpec);
423
568
  i0.ɵɵproperty("language", "json")("readonly", false);
424
569
  } }
425
- function ComponentStudioDashboardComponent_Conditional_34_ng_template_10_Conditional_6_Template(rf, ctx) { if (rf & 1) {
426
- const _r16 = i0.ɵɵgetCurrentView();
427
- i0.ɵɵelementStart(0, "button", 8);
428
- i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_34_ng_template_10_Conditional_6_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r16); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.applyCodeChanges()); });
429
- i0.ɵɵelement(1, "span", 91);
570
+ function ComponentStudioDashboardComponent_Conditional_46_ng_template_11_Conditional_6_Template(rf, ctx) { if (rf & 1) {
571
+ const _r22 = i0.ɵɵgetCurrentView();
572
+ i0.ɵɵelementStart(0, "button", 9);
573
+ i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_46_ng_template_11_Conditional_6_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r22); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.applyCodeChanges()); });
574
+ i0.ɵɵelement(1, "span", 117);
430
575
  i0.ɵɵtext(2, " Apply Changes ");
431
576
  i0.ɵɵelementEnd();
432
- i0.ɵɵelementStart(3, "button", 80);
433
- i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_34_ng_template_10_Conditional_6_Template_button_click_3_listener() { i0.ɵɵrestoreView(_r16); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.initializeEditors()); });
434
- i0.ɵɵelement(4, "span", 92);
577
+ i0.ɵɵelementStart(3, "button", 106);
578
+ i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_46_ng_template_11_Conditional_6_Template_button_click_3_listener() { i0.ɵɵrestoreView(_r22); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.initializeEditors()); });
579
+ i0.ɵɵelement(4, "span", 52);
435
580
  i0.ɵɵtext(5, " Cancel ");
436
581
  i0.ɵɵelementEnd();
437
582
  } if (rf & 2) {
438
583
  i0.ɵɵproperty("themeColor", "primary");
439
584
  } }
440
- function ComponentStudioDashboardComponent_Conditional_34_ng_template_10_Conditional_7_Template(rf, ctx) { if (rf & 1) {
441
- const _r17 = i0.ɵɵgetCurrentView();
442
- i0.ɵɵelementStart(0, "button", 8);
443
- i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_34_ng_template_10_Conditional_7_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r17); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.refreshComponent()); });
444
- i0.ɵɵelement(1, "span", 11);
585
+ function ComponentStudioDashboardComponent_Conditional_46_ng_template_11_Conditional_7_Template(rf, ctx) { if (rf & 1) {
586
+ const _r23 = i0.ɵɵgetCurrentView();
587
+ i0.ɵɵelementStart(0, "button", 9);
588
+ i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_46_ng_template_11_Conditional_7_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r23); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.refreshComponent()); });
589
+ i0.ɵɵelement(1, "span", 14);
445
590
  i0.ɵɵtext(2, " Refresh Component ");
446
591
  i0.ɵɵelementEnd();
447
592
  } if (rf & 2) {
448
593
  i0.ɵɵproperty("themeColor", "info");
449
594
  } }
450
- function ComponentStudioDashboardComponent_Conditional_34_ng_template_10_For_11_ng_template_1_Template(rf, ctx) { if (rf & 1) {
451
- const _r18 = i0.ɵɵgetCurrentView();
452
- i0.ɵɵelementStart(0, "mj-code-editor", 98);
453
- i0.ɵɵlistener("ngModelChange", function ComponentStudioDashboardComponent_Conditional_34_ng_template_10_For_11_ng_template_1_Template_mj_code_editor_ngModelChange_0_listener($event) { i0.ɵɵrestoreView(_r18); const ɵ$index_390_r19 = i0.ɵɵnextContext().$index; const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.onCodeSectionChange($event, ɵ$index_390_r19)); });
595
+ function ComponentStudioDashboardComponent_Conditional_46_ng_template_11_For_11_ng_template_1_Template(rf, ctx) { if (rf & 1) {
596
+ const _r24 = i0.ɵɵgetCurrentView();
597
+ i0.ɵɵelementStart(0, "mj-code-editor", 123);
598
+ i0.ɵɵlistener("ngModelChange", function ComponentStudioDashboardComponent_Conditional_46_ng_template_11_For_11_ng_template_1_Template_mj_code_editor_ngModelChange_0_listener($event) { i0.ɵɵrestoreView(_r24); const ɵ$index_483_r25 = i0.ɵɵnextContext().$index; const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.onCodeSectionChange($event, ɵ$index_483_r25)); });
454
599
  i0.ɵɵelementEnd();
455
600
  } if (rf & 2) {
456
- const section_r20 = i0.ɵɵnextContext().$implicit;
457
- i0.ɵɵproperty("ngModel", section_r20.code)("language", "javascript")("readonly", false);
601
+ const section_r26 = i0.ɵɵnextContext().$implicit;
602
+ i0.ɵɵproperty("ngModel", section_r26.code)("language", "javascript")("readonly", false);
458
603
  } }
459
- function ComponentStudioDashboardComponent_Conditional_34_ng_template_10_For_11_Template(rf, ctx) { if (rf & 1) {
460
- i0.ɵɵelementStart(0, "kendo-panelbar-item", 96);
461
- i0.ɵɵtemplate(1, ComponentStudioDashboardComponent_Conditional_34_ng_template_10_For_11_ng_template_1_Template, 1, 3, "ng-template", 97);
604
+ function ComponentStudioDashboardComponent_Conditional_46_ng_template_11_For_11_Template(rf, ctx) { if (rf & 1) {
605
+ i0.ɵɵelementStart(0, "kendo-panelbar-item", 121);
606
+ i0.ɵɵtemplate(1, ComponentStudioDashboardComponent_Conditional_46_ng_template_11_For_11_ng_template_1_Template, 1, 3, "ng-template", 122);
462
607
  i0.ɵɵelementEnd();
463
608
  } if (rf & 2) {
464
- const section_r20 = ctx.$implicit;
465
- i0.ɵɵproperty("title", section_r20.title)("expanded", section_r20.expanded);
609
+ const section_r26 = ctx.$implicit;
610
+ i0.ɵɵproperty("title", section_r26.title)("expanded", section_r26.expanded);
466
611
  } }
467
- function ComponentStudioDashboardComponent_Conditional_34_ng_template_10_Template(rf, ctx) { if (rf & 1) {
468
- i0.ɵɵelementStart(0, "div", 93)(1, "div", 86)(2, "h4");
469
- i0.ɵɵelement(3, "i", 94);
612
+ function ComponentStudioDashboardComponent_Conditional_46_ng_template_11_Template(rf, ctx) { if (rf & 1) {
613
+ i0.ɵɵelementStart(0, "div", 118)(1, "div", 112)(2, "h4");
614
+ i0.ɵɵelement(3, "i", 119);
470
615
  i0.ɵɵtext(4, " Component Code (JavaScript/React)");
471
616
  i0.ɵɵelementEnd();
472
- i0.ɵɵelementStart(5, "div", 88);
473
- i0.ɵɵtemplate(6, ComponentStudioDashboardComponent_Conditional_34_ng_template_10_Conditional_6_Template, 6, 1)(7, ComponentStudioDashboardComponent_Conditional_34_ng_template_10_Conditional_7_Template, 3, 1, "button", 7);
617
+ i0.ɵɵelementStart(5, "div", 114);
618
+ i0.ɵɵtemplate(6, ComponentStudioDashboardComponent_Conditional_46_ng_template_11_Conditional_6_Template, 6, 1)(7, ComponentStudioDashboardComponent_Conditional_46_ng_template_11_Conditional_7_Template, 3, 1, "button", 7);
474
619
  i0.ɵɵelementEnd()();
475
- i0.ɵɵelementStart(8, "div", 89)(9, "kendo-panelbar", 95);
476
- i0.ɵɵrepeaterCreate(10, ComponentStudioDashboardComponent_Conditional_34_ng_template_10_For_11_Template, 2, 2, "kendo-panelbar-item", 96, _forTrack1);
620
+ i0.ɵɵelementStart(8, "div", 115)(9, "kendo-panelbar", 120);
621
+ i0.ɵɵrepeaterCreate(10, ComponentStudioDashboardComponent_Conditional_46_ng_template_11_For_11_Template, 2, 2, "kendo-panelbar-item", 121, _forTrack2);
477
622
  i0.ɵɵelementEnd()()();
478
623
  } if (rf & 2) {
479
624
  const ctx_r2 = i0.ɵɵnextContext(2);
@@ -484,35 +629,39 @@ function ComponentStudioDashboardComponent_Conditional_34_ng_template_10_Templat
484
629
  i0.ɵɵadvance(3);
485
630
  i0.ɵɵrepeater(ctx_r2.getComponentCodeSections());
486
631
  } }
487
- function ComponentStudioDashboardComponent_Conditional_34_Template(rf, ctx) { if (rf & 1) {
488
- const _r9 = i0.ɵɵgetCurrentView();
489
- i0.ɵɵelementStart(0, "kendo-splitter", 25)(1, "kendo-splitter-pane", 61)(2, "div", 62);
490
- i0.ɵɵtemplate(3, ComponentStudioDashboardComponent_Conditional_34_Conditional_3_Template, 2, 1)(4, ComponentStudioDashboardComponent_Conditional_34_Conditional_4_Template, 9, 4, "div", 63);
632
+ function ComponentStudioDashboardComponent_Conditional_46_Conditional_12_Template(rf, ctx) { }
633
+ function ComponentStudioDashboardComponent_Conditional_46_Template(rf, ctx) { if (rf & 1) {
634
+ const _r15 = i0.ɵɵgetCurrentView();
635
+ i0.ɵɵelementStart(0, "kendo-splitter", 16)(1, "kendo-splitter-pane", 88)(2, "div", 89);
636
+ i0.ɵɵtemplate(3, ComponentStudioDashboardComponent_Conditional_46_Conditional_3_Template, 2, 1)(4, ComponentStudioDashboardComponent_Conditional_46_Conditional_4_Template, 9, 4, "div", 90);
491
637
  i0.ɵɵelementEnd()();
492
- i0.ɵɵelementStart(5, "kendo-splitter-pane", 64)(6, "kendo-tabstrip", 65);
493
- i0.ɵɵlistener("tabSelect", function ComponentStudioDashboardComponent_Conditional_34_Template_kendo_tabstrip_tabSelect_6_listener($event) { i0.ɵɵrestoreView(_r9); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onTabSelect($event)); });
494
- i0.ɵɵelementStart(7, "kendo-tabstrip-tab", 66);
495
- i0.ɵɵtemplate(8, ComponentStudioDashboardComponent_Conditional_34_ng_template_8_Template, 10, 5, "ng-template", 67);
638
+ i0.ɵɵelementStart(5, "kendo-splitter-pane", 88)(6, "div")(7, "kendo-tabstrip", 91);
639
+ i0.ɵɵlistener("tabSelect", function ComponentStudioDashboardComponent_Conditional_46_Template_kendo_tabstrip_tabSelect_7_listener($event) { i0.ɵɵrestoreView(_r15); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onTabSelect($event)); });
640
+ i0.ɵɵelementStart(8, "kendo-tabstrip-tab", 92);
641
+ i0.ɵɵtemplate(9, ComponentStudioDashboardComponent_Conditional_46_ng_template_9_Template, 10, 5, "ng-template", 93);
496
642
  i0.ɵɵelementEnd();
497
- i0.ɵɵelementStart(9, "kendo-tabstrip-tab", 66);
498
- i0.ɵɵtemplate(10, ComponentStudioDashboardComponent_Conditional_34_ng_template_10_Template, 12, 2, "ng-template", 67);
499
- i0.ɵɵelementEnd()()()();
643
+ i0.ɵɵelementStart(10, "kendo-tabstrip-tab", 92);
644
+ i0.ɵɵtemplate(11, ComponentStudioDashboardComponent_Conditional_46_ng_template_11_Template, 12, 2, "ng-template", 93);
645
+ i0.ɵɵelementEnd()()()()();
646
+ i0.ɵɵtemplate(12, ComponentStudioDashboardComponent_Conditional_46_Conditional_12_Template, 0, 0);
500
647
  } if (rf & 2) {
501
648
  const ctx_r2 = i0.ɵɵnextContext();
502
649
  i0.ɵɵadvance();
503
- i0.ɵɵproperty("min", "300px")("collapsible", false)("size", ctx_r2.isDetailsPaneCollapsed ? "100%" : "50%");
650
+ i0.ɵɵproperty("size", ctx_r2.isDetailsPaneCollapsed ? "100%" : "50%");
504
651
  i0.ɵɵadvance(2);
505
652
  i0.ɵɵconditional(ctx_r2.isRunning && ctx_r2.componentSpec ? 3 : 4);
506
653
  i0.ɵɵadvance(2);
507
- i0.ɵɵproperty("min", "400px")("collapsible", true)("collapsed", ctx_r2.isDetailsPaneCollapsed);
508
- i0.ɵɵadvance(2);
654
+ i0.ɵɵproperty("size", ctx_r2.isDetailsPaneCollapsed ? "0px" : "50%");
655
+ i0.ɵɵadvance(3);
509
656
  i0.ɵɵproperty("title", "Spec")("selected", ctx_r2.activeTab === 0);
510
657
  i0.ɵɵadvance(2);
511
658
  i0.ɵɵproperty("title", "Code")("selected", ctx_r2.activeTab === 1);
659
+ i0.ɵɵadvance(2);
660
+ i0.ɵɵconditional(!ctx_r2.isDetailsPaneCollapsed ? 12 : -1);
512
661
  } }
513
- function ComponentStudioDashboardComponent_Conditional_35_Template(rf, ctx) { if (rf & 1) {
514
- i0.ɵɵelementStart(0, "div", 26);
515
- i0.ɵɵelement(1, "i", 99);
662
+ function ComponentStudioDashboardComponent_Conditional_47_Template(rf, ctx) { if (rf & 1) {
663
+ i0.ɵɵelementStart(0, "div", 34);
664
+ i0.ɵɵelement(1, "i", 124);
516
665
  i0.ɵɵelementStart(2, "h2");
517
666
  i0.ɵɵtext(3, "Ready to Test Components");
518
667
  i0.ɵɵelementEnd();
@@ -522,6 +671,8 @@ function ComponentStudioDashboardComponent_Conditional_35_Template(rf, ctx) { if
522
671
  } }
523
672
  let ComponentStudioDashboardComponent = class ComponentStudioDashboardComponent extends BaseDashboard {
524
673
  cdr;
674
+ dialogService;
675
+ viewContainerRef;
525
676
  // Component data
526
677
  components = [];
527
678
  fileLoadedComponents = []; // Components loaded from files
@@ -533,6 +684,14 @@ let ComponentStudioDashboardComponent = class ComponentStudioDashboardComponent
533
684
  isLoading = false;
534
685
  searchQuery = '';
535
686
  isRunning = false; // Track if component is currently running
687
+ // View and filtering
688
+ selectedCategories = new Set();
689
+ availableCategories = [];
690
+ showAllCategories = false; // Show only top categories by default
691
+ // Favorites
692
+ favoriteComponents = new Set(); // Set of component IDs
693
+ showOnlyFavorites = false; // Filter to show only favorites
694
+ metadata = new Metadata();
536
695
  // Error handling
537
696
  currentError = null;
538
697
  // Tab management
@@ -548,10 +707,16 @@ let ComponentStudioDashboardComponent = class ComponentStudioDashboardComponent
548
707
  lastEditSource = null;
549
708
  // File input element reference
550
709
  fileInput;
710
+ // Import dropdown state
711
+ importDropdownOpen = false;
712
+ // Text import dialog reference
713
+ textImportDialog;
551
714
  destroy$ = new Subject();
552
- constructor(cdr) {
715
+ constructor(cdr, dialogService, viewContainerRef) {
553
716
  super();
554
717
  this.cdr = cdr;
718
+ this.dialogService = dialogService;
719
+ this.viewContainerRef = viewContainerRef;
555
720
  }
556
721
  ngAfterViewInit() {
557
722
  this.initDashboard();
@@ -570,13 +735,15 @@ let ComponentStudioDashboardComponent = class ComponentStudioDashboardComponent
570
735
  const rv = new RunView();
571
736
  const result = await rv.RunView({
572
737
  EntityName: 'MJ: Components',
573
- ExtraFilter: 'HasCustomProps = 0', // Only load components without custom props
738
+ ExtraFilter: 'HasRequiredCustomProps = 0', // Only load components without required custom props
574
739
  OrderBy: 'Name',
575
740
  MaxRows: 1000,
576
741
  ResultType: 'entity_object'
577
742
  });
578
743
  if (result.Success) {
579
744
  this.components = result.Results || [];
745
+ // Load favorites for all components
746
+ await this.loadFavorites();
580
747
  this.combineAndFilterComponents();
581
748
  }
582
749
  else {
@@ -590,6 +757,77 @@ let ComponentStudioDashboardComponent = class ComponentStudioDashboardComponent
590
757
  this.isLoading = false;
591
758
  }
592
759
  }
760
+ /**
761
+ * Load favorite status for all components
762
+ */
763
+ async loadFavorites() {
764
+ const md = new Metadata();
765
+ const currentUserId = md.CurrentUser?.ID;
766
+ if (!currentUserId)
767
+ return;
768
+ this.favoriteComponents.clear();
769
+ // Check favorite status for each component
770
+ for (const component of this.components) {
771
+ try {
772
+ const isFavorite = await this.metadata.GetRecordFavoriteStatus(currentUserId, 'MJ: Components', CompositeKey.FromID(component.ID));
773
+ if (isFavorite) {
774
+ this.favoriteComponents.add(component.ID);
775
+ }
776
+ }
777
+ catch (error) {
778
+ console.error(`Error loading favorite status for component ${component.ID}:`, error);
779
+ }
780
+ }
781
+ }
782
+ /**
783
+ * Toggle favorite status for a component
784
+ */
785
+ async toggleFavorite(component, event) {
786
+ if (event) {
787
+ event.stopPropagation(); // Prevent card expansion
788
+ }
789
+ const md = new Metadata();
790
+ const currentUserId = md.CurrentUser?.ID;
791
+ if (!currentUserId)
792
+ return;
793
+ // File-loaded components can't be favorited
794
+ if (this.isFileLoadedComponent(component)) {
795
+ return;
796
+ }
797
+ const componentId = this.getComponentId(component);
798
+ const isFavorite = this.favoriteComponents.has(componentId);
799
+ try {
800
+ await this.metadata.SetRecordFavoriteStatus(currentUserId, 'MJ: Components', CompositeKey.FromID(componentId), !isFavorite);
801
+ // Update local state
802
+ if (isFavorite) {
803
+ this.favoriteComponents.delete(componentId);
804
+ }
805
+ else {
806
+ this.favoriteComponents.add(componentId);
807
+ }
808
+ // Trigger change detection
809
+ this.cdr.detectChanges();
810
+ }
811
+ catch (error) {
812
+ console.error('Error toggling favorite status:', error);
813
+ }
814
+ }
815
+ /**
816
+ * Check if component is favorited
817
+ */
818
+ isFavorite(component) {
819
+ if (this.isFileLoadedComponent(component)) {
820
+ return false;
821
+ }
822
+ return this.favoriteComponents.has(this.getComponentId(component));
823
+ }
824
+ /**
825
+ * Toggle showing only favorites
826
+ */
827
+ toggleShowOnlyFavorites() {
828
+ this.showOnlyFavorites = !this.showOnlyFavorites;
829
+ this.combineAndFilterComponents();
830
+ }
593
831
  onSearchChange(query) {
594
832
  this.searchQuery = query;
595
833
  this.combineAndFilterComponents();
@@ -600,19 +838,167 @@ let ComponentStudioDashboardComponent = class ComponentStudioDashboardComponent
600
838
  ...this.fileLoadedComponents,
601
839
  ...this.components
602
840
  ];
603
- // Apply search filter
604
- if (!this.searchQuery) {
605
- this.filteredComponents = [...this.allComponents];
841
+ // Build available categories from all components
842
+ this.buildCategories();
843
+ // Apply filters
844
+ let filtered = [...this.allComponents];
845
+ // Apply favorites filter first if enabled
846
+ if (this.showOnlyFavorites) {
847
+ filtered = filtered.filter(c => this.isFavorite(c));
606
848
  }
607
- else {
849
+ // Apply category filter
850
+ if (this.selectedCategories.size > 0) {
851
+ filtered = filtered.filter(c => {
852
+ const namespace = this.getComponentNamespace(c) || 'Uncategorized';
853
+ const category = this.extractCategoryFromNamespace(namespace);
854
+ return this.selectedCategories.has(category);
855
+ });
856
+ }
857
+ // Apply search filter
858
+ if (this.searchQuery) {
608
859
  const query = this.searchQuery.toLowerCase();
609
- this.filteredComponents = this.allComponents.filter(c => {
860
+ filtered = filtered.filter(c => {
610
861
  const name = this.getComponentName(c)?.toLowerCase() || '';
611
862
  const description = this.getComponentDescription(c)?.toLowerCase() || '';
612
863
  const type = this.getComponentType(c)?.toLowerCase() || '';
613
- return name.includes(query) || description.includes(query) || type.includes(query);
864
+ const namespace = this.getComponentNamespace(c)?.toLowerCase() || '';
865
+ return name.includes(query) || description.includes(query) || type.includes(query) || namespace.includes(query);
614
866
  });
615
867
  }
868
+ this.filteredComponents = filtered;
869
+ }
870
+ /**
871
+ * Build categories from components
872
+ */
873
+ buildCategories() {
874
+ const categoryMap = new Map();
875
+ const allNamespaces = new Set();
876
+ // Count components per top-level category and track all namespaces
877
+ for (const component of this.allComponents) {
878
+ const namespace = this.getComponentNamespace(component) || 'Uncategorized';
879
+ const category = this.extractCategoryFromNamespace(namespace);
880
+ categoryMap.set(category, (categoryMap.get(category) || 0) + 1);
881
+ // Track full namespace paths for better display
882
+ if (namespace && namespace !== 'Uncategorized') {
883
+ allNamespaces.add(namespace);
884
+ }
885
+ }
886
+ // Convert to array and sort by count
887
+ this.availableCategories = Array.from(categoryMap.entries())
888
+ .map(([name, count]) => ({
889
+ name,
890
+ count,
891
+ color: this.getCategoryColor(name)
892
+ }))
893
+ .sort((a, b) => b.count - a.count);
894
+ }
895
+ /**
896
+ * Extract main category from namespace
897
+ */
898
+ extractCategoryFromNamespace(namespace) {
899
+ if (!namespace || namespace === 'Uncategorized')
900
+ return 'Uncategorized';
901
+ // Get the first part of the namespace path
902
+ const parts = namespace.split('/').filter(p => p.length > 0);
903
+ return parts[0] || 'Uncategorized';
904
+ }
905
+ /**
906
+ * Get color for category
907
+ */
908
+ getCategoryColor(category) {
909
+ const colors = [
910
+ '#3B82F6', // blue
911
+ '#8B5CF6', // purple
912
+ '#10B981', // green
913
+ '#F97316', // orange
914
+ '#06B6D4', // cyan
915
+ '#EC4899', // pink
916
+ '#6366F1', // indigo
917
+ '#14B8A6', // teal
918
+ '#EAB308', // yellow
919
+ '#EF4444', // red
920
+ ];
921
+ // Use hash of category name to get consistent color
922
+ let hash = 0;
923
+ for (let i = 0; i < category.length; i++) {
924
+ hash = category.charCodeAt(i) + ((hash << 5) - hash);
925
+ }
926
+ return colors[Math.abs(hash) % colors.length];
927
+ }
928
+ /**
929
+ * Get color for a full namespace path
930
+ */
931
+ getNamespaceColor(namespace) {
932
+ if (!namespace || namespace === 'Uncategorized') {
933
+ return '#6C757D'; // Gray for uncategorized
934
+ }
935
+ // Extract the main category (first part) for consistent coloring
936
+ const category = this.extractCategoryFromNamespace(namespace);
937
+ return this.getCategoryColor(category);
938
+ }
939
+ /**
940
+ * Format namespace for display (handle long paths)
941
+ */
942
+ formatNamespace(namespace) {
943
+ if (!namespace || namespace === 'Uncategorized') {
944
+ return 'Uncategorized';
945
+ }
946
+ const parts = namespace.split('/').filter(p => p.length > 0);
947
+ // If it's really long, show abbreviated version
948
+ if (parts.length > 3) {
949
+ return `${parts[0]} / ... / ${parts[parts.length - 1]}`;
950
+ }
951
+ // Otherwise show full path with spacing
952
+ return parts.join(' / ');
953
+ }
954
+ /**
955
+ * Toggle category filter
956
+ */
957
+ toggleCategory(category) {
958
+ if (this.selectedCategories.has(category)) {
959
+ this.selectedCategories.delete(category);
960
+ }
961
+ else {
962
+ this.selectedCategories.add(category);
963
+ }
964
+ this.combineAndFilterComponents();
965
+ }
966
+ /**
967
+ * Clear all category filters
968
+ */
969
+ clearCategoryFilters() {
970
+ this.selectedCategories.clear();
971
+ this.combineAndFilterComponents();
972
+ }
973
+ /**
974
+ * Check if category is selected
975
+ */
976
+ isCategorySelected(category) {
977
+ return this.selectedCategories.has(category);
978
+ }
979
+ /**
980
+ * Get visible categories (top 5 or all)
981
+ */
982
+ getVisibleCategories() {
983
+ return this.showAllCategories ? this.availableCategories : this.availableCategories.slice(0, 5);
984
+ }
985
+ /**
986
+ * Toggle showing all categories
987
+ */
988
+ toggleShowAllCategories() {
989
+ this.showAllCategories = !this.showAllCategories;
990
+ }
991
+ /**
992
+ * Get component namespace
993
+ */
994
+ getComponentNamespace(component) {
995
+ if (component.isFileLoaded) {
996
+ // File-loaded components might not have namespace
997
+ return component.specification.namespace;
998
+ }
999
+ else {
1000
+ return component.Namespace || undefined;
1001
+ }
616
1002
  }
617
1003
  // Helper methods to get properties from union type
618
1004
  getComponentName(component) {
@@ -767,10 +1153,72 @@ ${this.currentError.technicalDetails ? '\nTechnical Details:\n' + JSON.stringify
767
1153
  async refreshData() {
768
1154
  await this.loadData();
769
1155
  }
770
- // File upload handling methods
771
- triggerFileInput() {
1156
+ // Import handling methods
1157
+ toggleImportDropdown() {
1158
+ this.importDropdownOpen = !this.importDropdownOpen;
1159
+ }
1160
+ closeImportDropdown() {
1161
+ this.importDropdownOpen = false;
1162
+ }
1163
+ onDocumentClick(event) {
1164
+ // Close dropdown if clicking outside
1165
+ const target = event.target;
1166
+ const dropdown = target.closest('.import-dropdown');
1167
+ if (!dropdown && this.importDropdownOpen) {
1168
+ this.importDropdownOpen = false;
1169
+ }
1170
+ }
1171
+ importFromFile() {
1172
+ this.closeImportDropdown();
772
1173
  this.fileInput?.nativeElement.click();
773
1174
  }
1175
+ importFromText() {
1176
+ this.closeImportDropdown();
1177
+ this.openTextImportDialog();
1178
+ }
1179
+ openTextImportDialog() {
1180
+ this.textImportDialog = this.dialogService.open({
1181
+ content: TextImportDialogComponent,
1182
+ width: 700,
1183
+ height: 600,
1184
+ minWidth: 500,
1185
+ title: '', // Title is in the component
1186
+ actions: [], // Actions are in the component
1187
+ appendTo: this.viewContainerRef
1188
+ });
1189
+ // Handle the import event from the dialog component
1190
+ const dialogComponentRef = this.textImportDialog.content.instance;
1191
+ // Subscribe to import event
1192
+ dialogComponentRef.importSpec.subscribe((spec) => {
1193
+ this.handleTextImport(spec);
1194
+ this.textImportDialog?.close();
1195
+ });
1196
+ // Subscribe to cancel event
1197
+ dialogComponentRef.cancelDialog.subscribe(() => {
1198
+ this.textImportDialog?.close();
1199
+ });
1200
+ }
1201
+ async handleTextImport(spec) {
1202
+ // Create a file-loaded component (reusing the same structure)
1203
+ const textComponent = {
1204
+ id: this.generateId(),
1205
+ name: spec.name,
1206
+ description: spec.description,
1207
+ specification: spec,
1208
+ filename: 'text-import.json',
1209
+ loadedAt: new Date(),
1210
+ isFileLoaded: true,
1211
+ type: spec.type || 'Component',
1212
+ status: 'Text'
1213
+ };
1214
+ // Add to the list and refresh
1215
+ this.fileLoadedComponents.push(textComponent);
1216
+ this.combineAndFilterComponents();
1217
+ console.log(`Loaded component "${spec.name}" from text input`);
1218
+ // Automatically select and run the newly loaded component
1219
+ this.expandedComponent = textComponent;
1220
+ this.runComponent(textComponent);
1221
+ }
774
1222
  async handleFileSelect(event) {
775
1223
  const input = event.target;
776
1224
  const file = input.files?.[0];
@@ -1089,67 +1537,94 @@ ${this.currentError.technicalDetails ? '\nTechnical Details:\n' + JSON.stringify
1089
1537
  // Both tabs now need initialization since there's no separate Run tab
1090
1538
  this.initializeEditors();
1091
1539
  }
1092
- static ɵfac = function ComponentStudioDashboardComponent_Factory(t) { return new (t || ComponentStudioDashboardComponent)(i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); };
1540
+ static ɵfac = function ComponentStudioDashboardComponent_Factory(t) { return new (t || ComponentStudioDashboardComponent)(i0.ɵɵdirectiveInject(i0.ChangeDetectorRef), i0.ɵɵdirectiveInject(i1.DialogService), i0.ɵɵdirectiveInject(i0.ViewContainerRef)); };
1093
1541
  static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ComponentStudioDashboardComponent, selectors: [["mj-component-studio-dashboard"]], viewQuery: function ComponentStudioDashboardComponent_Query(rf, ctx) { if (rf & 1) {
1094
1542
  i0.ɵɵviewQuery(_c0, 5);
1095
1543
  } if (rf & 2) {
1096
1544
  let _t;
1097
1545
  i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.fileInput = _t.first);
1098
- } }, features: [i0.ɵɵInheritDefinitionFeature], decls: 36, vars: 11, consts: [["fileInput", ""], [1, "component-studio"], [1, "dashboard-header"], [1, "header-content"], [1, "fa-solid", "fa-puzzle-piece"], [1, "header-subtitle"], [1, "header-buttons"], ["kendoButton", "", 3, "themeColor"], ["kendoButton", "", 3, "click", "themeColor"], [1, "fa-solid", "fa-file-import"], ["kendoButton", "", 3, "click", "disabled"], [1, "fa-solid", "fa-sync"], ["type", "file", "accept", ".json", 2, "display", "none", 3, "change"], ["orientation", "horizontal", 2, "flex", "1", "height", "auto"], [3, "min", "max", "size"], [1, "components-panel"], [1, "panel-header"], [1, "search-box"], ["placeholder", "Search components...", 3, "valueChange", "value", "clearButton"], ["kendoTextBoxPrefixTemplate", ""], [1, "components-list"], [1, "loading-message"], [1, "empty-message"], [3, "min"], [1, "component-display"], ["orientation", "horizontal", 1, "component-editor-splitter"], [1, "empty-state"], [1, "fa-solid", "fa-eye"], [1, "fa-solid", "fa-eye-slash"], [1, "fa-solid", "fa-search"], [1, "fa-solid", "fa-spinner", "fa-spin"], [1, "fa-solid", "fa-info-circle"], [1, "component-card", 3, "expanded", "running", "file-loaded"], [1, "component-card"], [1, "card-header", 3, "click"], [1, "card-icon"], [1, "fa-solid", 3, "ngClass"], [1, "card-info"], [1, "card-name"], [1, "file-badge", 3, "title"], [1, "card-meta"], [1, "card-type"], [1, "card-version"], [1, "status-badge", "file"], [1, "status-badge", "published"], [1, "status-badge", "draft"], [1, "card-chevron"], [1, "fa-solid", "fa-chevron-up"], [1, "fa-solid", "fa-chevron-down"], [1, "card-details"], [1, "fa-solid", "fa-file"], [1, "detail-section"], [1, "info-grid"], [1, "info-item"], [1, "info-label"], [1, "info-value"], [1, "card-actions"], ["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-play"], [3, "min", "collapsible", "size"], [1, "component-runtime"], [1, "run-empty-state"], [3, "min", "collapsible", "collapsed"], [1, "editor-tabs", 3, "tabSelect"], [3, "title", "selected"], ["kendoTabContent", ""], [1, "error-display"], [3, "component"], [1, "error-container"], [1, "error-header"], [1, "fa-solid", "fa-exclamation-triangle"], ["title", "Copy error details", 1, "copy-button", 3, "click"], [1, "fa-solid", "fa-copy"], [1, "error-intro"], [1, "error-details"], [1, "technical-details"], [1, "error-help"], [1, "error-actions"], ["kendoButton", "", 3, "click"], [1, "fa-solid", "fa-rotate"], [3, "componentEvent", "openEntityRecord", "component"], [1, "fa-solid", "fa-play-circle", "fa-3x"], ["kendoButton", "", 3, "click", "themeColor", "size"], [1, "tab-content", "spec-tab"], [1, "editor-header"], [1, "fa-solid", "fa-code"], [1, "editor-actions"], [1, "editor-wrapper"], [2, "height", "100%", "width", "100%", 3, "ngModelChange", "ngModel", "language", "readonly"], [1, "fa-solid", "fa-check"], [1, "fa-solid", "fa-times"], [1, "tab-content", "code-tab"], [1, "fa-solid", "fa-file-code"], [1, "code-sections"], [3, "title", "expanded"], ["kendoPanelBarContent", ""], [2, "height", "400px", "width", "100%", 3, "ngModelChange", "ngModel", "language", "readonly"], [1, "fa-solid", "fa-rocket", "fa-3x"]], template: function ComponentStudioDashboardComponent_Template(rf, ctx) { if (rf & 1) {
1546
+ } }, hostBindings: function ComponentStudioDashboardComponent_HostBindings(rf, ctx) { if (rf & 1) {
1547
+ i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_click_HostBindingHandler($event) { return ctx.onDocumentClick($event); }, false, i0.ɵɵresolveDocument);
1548
+ } }, features: [i0.ɵɵInheritDefinitionFeature], decls: 48, vars: 20, consts: [["fileInput", ""], [1, "component-studio"], [1, "dashboard-header"], [1, "header-content"], [1, "fa-solid", "fa-puzzle-piece"], [1, "header-subtitle"], [1, "header-buttons"], ["kendoButton", "", 3, "themeColor"], [1, "import-dropdown"], ["kendoButton", "", 3, "click", "themeColor"], [1, "fa-solid", "fa-file-import"], [1, "fa-solid", "fa-chevron-down", 2, "margin-left", "5px", "font-size", "10px"], [1, "dropdown-menu"], ["kendoButton", "", 3, "click", "disabled"], [1, "fa-solid", "fa-sync"], ["type", "file", "accept", ".json", 2, "display", "none", 3, "change"], ["orientation", "horizontal"], [3, "min", "max", "size"], [1, "components-panel"], [1, "panel-header"], [1, "panel-header-top"], [1, "header-actions"], ["title", "Show only favorites", 1, "favorites-toggle", 3, "click"], [1, "component-count"], [1, "category-filters"], [1, "filter-pills"], [1, "search-box"], ["placeholder", "Search components...", 3, "valueChange", "value", "clearButton"], ["kendoTextBoxPrefixTemplate", ""], [1, "components-list"], [1, "loading-message"], [1, "empty-message"], [3, "min"], [1, "component-display"], [1, "empty-state"], [1, "fa-solid", "fa-eye"], [1, "fa-solid", "fa-eye-slash"], [1, "dropdown-item", 3, "click"], [1, "fa-solid", "fa-file"], [1, "fa-solid", "fa-keyboard"], [1, "fa-solid", "fa-star"], [1, "fa-regular", "fa-star"], [1, "category-pill", 3, "active", "--pill-color"], [1, "more-button"], [1, "clear-filters-button"], [1, "category-pill", 3, "click"], [1, "pill-name"], [1, "pill-count"], [1, "more-button", 3, "click"], [1, "fa-solid", "fa-chevron-up"], [1, "fa-solid", "fa-chevron-down"], [1, "clear-filters-button", 3, "click"], [1, "fa-solid", "fa-times"], [1, "fa-solid", "fa-search"], [1, "fa-solid", "fa-spinner", "fa-spin"], [1, "fa-solid", "fa-info-circle"], [1, "component-card", 3, "expanded", "running", "file-loaded"], [1, "component-card"], [1, "card-header", 3, "click"], [1, "card-icon"], [1, "fa-solid", 3, "ngClass"], [1, "favorite-btn", 3, "is-favorite", "title"], [1, "card-info"], [1, "card-name"], [1, "file-badge", 3, "title"], [1, "card-meta"], [1, "card-type"], [1, "card-version"], [1, "status-badge", "published"], [1, "status-badge", "draft"], [1, "card-namespace"], [1, "namespace-chip", 3, "title"], [1, "fa-solid", "fa-folder-tree"], [1, "card-chevron"], [1, "card-details"], [1, "favorite-btn", 3, "click", "title"], [1, "status-badge", "text"], [1, "status-badge", "file"], [1, "detail-section"], [1, "info-grid"], [1, "info-item"], [1, "info-label"], [1, "info-value"], [1, "card-actions"], ["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-play"], [3, "size"], [1, "component-runtime"], [1, "run-empty-state"], [1, "editor-tabs", 3, "tabSelect"], [3, "title", "selected"], ["kendoTabContent", ""], [1, "error-display"], [3, "component"], [1, "error-container"], [1, "error-header"], [1, "fa-solid", "fa-exclamation-triangle"], ["title", "Copy error details", 1, "copy-button", 3, "click"], [1, "fa-solid", "fa-copy"], [1, "error-intro"], [1, "error-details"], [1, "technical-details"], [1, "error-help"], [1, "error-actions"], ["kendoButton", "", 3, "click"], [1, "fa-solid", "fa-rotate"], [3, "componentEvent", "openEntityRecord", "component"], [1, "fa-solid", "fa-play-circle", "fa-3x"], ["kendoButton", "", 3, "click", "themeColor", "size"], [1, "tab-content", "spec-tab"], [1, "editor-header"], [1, "fa-solid", "fa-code"], [1, "editor-actions"], [1, "editor-wrapper"], [2, "height", "100%", "width", "100%", 3, "ngModelChange", "ngModel", "language", "readonly"], [1, "fa-solid", "fa-check"], [1, "tab-content", "code-tab"], [1, "fa-solid", "fa-file-code"], [1, "code-sections"], [3, "title", "expanded"], ["kendoPanelBarContent", ""], [2, "height", "400px", "width", "100%", 3, "ngModelChange", "ngModel", "language", "readonly"], [1, "fa-solid", "fa-rocket", "fa-3x"]], template: function ComponentStudioDashboardComponent_Template(rf, ctx) { if (rf & 1) {
1099
1549
  const _r1 = i0.ɵɵgetCurrentView();
1100
1550
  i0.ɵɵelementStart(0, "div", 1)(1, "div", 2)(2, "div", 3)(3, "div")(4, "h1");
1101
1551
  i0.ɵɵelement(5, "i", 4);
1102
1552
  i0.ɵɵtext(6, " Component Studio");
1103
1553
  i0.ɵɵelementEnd();
1104
1554
  i0.ɵɵelementStart(7, "p", 5);
1105
- i0.ɵɵtext(8, "Testing components without custom properties");
1555
+ i0.ɵɵtext(8, "Testing components without required custom properties");
1106
1556
  i0.ɵɵelementEnd()();
1107
1557
  i0.ɵɵelementStart(9, "div", 6);
1108
1558
  i0.ɵɵtemplate(10, ComponentStudioDashboardComponent_Conditional_10_Template, 3, 2, "button", 7);
1109
- i0.ɵɵelementStart(11, "button", 8);
1110
- i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Template_button_click_11_listener() { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.triggerFileInput()); });
1111
- i0.ɵɵelement(12, "span", 9);
1112
- i0.ɵɵtext(13, " Import from File ");
1113
- i0.ɵɵelementEnd();
1114
- i0.ɵɵelementStart(14, "button", 10);
1115
- i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Template_button_click_14_listener() { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.refreshData()); });
1559
+ i0.ɵɵelementStart(11, "div", 8)(12, "button", 9);
1560
+ i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Template_button_click_12_listener() { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.toggleImportDropdown()); });
1561
+ i0.ɵɵelement(13, "span", 10);
1562
+ i0.ɵɵtext(14, " Import ");
1116
1563
  i0.ɵɵelement(15, "span", 11);
1117
- i0.ɵɵtext(16, " Refresh ");
1564
+ i0.ɵɵelementEnd();
1565
+ i0.ɵɵtemplate(16, ComponentStudioDashboardComponent_Conditional_16_Template, 7, 0, "div", 12);
1566
+ i0.ɵɵelementEnd();
1567
+ i0.ɵɵelementStart(17, "button", 13);
1568
+ i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Template_button_click_17_listener() { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.refreshData()); });
1569
+ i0.ɵɵelement(18, "span", 14);
1570
+ i0.ɵɵtext(19, " Refresh ");
1118
1571
  i0.ɵɵelementEnd()();
1119
- i0.ɵɵelementStart(17, "input", 12, 0);
1120
- i0.ɵɵlistener("change", function ComponentStudioDashboardComponent_Template_input_change_17_listener($event) { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.handleFileSelect($event)); });
1572
+ i0.ɵɵelementStart(20, "input", 15, 0);
1573
+ i0.ɵɵlistener("change", function ComponentStudioDashboardComponent_Template_input_change_20_listener($event) { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.handleFileSelect($event)); });
1574
+ i0.ɵɵelementEnd()()();
1575
+ i0.ɵɵelementStart(22, "kendo-splitter", 16)(23, "kendo-splitter-pane", 17)(24, "div", 18)(25, "div", 19)(26, "div", 20)(27, "h3");
1576
+ i0.ɵɵtext(28, "Components");
1577
+ i0.ɵɵelementEnd();
1578
+ i0.ɵɵelementStart(29, "div", 21)(30, "button", 22);
1579
+ i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Template_button_click_30_listener() { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.toggleShowOnlyFavorites()); });
1580
+ i0.ɵɵtemplate(31, ComponentStudioDashboardComponent_Conditional_31_Template, 2, 0)(32, ComponentStudioDashboardComponent_Conditional_32_Template, 2, 0);
1581
+ i0.ɵɵelementEnd();
1582
+ i0.ɵɵelementStart(33, "span", 23);
1583
+ i0.ɵɵtext(34);
1121
1584
  i0.ɵɵelementEnd()()();
1122
- i0.ɵɵelementStart(19, "kendo-splitter", 13)(20, "kendo-splitter-pane", 14)(21, "div", 15)(22, "div", 16)(23, "h3");
1123
- i0.ɵɵtext(24, "Components");
1585
+ i0.ɵɵelementStart(35, "div", 24);
1586
+ i0.ɵɵtemplate(36, ComponentStudioDashboardComponent_Conditional_36_Template, 5, 2, "div", 25);
1124
1587
  i0.ɵɵelementEnd();
1125
- i0.ɵɵelementStart(25, "div", 17)(26, "kendo-textbox", 18);
1126
- i0.ɵɵlistener("valueChange", function ComponentStudioDashboardComponent_Template_kendo_textbox_valueChange_26_listener($event) { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.onSearchChange($event)); });
1127
- i0.ɵɵtemplate(27, ComponentStudioDashboardComponent_ng_template_27_Template, 1, 0, "ng-template", 19);
1588
+ i0.ɵɵelementStart(37, "div", 26)(38, "kendo-textbox", 27);
1589
+ i0.ɵɵlistener("valueChange", function ComponentStudioDashboardComponent_Template_kendo_textbox_valueChange_38_listener($event) { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.onSearchChange($event)); });
1590
+ i0.ɵɵtemplate(39, ComponentStudioDashboardComponent_ng_template_39_Template, 1, 0, "ng-template", 28);
1128
1591
  i0.ɵɵelementEnd()()();
1129
- i0.ɵɵelementStart(28, "div", 20);
1130
- i0.ɵɵtemplate(29, ComponentStudioDashboardComponent_Conditional_29_Template, 3, 0, "div", 21)(30, ComponentStudioDashboardComponent_Conditional_30_Template, 6, 0, "div", 22)(31, ComponentStudioDashboardComponent_Conditional_31_Template, 2, 0);
1592
+ i0.ɵɵelementStart(40, "div", 29);
1593
+ i0.ɵɵtemplate(41, ComponentStudioDashboardComponent_Conditional_41_Template, 3, 0, "div", 30)(42, ComponentStudioDashboardComponent_Conditional_42_Template, 6, 0, "div", 31)(43, ComponentStudioDashboardComponent_Conditional_43_Template, 2, 0);
1131
1594
  i0.ɵɵelementEnd()()();
1132
- i0.ɵɵelementStart(32, "kendo-splitter-pane", 23)(33, "div", 24);
1133
- i0.ɵɵtemplate(34, ComponentStudioDashboardComponent_Conditional_34_Template, 11, 11, "kendo-splitter", 25)(35, ComponentStudioDashboardComponent_Conditional_35_Template, 6, 0, "div", 26);
1595
+ i0.ɵɵelementStart(44, "kendo-splitter-pane", 32)(45, "div", 33);
1596
+ i0.ɵɵtemplate(46, ComponentStudioDashboardComponent_Conditional_46_Template, 13, 8)(47, ComponentStudioDashboardComponent_Conditional_47_Template, 6, 0, "div", 34);
1134
1597
  i0.ɵɵelementEnd()()()();
1135
1598
  } if (rf & 2) {
1136
1599
  i0.ɵɵadvance(10);
1137
1600
  i0.ɵɵconditional(ctx.selectedComponent && ctx.isRunning ? 10 : -1);
1138
1601
  i0.ɵɵadvance();
1602
+ i0.ɵɵclassProp("open", ctx.importDropdownOpen);
1603
+ i0.ɵɵadvance();
1139
1604
  i0.ɵɵproperty("themeColor", "info");
1140
- i0.ɵɵadvance(3);
1605
+ i0.ɵɵadvance(4);
1606
+ i0.ɵɵconditional(ctx.importDropdownOpen ? 16 : -1);
1607
+ i0.ɵɵadvance();
1141
1608
  i0.ɵɵproperty("disabled", ctx.isLoading);
1142
1609
  i0.ɵɵadvance(6);
1143
- i0.ɵɵproperty("min", "350px")("max", "600px")("size", "400px");
1144
- i0.ɵɵadvance(6);
1610
+ i0.ɵɵproperty("min", "350px")("max", "650px")("size", "400px");
1611
+ i0.ɵɵadvance(7);
1612
+ i0.ɵɵclassProp("active", ctx.showOnlyFavorites);
1613
+ i0.ɵɵadvance();
1614
+ i0.ɵɵconditional(ctx.showOnlyFavorites ? 31 : 32);
1615
+ i0.ɵɵadvance(3);
1616
+ i0.ɵɵtextInterpolate2("", ctx.filteredComponents.length, " of ", ctx.allComponents.length, "");
1617
+ i0.ɵɵadvance(2);
1618
+ i0.ɵɵconditional(ctx.availableCategories.length > 0 ? 36 : -1);
1619
+ i0.ɵɵadvance(2);
1145
1620
  i0.ɵɵproperty("value", ctx.searchQuery)("clearButton", true);
1146
1621
  i0.ɵɵadvance(3);
1147
- i0.ɵɵconditional(ctx.isLoading ? 29 : ctx.filteredComponents.length === 0 ? 30 : 31);
1622
+ i0.ɵɵconditional(ctx.isLoading ? 41 : ctx.filteredComponents.length === 0 ? 42 : 43);
1148
1623
  i0.ɵɵadvance(3);
1149
1624
  i0.ɵɵproperty("min", "400px");
1150
1625
  i0.ɵɵadvance(2);
1151
- i0.ɵɵconditional(ctx.selectedComponent ? 34 : 35);
1152
- } }, dependencies: [i1.NgClass, i2.NgControlStatus, i2.NgModel, i3.TextBoxComponent, i3.TextBoxPrefixTemplateDirective, i4.PanelBarComponent, i4.PanelBarItemComponent, i4.PanelBarContentDirective, i4.SplitterComponent, i4.SplitterPaneComponent, i4.TabStripComponent, i4.TabStripTabComponent, i4.TabContentDirective, i5.CodeEditorComponent, i6.ButtonComponent, i7.MJReactComponent, i1.DatePipe], styles: ["[_nghost-%COMP%] {\n display: block;\n width: 100%;\n height: 100%;\n}\n\n.component-studio[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n height: 100vh;\n background: #f8f9fa;\n overflow: hidden;\n position: relative;\n\n .dashboard-header {\n background: white;\n border-bottom: 1px solid #dee2e6;\n padding: 16px 24px;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05);\n \n .header-content {\n display: flex;\n justify-content: space-between;\n align-items: center;\n \n .header-buttons {\n display: flex;\n gap: 8px;\n }\n \n h1 {\n margin: 0;\n font-size: 24px;\n font-weight: 600;\n color: #212529;\n display: flex;\n align-items: center;\n gap: 12px;\n \n i {\n color: #6366f1;\n }\n }\n \n .header-subtitle {\n margin: 4px 0 0 0;\n font-size: 13px;\n color: #6c757d;\n font-weight: normal;\n }\n }\n }\n\n kendo-splitter {\n flex: 1;\n background: white;\n display: flex;\n height: 100%;\n min-height: 0;\n overflow: hidden;\n \n ::ng-deep .k-pane {\n overflow: hidden;\n height: 100%;\n }\n }\n\n .components-panel {\n height: 100%;\n display: flex;\n flex-direction: column;\n background: #f8f9fa;\n \n .panel-header {\n padding: 20px;\n background: white;\n border-bottom: 1px solid #dee2e6;\n \n h3 {\n margin: 0 0 16px 0;\n font-size: 18px;\n font-weight: 600;\n color: #212529;\n }\n \n .search-box {\n kendo-textbox {\n width: 100%;\n }\n }\n }\n \n .components-list {\n flex: 1;\n overflow-y: auto;\n overflow-x: hidden;\n padding: 16px;\n \n .loading-message,\n .empty-message {\n padding: 48px 24px;\n text-align: center;\n color: #6c757d;\n font-size: 14px;\n \n i {\n margin-right: 8px;\n }\n }\n \n .component-card {\n background: white;\n border: 1px solid #dee2e6;\n border-radius: 8px;\n margin-bottom: 12px;\n transition: all 0.2s ease;\n \n &:hover {\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);\n }\n \n &.expanded {\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);\n border-color: #6366f1;\n }\n \n &.running {\n border-color: #10b981;\n box-shadow: 0 0 0 3px rgba(16, 185, 129, 0.1);\n background: linear-gradient(to right, rgba(16, 185, 129, 0.03) 0%, white 100%);\n \n .card-header {\n &::before {\n content: '';\n position: absolute;\n left: 0;\n top: 0;\n bottom: 0;\n width: 4px;\n background: #10b981;\n }\n }\n }\n \n &.file-loaded {\n background: linear-gradient(135deg, #f0f8ff 0%, white 100%);\n border-style: dashed;\n border-color: #3b82f6;\n \n &:hover {\n box-shadow: 0 2px 8px rgba(59, 130, 246, 0.15);\n }\n \n &.expanded {\n border-style: solid;\n box-shadow: 0 4px 12px rgba(59, 130, 246, 0.2);\n }\n }\n \n .card-header {\n display: flex;\n align-items: center;\n padding: 16px;\n cursor: pointer;\n user-select: none;\n position: relative;\n \n &:hover {\n background: #f8f9fa;\n }\n \n .card-icon {\n font-size: 24px;\n margin-right: 16px;\n width: 32px;\n text-align: center;\n flex-shrink: 0;\n }\n \n .card-info {\n flex: 1;\n min-width: 0;\n \n .card-name {\n font-size: 15px;\n font-weight: 600;\n color: #212529;\n margin-bottom: 4px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n display: flex;\n align-items: center;\n gap: 8px;\n \n .file-badge {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 2px 6px;\n background: #e0f2fe;\n color: #0369a1;\n border-radius: 4px;\n font-size: 11px;\n font-weight: 500;\n flex-shrink: 0;\n \n i {\n font-size: 10px;\n }\n }\n }\n \n .card-meta {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 12px;\n color: #6c757d;\n \n .card-type {\n font-weight: 500;\n }\n \n .card-version {\n color: #868e96;\n }\n \n .status-badge {\n padding: 2px 6px;\n border-radius: 10px;\n font-size: 10px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.3px;\n \n &.published {\n background: #d1fae5;\n color: #065f46;\n }\n \n &.draft {\n background: #fef3c7;\n color: #92400e;\n }\n \n &.file {\n background: #e0f2fe;\n color: #0369a1;\n }\n }\n }\n }\n \n .card-chevron {\n color: #6c757d;\n font-size: 12px;\n margin-left: 12px;\n transition: transform 0.2s ease;\n }\n }\n \n .card-details {\n padding: 0 16px 16px 16px;\n border-top: 1px solid #e9ecef;\n animation: _ngcontent-%COMP%_slideDown 0.2s ease;\n \n .detail-section {\n margin-top: 16px;\n \n label {\n display: block;\n font-size: 11px;\n font-weight: 600;\n color: #6c757d;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n margin-bottom: 8px;\n }\n \n p {\n margin: 0;\n font-size: 13px;\n color: #495057;\n line-height: 1.5;\n }\n \n .info-grid {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 8px;\n \n .info-item {\n display: flex;\n align-items: baseline;\n gap: 6px;\n font-size: 13px;\n \n .info-label {\n font-weight: 500;\n color: #6c757d;\n min-width: 50px;\n }\n \n .info-value {\n color: #212529;\n }\n }\n }\n }\n \n .card-actions {\n margin-top: 16px;\n display: flex;\n gap: 8px;\n \n button {\n flex: 1;\n }\n }\n }\n }\n }\n }\n\n .component-display {\n height: 100%;\n display: flex;\n flex-direction: column;\n background: white;\n position: relative;\n overflow: hidden;\n \n .empty-state {\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n color: #868e96;\n padding: 48px;\n text-align: center;\n \n i {\n color: #dee2e6;\n margin-bottom: 24px;\n }\n \n h2 {\n margin: 0 0 12px 0;\n font-size: 24px;\n font-weight: 600;\n color: #495057;\n }\n \n p {\n margin: 0;\n font-size: 14px;\n max-width: 400px;\n }\n }\n \n .error-display {\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 24px;\n background: #f8f9fa;\n \n .error-container {\n width: 100%;\n max-width: 600px;\n background: white;\n border: 2px solid #dc3545;\n border-radius: 8px;\n padding: 24px;\n box-shadow: 0 4px 12px rgba(220, 53, 69, 0.15);\n \n .error-header {\n display: flex;\n align-items: center;\n gap: 12px;\n margin-bottom: 20px;\n color: #dc3545;\n position: relative;\n \n i {\n font-size: 24px;\n }\n \n h3 {\n margin: 0;\n font-size: 20px;\n flex: 1;\n }\n \n .copy-button {\n background: white;\n border: 1px solid #dee2e6;\n border-radius: 4px;\n padding: 6px 10px;\n cursor: pointer;\n color: #6c757d;\n transition: all 0.2s;\n \n &:hover {\n background: #e9ecef;\n color: #495057;\n }\n \n i {\n font-size: 14px;\n }\n }\n }\n \n .error-intro {\n color: #495057;\n margin-bottom: 20px;\n font-size: 14px;\n }\n \n .error-details {\n background: #f8f9fa;\n border: 1px solid #dee2e6;\n border-radius: 4px;\n padding: 16px;\n margin-bottom: 20px;\n font-family: 'SF Mono', Monaco, 'Courier New', monospace;\n font-size: 13px;\n \n .technical-details {\n margin-top: 12px;\n \n summary {\n cursor: pointer;\n color: #0066cc;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n \n &:hover {\n text-decoration: underline;\n }\n }\n \n pre {\n margin-top: 8px;\n white-space: pre-wrap;\n word-break: break-word;\n font-size: 11px;\n color: #495057;\n max-height: 200px;\n overflow-y: auto;\n }\n }\n }\n \n .error-help {\n background: #e7f3ff;\n border: 1px solid #b3d9ff;\n border-radius: 4px;\n padding: 16px;\n margin-bottom: 20px;\n font-size: 13px;\n \n strong {\n display: block;\n margin-bottom: 8px;\n font-size: 14px;\n color: #0066cc;\n }\n \n ol {\n margin: 0;\n padding-left: 20px;\n \n li {\n margin-bottom: 4px;\n color: #495057;\n }\n }\n }\n \n .error-actions {\n display: flex;\n gap: 12px;\n \n button {\n min-width: 100px;\n }\n }\n }\n }\n \n mj-react-component {\n flex: 1;\n width: 100%;\n height: 100%;\n display: block;\n overflow-y: auto;\n overflow-x: hidden;\n }\n \n // Component and editor splitter\n .component-editor-splitter {\n height: 100%;\n overflow: hidden;\n \n ::ng-deep .k-splitter-bar {\n background: #6366f1; // Same blue as Import button\n width: 6px; // Make it slightly wider for visibility\n \n &:hover {\n background: #4f52d9; // Darker blue on hover\n }\n \n .k-resize-handle {\n background-color: rgba(255, 255, 255, 0.3);\n }\n }\n \n ::ng-deep .k-pane {\n overflow: hidden;\n display: flex;\n flex-direction: column;\n }\n }\n \n // Component runtime area\n .component-runtime {\n height: 100%;\n display: flex;\n flex-direction: column;\n background: white;\n position: relative;\n overflow-y: auto;\n overflow-x: hidden;\n \n .run-empty-state {\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 48px;\n text-align: center;\n \n i {\n color: #10b981;\n margin-bottom: 24px;\n }\n \n h3 {\n margin: 0 0 12px 0;\n font-size: 20px;\n font-weight: 600;\n color: #212529;\n }\n \n p {\n margin: 0 0 24px 0;\n font-size: 14px;\n color: #6c757d;\n max-width: 400px;\n }\n }\n }\n \n // Editor tabs on the right\n .editor-tabs {\n height: 100%;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n \n ::ng-deep .k-tabstrip-items-wrapper {\n background: #f8f9fa;\n border-bottom: 2px solid #dee2e6;\n flex-shrink: 0;\n }\n \n ::ng-deep .k-tabstrip-content {\n flex: 1;\n padding: 0;\n overflow: hidden;\n min-height: 0;\n display: flex;\n flex-direction: column;\n }\n \n ::ng-deep .k-item.k-tabstrip-item {\n font-weight: 500;\n \n &.k-active {\n background: white;\n border-bottom-color: white;\n }\n }\n }\n \n .tab-content {\n height: 100%;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n \n &.spec-tab, &.code-tab {\n height: 100%;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n \n .editor-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 12px 16px;\n background: #f8f9fa;\n border-bottom: 1px solid #dee2e6;\n flex-shrink: 0;\n min-width: 0; // Fix width issue\n \n h4 {\n margin: 0;\n font-size: 14px;\n font-weight: 600;\n color: #495057;\n display: flex;\n align-items: center;\n gap: 8px;\n flex-shrink: 1; // Allow title to shrink\n min-width: 0; // Prevent overflow\n \n i {\n color: #6366f1;\n flex-shrink: 0; // Keep icon from shrinking\n }\n }\n \n .editor-actions {\n display: flex;\n gap: 8px;\n flex-shrink: 0; // Prevent buttons from shrinking\n \n button {\n min-width: auto;\n padding: 4px 12px;\n font-size: 13px;\n white-space: nowrap; // Prevent button text wrapping\n }\n }\n }\n \n .editor-wrapper {\n flex: 1;\n overflow-y: auto;\n overflow-x: hidden;\n min-height: 0;\n position: relative;\n }\n \n ::ng-deep .monaco-editor {\n border: 1px solid #dee2e6;\n }\n }\n \n .code-sections {\n height: 100%;\n \n ::ng-deep .k-panelbar-item-header {\n background: #f8f9fa;\n font-weight: 500;\n font-size: 14px;\n }\n \n ::ng-deep .k-panelbar-content {\n padding: 0;\n }\n }\n }\n }\n}\n\n@keyframes _ngcontent-%COMP%_slideDown {\n from {\n opacity: 0;\n transform: translateY(-10px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}"] });
1626
+ i0.ɵɵconditional(ctx.selectedComponent ? 46 : 47);
1627
+ } }, dependencies: [i2.NgClass, i3.NgControlStatus, i3.NgModel, i4.TextBoxComponent, i4.TextBoxPrefixTemplateDirective, i5.PanelBarComponent, i5.PanelBarItemComponent, i5.PanelBarContentDirective, i5.SplitterComponent, i5.SplitterPaneComponent, i5.TabStripComponent, i5.TabStripTabComponent, i5.TabContentDirective, i6.CodeEditorComponent, i7.ButtonComponent, i8.MJReactComponent, i2.DatePipe], styles: ["[_nghost-%COMP%] {\n display: block;\n width: 100%;\n height: 100%;\n}\n\n.component-studio[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n height: 100vh;\n background: #f8f9fa;\n overflow: hidden;\n position: relative;\n\n .dashboard-header {\n background: white;\n border-bottom: 1px solid #dee2e6;\n padding: 16px 24px;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05);\n \n .header-content {\n display: flex;\n justify-content: space-between;\n align-items: center;\n \n .header-buttons {\n display: flex;\n gap: 8px;\n \n .import-dropdown {\n position: relative;\n \n .dropdown-menu {\n position: absolute;\n top: calc(100% + 4px);\n left: 0;\n background: white;\n border: 1px solid #dee2e6;\n border-radius: 4px;\n box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);\n z-index: 1000;\n min-width: 180px;\n \n .dropdown-item {\n display: flex;\n align-items: center;\n gap: 10px;\n width: 100%;\n padding: 10px 16px;\n border: none;\n background: none;\n text-align: left;\n cursor: pointer;\n font-size: 14px;\n color: #212529;\n transition: background-color 0.2s;\n \n &:hover {\n background-color: #f8f9fa;\n }\n \n &:not(:last-child) {\n border-bottom: 1px solid #e9ecef;\n }\n \n i {\n width: 16px;\n text-align: center;\n color: #6366f1;\n }\n }\n }\n }\n }\n \n h1 {\n margin: 0;\n font-size: 24px;\n font-weight: 600;\n color: #212529;\n display: flex;\n align-items: center;\n gap: 12px;\n \n i {\n color: #6366f1;\n }\n }\n \n .header-subtitle {\n margin: 4px 0 0 0;\n font-size: 13px;\n color: #6c757d;\n font-weight: normal;\n }\n }\n }\n\n kendo-splitter {\n flex: 1;\n background: white;\n display: flex;\n height: 100%;\n min-height: 0;\n overflow: hidden;\n \n ::ng-deep .k-pane {\n overflow: hidden;\n height: 100%;\n }\n }\n\n .components-panel {\n height: 100%;\n display: flex;\n flex-direction: column;\n background: #f8f9fa;\n \n .panel-header {\n padding: 20px;\n background: white;\n border-bottom: 1px solid #dee2e6;\n \n .panel-header-top {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 16px;\n \n h3 {\n margin: 0;\n font-size: 18px;\n font-weight: 600;\n color: #212529;\n }\n \n .header-actions {\n display: flex;\n align-items: center;\n gap: 12px;\n \n .favorites-toggle {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n border: 1px solid #dee2e6;\n background: white;\n border-radius: 20px;\n font-size: 13px;\n font-weight: 500;\n color: #6c757d;\n cursor: pointer;\n transition: all 0.2s ease;\n \n &:hover {\n background: #f8f9fa;\n border-color: #adb5bd;\n }\n \n &.active {\n background: #fff3cd;\n border-color: #ffc107;\n color: #856404;\n \n i {\n color: #ffc107;\n }\n }\n \n i {\n font-size: 14px;\n }\n }\n \n .component-count {\n font-size: 13px;\n color: #6c757d;\n background: #f8f9fa;\n padding: 4px 10px;\n border-radius: 12px;\n font-weight: 500;\n }\n }\n }\n \n .category-filters {\n margin-bottom: 16px;\n \n .filter-pills {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n \n .category-pill {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n border: 2px solid #e9ecef;\n background: white;\n border-radius: 20px;\n font-size: 13px;\n cursor: pointer;\n transition: all 0.2s ease;\n position: relative;\n overflow: hidden;\n \n &:hover {\n transform: translateY(-1px);\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\n }\n \n &.active {\n border-color: var(--pill-color);\n background: var(--pill-color);\n color: white;\n \n .pill-count {\n background: rgba(255, 255, 255, 0.3);\n color: white;\n }\n }\n \n .pill-name {\n font-weight: 500;\n }\n \n .pill-count {\n background: #f1f3f5;\n padding: 2px 6px;\n border-radius: 10px;\n font-size: 11px;\n font-weight: 600;\n min-width: 20px;\n text-align: center;\n }\n }\n \n .more-button,\n .clear-filters-button {\n padding: 6px 12px;\n border: 1px solid #dee2e6;\n background: white;\n border-radius: 20px;\n font-size: 13px;\n cursor: pointer;\n transition: all 0.2s ease;\n color: #6c757d;\n \n &:hover {\n background: #f8f9fa;\n border-color: #adb5bd;\n }\n \n i {\n font-size: 11px;\n margin-right: 4px;\n }\n }\n \n .clear-filters-button {\n background: #fee2e2;\n border-color: #fca5a5;\n color: #dc2626;\n \n &:hover {\n background: #fca5a5;\n color: white;\n }\n }\n }\n }\n \n .search-box {\n kendo-textbox {\n width: 100%;\n }\n }\n }\n \n .components-list {\n flex: 1;\n overflow-y: auto;\n overflow-x: hidden;\n padding: 16px;\n \n .loading-message,\n .empty-message {\n padding: 48px 24px;\n text-align: center;\n color: #6c757d;\n font-size: 14px;\n \n i {\n margin-right: 8px;\n }\n }\n \n .component-card {\n background: white;\n border: 1px solid #dee2e6;\n border-radius: 8px;\n margin-bottom: 12px;\n transition: all 0.2s ease;\n \n &:hover {\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);\n }\n \n &.expanded {\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);\n border-color: #6366f1;\n }\n \n &.running {\n border-color: #10b981;\n box-shadow: 0 0 0 3px rgba(16, 185, 129, 0.1);\n background: linear-gradient(to right, rgba(16, 185, 129, 0.03) 0%, white 100%);\n \n .card-header {\n &::before {\n content: '';\n position: absolute;\n left: 0;\n top: 0;\n bottom: 0;\n width: 4px;\n background: #10b981;\n }\n }\n }\n \n &.file-loaded {\n background: linear-gradient(135deg, #f0f8ff 0%, white 100%);\n border-style: dashed;\n border-color: #3b82f6;\n \n &:hover {\n box-shadow: 0 2px 8px rgba(59, 130, 246, 0.15);\n }\n \n &.expanded {\n border-style: solid;\n box-shadow: 0 4px 12px rgba(59, 130, 246, 0.2);\n }\n }\n \n .card-header {\n display: flex;\n align-items: center;\n padding: 16px;\n cursor: pointer;\n user-select: none;\n position: relative;\n \n &:hover {\n background: #f8f9fa;\n }\n \n .card-icon {\n font-size: 24px;\n margin-right: 16px;\n width: 32px;\n text-align: center;\n flex-shrink: 0;\n }\n \n .favorite-btn {\n position: absolute;\n top: 12px;\n right: 48px; // Leave room for chevron\n background: white;\n border: 1px solid #dee2e6;\n border-radius: 50%;\n width: 32px;\n height: 32px;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n transition: all 0.2s ease;\n color: #6c757d;\n \n &:hover {\n background: #f8f9fa;\n transform: scale(1.1);\n }\n \n &.is-favorite {\n color: #ffc107;\n border-color: #ffc107;\n background: #fff3cd;\n \n &:hover {\n background: #ffe69c;\n }\n }\n \n i {\n font-size: 14px;\n }\n }\n \n .card-info {\n flex: 1;\n min-width: 0;\n \n .card-name {\n font-size: 15px;\n font-weight: 600;\n color: #212529;\n margin-bottom: 4px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n display: flex;\n align-items: center;\n gap: 8px;\n \n .file-badge {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 2px 6px;\n background: #e0f2fe;\n color: #0369a1;\n border-radius: 4px;\n font-size: 11px;\n font-weight: 500;\n flex-shrink: 0;\n \n i {\n font-size: 10px;\n }\n }\n }\n \n .card-meta {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 12px;\n color: #6c757d;\n \n .card-type {\n font-weight: 500;\n }\n \n .card-version {\n color: #868e96;\n }\n \n .status-badge {\n padding: 2px 6px;\n border-radius: 10px;\n font-size: 10px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.3px;\n \n &.published {\n background: #d1fae5;\n color: #065f46;\n }\n \n &.draft {\n background: #fef3c7;\n color: #92400e;\n }\n \n &.file {\n background: #e0f2fe;\n color: #0369a1;\n }\n \n &.text {\n background: #f3e8ff;\n color: #6b21a8;\n }\n }\n }\n \n .card-namespace {\n margin-top: 8px;\n \n .namespace-chip {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 10px;\n border-radius: 16px;\n font-size: 12px;\n font-weight: 500;\n color: white;\n \n i {\n font-size: 11px;\n opacity: 0.9;\n }\n }\n }\n }\n \n .card-chevron {\n color: #6c757d;\n font-size: 12px;\n margin-left: 12px;\n transition: transform 0.2s ease;\n }\n }\n \n .card-details {\n padding: 0 16px 16px 16px;\n border-top: 1px solid #e9ecef;\n animation: slideDown 0.2s ease;\n \n .detail-section {\n margin-top: 16px;\n \n label {\n display: block;\n font-size: 11px;\n font-weight: 600;\n color: #6c757d;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n margin-bottom: 8px;\n }\n \n p {\n margin: 0;\n font-size: 13px;\n color: #495057;\n line-height: 1.5;\n }\n \n .info-grid {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 8px;\n \n .info-item {\n display: flex;\n align-items: baseline;\n gap: 6px;\n font-size: 13px;\n \n .info-label {\n font-weight: 500;\n color: #6c757d;\n min-width: 50px;\n }\n \n .info-value {\n color: #212529;\n }\n }\n }\n }\n \n .card-actions {\n margin-top: 16px;\n display: flex;\n gap: 8px;\n \n button {\n flex: 1;\n }\n }\n }\n }\n }\n }\n\n .component-display {\n height: 100%;\n display: flex;\n flex-direction: column;\n background: white;\n position: relative;\n overflow: hidden;\n \n .empty-state {\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n color: #868e96;\n padding: 48px;\n text-align: center;\n \n i {\n color: #dee2e6;\n margin-bottom: 24px;\n }\n \n h2 {\n margin: 0 0 12px 0;\n font-size: 24px;\n font-weight: 600;\n color: #495057;\n }\n \n p {\n margin: 0;\n font-size: 14px;\n max-width: 400px;\n }\n }\n \n .error-display {\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 24px;\n background: #f8f9fa;\n \n .error-container {\n width: 100%;\n max-width: 600px;\n background: white;\n border: 2px solid #dc3545;\n border-radius: 8px;\n padding: 24px;\n box-shadow: 0 4px 12px rgba(220, 53, 69, 0.15);\n \n .error-header {\n display: flex;\n align-items: center;\n gap: 12px;\n margin-bottom: 20px;\n color: #dc3545;\n position: relative;\n \n i {\n font-size: 24px;\n }\n \n h3 {\n margin: 0;\n font-size: 20px;\n flex: 1;\n }\n \n .copy-button {\n background: white;\n border: 1px solid #dee2e6;\n border-radius: 4px;\n padding: 6px 10px;\n cursor: pointer;\n color: #6c757d;\n transition: all 0.2s;\n \n &:hover {\n background: #e9ecef;\n color: #495057;\n }\n \n i {\n font-size: 14px;\n }\n }\n }\n \n .error-intro {\n color: #495057;\n margin-bottom: 20px;\n font-size: 14px;\n }\n \n .error-details {\n background: #f8f9fa;\n border: 1px solid #dee2e6;\n border-radius: 4px;\n padding: 16px;\n margin-bottom: 20px;\n font-family: 'SF Mono', Monaco, 'Courier New', monospace;\n font-size: 13px;\n \n .technical-details {\n margin-top: 12px;\n \n summary {\n cursor: pointer;\n color: #0066cc;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n \n &:hover {\n text-decoration: underline;\n }\n }\n \n pre {\n margin-top: 8px;\n white-space: pre-wrap;\n word-break: break-word;\n font-size: 11px;\n color: #495057;\n max-height: 200px;\n overflow-y: auto;\n }\n }\n }\n \n .error-help {\n background: #e7f3ff;\n border: 1px solid #b3d9ff;\n border-radius: 4px;\n padding: 16px;\n margin-bottom: 20px;\n font-size: 13px;\n \n strong {\n display: block;\n margin-bottom: 8px;\n font-size: 14px;\n color: #0066cc;\n }\n \n ol {\n margin: 0;\n padding-left: 20px;\n \n li {\n margin-bottom: 4px;\n color: #495057;\n }\n }\n }\n \n .error-actions {\n display: flex;\n gap: 12px;\n \n button {\n min-width: 100px;\n }\n }\n }\n }\n \n mj-react-component {\n flex: 1;\n width: 100%;\n height: 100%;\n display: block;\n overflow-y: auto;\n overflow-x: hidden;\n }\n \n // Component and editor splitter\n .component-editor-splitter {\n height: 100%;\n overflow: hidden;\n \n ::ng-deep .k-splitter-bar {\n background: #6366f1; // Same blue as Import button\n width: 6px; // Make it slightly wider for visibility\n \n &:hover {\n background: #4f52d9; // Darker blue on hover\n }\n \n .k-resize-handle {\n background-color: rgba(255, 255, 255, 0.3);\n }\n }\n \n ::ng-deep .k-pane {\n overflow: hidden;\n display: flex;\n flex-direction: column;\n }\n }\n \n // Component runtime area\n .component-runtime {\n height: 100%;\n display: flex;\n flex-direction: column;\n background: white;\n position: relative;\n overflow-y: auto;\n overflow-x: hidden;\n \n .run-empty-state {\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 48px;\n text-align: center;\n \n i {\n color: #10b981;\n margin-bottom: 24px;\n }\n \n h3 {\n margin: 0 0 12px 0;\n font-size: 20px;\n font-weight: 600;\n color: #212529;\n }\n \n p {\n margin: 0 0 24px 0;\n font-size: 14px;\n color: #6c757d;\n max-width: 400px;\n }\n }\n }\n \n // Editor tabs on the right\n .editor-tabs {\n height: 100%;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n \n ::ng-deep .k-tabstrip-items-wrapper {\n background: #f8f9fa;\n border-bottom: 2px solid #dee2e6;\n flex-shrink: 0;\n }\n \n ::ng-deep .k-tabstrip-content {\n flex: 1;\n padding: 0;\n overflow: hidden;\n min-height: 0;\n display: flex;\n flex-direction: column;\n }\n \n ::ng-deep .k-item.k-tabstrip-item {\n font-weight: 500;\n \n &.k-active {\n background: white;\n border-bottom-color: white;\n }\n }\n }\n \n .tab-content {\n height: 100%;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n \n &.spec-tab, &.code-tab {\n height: 100%;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n \n .editor-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 12px 16px;\n background: #f8f9fa;\n border-bottom: 1px solid #dee2e6;\n flex-shrink: 0;\n min-width: 0; // Fix width issue\n \n h4 {\n margin: 0;\n font-size: 14px;\n font-weight: 600;\n color: #495057;\n display: flex;\n align-items: center;\n gap: 8px;\n flex-shrink: 1; // Allow title to shrink\n min-width: 0; // Prevent overflow\n \n i {\n color: #6366f1;\n flex-shrink: 0; // Keep icon from shrinking\n }\n }\n \n .editor-actions {\n display: flex;\n gap: 8px;\n flex-shrink: 0; // Prevent buttons from shrinking\n \n button {\n min-width: auto;\n padding: 4px 12px;\n font-size: 13px;\n white-space: nowrap; // Prevent button text wrapping\n }\n }\n }\n \n .editor-wrapper {\n flex: 1;\n overflow-y: auto;\n overflow-x: hidden;\n min-height: 0;\n position: relative;\n }\n \n ::ng-deep .monaco-editor {\n border: 1px solid #dee2e6;\n }\n }\n \n .code-sections {\n height: 100%;\n \n ::ng-deep .k-panelbar-item-header {\n background: #f8f9fa;\n font-weight: 500;\n font-size: 14px;\n }\n \n ::ng-deep .k-panelbar-content {\n padding: 0;\n }\n }\n }\n }\n}\n\n//[_ngcontent-%COMP%] Removed[_ngcontent-%COMP%] tree[_ngcontent-%COMP%] view[_ngcontent-%COMP%] styles[_ngcontent-%COMP%] -[_ngcontent-%COMP%] using[_ngcontent-%COMP%] modern[_ngcontent-%COMP%] category[_ngcontent-%COMP%] filters[_ngcontent-%COMP%] instead\n\n@keyframes[_ngcontent-%COMP%] slideDown[_ngcontent-%COMP%] {\n from {\n opacity: 0;\n transform: translateY(-10px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n@keyframes _ngcontent-%COMP%_pulse {\n 0%, 100% {\n opacity: 1;\n }\n 50% {\n opacity: 0.5;\n }\n}"] });
1153
1628
  };
1154
1629
  ComponentStudioDashboardComponent = __decorate([
1155
1630
  RegisterClass(BaseDashboard, 'ComponentStudioDashboard')
@@ -1157,12 +1632,15 @@ ComponentStudioDashboardComponent = __decorate([
1157
1632
  export { ComponentStudioDashboardComponent };
1158
1633
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ComponentStudioDashboardComponent, [{
1159
1634
  type: Component,
1160
- args: [{ selector: 'mj-component-studio-dashboard', template: "<div class=\"component-studio\">\n <!-- Header -->\n <div class=\"dashboard-header\">\n <div class=\"header-content\">\n <div>\n <h1><i class=\"fa-solid fa-puzzle-piece\"></i> Component Studio</h1>\n <p class=\"header-subtitle\">Testing components without custom properties</p>\n </div>\n <div class=\"header-buttons\">\n @if (selectedComponent && isRunning) {\n <button kendoButton (click)=\"toggleDetailsPane()\" [themeColor]=\"'base'\">\n @if (isDetailsPaneCollapsed) {\n <span class=\"fa-solid fa-eye\"></span> Show Details\n } @else {\n <span class=\"fa-solid fa-eye-slash\"></span> Hide Details\n }\n </button>\n }\n <button kendoButton (click)=\"triggerFileInput()\" [themeColor]=\"'info'\">\n <span class=\"fa-solid fa-file-import\"></span> Import from File\n </button>\n <button kendoButton (click)=\"refreshData()\" [disabled]=\"isLoading\">\n <span class=\"fa-solid fa-sync\"></span> Refresh\n </button>\n </div>\n <!-- Hidden file input -->\n <input #fileInput type=\"file\" accept=\".json\" (change)=\"handleFileSelect($event)\" style=\"display: none;\" />\n </div>\n </div>\n\n <!-- Main Content with Splitter -->\n <kendo-splitter orientation=\"horizontal\" style=\"flex: 1; height: auto;\">\n <!-- Left Panel - Component List -->\n <kendo-splitter-pane [min]=\"'350px'\" [max]=\"'600px'\" [size]=\"'400px'\">\n <div class=\"components-panel\">\n <div class=\"panel-header\">\n <h3>Components</h3>\n <div class=\"search-box\">\n <kendo-textbox \n [value]=\"searchQuery\"\n (valueChange)=\"onSearchChange($event)\"\n placeholder=\"Search components...\"\n [clearButton]=\"true\">\n <ng-template kendoTextBoxPrefixTemplate>\n <i class=\"fa-solid fa-search\"></i>\n </ng-template>\n </kendo-textbox>\n </div>\n </div>\n \n <div class=\"components-list\">\n @if (isLoading) {\n <div class=\"loading-message\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Loading components...\n </div>\n } @else if (filteredComponents.length === 0) {\n <div class=\"empty-message\">\n <i class=\"fa-solid fa-info-circle\"></i> No components found without custom properties.\n <br>\n <small>Only components that don't require custom props can be tested here.</small>\n </div>\n } @else {\n @for (component of filteredComponents; track getComponentId(component)) {\n <div class=\"component-card\" \n [class.expanded]=\"expandedComponent && getComponentId(expandedComponent) === getComponentId(component)\"\n [class.running]=\"selectedComponent && getComponentId(selectedComponent) === getComponentId(component) && isRunning\"\n [class.file-loaded]=\"isFileLoadedComponent(component)\">\n \n <!-- Card Header - Always visible -->\n <div class=\"card-header\" (click)=\"toggleComponentExpansion(component)\">\n <div class=\"card-icon\" [style.color]=\"getComponentTypeColor(getComponentType(component))\">\n <i class=\"fa-solid\" [ngClass]=\"getComponentTypeIcon(getComponentType(component))\"></i>\n </div>\n <div class=\"card-info\">\n <div class=\"card-name\">\n {{ getComponentName(component) }}\n @if (isFileLoadedComponent(component)) {\n <span class=\"file-badge\" title=\"Loaded from {{ getComponentFilename(component) }}\">\n <i class=\"fa-solid fa-file\"></i> {{ getComponentFilename(component) }}\n </span>\n }\n </div>\n <div class=\"card-meta\">\n <span class=\"card-type\">{{ getComponentType(component) || 'Component' }}</span>\n <span class=\"card-version\">v{{ getComponentVersion(component) }}</span>\n @if (isFileLoadedComponent(component)) {\n <span class=\"status-badge file\">File</span>\n } @else if (getComponentStatus(component) === 'Published') {\n <span class=\"status-badge published\">Published</span>\n } @else {\n <span class=\"status-badge draft\">Draft</span>\n }\n </div>\n </div>\n <div class=\"card-chevron\">\n @if (expandedComponent && getComponentId(expandedComponent) === getComponentId(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 \n <!-- Card Details - Only visible when expanded -->\n @if (expandedComponent && getComponentId(expandedComponent) === getComponentId(component)) {\n <div class=\"card-details\">\n @if (getComponentDescription(component)) {\n <div class=\"detail-section\">\n <label>Description</label>\n <p>{{ getComponentDescription(component) }}</p>\n </div>\n }\n \n <div class=\"detail-section\">\n <label>Component Info</label>\n <div class=\"info-grid\">\n <div class=\"info-item\">\n <span class=\"info-label\">Type:</span>\n <span class=\"info-value\">{{ getComponentType(component) || 'Unknown' }}</span>\n </div>\n <div class=\"info-item\">\n <span class=\"info-label\">Version:</span>\n <span class=\"info-value\">{{ getComponentVersion(component) }}</span>\n </div>\n <div class=\"info-item\">\n <span class=\"info-label\">Status:</span>\n <span class=\"info-value\">{{ getComponentStatus(component) || 'Draft' }}</span>\n </div>\n @if (isFileLoadedComponent(component)) {\n <div class=\"info-item\">\n <span class=\"info-label\">Loaded:</span>\n <span class=\"info-value\">{{ getComponentLoadedAt(component) | date:'short' }}</span>\n </div>\n } @else if (!isFileLoadedComponent(component) && getComponentUpdatedAt(component)) {\n <div class=\"info-item\">\n <span class=\"info-label\">Updated:</span>\n <span class=\"info-value\">{{ getComponentUpdatedAt(component) | date:'short' }}</span>\n </div>\n }\n </div>\n </div>\n \n <div class=\"card-actions\">\n @if (selectedComponent && getComponentId(selectedComponent) === getComponentId(component) && isRunning) {\n <button kendoButton \n [themeColor]=\"'error'\"\n (click)=\"stopComponent(); $event.stopPropagation()\">\n <span class=\"fa-solid fa-stop\"></span> Stop Component\n </button>\n } @else if (isRunning && selectedComponent && getComponentId(selectedComponent) !== getComponentId(component)) {\n <button kendoButton \n [themeColor]=\"'base'\"\n title=\"Stop current component and run this one\"\n (click)=\"runComponent(component); $event.stopPropagation()\">\n <span class=\"fa-solid fa-play\"></span> Switch to This Component\n </button>\n } @else {\n <button kendoButton \n [themeColor]=\"'primary'\"\n (click)=\"runComponent(component); $event.stopPropagation()\">\n <span class=\"fa-solid fa-play\"></span> Run Component\n </button>\n }\n </div>\n </div>\n }\n </div>\n }\n }\n </div>\n </div>\n </kendo-splitter-pane>\n\n <!-- Right Panel - Component Display with Editor Splitter -->\n <kendo-splitter-pane [min]=\"'400px'\">\n <div class=\"component-display\">\n @if (selectedComponent) {\n <!-- Splitter for component and editors -->\n <kendo-splitter orientation=\"horizontal\" class=\"component-editor-splitter\">\n <!-- Left side - Running Component -->\n <kendo-splitter-pane [min]=\"'300px'\" [collapsible]=\"false\" [size]=\"isDetailsPaneCollapsed ? '100%' : '50%'\">\n <div class=\"component-runtime\">\n @if (isRunning && componentSpec) {\n @if (currentError) {\n <!-- Error Display -->\n <div class=\"error-display\">\n <div class=\"error-container\">\n <div class=\"error-header\">\n <i class=\"fa-solid fa-exclamation-triangle\"></i>\n <h3>Component Error</h3>\n <button class=\"copy-button\" (click)=\"copyErrorToClipboard()\" title=\"Copy error details\">\n <i class=\"fa-solid fa-copy\"></i>\n </button>\n </div>\n \n <p class=\"error-intro\">\n The component could not be rendered due to the following error:\n </p>\n \n <div class=\"error-details\">\n <strong>Error Type:</strong> {{ currentError.type }}<br>\n <strong>Message:</strong> {{ currentError.message }}\n @if (currentError.technicalDetails) {\n <details class=\"technical-details\">\n <summary>Technical Details (click to expand)</summary>\n <pre>{{ formatTechnicalDetails(currentError.technicalDetails) }}</pre>\n </details>\n }\n </div>\n \n <div class=\"error-help\">\n <strong>What to do:</strong>\n <ol>\n <li>Check that the component code is valid JavaScript/React</li>\n <li>Ensure all required dependencies are available</li>\n <li>Review the technical details for specific error information</li>\n <li>Contact your system administrator if the issue persists</li>\n </ol>\n </div>\n \n <div class=\"error-actions\">\n <button kendoButton (click)=\"retryComponent()\">\n <span class=\"fa-solid fa-rotate\"></span> Retry\n </button>\n <button kendoButton (click)=\"stopComponent()\" [themeColor]=\"'error'\">\n <span class=\"fa-solid fa-stop\"></span> Stop\n </button>\n </div>\n </div>\n </div>\n } @else {\n <!-- React Component -->\n <mj-react-component \n [component]=\"componentSpec\"\n (componentEvent)=\"onComponentEvent($event)\"\n (openEntityRecord)=\"onOpenEntityRecord($event)\">\n </mj-react-component>\n }\n } @else {\n <!-- Component Not Running State -->\n <div class=\"run-empty-state\">\n <i class=\"fa-solid fa-play-circle fa-3x\"></i>\n <h3>Component: {{ getComponentName(selectedComponent) }}</h3>\n <p>{{ getComponentDescription(selectedComponent) || 'No description available' }}</p>\n <button kendoButton [themeColor]=\"'primary'\" [size]=\"'large'\" (click)=\"runComponent(selectedComponent)\">\n <span class=\"fa-solid fa-play\"></span> Run Component\n </button>\n </div>\n }\n </div>\n </kendo-splitter-pane>\n \n <!-- Right side - Spec and Code Editors -->\n <kendo-splitter-pane [min]=\"'400px'\" [collapsible]=\"true\" [collapsed]=\"isDetailsPaneCollapsed\">\n <kendo-tabstrip (tabSelect)=\"onTabSelect($event)\" class=\"editor-tabs\">\n <!-- Spec Tab -->\n <kendo-tabstrip-tab [title]=\"'Spec'\" [selected]=\"activeTab === 0\">\n <ng-template kendoTabContent>\n <div class=\"tab-content spec-tab\">\n <div class=\"editor-header\">\n <h4><i class=\"fa-solid fa-code\"></i> Component Specification (JSON)</h4>\n <div class=\"editor-actions\">\n @if (isEditingSpec) {\n <button kendoButton [themeColor]=\"'primary'\" (click)=\"applySpecChanges()\">\n <span class=\"fa-solid fa-check\"></span> Apply Changes\n </button>\n <button kendoButton (click)=\"initializeEditors()\">\n <span class=\"fa-solid fa-times\"></span> Cancel\n </button>\n }\n @if (isRunning) {\n <button kendoButton (click)=\"refreshComponent()\" [themeColor]=\"'info'\">\n <span class=\"fa-solid fa-sync\"></span> Refresh Component\n </button>\n }\n </div>\n </div>\n <div class=\"editor-wrapper\">\n <mj-code-editor\n [(ngModel)]=\"editableSpec\"\n (ngModelChange)=\"onSpecChange($event)\"\n [language]=\"'json'\"\n [readonly]=\"false\"\n style=\"height: 100%; width: 100%;\">\n </mj-code-editor>\n </div>\n </div>\n </ng-template>\n </kendo-tabstrip-tab>\n \n <!-- Code Tab -->\n <kendo-tabstrip-tab [title]=\"'Code'\" [selected]=\"activeTab === 1\">\n <ng-template kendoTabContent>\n <div class=\"tab-content code-tab\">\n <div class=\"editor-header\">\n <h4><i class=\"fa-solid fa-file-code\"></i> Component Code (JavaScript/React)</h4>\n <div class=\"editor-actions\">\n @if (isEditingCode) {\n <button kendoButton [themeColor]=\"'primary'\" (click)=\"applyCodeChanges()\">\n <span class=\"fa-solid fa-check\"></span> Apply Changes\n </button>\n <button kendoButton (click)=\"initializeEditors()\">\n <span class=\"fa-solid fa-times\"></span> Cancel\n </button>\n }\n @if (isRunning) {\n <button kendoButton (click)=\"refreshComponent()\" [themeColor]=\"'info'\">\n <span class=\"fa-solid fa-sync\"></span> Refresh Component\n </button>\n }\n </div>\n </div>\n \n <!-- Always use panel bar for consistency and to show all components -->\n <div class=\"editor-wrapper\">\n <kendo-panelbar class=\"code-sections\">\n @for (section of getComponentCodeSections(); track section.title; let i = $index) {\n <kendo-panelbar-item [title]=\"section.title\" [expanded]=\"section.expanded\">\n <ng-template kendoPanelBarContent>\n <mj-code-editor\n [ngModel]=\"section.code\"\n (ngModelChange)=\"onCodeSectionChange($event, i)\"\n [language]=\"'javascript'\"\n [readonly]=\"false\"\n style=\"height: 400px; width: 100%;\">\n </mj-code-editor>\n </ng-template>\n </kendo-panelbar-item>\n }\n </kendo-panelbar>\n </div>\n </div>\n </ng-template>\n </kendo-tabstrip-tab>\n </kendo-tabstrip>\n </kendo-splitter-pane>\n </kendo-splitter>\n } @else {\n <!-- Empty State when no component selected -->\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-rocket fa-3x\"></i>\n <h2>Ready to Test Components</h2>\n <p>Select a component from the list to view its details and run it</p>\n </div>\n }\n </div>\n </kendo-splitter-pane>\n </kendo-splitter>\n</div>", styles: [":host {\n display: block;\n width: 100%;\n height: 100%;\n}\n\n.component-studio {\n display: flex;\n flex-direction: column;\n height: 100vh;\n background: #f8f9fa;\n overflow: hidden;\n position: relative;\n\n .dashboard-header {\n background: white;\n border-bottom: 1px solid #dee2e6;\n padding: 16px 24px;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05);\n \n .header-content {\n display: flex;\n justify-content: space-between;\n align-items: center;\n \n .header-buttons {\n display: flex;\n gap: 8px;\n }\n \n h1 {\n margin: 0;\n font-size: 24px;\n font-weight: 600;\n color: #212529;\n display: flex;\n align-items: center;\n gap: 12px;\n \n i {\n color: #6366f1;\n }\n }\n \n .header-subtitle {\n margin: 4px 0 0 0;\n font-size: 13px;\n color: #6c757d;\n font-weight: normal;\n }\n }\n }\n\n kendo-splitter {\n flex: 1;\n background: white;\n display: flex;\n height: 100%;\n min-height: 0;\n overflow: hidden;\n \n ::ng-deep .k-pane {\n overflow: hidden;\n height: 100%;\n }\n }\n\n .components-panel {\n height: 100%;\n display: flex;\n flex-direction: column;\n background: #f8f9fa;\n \n .panel-header {\n padding: 20px;\n background: white;\n border-bottom: 1px solid #dee2e6;\n \n h3 {\n margin: 0 0 16px 0;\n font-size: 18px;\n font-weight: 600;\n color: #212529;\n }\n \n .search-box {\n kendo-textbox {\n width: 100%;\n }\n }\n }\n \n .components-list {\n flex: 1;\n overflow-y: auto;\n overflow-x: hidden;\n padding: 16px;\n \n .loading-message,\n .empty-message {\n padding: 48px 24px;\n text-align: center;\n color: #6c757d;\n font-size: 14px;\n \n i {\n margin-right: 8px;\n }\n }\n \n .component-card {\n background: white;\n border: 1px solid #dee2e6;\n border-radius: 8px;\n margin-bottom: 12px;\n transition: all 0.2s ease;\n \n &:hover {\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);\n }\n \n &.expanded {\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);\n border-color: #6366f1;\n }\n \n &.running {\n border-color: #10b981;\n box-shadow: 0 0 0 3px rgba(16, 185, 129, 0.1);\n background: linear-gradient(to right, rgba(16, 185, 129, 0.03) 0%, white 100%);\n \n .card-header {\n &::before {\n content: '';\n position: absolute;\n left: 0;\n top: 0;\n bottom: 0;\n width: 4px;\n background: #10b981;\n }\n }\n }\n \n &.file-loaded {\n background: linear-gradient(135deg, #f0f8ff 0%, white 100%);\n border-style: dashed;\n border-color: #3b82f6;\n \n &:hover {\n box-shadow: 0 2px 8px rgba(59, 130, 246, 0.15);\n }\n \n &.expanded {\n border-style: solid;\n box-shadow: 0 4px 12px rgba(59, 130, 246, 0.2);\n }\n }\n \n .card-header {\n display: flex;\n align-items: center;\n padding: 16px;\n cursor: pointer;\n user-select: none;\n position: relative;\n \n &:hover {\n background: #f8f9fa;\n }\n \n .card-icon {\n font-size: 24px;\n margin-right: 16px;\n width: 32px;\n text-align: center;\n flex-shrink: 0;\n }\n \n .card-info {\n flex: 1;\n min-width: 0;\n \n .card-name {\n font-size: 15px;\n font-weight: 600;\n color: #212529;\n margin-bottom: 4px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n display: flex;\n align-items: center;\n gap: 8px;\n \n .file-badge {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 2px 6px;\n background: #e0f2fe;\n color: #0369a1;\n border-radius: 4px;\n font-size: 11px;\n font-weight: 500;\n flex-shrink: 0;\n \n i {\n font-size: 10px;\n }\n }\n }\n \n .card-meta {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 12px;\n color: #6c757d;\n \n .card-type {\n font-weight: 500;\n }\n \n .card-version {\n color: #868e96;\n }\n \n .status-badge {\n padding: 2px 6px;\n border-radius: 10px;\n font-size: 10px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.3px;\n \n &.published {\n background: #d1fae5;\n color: #065f46;\n }\n \n &.draft {\n background: #fef3c7;\n color: #92400e;\n }\n \n &.file {\n background: #e0f2fe;\n color: #0369a1;\n }\n }\n }\n }\n \n .card-chevron {\n color: #6c757d;\n font-size: 12px;\n margin-left: 12px;\n transition: transform 0.2s ease;\n }\n }\n \n .card-details {\n padding: 0 16px 16px 16px;\n border-top: 1px solid #e9ecef;\n animation: slideDown 0.2s ease;\n \n .detail-section {\n margin-top: 16px;\n \n label {\n display: block;\n font-size: 11px;\n font-weight: 600;\n color: #6c757d;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n margin-bottom: 8px;\n }\n \n p {\n margin: 0;\n font-size: 13px;\n color: #495057;\n line-height: 1.5;\n }\n \n .info-grid {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 8px;\n \n .info-item {\n display: flex;\n align-items: baseline;\n gap: 6px;\n font-size: 13px;\n \n .info-label {\n font-weight: 500;\n color: #6c757d;\n min-width: 50px;\n }\n \n .info-value {\n color: #212529;\n }\n }\n }\n }\n \n .card-actions {\n margin-top: 16px;\n display: flex;\n gap: 8px;\n \n button {\n flex: 1;\n }\n }\n }\n }\n }\n }\n\n .component-display {\n height: 100%;\n display: flex;\n flex-direction: column;\n background: white;\n position: relative;\n overflow: hidden;\n \n .empty-state {\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n color: #868e96;\n padding: 48px;\n text-align: center;\n \n i {\n color: #dee2e6;\n margin-bottom: 24px;\n }\n \n h2 {\n margin: 0 0 12px 0;\n font-size: 24px;\n font-weight: 600;\n color: #495057;\n }\n \n p {\n margin: 0;\n font-size: 14px;\n max-width: 400px;\n }\n }\n \n .error-display {\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 24px;\n background: #f8f9fa;\n \n .error-container {\n width: 100%;\n max-width: 600px;\n background: white;\n border: 2px solid #dc3545;\n border-radius: 8px;\n padding: 24px;\n box-shadow: 0 4px 12px rgba(220, 53, 69, 0.15);\n \n .error-header {\n display: flex;\n align-items: center;\n gap: 12px;\n margin-bottom: 20px;\n color: #dc3545;\n position: relative;\n \n i {\n font-size: 24px;\n }\n \n h3 {\n margin: 0;\n font-size: 20px;\n flex: 1;\n }\n \n .copy-button {\n background: white;\n border: 1px solid #dee2e6;\n border-radius: 4px;\n padding: 6px 10px;\n cursor: pointer;\n color: #6c757d;\n transition: all 0.2s;\n \n &:hover {\n background: #e9ecef;\n color: #495057;\n }\n \n i {\n font-size: 14px;\n }\n }\n }\n \n .error-intro {\n color: #495057;\n margin-bottom: 20px;\n font-size: 14px;\n }\n \n .error-details {\n background: #f8f9fa;\n border: 1px solid #dee2e6;\n border-radius: 4px;\n padding: 16px;\n margin-bottom: 20px;\n font-family: 'SF Mono', Monaco, 'Courier New', monospace;\n font-size: 13px;\n \n .technical-details {\n margin-top: 12px;\n \n summary {\n cursor: pointer;\n color: #0066cc;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n \n &:hover {\n text-decoration: underline;\n }\n }\n \n pre {\n margin-top: 8px;\n white-space: pre-wrap;\n word-break: break-word;\n font-size: 11px;\n color: #495057;\n max-height: 200px;\n overflow-y: auto;\n }\n }\n }\n \n .error-help {\n background: #e7f3ff;\n border: 1px solid #b3d9ff;\n border-radius: 4px;\n padding: 16px;\n margin-bottom: 20px;\n font-size: 13px;\n \n strong {\n display: block;\n margin-bottom: 8px;\n font-size: 14px;\n color: #0066cc;\n }\n \n ol {\n margin: 0;\n padding-left: 20px;\n \n li {\n margin-bottom: 4px;\n color: #495057;\n }\n }\n }\n \n .error-actions {\n display: flex;\n gap: 12px;\n \n button {\n min-width: 100px;\n }\n }\n }\n }\n \n mj-react-component {\n flex: 1;\n width: 100%;\n height: 100%;\n display: block;\n overflow-y: auto;\n overflow-x: hidden;\n }\n \n // Component and editor splitter\n .component-editor-splitter {\n height: 100%;\n overflow: hidden;\n \n ::ng-deep .k-splitter-bar {\n background: #6366f1; // Same blue as Import button\n width: 6px; // Make it slightly wider for visibility\n \n &:hover {\n background: #4f52d9; // Darker blue on hover\n }\n \n .k-resize-handle {\n background-color: rgba(255, 255, 255, 0.3);\n }\n }\n \n ::ng-deep .k-pane {\n overflow: hidden;\n display: flex;\n flex-direction: column;\n }\n }\n \n // Component runtime area\n .component-runtime {\n height: 100%;\n display: flex;\n flex-direction: column;\n background: white;\n position: relative;\n overflow-y: auto;\n overflow-x: hidden;\n \n .run-empty-state {\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 48px;\n text-align: center;\n \n i {\n color: #10b981;\n margin-bottom: 24px;\n }\n \n h3 {\n margin: 0 0 12px 0;\n font-size: 20px;\n font-weight: 600;\n color: #212529;\n }\n \n p {\n margin: 0 0 24px 0;\n font-size: 14px;\n color: #6c757d;\n max-width: 400px;\n }\n }\n }\n \n // Editor tabs on the right\n .editor-tabs {\n height: 100%;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n \n ::ng-deep .k-tabstrip-items-wrapper {\n background: #f8f9fa;\n border-bottom: 2px solid #dee2e6;\n flex-shrink: 0;\n }\n \n ::ng-deep .k-tabstrip-content {\n flex: 1;\n padding: 0;\n overflow: hidden;\n min-height: 0;\n display: flex;\n flex-direction: column;\n }\n \n ::ng-deep .k-item.k-tabstrip-item {\n font-weight: 500;\n \n &.k-active {\n background: white;\n border-bottom-color: white;\n }\n }\n }\n \n .tab-content {\n height: 100%;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n \n &.spec-tab, &.code-tab {\n height: 100%;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n \n .editor-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 12px 16px;\n background: #f8f9fa;\n border-bottom: 1px solid #dee2e6;\n flex-shrink: 0;\n min-width: 0; // Fix width issue\n \n h4 {\n margin: 0;\n font-size: 14px;\n font-weight: 600;\n color: #495057;\n display: flex;\n align-items: center;\n gap: 8px;\n flex-shrink: 1; // Allow title to shrink\n min-width: 0; // Prevent overflow\n \n i {\n color: #6366f1;\n flex-shrink: 0; // Keep icon from shrinking\n }\n }\n \n .editor-actions {\n display: flex;\n gap: 8px;\n flex-shrink: 0; // Prevent buttons from shrinking\n \n button {\n min-width: auto;\n padding: 4px 12px;\n font-size: 13px;\n white-space: nowrap; // Prevent button text wrapping\n }\n }\n }\n \n .editor-wrapper {\n flex: 1;\n overflow-y: auto;\n overflow-x: hidden;\n min-height: 0;\n position: relative;\n }\n \n ::ng-deep .monaco-editor {\n border: 1px solid #dee2e6;\n }\n }\n \n .code-sections {\n height: 100%;\n \n ::ng-deep .k-panelbar-item-header {\n background: #f8f9fa;\n font-weight: 500;\n font-size: 14px;\n }\n \n ::ng-deep .k-panelbar-content {\n padding: 0;\n }\n }\n }\n }\n}\n\n@keyframes slideDown {\n from {\n opacity: 0;\n transform: translateY(-10px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}"] }]
1161
- }], () => [{ type: i0.ChangeDetectorRef }], { fileInput: [{
1635
+ args: [{ selector: 'mj-component-studio-dashboard', template: "<div class=\"component-studio\">\n <!-- Header -->\n <div class=\"dashboard-header\">\n <div class=\"header-content\">\n <div>\n <h1><i class=\"fa-solid fa-puzzle-piece\"></i> Component Studio</h1>\n <p class=\"header-subtitle\">Testing components without required custom properties</p>\n </div>\n <div class=\"header-buttons\">\n @if (selectedComponent && isRunning) {\n <button kendoButton (click)=\"toggleDetailsPane()\" [themeColor]=\"'base'\">\n @if (isDetailsPaneCollapsed) {\n <span class=\"fa-solid fa-eye\"></span> Show Details\n } @else {\n <span class=\"fa-solid fa-eye-slash\"></span> Hide Details\n }\n </button>\n }\n <div class=\"import-dropdown\" [class.open]=\"importDropdownOpen\">\n <button kendoButton (click)=\"toggleImportDropdown()\" [themeColor]=\"'info'\">\n <span class=\"fa-solid fa-file-import\"></span> Import\n <span class=\"fa-solid fa-chevron-down\" style=\"margin-left: 5px; font-size: 10px;\"></span>\n </button>\n @if (importDropdownOpen) {\n <div class=\"dropdown-menu\">\n <button class=\"dropdown-item\" (click)=\"importFromFile()\">\n <i class=\"fa-solid fa-file\"></i> Import from File\n </button>\n <button class=\"dropdown-item\" (click)=\"importFromText()\">\n <i class=\"fa-solid fa-keyboard\"></i> Import from Text\n </button>\n </div>\n }\n </div>\n <button kendoButton (click)=\"refreshData()\" [disabled]=\"isLoading\">\n <span class=\"fa-solid fa-sync\"></span> Refresh\n </button>\n </div>\n <!-- Hidden file input -->\n <input #fileInput type=\"file\" accept=\".json\" (change)=\"handleFileSelect($event)\" style=\"display: none;\" />\n </div>\n </div>\n\n <!-- Main Content with Splitter -->\n <kendo-splitter orientation=\"horizontal\">\n <!-- Left Panel - Component List -->\n <kendo-splitter-pane [min]=\"'350px'\" [max]=\"'650px'\" [size]=\"'400px'\">\n <div class=\"components-panel\">\n <div class=\"panel-header\">\n <div class=\"panel-header-top\">\n <h3>Components</h3>\n <div class=\"header-actions\">\n <button \n class=\"favorites-toggle\"\n [class.active]=\"showOnlyFavorites\"\n (click)=\"toggleShowOnlyFavorites()\"\n title=\"Show only favorites\">\n @if (showOnlyFavorites) {\n <i class=\"fa-solid fa-star\"></i> Favorites\n } @else {\n <i class=\"fa-regular fa-star\"></i> All\n }\n </button>\n <span class=\"component-count\">{{ filteredComponents.length }} of {{ allComponents.length }}</span>\n </div>\n </div>\n \n <!-- Modern Category Filter Pills -->\n <div class=\"category-filters\">\n @if (availableCategories.length > 0) {\n <div class=\"filter-pills\">\n @for (category of getVisibleCategories(); track category.name) {\n <button \n class=\"category-pill\"\n [class.active]=\"isCategorySelected(category.name)\"\n [style.--pill-color]=\"category.color\"\n (click)=\"toggleCategory(category.name)\">\n <span class=\"pill-name\">{{ category.name }}</span>\n <span class=\"pill-count\">{{ category.count }}</span>\n </button>\n }\n @if (availableCategories.length > 5) {\n <button \n class=\"more-button\"\n (click)=\"toggleShowAllCategories()\">\n @if (showAllCategories) {\n <i class=\"fa-solid fa-chevron-up\"></i> Less\n } @else {\n <i class=\"fa-solid fa-chevron-down\"></i> +{{ availableCategories.length - 5 }} more\n }\n </button>\n }\n @if (selectedCategories.size > 0) {\n <button \n class=\"clear-filters-button\"\n (click)=\"clearCategoryFilters()\">\n <i class=\"fa-solid fa-times\"></i> Clear\n </button>\n }\n </div>\n }\n </div>\n \n <div class=\"search-box\">\n <kendo-textbox \n [value]=\"searchQuery\"\n (valueChange)=\"onSearchChange($event)\"\n placeholder=\"Search components...\"\n [clearButton]=\"true\">\n <ng-template kendoTextBoxPrefixTemplate>\n <i class=\"fa-solid fa-search\"></i>\n </ng-template>\n </kendo-textbox>\n </div>\n </div>\n \n <div class=\"components-list\">\n @if (isLoading) {\n <div class=\"loading-message\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Loading components...\n </div>\n } @else if (filteredComponents.length === 0) {\n <div class=\"empty-message\">\n <i class=\"fa-solid fa-info-circle\"></i> No components found without required custom properties.\n <br>\n <small>Components with optional custom props can be tested, but not those with required props.</small>\n </div>\n } @else {\n <!-- Component Cards -->\n @for (component of filteredComponents; track getComponentId(component)) {\n <div class=\"component-card\" \n [class.expanded]=\"expandedComponent && getComponentId(expandedComponent) === getComponentId(component)\"\n [class.running]=\"selectedComponent && getComponentId(selectedComponent) === getComponentId(component) && isRunning\"\n [class.file-loaded]=\"isFileLoadedComponent(component)\">\n \n <!-- Card Header - Always visible -->\n <div class=\"card-header\" (click)=\"toggleComponentExpansion(component)\">\n <div class=\"card-icon\" [style.color]=\"getComponentTypeColor(getComponentType(component))\">\n <i class=\"fa-solid\" [ngClass]=\"getComponentTypeIcon(getComponentType(component))\"></i>\n </div>\n @if (!isFileLoadedComponent(component)) {\n <button \n class=\"favorite-btn\"\n [class.is-favorite]=\"isFavorite(component)\"\n (click)=\"toggleFavorite(component, $event)\"\n [title]=\"isFavorite(component) ? 'Remove from favorites' : 'Add to favorites'\">\n @if (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 <div class=\"card-info\">\n <div class=\"card-name\">\n {{ getComponentName(component) }}\n @if (isFileLoadedComponent(component)) {\n <span class=\"file-badge\" [title]=\"getComponentStatus(component) === 'Text' ? 'Imported from text input' : 'Loaded from ' + getComponentFilename(component)\">\n @if (getComponentStatus(component) === 'Text') {\n <i class=\"fa-solid fa-keyboard\"></i> Text Import\n } @else {\n <i class=\"fa-solid fa-file\"></i> {{ getComponentFilename(component) }}\n }\n </span>\n }\n </div>\n <div class=\"card-meta\">\n <span class=\"card-type\">{{ getComponentType(component) || 'Component' }}</span>\n <span class=\"card-version\">v{{ getComponentVersion(component) }}</span>\n @if (isFileLoadedComponent(component)) {\n @if (getComponentStatus(component) === 'Text') {\n <span class=\"status-badge text\">Text</span>\n } @else {\n <span class=\"status-badge file\">File</span>\n }\n } @else if (getComponentStatus(component) === 'Published') {\n <span class=\"status-badge published\">Published</span>\n } @else {\n <span class=\"status-badge draft\">Draft</span>\n }\n </div>\n <!-- Namespace chip with color coding -->\n <div class=\"card-namespace\">\n <span class=\"namespace-chip\" \n [style.background-color]=\"getNamespaceColor(getComponentNamespace(component))\"\n [title]=\"getComponentNamespace(component) || 'Uncategorized'\">\n <i class=\"fa-solid fa-folder-tree\"></i>\n {{ formatNamespace(getComponentNamespace(component)) }}\n </span>\n </div>\n </div>\n <div class=\"card-chevron\">\n @if (expandedComponent && getComponentId(expandedComponent) === getComponentId(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 \n <!-- Card Details - Only visible when expanded -->\n @if (expandedComponent && getComponentId(expandedComponent) === getComponentId(component)) {\n <div class=\"card-details\">\n @if (getComponentDescription(component)) {\n <div class=\"detail-section\">\n <label>Description</label>\n <p>{{ getComponentDescription(component) }}</p>\n </div>\n }\n \n <div class=\"detail-section\">\n <label>Component Info</label>\n <div class=\"info-grid\">\n <div class=\"info-item\">\n <span class=\"info-label\">Type:</span>\n <span class=\"info-value\">{{ getComponentType(component) || 'Unknown' }}</span>\n </div>\n <div class=\"info-item\">\n <span class=\"info-label\">Version:</span>\n <span class=\"info-value\">{{ getComponentVersion(component) }}</span>\n </div>\n <div class=\"info-item\">\n <span class=\"info-label\">Status:</span>\n <span class=\"info-value\">{{ getComponentStatus(component) || 'Draft' }}</span>\n </div>\n @if (isFileLoadedComponent(component)) {\n <div class=\"info-item\">\n <span class=\"info-label\">Loaded:</span>\n <span class=\"info-value\">{{ getComponentLoadedAt(component) | date:'short' }}</span>\n </div>\n } @else if (!isFileLoadedComponent(component) && getComponentUpdatedAt(component)) {\n <div class=\"info-item\">\n <span class=\"info-label\">Updated:</span>\n <span class=\"info-value\">{{ getComponentUpdatedAt(component) | date:'short' }}</span>\n </div>\n }\n </div>\n </div>\n \n <div class=\"card-actions\">\n @if (selectedComponent && getComponentId(selectedComponent) === getComponentId(component) && isRunning) {\n <button kendoButton \n [themeColor]=\"'error'\"\n (click)=\"stopComponent(); $event.stopPropagation()\">\n <span class=\"fa-solid fa-stop\"></span> Stop Component\n </button>\n } @else if (isRunning && selectedComponent && getComponentId(selectedComponent) !== getComponentId(component)) {\n <button kendoButton \n [themeColor]=\"'base'\"\n title=\"Stop current component and run this one\"\n (click)=\"runComponent(component); $event.stopPropagation()\">\n <span class=\"fa-solid fa-play\"></span> Switch to This Component\n </button>\n } @else {\n <button kendoButton \n [themeColor]=\"'primary'\"\n (click)=\"runComponent(component); $event.stopPropagation()\">\n <span class=\"fa-solid fa-play\"></span> Run Component\n </button>\n }\n </div>\n </div>\n }\n </div>\n }\n }\n </div>\n </div>\n </kendo-splitter-pane>\n\n <!-- Right Panel - Component Display with Editor Splitter -->\n <kendo-splitter-pane [min]=\"'400px'\">\n <div class=\"component-display\">\n @if (selectedComponent) {\n <kendo-splitter orientation=\"horizontal\">\n <kendo-splitter-pane [size]=\"isDetailsPaneCollapsed ? '100%' : '50%'\">\n <div class=\"component-runtime\">\n @if (isRunning && componentSpec) {\n @if (currentError) {\n <!-- Error Display -->\n <div class=\"error-display\">\n <div class=\"error-container\">\n <div class=\"error-header\">\n <i class=\"fa-solid fa-exclamation-triangle\"></i>\n <h3>Component Error</h3>\n <button class=\"copy-button\" (click)=\"copyErrorToClipboard()\" title=\"Copy error details\">\n <i class=\"fa-solid fa-copy\"></i>\n </button>\n </div>\n \n <p class=\"error-intro\">\n The component could not be rendered due to the following error:\n </p>\n \n <div class=\"error-details\">\n <strong>Error Type:</strong> {{ currentError.type }}<br>\n <strong>Message:</strong> {{ currentError.message }}\n @if (currentError.technicalDetails) {\n <details class=\"technical-details\">\n <summary>Technical Details (click to expand)</summary>\n <pre>{{ formatTechnicalDetails(currentError.technicalDetails) }}</pre>\n </details>\n }\n </div>\n \n <div class=\"error-help\">\n <strong>What to do:</strong>\n <ol>\n <li>Check that the component code is valid JavaScript/React</li>\n <li>Ensure all required dependencies are available</li>\n <li>Review the technical details for specific error information</li>\n <li>Contact your system administrator if the issue persists</li>\n </ol>\n </div>\n \n <div class=\"error-actions\">\n <button kendoButton (click)=\"retryComponent()\">\n <span class=\"fa-solid fa-rotate\"></span> Retry\n </button>\n <button kendoButton (click)=\"stopComponent()\" [themeColor]=\"'error'\">\n <span class=\"fa-solid fa-stop\"></span> Stop\n </button>\n </div>\n </div>\n </div>\n } @else {\n <!-- React Component -->\n <mj-react-component \n [component]=\"componentSpec\"\n (componentEvent)=\"onComponentEvent($event)\"\n (openEntityRecord)=\"onOpenEntityRecord($event)\">\n </mj-react-component>\n }\n } @else {\n <!-- Component Not Running State -->\n <div class=\"run-empty-state\">\n <i class=\"fa-solid fa-play-circle fa-3x\"></i>\n <h3>Component: {{ getComponentName(selectedComponent) }}</h3>\n <p>{{ getComponentDescription(selectedComponent) || 'No description available' }}</p>\n <button kendoButton [themeColor]=\"'primary'\" [size]=\"'large'\" (click)=\"runComponent(selectedComponent)\">\n <span class=\"fa-solid fa-play\"></span> Run Component\n </button>\n </div>\n }\n </div>\n\n </kendo-splitter-pane>\n <kendo-splitter-pane [size]=\"isDetailsPaneCollapsed ? '0px' : '50%'\">\n <div>\n <kendo-tabstrip (tabSelect)=\"onTabSelect($event)\" class=\"editor-tabs\">\n <!-- Spec Tab -->\n <kendo-tabstrip-tab [title]=\"'Spec'\" [selected]=\"activeTab === 0\">\n <ng-template kendoTabContent>\n <div class=\"tab-content spec-tab\">\n <div class=\"editor-header\">\n <h4><i class=\"fa-solid fa-code\"></i> Component Specification (JSON)</h4>\n <div class=\"editor-actions\">\n @if (isEditingSpec) {\n <button kendoButton [themeColor]=\"'primary'\" (click)=\"applySpecChanges()\">\n <span class=\"fa-solid fa-check\"></span> Apply Changes\n </button>\n <button kendoButton (click)=\"initializeEditors()\">\n <span class=\"fa-solid fa-times\"></span> Cancel\n </button>\n }\n @if (isRunning) {\n <button kendoButton (click)=\"refreshComponent()\" [themeColor]=\"'info'\">\n <span class=\"fa-solid fa-sync\"></span> Refresh Component\n </button>\n }\n </div>\n </div>\n <div class=\"editor-wrapper\">\n <mj-code-editor\n [(ngModel)]=\"editableSpec\"\n (ngModelChange)=\"onSpecChange($event)\"\n [language]=\"'json'\"\n [readonly]=\"false\"\n style=\"height: 100%; width: 100%;\">\n </mj-code-editor>\n </div>\n </div>\n </ng-template>\n </kendo-tabstrip-tab>\n \n <!-- Code Tab -->\n <kendo-tabstrip-tab [title]=\"'Code'\" [selected]=\"activeTab === 1\">\n <ng-template kendoTabContent>\n <div class=\"tab-content code-tab\">\n <div class=\"editor-header\">\n <h4><i class=\"fa-solid fa-file-code\"></i> Component Code (JavaScript/React)</h4>\n <div class=\"editor-actions\">\n @if (isEditingCode) {\n <button kendoButton [themeColor]=\"'primary'\" (click)=\"applyCodeChanges()\">\n <span class=\"fa-solid fa-check\"></span> Apply Changes\n </button>\n <button kendoButton (click)=\"initializeEditors()\">\n <span class=\"fa-solid fa-times\"></span> Cancel\n </button>\n }\n @if (isRunning) {\n <button kendoButton (click)=\"refreshComponent()\" [themeColor]=\"'info'\">\n <span class=\"fa-solid fa-sync\"></span> Refresh Component\n </button>\n }\n </div>\n </div>\n \n <!-- Always use panel bar for consistency and to show all components -->\n <div class=\"editor-wrapper\">\n <kendo-panelbar class=\"code-sections\">\n @for (section of getComponentCodeSections(); track section.title; let i = $index) {\n <kendo-panelbar-item [title]=\"section.title\" [expanded]=\"section.expanded\">\n <ng-template kendoPanelBarContent>\n <mj-code-editor\n [ngModel]=\"section.code\"\n (ngModelChange)=\"onCodeSectionChange($event, i)\"\n [language]=\"'javascript'\"\n [readonly]=\"false\"\n style=\"height: 400px; width: 100%;\">\n </mj-code-editor>\n </ng-template>\n </kendo-panelbar-item>\n }\n </kendo-panelbar>\n </div>\n </div>\n </ng-template>\n </kendo-tabstrip-tab>\n </kendo-tabstrip>\n </div>\n </kendo-splitter-pane>\n </kendo-splitter>\n\n @if (!isDetailsPaneCollapsed) {\n \n }\n } @else {\n <!-- Empty State when no component selected -->\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-rocket fa-3x\"></i>\n <h2>Ready to Test Components</h2>\n <p>Select a component from the list to view its details and run it</p>\n </div>\n }\n </div>\n </kendo-splitter-pane>\n </kendo-splitter>\n</div>", styles: [":host {\n display: block;\n width: 100%;\n height: 100%;\n}\n\n.component-studio {\n display: flex;\n flex-direction: column;\n height: 100vh;\n background: #f8f9fa;\n overflow: hidden;\n position: relative;\n\n .dashboard-header {\n background: white;\n border-bottom: 1px solid #dee2e6;\n padding: 16px 24px;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05);\n \n .header-content {\n display: flex;\n justify-content: space-between;\n align-items: center;\n \n .header-buttons {\n display: flex;\n gap: 8px;\n \n .import-dropdown {\n position: relative;\n \n .dropdown-menu {\n position: absolute;\n top: calc(100% + 4px);\n left: 0;\n background: white;\n border: 1px solid #dee2e6;\n border-radius: 4px;\n box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);\n z-index: 1000;\n min-width: 180px;\n \n .dropdown-item {\n display: flex;\n align-items: center;\n gap: 10px;\n width: 100%;\n padding: 10px 16px;\n border: none;\n background: none;\n text-align: left;\n cursor: pointer;\n font-size: 14px;\n color: #212529;\n transition: background-color 0.2s;\n \n &:hover {\n background-color: #f8f9fa;\n }\n \n &:not(:last-child) {\n border-bottom: 1px solid #e9ecef;\n }\n \n i {\n width: 16px;\n text-align: center;\n color: #6366f1;\n }\n }\n }\n }\n }\n \n h1 {\n margin: 0;\n font-size: 24px;\n font-weight: 600;\n color: #212529;\n display: flex;\n align-items: center;\n gap: 12px;\n \n i {\n color: #6366f1;\n }\n }\n \n .header-subtitle {\n margin: 4px 0 0 0;\n font-size: 13px;\n color: #6c757d;\n font-weight: normal;\n }\n }\n }\n\n kendo-splitter {\n flex: 1;\n background: white;\n display: flex;\n height: 100%;\n min-height: 0;\n overflow: hidden;\n \n ::ng-deep .k-pane {\n overflow: hidden;\n height: 100%;\n }\n }\n\n .components-panel {\n height: 100%;\n display: flex;\n flex-direction: column;\n background: #f8f9fa;\n \n .panel-header {\n padding: 20px;\n background: white;\n border-bottom: 1px solid #dee2e6;\n \n .panel-header-top {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 16px;\n \n h3 {\n margin: 0;\n font-size: 18px;\n font-weight: 600;\n color: #212529;\n }\n \n .header-actions {\n display: flex;\n align-items: center;\n gap: 12px;\n \n .favorites-toggle {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n border: 1px solid #dee2e6;\n background: white;\n border-radius: 20px;\n font-size: 13px;\n font-weight: 500;\n color: #6c757d;\n cursor: pointer;\n transition: all 0.2s ease;\n \n &:hover {\n background: #f8f9fa;\n border-color: #adb5bd;\n }\n \n &.active {\n background: #fff3cd;\n border-color: #ffc107;\n color: #856404;\n \n i {\n color: #ffc107;\n }\n }\n \n i {\n font-size: 14px;\n }\n }\n \n .component-count {\n font-size: 13px;\n color: #6c757d;\n background: #f8f9fa;\n padding: 4px 10px;\n border-radius: 12px;\n font-weight: 500;\n }\n }\n }\n \n .category-filters {\n margin-bottom: 16px;\n \n .filter-pills {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n \n .category-pill {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n border: 2px solid #e9ecef;\n background: white;\n border-radius: 20px;\n font-size: 13px;\n cursor: pointer;\n transition: all 0.2s ease;\n position: relative;\n overflow: hidden;\n \n &:hover {\n transform: translateY(-1px);\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\n }\n \n &.active {\n border-color: var(--pill-color);\n background: var(--pill-color);\n color: white;\n \n .pill-count {\n background: rgba(255, 255, 255, 0.3);\n color: white;\n }\n }\n \n .pill-name {\n font-weight: 500;\n }\n \n .pill-count {\n background: #f1f3f5;\n padding: 2px 6px;\n border-radius: 10px;\n font-size: 11px;\n font-weight: 600;\n min-width: 20px;\n text-align: center;\n }\n }\n \n .more-button,\n .clear-filters-button {\n padding: 6px 12px;\n border: 1px solid #dee2e6;\n background: white;\n border-radius: 20px;\n font-size: 13px;\n cursor: pointer;\n transition: all 0.2s ease;\n color: #6c757d;\n \n &:hover {\n background: #f8f9fa;\n border-color: #adb5bd;\n }\n \n i {\n font-size: 11px;\n margin-right: 4px;\n }\n }\n \n .clear-filters-button {\n background: #fee2e2;\n border-color: #fca5a5;\n color: #dc2626;\n \n &:hover {\n background: #fca5a5;\n color: white;\n }\n }\n }\n }\n \n .search-box {\n kendo-textbox {\n width: 100%;\n }\n }\n }\n \n .components-list {\n flex: 1;\n overflow-y: auto;\n overflow-x: hidden;\n padding: 16px;\n \n .loading-message,\n .empty-message {\n padding: 48px 24px;\n text-align: center;\n color: #6c757d;\n font-size: 14px;\n \n i {\n margin-right: 8px;\n }\n }\n \n .component-card {\n background: white;\n border: 1px solid #dee2e6;\n border-radius: 8px;\n margin-bottom: 12px;\n transition: all 0.2s ease;\n \n &:hover {\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);\n }\n \n &.expanded {\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);\n border-color: #6366f1;\n }\n \n &.running {\n border-color: #10b981;\n box-shadow: 0 0 0 3px rgba(16, 185, 129, 0.1);\n background: linear-gradient(to right, rgba(16, 185, 129, 0.03) 0%, white 100%);\n \n .card-header {\n &::before {\n content: '';\n position: absolute;\n left: 0;\n top: 0;\n bottom: 0;\n width: 4px;\n background: #10b981;\n }\n }\n }\n \n &.file-loaded {\n background: linear-gradient(135deg, #f0f8ff 0%, white 100%);\n border-style: dashed;\n border-color: #3b82f6;\n \n &:hover {\n box-shadow: 0 2px 8px rgba(59, 130, 246, 0.15);\n }\n \n &.expanded {\n border-style: solid;\n box-shadow: 0 4px 12px rgba(59, 130, 246, 0.2);\n }\n }\n \n .card-header {\n display: flex;\n align-items: center;\n padding: 16px;\n cursor: pointer;\n user-select: none;\n position: relative;\n \n &:hover {\n background: #f8f9fa;\n }\n \n .card-icon {\n font-size: 24px;\n margin-right: 16px;\n width: 32px;\n text-align: center;\n flex-shrink: 0;\n }\n \n .favorite-btn {\n position: absolute;\n top: 12px;\n right: 48px; // Leave room for chevron\n background: white;\n border: 1px solid #dee2e6;\n border-radius: 50%;\n width: 32px;\n height: 32px;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n transition: all 0.2s ease;\n color: #6c757d;\n \n &:hover {\n background: #f8f9fa;\n transform: scale(1.1);\n }\n \n &.is-favorite {\n color: #ffc107;\n border-color: #ffc107;\n background: #fff3cd;\n \n &:hover {\n background: #ffe69c;\n }\n }\n \n i {\n font-size: 14px;\n }\n }\n \n .card-info {\n flex: 1;\n min-width: 0;\n \n .card-name {\n font-size: 15px;\n font-weight: 600;\n color: #212529;\n margin-bottom: 4px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n display: flex;\n align-items: center;\n gap: 8px;\n \n .file-badge {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 2px 6px;\n background: #e0f2fe;\n color: #0369a1;\n border-radius: 4px;\n font-size: 11px;\n font-weight: 500;\n flex-shrink: 0;\n \n i {\n font-size: 10px;\n }\n }\n }\n \n .card-meta {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 12px;\n color: #6c757d;\n \n .card-type {\n font-weight: 500;\n }\n \n .card-version {\n color: #868e96;\n }\n \n .status-badge {\n padding: 2px 6px;\n border-radius: 10px;\n font-size: 10px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.3px;\n \n &.published {\n background: #d1fae5;\n color: #065f46;\n }\n \n &.draft {\n background: #fef3c7;\n color: #92400e;\n }\n \n &.file {\n background: #e0f2fe;\n color: #0369a1;\n }\n \n &.text {\n background: #f3e8ff;\n color: #6b21a8;\n }\n }\n }\n \n .card-namespace {\n margin-top: 8px;\n \n .namespace-chip {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 10px;\n border-radius: 16px;\n font-size: 12px;\n font-weight: 500;\n color: white;\n \n i {\n font-size: 11px;\n opacity: 0.9;\n }\n }\n }\n }\n \n .card-chevron {\n color: #6c757d;\n font-size: 12px;\n margin-left: 12px;\n transition: transform 0.2s ease;\n }\n }\n \n .card-details {\n padding: 0 16px 16px 16px;\n border-top: 1px solid #e9ecef;\n animation: slideDown 0.2s ease;\n \n .detail-section {\n margin-top: 16px;\n \n label {\n display: block;\n font-size: 11px;\n font-weight: 600;\n color: #6c757d;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n margin-bottom: 8px;\n }\n \n p {\n margin: 0;\n font-size: 13px;\n color: #495057;\n line-height: 1.5;\n }\n \n .info-grid {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 8px;\n \n .info-item {\n display: flex;\n align-items: baseline;\n gap: 6px;\n font-size: 13px;\n \n .info-label {\n font-weight: 500;\n color: #6c757d;\n min-width: 50px;\n }\n \n .info-value {\n color: #212529;\n }\n }\n }\n }\n \n .card-actions {\n margin-top: 16px;\n display: flex;\n gap: 8px;\n \n button {\n flex: 1;\n }\n }\n }\n }\n }\n }\n\n .component-display {\n height: 100%;\n display: flex;\n flex-direction: column;\n background: white;\n position: relative;\n overflow: hidden;\n \n .empty-state {\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n color: #868e96;\n padding: 48px;\n text-align: center;\n \n i {\n color: #dee2e6;\n margin-bottom: 24px;\n }\n \n h2 {\n margin: 0 0 12px 0;\n font-size: 24px;\n font-weight: 600;\n color: #495057;\n }\n \n p {\n margin: 0;\n font-size: 14px;\n max-width: 400px;\n }\n }\n \n .error-display {\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 24px;\n background: #f8f9fa;\n \n .error-container {\n width: 100%;\n max-width: 600px;\n background: white;\n border: 2px solid #dc3545;\n border-radius: 8px;\n padding: 24px;\n box-shadow: 0 4px 12px rgba(220, 53, 69, 0.15);\n \n .error-header {\n display: flex;\n align-items: center;\n gap: 12px;\n margin-bottom: 20px;\n color: #dc3545;\n position: relative;\n \n i {\n font-size: 24px;\n }\n \n h3 {\n margin: 0;\n font-size: 20px;\n flex: 1;\n }\n \n .copy-button {\n background: white;\n border: 1px solid #dee2e6;\n border-radius: 4px;\n padding: 6px 10px;\n cursor: pointer;\n color: #6c757d;\n transition: all 0.2s;\n \n &:hover {\n background: #e9ecef;\n color: #495057;\n }\n \n i {\n font-size: 14px;\n }\n }\n }\n \n .error-intro {\n color: #495057;\n margin-bottom: 20px;\n font-size: 14px;\n }\n \n .error-details {\n background: #f8f9fa;\n border: 1px solid #dee2e6;\n border-radius: 4px;\n padding: 16px;\n margin-bottom: 20px;\n font-family: 'SF Mono', Monaco, 'Courier New', monospace;\n font-size: 13px;\n \n .technical-details {\n margin-top: 12px;\n \n summary {\n cursor: pointer;\n color: #0066cc;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n \n &:hover {\n text-decoration: underline;\n }\n }\n \n pre {\n margin-top: 8px;\n white-space: pre-wrap;\n word-break: break-word;\n font-size: 11px;\n color: #495057;\n max-height: 200px;\n overflow-y: auto;\n }\n }\n }\n \n .error-help {\n background: #e7f3ff;\n border: 1px solid #b3d9ff;\n border-radius: 4px;\n padding: 16px;\n margin-bottom: 20px;\n font-size: 13px;\n \n strong {\n display: block;\n margin-bottom: 8px;\n font-size: 14px;\n color: #0066cc;\n }\n \n ol {\n margin: 0;\n padding-left: 20px;\n \n li {\n margin-bottom: 4px;\n color: #495057;\n }\n }\n }\n \n .error-actions {\n display: flex;\n gap: 12px;\n \n button {\n min-width: 100px;\n }\n }\n }\n }\n \n mj-react-component {\n flex: 1;\n width: 100%;\n height: 100%;\n display: block;\n overflow-y: auto;\n overflow-x: hidden;\n }\n \n // Component and editor splitter\n .component-editor-splitter {\n height: 100%;\n overflow: hidden;\n \n ::ng-deep .k-splitter-bar {\n background: #6366f1; // Same blue as Import button\n width: 6px; // Make it slightly wider for visibility\n \n &:hover {\n background: #4f52d9; // Darker blue on hover\n }\n \n .k-resize-handle {\n background-color: rgba(255, 255, 255, 0.3);\n }\n }\n \n ::ng-deep .k-pane {\n overflow: hidden;\n display: flex;\n flex-direction: column;\n }\n }\n \n // Component runtime area\n .component-runtime {\n height: 100%;\n display: flex;\n flex-direction: column;\n background: white;\n position: relative;\n overflow-y: auto;\n overflow-x: hidden;\n \n .run-empty-state {\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 48px;\n text-align: center;\n \n i {\n color: #10b981;\n margin-bottom: 24px;\n }\n \n h3 {\n margin: 0 0 12px 0;\n font-size: 20px;\n font-weight: 600;\n color: #212529;\n }\n \n p {\n margin: 0 0 24px 0;\n font-size: 14px;\n color: #6c757d;\n max-width: 400px;\n }\n }\n }\n \n // Editor tabs on the right\n .editor-tabs {\n height: 100%;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n \n ::ng-deep .k-tabstrip-items-wrapper {\n background: #f8f9fa;\n border-bottom: 2px solid #dee2e6;\n flex-shrink: 0;\n }\n \n ::ng-deep .k-tabstrip-content {\n flex: 1;\n padding: 0;\n overflow: hidden;\n min-height: 0;\n display: flex;\n flex-direction: column;\n }\n \n ::ng-deep .k-item.k-tabstrip-item {\n font-weight: 500;\n \n &.k-active {\n background: white;\n border-bottom-color: white;\n }\n }\n }\n \n .tab-content {\n height: 100%;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n \n &.spec-tab, &.code-tab {\n height: 100%;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n \n .editor-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 12px 16px;\n background: #f8f9fa;\n border-bottom: 1px solid #dee2e6;\n flex-shrink: 0;\n min-width: 0; // Fix width issue\n \n h4 {\n margin: 0;\n font-size: 14px;\n font-weight: 600;\n color: #495057;\n display: flex;\n align-items: center;\n gap: 8px;\n flex-shrink: 1; // Allow title to shrink\n min-width: 0; // Prevent overflow\n \n i {\n color: #6366f1;\n flex-shrink: 0; // Keep icon from shrinking\n }\n }\n \n .editor-actions {\n display: flex;\n gap: 8px;\n flex-shrink: 0; // Prevent buttons from shrinking\n \n button {\n min-width: auto;\n padding: 4px 12px;\n font-size: 13px;\n white-space: nowrap; // Prevent button text wrapping\n }\n }\n }\n \n .editor-wrapper {\n flex: 1;\n overflow-y: auto;\n overflow-x: hidden;\n min-height: 0;\n position: relative;\n }\n \n ::ng-deep .monaco-editor {\n border: 1px solid #dee2e6;\n }\n }\n \n .code-sections {\n height: 100%;\n \n ::ng-deep .k-panelbar-item-header {\n background: #f8f9fa;\n font-weight: 500;\n font-size: 14px;\n }\n \n ::ng-deep .k-panelbar-content {\n padding: 0;\n }\n }\n }\n }\n}\n\n// Removed tree view styles - using modern category filters instead\n\n@keyframes slideDown {\n from {\n opacity: 0;\n transform: translateY(-10px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n@keyframes pulse {\n 0%, 100% {\n opacity: 1;\n }\n 50% {\n opacity: 0.5;\n }\n}"] }]
1636
+ }], () => [{ type: i0.ChangeDetectorRef }, { type: i1.DialogService }, { type: i0.ViewContainerRef }], { fileInput: [{
1162
1637
  type: ViewChild,
1163
1638
  args: ['fileInput', { static: false }]
1639
+ }], onDocumentClick: [{
1640
+ type: HostListener,
1641
+ args: ['document:click', ['$event']]
1164
1642
  }] }); })();
1165
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ComponentStudioDashboardComponent, { className: "ComponentStudioDashboardComponent", filePath: "src/ComponentStudio/component-studio-dashboard.component.ts", lineNumber: 35 }); })();
1643
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ComponentStudioDashboardComponent, { className: "ComponentStudioDashboardComponent", filePath: "src/ComponentStudio/component-studio-dashboard.component.ts", lineNumber: 45 }); })();
1166
1644
  /**
1167
1645
  * Function to prevent tree shaking of the ComponentStudioDashboardComponent.
1168
1646
  */