@memberjunction/ng-dashboards 2.94.0 → 2.96.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.
@@ -9,9 +9,12 @@ import { BaseDashboard } from '../generic/base-dashboard';
9
9
  import { RegisterClass } from '@memberjunction/global';
10
10
  import { RunView, CompositeKey, Metadata } from '@memberjunction/core';
11
11
  import { Subject } from 'rxjs';
12
+ import { MJReactComponent } from '@memberjunction/ng-react';
12
13
  import { SharedService } from '@memberjunction/ng-shared';
13
14
  import { ParseJSONRecursive } from '@memberjunction/global';
14
15
  import { TextImportDialogComponent } from './components/text-import-dialog.component';
16
+ import { ArtifactSelectionDialogComponent } from './components/artifact-selection-dialog.component';
17
+ import { MJNotificationService } from '@memberjunction/ng-notifications';
15
18
  import * as i0 from "@angular/core";
16
19
  import * as i1 from "@progress/kendo-angular-dialog";
17
20
  import * as i2 from "@angular/common";
@@ -26,11 +29,11 @@ const _forTrack0 = ($index, $item) => $item.name;
26
29
  function _forTrack1($index, $item) { return this.getComponentId($item); }
27
30
  const _forTrack2 = ($index, $item) => $item.title;
28
31
  function ComponentStudioDashboardComponent_Conditional_10_Conditional_1_Template(rf, ctx) { if (rf & 1) {
29
- i0.ɵɵelement(0, "span", 35);
32
+ i0.ɵɵelement(0, "span", 36);
30
33
  i0.ɵɵtext(1, " Show Details ");
31
34
  } }
32
35
  function ComponentStudioDashboardComponent_Conditional_10_Conditional_2_Template(rf, ctx) { if (rf & 1) {
33
- i0.ɵɵelement(0, "span", 36);
36
+ i0.ɵɵelement(0, "span", 37);
34
37
  i0.ɵɵtext(1, " Hide Details ");
35
38
  } }
36
39
  function ComponentStudioDashboardComponent_Conditional_10_Template(rf, ctx) { if (rf & 1) {
@@ -47,80 +50,116 @@ function ComponentStudioDashboardComponent_Conditional_10_Template(rf, ctx) { if
47
50
  } }
48
51
  function ComponentStudioDashboardComponent_Conditional_16_Template(rf, ctx) { if (rf & 1) {
49
52
  const _r4 = i0.ɵɵgetCurrentView();
50
- i0.ɵɵelementStart(0, "div", 12)(1, "button", 37);
53
+ i0.ɵɵelementStart(0, "div", 12)(1, "button", 38);
51
54
  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);
55
+ i0.ɵɵelement(2, "i", 39);
53
56
  i0.ɵɵtext(3, " Import from File ");
54
57
  i0.ɵɵelementEnd();
55
- i0.ɵɵelementStart(4, "button", 37);
58
+ i0.ɵɵelementStart(4, "button", 38);
56
59
  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);
60
+ i0.ɵɵelement(5, "i", 40);
58
61
  i0.ɵɵtext(6, " Import from Text ");
59
62
  i0.ɵɵelementEnd()();
60
63
  } }
61
- function ComponentStudioDashboardComponent_Conditional_31_Template(rf, ctx) { if (rf & 1) {
62
- i0.ɵɵelement(0, "i", 40);
63
- i0.ɵɵtext(1, " Favorites ");
64
+ function ComponentStudioDashboardComponent_Conditional_17_Conditional_5_Template(rf, ctx) { if (rf & 1) {
65
+ const _r6 = i0.ɵɵgetCurrentView();
66
+ i0.ɵɵelementStart(0, "div", 12)(1, "button", 38);
67
+ i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_17_Conditional_5_Template_button_click_1_listener() { i0.ɵɵrestoreView(_r6); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.exportToArtifact()); });
68
+ i0.ɵɵelement(2, "i", 43);
69
+ i0.ɵɵtext(3, " Export to Artifact ");
70
+ i0.ɵɵelementEnd();
71
+ i0.ɵɵelementStart(4, "button", 38);
72
+ i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_17_Conditional_5_Template_button_click_4_listener() { i0.ɵɵrestoreView(_r6); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.exportToFile()); });
73
+ i0.ɵɵelement(5, "i", 39);
74
+ i0.ɵɵtext(6, " Export to File ");
75
+ i0.ɵɵelementEnd();
76
+ i0.ɵɵelementStart(7, "button", 38);
77
+ i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_17_Conditional_5_Template_button_click_7_listener() { i0.ɵɵrestoreView(_r6); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.exportToClipboard()); });
78
+ i0.ɵɵelement(8, "i", 44);
79
+ i0.ɵɵtext(9, " Export to Clipboard ");
80
+ i0.ɵɵelementEnd()();
81
+ } }
82
+ function ComponentStudioDashboardComponent_Conditional_17_Template(rf, ctx) { if (rf & 1) {
83
+ const _r5 = i0.ɵɵgetCurrentView();
84
+ i0.ɵɵelementStart(0, "div", 41)(1, "button", 9);
85
+ i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_17_Template_button_click_1_listener() { i0.ɵɵrestoreView(_r5); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.toggleExportDropdown()); });
86
+ i0.ɵɵelement(2, "span", 42);
87
+ i0.ɵɵtext(3, " Export ");
88
+ i0.ɵɵelement(4, "span", 11);
89
+ i0.ɵɵelementEnd();
90
+ i0.ɵɵtemplate(5, ComponentStudioDashboardComponent_Conditional_17_Conditional_5_Template, 10, 0, "div", 12);
91
+ i0.ɵɵelementEnd();
92
+ } if (rf & 2) {
93
+ const ctx_r2 = i0.ɵɵnextContext();
94
+ i0.ɵɵclassProp("open", ctx_r2.exportDropdownOpen);
95
+ i0.ɵɵadvance();
96
+ i0.ɵɵproperty("themeColor", "primary");
97
+ i0.ɵɵadvance(4);
98
+ i0.ɵɵconditional(ctx_r2.exportDropdownOpen ? 5 : -1);
64
99
  } }
65
100
  function ComponentStudioDashboardComponent_Conditional_32_Template(rf, ctx) { if (rf & 1) {
66
- i0.ɵɵelement(0, "i", 41);
101
+ i0.ɵɵelement(0, "i", 45);
102
+ i0.ɵɵtext(1, " Favorites ");
103
+ } }
104
+ function ComponentStudioDashboardComponent_Conditional_33_Template(rf, ctx) { if (rf & 1) {
105
+ i0.ɵɵelement(0, "i", 46);
67
106
  i0.ɵɵtext(1, " All ");
68
107
  } }
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);
108
+ function ComponentStudioDashboardComponent_Conditional_37_For_2_Template(rf, ctx) { if (rf & 1) {
109
+ const _r7 = i0.ɵɵgetCurrentView();
110
+ i0.ɵɵelementStart(0, "button", 50);
111
+ i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_37_For_2_Template_button_click_0_listener() { const category_r8 = i0.ɵɵrestoreView(_r7).$implicit; const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.toggleCategory(category_r8.name)); });
112
+ i0.ɵɵelementStart(1, "span", 51);
74
113
  i0.ɵɵtext(2);
75
114
  i0.ɵɵelementEnd();
76
- i0.ɵɵelementStart(3, "span", 47);
115
+ i0.ɵɵelementStart(3, "span", 52);
77
116
  i0.ɵɵtext(4);
78
117
  i0.ɵɵelementEnd()();
79
118
  } if (rf & 2) {
80
- const category_r6 = ctx.$implicit;
119
+ const category_r8 = ctx.$implicit;
81
120
  const ctx_r2 = i0.ɵɵnextContext(2);
82
- i0.ɵɵstyleProp("--pill-color", category_r6.color);
83
- i0.ɵɵclassProp("active", ctx_r2.isCategorySelected(category_r6.name));
121
+ i0.ɵɵstyleProp("--pill-color", category_r8.color);
122
+ i0.ɵɵclassProp("active", ctx_r2.isCategorySelected(category_r8.name));
84
123
  i0.ɵɵadvance(2);
85
- i0.ɵɵtextInterpolate(category_r6.name);
124
+ i0.ɵɵtextInterpolate(category_r8.name);
86
125
  i0.ɵɵadvance(2);
87
- i0.ɵɵtextInterpolate(category_r6.count);
126
+ i0.ɵɵtextInterpolate(category_r8.count);
88
127
  } }
89
- function ComponentStudioDashboardComponent_Conditional_36_Conditional_3_Conditional_1_Template(rf, ctx) { if (rf & 1) {
90
- i0.ɵɵelement(0, "i", 49);
128
+ function ComponentStudioDashboardComponent_Conditional_37_Conditional_3_Conditional_1_Template(rf, ctx) { if (rf & 1) {
129
+ i0.ɵɵelement(0, "i", 54);
91
130
  i0.ɵɵtext(1, " Less ");
92
131
  } }
93
- function ComponentStudioDashboardComponent_Conditional_36_Conditional_3_Conditional_2_Template(rf, ctx) { if (rf & 1) {
94
- i0.ɵɵelement(0, "i", 50);
132
+ function ComponentStudioDashboardComponent_Conditional_37_Conditional_3_Conditional_2_Template(rf, ctx) { if (rf & 1) {
133
+ i0.ɵɵelement(0, "i", 55);
95
134
  i0.ɵɵtext(1);
96
135
  } if (rf & 2) {
97
136
  const ctx_r2 = i0.ɵɵnextContext(3);
98
137
  i0.ɵɵadvance();
99
138
  i0.ɵɵtextInterpolate1(" +", ctx_r2.availableCategories.length - 5, " more ");
100
139
  } }
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);
140
+ function ComponentStudioDashboardComponent_Conditional_37_Conditional_3_Template(rf, ctx) { if (rf & 1) {
141
+ const _r9 = i0.ɵɵgetCurrentView();
142
+ i0.ɵɵelementStart(0, "button", 53);
143
+ i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_37_Conditional_3_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r9); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.toggleShowAllCategories()); });
144
+ i0.ɵɵtemplate(1, ComponentStudioDashboardComponent_Conditional_37_Conditional_3_Conditional_1_Template, 2, 0)(2, ComponentStudioDashboardComponent_Conditional_37_Conditional_3_Conditional_2_Template, 2, 1);
106
145
  i0.ɵɵelementEnd();
107
146
  } if (rf & 2) {
108
147
  const ctx_r2 = i0.ɵɵnextContext(2);
109
148
  i0.ɵɵadvance();
110
149
  i0.ɵɵconditional(ctx_r2.showAllCategories ? 1 : 2);
111
150
  } }
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);
151
+ function ComponentStudioDashboardComponent_Conditional_37_Conditional_4_Template(rf, ctx) { if (rf & 1) {
152
+ const _r10 = i0.ɵɵgetCurrentView();
153
+ i0.ɵɵelementStart(0, "button", 56);
154
+ i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_37_Conditional_4_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r10); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.clearCategoryFilters()); });
155
+ i0.ɵɵelement(1, "i", 57);
117
156
  i0.ɵɵtext(2, " Clear ");
118
157
  i0.ɵɵelementEnd();
119
158
  } }
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);
159
+ function ComponentStudioDashboardComponent_Conditional_37_Template(rf, ctx) { if (rf & 1) {
160
+ i0.ɵɵelementStart(0, "div", 26);
161
+ i0.ɵɵrepeaterCreate(1, ComponentStudioDashboardComponent_Conditional_37_For_2_Template, 5, 6, "button", 47, _forTrack0);
162
+ i0.ɵɵtemplate(3, ComponentStudioDashboardComponent_Conditional_37_Conditional_3_Template, 3, 1, "button", 48)(4, ComponentStudioDashboardComponent_Conditional_37_Conditional_4_Template, 3, 0, "button", 49);
124
163
  i0.ɵɵelementEnd();
125
164
  } if (rf & 2) {
126
165
  const ctx_r2 = i0.ɵɵnextContext();
@@ -131,284 +170,284 @@ function ComponentStudioDashboardComponent_Conditional_36_Template(rf, ctx) { if
131
170
  i0.ɵɵadvance();
132
171
  i0.ɵɵconditional(ctx_r2.selectedCategories.size > 0 ? 4 : -1);
133
172
  } }
134
- function ComponentStudioDashboardComponent_ng_template_39_Template(rf, ctx) { if (rf & 1) {
135
- i0.ɵɵelement(0, "i", 53);
173
+ function ComponentStudioDashboardComponent_ng_template_40_Template(rf, ctx) { if (rf & 1) {
174
+ i0.ɵɵelement(0, "i", 58);
136
175
  } }
137
- function ComponentStudioDashboardComponent_Conditional_41_Template(rf, ctx) { if (rf & 1) {
138
- i0.ɵɵelementStart(0, "div", 30);
139
- i0.ɵɵelement(1, "i", 54);
176
+ function ComponentStudioDashboardComponent_Conditional_42_Template(rf, ctx) { if (rf & 1) {
177
+ i0.ɵɵelementStart(0, "div", 31);
178
+ i0.ɵɵelement(1, "i", 59);
140
179
  i0.ɵɵtext(2, " Loading components... ");
141
180
  i0.ɵɵelementEnd();
142
181
  } }
143
- function ComponentStudioDashboardComponent_Conditional_42_Template(rf, ctx) { if (rf & 1) {
144
- i0.ɵɵelementStart(0, "div", 31);
145
- i0.ɵɵelement(1, "i", 55);
182
+ function ComponentStudioDashboardComponent_Conditional_43_Template(rf, ctx) { if (rf & 1) {
183
+ i0.ɵɵelementStart(0, "div", 32);
184
+ i0.ɵɵelement(1, "i", 60);
146
185
  i0.ɵɵtext(2, " No components found without required custom properties. ");
147
186
  i0.ɵɵelement(3, "br");
148
187
  i0.ɵɵelementStart(4, "small");
149
188
  i0.ɵɵtext(5, "Components with optional custom props can be tested, but not those with required props.");
150
189
  i0.ɵɵelementEnd()();
151
190
  } }
152
- function ComponentStudioDashboardComponent_Conditional_43_For_1_Conditional_4_Conditional_1_Template(rf, ctx) { if (rf & 1) {
153
- i0.ɵɵelement(0, "i", 40);
191
+ function ComponentStudioDashboardComponent_Conditional_44_For_1_Conditional_4_Conditional_1_Template(rf, ctx) { if (rf & 1) {
192
+ i0.ɵɵelement(0, "i", 45);
154
193
  } }
155
- function ComponentStudioDashboardComponent_Conditional_43_For_1_Conditional_4_Conditional_2_Template(rf, ctx) { if (rf & 1) {
156
- i0.ɵɵelement(0, "i", 41);
194
+ function ComponentStudioDashboardComponent_Conditional_44_For_1_Conditional_4_Conditional_2_Template(rf, ctx) { if (rf & 1) {
195
+ i0.ɵɵelement(0, "i", 46);
157
196
  } }
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);
197
+ function ComponentStudioDashboardComponent_Conditional_44_For_1_Conditional_4_Template(rf, ctx) { if (rf & 1) {
198
+ const _r13 = i0.ɵɵgetCurrentView();
199
+ i0.ɵɵelementStart(0, "button", 80);
200
+ i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_44_For_1_Conditional_4_Template_button_click_0_listener($event) { i0.ɵɵrestoreView(_r13); const component_r12 = i0.ɵɵnextContext().$implicit; const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.toggleFavorite(component_r12, $event)); });
201
+ i0.ɵɵtemplate(1, ComponentStudioDashboardComponent_Conditional_44_For_1_Conditional_4_Conditional_1_Template, 1, 0, "i", 45)(2, ComponentStudioDashboardComponent_Conditional_44_For_1_Conditional_4_Conditional_2_Template, 1, 0, "i", 46);
163
202
  i0.ɵɵelementEnd();
164
203
  } if (rf & 2) {
165
- const component_r10 = i0.ɵɵnextContext().$implicit;
204
+ const component_r12 = i0.ɵɵnextContext().$implicit;
166
205
  const ctx_r2 = i0.ɵɵnextContext(2);
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");
206
+ i0.ɵɵclassProp("is-favorite", ctx_r2.isFavorite(component_r12));
207
+ i0.ɵɵproperty("title", ctx_r2.isFavorite(component_r12) ? "Remove from favorites" : "Add to favorites");
169
208
  i0.ɵɵadvance();
170
- i0.ɵɵconditional(ctx_r2.isFavorite(component_r10) ? 1 : 2);
209
+ i0.ɵɵconditional(ctx_r2.isFavorite(component_r12) ? 1 : 2);
171
210
  } }
172
- function ComponentStudioDashboardComponent_Conditional_43_For_1_Conditional_8_Conditional_1_Template(rf, ctx) { if (rf & 1) {
173
- i0.ɵɵelement(0, "i", 39);
211
+ function ComponentStudioDashboardComponent_Conditional_44_For_1_Conditional_8_Conditional_1_Template(rf, ctx) { if (rf & 1) {
212
+ i0.ɵɵelement(0, "i", 40);
174
213
  i0.ɵɵtext(1, " Text Import ");
175
214
  } }
176
- function ComponentStudioDashboardComponent_Conditional_43_For_1_Conditional_8_Conditional_2_Template(rf, ctx) { if (rf & 1) {
177
- i0.ɵɵelement(0, "i", 38);
215
+ function ComponentStudioDashboardComponent_Conditional_44_For_1_Conditional_8_Conditional_2_Template(rf, ctx) { if (rf & 1) {
216
+ i0.ɵɵelement(0, "i", 39);
178
217
  i0.ɵɵtext(1);
179
218
  } if (rf & 2) {
180
- const component_r10 = i0.ɵɵnextContext(2).$implicit;
219
+ const component_r12 = i0.ɵɵnextContext(2).$implicit;
181
220
  const ctx_r2 = i0.ɵɵnextContext(2);
182
221
  i0.ɵɵadvance();
183
- i0.ɵɵtextInterpolate1(" ", ctx_r2.getComponentFilename(component_r10), " ");
222
+ i0.ɵɵtextInterpolate1(" ", ctx_r2.getComponentFilename(component_r12), " ");
184
223
  } }
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);
224
+ function ComponentStudioDashboardComponent_Conditional_44_For_1_Conditional_8_Template(rf, ctx) { if (rf & 1) {
225
+ i0.ɵɵelementStart(0, "span", 69);
226
+ i0.ɵɵtemplate(1, ComponentStudioDashboardComponent_Conditional_44_For_1_Conditional_8_Conditional_1_Template, 2, 0)(2, ComponentStudioDashboardComponent_Conditional_44_For_1_Conditional_8_Conditional_2_Template, 2, 1);
188
227
  i0.ɵɵelementEnd();
189
228
  } if (rf & 2) {
190
- const component_r10 = i0.ɵɵnextContext().$implicit;
229
+ const component_r12 = i0.ɵɵnextContext().$implicit;
191
230
  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));
231
+ i0.ɵɵproperty("title", ctx_r2.getComponentStatus(component_r12) === "Text" ? "Imported from text input" : "Loaded from " + ctx_r2.getComponentFilename(component_r12));
193
232
  i0.ɵɵadvance();
194
- i0.ɵɵconditional(ctx_r2.getComponentStatus(component_r10) === "Text" ? 1 : 2);
233
+ i0.ɵɵconditional(ctx_r2.getComponentStatus(component_r12) === "Text" ? 1 : 2);
195
234
  } }
196
- function ComponentStudioDashboardComponent_Conditional_43_For_1_Conditional_14_Conditional_0_Template(rf, ctx) { if (rf & 1) {
197
- i0.ɵɵelementStart(0, "span", 76);
235
+ function ComponentStudioDashboardComponent_Conditional_44_For_1_Conditional_14_Conditional_0_Template(rf, ctx) { if (rf & 1) {
236
+ i0.ɵɵelementStart(0, "span", 81);
198
237
  i0.ɵɵtext(1, "Text");
199
238
  i0.ɵɵelementEnd();
200
239
  } }
201
- function ComponentStudioDashboardComponent_Conditional_43_For_1_Conditional_14_Conditional_1_Template(rf, ctx) { if (rf & 1) {
202
- i0.ɵɵelementStart(0, "span", 77);
240
+ function ComponentStudioDashboardComponent_Conditional_44_For_1_Conditional_14_Conditional_1_Template(rf, ctx) { if (rf & 1) {
241
+ i0.ɵɵelementStart(0, "span", 82);
203
242
  i0.ɵɵtext(1, "File");
204
243
  i0.ɵɵelementEnd();
205
244
  } }
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);
245
+ function ComponentStudioDashboardComponent_Conditional_44_For_1_Conditional_14_Template(rf, ctx) { if (rf & 1) {
246
+ i0.ɵɵtemplate(0, ComponentStudioDashboardComponent_Conditional_44_For_1_Conditional_14_Conditional_0_Template, 2, 0, "span", 81)(1, ComponentStudioDashboardComponent_Conditional_44_For_1_Conditional_14_Conditional_1_Template, 2, 0, "span", 82);
208
247
  } if (rf & 2) {
209
- const component_r10 = i0.ɵɵnextContext().$implicit;
248
+ const component_r12 = i0.ɵɵnextContext().$implicit;
210
249
  const ctx_r2 = i0.ɵɵnextContext(2);
211
- i0.ɵɵconditional(ctx_r2.getComponentStatus(component_r10) === "Text" ? 0 : 1);
250
+ i0.ɵɵconditional(ctx_r2.getComponentStatus(component_r12) === "Text" ? 0 : 1);
212
251
  } }
213
- function ComponentStudioDashboardComponent_Conditional_43_For_1_Conditional_15_Template(rf, ctx) { if (rf & 1) {
214
- i0.ɵɵelementStart(0, "span", 68);
252
+ function ComponentStudioDashboardComponent_Conditional_44_For_1_Conditional_15_Template(rf, ctx) { if (rf & 1) {
253
+ i0.ɵɵelementStart(0, "span", 73);
215
254
  i0.ɵɵtext(1, "Published");
216
255
  i0.ɵɵelementEnd();
217
256
  } }
218
- function ComponentStudioDashboardComponent_Conditional_43_For_1_Conditional_16_Template(rf, ctx) { if (rf & 1) {
219
- i0.ɵɵelementStart(0, "span", 69);
257
+ function ComponentStudioDashboardComponent_Conditional_44_For_1_Conditional_16_Template(rf, ctx) { if (rf & 1) {
258
+ i0.ɵɵelementStart(0, "span", 74);
220
259
  i0.ɵɵtext(1, "Draft");
221
260
  i0.ɵɵelementEnd();
222
261
  } }
223
- function ComponentStudioDashboardComponent_Conditional_43_For_1_Conditional_22_Template(rf, ctx) { if (rf & 1) {
224
- i0.ɵɵelement(0, "i", 49);
262
+ function ComponentStudioDashboardComponent_Conditional_44_For_1_Conditional_22_Template(rf, ctx) { if (rf & 1) {
263
+ i0.ɵɵelement(0, "i", 54);
225
264
  } }
226
- function ComponentStudioDashboardComponent_Conditional_43_For_1_Conditional_23_Template(rf, ctx) { if (rf & 1) {
227
- i0.ɵɵelement(0, "i", 50);
265
+ function ComponentStudioDashboardComponent_Conditional_44_For_1_Conditional_23_Template(rf, ctx) { if (rf & 1) {
266
+ i0.ɵɵelement(0, "i", 55);
228
267
  } }
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");
268
+ function ComponentStudioDashboardComponent_Conditional_44_For_1_Conditional_24_Conditional_1_Template(rf, ctx) { if (rf & 1) {
269
+ i0.ɵɵelementStart(0, "div", 83)(1, "label");
231
270
  i0.ɵɵtext(2, "Description");
232
271
  i0.ɵɵelementEnd();
233
272
  i0.ɵɵelementStart(3, "p");
234
273
  i0.ɵɵtext(4);
235
274
  i0.ɵɵelementEnd()();
236
275
  } if (rf & 2) {
237
- const component_r10 = i0.ɵɵnextContext(2).$implicit;
276
+ const component_r12 = i0.ɵɵnextContext(2).$implicit;
238
277
  const ctx_r2 = i0.ɵɵnextContext(2);
239
278
  i0.ɵɵadvance(4);
240
- i0.ɵɵtextInterpolate(ctx_r2.getComponentDescription(component_r10));
279
+ i0.ɵɵtextInterpolate(ctx_r2.getComponentDescription(component_r12));
241
280
  } }
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);
281
+ function ComponentStudioDashboardComponent_Conditional_44_For_1_Conditional_24_Conditional_21_Template(rf, ctx) { if (rf & 1) {
282
+ i0.ɵɵelementStart(0, "div", 85)(1, "span", 86);
244
283
  i0.ɵɵtext(2, "Loaded:");
245
284
  i0.ɵɵelementEnd();
246
- i0.ɵɵelementStart(3, "span", 82);
285
+ i0.ɵɵelementStart(3, "span", 87);
247
286
  i0.ɵɵtext(4);
248
287
  i0.ɵɵpipe(5, "date");
249
288
  i0.ɵɵelementEnd()();
250
289
  } if (rf & 2) {
251
- const component_r10 = i0.ɵɵnextContext(2).$implicit;
290
+ const component_r12 = i0.ɵɵnextContext(2).$implicit;
252
291
  const ctx_r2 = i0.ɵɵnextContext(2);
253
292
  i0.ɵɵadvance(4);
254
- i0.ɵɵtextInterpolate(i0.ɵɵpipeBind2(5, 1, ctx_r2.getComponentLoadedAt(component_r10), "short"));
293
+ i0.ɵɵtextInterpolate(i0.ɵɵpipeBind2(5, 1, ctx_r2.getComponentLoadedAt(component_r12), "short"));
255
294
  } }
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);
295
+ function ComponentStudioDashboardComponent_Conditional_44_For_1_Conditional_24_Conditional_22_Template(rf, ctx) { if (rf & 1) {
296
+ i0.ɵɵelementStart(0, "div", 85)(1, "span", 86);
258
297
  i0.ɵɵtext(2, "Updated:");
259
298
  i0.ɵɵelementEnd();
260
- i0.ɵɵelementStart(3, "span", 82);
299
+ i0.ɵɵelementStart(3, "span", 87);
261
300
  i0.ɵɵtext(4);
262
301
  i0.ɵɵpipe(5, "date");
263
302
  i0.ɵɵelementEnd()();
264
303
  } if (rf & 2) {
265
- const component_r10 = i0.ɵɵnextContext(2).$implicit;
304
+ const component_r12 = i0.ɵɵnextContext(2).$implicit;
266
305
  const ctx_r2 = i0.ɵɵnextContext(2);
267
306
  i0.ɵɵadvance(4);
268
- i0.ɵɵtextInterpolate(i0.ɵɵpipeBind2(5, 1, ctx_r2.getComponentUpdatedAt(component_r10), "short"));
307
+ i0.ɵɵtextInterpolate(i0.ɵɵpipeBind2(5, 1, ctx_r2.getComponentUpdatedAt(component_r12), "short"));
269
308
  } }
270
- function ComponentStudioDashboardComponent_Conditional_43_For_1_Conditional_24_Conditional_24_Template(rf, ctx) { if (rf & 1) {
271
- const _r12 = i0.ɵɵgetCurrentView();
309
+ function ComponentStudioDashboardComponent_Conditional_44_For_1_Conditional_24_Conditional_24_Template(rf, ctx) { if (rf & 1) {
310
+ const _r14 = i0.ɵɵgetCurrentView();
272
311
  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);
312
+ i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_44_For_1_Conditional_24_Conditional_24_Template_button_click_0_listener($event) { i0.ɵɵrestoreView(_r14); const ctx_r2 = i0.ɵɵnextContext(4); ctx_r2.stopComponent(); return i0.ɵɵresetView($event.stopPropagation()); });
313
+ i0.ɵɵelement(1, "span", 90);
275
314
  i0.ɵɵtext(2, " Stop Component ");
276
315
  i0.ɵɵelementEnd();
277
316
  } if (rf & 2) {
278
317
  i0.ɵɵproperty("themeColor", "error");
279
318
  } }
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);
319
+ function ComponentStudioDashboardComponent_Conditional_44_For_1_Conditional_24_Conditional_25_Template(rf, ctx) { if (rf & 1) {
320
+ const _r15 = i0.ɵɵgetCurrentView();
321
+ i0.ɵɵelementStart(0, "button", 91);
322
+ i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_44_For_1_Conditional_24_Conditional_25_Template_button_click_0_listener($event) { i0.ɵɵrestoreView(_r15); const component_r12 = i0.ɵɵnextContext(2).$implicit; const ctx_r2 = i0.ɵɵnextContext(2); ctx_r2.runComponent(component_r12); return i0.ɵɵresetView($event.stopPropagation()); });
323
+ i0.ɵɵelement(1, "span", 92);
285
324
  i0.ɵɵtext(2, " Switch to This Component ");
286
325
  i0.ɵɵelementEnd();
287
326
  } if (rf & 2) {
288
327
  i0.ɵɵproperty("themeColor", "base");
289
328
  } }
290
- function ComponentStudioDashboardComponent_Conditional_43_For_1_Conditional_24_Conditional_26_Template(rf, ctx) { if (rf & 1) {
291
- const _r14 = i0.ɵɵgetCurrentView();
329
+ function ComponentStudioDashboardComponent_Conditional_44_For_1_Conditional_24_Conditional_26_Template(rf, ctx) { if (rf & 1) {
330
+ const _r16 = i0.ɵɵgetCurrentView();
292
331
  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);
332
+ i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_44_For_1_Conditional_24_Conditional_26_Template_button_click_0_listener($event) { i0.ɵɵrestoreView(_r16); const component_r12 = i0.ɵɵnextContext(2).$implicit; const ctx_r2 = i0.ɵɵnextContext(2); ctx_r2.runComponent(component_r12); return i0.ɵɵresetView($event.stopPropagation()); });
333
+ i0.ɵɵelement(1, "span", 92);
295
334
  i0.ɵɵtext(2, " Run Component ");
296
335
  i0.ɵɵelementEnd();
297
336
  } if (rf & 2) {
298
337
  i0.ɵɵproperty("themeColor", "primary");
299
338
  } }
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");
339
+ function ComponentStudioDashboardComponent_Conditional_44_For_1_Conditional_24_Template(rf, ctx) { if (rf & 1) {
340
+ i0.ɵɵelementStart(0, "div", 79);
341
+ i0.ɵɵtemplate(1, ComponentStudioDashboardComponent_Conditional_44_For_1_Conditional_24_Conditional_1_Template, 5, 1, "div", 83);
342
+ i0.ɵɵelementStart(2, "div", 83)(3, "label");
304
343
  i0.ɵɵtext(4, "Component Info");
305
344
  i0.ɵɵelementEnd();
306
- i0.ɵɵelementStart(5, "div", 79)(6, "div", 80)(7, "span", 81);
345
+ i0.ɵɵelementStart(5, "div", 84)(6, "div", 85)(7, "span", 86);
307
346
  i0.ɵɵtext(8, "Type:");
308
347
  i0.ɵɵelementEnd();
309
- i0.ɵɵelementStart(9, "span", 82);
348
+ i0.ɵɵelementStart(9, "span", 87);
310
349
  i0.ɵɵtext(10);
311
350
  i0.ɵɵelementEnd()();
312
- i0.ɵɵelementStart(11, "div", 80)(12, "span", 81);
351
+ i0.ɵɵelementStart(11, "div", 85)(12, "span", 86);
313
352
  i0.ɵɵtext(13, "Version:");
314
353
  i0.ɵɵelementEnd();
315
- i0.ɵɵelementStart(14, "span", 82);
354
+ i0.ɵɵelementStart(14, "span", 87);
316
355
  i0.ɵɵtext(15);
317
356
  i0.ɵɵelementEnd()();
318
- i0.ɵɵelementStart(16, "div", 80)(17, "span", 81);
357
+ i0.ɵɵelementStart(16, "div", 85)(17, "span", 86);
319
358
  i0.ɵɵtext(18, "Status:");
320
359
  i0.ɵɵelementEnd();
321
- i0.ɵɵelementStart(19, "span", 82);
360
+ i0.ɵɵelementStart(19, "span", 87);
322
361
  i0.ɵɵtext(20);
323
362
  i0.ɵɵelementEnd()();
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);
363
+ i0.ɵɵtemplate(21, ComponentStudioDashboardComponent_Conditional_44_For_1_Conditional_24_Conditional_21_Template, 6, 4, "div", 85)(22, ComponentStudioDashboardComponent_Conditional_44_For_1_Conditional_24_Conditional_22_Template, 6, 4, "div", 85);
325
364
  i0.ɵɵelementEnd()();
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);
365
+ i0.ɵɵelementStart(23, "div", 88);
366
+ i0.ɵɵtemplate(24, ComponentStudioDashboardComponent_Conditional_44_For_1_Conditional_24_Conditional_24_Template, 3, 1, "button", 7)(25, ComponentStudioDashboardComponent_Conditional_44_For_1_Conditional_24_Conditional_25_Template, 3, 1, "button", 89)(26, ComponentStudioDashboardComponent_Conditional_44_For_1_Conditional_24_Conditional_26_Template, 3, 1, "button", 7);
328
367
  i0.ɵɵelementEnd()();
329
368
  } if (rf & 2) {
330
- const component_r10 = i0.ɵɵnextContext().$implicit;
369
+ const component_r12 = i0.ɵɵnextContext().$implicit;
331
370
  const ctx_r2 = i0.ɵɵnextContext(2);
332
371
  i0.ɵɵadvance();
333
- i0.ɵɵconditional(ctx_r2.getComponentDescription(component_r10) ? 1 : -1);
372
+ i0.ɵɵconditional(ctx_r2.getComponentDescription(component_r12) ? 1 : -1);
334
373
  i0.ɵɵadvance(9);
335
- i0.ɵɵtextInterpolate(ctx_r2.getComponentType(component_r10) || "Unknown");
374
+ i0.ɵɵtextInterpolate(ctx_r2.getComponentType(component_r12) || "Unknown");
336
375
  i0.ɵɵadvance(5);
337
- i0.ɵɵtextInterpolate(ctx_r2.getComponentVersion(component_r10));
376
+ i0.ɵɵtextInterpolate(ctx_r2.getComponentVersion(component_r12));
338
377
  i0.ɵɵadvance(5);
339
- i0.ɵɵtextInterpolate(ctx_r2.getComponentStatus(component_r10) || "Draft");
378
+ i0.ɵɵtextInterpolate(ctx_r2.getComponentStatus(component_r12) || "Draft");
340
379
  i0.ɵɵadvance();
341
- i0.ɵɵconditional(ctx_r2.isFileLoadedComponent(component_r10) ? 21 : !ctx_r2.isFileLoadedComponent(component_r10) && ctx_r2.getComponentUpdatedAt(component_r10) ? 22 : -1);
380
+ i0.ɵɵconditional(ctx_r2.isFileLoadedComponent(component_r12) ? 21 : !ctx_r2.isFileLoadedComponent(component_r12) && ctx_r2.getComponentUpdatedAt(component_r12) ? 22 : -1);
342
381
  i0.ɵɵadvance(3);
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);
382
+ i0.ɵɵconditional(ctx_r2.selectedComponent && ctx_r2.getComponentId(ctx_r2.selectedComponent) === ctx_r2.getComponentId(component_r12) && ctx_r2.isRunning ? 24 : ctx_r2.isRunning && ctx_r2.selectedComponent && ctx_r2.getComponentId(ctx_r2.selectedComponent) !== ctx_r2.getComponentId(component_r12) ? 25 : 26);
344
383
  } }
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);
384
+ function ComponentStudioDashboardComponent_Conditional_44_For_1_Template(rf, ctx) { if (rf & 1) {
385
+ const _r11 = i0.ɵɵgetCurrentView();
386
+ i0.ɵɵelementStart(0, "div", 62)(1, "div", 63);
387
+ i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_44_For_1_Template_div_click_1_listener() { const component_r12 = i0.ɵɵrestoreView(_r11).$implicit; const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.toggleComponentExpansion(component_r12)); });
388
+ i0.ɵɵelementStart(2, "div", 64);
389
+ i0.ɵɵelement(3, "i", 65);
351
390
  i0.ɵɵelementEnd();
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);
391
+ i0.ɵɵtemplate(4, ComponentStudioDashboardComponent_Conditional_44_For_1_Conditional_4_Template, 3, 4, "button", 66);
392
+ i0.ɵɵelementStart(5, "div", 67)(6, "div", 68);
354
393
  i0.ɵɵtext(7);
355
- i0.ɵɵtemplate(8, ComponentStudioDashboardComponent_Conditional_43_For_1_Conditional_8_Template, 3, 2, "span", 64);
394
+ i0.ɵɵtemplate(8, ComponentStudioDashboardComponent_Conditional_44_For_1_Conditional_8_Template, 3, 2, "span", 69);
356
395
  i0.ɵɵelementEnd();
357
- i0.ɵɵelementStart(9, "div", 65)(10, "span", 66);
396
+ i0.ɵɵelementStart(9, "div", 70)(10, "span", 71);
358
397
  i0.ɵɵtext(11);
359
398
  i0.ɵɵelementEnd();
360
- i0.ɵɵelementStart(12, "span", 67);
399
+ i0.ɵɵelementStart(12, "span", 72);
361
400
  i0.ɵɵtext(13);
362
401
  i0.ɵɵelementEnd();
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);
402
+ i0.ɵɵtemplate(14, ComponentStudioDashboardComponent_Conditional_44_For_1_Conditional_14_Template, 2, 1)(15, ComponentStudioDashboardComponent_Conditional_44_For_1_Conditional_15_Template, 2, 0, "span", 73)(16, ComponentStudioDashboardComponent_Conditional_44_For_1_Conditional_16_Template, 2, 0, "span", 74);
364
403
  i0.ɵɵelementEnd();
365
- i0.ɵɵelementStart(17, "div", 70)(18, "span", 71);
366
- i0.ɵɵelement(19, "i", 72);
404
+ i0.ɵɵelementStart(17, "div", 75)(18, "span", 76);
405
+ i0.ɵɵelement(19, "i", 77);
367
406
  i0.ɵɵtext(20);
368
407
  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);
408
+ i0.ɵɵelementStart(21, "div", 78);
409
+ i0.ɵɵtemplate(22, ComponentStudioDashboardComponent_Conditional_44_For_1_Conditional_22_Template, 1, 0, "i", 54)(23, ComponentStudioDashboardComponent_Conditional_44_For_1_Conditional_23_Template, 1, 0, "i", 55);
371
410
  i0.ɵɵelementEnd()();
372
- i0.ɵɵtemplate(24, ComponentStudioDashboardComponent_Conditional_43_For_1_Conditional_24_Template, 27, 6, "div", 74);
411
+ i0.ɵɵtemplate(24, ComponentStudioDashboardComponent_Conditional_44_For_1_Conditional_24_Template, 27, 6, "div", 79);
373
412
  i0.ɵɵelementEnd();
374
413
  } if (rf & 2) {
375
- const component_r10 = ctx.$implicit;
414
+ const component_r12 = ctx.$implicit;
376
415
  const ctx_r2 = i0.ɵɵnextContext(2);
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));
416
+ i0.ɵɵclassProp("expanded", ctx_r2.expandedComponent && ctx_r2.getComponentId(ctx_r2.expandedComponent) === ctx_r2.getComponentId(component_r12))("running", ctx_r2.selectedComponent && ctx_r2.getComponentId(ctx_r2.selectedComponent) === ctx_r2.getComponentId(component_r12) && ctx_r2.isRunning)("file-loaded", ctx_r2.isFileLoadedComponent(component_r12));
378
417
  i0.ɵɵadvance(2);
379
- i0.ɵɵstyleProp("color", ctx_r2.getComponentTypeColor(ctx_r2.getComponentType(component_r10)));
418
+ i0.ɵɵstyleProp("color", ctx_r2.getComponentTypeColor(ctx_r2.getComponentType(component_r12)));
380
419
  i0.ɵɵadvance();
381
- i0.ɵɵproperty("ngClass", ctx_r2.getComponentTypeIcon(ctx_r2.getComponentType(component_r10)));
420
+ i0.ɵɵproperty("ngClass", ctx_r2.getComponentTypeIcon(ctx_r2.getComponentType(component_r12)));
382
421
  i0.ɵɵadvance();
383
- i0.ɵɵconditional(!ctx_r2.isFileLoadedComponent(component_r10) ? 4 : -1);
422
+ i0.ɵɵconditional(!ctx_r2.isFileLoadedComponent(component_r12) ? 4 : -1);
384
423
  i0.ɵɵadvance(3);
385
- i0.ɵɵtextInterpolate1(" ", ctx_r2.getComponentName(component_r10), " ");
424
+ i0.ɵɵtextInterpolate1(" ", ctx_r2.getComponentName(component_r12), " ");
386
425
  i0.ɵɵadvance();
387
- i0.ɵɵconditional(ctx_r2.isFileLoadedComponent(component_r10) ? 8 : -1);
426
+ i0.ɵɵconditional(ctx_r2.isFileLoadedComponent(component_r12) ? 8 : -1);
388
427
  i0.ɵɵadvance(3);
389
- i0.ɵɵtextInterpolate(ctx_r2.getComponentType(component_r10) || "Component");
428
+ i0.ɵɵtextInterpolate(ctx_r2.getComponentType(component_r12) || "Component");
390
429
  i0.ɵɵadvance(2);
391
- i0.ɵɵtextInterpolate1("v", ctx_r2.getComponentVersion(component_r10), "");
430
+ i0.ɵɵtextInterpolate1("v", ctx_r2.getComponentVersion(component_r12), "");
392
431
  i0.ɵɵadvance();
393
- i0.ɵɵconditional(ctx_r2.isFileLoadedComponent(component_r10) ? 14 : ctx_r2.getComponentStatus(component_r10) === "Published" ? 15 : 16);
432
+ i0.ɵɵconditional(ctx_r2.isFileLoadedComponent(component_r12) ? 14 : ctx_r2.getComponentStatus(component_r12) === "Published" ? 15 : 16);
394
433
  i0.ɵɵadvance(4);
395
- i0.ɵɵstyleProp("background-color", ctx_r2.getNamespaceColor(ctx_r2.getComponentNamespace(component_r10)));
396
- i0.ɵɵproperty("title", ctx_r2.getComponentNamespace(component_r10) || "Uncategorized");
434
+ i0.ɵɵstyleProp("background-color", ctx_r2.getNamespaceColor(ctx_r2.getComponentNamespace(component_r12)));
435
+ i0.ɵɵproperty("title", ctx_r2.getComponentNamespace(component_r12) || "Uncategorized");
397
436
  i0.ɵɵadvance(2);
398
- i0.ɵɵtextInterpolate1(" ", ctx_r2.formatNamespace(ctx_r2.getComponentNamespace(component_r10)), " ");
437
+ i0.ɵɵtextInterpolate1(" ", ctx_r2.formatNamespace(ctx_r2.getComponentNamespace(component_r12)), " ");
399
438
  i0.ɵɵadvance(2);
400
- i0.ɵɵconditional(ctx_r2.expandedComponent && ctx_r2.getComponentId(ctx_r2.expandedComponent) === ctx_r2.getComponentId(component_r10) ? 22 : 23);
439
+ i0.ɵɵconditional(ctx_r2.expandedComponent && ctx_r2.getComponentId(ctx_r2.expandedComponent) === ctx_r2.getComponentId(component_r12) ? 22 : 23);
401
440
  i0.ɵɵadvance(2);
402
- i0.ɵɵconditional(ctx_r2.expandedComponent && ctx_r2.getComponentId(ctx_r2.expandedComponent) === ctx_r2.getComponentId(component_r10) ? 24 : -1);
441
+ i0.ɵɵconditional(ctx_r2.expandedComponent && ctx_r2.getComponentId(ctx_r2.expandedComponent) === ctx_r2.getComponentId(component_r12) ? 24 : -1);
403
442
  } }
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);
443
+ function ComponentStudioDashboardComponent_Conditional_44_Template(rf, ctx) { if (rf & 1) {
444
+ i0.ɵɵrepeaterCreate(0, ComponentStudioDashboardComponent_Conditional_44_For_1_Template, 25, 21, "div", 61, _forTrack1, true);
406
445
  } if (rf & 2) {
407
446
  const ctx_r2 = i0.ɵɵnextContext();
408
447
  i0.ɵɵrepeater(ctx_r2.filteredComponents);
409
448
  } }
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");
449
+ function ComponentStudioDashboardComponent_Conditional_47_Conditional_3_Conditional_0_Conditional_18_Template(rf, ctx) { if (rf & 1) {
450
+ i0.ɵɵelementStart(0, "details", 108)(1, "summary");
412
451
  i0.ɵɵtext(2, "Technical Details (click to expand)");
413
452
  i0.ɵɵelementEnd();
414
453
  i0.ɵɵelementStart(3, "pre");
@@ -419,21 +458,21 @@ function ComponentStudioDashboardComponent_Conditional_46_Conditional_3_Conditio
419
458
  i0.ɵɵadvance(4);
420
459
  i0.ɵɵtextInterpolate(ctx_r2.formatTechnicalDetails(ctx_r2.currentError.technicalDetails));
421
460
  } }
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);
461
+ function ComponentStudioDashboardComponent_Conditional_47_Conditional_3_Conditional_0_Template(rf, ctx) { if (rf & 1) {
462
+ const _r18 = i0.ɵɵgetCurrentView();
463
+ i0.ɵɵelementStart(0, "div", 99)(1, "div", 101)(2, "div", 102);
464
+ i0.ɵɵelement(3, "i", 103);
426
465
  i0.ɵɵelementStart(4, "h3");
427
466
  i0.ɵɵtext(5, "Component Error");
428
467
  i0.ɵɵelementEnd();
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);
468
+ i0.ɵɵelementStart(6, "button", 104);
469
+ i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_47_Conditional_3_Conditional_0_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r18); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.copyErrorToClipboard()); });
470
+ i0.ɵɵelement(7, "i", 105);
432
471
  i0.ɵɵelementEnd()();
433
- i0.ɵɵelementStart(8, "p", 101);
472
+ i0.ɵɵelementStart(8, "p", 106);
434
473
  i0.ɵɵtext(9, " The component could not be rendered due to the following error: ");
435
474
  i0.ɵɵelementEnd();
436
- i0.ɵɵelementStart(10, "div", 102)(11, "strong");
475
+ i0.ɵɵelementStart(10, "div", 107)(11, "strong");
437
476
  i0.ɵɵtext(12, "Error Type:");
438
477
  i0.ɵɵelementEnd();
439
478
  i0.ɵɵtext(13);
@@ -442,9 +481,9 @@ function ComponentStudioDashboardComponent_Conditional_46_Conditional_3_Conditio
442
481
  i0.ɵɵtext(16, "Message:");
443
482
  i0.ɵɵelementEnd();
444
483
  i0.ɵɵtext(17);
445
- i0.ɵɵtemplate(18, ComponentStudioDashboardComponent_Conditional_46_Conditional_3_Conditional_0_Conditional_18_Template, 5, 1, "details", 103);
484
+ i0.ɵɵtemplate(18, ComponentStudioDashboardComponent_Conditional_47_Conditional_3_Conditional_0_Conditional_18_Template, 5, 1, "details", 108);
446
485
  i0.ɵɵelementEnd();
447
- i0.ɵɵelementStart(19, "div", 104)(20, "strong");
486
+ i0.ɵɵelementStart(19, "div", 109)(20, "strong");
448
487
  i0.ɵɵtext(21, "What to do:");
449
488
  i0.ɵɵelementEnd();
450
489
  i0.ɵɵelementStart(22, "ol")(23, "li");
@@ -459,14 +498,14 @@ function ComponentStudioDashboardComponent_Conditional_46_Conditional_3_Conditio
459
498
  i0.ɵɵelementStart(29, "li");
460
499
  i0.ɵɵtext(30, "Contact your system administrator if the issue persists");
461
500
  i0.ɵɵelementEnd()()();
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);
501
+ i0.ɵɵelementStart(31, "div", 110)(32, "button", 111);
502
+ i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_47_Conditional_3_Conditional_0_Template_button_click_32_listener() { i0.ɵɵrestoreView(_r18); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.retryComponent()); });
503
+ i0.ɵɵelement(33, "span", 112);
465
504
  i0.ɵɵtext(34, " Retry ");
466
505
  i0.ɵɵelementEnd();
467
506
  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);
507
+ i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_47_Conditional_3_Conditional_0_Template_button_click_35_listener() { i0.ɵɵrestoreView(_r18); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.stopComponent()); });
508
+ i0.ɵɵelement(36, "span", 90);
470
509
  i0.ɵɵtext(37, " Stop ");
471
510
  i0.ɵɵelementEnd()()()();
472
511
  } if (rf & 2) {
@@ -480,34 +519,34 @@ function ComponentStudioDashboardComponent_Conditional_46_Conditional_3_Conditio
480
519
  i0.ɵɵadvance(17);
481
520
  i0.ɵɵproperty("themeColor", "error");
482
521
  } }
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)); });
522
+ function ComponentStudioDashboardComponent_Conditional_47_Conditional_3_Conditional_1_Template(rf, ctx) { if (rf & 1) {
523
+ const _r19 = i0.ɵɵgetCurrentView();
524
+ i0.ɵɵelementStart(0, "mj-react-component", 113);
525
+ i0.ɵɵlistener("componentEvent", function ComponentStudioDashboardComponent_Conditional_47_Conditional_3_Conditional_1_Template_mj_react_component_componentEvent_0_listener($event) { i0.ɵɵrestoreView(_r19); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.onComponentEvent($event)); })("openEntityRecord", function ComponentStudioDashboardComponent_Conditional_47_Conditional_3_Conditional_1_Template_mj_react_component_openEntityRecord_0_listener($event) { i0.ɵɵrestoreView(_r19); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.onOpenEntityRecord($event)); });
487
526
  i0.ɵɵelementEnd();
488
527
  } if (rf & 2) {
489
528
  const ctx_r2 = i0.ɵɵnextContext(3);
490
529
  i0.ɵɵproperty("component", ctx_r2.componentSpec);
491
530
  } }
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);
531
+ function ComponentStudioDashboardComponent_Conditional_47_Conditional_3_Template(rf, ctx) { if (rf & 1) {
532
+ i0.ɵɵtemplate(0, ComponentStudioDashboardComponent_Conditional_47_Conditional_3_Conditional_0_Template, 38, 4, "div", 99)(1, ComponentStudioDashboardComponent_Conditional_47_Conditional_3_Conditional_1_Template, 1, 1, "mj-react-component", 100);
494
533
  } if (rf & 2) {
495
534
  const ctx_r2 = i0.ɵɵnextContext(2);
496
535
  i0.ɵɵconditional(ctx_r2.currentError ? 0 : 1);
497
536
  } }
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);
537
+ function ComponentStudioDashboardComponent_Conditional_47_Conditional_4_Template(rf, ctx) { if (rf & 1) {
538
+ const _r20 = i0.ɵɵgetCurrentView();
539
+ i0.ɵɵelementStart(0, "div", 95);
540
+ i0.ɵɵelement(1, "i", 114);
502
541
  i0.ɵɵelementStart(2, "h3");
503
542
  i0.ɵɵtext(3);
504
543
  i0.ɵɵelementEnd();
505
544
  i0.ɵɵelementStart(4, "p");
506
545
  i0.ɵɵtext(5);
507
546
  i0.ɵɵelementEnd();
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);
547
+ i0.ɵɵelementStart(6, "button", 115);
548
+ i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_47_Conditional_4_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r20); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.runComponent(ctx_r2.selectedComponent)); });
549
+ i0.ɵɵelement(7, "span", 92);
511
550
  i0.ɵɵtext(8, " Run Component ");
512
551
  i0.ɵɵelementEnd()();
513
552
  } if (rf & 2) {
@@ -519,43 +558,43 @@ function ComponentStudioDashboardComponent_Conditional_46_Conditional_4_Template
519
558
  i0.ɵɵadvance();
520
559
  i0.ɵɵproperty("themeColor", "primary")("size", "large");
521
560
  } }
522
- function ComponentStudioDashboardComponent_Conditional_46_ng_template_9_Conditional_6_Template(rf, ctx) { if (rf & 1) {
523
- const _r20 = i0.ɵɵgetCurrentView();
561
+ function ComponentStudioDashboardComponent_Conditional_47_ng_template_9_Conditional_6_Template(rf, ctx) { if (rf & 1) {
562
+ const _r22 = i0.ɵɵgetCurrentView();
524
563
  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);
564
+ i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_47_ng_template_9_Conditional_6_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r22); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.applySpecChanges()); });
565
+ i0.ɵɵelement(1, "span", 122);
527
566
  i0.ɵɵtext(2, " Apply Changes ");
528
567
  i0.ɵɵelementEnd();
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);
568
+ i0.ɵɵelementStart(3, "button", 111);
569
+ i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_47_ng_template_9_Conditional_6_Template_button_click_3_listener() { i0.ɵɵrestoreView(_r22); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.initializeEditors()); });
570
+ i0.ɵɵelement(4, "span", 57);
532
571
  i0.ɵɵtext(5, " Cancel ");
533
572
  i0.ɵɵelementEnd();
534
573
  } if (rf & 2) {
535
574
  i0.ɵɵproperty("themeColor", "primary");
536
575
  } }
537
- function ComponentStudioDashboardComponent_Conditional_46_ng_template_9_Conditional_7_Template(rf, ctx) { if (rf & 1) {
538
- const _r21 = i0.ɵɵgetCurrentView();
576
+ function ComponentStudioDashboardComponent_Conditional_47_ng_template_9_Conditional_7_Template(rf, ctx) { if (rf & 1) {
577
+ const _r23 = i0.ɵɵgetCurrentView();
539
578
  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);
579
+ i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_47_ng_template_9_Conditional_7_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r23); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.refreshComponent()); });
580
+ i0.ɵɵelement(1, "span", 15);
542
581
  i0.ɵɵtext(2, " Refresh Component ");
543
582
  i0.ɵɵelementEnd();
544
583
  } if (rf & 2) {
545
584
  i0.ɵɵproperty("themeColor", "info");
546
585
  } }
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);
586
+ function ComponentStudioDashboardComponent_Conditional_47_ng_template_9_Template(rf, ctx) { if (rf & 1) {
587
+ const _r21 = i0.ɵɵgetCurrentView();
588
+ i0.ɵɵelementStart(0, "div", 116)(1, "div", 117)(2, "h4");
589
+ i0.ɵɵelement(3, "i", 118);
551
590
  i0.ɵɵtext(4, " Component Specification (JSON)");
552
591
  i0.ɵɵelementEnd();
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);
592
+ i0.ɵɵelementStart(5, "div", 119);
593
+ i0.ɵɵtemplate(6, ComponentStudioDashboardComponent_Conditional_47_ng_template_9_Conditional_6_Template, 6, 1)(7, ComponentStudioDashboardComponent_Conditional_47_ng_template_9_Conditional_7_Template, 3, 1, "button", 7);
555
594
  i0.ɵɵelementEnd()();
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)); });
595
+ i0.ɵɵelementStart(8, "div", 120)(9, "mj-code-editor", 121);
596
+ i0.ɵɵtwoWayListener("ngModelChange", function ComponentStudioDashboardComponent_Conditional_47_ng_template_9_Template_mj_code_editor_ngModelChange_9_listener($event) { i0.ɵɵrestoreView(_r21); const ctx_r2 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r2.editableSpec, $event) || (ctx_r2.editableSpec = $event); return i0.ɵɵresetView($event); });
597
+ i0.ɵɵlistener("ngModelChange", function ComponentStudioDashboardComponent_Conditional_47_ng_template_9_Template_mj_code_editor_ngModelChange_9_listener($event) { i0.ɵɵrestoreView(_r21); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.onSpecChange($event)); });
559
598
  i0.ɵɵelementEnd()()();
560
599
  } if (rf & 2) {
561
600
  const ctx_r2 = i0.ɵɵnextContext(2);
@@ -567,58 +606,58 @@ function ComponentStudioDashboardComponent_Conditional_46_ng_template_9_Template
567
606
  i0.ɵɵtwoWayProperty("ngModel", ctx_r2.editableSpec);
568
607
  i0.ɵɵproperty("language", "json")("readonly", false);
569
608
  } }
570
- function ComponentStudioDashboardComponent_Conditional_46_ng_template_11_Conditional_6_Template(rf, ctx) { if (rf & 1) {
571
- const _r22 = i0.ɵɵgetCurrentView();
609
+ function ComponentStudioDashboardComponent_Conditional_47_ng_template_11_Conditional_6_Template(rf, ctx) { if (rf & 1) {
610
+ const _r24 = i0.ɵɵgetCurrentView();
572
611
  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);
612
+ i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_47_ng_template_11_Conditional_6_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r24); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.applyCodeChanges()); });
613
+ i0.ɵɵelement(1, "span", 122);
575
614
  i0.ɵɵtext(2, " Apply Changes ");
576
615
  i0.ɵɵelementEnd();
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);
616
+ i0.ɵɵelementStart(3, "button", 111);
617
+ i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_47_ng_template_11_Conditional_6_Template_button_click_3_listener() { i0.ɵɵrestoreView(_r24); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.initializeEditors()); });
618
+ i0.ɵɵelement(4, "span", 57);
580
619
  i0.ɵɵtext(5, " Cancel ");
581
620
  i0.ɵɵelementEnd();
582
621
  } if (rf & 2) {
583
622
  i0.ɵɵproperty("themeColor", "primary");
584
623
  } }
585
- function ComponentStudioDashboardComponent_Conditional_46_ng_template_11_Conditional_7_Template(rf, ctx) { if (rf & 1) {
586
- const _r23 = i0.ɵɵgetCurrentView();
624
+ function ComponentStudioDashboardComponent_Conditional_47_ng_template_11_Conditional_7_Template(rf, ctx) { if (rf & 1) {
625
+ const _r25 = i0.ɵɵgetCurrentView();
587
626
  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);
627
+ i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_47_ng_template_11_Conditional_7_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r25); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.refreshComponent()); });
628
+ i0.ɵɵelement(1, "span", 15);
590
629
  i0.ɵɵtext(2, " Refresh Component ");
591
630
  i0.ɵɵelementEnd();
592
631
  } if (rf & 2) {
593
632
  i0.ɵɵproperty("themeColor", "info");
594
633
  } }
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)); });
634
+ function ComponentStudioDashboardComponent_Conditional_47_ng_template_11_For_11_ng_template_1_Template(rf, ctx) { if (rf & 1) {
635
+ const _r26 = i0.ɵɵgetCurrentView();
636
+ i0.ɵɵelementStart(0, "mj-code-editor", 128);
637
+ i0.ɵɵlistener("ngModelChange", function ComponentStudioDashboardComponent_Conditional_47_ng_template_11_For_11_ng_template_1_Template_mj_code_editor_ngModelChange_0_listener($event) { i0.ɵɵrestoreView(_r26); const ɵ$index_511_r27 = i0.ɵɵnextContext().$index; const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.onCodeSectionChange($event, ɵ$index_511_r27)); });
599
638
  i0.ɵɵelementEnd();
600
639
  } if (rf & 2) {
601
- const section_r26 = i0.ɵɵnextContext().$implicit;
602
- i0.ɵɵproperty("ngModel", section_r26.code)("language", "javascript")("readonly", false);
640
+ const section_r28 = i0.ɵɵnextContext().$implicit;
641
+ i0.ɵɵproperty("ngModel", section_r28.code)("language", "javascript")("readonly", false);
603
642
  } }
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);
643
+ function ComponentStudioDashboardComponent_Conditional_47_ng_template_11_For_11_Template(rf, ctx) { if (rf & 1) {
644
+ i0.ɵɵelementStart(0, "kendo-panelbar-item", 126);
645
+ i0.ɵɵtemplate(1, ComponentStudioDashboardComponent_Conditional_47_ng_template_11_For_11_ng_template_1_Template, 1, 3, "ng-template", 127);
607
646
  i0.ɵɵelementEnd();
608
647
  } if (rf & 2) {
609
- const section_r26 = ctx.$implicit;
610
- i0.ɵɵproperty("title", section_r26.title)("expanded", section_r26.expanded);
648
+ const section_r28 = ctx.$implicit;
649
+ i0.ɵɵproperty("title", section_r28.title)("expanded", section_r28.expanded);
611
650
  } }
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);
651
+ function ComponentStudioDashboardComponent_Conditional_47_ng_template_11_Template(rf, ctx) { if (rf & 1) {
652
+ i0.ɵɵelementStart(0, "div", 123)(1, "div", 117)(2, "h4");
653
+ i0.ɵɵelement(3, "i", 124);
615
654
  i0.ɵɵtext(4, " Component Code (JavaScript/React)");
616
655
  i0.ɵɵelementEnd();
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);
656
+ i0.ɵɵelementStart(5, "div", 119);
657
+ i0.ɵɵtemplate(6, ComponentStudioDashboardComponent_Conditional_47_ng_template_11_Conditional_6_Template, 6, 1)(7, ComponentStudioDashboardComponent_Conditional_47_ng_template_11_Conditional_7_Template, 3, 1, "button", 7);
619
658
  i0.ɵɵelementEnd()();
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);
659
+ i0.ɵɵelementStart(8, "div", 120)(9, "kendo-panelbar", 125);
660
+ i0.ɵɵrepeaterCreate(10, ComponentStudioDashboardComponent_Conditional_47_ng_template_11_For_11_Template, 2, 2, "kendo-panelbar-item", 126, _forTrack2);
622
661
  i0.ɵɵelementEnd()()();
623
662
  } if (rf & 2) {
624
663
  const ctx_r2 = i0.ɵɵnextContext(2);
@@ -629,21 +668,21 @@ function ComponentStudioDashboardComponent_Conditional_46_ng_template_11_Templat
629
668
  i0.ɵɵadvance(3);
630
669
  i0.ɵɵrepeater(ctx_r2.getComponentCodeSections());
631
670
  } }
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);
671
+ function ComponentStudioDashboardComponent_Conditional_47_Conditional_12_Template(rf, ctx) { }
672
+ function ComponentStudioDashboardComponent_Conditional_47_Template(rf, ctx) { if (rf & 1) {
673
+ const _r17 = i0.ɵɵgetCurrentView();
674
+ i0.ɵɵelementStart(0, "kendo-splitter", 17)(1, "kendo-splitter-pane", 93)(2, "div", 94);
675
+ i0.ɵɵtemplate(3, ComponentStudioDashboardComponent_Conditional_47_Conditional_3_Template, 2, 1)(4, ComponentStudioDashboardComponent_Conditional_47_Conditional_4_Template, 9, 4, "div", 95);
637
676
  i0.ɵɵelementEnd()();
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);
677
+ i0.ɵɵelementStart(5, "kendo-splitter-pane", 93)(6, "div")(7, "kendo-tabstrip", 96);
678
+ i0.ɵɵlistener("tabSelect", function ComponentStudioDashboardComponent_Conditional_47_Template_kendo_tabstrip_tabSelect_7_listener($event) { i0.ɵɵrestoreView(_r17); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onTabSelect($event)); });
679
+ i0.ɵɵelementStart(8, "kendo-tabstrip-tab", 97);
680
+ i0.ɵɵtemplate(9, ComponentStudioDashboardComponent_Conditional_47_ng_template_9_Template, 10, 5, "ng-template", 98);
642
681
  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);
682
+ i0.ɵɵelementStart(10, "kendo-tabstrip-tab", 97);
683
+ i0.ɵɵtemplate(11, ComponentStudioDashboardComponent_Conditional_47_ng_template_11_Template, 12, 2, "ng-template", 98);
645
684
  i0.ɵɵelementEnd()()()()();
646
- i0.ɵɵtemplate(12, ComponentStudioDashboardComponent_Conditional_46_Conditional_12_Template, 0, 0);
685
+ i0.ɵɵtemplate(12, ComponentStudioDashboardComponent_Conditional_47_Conditional_12_Template, 0, 0);
647
686
  } if (rf & 2) {
648
687
  const ctx_r2 = i0.ɵɵnextContext();
649
688
  i0.ɵɵadvance();
@@ -659,9 +698,9 @@ function ComponentStudioDashboardComponent_Conditional_46_Template(rf, ctx) { if
659
698
  i0.ɵɵadvance(2);
660
699
  i0.ɵɵconditional(!ctx_r2.isDetailsPaneCollapsed ? 12 : -1);
661
700
  } }
662
- function ComponentStudioDashboardComponent_Conditional_47_Template(rf, ctx) { if (rf & 1) {
663
- i0.ɵɵelementStart(0, "div", 34);
664
- i0.ɵɵelement(1, "i", 124);
701
+ function ComponentStudioDashboardComponent_Conditional_48_Template(rf, ctx) { if (rf & 1) {
702
+ i0.ɵɵelementStart(0, "div", 35);
703
+ i0.ɵɵelement(1, "i", 129);
665
704
  i0.ɵɵelementStart(2, "h2");
666
705
  i0.ɵɵtext(3, "Ready to Test Components");
667
706
  i0.ɵɵelementEnd();
@@ -707,8 +746,9 @@ let ComponentStudioDashboardComponent = class ComponentStudioDashboardComponent
707
746
  lastEditSource = null;
708
747
  // File input element reference
709
748
  fileInput;
710
- // Import dropdown state
749
+ // Dropdown states
711
750
  importDropdownOpen = false;
751
+ exportDropdownOpen = false;
712
752
  // Text import dialog reference
713
753
  textImportDialog;
714
754
  destroy$ = new Subject();
@@ -1059,13 +1099,18 @@ let ComponentStudioDashboardComponent = class ComponentStudioDashboardComponent
1059
1099
  }
1060
1100
  }
1061
1101
  startComponent(component) {
1102
+ // Clear registries BEFORE starting new component for fresh load
1103
+ if (!this.isRunning) {
1104
+ // Only clear if not already running (switching components handles this in stopComponent)
1105
+ MJReactComponent.forceClearRegistries();
1106
+ }
1062
1107
  this.selectedComponent = component;
1063
1108
  this.componentSpec = this.getComponentSpec(component);
1064
1109
  this.isRunning = true;
1065
1110
  this.currentError = null; // Clear any previous errors
1066
1111
  this.isDetailsPaneCollapsed = true; // Start with details collapsed
1067
1112
  this.initializeEditors(); // Initialize spec and code editors
1068
- console.log('Running component:', this.getComponentName(component));
1113
+ console.log('Running component (fresh):', this.getComponentName(component));
1069
1114
  try {
1070
1115
  this.cdr.detectChanges();
1071
1116
  }
@@ -1078,6 +1123,9 @@ let ComponentStudioDashboardComponent = class ComponentStudioDashboardComponent
1078
1123
  this.selectedComponent = null;
1079
1124
  this.componentSpec = null;
1080
1125
  this.currentError = null;
1126
+ // CLEAR ALL REGISTRIES for fresh component loads
1127
+ MJReactComponent.forceClearRegistries();
1128
+ console.log('Component Studio: Cleared all registries for fresh component testing');
1081
1129
  try {
1082
1130
  this.cdr.detectChanges();
1083
1131
  }
@@ -1156,17 +1204,34 @@ ${this.currentError.technicalDetails ? '\nTechnical Details:\n' + JSON.stringify
1156
1204
  // Import handling methods
1157
1205
  toggleImportDropdown() {
1158
1206
  this.importDropdownOpen = !this.importDropdownOpen;
1207
+ // Close export dropdown if open
1208
+ if (this.importDropdownOpen) {
1209
+ this.exportDropdownOpen = false;
1210
+ }
1211
+ }
1212
+ toggleExportDropdown() {
1213
+ this.exportDropdownOpen = !this.exportDropdownOpen;
1214
+ // Close import dropdown if open
1215
+ if (this.exportDropdownOpen) {
1216
+ this.importDropdownOpen = false;
1217
+ }
1159
1218
  }
1160
1219
  closeImportDropdown() {
1161
1220
  this.importDropdownOpen = false;
1162
1221
  }
1163
1222
  onDocumentClick(event) {
1164
- // Close dropdown if clicking outside
1223
+ // Close dropdowns if clicking outside
1165
1224
  const target = event.target;
1166
- const dropdown = target.closest('.import-dropdown');
1167
- if (!dropdown && this.importDropdownOpen) {
1225
+ // Check import dropdown
1226
+ const importDropdown = target.closest('.import-dropdown');
1227
+ if (!importDropdown && this.importDropdownOpen) {
1168
1228
  this.importDropdownOpen = false;
1169
1229
  }
1230
+ // Check export dropdown
1231
+ const exportDropdown = target.closest('.export-dropdown');
1232
+ if (!exportDropdown && this.exportDropdownOpen) {
1233
+ this.exportDropdownOpen = false;
1234
+ }
1170
1235
  }
1171
1236
  importFromFile() {
1172
1237
  this.closeImportDropdown();
@@ -1380,6 +1445,9 @@ ${this.currentError.technicalDetails ? '\nTechnical Details:\n' + JSON.stringify
1380
1445
  this.editableCode = parsed.code || '// No code available';
1381
1446
  // Rebuild code sections from updated spec
1382
1447
  this.buildCodeSections();
1448
+ // Clear registries to ensure fresh component load
1449
+ MJReactComponent.forceClearRegistries();
1450
+ console.log('Cleared registries after applying spec changes');
1383
1451
  // If component is running, update it without full refresh
1384
1452
  if (this.isRunning) {
1385
1453
  this.updateRunningComponent();
@@ -1432,6 +1500,9 @@ ${this.currentError.technicalDetails ? '\nTechnical Details:\n' + JSON.stringify
1432
1500
  }
1433
1501
  // Update the runtime spec
1434
1502
  this.componentSpec = spec;
1503
+ // Clear registries to ensure fresh component load
1504
+ MJReactComponent.forceClearRegistries();
1505
+ console.log('Cleared registries after applying code changes');
1435
1506
  // If component is running, update it without full refresh
1436
1507
  if (this.isRunning) {
1437
1508
  this.updateRunningComponent();
@@ -1537,6 +1608,203 @@ ${this.currentError.technicalDetails ? '\nTechnical Details:\n' + JSON.stringify
1537
1608
  // Both tabs now need initialization since there's no separate Run tab
1538
1609
  this.initializeEditors();
1539
1610
  }
1611
+ /**
1612
+ * Export the current component to an artifact
1613
+ */
1614
+ async exportToArtifact() {
1615
+ console.log('exportToArtifact called');
1616
+ if (!this.selectedComponent || !this.componentSpec) {
1617
+ console.error('No component selected or spec available');
1618
+ return;
1619
+ }
1620
+ console.log('Component and spec available, proceeding...');
1621
+ // Close the dropdown
1622
+ this.exportDropdownOpen = false;
1623
+ // Small delay to ensure dropdown is closed before opening dialog
1624
+ await new Promise(resolve => setTimeout(resolve, 100));
1625
+ // Get the current spec - use edited version if available
1626
+ let currentSpec;
1627
+ // Check if user has made edits
1628
+ if (this.isEditingSpec || this.isEditingCode) {
1629
+ // Parse the edited spec to get the latest version
1630
+ try {
1631
+ currentSpec = JSON.parse(this.editableSpec);
1632
+ }
1633
+ catch (parseError) {
1634
+ console.error('Invalid JSON in spec editor, using original spec');
1635
+ currentSpec = this.componentSpec;
1636
+ }
1637
+ }
1638
+ else {
1639
+ currentSpec = this.componentSpec;
1640
+ }
1641
+ // Open the artifact selection dialog
1642
+ console.log('Opening artifact selection dialog...');
1643
+ let result;
1644
+ try {
1645
+ const dialogRef = this.dialogService.open({
1646
+ content: ArtifactSelectionDialogComponent,
1647
+ width: 1200, // Increased from 1000px by 200px
1648
+ height: 900, // Keep same height
1649
+ appendTo: this.viewContainerRef
1650
+ });
1651
+ console.log('Dialog opened, waiting for result...');
1652
+ result = await dialogRef.result.toPromise();
1653
+ console.log('Dialog result:', result);
1654
+ }
1655
+ catch (error) {
1656
+ console.error('Error opening dialog:', error);
1657
+ return;
1658
+ }
1659
+ if (!result || !result.action) {
1660
+ console.log('User cancelled dialog');
1661
+ // User cancelled
1662
+ return;
1663
+ }
1664
+ try {
1665
+ const artifact = result.artifact;
1666
+ let version;
1667
+ let lastVersion;
1668
+ if (result.action === 'update-version' && result.versionToUpdate) {
1669
+ // Load and update existing version
1670
+ lastVersion = result.versionToUpdate; // set to the same version as we'll grab its Configuration to parse lower down in the code
1671
+ version = result.versionToUpdate;
1672
+ }
1673
+ else {
1674
+ // Create new version
1675
+ version = await this.metadata.GetEntityObject('MJ: Conversation Artifact Versions');
1676
+ version.ConversationArtifactID = artifact.ID;
1677
+ // Get next version number
1678
+ const rv = new RunView();
1679
+ const versionsResult = await rv.RunView({
1680
+ EntityName: 'MJ: Conversation Artifact Versions',
1681
+ ExtraFilter: `ConversationArtifactID = '${artifact.ID}'`,
1682
+ OrderBy: 'Version DESC',
1683
+ MaxRows: 1,
1684
+ ResultType: 'entity_object'
1685
+ });
1686
+ if (versionsResult.Success && versionsResult.Results && versionsResult.Results.length > 0) {
1687
+ lastVersion = versionsResult.Results[0];
1688
+ version.Version = versionsResult.Results[0].Version + 1;
1689
+ }
1690
+ else {
1691
+ throw new Error('No previous version found');
1692
+ }
1693
+ }
1694
+ // Store the complete spec in Configuration field
1695
+ const fullResponse = JSON.parse(lastVersion.Configuration);
1696
+ fullResponse.componentOptions = [
1697
+ {
1698
+ AIRank: 1,
1699
+ AIRankExplanation: "",
1700
+ UserRankExplanation: "",
1701
+ name: currentSpec.name,
1702
+ option: currentSpec,
1703
+ UserRank: 1
1704
+ }
1705
+ ];
1706
+ version.Configuration = JSON.stringify(fullResponse, null, 2);
1707
+ // Add version comments
1708
+ const timestamp = new Date().toISOString();
1709
+ const actionText = result.action === 'update-version' ? 'Updated' : 'Created';
1710
+ version.Comments = `${actionText} from Component Studio at ${timestamp}`;
1711
+ const versionSaveResult = await version.Save();
1712
+ if (versionSaveResult) {
1713
+ const componentName = this.getComponentName(this.selectedComponent);
1714
+ console.log(`✅ Saved ${componentName} as artifact version ${version.Version}`);
1715
+ MJNotificationService.Instance.CreateSimpleNotification(`${componentName} has been saved as artifact version ${version.Version}.`, 'success', 3500);
1716
+ }
1717
+ else {
1718
+ console.error('Failed to save artifact version:', version.LatestResult?.Message);
1719
+ MJNotificationService.Instance.CreateSimpleNotification('Failed to save artifact version. Check console for details.', 'error', 5000);
1720
+ }
1721
+ }
1722
+ catch (error) {
1723
+ console.error('Error saving to artifact:', error);
1724
+ MJNotificationService.Instance.CreateSimpleNotification('Error saving component to artifact. Check console for details.', 'error', 5000);
1725
+ }
1726
+ }
1727
+ /**
1728
+ * Export the current component to a file
1729
+ */
1730
+ exportToFile() {
1731
+ if (!this.selectedComponent || !this.componentSpec) {
1732
+ console.error('No component selected or spec available');
1733
+ return;
1734
+ }
1735
+ // Close the dropdown
1736
+ this.exportDropdownOpen = false;
1737
+ // Get the current spec - use edited version if available
1738
+ let currentSpec;
1739
+ if (this.isEditingSpec || this.isEditingCode) {
1740
+ try {
1741
+ currentSpec = JSON.parse(this.editableSpec);
1742
+ }
1743
+ catch (parseError) {
1744
+ console.error('Invalid JSON in spec editor, using original spec');
1745
+ currentSpec = this.componentSpec;
1746
+ }
1747
+ }
1748
+ else {
1749
+ currentSpec = this.componentSpec;
1750
+ }
1751
+ // Create filename from component name - replace spaces and special chars with dashes
1752
+ const componentName = this.getComponentName(this.selectedComponent);
1753
+ const filename = componentName.replace(/\s+/g, '-').replace(/[^a-z0-9\-]/gi, '-').toLowerCase() + '.json';
1754
+ // Create a blob with the JSON content
1755
+ const jsonContent = JSON.stringify(currentSpec, null, 2);
1756
+ const blob = new Blob([jsonContent], { type: 'application/json' });
1757
+ // Create download link
1758
+ const url = URL.createObjectURL(blob);
1759
+ const link = document.createElement('a');
1760
+ link.href = url;
1761
+ link.download = filename;
1762
+ // Trigger download
1763
+ document.body.appendChild(link);
1764
+ link.click();
1765
+ // Cleanup
1766
+ document.body.removeChild(link);
1767
+ URL.revokeObjectURL(url);
1768
+ console.log(`✅ Exported ${componentName} to ${filename}`);
1769
+ }
1770
+ /**
1771
+ * Export the current component to clipboard
1772
+ */
1773
+ async exportToClipboard() {
1774
+ if (!this.selectedComponent || !this.componentSpec) {
1775
+ console.error('No component selected or spec available');
1776
+ return;
1777
+ }
1778
+ // Close the dropdown
1779
+ this.exportDropdownOpen = false;
1780
+ // Get the current spec - use edited version if available
1781
+ let currentSpec;
1782
+ if (this.isEditingSpec || this.isEditingCode) {
1783
+ try {
1784
+ currentSpec = JSON.parse(this.editableSpec);
1785
+ }
1786
+ catch (parseError) {
1787
+ console.error('Invalid JSON in spec editor, using original spec');
1788
+ currentSpec = this.componentSpec;
1789
+ }
1790
+ }
1791
+ else {
1792
+ currentSpec = this.componentSpec;
1793
+ }
1794
+ // Copy to clipboard
1795
+ const jsonContent = JSON.stringify(currentSpec, null, 2);
1796
+ try {
1797
+ await navigator.clipboard.writeText(jsonContent);
1798
+ const componentName = this.getComponentName(this.selectedComponent);
1799
+ console.log(`✅ Copied ${componentName} spec to clipboard`);
1800
+ // Show success message (you could add a toast/notification here)
1801
+ alert('Component specification copied to clipboard!');
1802
+ }
1803
+ catch (error) {
1804
+ console.error('Failed to copy to clipboard:', error);
1805
+ alert('Failed to copy to clipboard. Please try again.');
1806
+ }
1807
+ }
1540
1808
  static ɵfac = function ComponentStudioDashboardComponent_Factory(t) { return new (t || ComponentStudioDashboardComponent)(i0.ɵɵdirectiveInject(i0.ChangeDetectorRef), i0.ɵɵdirectiveInject(i1.DialogService), i0.ɵɵdirectiveInject(i0.ViewContainerRef)); };
1541
1809
  static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ComponentStudioDashboardComponent, selectors: [["mj-component-studio-dashboard"]], viewQuery: function ComponentStudioDashboardComponent_Query(rf, ctx) { if (rf & 1) {
1542
1810
  i0.ɵɵviewQuery(_c0, 5);
@@ -1545,7 +1813,7 @@ ${this.currentError.technicalDetails ? '\nTechnical Details:\n' + JSON.stringify
1545
1813
  i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.fileInput = _t.first);
1546
1814
  } }, hostBindings: function ComponentStudioDashboardComponent_HostBindings(rf, ctx) { if (rf & 1) {
1547
1815
  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) {
1816
+ } }, features: [i0.ɵɵInheritDefinitionFeature], decls: 49, vars: 21, 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"], [1, "export-dropdown", 3, "open"], ["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, "export-dropdown"], [1, "fa-solid", "fa-file-export"], [1, "fa-solid", "fa-save"], [1, "fa-solid", "fa-clipboard"], [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) {
1549
1817
  const _r1 = i0.ɵɵgetCurrentView();
1550
1818
  i0.ɵɵelementStart(0, "div", 1)(1, "div", 2)(2, "div", 3)(3, "div")(4, "h1");
1551
1819
  i0.ɵɵelement(5, "i", 4);
@@ -1564,36 +1832,37 @@ ${this.currentError.technicalDetails ? '\nTechnical Details:\n' + JSON.stringify
1564
1832
  i0.ɵɵelementEnd();
1565
1833
  i0.ɵɵtemplate(16, ComponentStudioDashboardComponent_Conditional_16_Template, 7, 0, "div", 12);
1566
1834
  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 ");
1835
+ i0.ɵɵtemplate(17, ComponentStudioDashboardComponent_Conditional_17_Template, 6, 4, "div", 13);
1836
+ i0.ɵɵelementStart(18, "button", 14);
1837
+ i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Template_button_click_18_listener() { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.refreshData()); });
1838
+ i0.ɵɵelement(19, "span", 15);
1839
+ i0.ɵɵtext(20, " Refresh ");
1571
1840
  i0.ɵɵelementEnd()();
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)); });
1841
+ i0.ɵɵelementStart(21, "input", 16, 0);
1842
+ i0.ɵɵlistener("change", function ComponentStudioDashboardComponent_Template_input_change_21_listener($event) { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.handleFileSelect($event)); });
1574
1843
  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");
1844
+ i0.ɵɵelementStart(23, "kendo-splitter", 17)(24, "kendo-splitter-pane", 18)(25, "div", 19)(26, "div", 20)(27, "div", 21)(28, "h3");
1845
+ i0.ɵɵtext(29, "Components");
1577
1846
  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);
1847
+ i0.ɵɵelementStart(30, "div", 22)(31, "button", 23);
1848
+ i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Template_button_click_31_listener() { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.toggleShowOnlyFavorites()); });
1849
+ i0.ɵɵtemplate(32, ComponentStudioDashboardComponent_Conditional_32_Template, 2, 0)(33, ComponentStudioDashboardComponent_Conditional_33_Template, 2, 0);
1581
1850
  i0.ɵɵelementEnd();
1582
- i0.ɵɵelementStart(33, "span", 23);
1583
- i0.ɵɵtext(34);
1851
+ i0.ɵɵelementStart(34, "span", 24);
1852
+ i0.ɵɵtext(35);
1584
1853
  i0.ɵɵelementEnd()()();
1585
- i0.ɵɵelementStart(35, "div", 24);
1586
- i0.ɵɵtemplate(36, ComponentStudioDashboardComponent_Conditional_36_Template, 5, 2, "div", 25);
1854
+ i0.ɵɵelementStart(36, "div", 25);
1855
+ i0.ɵɵtemplate(37, ComponentStudioDashboardComponent_Conditional_37_Template, 5, 2, "div", 26);
1587
1856
  i0.ɵɵelementEnd();
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);
1857
+ i0.ɵɵelementStart(38, "div", 27)(39, "kendo-textbox", 28);
1858
+ i0.ɵɵlistener("valueChange", function ComponentStudioDashboardComponent_Template_kendo_textbox_valueChange_39_listener($event) { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.onSearchChange($event)); });
1859
+ i0.ɵɵtemplate(40, ComponentStudioDashboardComponent_ng_template_40_Template, 1, 0, "ng-template", 29);
1591
1860
  i0.ɵɵelementEnd()()();
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);
1861
+ i0.ɵɵelementStart(41, "div", 30);
1862
+ i0.ɵɵtemplate(42, ComponentStudioDashboardComponent_Conditional_42_Template, 3, 0, "div", 31)(43, ComponentStudioDashboardComponent_Conditional_43_Template, 6, 0, "div", 32)(44, ComponentStudioDashboardComponent_Conditional_44_Template, 2, 0);
1594
1863
  i0.ɵɵelementEnd()()();
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);
1864
+ i0.ɵɵelementStart(45, "kendo-splitter-pane", 33)(46, "div", 34);
1865
+ i0.ɵɵtemplate(47, ComponentStudioDashboardComponent_Conditional_47_Template, 13, 8)(48, ComponentStudioDashboardComponent_Conditional_48_Template, 6, 0, "div", 35);
1597
1866
  i0.ɵɵelementEnd()()()();
1598
1867
  } if (rf & 2) {
1599
1868
  i0.ɵɵadvance(10);
@@ -1605,26 +1874,28 @@ ${this.currentError.technicalDetails ? '\nTechnical Details:\n' + JSON.stringify
1605
1874
  i0.ɵɵadvance(4);
1606
1875
  i0.ɵɵconditional(ctx.importDropdownOpen ? 16 : -1);
1607
1876
  i0.ɵɵadvance();
1877
+ i0.ɵɵconditional(ctx.selectedComponent && ctx.isRunning ? 17 : -1);
1878
+ i0.ɵɵadvance();
1608
1879
  i0.ɵɵproperty("disabled", ctx.isLoading);
1609
1880
  i0.ɵɵadvance(6);
1610
1881
  i0.ɵɵproperty("min", "350px")("max", "650px")("size", "400px");
1611
1882
  i0.ɵɵadvance(7);
1612
1883
  i0.ɵɵclassProp("active", ctx.showOnlyFavorites);
1613
1884
  i0.ɵɵadvance();
1614
- i0.ɵɵconditional(ctx.showOnlyFavorites ? 31 : 32);
1885
+ i0.ɵɵconditional(ctx.showOnlyFavorites ? 32 : 33);
1615
1886
  i0.ɵɵadvance(3);
1616
1887
  i0.ɵɵtextInterpolate2("", ctx.filteredComponents.length, " of ", ctx.allComponents.length, "");
1617
1888
  i0.ɵɵadvance(2);
1618
- i0.ɵɵconditional(ctx.availableCategories.length > 0 ? 36 : -1);
1889
+ i0.ɵɵconditional(ctx.availableCategories.length > 0 ? 37 : -1);
1619
1890
  i0.ɵɵadvance(2);
1620
1891
  i0.ɵɵproperty("value", ctx.searchQuery)("clearButton", true);
1621
1892
  i0.ɵɵadvance(3);
1622
- i0.ɵɵconditional(ctx.isLoading ? 41 : ctx.filteredComponents.length === 0 ? 42 : 43);
1893
+ i0.ɵɵconditional(ctx.isLoading ? 42 : ctx.filteredComponents.length === 0 ? 43 : 44);
1623
1894
  i0.ɵɵadvance(3);
1624
1895
  i0.ɵɵproperty("min", "400px");
1625
1896
  i0.ɵɵadvance(2);
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}"] });
1897
+ i0.ɵɵconditional(ctx.selectedComponent ? 47 : 48);
1898
+ } }, 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, .export-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}"] });
1628
1899
  };
1629
1900
  ComponentStudioDashboardComponent = __decorate([
1630
1901
  RegisterClass(BaseDashboard, 'ComponentStudioDashboard')
@@ -1632,7 +1903,7 @@ ComponentStudioDashboardComponent = __decorate([
1632
1903
  export { ComponentStudioDashboardComponent };
1633
1904
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ComponentStudioDashboardComponent, [{
1634
1905
  type: Component,
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}"] }]
1906
+ 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 @if (selectedComponent && isRunning) {\n <div class=\"export-dropdown\" [class.open]=\"exportDropdownOpen\">\n <button kendoButton (click)=\"toggleExportDropdown()\" [themeColor]=\"'primary'\">\n <span class=\"fa-solid fa-file-export\"></span> Export\n <span class=\"fa-solid fa-chevron-down\" style=\"margin-left: 5px; font-size: 10px;\"></span>\n </button>\n @if (exportDropdownOpen) {\n <div class=\"dropdown-menu\">\n <button class=\"dropdown-item\" (click)=\"exportToArtifact()\">\n <i class=\"fa-solid fa-save\"></i> Export to Artifact\n </button>\n <button class=\"dropdown-item\" (click)=\"exportToFile()\">\n <i class=\"fa-solid fa-file\"></i> Export to File\n </button>\n <button class=\"dropdown-item\" (click)=\"exportToClipboard()\">\n <i class=\"fa-solid fa-clipboard\"></i> Export to Clipboard\n </button>\n </div>\n }\n </div>\n }\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, .export-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
1907
  }], () => [{ type: i0.ChangeDetectorRef }, { type: i1.DialogService }, { type: i0.ViewContainerRef }], { fileInput: [{
1637
1908
  type: ViewChild,
1638
1909
  args: ['fileInput', { static: false }]
@@ -1640,7 +1911,7 @@ export { ComponentStudioDashboardComponent };
1640
1911
  type: HostListener,
1641
1912
  args: ['document:click', ['$event']]
1642
1913
  }] }); })();
1643
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ComponentStudioDashboardComponent, { className: "ComponentStudioDashboardComponent", filePath: "src/ComponentStudio/component-studio-dashboard.component.ts", lineNumber: 45 }); })();
1914
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ComponentStudioDashboardComponent, { className: "ComponentStudioDashboardComponent", filePath: "src/ComponentStudio/component-studio-dashboard.component.ts", lineNumber: 52 }); })();
1644
1915
  /**
1645
1916
  * Function to prevent tree shaking of the ComponentStudioDashboardComponent.
1646
1917
  */