@memberjunction/ng-dashboards 2.107.0 → 2.109.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.
@@ -14,16 +14,17 @@ import { SharedService } from '@memberjunction/ng-shared';
14
14
  import { ParseJSONRecursive } from '@memberjunction/global';
15
15
  import { TextImportDialogComponent } from './components/text-import-dialog.component';
16
16
  import { ArtifactSelectionDialogComponent } from './components/artifact-selection-dialog.component';
17
- import { MJNotificationService } from '@memberjunction/ng-notifications';
17
+ import { ArtifactLoadDialogComponent } from './components/artifact-load-dialog.component';
18
18
  import * as i0 from "@angular/core";
19
19
  import * as i1 from "@progress/kendo-angular-dialog";
20
- import * as i2 from "@angular/common";
21
- import * as i3 from "@angular/forms";
22
- import * as i4 from "@progress/kendo-angular-inputs";
23
- import * as i5 from "@progress/kendo-angular-layout";
24
- import * as i6 from "@memberjunction/ng-code-editor";
25
- import * as i7 from "@progress/kendo-angular-buttons";
26
- import * as i8 from "@memberjunction/ng-react";
20
+ import * as i2 from "@memberjunction/ng-notifications";
21
+ import * as i3 from "@angular/common";
22
+ import * as i4 from "@angular/forms";
23
+ import * as i5 from "@progress/kendo-angular-inputs";
24
+ import * as i6 from "@progress/kendo-angular-layout";
25
+ import * as i7 from "@memberjunction/ng-code-editor";
26
+ import * as i8 from "@progress/kendo-angular-buttons";
27
+ import * as i9 from "@memberjunction/ng-react";
27
28
  const _c0 = ["fileInput"];
28
29
  const _forTrack0 = ($index, $item) => $item.name;
29
30
  function _forTrack1($index, $item) { return this.getComponentId($item); }
@@ -51,39 +52,44 @@ function ComponentStudioDashboardComponent_Conditional_10_Template(rf, ctx) { if
51
52
  function ComponentStudioDashboardComponent_Conditional_16_Template(rf, ctx) { if (rf & 1) {
52
53
  const _r4 = i0.ɵɵgetCurrentView();
53
54
  i0.ɵɵelementStart(0, "div", 12)(1, "button", 39);
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()); });
55
+ 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.importFromArtifact()); });
55
56
  i0.ɵɵelement(2, "i", 40);
56
- i0.ɵɵtext(3, " Import from File ");
57
+ i0.ɵɵtext(3, " Import from Artifact ");
57
58
  i0.ɵɵelementEnd();
58
59
  i0.ɵɵelementStart(4, "button", 39);
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()); });
60
+ 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.importFromFile()); });
60
61
  i0.ɵɵelement(5, "i", 41);
61
- i0.ɵɵtext(6, " Import from Text ");
62
+ i0.ɵɵtext(6, " Import from File ");
63
+ i0.ɵɵelementEnd();
64
+ i0.ɵɵelementStart(7, "button", 39);
65
+ i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_16_Template_button_click_7_listener() { i0.ɵɵrestoreView(_r4); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.importFromText()); });
66
+ i0.ɵɵelement(8, "i", 42);
67
+ i0.ɵɵtext(9, " Import from Text ");
62
68
  i0.ɵɵelementEnd()();
63
69
  } }
64
70
  function ComponentStudioDashboardComponent_Conditional_17_Conditional_5_Template(rf, ctx) { if (rf & 1) {
65
71
  const _r6 = i0.ɵɵgetCurrentView();
66
72
  i0.ɵɵelementStart(0, "div", 12)(1, "button", 39);
67
73
  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", 44);
74
+ i0.ɵɵelement(2, "i", 45);
69
75
  i0.ɵɵtext(3, " Export to Artifact ");
70
76
  i0.ɵɵelementEnd();
71
77
  i0.ɵɵelementStart(4, "button", 39);
72
78
  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", 40);
79
+ i0.ɵɵelement(5, "i", 41);
74
80
  i0.ɵɵtext(6, " Export to File ");
75
81
  i0.ɵɵelementEnd();
76
82
  i0.ɵɵelementStart(7, "button", 39);
77
83
  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", 45);
84
+ i0.ɵɵelement(8, "i", 46);
79
85
  i0.ɵɵtext(9, " Export to Clipboard ");
80
86
  i0.ɵɵelementEnd()();
81
87
  } }
82
88
  function ComponentStudioDashboardComponent_Conditional_17_Template(rf, ctx) { if (rf & 1) {
83
89
  const _r5 = i0.ɵɵgetCurrentView();
84
- i0.ɵɵelementStart(0, "div", 42)(1, "button", 9);
90
+ i0.ɵɵelementStart(0, "div", 43)(1, "button", 9);
85
91
  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", 43);
92
+ i0.ɵɵelement(2, "span", 44);
87
93
  i0.ɵɵtext(3, " Export ");
88
94
  i0.ɵɵelement(4, "span", 11);
89
95
  i0.ɵɵelementEnd();
@@ -97,370 +103,418 @@ function ComponentStudioDashboardComponent_Conditional_17_Template(rf, ctx) { if
97
103
  i0.ɵɵadvance(4);
98
104
  i0.ɵɵconditional(ctx_r2.exportDropdownOpen ? 5 : -1);
99
105
  } }
100
- function ComponentStudioDashboardComponent_Conditional_32_Template(rf, ctx) { if (rf & 1) {
101
- i0.ɵɵelement(0, "i", 46);
102
- i0.ɵɵtext(1, " Favorites ");
106
+ function ComponentStudioDashboardComponent_Conditional_31_Template(rf, ctx) { if (rf & 1) {
107
+ i0.ɵɵelementStart(0, "span", 25);
108
+ i0.ɵɵtext(1);
109
+ i0.ɵɵelementEnd();
110
+ } if (rf & 2) {
111
+ const ctx_r2 = i0.ɵɵnextContext();
112
+ i0.ɵɵadvance();
113
+ i0.ɵɵtextInterpolate(ctx_r2.GetActiveFilterCount());
103
114
  } }
104
- function ComponentStudioDashboardComponent_Conditional_33_Template(rf, ctx) { if (rf & 1) {
115
+ function ComponentStudioDashboardComponent_ng_template_36_Template(rf, ctx) { if (rf & 1) {
105
116
  i0.ɵɵelement(0, "i", 47);
106
- i0.ɵɵtext(1, " All ");
107
- } }
108
- function ComponentStudioDashboardComponent_Conditional_35_Template(rf, ctx) { if (rf & 1) {
109
- i0.ɵɵelement(0, "i", 48);
110
- i0.ɵɵtext(1, " Show Deprecated ");
111
117
  } }
112
- function ComponentStudioDashboardComponent_Conditional_36_Template(rf, ctx) { if (rf & 1) {
113
- i0.ɵɵelement(0, "i", 49);
114
- i0.ɵɵtext(1, " Hide Deprecated ");
118
+ function ComponentStudioDashboardComponent_Conditional_37_Conditional_20_Template(rf, ctx) { if (rf & 1) {
119
+ i0.ɵɵelementStart(0, "span", 57);
120
+ i0.ɵɵtext(1);
121
+ i0.ɵɵelementEnd();
122
+ } if (rf & 2) {
123
+ const ctx_r2 = i0.ɵɵnextContext(2);
124
+ i0.ɵɵadvance();
125
+ i0.ɵɵtextInterpolate1("(", ctx_r2.getDeprecatedCount(), " hidden)");
115
126
  } }
116
- function ComponentStudioDashboardComponent_Conditional_40_For_2_Template(rf, ctx) { if (rf & 1) {
117
- const _r7 = i0.ɵɵgetCurrentView();
118
- i0.ɵɵelementStart(0, "button", 53);
119
- i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_40_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)); });
120
- i0.ɵɵelementStart(1, "span", 54);
127
+ function ComponentStudioDashboardComponent_Conditional_37_Conditional_21_For_5_Template(rf, ctx) { if (rf & 1) {
128
+ const _r8 = i0.ɵɵgetCurrentView();
129
+ i0.ɵɵelementStart(0, "button", 62);
130
+ i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_37_Conditional_21_For_5_Template_button_click_0_listener() { const category_r9 = i0.ɵɵrestoreView(_r8).$implicit; const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.toggleCategory(category_r9.name)); });
131
+ i0.ɵɵelementStart(1, "span", 63);
121
132
  i0.ɵɵtext(2);
122
133
  i0.ɵɵelementEnd();
123
- i0.ɵɵelementStart(3, "span", 55);
134
+ i0.ɵɵelementStart(3, "span", 64);
124
135
  i0.ɵɵtext(4);
125
136
  i0.ɵɵelementEnd()();
126
137
  } if (rf & 2) {
127
- const category_r8 = ctx.$implicit;
128
- const ctx_r2 = i0.ɵɵnextContext(2);
129
- i0.ɵɵstyleProp("--pill-color", category_r8.color);
130
- i0.ɵɵclassProp("active", ctx_r2.isCategorySelected(category_r8.name));
138
+ const category_r9 = ctx.$implicit;
139
+ const ctx_r2 = i0.ɵɵnextContext(3);
140
+ i0.ɵɵstyleProp("--pill-color", category_r9.color);
141
+ i0.ɵɵclassProp("active", ctx_r2.isCategorySelected(category_r9.name));
131
142
  i0.ɵɵadvance(2);
132
- i0.ɵɵtextInterpolate(category_r8.name);
143
+ i0.ɵɵtextInterpolate(category_r9.name);
133
144
  i0.ɵɵadvance(2);
134
- i0.ɵɵtextInterpolate(category_r8.count);
145
+ i0.ɵɵtextInterpolate(category_r9.count);
135
146
  } }
136
- function ComponentStudioDashboardComponent_Conditional_40_Conditional_3_Conditional_1_Template(rf, ctx) { if (rf & 1) {
137
- i0.ɵɵelement(0, "i", 57);
138
- i0.ɵɵtext(1, " Less ");
147
+ function ComponentStudioDashboardComponent_Conditional_37_Conditional_21_Conditional_6_Conditional_1_Template(rf, ctx) { if (rf & 1) {
148
+ i0.ɵɵelement(0, "i", 66);
149
+ i0.ɵɵtext(1, " Show less ");
139
150
  } }
140
- function ComponentStudioDashboardComponent_Conditional_40_Conditional_3_Conditional_2_Template(rf, ctx) { if (rf & 1) {
141
- i0.ɵɵelement(0, "i", 58);
151
+ function ComponentStudioDashboardComponent_Conditional_37_Conditional_21_Conditional_6_Conditional_2_Template(rf, ctx) { if (rf & 1) {
152
+ i0.ɵɵelement(0, "i", 49);
142
153
  i0.ɵɵtext(1);
143
154
  } if (rf & 2) {
144
- const ctx_r2 = i0.ɵɵnextContext(3);
155
+ const ctx_r2 = i0.ɵɵnextContext(4);
145
156
  i0.ɵɵadvance();
146
- i0.ɵɵtextInterpolate1(" +", ctx_r2.availableCategories.length - 5, " more ");
157
+ i0.ɵɵtextInterpolate1(" Show ", ctx_r2.availableCategories.length - 5, " more ");
147
158
  } }
148
- function ComponentStudioDashboardComponent_Conditional_40_Conditional_3_Template(rf, ctx) { if (rf & 1) {
149
- const _r9 = i0.ɵɵgetCurrentView();
150
- i0.ɵɵelementStart(0, "button", 56);
151
- i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_40_Conditional_3_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r9); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.toggleShowAllCategories()); });
152
- i0.ɵɵtemplate(1, ComponentStudioDashboardComponent_Conditional_40_Conditional_3_Conditional_1_Template, 2, 0)(2, ComponentStudioDashboardComponent_Conditional_40_Conditional_3_Conditional_2_Template, 2, 1);
159
+ function ComponentStudioDashboardComponent_Conditional_37_Conditional_21_Conditional_6_Template(rf, ctx) { if (rf & 1) {
160
+ const _r10 = i0.ɵɵgetCurrentView();
161
+ i0.ɵɵelementStart(0, "button", 65);
162
+ i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_37_Conditional_21_Conditional_6_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r10); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.toggleShowAllCategories()); });
163
+ i0.ɵɵtemplate(1, ComponentStudioDashboardComponent_Conditional_37_Conditional_21_Conditional_6_Conditional_1_Template, 2, 0)(2, ComponentStudioDashboardComponent_Conditional_37_Conditional_21_Conditional_6_Conditional_2_Template, 2, 1);
153
164
  i0.ɵɵelementEnd();
154
165
  } if (rf & 2) {
155
- const ctx_r2 = i0.ɵɵnextContext(2);
166
+ const ctx_r2 = i0.ɵɵnextContext(3);
156
167
  i0.ɵɵadvance();
157
168
  i0.ɵɵconditional(ctx_r2.showAllCategories ? 1 : 2);
158
169
  } }
159
- function ComponentStudioDashboardComponent_Conditional_40_Conditional_4_Template(rf, ctx) { if (rf & 1) {
160
- const _r10 = i0.ɵɵgetCurrentView();
161
- i0.ɵɵelementStart(0, "button", 59);
162
- i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_40_Conditional_4_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r10); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.clearCategoryFilters()); });
163
- i0.ɵɵelement(1, "i", 60);
164
- i0.ɵɵtext(2, " Clear ");
170
+ function ComponentStudioDashboardComponent_Conditional_37_Conditional_21_Template(rf, ctx) { if (rf & 1) {
171
+ i0.ɵɵelementStart(0, "div", 52)(1, "label", 53);
172
+ i0.ɵɵtext(2, "Categories");
173
+ i0.ɵɵelementEnd();
174
+ i0.ɵɵelementStart(3, "div", 59);
175
+ i0.ɵɵrepeaterCreate(4, ComponentStudioDashboardComponent_Conditional_37_Conditional_21_For_5_Template, 5, 6, "button", 60, _forTrack0);
165
176
  i0.ɵɵelementEnd();
177
+ i0.ɵɵtemplate(6, ComponentStudioDashboardComponent_Conditional_37_Conditional_21_Conditional_6_Template, 3, 1, "button", 61);
178
+ i0.ɵɵelementEnd();
179
+ } if (rf & 2) {
180
+ const ctx_r2 = i0.ɵɵnextContext(2);
181
+ i0.ɵɵadvance(4);
182
+ i0.ɵɵrepeater(ctx_r2.getVisibleCategories());
183
+ i0.ɵɵadvance(2);
184
+ i0.ɵɵconditional(ctx_r2.availableCategories.length > 5 ? 6 : -1);
166
185
  } }
167
- function ComponentStudioDashboardComponent_Conditional_40_Template(rf, ctx) { if (rf & 1) {
168
- i0.ɵɵelementStart(0, "div", 27);
169
- i0.ɵɵrepeaterCreate(1, ComponentStudioDashboardComponent_Conditional_40_For_2_Template, 5, 6, "button", 50, _forTrack0);
170
- i0.ɵɵtemplate(3, ComponentStudioDashboardComponent_Conditional_40_Conditional_3_Template, 3, 1, "button", 51)(4, ComponentStudioDashboardComponent_Conditional_40_Conditional_4_Template, 3, 0, "button", 52);
186
+ function ComponentStudioDashboardComponent_Conditional_37_Conditional_22_Template(rf, ctx) { if (rf & 1) {
187
+ const _r11 = i0.ɵɵgetCurrentView();
188
+ i0.ɵɵelementStart(0, "div", 58)(1, "button", 67);
189
+ i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_37_Conditional_22_Template_button_click_1_listener() { i0.ɵɵrestoreView(_r11); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.ClearAllFilters()); });
190
+ i0.ɵɵelement(2, "i", 68);
191
+ i0.ɵɵtext(3, " Clear All Filters ");
192
+ i0.ɵɵelementEnd()();
193
+ } }
194
+ function ComponentStudioDashboardComponent_Conditional_37_Template(rf, ctx) { if (rf & 1) {
195
+ const _r7 = i0.ɵɵgetCurrentView();
196
+ i0.ɵɵelementStart(0, "div", 30)(1, "div", 48);
197
+ i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_37_Template_div_click_1_listener() { i0.ɵɵrestoreView(_r7); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.ToggleFilterPanel()); });
198
+ i0.ɵɵelementStart(2, "span");
199
+ i0.ɵɵelement(3, "i", 49);
200
+ i0.ɵɵtext(4, " Filters");
201
+ i0.ɵɵelementEnd();
202
+ i0.ɵɵelementStart(5, "span", 50);
203
+ i0.ɵɵtext(6);
204
+ i0.ɵɵelementEnd()();
205
+ i0.ɵɵelementStart(7, "div", 51)(8, "div", 52)(9, "label", 53);
206
+ i0.ɵɵtext(10, "Quick Filters");
171
207
  i0.ɵɵelementEnd();
208
+ i0.ɵɵelementStart(11, "div", 54)(12, "label", 55)(13, "input", 56);
209
+ i0.ɵɵlistener("change", function ComponentStudioDashboardComponent_Conditional_37_Template_input_change_13_listener() { i0.ɵɵrestoreView(_r7); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.toggleShowOnlyFavorites()); });
210
+ i0.ɵɵelementEnd();
211
+ i0.ɵɵelementStart(14, "span");
212
+ i0.ɵɵtext(15, "Show favorites only");
213
+ i0.ɵɵelementEnd()();
214
+ i0.ɵɵelementStart(16, "label", 55)(17, "input", 56);
215
+ i0.ɵɵlistener("change", function ComponentStudioDashboardComponent_Conditional_37_Template_input_change_17_listener() { i0.ɵɵrestoreView(_r7); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.toggleShowDeprecatedComponents()); });
216
+ i0.ɵɵelementEnd();
217
+ i0.ɵɵelementStart(18, "span");
218
+ i0.ɵɵtext(19, "Hide deprecated ");
219
+ i0.ɵɵtemplate(20, ComponentStudioDashboardComponent_Conditional_37_Conditional_20_Template, 2, 1, "span", 57);
220
+ i0.ɵɵelementEnd()()()();
221
+ i0.ɵɵtemplate(21, ComponentStudioDashboardComponent_Conditional_37_Conditional_21_Template, 7, 1, "div", 52)(22, ComponentStudioDashboardComponent_Conditional_37_Conditional_22_Template, 4, 0, "div", 58);
222
+ i0.ɵɵelementEnd()();
172
223
  } if (rf & 2) {
173
224
  const ctx_r2 = i0.ɵɵnextContext();
225
+ i0.ɵɵadvance(6);
226
+ i0.ɵɵtextInterpolate2("", ctx_r2.filteredComponents.length, " of ", ctx_r2.allComponents.length, "");
227
+ i0.ɵɵadvance(7);
228
+ i0.ɵɵproperty("checked", ctx_r2.showOnlyFavorites);
229
+ i0.ɵɵadvance(4);
230
+ i0.ɵɵproperty("checked", !ctx_r2.showDeprecatedComponents);
231
+ i0.ɵɵadvance(3);
232
+ i0.ɵɵconditional(ctx_r2.getDeprecatedCount() > 0 ? 20 : -1);
174
233
  i0.ɵɵadvance();
175
- i0.ɵɵrepeater(ctx_r2.getVisibleCategories());
176
- i0.ɵɵadvance(2);
177
- i0.ɵɵconditional(ctx_r2.availableCategories.length > 5 ? 3 : -1);
234
+ i0.ɵɵconditional(ctx_r2.availableCategories.length > 0 ? 21 : -1);
178
235
  i0.ɵɵadvance();
179
- i0.ɵɵconditional(ctx_r2.selectedCategories.size > 0 ? 4 : -1);
236
+ i0.ɵɵconditional(ctx_r2.GetActiveFilterCount() > 0 ? 22 : -1);
180
237
  } }
181
- function ComponentStudioDashboardComponent_ng_template_43_Template(rf, ctx) { if (rf & 1) {
182
- i0.ɵɵelement(0, "i", 61);
183
- } }
184
- function ComponentStudioDashboardComponent_Conditional_45_Template(rf, ctx) { if (rf & 1) {
238
+ function ComponentStudioDashboardComponent_Conditional_39_Template(rf, ctx) { if (rf & 1) {
185
239
  i0.ɵɵelementStart(0, "div", 32);
186
- i0.ɵɵelement(1, "i", 62);
240
+ i0.ɵɵelement(1, "i", 69);
187
241
  i0.ɵɵtext(2, " Loading components... ");
188
242
  i0.ɵɵelementEnd();
189
243
  } }
190
- function ComponentStudioDashboardComponent_Conditional_46_Template(rf, ctx) { if (rf & 1) {
244
+ function ComponentStudioDashboardComponent_Conditional_40_Template(rf, ctx) { if (rf & 1) {
191
245
  i0.ɵɵelementStart(0, "div", 33);
192
- i0.ɵɵelement(1, "i", 63);
246
+ i0.ɵɵelement(1, "i", 70);
193
247
  i0.ɵɵtext(2, " No components found without required custom properties. ");
194
248
  i0.ɵɵelement(3, "br");
195
249
  i0.ɵɵelementStart(4, "small");
196
250
  i0.ɵɵtext(5, "Components with optional custom props can be tested, but not those with required props.");
197
251
  i0.ɵɵelementEnd()();
198
252
  } }
199
- function ComponentStudioDashboardComponent_Conditional_47_For_1_Conditional_4_Conditional_1_Template(rf, ctx) { if (rf & 1) {
200
- i0.ɵɵelement(0, "i", 46);
253
+ function ComponentStudioDashboardComponent_Conditional_41_For_1_Conditional_4_Conditional_1_Template(rf, ctx) { if (rf & 1) {
254
+ i0.ɵɵelement(0, "i", 92);
201
255
  } }
202
- function ComponentStudioDashboardComponent_Conditional_47_For_1_Conditional_4_Conditional_2_Template(rf, ctx) { if (rf & 1) {
203
- i0.ɵɵelement(0, "i", 47);
256
+ function ComponentStudioDashboardComponent_Conditional_41_For_1_Conditional_4_Conditional_2_Template(rf, ctx) { if (rf & 1) {
257
+ i0.ɵɵelement(0, "i", 93);
204
258
  } }
205
- function ComponentStudioDashboardComponent_Conditional_47_For_1_Conditional_4_Template(rf, ctx) { if (rf & 1) {
206
- const _r13 = i0.ɵɵgetCurrentView();
207
- i0.ɵɵelementStart(0, "button", 84);
208
- i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_47_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)); });
209
- i0.ɵɵtemplate(1, ComponentStudioDashboardComponent_Conditional_47_For_1_Conditional_4_Conditional_1_Template, 1, 0, "i", 46)(2, ComponentStudioDashboardComponent_Conditional_47_For_1_Conditional_4_Conditional_2_Template, 1, 0, "i", 47);
259
+ function ComponentStudioDashboardComponent_Conditional_41_For_1_Conditional_4_Template(rf, ctx) { if (rf & 1) {
260
+ const _r14 = i0.ɵɵgetCurrentView();
261
+ i0.ɵɵelementStart(0, "button", 91);
262
+ i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_41_For_1_Conditional_4_Template_button_click_0_listener($event) { i0.ɵɵrestoreView(_r14); const component_r13 = i0.ɵɵnextContext().$implicit; const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.toggleFavorite(component_r13, $event)); });
263
+ i0.ɵɵtemplate(1, ComponentStudioDashboardComponent_Conditional_41_For_1_Conditional_4_Conditional_1_Template, 1, 0, "i", 92)(2, ComponentStudioDashboardComponent_Conditional_41_For_1_Conditional_4_Conditional_2_Template, 1, 0, "i", 93);
210
264
  i0.ɵɵelementEnd();
211
265
  } if (rf & 2) {
212
- const component_r12 = i0.ɵɵnextContext().$implicit;
266
+ const component_r13 = i0.ɵɵnextContext().$implicit;
213
267
  const ctx_r2 = i0.ɵɵnextContext(2);
214
- i0.ɵɵclassProp("is-favorite", ctx_r2.isFavorite(component_r12));
215
- i0.ɵɵproperty("title", ctx_r2.isFavorite(component_r12) ? "Remove from favorites" : "Add to favorites");
268
+ i0.ɵɵclassProp("is-favorite", ctx_r2.isFavorite(component_r13));
269
+ i0.ɵɵproperty("title", ctx_r2.isFavorite(component_r13) ? "Remove from favorites" : "Add to favorites");
216
270
  i0.ɵɵadvance();
217
- i0.ɵɵconditional(ctx_r2.isFavorite(component_r12) ? 1 : 2);
271
+ i0.ɵɵconditional(ctx_r2.isFavorite(component_r13) ? 1 : 2);
218
272
  } }
219
- function ComponentStudioDashboardComponent_Conditional_47_For_1_Conditional_8_Conditional_1_Template(rf, ctx) { if (rf & 1) {
220
- i0.ɵɵelement(0, "i", 41);
273
+ function ComponentStudioDashboardComponent_Conditional_41_For_1_Conditional_8_Conditional_1_Template(rf, ctx) { if (rf & 1) {
274
+ i0.ɵɵelement(0, "i", 42);
221
275
  i0.ɵɵtext(1, " Text Import ");
222
276
  } }
223
- function ComponentStudioDashboardComponent_Conditional_47_For_1_Conditional_8_Conditional_2_Template(rf, ctx) { if (rf & 1) {
224
- i0.ɵɵelement(0, "i", 40);
277
+ function ComponentStudioDashboardComponent_Conditional_41_For_1_Conditional_8_Conditional_2_Template(rf, ctx) { if (rf & 1) {
278
+ i0.ɵɵelement(0, "i", 41);
225
279
  i0.ɵɵtext(1);
226
280
  } if (rf & 2) {
227
- const component_r12 = i0.ɵɵnextContext(2).$implicit;
281
+ const component_r13 = i0.ɵɵnextContext(2).$implicit;
228
282
  const ctx_r2 = i0.ɵɵnextContext(2);
229
283
  i0.ɵɵadvance();
230
- i0.ɵɵtextInterpolate1(" ", ctx_r2.getComponentFilename(component_r12), " ");
284
+ i0.ɵɵtextInterpolate1(" ", ctx_r2.getComponentFilename(component_r13), " ");
231
285
  } }
232
- function ComponentStudioDashboardComponent_Conditional_47_For_1_Conditional_8_Template(rf, ctx) { if (rf & 1) {
233
- i0.ɵɵelementStart(0, "span", 72);
234
- i0.ɵɵtemplate(1, ComponentStudioDashboardComponent_Conditional_47_For_1_Conditional_8_Conditional_1_Template, 2, 0)(2, ComponentStudioDashboardComponent_Conditional_47_For_1_Conditional_8_Conditional_2_Template, 2, 1);
286
+ function ComponentStudioDashboardComponent_Conditional_41_For_1_Conditional_8_Template(rf, ctx) { if (rf & 1) {
287
+ i0.ɵɵelementStart(0, "span", 79);
288
+ i0.ɵɵtemplate(1, ComponentStudioDashboardComponent_Conditional_41_For_1_Conditional_8_Conditional_1_Template, 2, 0)(2, ComponentStudioDashboardComponent_Conditional_41_For_1_Conditional_8_Conditional_2_Template, 2, 1);
235
289
  i0.ɵɵelementEnd();
236
290
  } if (rf & 2) {
237
- const component_r12 = i0.ɵɵnextContext().$implicit;
291
+ const component_r13 = i0.ɵɵnextContext().$implicit;
238
292
  const ctx_r2 = i0.ɵɵnextContext(2);
239
- i0.ɵɵproperty("title", ctx_r2.getComponentStatus(component_r12) === "Text" ? "Imported from text input" : "Loaded from " + ctx_r2.getComponentFilename(component_r12));
293
+ i0.ɵɵproperty("title", ctx_r2.getComponentStatus(component_r13) === "Text" ? "Imported from text input" : "Loaded from " + ctx_r2.getComponentFilename(component_r13));
240
294
  i0.ɵɵadvance();
241
- i0.ɵɵconditional(ctx_r2.getComponentStatus(component_r12) === "Text" ? 1 : 2);
295
+ i0.ɵɵconditional(ctx_r2.getComponentStatus(component_r13) === "Text" ? 1 : 2);
242
296
  } }
243
- function ComponentStudioDashboardComponent_Conditional_47_For_1_Conditional_14_Conditional_0_Template(rf, ctx) { if (rf & 1) {
244
- i0.ɵɵelementStart(0, "span", 85);
297
+ function ComponentStudioDashboardComponent_Conditional_41_For_1_Conditional_14_Conditional_0_Template(rf, ctx) { if (rf & 1) {
298
+ i0.ɵɵelementStart(0, "span", 94);
245
299
  i0.ɵɵtext(1, "Text");
246
300
  i0.ɵɵelementEnd();
247
301
  } }
248
- function ComponentStudioDashboardComponent_Conditional_47_For_1_Conditional_14_Conditional_1_Template(rf, ctx) { if (rf & 1) {
249
- i0.ɵɵelementStart(0, "span", 86);
302
+ function ComponentStudioDashboardComponent_Conditional_41_For_1_Conditional_14_Conditional_1_Template(rf, ctx) { if (rf & 1) {
303
+ i0.ɵɵelementStart(0, "span", 95);
250
304
  i0.ɵɵtext(1, "File");
251
305
  i0.ɵɵelementEnd();
252
306
  } }
253
- function ComponentStudioDashboardComponent_Conditional_47_For_1_Conditional_14_Template(rf, ctx) { if (rf & 1) {
254
- i0.ɵɵtemplate(0, ComponentStudioDashboardComponent_Conditional_47_For_1_Conditional_14_Conditional_0_Template, 2, 0, "span", 85)(1, ComponentStudioDashboardComponent_Conditional_47_For_1_Conditional_14_Conditional_1_Template, 2, 0, "span", 86);
307
+ function ComponentStudioDashboardComponent_Conditional_41_For_1_Conditional_14_Template(rf, ctx) { if (rf & 1) {
308
+ i0.ɵɵtemplate(0, ComponentStudioDashboardComponent_Conditional_41_For_1_Conditional_14_Conditional_0_Template, 2, 0, "span", 94)(1, ComponentStudioDashboardComponent_Conditional_41_For_1_Conditional_14_Conditional_1_Template, 2, 0, "span", 95);
255
309
  } if (rf & 2) {
256
- const component_r12 = i0.ɵɵnextContext().$implicit;
310
+ const component_r13 = i0.ɵɵnextContext().$implicit;
257
311
  const ctx_r2 = i0.ɵɵnextContext(2);
258
- i0.ɵɵconditional(ctx_r2.getComponentStatus(component_r12) === "Text" ? 0 : 1);
312
+ i0.ɵɵconditional(ctx_r2.getComponentStatus(component_r13) === "Text" ? 0 : 1);
259
313
  } }
260
- function ComponentStudioDashboardComponent_Conditional_47_For_1_Conditional_15_Template(rf, ctx) { if (rf & 1) {
261
- i0.ɵɵelementStart(0, "span", 76);
314
+ function ComponentStudioDashboardComponent_Conditional_41_For_1_Conditional_15_Template(rf, ctx) { if (rf & 1) {
315
+ i0.ɵɵelementStart(0, "span", 83);
262
316
  i0.ɵɵtext(1, "Deprecated");
263
317
  i0.ɵɵelementEnd();
264
318
  } }
265
- function ComponentStudioDashboardComponent_Conditional_47_For_1_Conditional_16_Template(rf, ctx) { if (rf & 1) {
266
- i0.ɵɵelementStart(0, "span", 77);
319
+ function ComponentStudioDashboardComponent_Conditional_41_For_1_Conditional_16_Template(rf, ctx) { if (rf & 1) {
320
+ i0.ɵɵelementStart(0, "span", 84);
267
321
  i0.ɵɵtext(1, "Published");
268
322
  i0.ɵɵelementEnd();
269
323
  } }
270
- function ComponentStudioDashboardComponent_Conditional_47_For_1_Conditional_17_Template(rf, ctx) { if (rf & 1) {
271
- i0.ɵɵelementStart(0, "span", 78);
324
+ function ComponentStudioDashboardComponent_Conditional_41_For_1_Conditional_17_Template(rf, ctx) { if (rf & 1) {
325
+ i0.ɵɵelementStart(0, "span", 85);
272
326
  i0.ɵɵtext(1, "Draft");
273
327
  i0.ɵɵelementEnd();
274
328
  } }
275
- function ComponentStudioDashboardComponent_Conditional_47_For_1_Conditional_23_Template(rf, ctx) { if (rf & 1) {
276
- i0.ɵɵelement(0, "i", 57);
329
+ function ComponentStudioDashboardComponent_Conditional_41_For_1_Conditional_23_Template(rf, ctx) { if (rf & 1) {
330
+ i0.ɵɵelement(0, "i", 66);
277
331
  } }
278
- function ComponentStudioDashboardComponent_Conditional_47_For_1_Conditional_24_Template(rf, ctx) { if (rf & 1) {
279
- i0.ɵɵelement(0, "i", 58);
332
+ function ComponentStudioDashboardComponent_Conditional_41_For_1_Conditional_24_Template(rf, ctx) { if (rf & 1) {
333
+ i0.ɵɵelement(0, "i", 49);
280
334
  } }
281
- function ComponentStudioDashboardComponent_Conditional_47_For_1_Conditional_25_Conditional_1_Template(rf, ctx) { if (rf & 1) {
282
- i0.ɵɵelementStart(0, "div", 87)(1, "label");
335
+ function ComponentStudioDashboardComponent_Conditional_41_For_1_Conditional_25_Conditional_1_Template(rf, ctx) { if (rf & 1) {
336
+ i0.ɵɵelementStart(0, "div", 96)(1, "label");
283
337
  i0.ɵɵtext(2, "Description");
284
338
  i0.ɵɵelementEnd();
285
339
  i0.ɵɵelementStart(3, "p");
286
340
  i0.ɵɵtext(4);
287
341
  i0.ɵɵelementEnd()();
288
342
  } if (rf & 2) {
289
- const component_r12 = i0.ɵɵnextContext(2).$implicit;
343
+ const component_r13 = i0.ɵɵnextContext(2).$implicit;
290
344
  const ctx_r2 = i0.ɵɵnextContext(2);
291
345
  i0.ɵɵadvance(4);
292
- i0.ɵɵtextInterpolate(ctx_r2.getComponentDescription(component_r12));
346
+ i0.ɵɵtextInterpolate(ctx_r2.getComponentDescription(component_r13));
293
347
  } }
294
- function ComponentStudioDashboardComponent_Conditional_47_For_1_Conditional_25_Conditional_21_Template(rf, ctx) { if (rf & 1) {
295
- i0.ɵɵelementStart(0, "div", 89)(1, "span", 90);
348
+ function ComponentStudioDashboardComponent_Conditional_41_For_1_Conditional_25_Conditional_21_Template(rf, ctx) { if (rf & 1) {
349
+ i0.ɵɵelementStart(0, "div", 98)(1, "span", 99);
296
350
  i0.ɵɵtext(2, "Loaded:");
297
351
  i0.ɵɵelementEnd();
298
- i0.ɵɵelementStart(3, "span", 91);
352
+ i0.ɵɵelementStart(3, "span", 100);
299
353
  i0.ɵɵtext(4);
300
354
  i0.ɵɵpipe(5, "date");
301
355
  i0.ɵɵelementEnd()();
302
356
  } if (rf & 2) {
303
- const component_r12 = i0.ɵɵnextContext(2).$implicit;
357
+ const component_r13 = i0.ɵɵnextContext(2).$implicit;
304
358
  const ctx_r2 = i0.ɵɵnextContext(2);
305
359
  i0.ɵɵadvance(4);
306
- i0.ɵɵtextInterpolate(i0.ɵɵpipeBind2(5, 1, ctx_r2.getComponentLoadedAt(component_r12), "short"));
360
+ i0.ɵɵtextInterpolate(i0.ɵɵpipeBind2(5, 1, ctx_r2.getComponentLoadedAt(component_r13), "short"));
307
361
  } }
308
- function ComponentStudioDashboardComponent_Conditional_47_For_1_Conditional_25_Conditional_22_Template(rf, ctx) { if (rf & 1) {
309
- i0.ɵɵelementStart(0, "div", 89)(1, "span", 90);
362
+ function ComponentStudioDashboardComponent_Conditional_41_For_1_Conditional_25_Conditional_22_Template(rf, ctx) { if (rf & 1) {
363
+ i0.ɵɵelementStart(0, "div", 98)(1, "span", 99);
310
364
  i0.ɵɵtext(2, "Updated:");
311
365
  i0.ɵɵelementEnd();
312
- i0.ɵɵelementStart(3, "span", 91);
366
+ i0.ɵɵelementStart(3, "span", 100);
313
367
  i0.ɵɵtext(4);
314
368
  i0.ɵɵpipe(5, "date");
315
369
  i0.ɵɵelementEnd()();
316
370
  } if (rf & 2) {
317
- const component_r12 = i0.ɵɵnextContext(2).$implicit;
371
+ const component_r13 = i0.ɵɵnextContext(2).$implicit;
318
372
  const ctx_r2 = i0.ɵɵnextContext(2);
319
373
  i0.ɵɵadvance(4);
320
- i0.ɵɵtextInterpolate(i0.ɵɵpipeBind2(5, 1, ctx_r2.getComponentUpdatedAt(component_r12), "short"));
374
+ i0.ɵɵtextInterpolate(i0.ɵɵpipeBind2(5, 1, ctx_r2.getComponentUpdatedAt(component_r13), "short"));
321
375
  } }
322
- function ComponentStudioDashboardComponent_Conditional_47_For_1_Conditional_25_Conditional_24_Template(rf, ctx) { if (rf & 1) {
323
- const _r14 = i0.ɵɵgetCurrentView();
376
+ function ComponentStudioDashboardComponent_Conditional_41_For_1_Conditional_25_Conditional_24_Template(rf, ctx) { if (rf & 1) {
377
+ const _r15 = i0.ɵɵgetCurrentView();
324
378
  i0.ɵɵelementStart(0, "button", 9);
325
- i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_47_For_1_Conditional_25_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()); });
326
- i0.ɵɵelement(1, "span", 94);
379
+ i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_41_For_1_Conditional_25_Conditional_24_Template_button_click_0_listener($event) { i0.ɵɵrestoreView(_r15); const ctx_r2 = i0.ɵɵnextContext(4); ctx_r2.stopComponent(); return i0.ɵɵresetView($event.stopPropagation()); });
380
+ i0.ɵɵelement(1, "span", 103);
327
381
  i0.ɵɵtext(2, " Stop Component ");
328
382
  i0.ɵɵelementEnd();
329
383
  } if (rf & 2) {
330
384
  i0.ɵɵproperty("themeColor", "error");
331
385
  } }
332
- function ComponentStudioDashboardComponent_Conditional_47_For_1_Conditional_25_Conditional_25_Template(rf, ctx) { if (rf & 1) {
333
- const _r15 = i0.ɵɵgetCurrentView();
334
- i0.ɵɵelementStart(0, "button", 95);
335
- i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_47_For_1_Conditional_25_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()); });
336
- i0.ɵɵelement(1, "span", 96);
386
+ function ComponentStudioDashboardComponent_Conditional_41_For_1_Conditional_25_Conditional_25_Template(rf, ctx) { if (rf & 1) {
387
+ const _r16 = i0.ɵɵgetCurrentView();
388
+ i0.ɵɵelementStart(0, "button", 104);
389
+ i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_41_For_1_Conditional_25_Conditional_25_Template_button_click_0_listener($event) { i0.ɵɵrestoreView(_r16); const component_r13 = i0.ɵɵnextContext(2).$implicit; const ctx_r2 = i0.ɵɵnextContext(2); ctx_r2.runComponent(component_r13); return i0.ɵɵresetView($event.stopPropagation()); });
390
+ i0.ɵɵelement(1, "span", 105);
337
391
  i0.ɵɵtext(2, " Switch to This Component ");
338
392
  i0.ɵɵelementEnd();
339
393
  } if (rf & 2) {
340
394
  i0.ɵɵproperty("themeColor", "base");
341
395
  } }
342
- function ComponentStudioDashboardComponent_Conditional_47_For_1_Conditional_25_Conditional_26_Template(rf, ctx) { if (rf & 1) {
343
- const _r16 = i0.ɵɵgetCurrentView();
396
+ function ComponentStudioDashboardComponent_Conditional_41_For_1_Conditional_25_Conditional_26_Template(rf, ctx) { if (rf & 1) {
397
+ const _r17 = i0.ɵɵgetCurrentView();
344
398
  i0.ɵɵelementStart(0, "button", 9);
345
- i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_47_For_1_Conditional_25_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()); });
346
- i0.ɵɵelement(1, "span", 96);
399
+ i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_41_For_1_Conditional_25_Conditional_26_Template_button_click_0_listener($event) { i0.ɵɵrestoreView(_r17); const component_r13 = i0.ɵɵnextContext(2).$implicit; const ctx_r2 = i0.ɵɵnextContext(2); ctx_r2.runComponent(component_r13); return i0.ɵɵresetView($event.stopPropagation()); });
400
+ i0.ɵɵelement(1, "span", 105);
347
401
  i0.ɵɵtext(2, " Run Component ");
348
402
  i0.ɵɵelementEnd();
349
403
  } if (rf & 2) {
350
404
  i0.ɵɵproperty("themeColor", "primary");
351
405
  } }
352
- function ComponentStudioDashboardComponent_Conditional_47_For_1_Conditional_25_Template(rf, ctx) { if (rf & 1) {
353
- i0.ɵɵelementStart(0, "div", 83);
354
- i0.ɵɵtemplate(1, ComponentStudioDashboardComponent_Conditional_47_For_1_Conditional_25_Conditional_1_Template, 5, 1, "div", 87);
355
- i0.ɵɵelementStart(2, "div", 87)(3, "label");
406
+ function ComponentStudioDashboardComponent_Conditional_41_For_1_Conditional_25_Template(rf, ctx) { if (rf & 1) {
407
+ i0.ɵɵelementStart(0, "div", 90);
408
+ i0.ɵɵtemplate(1, ComponentStudioDashboardComponent_Conditional_41_For_1_Conditional_25_Conditional_1_Template, 5, 1, "div", 96);
409
+ i0.ɵɵelementStart(2, "div", 96)(3, "label");
356
410
  i0.ɵɵtext(4, "Component Info");
357
411
  i0.ɵɵelementEnd();
358
- i0.ɵɵelementStart(5, "div", 88)(6, "div", 89)(7, "span", 90);
412
+ i0.ɵɵelementStart(5, "div", 97)(6, "div", 98)(7, "span", 99);
359
413
  i0.ɵɵtext(8, "Type:");
360
414
  i0.ɵɵelementEnd();
361
- i0.ɵɵelementStart(9, "span", 91);
415
+ i0.ɵɵelementStart(9, "span", 100);
362
416
  i0.ɵɵtext(10);
363
417
  i0.ɵɵelementEnd()();
364
- i0.ɵɵelementStart(11, "div", 89)(12, "span", 90);
418
+ i0.ɵɵelementStart(11, "div", 98)(12, "span", 99);
365
419
  i0.ɵɵtext(13, "Version:");
366
420
  i0.ɵɵelementEnd();
367
- i0.ɵɵelementStart(14, "span", 91);
421
+ i0.ɵɵelementStart(14, "span", 100);
368
422
  i0.ɵɵtext(15);
369
423
  i0.ɵɵelementEnd()();
370
- i0.ɵɵelementStart(16, "div", 89)(17, "span", 90);
424
+ i0.ɵɵelementStart(16, "div", 98)(17, "span", 99);
371
425
  i0.ɵɵtext(18, "Status:");
372
426
  i0.ɵɵelementEnd();
373
- i0.ɵɵelementStart(19, "span", 91);
427
+ i0.ɵɵelementStart(19, "span", 100);
374
428
  i0.ɵɵtext(20);
375
429
  i0.ɵɵelementEnd()();
376
- i0.ɵɵtemplate(21, ComponentStudioDashboardComponent_Conditional_47_For_1_Conditional_25_Conditional_21_Template, 6, 4, "div", 89)(22, ComponentStudioDashboardComponent_Conditional_47_For_1_Conditional_25_Conditional_22_Template, 6, 4, "div", 89);
430
+ i0.ɵɵtemplate(21, ComponentStudioDashboardComponent_Conditional_41_For_1_Conditional_25_Conditional_21_Template, 6, 4, "div", 98)(22, ComponentStudioDashboardComponent_Conditional_41_For_1_Conditional_25_Conditional_22_Template, 6, 4, "div", 98);
377
431
  i0.ɵɵelementEnd()();
378
- i0.ɵɵelementStart(23, "div", 92);
379
- i0.ɵɵtemplate(24, ComponentStudioDashboardComponent_Conditional_47_For_1_Conditional_25_Conditional_24_Template, 3, 1, "button", 7)(25, ComponentStudioDashboardComponent_Conditional_47_For_1_Conditional_25_Conditional_25_Template, 3, 1, "button", 93)(26, ComponentStudioDashboardComponent_Conditional_47_For_1_Conditional_25_Conditional_26_Template, 3, 1, "button", 7);
432
+ i0.ɵɵelementStart(23, "div", 101);
433
+ i0.ɵɵtemplate(24, ComponentStudioDashboardComponent_Conditional_41_For_1_Conditional_25_Conditional_24_Template, 3, 1, "button", 7)(25, ComponentStudioDashboardComponent_Conditional_41_For_1_Conditional_25_Conditional_25_Template, 3, 1, "button", 102)(26, ComponentStudioDashboardComponent_Conditional_41_For_1_Conditional_25_Conditional_26_Template, 3, 1, "button", 7);
380
434
  i0.ɵɵelementEnd()();
381
435
  } if (rf & 2) {
382
- const component_r12 = i0.ɵɵnextContext().$implicit;
436
+ const component_r13 = i0.ɵɵnextContext().$implicit;
383
437
  const ctx_r2 = i0.ɵɵnextContext(2);
384
438
  i0.ɵɵadvance();
385
- i0.ɵɵconditional(ctx_r2.getComponentDescription(component_r12) ? 1 : -1);
439
+ i0.ɵɵconditional(ctx_r2.getComponentDescription(component_r13) ? 1 : -1);
386
440
  i0.ɵɵadvance(9);
387
- i0.ɵɵtextInterpolate(ctx_r2.getComponentType(component_r12) || "Unknown");
441
+ i0.ɵɵtextInterpolate(ctx_r2.getComponentType(component_r13) || "Unknown");
388
442
  i0.ɵɵadvance(5);
389
- i0.ɵɵtextInterpolate(ctx_r2.getComponentVersion(component_r12));
443
+ i0.ɵɵtextInterpolate(ctx_r2.getComponentVersion(component_r13));
390
444
  i0.ɵɵadvance(5);
391
- i0.ɵɵtextInterpolate(ctx_r2.getComponentStatus(component_r12) || "Draft");
445
+ i0.ɵɵtextInterpolate(ctx_r2.getComponentStatus(component_r13) || "Draft");
392
446
  i0.ɵɵadvance();
393
- i0.ɵɵconditional(ctx_r2.isFileLoadedComponent(component_r12) ? 21 : !ctx_r2.isFileLoadedComponent(component_r12) && ctx_r2.getComponentUpdatedAt(component_r12) ? 22 : -1);
447
+ i0.ɵɵconditional(ctx_r2.isFileLoadedComponent(component_r13) ? 21 : !ctx_r2.isFileLoadedComponent(component_r13) && ctx_r2.getComponentUpdatedAt(component_r13) ? 22 : -1);
394
448
  i0.ɵɵadvance(3);
395
- 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);
449
+ i0.ɵɵconditional(ctx_r2.selectedComponent && ctx_r2.getComponentId(ctx_r2.selectedComponent) === ctx_r2.getComponentId(component_r13) && ctx_r2.isRunning ? 24 : ctx_r2.isRunning && ctx_r2.selectedComponent && ctx_r2.getComponentId(ctx_r2.selectedComponent) !== ctx_r2.getComponentId(component_r13) ? 25 : 26);
396
450
  } }
397
- function ComponentStudioDashboardComponent_Conditional_47_For_1_Template(rf, ctx) { if (rf & 1) {
398
- const _r11 = i0.ɵɵgetCurrentView();
399
- i0.ɵɵelementStart(0, "div", 65)(1, "div", 66);
400
- i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_47_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)); });
401
- i0.ɵɵelementStart(2, "div", 67);
402
- i0.ɵɵelement(3, "i", 68);
451
+ function ComponentStudioDashboardComponent_Conditional_41_For_1_Template(rf, ctx) { if (rf & 1) {
452
+ const _r12 = i0.ɵɵgetCurrentView();
453
+ i0.ɵɵelementStart(0, "div", 72)(1, "div", 73);
454
+ i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_41_For_1_Template_div_click_1_listener() { const component_r13 = i0.ɵɵrestoreView(_r12).$implicit; const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.toggleComponentExpansion(component_r13)); });
455
+ i0.ɵɵelementStart(2, "div", 74);
456
+ i0.ɵɵelement(3, "i", 75);
403
457
  i0.ɵɵelementEnd();
404
- i0.ɵɵtemplate(4, ComponentStudioDashboardComponent_Conditional_47_For_1_Conditional_4_Template, 3, 4, "button", 69);
405
- i0.ɵɵelementStart(5, "div", 70)(6, "div", 71);
458
+ i0.ɵɵtemplate(4, ComponentStudioDashboardComponent_Conditional_41_For_1_Conditional_4_Template, 3, 4, "button", 76);
459
+ i0.ɵɵelementStart(5, "div", 77)(6, "div", 78);
406
460
  i0.ɵɵtext(7);
407
- i0.ɵɵtemplate(8, ComponentStudioDashboardComponent_Conditional_47_For_1_Conditional_8_Template, 3, 2, "span", 72);
461
+ i0.ɵɵtemplate(8, ComponentStudioDashboardComponent_Conditional_41_For_1_Conditional_8_Template, 3, 2, "span", 79);
408
462
  i0.ɵɵelementEnd();
409
- i0.ɵɵelementStart(9, "div", 73)(10, "span", 74);
463
+ i0.ɵɵelementStart(9, "div", 80)(10, "span", 81);
410
464
  i0.ɵɵtext(11);
411
465
  i0.ɵɵelementEnd();
412
- i0.ɵɵelementStart(12, "span", 75);
466
+ i0.ɵɵelementStart(12, "span", 82);
413
467
  i0.ɵɵtext(13);
414
468
  i0.ɵɵelementEnd();
415
- i0.ɵɵtemplate(14, ComponentStudioDashboardComponent_Conditional_47_For_1_Conditional_14_Template, 2, 1)(15, ComponentStudioDashboardComponent_Conditional_47_For_1_Conditional_15_Template, 2, 0, "span", 76)(16, ComponentStudioDashboardComponent_Conditional_47_For_1_Conditional_16_Template, 2, 0, "span", 77)(17, ComponentStudioDashboardComponent_Conditional_47_For_1_Conditional_17_Template, 2, 0, "span", 78);
469
+ i0.ɵɵtemplate(14, ComponentStudioDashboardComponent_Conditional_41_For_1_Conditional_14_Template, 2, 1)(15, ComponentStudioDashboardComponent_Conditional_41_For_1_Conditional_15_Template, 2, 0, "span", 83)(16, ComponentStudioDashboardComponent_Conditional_41_For_1_Conditional_16_Template, 2, 0, "span", 84)(17, ComponentStudioDashboardComponent_Conditional_41_For_1_Conditional_17_Template, 2, 0, "span", 85);
416
470
  i0.ɵɵelementEnd();
417
- i0.ɵɵelementStart(18, "div", 79)(19, "span", 80);
418
- i0.ɵɵelement(20, "i", 81);
471
+ i0.ɵɵelementStart(18, "div", 86)(19, "span", 87);
472
+ i0.ɵɵelement(20, "i", 88);
419
473
  i0.ɵɵtext(21);
420
474
  i0.ɵɵelementEnd()()();
421
- i0.ɵɵelementStart(22, "div", 82);
422
- i0.ɵɵtemplate(23, ComponentStudioDashboardComponent_Conditional_47_For_1_Conditional_23_Template, 1, 0, "i", 57)(24, ComponentStudioDashboardComponent_Conditional_47_For_1_Conditional_24_Template, 1, 0, "i", 58);
475
+ i0.ɵɵelementStart(22, "div", 89);
476
+ i0.ɵɵtemplate(23, ComponentStudioDashboardComponent_Conditional_41_For_1_Conditional_23_Template, 1, 0, "i", 66)(24, ComponentStudioDashboardComponent_Conditional_41_For_1_Conditional_24_Template, 1, 0, "i", 49);
423
477
  i0.ɵɵelementEnd()();
424
- i0.ɵɵtemplate(25, ComponentStudioDashboardComponent_Conditional_47_For_1_Conditional_25_Template, 27, 6, "div", 83);
478
+ i0.ɵɵtemplate(25, ComponentStudioDashboardComponent_Conditional_41_For_1_Conditional_25_Template, 27, 6, "div", 90);
425
479
  i0.ɵɵelementEnd();
426
480
  } if (rf & 2) {
427
- const component_r12 = ctx.$implicit;
481
+ const component_r13 = ctx.$implicit;
428
482
  const ctx_r2 = i0.ɵɵnextContext(2);
429
- 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));
483
+ i0.ɵɵclassProp("expanded", ctx_r2.expandedComponent && ctx_r2.getComponentId(ctx_r2.expandedComponent) === ctx_r2.getComponentId(component_r13))("running", ctx_r2.selectedComponent && ctx_r2.getComponentId(ctx_r2.selectedComponent) === ctx_r2.getComponentId(component_r13) && ctx_r2.isRunning)("file-loaded", ctx_r2.isFileLoadedComponent(component_r13));
430
484
  i0.ɵɵadvance(2);
431
- i0.ɵɵstyleProp("color", ctx_r2.getComponentTypeColor(ctx_r2.getComponentType(component_r12)));
485
+ i0.ɵɵstyleProp("color", ctx_r2.getComponentTypeColor(ctx_r2.getComponentType(component_r13)));
432
486
  i0.ɵɵadvance();
433
- i0.ɵɵproperty("ngClass", ctx_r2.getComponentTypeIcon(ctx_r2.getComponentType(component_r12)));
487
+ i0.ɵɵproperty("ngClass", ctx_r2.getComponentTypeIcon(ctx_r2.getComponentType(component_r13)));
434
488
  i0.ɵɵadvance();
435
- i0.ɵɵconditional(!ctx_r2.isFileLoadedComponent(component_r12) ? 4 : -1);
489
+ i0.ɵɵconditional(!ctx_r2.isFileLoadedComponent(component_r13) ? 4 : -1);
436
490
  i0.ɵɵadvance(3);
437
- i0.ɵɵtextInterpolate1(" ", ctx_r2.getComponentName(component_r12), " ");
491
+ i0.ɵɵtextInterpolate1(" ", ctx_r2.getComponentName(component_r13), " ");
438
492
  i0.ɵɵadvance();
439
- i0.ɵɵconditional(ctx_r2.isFileLoadedComponent(component_r12) ? 8 : -1);
493
+ i0.ɵɵconditional(ctx_r2.isFileLoadedComponent(component_r13) ? 8 : -1);
440
494
  i0.ɵɵadvance(3);
441
- i0.ɵɵtextInterpolate(ctx_r2.getComponentType(component_r12) || "Component");
495
+ i0.ɵɵtextInterpolate(ctx_r2.getComponentType(component_r13) || "Component");
442
496
  i0.ɵɵadvance(2);
443
- i0.ɵɵtextInterpolate1("v", ctx_r2.getComponentVersion(component_r12), "");
497
+ i0.ɵɵtextInterpolate1("v", ctx_r2.getComponentVersion(component_r13), "");
444
498
  i0.ɵɵadvance();
445
- i0.ɵɵconditional(ctx_r2.isFileLoadedComponent(component_r12) ? 14 : ctx_r2.getComponentStatus(component_r12) === "Deprecated" ? 15 : ctx_r2.getComponentStatus(component_r12) === "Published" ? 16 : 17);
499
+ i0.ɵɵconditional(ctx_r2.isFileLoadedComponent(component_r13) ? 14 : ctx_r2.getComponentStatus(component_r13) === "Deprecated" ? 15 : ctx_r2.getComponentStatus(component_r13) === "Published" ? 16 : 17);
446
500
  i0.ɵɵadvance(5);
447
- i0.ɵɵstyleProp("background-color", ctx_r2.getNamespaceColor(ctx_r2.getComponentNamespace(component_r12)));
448
- i0.ɵɵproperty("title", ctx_r2.getComponentNamespace(component_r12) || "Uncategorized");
501
+ i0.ɵɵstyleProp("background-color", ctx_r2.getNamespaceColor(ctx_r2.getComponentNamespace(component_r13)));
502
+ i0.ɵɵproperty("title", ctx_r2.getComponentNamespace(component_r13) || "Uncategorized");
449
503
  i0.ɵɵadvance(2);
450
- i0.ɵɵtextInterpolate1(" ", ctx_r2.formatNamespace(ctx_r2.getComponentNamespace(component_r12)), " ");
504
+ i0.ɵɵtextInterpolate1(" ", ctx_r2.formatNamespace(ctx_r2.getComponentNamespace(component_r13)), " ");
451
505
  i0.ɵɵadvance(2);
452
- i0.ɵɵconditional(ctx_r2.expandedComponent && ctx_r2.getComponentId(ctx_r2.expandedComponent) === ctx_r2.getComponentId(component_r12) ? 23 : 24);
506
+ i0.ɵɵconditional(ctx_r2.expandedComponent && ctx_r2.getComponentId(ctx_r2.expandedComponent) === ctx_r2.getComponentId(component_r13) ? 23 : 24);
453
507
  i0.ɵɵadvance(2);
454
- i0.ɵɵconditional(ctx_r2.expandedComponent && ctx_r2.getComponentId(ctx_r2.expandedComponent) === ctx_r2.getComponentId(component_r12) ? 25 : -1);
508
+ i0.ɵɵconditional(ctx_r2.expandedComponent && ctx_r2.getComponentId(ctx_r2.expandedComponent) === ctx_r2.getComponentId(component_r13) ? 25 : -1);
455
509
  } }
456
- function ComponentStudioDashboardComponent_Conditional_47_Template(rf, ctx) { if (rf & 1) {
457
- i0.ɵɵrepeaterCreate(0, ComponentStudioDashboardComponent_Conditional_47_For_1_Template, 26, 21, "div", 64, _forTrack1, true);
510
+ function ComponentStudioDashboardComponent_Conditional_41_Template(rf, ctx) { if (rf & 1) {
511
+ i0.ɵɵrepeaterCreate(0, ComponentStudioDashboardComponent_Conditional_41_For_1_Template, 26, 21, "div", 71, _forTrack1, true);
458
512
  } if (rf & 2) {
459
513
  const ctx_r2 = i0.ɵɵnextContext();
460
514
  i0.ɵɵrepeater(ctx_r2.filteredComponents);
461
515
  } }
462
- function ComponentStudioDashboardComponent_Conditional_50_Conditional_3_Conditional_0_Conditional_18_Template(rf, ctx) { if (rf & 1) {
463
- i0.ɵɵelementStart(0, "details", 111)(1, "summary");
516
+ function ComponentStudioDashboardComponent_Conditional_44_Conditional_3_Conditional_0_Conditional_18_Template(rf, ctx) { if (rf & 1) {
517
+ i0.ɵɵelementStart(0, "details", 121)(1, "summary");
464
518
  i0.ɵɵtext(2, "Technical Details (click to expand)");
465
519
  i0.ɵɵelementEnd();
466
520
  i0.ɵɵelementStart(3, "pre");
@@ -471,21 +525,21 @@ function ComponentStudioDashboardComponent_Conditional_50_Conditional_3_Conditio
471
525
  i0.ɵɵadvance(4);
472
526
  i0.ɵɵtextInterpolate(ctx_r2.formatTechnicalDetails(ctx_r2.currentError.technicalDetails));
473
527
  } }
474
- function ComponentStudioDashboardComponent_Conditional_50_Conditional_3_Conditional_0_Template(rf, ctx) { if (rf & 1) {
475
- const _r18 = i0.ɵɵgetCurrentView();
476
- i0.ɵɵelementStart(0, "div", 103)(1, "div", 105)(2, "div", 106);
477
- i0.ɵɵelement(3, "i", 48);
528
+ function ComponentStudioDashboardComponent_Conditional_44_Conditional_3_Conditional_0_Template(rf, ctx) { if (rf & 1) {
529
+ const _r19 = i0.ɵɵgetCurrentView();
530
+ i0.ɵɵelementStart(0, "div", 112)(1, "div", 114)(2, "div", 115);
531
+ i0.ɵɵelement(3, "i", 116);
478
532
  i0.ɵɵelementStart(4, "h3");
479
533
  i0.ɵɵtext(5, "Component Error");
480
534
  i0.ɵɵelementEnd();
481
- i0.ɵɵelementStart(6, "button", 107);
482
- i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_50_Conditional_3_Conditional_0_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r18); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.copyErrorToClipboard()); });
483
- i0.ɵɵelement(7, "i", 108);
535
+ i0.ɵɵelementStart(6, "button", 117);
536
+ i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_44_Conditional_3_Conditional_0_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r19); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.copyErrorToClipboard()); });
537
+ i0.ɵɵelement(7, "i", 118);
484
538
  i0.ɵɵelementEnd()();
485
- i0.ɵɵelementStart(8, "p", 109);
539
+ i0.ɵɵelementStart(8, "p", 119);
486
540
  i0.ɵɵtext(9, " The component could not be rendered due to the following error: ");
487
541
  i0.ɵɵelementEnd();
488
- i0.ɵɵelementStart(10, "div", 110)(11, "strong");
542
+ i0.ɵɵelementStart(10, "div", 120)(11, "strong");
489
543
  i0.ɵɵtext(12, "Error Type:");
490
544
  i0.ɵɵelementEnd();
491
545
  i0.ɵɵtext(13);
@@ -494,9 +548,9 @@ function ComponentStudioDashboardComponent_Conditional_50_Conditional_3_Conditio
494
548
  i0.ɵɵtext(16, "Message:");
495
549
  i0.ɵɵelementEnd();
496
550
  i0.ɵɵtext(17);
497
- i0.ɵɵtemplate(18, ComponentStudioDashboardComponent_Conditional_50_Conditional_3_Conditional_0_Conditional_18_Template, 5, 1, "details", 111);
551
+ i0.ɵɵtemplate(18, ComponentStudioDashboardComponent_Conditional_44_Conditional_3_Conditional_0_Conditional_18_Template, 5, 1, "details", 121);
498
552
  i0.ɵɵelementEnd();
499
- i0.ɵɵelementStart(19, "div", 112)(20, "strong");
553
+ i0.ɵɵelementStart(19, "div", 122)(20, "strong");
500
554
  i0.ɵɵtext(21, "What to do:");
501
555
  i0.ɵɵelementEnd();
502
556
  i0.ɵɵelementStart(22, "ol")(23, "li");
@@ -511,14 +565,14 @@ function ComponentStudioDashboardComponent_Conditional_50_Conditional_3_Conditio
511
565
  i0.ɵɵelementStart(29, "li");
512
566
  i0.ɵɵtext(30, "Contact your system administrator if the issue persists");
513
567
  i0.ɵɵelementEnd()()();
514
- i0.ɵɵelementStart(31, "div", 113)(32, "button", 114);
515
- i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_50_Conditional_3_Conditional_0_Template_button_click_32_listener() { i0.ɵɵrestoreView(_r18); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.retryComponent()); });
516
- i0.ɵɵelement(33, "span", 115);
568
+ i0.ɵɵelementStart(31, "div", 123)(32, "button", 124);
569
+ i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_44_Conditional_3_Conditional_0_Template_button_click_32_listener() { i0.ɵɵrestoreView(_r19); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.retryComponent()); });
570
+ i0.ɵɵelement(33, "span", 125);
517
571
  i0.ɵɵtext(34, " Retry ");
518
572
  i0.ɵɵelementEnd();
519
573
  i0.ɵɵelementStart(35, "button", 9);
520
- i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_50_Conditional_3_Conditional_0_Template_button_click_35_listener() { i0.ɵɵrestoreView(_r18); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.stopComponent()); });
521
- i0.ɵɵelement(36, "span", 94);
574
+ i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_44_Conditional_3_Conditional_0_Template_button_click_35_listener() { i0.ɵɵrestoreView(_r19); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.stopComponent()); });
575
+ i0.ɵɵelement(36, "span", 103);
522
576
  i0.ɵɵtext(37, " Stop ");
523
577
  i0.ɵɵelementEnd()()()();
524
578
  } if (rf & 2) {
@@ -532,34 +586,34 @@ function ComponentStudioDashboardComponent_Conditional_50_Conditional_3_Conditio
532
586
  i0.ɵɵadvance(17);
533
587
  i0.ɵɵproperty("themeColor", "error");
534
588
  } }
535
- function ComponentStudioDashboardComponent_Conditional_50_Conditional_3_Conditional_1_Template(rf, ctx) { if (rf & 1) {
536
- const _r19 = i0.ɵɵgetCurrentView();
537
- i0.ɵɵelementStart(0, "mj-react-component", 116);
538
- i0.ɵɵlistener("componentEvent", function ComponentStudioDashboardComponent_Conditional_50_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_50_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)); });
589
+ function ComponentStudioDashboardComponent_Conditional_44_Conditional_3_Conditional_1_Template(rf, ctx) { if (rf & 1) {
590
+ const _r20 = i0.ɵɵgetCurrentView();
591
+ i0.ɵɵelementStart(0, "mj-react-component", 126);
592
+ i0.ɵɵlistener("componentEvent", function ComponentStudioDashboardComponent_Conditional_44_Conditional_3_Conditional_1_Template_mj_react_component_componentEvent_0_listener($event) { i0.ɵɵrestoreView(_r20); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.onComponentEvent($event)); })("openEntityRecord", function ComponentStudioDashboardComponent_Conditional_44_Conditional_3_Conditional_1_Template_mj_react_component_openEntityRecord_0_listener($event) { i0.ɵɵrestoreView(_r20); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.onOpenEntityRecord($event)); });
539
593
  i0.ɵɵelementEnd();
540
594
  } if (rf & 2) {
541
595
  const ctx_r2 = i0.ɵɵnextContext(3);
542
596
  i0.ɵɵproperty("component", ctx_r2.componentSpec);
543
597
  } }
544
- function ComponentStudioDashboardComponent_Conditional_50_Conditional_3_Template(rf, ctx) { if (rf & 1) {
545
- i0.ɵɵtemplate(0, ComponentStudioDashboardComponent_Conditional_50_Conditional_3_Conditional_0_Template, 38, 4, "div", 103)(1, ComponentStudioDashboardComponent_Conditional_50_Conditional_3_Conditional_1_Template, 1, 1, "mj-react-component", 104);
598
+ function ComponentStudioDashboardComponent_Conditional_44_Conditional_3_Template(rf, ctx) { if (rf & 1) {
599
+ i0.ɵɵtemplate(0, ComponentStudioDashboardComponent_Conditional_44_Conditional_3_Conditional_0_Template, 38, 4, "div", 112)(1, ComponentStudioDashboardComponent_Conditional_44_Conditional_3_Conditional_1_Template, 1, 1, "mj-react-component", 113);
546
600
  } if (rf & 2) {
547
601
  const ctx_r2 = i0.ɵɵnextContext(2);
548
602
  i0.ɵɵconditional(ctx_r2.currentError ? 0 : 1);
549
603
  } }
550
- function ComponentStudioDashboardComponent_Conditional_50_Conditional_4_Template(rf, ctx) { if (rf & 1) {
551
- const _r20 = i0.ɵɵgetCurrentView();
552
- i0.ɵɵelementStart(0, "div", 99);
553
- i0.ɵɵelement(1, "i", 117);
604
+ function ComponentStudioDashboardComponent_Conditional_44_Conditional_4_Template(rf, ctx) { if (rf & 1) {
605
+ const _r21 = i0.ɵɵgetCurrentView();
606
+ i0.ɵɵelementStart(0, "div", 108);
607
+ i0.ɵɵelement(1, "i", 127);
554
608
  i0.ɵɵelementStart(2, "h3");
555
609
  i0.ɵɵtext(3);
556
610
  i0.ɵɵelementEnd();
557
611
  i0.ɵɵelementStart(4, "p");
558
612
  i0.ɵɵtext(5);
559
613
  i0.ɵɵelementEnd();
560
- i0.ɵɵelementStart(6, "button", 118);
561
- i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_50_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)); });
562
- i0.ɵɵelement(7, "span", 96);
614
+ i0.ɵɵelementStart(6, "button", 128);
615
+ i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_44_Conditional_4_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r21); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.runComponent(ctx_r2.selectedComponent)); });
616
+ i0.ɵɵelement(7, "span", 105);
563
617
  i0.ɵɵtext(8, " Run Component ");
564
618
  i0.ɵɵelementEnd()();
565
619
  } if (rf & 2) {
@@ -571,43 +625,43 @@ function ComponentStudioDashboardComponent_Conditional_50_Conditional_4_Template
571
625
  i0.ɵɵadvance();
572
626
  i0.ɵɵproperty("themeColor", "primary")("size", "large");
573
627
  } }
574
- function ComponentStudioDashboardComponent_Conditional_50_ng_template_9_Conditional_6_Template(rf, ctx) { if (rf & 1) {
575
- const _r22 = i0.ɵɵgetCurrentView();
628
+ function ComponentStudioDashboardComponent_Conditional_44_ng_template_9_Conditional_6_Template(rf, ctx) { if (rf & 1) {
629
+ const _r23 = i0.ɵɵgetCurrentView();
576
630
  i0.ɵɵelementStart(0, "button", 9);
577
- i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_50_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()); });
578
- i0.ɵɵelement(1, "span", 125);
631
+ i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_44_ng_template_9_Conditional_6_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r23); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.applySpecChanges()); });
632
+ i0.ɵɵelement(1, "span", 135);
579
633
  i0.ɵɵtext(2, " Apply Changes ");
580
634
  i0.ɵɵelementEnd();
581
- i0.ɵɵelementStart(3, "button", 114);
582
- i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_50_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()); });
583
- i0.ɵɵelement(4, "span", 60);
635
+ i0.ɵɵelementStart(3, "button", 124);
636
+ i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_44_ng_template_9_Conditional_6_Template_button_click_3_listener() { i0.ɵɵrestoreView(_r23); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.initializeEditors()); });
637
+ i0.ɵɵelement(4, "span", 68);
584
638
  i0.ɵɵtext(5, " Cancel ");
585
639
  i0.ɵɵelementEnd();
586
640
  } if (rf & 2) {
587
641
  i0.ɵɵproperty("themeColor", "primary");
588
642
  } }
589
- function ComponentStudioDashboardComponent_Conditional_50_ng_template_9_Conditional_7_Template(rf, ctx) { if (rf & 1) {
590
- const _r23 = i0.ɵɵgetCurrentView();
643
+ function ComponentStudioDashboardComponent_Conditional_44_ng_template_9_Conditional_7_Template(rf, ctx) { if (rf & 1) {
644
+ const _r24 = i0.ɵɵgetCurrentView();
591
645
  i0.ɵɵelementStart(0, "button", 9);
592
- i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_50_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()); });
646
+ i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_44_ng_template_9_Conditional_7_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r24); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.refreshComponent()); });
593
647
  i0.ɵɵelement(1, "span", 15);
594
648
  i0.ɵɵtext(2, " Refresh Component ");
595
649
  i0.ɵɵelementEnd();
596
650
  } if (rf & 2) {
597
651
  i0.ɵɵproperty("themeColor", "info");
598
652
  } }
599
- function ComponentStudioDashboardComponent_Conditional_50_ng_template_9_Template(rf, ctx) { if (rf & 1) {
600
- const _r21 = i0.ɵɵgetCurrentView();
601
- i0.ɵɵelementStart(0, "div", 119)(1, "div", 120)(2, "h4");
602
- i0.ɵɵelement(3, "i", 121);
653
+ function ComponentStudioDashboardComponent_Conditional_44_ng_template_9_Template(rf, ctx) { if (rf & 1) {
654
+ const _r22 = i0.ɵɵgetCurrentView();
655
+ i0.ɵɵelementStart(0, "div", 129)(1, "div", 130)(2, "h4");
656
+ i0.ɵɵelement(3, "i", 131);
603
657
  i0.ɵɵtext(4, " Component Specification (JSON)");
604
658
  i0.ɵɵelementEnd();
605
- i0.ɵɵelementStart(5, "div", 122);
606
- i0.ɵɵtemplate(6, ComponentStudioDashboardComponent_Conditional_50_ng_template_9_Conditional_6_Template, 6, 1)(7, ComponentStudioDashboardComponent_Conditional_50_ng_template_9_Conditional_7_Template, 3, 1, "button", 7);
659
+ i0.ɵɵelementStart(5, "div", 132);
660
+ i0.ɵɵtemplate(6, ComponentStudioDashboardComponent_Conditional_44_ng_template_9_Conditional_6_Template, 6, 1)(7, ComponentStudioDashboardComponent_Conditional_44_ng_template_9_Conditional_7_Template, 3, 1, "button", 7);
607
661
  i0.ɵɵelementEnd()();
608
- i0.ɵɵelementStart(8, "div", 123)(9, "mj-code-editor", 124);
609
- i0.ɵɵtwoWayListener("ngModelChange", function ComponentStudioDashboardComponent_Conditional_50_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); });
610
- i0.ɵɵlistener("ngModelChange", function ComponentStudioDashboardComponent_Conditional_50_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)); });
662
+ i0.ɵɵelementStart(8, "div", 133)(9, "mj-code-editor", 134);
663
+ i0.ɵɵtwoWayListener("ngModelChange", function ComponentStudioDashboardComponent_Conditional_44_ng_template_9_Template_mj_code_editor_ngModelChange_9_listener($event) { i0.ɵɵrestoreView(_r22); const ctx_r2 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r2.editableSpec, $event) || (ctx_r2.editableSpec = $event); return i0.ɵɵresetView($event); });
664
+ i0.ɵɵlistener("ngModelChange", function ComponentStudioDashboardComponent_Conditional_44_ng_template_9_Template_mj_code_editor_ngModelChange_9_listener($event) { i0.ɵɵrestoreView(_r22); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.onSpecChange($event)); });
611
665
  i0.ɵɵelementEnd()()();
612
666
  } if (rf & 2) {
613
667
  const ctx_r2 = i0.ɵɵnextContext(2);
@@ -619,58 +673,58 @@ function ComponentStudioDashboardComponent_Conditional_50_ng_template_9_Template
619
673
  i0.ɵɵtwoWayProperty("ngModel", ctx_r2.editableSpec);
620
674
  i0.ɵɵproperty("language", "json")("readonly", false);
621
675
  } }
622
- function ComponentStudioDashboardComponent_Conditional_50_ng_template_11_Conditional_6_Template(rf, ctx) { if (rf & 1) {
623
- const _r24 = i0.ɵɵgetCurrentView();
676
+ function ComponentStudioDashboardComponent_Conditional_44_ng_template_11_Conditional_6_Template(rf, ctx) { if (rf & 1) {
677
+ const _r25 = i0.ɵɵgetCurrentView();
624
678
  i0.ɵɵelementStart(0, "button", 9);
625
- i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_50_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()); });
626
- i0.ɵɵelement(1, "span", 125);
679
+ i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_44_ng_template_11_Conditional_6_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r25); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.applyCodeChanges()); });
680
+ i0.ɵɵelement(1, "span", 135);
627
681
  i0.ɵɵtext(2, " Apply Changes ");
628
682
  i0.ɵɵelementEnd();
629
- i0.ɵɵelementStart(3, "button", 114);
630
- i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_50_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()); });
631
- i0.ɵɵelement(4, "span", 60);
683
+ i0.ɵɵelementStart(3, "button", 124);
684
+ i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_44_ng_template_11_Conditional_6_Template_button_click_3_listener() { i0.ɵɵrestoreView(_r25); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.initializeEditors()); });
685
+ i0.ɵɵelement(4, "span", 68);
632
686
  i0.ɵɵtext(5, " Cancel ");
633
687
  i0.ɵɵelementEnd();
634
688
  } if (rf & 2) {
635
689
  i0.ɵɵproperty("themeColor", "primary");
636
690
  } }
637
- function ComponentStudioDashboardComponent_Conditional_50_ng_template_11_Conditional_7_Template(rf, ctx) { if (rf & 1) {
638
- const _r25 = i0.ɵɵgetCurrentView();
691
+ function ComponentStudioDashboardComponent_Conditional_44_ng_template_11_Conditional_7_Template(rf, ctx) { if (rf & 1) {
692
+ const _r26 = i0.ɵɵgetCurrentView();
639
693
  i0.ɵɵelementStart(0, "button", 9);
640
- i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_50_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()); });
694
+ i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_44_ng_template_11_Conditional_7_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r26); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.refreshComponent()); });
641
695
  i0.ɵɵelement(1, "span", 15);
642
696
  i0.ɵɵtext(2, " Refresh Component ");
643
697
  i0.ɵɵelementEnd();
644
698
  } if (rf & 2) {
645
699
  i0.ɵɵproperty("themeColor", "info");
646
700
  } }
647
- function ComponentStudioDashboardComponent_Conditional_50_ng_template_11_For_11_ng_template_1_Template(rf, ctx) { if (rf & 1) {
648
- const _r26 = i0.ɵɵgetCurrentView();
649
- i0.ɵɵelementStart(0, "mj-code-editor", 131);
650
- i0.ɵɵlistener("ngModelChange", function ComponentStudioDashboardComponent_Conditional_50_ng_template_11_For_11_ng_template_1_Template_mj_code_editor_ngModelChange_0_listener($event) { i0.ɵɵrestoreView(_r26); const ɵ$index_525_r27 = i0.ɵɵnextContext().$index; const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.onCodeSectionChange($event, ɵ$index_525_r27)); });
701
+ function ComponentStudioDashboardComponent_Conditional_44_ng_template_11_For_11_ng_template_1_Template(rf, ctx) { if (rf & 1) {
702
+ const _r27 = i0.ɵɵgetCurrentView();
703
+ i0.ɵɵelementStart(0, "mj-code-editor", 141);
704
+ i0.ɵɵlistener("ngModelChange", function ComponentStudioDashboardComponent_Conditional_44_ng_template_11_For_11_ng_template_1_Template_mj_code_editor_ngModelChange_0_listener($event) { i0.ɵɵrestoreView(_r27); const ɵ$index_560_r28 = i0.ɵɵnextContext().$index; const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.onCodeSectionChange($event, ɵ$index_560_r28)); });
651
705
  i0.ɵɵelementEnd();
652
706
  } if (rf & 2) {
653
- const section_r28 = i0.ɵɵnextContext().$implicit;
654
- i0.ɵɵproperty("ngModel", section_r28.code)("language", "javascript")("readonly", false);
707
+ const section_r29 = i0.ɵɵnextContext().$implicit;
708
+ i0.ɵɵproperty("ngModel", section_r29.code)("language", "javascript")("readonly", false);
655
709
  } }
656
- function ComponentStudioDashboardComponent_Conditional_50_ng_template_11_For_11_Template(rf, ctx) { if (rf & 1) {
657
- i0.ɵɵelementStart(0, "kendo-panelbar-item", 129);
658
- i0.ɵɵtemplate(1, ComponentStudioDashboardComponent_Conditional_50_ng_template_11_For_11_ng_template_1_Template, 1, 3, "ng-template", 130);
710
+ function ComponentStudioDashboardComponent_Conditional_44_ng_template_11_For_11_Template(rf, ctx) { if (rf & 1) {
711
+ i0.ɵɵelementStart(0, "kendo-panelbar-item", 139);
712
+ i0.ɵɵtemplate(1, ComponentStudioDashboardComponent_Conditional_44_ng_template_11_For_11_ng_template_1_Template, 1, 3, "ng-template", 140);
659
713
  i0.ɵɵelementEnd();
660
714
  } if (rf & 2) {
661
- const section_r28 = ctx.$implicit;
662
- i0.ɵɵproperty("title", section_r28.title)("expanded", section_r28.expanded);
715
+ const section_r29 = ctx.$implicit;
716
+ i0.ɵɵproperty("title", section_r29.title)("expanded", section_r29.expanded);
663
717
  } }
664
- function ComponentStudioDashboardComponent_Conditional_50_ng_template_11_Template(rf, ctx) { if (rf & 1) {
665
- i0.ɵɵelementStart(0, "div", 126)(1, "div", 120)(2, "h4");
666
- i0.ɵɵelement(3, "i", 127);
718
+ function ComponentStudioDashboardComponent_Conditional_44_ng_template_11_Template(rf, ctx) { if (rf & 1) {
719
+ i0.ɵɵelementStart(0, "div", 136)(1, "div", 130)(2, "h4");
720
+ i0.ɵɵelement(3, "i", 137);
667
721
  i0.ɵɵtext(4, " Component Code (JavaScript/React)");
668
722
  i0.ɵɵelementEnd();
669
- i0.ɵɵelementStart(5, "div", 122);
670
- i0.ɵɵtemplate(6, ComponentStudioDashboardComponent_Conditional_50_ng_template_11_Conditional_6_Template, 6, 1)(7, ComponentStudioDashboardComponent_Conditional_50_ng_template_11_Conditional_7_Template, 3, 1, "button", 7);
723
+ i0.ɵɵelementStart(5, "div", 132);
724
+ i0.ɵɵtemplate(6, ComponentStudioDashboardComponent_Conditional_44_ng_template_11_Conditional_6_Template, 6, 1)(7, ComponentStudioDashboardComponent_Conditional_44_ng_template_11_Conditional_7_Template, 3, 1, "button", 7);
671
725
  i0.ɵɵelementEnd()();
672
- i0.ɵɵelementStart(8, "div", 123)(9, "kendo-panelbar", 128);
673
- i0.ɵɵrepeaterCreate(10, ComponentStudioDashboardComponent_Conditional_50_ng_template_11_For_11_Template, 2, 2, "kendo-panelbar-item", 129, _forTrack2);
726
+ i0.ɵɵelementStart(8, "div", 133)(9, "kendo-panelbar", 138);
727
+ i0.ɵɵrepeaterCreate(10, ComponentStudioDashboardComponent_Conditional_44_ng_template_11_For_11_Template, 2, 2, "kendo-panelbar-item", 139, _forTrack2);
674
728
  i0.ɵɵelementEnd()()();
675
729
  } if (rf & 2) {
676
730
  const ctx_r2 = i0.ɵɵnextContext(2);
@@ -681,21 +735,21 @@ function ComponentStudioDashboardComponent_Conditional_50_ng_template_11_Templat
681
735
  i0.ɵɵadvance(3);
682
736
  i0.ɵɵrepeater(ctx_r2.getComponentCodeSections());
683
737
  } }
684
- function ComponentStudioDashboardComponent_Conditional_50_Conditional_12_Template(rf, ctx) { }
685
- function ComponentStudioDashboardComponent_Conditional_50_Template(rf, ctx) { if (rf & 1) {
686
- const _r17 = i0.ɵɵgetCurrentView();
687
- i0.ɵɵelementStart(0, "kendo-splitter", 17)(1, "kendo-splitter-pane", 97)(2, "div", 98);
688
- i0.ɵɵtemplate(3, ComponentStudioDashboardComponent_Conditional_50_Conditional_3_Template, 2, 1)(4, ComponentStudioDashboardComponent_Conditional_50_Conditional_4_Template, 9, 4, "div", 99);
738
+ function ComponentStudioDashboardComponent_Conditional_44_Conditional_12_Template(rf, ctx) { }
739
+ function ComponentStudioDashboardComponent_Conditional_44_Template(rf, ctx) { if (rf & 1) {
740
+ const _r18 = i0.ɵɵgetCurrentView();
741
+ i0.ɵɵelementStart(0, "kendo-splitter", 17)(1, "kendo-splitter-pane", 106)(2, "div", 107);
742
+ i0.ɵɵtemplate(3, ComponentStudioDashboardComponent_Conditional_44_Conditional_3_Template, 2, 1)(4, ComponentStudioDashboardComponent_Conditional_44_Conditional_4_Template, 9, 4, "div", 108);
689
743
  i0.ɵɵelementEnd()();
690
- i0.ɵɵelementStart(5, "kendo-splitter-pane", 97)(6, "div")(7, "kendo-tabstrip", 100);
691
- i0.ɵɵlistener("tabSelect", function ComponentStudioDashboardComponent_Conditional_50_Template_kendo_tabstrip_tabSelect_7_listener($event) { i0.ɵɵrestoreView(_r17); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onTabSelect($event)); });
692
- i0.ɵɵelementStart(8, "kendo-tabstrip-tab", 101);
693
- i0.ɵɵtemplate(9, ComponentStudioDashboardComponent_Conditional_50_ng_template_9_Template, 10, 5, "ng-template", 102);
744
+ i0.ɵɵelementStart(5, "kendo-splitter-pane", 106)(6, "div")(7, "kendo-tabstrip", 109);
745
+ i0.ɵɵlistener("tabSelect", function ComponentStudioDashboardComponent_Conditional_44_Template_kendo_tabstrip_tabSelect_7_listener($event) { i0.ɵɵrestoreView(_r18); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onTabSelect($event)); });
746
+ i0.ɵɵelementStart(8, "kendo-tabstrip-tab", 110);
747
+ i0.ɵɵtemplate(9, ComponentStudioDashboardComponent_Conditional_44_ng_template_9_Template, 10, 5, "ng-template", 111);
694
748
  i0.ɵɵelementEnd();
695
- i0.ɵɵelementStart(10, "kendo-tabstrip-tab", 101);
696
- i0.ɵɵtemplate(11, ComponentStudioDashboardComponent_Conditional_50_ng_template_11_Template, 12, 2, "ng-template", 102);
749
+ i0.ɵɵelementStart(10, "kendo-tabstrip-tab", 110);
750
+ i0.ɵɵtemplate(11, ComponentStudioDashboardComponent_Conditional_44_ng_template_11_Template, 12, 2, "ng-template", 111);
697
751
  i0.ɵɵelementEnd()()()()();
698
- i0.ɵɵtemplate(12, ComponentStudioDashboardComponent_Conditional_50_Conditional_12_Template, 0, 0);
752
+ i0.ɵɵtemplate(12, ComponentStudioDashboardComponent_Conditional_44_Conditional_12_Template, 0, 0);
699
753
  } if (rf & 2) {
700
754
  const ctx_r2 = i0.ɵɵnextContext();
701
755
  i0.ɵɵadvance();
@@ -711,9 +765,9 @@ function ComponentStudioDashboardComponent_Conditional_50_Template(rf, ctx) { if
711
765
  i0.ɵɵadvance(2);
712
766
  i0.ɵɵconditional(!ctx_r2.isDetailsPaneCollapsed ? 12 : -1);
713
767
  } }
714
- function ComponentStudioDashboardComponent_Conditional_51_Template(rf, ctx) { if (rf & 1) {
768
+ function ComponentStudioDashboardComponent_Conditional_45_Template(rf, ctx) { if (rf & 1) {
715
769
  i0.ɵɵelementStart(0, "div", 36);
716
- i0.ɵɵelement(1, "i", 132);
770
+ i0.ɵɵelement(1, "i", 142);
717
771
  i0.ɵɵelementStart(2, "h2");
718
772
  i0.ɵɵtext(3, "Ready to Test Components");
719
773
  i0.ɵɵelementEnd();
@@ -725,6 +779,7 @@ let ComponentStudioDashboardComponent = class ComponentStudioDashboardComponent
725
779
  cdr;
726
780
  dialogService;
727
781
  viewContainerRef;
782
+ notificationService;
728
783
  // Component data
729
784
  components = [];
730
785
  fileLoadedComponents = []; // Components loaded from files
@@ -733,7 +788,7 @@ let ComponentStudioDashboardComponent = class ComponentStudioDashboardComponent
733
788
  selectedComponent = null;
734
789
  expandedComponent = null; // Track which card is expanded
735
790
  componentSpec = null;
736
- isLoading = false;
791
+ isLoading = true; // Start as true to show loading state initially
737
792
  searchQuery = '';
738
793
  isRunning = false; // Track if component is currently running
739
794
  // View and filtering
@@ -763,14 +818,17 @@ let ComponentStudioDashboardComponent = class ComponentStudioDashboardComponent
763
818
  // Dropdown states
764
819
  importDropdownOpen = false;
765
820
  exportDropdownOpen = false;
821
+ // Filter panel state
822
+ isFilterPanelExpanded = false;
766
823
  // Text import dialog reference
767
824
  textImportDialog;
768
825
  destroy$ = new Subject();
769
- constructor(cdr, dialogService, viewContainerRef) {
826
+ constructor(cdr, dialogService, viewContainerRef, notificationService) {
770
827
  super();
771
828
  this.cdr = cdr;
772
829
  this.dialogService = dialogService;
773
830
  this.viewContainerRef = viewContainerRef;
831
+ this.notificationService = notificationService;
774
832
  }
775
833
  ngAfterViewInit() {
776
834
  this.initDashboard();
@@ -889,6 +947,39 @@ let ComponentStudioDashboardComponent = class ComponentStudioDashboardComponent
889
947
  this.showDeprecatedComponents = !this.showDeprecatedComponents;
890
948
  this.combineAndFilterComponents();
891
949
  }
950
+ /**
951
+ * Get count of deprecated components
952
+ */
953
+ getDeprecatedCount() {
954
+ return this.allComponents.filter(c => this.getComponentStatus(c) === 'Deprecated').length;
955
+ }
956
+ /**
957
+ * Toggle filter panel expanded/collapsed
958
+ */
959
+ ToggleFilterPanel() {
960
+ this.isFilterPanelExpanded = !this.isFilterPanelExpanded;
961
+ }
962
+ /**
963
+ * Get count of active filters
964
+ */
965
+ GetActiveFilterCount() {
966
+ let count = 0;
967
+ if (this.showOnlyFavorites)
968
+ count++;
969
+ if (this.showDeprecatedComponents)
970
+ count++;
971
+ count += this.selectedCategories.size;
972
+ return count;
973
+ }
974
+ /**
975
+ * Clear all filters
976
+ */
977
+ ClearAllFilters() {
978
+ this.clearCategoryFilters();
979
+ this.showOnlyFavorites = false;
980
+ this.showDeprecatedComponents = false;
981
+ this.combineAndFilterComponents();
982
+ }
892
983
  onSearchChange(query) {
893
984
  this.searchQuery = query;
894
985
  this.combineAndFilterComponents();
@@ -1269,6 +1360,55 @@ ${this.currentError.technicalDetails ? '\nTechnical Details:\n' + JSON.stringify
1269
1360
  this.closeImportDropdown();
1270
1361
  this.openTextImportDialog();
1271
1362
  }
1363
+ async importFromArtifact() {
1364
+ this.closeImportDropdown();
1365
+ // Small delay to ensure dropdown is closed before opening dialog
1366
+ await new Promise(resolve => setTimeout(resolve, 100));
1367
+ try {
1368
+ const dialogRef = this.dialogService.open({
1369
+ content: ArtifactLoadDialogComponent,
1370
+ width: 1200,
1371
+ height: 700,
1372
+ appendTo: this.viewContainerRef
1373
+ });
1374
+ const result = await dialogRef.result.toPromise();
1375
+ if (!result) {
1376
+ // User cancelled
1377
+ return;
1378
+ }
1379
+ // Create file-loaded component from artifact
1380
+ const artifactComponent = {
1381
+ id: this.generateId(),
1382
+ name: result.spec.name,
1383
+ description: result.spec.description,
1384
+ specification: result.spec,
1385
+ filename: `${result.artifactName} (v${result.versionNumber})`,
1386
+ loadedAt: new Date(),
1387
+ isFileLoaded: true,
1388
+ type: result.spec.type || 'Component',
1389
+ status: 'Artifact'
1390
+ };
1391
+ // Store source reference for potential re-save
1392
+ artifactComponent.sourceArtifactID = result.artifactID;
1393
+ artifactComponent.sourceVersionID = result.versionID;
1394
+ // Add to list
1395
+ this.fileLoadedComponents.push(artifactComponent);
1396
+ this.combineAndFilterComponents();
1397
+ // Auto-select and run
1398
+ this.expandedComponent = artifactComponent;
1399
+ this.runComponent(artifactComponent);
1400
+ console.log(`✅ Loaded component "${result.spec.name}" from artifact version ${result.versionNumber}`);
1401
+ this.notificationService.CreateSimpleNotification(`Loaded component "${result.spec.name}" from artifact`, 'success', 3000);
1402
+ }
1403
+ catch (error) {
1404
+ // Only show error if it's actually an error (not a cancel)
1405
+ console.error('Error loading from artifact:', error);
1406
+ // Check if this is a real error or just a dialog dismissal
1407
+ if (error && error !== 'cancel' && error !== undefined) {
1408
+ this.notificationService.CreateSimpleNotification('Failed to load component from artifact', 'error');
1409
+ }
1410
+ }
1411
+ }
1272
1412
  openTextImportDialog() {
1273
1413
  this.textImportDialog = this.dialogService.open({
1274
1414
  content: TextImportDialogComponent,
@@ -1692,46 +1832,39 @@ ${this.currentError.technicalDetails ? '\nTechnical Details:\n' + JSON.stringify
1692
1832
  try {
1693
1833
  const artifact = result.artifact;
1694
1834
  let version;
1695
- let lastVersion;
1696
1835
  if (result.action === 'update-version' && result.versionToUpdate) {
1697
- // Load and update existing version
1698
- lastVersion = result.versionToUpdate; // set to the same version as we'll grab its Configuration to parse lower down in the code
1836
+ // Update existing version
1699
1837
  version = result.versionToUpdate;
1700
1838
  }
1701
1839
  else {
1702
1840
  // Create new version
1703
- version = await this.metadata.GetEntityObject('MJ: Conversation Artifact Versions');
1704
- version.ConversationArtifactID = artifact.ID;
1841
+ version = await this.metadata.GetEntityObject('MJ: Artifact Versions');
1842
+ version.ArtifactID = artifact.ID;
1843
+ version.UserID = this.metadata.CurrentUser.ID; // Required field
1705
1844
  // Get next version number
1706
1845
  const rv = new RunView();
1707
1846
  const versionsResult = await rv.RunView({
1708
- EntityName: 'MJ: Conversation Artifact Versions',
1709
- ExtraFilter: `ConversationArtifactID = '${artifact.ID}'`,
1710
- OrderBy: 'Version DESC',
1847
+ EntityName: 'MJ: Artifact Versions',
1848
+ ExtraFilter: `ArtifactID = '${artifact.ID}'`,
1849
+ OrderBy: 'VersionNumber DESC',
1711
1850
  MaxRows: 1,
1712
1851
  ResultType: 'entity_object'
1713
1852
  });
1714
1853
  if (versionsResult.Success && versionsResult.Results && versionsResult.Results.length > 0) {
1715
- lastVersion = versionsResult.Results[0];
1716
- version.Version = versionsResult.Results[0].Version + 1;
1854
+ version.VersionNumber = versionsResult.Results[0].VersionNumber + 1;
1717
1855
  }
1718
1856
  else {
1719
- throw new Error('No previous version found');
1857
+ // This is the first version
1858
+ version.VersionNumber = 1;
1720
1859
  }
1721
1860
  }
1722
- // Store the complete spec in Configuration field
1723
- const fullResponse = JSON.parse(lastVersion.Configuration);
1724
- fullResponse.componentOptions = [
1725
- {
1726
- AIRank: 1,
1727
- AIRankExplanation: "",
1728
- UserRankExplanation: "",
1729
- name: currentSpec.name,
1730
- option: currentSpec,
1731
- UserRank: 1
1732
- }
1733
- ];
1734
- version.Configuration = JSON.stringify(fullResponse, null, 2);
1861
+ // Store the component spec in Content field
1862
+ version.Content = JSON.stringify(currentSpec, null, 2);
1863
+ // Generate SHA-256 hash for content
1864
+ version.ContentHash = await this.generateSHA256Hash(version.Content);
1865
+ // Set metadata
1866
+ version.Name = currentSpec.name;
1867
+ version.Description = currentSpec.description || null;
1735
1868
  // Add version comments
1736
1869
  const timestamp = new Date().toISOString();
1737
1870
  const actionText = result.action === 'update-version' ? 'Updated' : 'Created';
@@ -1739,19 +1872,29 @@ ${this.currentError.technicalDetails ? '\nTechnical Details:\n' + JSON.stringify
1739
1872
  const versionSaveResult = await version.Save();
1740
1873
  if (versionSaveResult) {
1741
1874
  const componentName = this.getComponentName(this.selectedComponent);
1742
- console.log(`✅ Saved ${componentName} as artifact version ${version.Version}`);
1743
- MJNotificationService.Instance.CreateSimpleNotification(`${componentName} has been saved as artifact version ${version.Version}.`, 'success', 3500);
1875
+ console.log(`✅ Saved ${componentName} as artifact version ${version.VersionNumber}`);
1876
+ this.notificationService.CreateSimpleNotification(`Component saved as artifact version ${version.VersionNumber}`, 'success', 3000);
1744
1877
  }
1745
1878
  else {
1746
- console.error('Failed to save artifact version:', version.LatestResult?.Message);
1747
- MJNotificationService.Instance.CreateSimpleNotification('Failed to save artifact version. Check console for details.', 'error', 5000);
1879
+ console.error('Failed to save artifact version - Full LatestResult:', version.LatestResult);
1880
+ this.notificationService.CreateSimpleNotification('Failed to save artifact version', 'error');
1748
1881
  }
1749
1882
  }
1750
1883
  catch (error) {
1751
1884
  console.error('Error saving to artifact:', error);
1752
- MJNotificationService.Instance.CreateSimpleNotification('Error saving component to artifact. Check console for details.', 'error', 5000);
1885
+ this.notificationService.CreateSimpleNotification('Error saving component to artifact', 'error');
1753
1886
  }
1754
1887
  }
1888
+ /**
1889
+ * Generate SHA-256 hash for content
1890
+ */
1891
+ async generateSHA256Hash(content) {
1892
+ const encoder = new TextEncoder();
1893
+ const data = encoder.encode(content);
1894
+ const hashBuffer = await crypto.subtle.digest('SHA-256', data);
1895
+ const hashArray = Array.from(new Uint8Array(hashBuffer));
1896
+ return hashArray.map(b => b.toString(16).padStart(2, '0')).join('');
1897
+ }
1755
1898
  /**
1756
1899
  * Export the current component to a file
1757
1900
  */
@@ -1833,7 +1976,7 @@ ${this.currentError.technicalDetails ? '\nTechnical Details:\n' + JSON.stringify
1833
1976
  alert('Failed to copy to clipboard. Please try again.');
1834
1977
  }
1835
1978
  }
1836
- static ɵfac = function ComponentStudioDashboardComponent_Factory(t) { return new (t || ComponentStudioDashboardComponent)(i0.ɵɵdirectiveInject(i0.ChangeDetectorRef), i0.ɵɵdirectiveInject(i1.DialogService), i0.ɵɵdirectiveInject(i0.ViewContainerRef)); };
1979
+ static ɵfac = function ComponentStudioDashboardComponent_Factory(t) { return new (t || ComponentStudioDashboardComponent)(i0.ɵɵdirectiveInject(i0.ChangeDetectorRef), i0.ɵɵdirectiveInject(i1.DialogService), i0.ɵɵdirectiveInject(i0.ViewContainerRef), i0.ɵɵdirectiveInject(i2.MJNotificationService)); };
1837
1980
  static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ComponentStudioDashboardComponent, selectors: [["mj-component-studio-dashboard"]], viewQuery: function ComponentStudioDashboardComponent_Query(rf, ctx) { if (rf & 1) {
1838
1981
  i0.ɵɵviewQuery(_c0, 5);
1839
1982
  } if (rf & 2) {
@@ -1841,7 +1984,7 @@ ${this.currentError.technicalDetails ? '\nTechnical Details:\n' + JSON.stringify
1841
1984
  i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.fileInput = _t.first);
1842
1985
  } }, hostBindings: function ComponentStudioDashboardComponent_HostBindings(rf, ctx) { if (rf & 1) {
1843
1986
  i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_click_HostBindingHandler($event) { return ctx.onDocumentClick($event); }, false, i0.ɵɵresolveDocument);
1844
- } }, features: [i0.ɵɵInheritDefinitionFeature], decls: 52, vars: 24, 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"], ["title", "Toggle deprecated components", 1, "deprecated-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, "fa-solid", "fa-exclamation-triangle"], [1, "fa-regular", "fa-exclamation-triangle"], [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", "deprecated"], [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"], ["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) {
1987
+ } }, features: [i0.ɵɵInheritDefinitionFeature], decls: 46, vars: 22, 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"], [1, "filter-toggle-btn", 3, "click", "title"], [1, "fa-solid", "fa-sliders"], [1, "filter-count-badge"], [1, "component-count"], [1, "search-box"], ["placeholder", "Search components...", 3, "valueChange", "value", "clearButton"], ["kendoTextBoxPrefixTemplate", ""], [1, "filter-panel"], [1, "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-database"], [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-search"], [1, "filter-panel-header", 3, "click"], [1, "fa-solid", "fa-chevron-down"], [1, "filter-count-text"], [1, "filter-panel-content"], [1, "filter-section"], [1, "filter-section-label"], [1, "filter-options"], [1, "filter-checkbox"], ["type", "checkbox", 3, "change", "checked"], [1, "deprecated-count"], [1, "filter-panel-footer"], [1, "category-pills-grid"], [1, "category-pill-compact", 3, "active", "--pill-color"], [1, "show-more-categories-btn"], [1, "category-pill-compact", 3, "click"], [1, "pill-name"], [1, "pill-count"], [1, "show-more-categories-btn", 3, "click"], [1, "fa-solid", "fa-chevron-up"], [1, "clear-all-btn", 3, "click"], [1, "fa-solid", "fa-times"], [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", "deprecated"], [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, "fa-solid", "fa-star"], [1, "fa-regular", "fa-star"], [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) {
1845
1988
  const _r1 = i0.ɵɵgetCurrentView();
1846
1989
  i0.ɵɵelementStart(0, "div", 1)(1, "div", 2)(2, "div", 3)(3, "div")(4, "h1");
1847
1990
  i0.ɵɵelement(5, "i", 4);
@@ -1858,7 +2001,7 @@ ${this.currentError.technicalDetails ? '\nTechnical Details:\n' + JSON.stringify
1858
2001
  i0.ɵɵtext(14, " Import ");
1859
2002
  i0.ɵɵelement(15, "span", 11);
1860
2003
  i0.ɵɵelementEnd();
1861
- i0.ɵɵtemplate(16, ComponentStudioDashboardComponent_Conditional_16_Template, 7, 0, "div", 12);
2004
+ i0.ɵɵtemplate(16, ComponentStudioDashboardComponent_Conditional_16_Template, 10, 0, "div", 12);
1862
2005
  i0.ɵɵelementEnd();
1863
2006
  i0.ɵɵtemplate(17, ComponentStudioDashboardComponent_Conditional_17_Template, 6, 4, "div", 13);
1864
2007
  i0.ɵɵelementStart(18, "button", 14);
@@ -1869,32 +2012,25 @@ ${this.currentError.technicalDetails ? '\nTechnical Details:\n' + JSON.stringify
1869
2012
  i0.ɵɵelementStart(21, "input", 16, 0);
1870
2013
  i0.ɵɵlistener("change", function ComponentStudioDashboardComponent_Template_input_change_21_listener($event) { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.handleFileSelect($event)); });
1871
2014
  i0.ɵɵelementEnd()()();
1872
- i0.ɵɵelementStart(23, "kendo-splitter", 17)(24, "kendo-splitter-pane", 18)(25, "div", 19)(26, "div", 20)(27, "div", 21)(28, "h3");
1873
- i0.ɵɵtext(29, "Components");
2015
+ i0.ɵɵelementStart(23, "kendo-splitter", 17)(24, "kendo-splitter-pane", 18)(25, "div", 19)(26, "div", 20)(27, "div", 21)(28, "div", 22)(29, "button", 23);
2016
+ i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Template_button_click_29_listener() { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.ToggleFilterPanel()); });
2017
+ i0.ɵɵelement(30, "i", 24);
2018
+ i0.ɵɵtemplate(31, ComponentStudioDashboardComponent_Conditional_31_Template, 2, 1, "span", 25);
1874
2019
  i0.ɵɵelementEnd();
1875
- i0.ɵɵelementStart(30, "div", 22)(31, "button", 23);
1876
- i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Template_button_click_31_listener() { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.toggleShowOnlyFavorites()); });
1877
- i0.ɵɵtemplate(32, ComponentStudioDashboardComponent_Conditional_32_Template, 2, 0)(33, ComponentStudioDashboardComponent_Conditional_33_Template, 2, 0);
1878
- i0.ɵɵelementEnd();
1879
- i0.ɵɵelementStart(34, "button", 24);
1880
- i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Template_button_click_34_listener() { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.toggleShowDeprecatedComponents()); });
1881
- i0.ɵɵtemplate(35, ComponentStudioDashboardComponent_Conditional_35_Template, 2, 0)(36, ComponentStudioDashboardComponent_Conditional_36_Template, 2, 0);
1882
- i0.ɵɵelementEnd();
1883
- i0.ɵɵelementStart(37, "span", 25);
1884
- i0.ɵɵtext(38);
2020
+ i0.ɵɵelementStart(32, "span", 26);
2021
+ i0.ɵɵtext(33);
1885
2022
  i0.ɵɵelementEnd()()();
1886
- i0.ɵɵelementStart(39, "div", 26);
1887
- i0.ɵɵtemplate(40, ComponentStudioDashboardComponent_Conditional_40_Template, 5, 2, "div", 27);
2023
+ i0.ɵɵelementStart(34, "div", 27)(35, "kendo-textbox", 28);
2024
+ i0.ɵɵlistener("valueChange", function ComponentStudioDashboardComponent_Template_kendo_textbox_valueChange_35_listener($event) { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.onSearchChange($event)); });
2025
+ i0.ɵɵtemplate(36, ComponentStudioDashboardComponent_ng_template_36_Template, 1, 0, "ng-template", 29);
2026
+ i0.ɵɵelementEnd()();
2027
+ i0.ɵɵtemplate(37, ComponentStudioDashboardComponent_Conditional_37_Template, 23, 7, "div", 30);
1888
2028
  i0.ɵɵelementEnd();
1889
- i0.ɵɵelementStart(41, "div", 28)(42, "kendo-textbox", 29);
1890
- i0.ɵɵlistener("valueChange", function ComponentStudioDashboardComponent_Template_kendo_textbox_valueChange_42_listener($event) { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.onSearchChange($event)); });
1891
- i0.ɵɵtemplate(43, ComponentStudioDashboardComponent_ng_template_43_Template, 1, 0, "ng-template", 30);
1892
- i0.ɵɵelementEnd()()();
1893
- i0.ɵɵelementStart(44, "div", 31);
1894
- i0.ɵɵtemplate(45, ComponentStudioDashboardComponent_Conditional_45_Template, 3, 0, "div", 32)(46, ComponentStudioDashboardComponent_Conditional_46_Template, 6, 0, "div", 33)(47, ComponentStudioDashboardComponent_Conditional_47_Template, 2, 0);
2029
+ i0.ɵɵelementStart(38, "div", 31);
2030
+ i0.ɵɵtemplate(39, ComponentStudioDashboardComponent_Conditional_39_Template, 3, 0, "div", 32)(40, ComponentStudioDashboardComponent_Conditional_40_Template, 6, 0, "div", 33)(41, ComponentStudioDashboardComponent_Conditional_41_Template, 2, 0);
1895
2031
  i0.ɵɵelementEnd()()();
1896
- i0.ɵɵelementStart(48, "kendo-splitter-pane", 34)(49, "div", 35);
1897
- i0.ɵɵtemplate(50, ComponentStudioDashboardComponent_Conditional_50_Template, 13, 8)(51, ComponentStudioDashboardComponent_Conditional_51_Template, 6, 0, "div", 36);
2032
+ i0.ɵɵelementStart(42, "kendo-splitter-pane", 34)(43, "div", 35);
2033
+ i0.ɵɵtemplate(44, ComponentStudioDashboardComponent_Conditional_44_Template, 13, 8)(45, ComponentStudioDashboardComponent_Conditional_45_Template, 6, 0, "div", 36);
1898
2034
  i0.ɵɵelementEnd()()()();
1899
2035
  } if (rf & 2) {
1900
2036
  i0.ɵɵadvance(10);
@@ -1911,27 +2047,24 @@ ${this.currentError.technicalDetails ? '\nTechnical Details:\n' + JSON.stringify
1911
2047
  i0.ɵɵproperty("disabled", ctx.isLoading);
1912
2048
  i0.ɵɵadvance(6);
1913
2049
  i0.ɵɵproperty("min", "350px")("max", "650px")("size", "400px");
1914
- i0.ɵɵadvance(7);
1915
- i0.ɵɵclassProp("active", ctx.showOnlyFavorites);
1916
- i0.ɵɵadvance();
1917
- i0.ɵɵconditional(ctx.showOnlyFavorites ? 32 : 33);
2050
+ i0.ɵɵadvance(5);
2051
+ i0.ɵɵclassProp("active", ctx.isFilterPanelExpanded || ctx.GetActiveFilterCount() > 0);
2052
+ i0.ɵɵproperty("title", ctx.isFilterPanelExpanded ? "Hide filters" : "Show filters");
1918
2053
  i0.ɵɵadvance(2);
1919
- i0.ɵɵclassProp("active", ctx.showDeprecatedComponents);
1920
- i0.ɵɵadvance();
1921
- i0.ɵɵconditional(ctx.showDeprecatedComponents ? 35 : 36);
1922
- i0.ɵɵadvance(3);
1923
- i0.ɵɵtextInterpolate2("", ctx.filteredComponents.length, " of ", ctx.allComponents.length, "");
2054
+ i0.ɵɵconditional(ctx.GetActiveFilterCount() > 0 ? 31 : -1);
1924
2055
  i0.ɵɵadvance(2);
1925
- i0.ɵɵconditional(ctx.availableCategories.length > 0 ? 40 : -1);
2056
+ i0.ɵɵtextInterpolate2("", ctx.filteredComponents.length, " of ", ctx.allComponents.length, "");
1926
2057
  i0.ɵɵadvance(2);
1927
2058
  i0.ɵɵproperty("value", ctx.searchQuery)("clearButton", true);
1928
- i0.ɵɵadvance(3);
1929
- i0.ɵɵconditional(ctx.isLoading ? 45 : ctx.filteredComponents.length === 0 ? 46 : 47);
2059
+ i0.ɵɵadvance(2);
2060
+ i0.ɵɵconditional(ctx.isFilterPanelExpanded ? 37 : -1);
2061
+ i0.ɵɵadvance(2);
2062
+ i0.ɵɵconditional(ctx.isLoading ? 39 : ctx.filteredComponents.length === 0 ? 40 : 41);
1930
2063
  i0.ɵɵadvance(3);
1931
2064
  i0.ɵɵproperty("min", "400px");
1932
2065
  i0.ɵɵadvance(2);
1933
- i0.ɵɵconditional(ctx.selectedComponent ? 50 : 51);
1934
- } }, 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 .deprecated-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 i {\n font-size: 14px;\n }\n }\n\n .favorites-toggle.active {\n background: #fff3cd;\n border-color: #ffc107;\n color: #856404;\n\n i {\n color: #ffc107;\n }\n }\n\n .deprecated-toggle.active {\n background: #ffe4e1;\n border-color: #ff6b6b;\n color: #c92a2a;\n\n i {\n color: #ff6b6b;\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 &.deprecated {\n background: #ffe4e1;\n color: #c92a2a;\n border: 1px solid #ff6b6b;\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}"] });
2066
+ i0.ɵɵconditional(ctx.selectedComponent ? 44 : 45);
2067
+ } }, dependencies: [i3.NgClass, i4.NgControlStatus, i4.NgModel, i5.TextBoxComponent, i5.TextBoxPrefixTemplateDirective, i6.PanelBarComponent, i6.PanelBarItemComponent, i6.PanelBarContentDirective, i6.SplitterComponent, i6.SplitterPaneComponent, i6.TabStripComponent, i6.TabStripTabComponent, i6.TabContentDirective, i7.CodeEditorComponent, i8.ButtonComponent, i9.MJReactComponent, i3.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: 12px;\n\n .header-actions {\n display: flex;\n align-items: center;\n gap: 10px;\n width: 100%;\n \n .favorites-toggle,\n .deprecated-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 i {\n font-size: 14px;\n }\n }\n\n .favorites-toggle.active {\n background: #fff3cd;\n border-color: #ffc107;\n color: #856404;\n\n i {\n color: #ffc107;\n }\n }\n\n .deprecated-toggle.active {\n background: #ffe4e1;\n border-color: #ff6b6b;\n color: #c92a2a;\n\n i {\n color: #ff6b6b;\n }\n }\n\n .count-badge {\n margin-left: 4px;\n background: #f59e0b;\n color: white;\n padding: 2px 6px;\n border-radius: 10px;\n font-size: 11px;\n font-weight: 600;\n line-height: 1;\n }\n\n .deprecated-toggle.active .count-badge {\n background: #ff6b6b;\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 margin-bottom: 12px;\n\n kendo-textbox {\n width: 100%;\n }\n\n // Reduce search input font size\n ::ng-deep .k-input-inner {\n font-size: 13px;\n }\n }\n\n // New filter toggle button\n .filter-toggle-btn {\n position: relative;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 6px 10px;\n border: 1px solid #ced4da;\n background: white;\n border-radius: 4px;\n font-size: 13px;\n color: #495057;\n cursor: pointer;\n transition: all 0.2s ease;\n\n &:hover {\n background: #e9ecef;\n border-color: #adb5bd;\n }\n\n &.active {\n background: #e7f3ff;\n border-color: #1e40af;\n color: #1e40af;\n }\n\n i {\n font-size: 13px;\n }\n\n .filter-count-badge {\n position: absolute;\n top: -6px;\n right: -6px;\n background: #1e40af;\n color: white;\n padding: 2px 6px;\n border-radius: 10px;\n font-size: 10px;\n font-weight: 600;\n line-height: 1;\n min-width: 18px;\n text-align: center;\n }\n }\n\n // Collapsible filter panel\n .filter-panel {\n background: #f8f9fa;\n border: 1px solid #dee2e6;\n border-radius: 8px;\n margin-bottom: 12px;\n overflow: hidden;\n animation: slideDown 0.2s ease;\n }\n\n @keyframes slideDown {\n from {\n opacity: 0;\n transform: translateY(-10px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n }\n\n .filter-panel-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 8px 12px;\n background: #e9ecef;\n cursor: pointer;\n font-weight: 600;\n font-size: 12px;\n color: #495057;\n user-select: none;\n\n &:hover {\n background: #dee2e6;\n }\n\n i {\n margin-right: 4px;\n font-size: 10px;\n }\n\n .filter-count-text {\n font-size: 11px;\n font-weight: 500;\n color: #6c757d;\n }\n }\n\n .filter-panel-content {\n padding: 14px;\n }\n\n .filter-section {\n margin-bottom: 16px;\n\n &:last-child {\n margin-bottom: 0;\n }\n\n .filter-section-label {\n display: block;\n font-size: 12px;\n font-weight: 600;\n color: #495057;\n margin-bottom: 8px;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n }\n\n .filter-options {\n display: flex;\n flex-direction: column;\n gap: 8px;\n }\n\n .filter-checkbox {\n display: flex;\n align-items: center;\n gap: 8px;\n cursor: pointer;\n font-size: 13px;\n color: #212529;\n padding: 6px 0;\n\n input[type=\"checkbox\"] {\n width: 16px;\n height: 16px;\n cursor: pointer;\n }\n\n span {\n user-select: none;\n }\n\n .deprecated-count {\n color: #6c757d;\n font-size: 12px;\n margin-left: 4px;\n }\n }\n\n .category-pills-grid {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n }\n\n .category-pill-compact {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 5px 10px;\n border: 2px solid #e9ecef;\n background: white;\n border-radius: 16px;\n font-size: 12px;\n font-weight: 500;\n color: #495057;\n cursor: pointer;\n transition: all 0.15s ease;\n\n &:hover {\n border-color: #adb5bd;\n transform: translateY(-1px);\n }\n\n &.active {\n border-color: var(--pill-color, #6366f1);\n background: var(--pill-color, #6366f1);\n color: white;\n }\n\n .pill-name {\n font-weight: 500;\n }\n\n .pill-count {\n font-size: 11px;\n opacity: 0.8;\n }\n }\n\n .show-more-categories-btn {\n padding: 5px 10px;\n border: 1px dashed #dee2e6;\n background: white;\n border-radius: 16px;\n font-size: 12px;\n color: #6c757d;\n cursor: pointer;\n transition: all 0.15s ease;\n\n &:hover {\n background: #f8f9fa;\n border-color: #adb5bd;\n }\n\n i {\n margin-right: 4px;\n font-size: 10px;\n }\n }\n }\n\n .filter-panel-footer {\n margin-top: 12px;\n padding-top: 12px;\n border-top: 1px solid #dee2e6;\n\n .clear-all-btn {\n width: 100%;\n padding: 8px;\n border: 1px solid #dc3545;\n background: white;\n border-radius: 6px;\n font-size: 13px;\n font-weight: 500;\n color: #dc3545;\n cursor: pointer;\n transition: all 0.15s ease;\n\n &:hover {\n background: #dc3545;\n color: white;\n }\n\n i {\n margin-right: 6px;\n }\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 &.deprecated {\n background: #ffe4e1;\n color: #c92a2a;\n border: 1px solid #ff6b6b;\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}"] });
1935
2068
  };
1936
2069
  ComponentStudioDashboardComponent = __decorate([
1937
2070
  RegisterClass(BaseDashboard, 'ComponentStudioDashboard')
@@ -1939,15 +2072,15 @@ ComponentStudioDashboardComponent = __decorate([
1939
2072
  export { ComponentStudioDashboardComponent };
1940
2073
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ComponentStudioDashboardComponent, [{
1941
2074
  type: Component,
1942
- 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 <button\n class=\"deprecated-toggle\"\n [class.active]=\"showDeprecatedComponents\"\n (click)=\"toggleShowDeprecatedComponents()\"\n title=\"Toggle deprecated components\">\n @if (showDeprecatedComponents) {\n <i class=\"fa-solid fa-exclamation-triangle\"></i> Show Deprecated\n } @else {\n <i class=\"fa-regular fa-exclamation-triangle\"></i> Hide Deprecated\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) === 'Deprecated') {\n <span class=\"status-badge deprecated\">Deprecated</span>\n } @else if (getComponentStatus(component) === 'Published') {\n <span class=\"status-badge published\">Published</span>\n } @else {\n <span class=\"status-badge draft\">Draft</span>\n }\n </div>\n <!-- 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 .deprecated-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 i {\n font-size: 14px;\n }\n }\n\n .favorites-toggle.active {\n background: #fff3cd;\n border-color: #ffc107;\n color: #856404;\n\n i {\n color: #ffc107;\n }\n }\n\n .deprecated-toggle.active {\n background: #ffe4e1;\n border-color: #ff6b6b;\n color: #c92a2a;\n\n i {\n color: #ff6b6b;\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 &.deprecated {\n background: #ffe4e1;\n color: #c92a2a;\n border: 1px solid #ff6b6b;\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}"] }]
1943
- }], () => [{ type: i0.ChangeDetectorRef }, { type: i1.DialogService }, { type: i0.ViewContainerRef }], { fileInput: [{
2075
+ 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)=\"importFromArtifact()\">\n <i class=\"fa-solid fa-database\"></i> Import from Artifact\n </button>\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 <!-- Clean Header with Filter Button -->\n <div class=\"panel-header-top\">\n <div class=\"header-actions\">\n <button\n class=\"filter-toggle-btn\"\n [class.active]=\"isFilterPanelExpanded || GetActiveFilterCount() > 0\"\n (click)=\"ToggleFilterPanel()\"\n [title]=\"isFilterPanelExpanded ? 'Hide filters' : 'Show filters'\">\n <i class=\"fa-solid fa-sliders\"></i>\n @if (GetActiveFilterCount() > 0) {\n <span class=\"filter-count-badge\">{{ GetActiveFilterCount() }}</span>\n }\n </button>\n <span class=\"component-count\">{{ filteredComponents.length }} of {{ allComponents.length }}</span>\n </div>\n </div>\n\n <!-- Search (Always Visible) -->\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\n <!-- Collapsible Filter Panel -->\n @if (isFilterPanelExpanded) {\n <div class=\"filter-panel\">\n <div class=\"filter-panel-header\" (click)=\"ToggleFilterPanel()\">\n <span><i class=\"fa-solid fa-chevron-down\"></i> Filters</span>\n <span class=\"filter-count-text\">{{ filteredComponents.length }} of {{ allComponents.length }}</span>\n </div>\n\n <div class=\"filter-panel-content\">\n <!-- Quick Filters -->\n <div class=\"filter-section\">\n <label class=\"filter-section-label\">Quick Filters</label>\n <div class=\"filter-options\">\n <label class=\"filter-checkbox\">\n <input type=\"checkbox\"\n [checked]=\"showOnlyFavorites\"\n (change)=\"toggleShowOnlyFavorites()\">\n <span>Show favorites only</span>\n </label>\n <label class=\"filter-checkbox\">\n <input type=\"checkbox\"\n [checked]=\"!showDeprecatedComponents\"\n (change)=\"toggleShowDeprecatedComponents()\">\n <span>Hide deprecated\n @if (getDeprecatedCount() > 0) {\n <span class=\"deprecated-count\">({{ getDeprecatedCount() }} hidden)</span>\n }\n </span>\n </label>\n </div>\n </div>\n\n <!-- Category Filters -->\n @if (availableCategories.length > 0) {\n <div class=\"filter-section\">\n <label class=\"filter-section-label\">Categories</label>\n <div class=\"category-pills-grid\">\n @for (category of getVisibleCategories(); track category.name) {\n <button\n class=\"category-pill-compact\"\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 </div>\n @if (availableCategories.length > 5) {\n <button\n class=\"show-more-categories-btn\"\n (click)=\"toggleShowAllCategories()\">\n @if (showAllCategories) {\n <i class=\"fa-solid fa-chevron-up\"></i> Show less\n } @else {\n <i class=\"fa-solid fa-chevron-down\"></i> Show {{ availableCategories.length - 5 }} more\n }\n </button>\n }\n </div>\n }\n\n <!-- Clear All Button -->\n @if (GetActiveFilterCount() > 0) {\n <div class=\"filter-panel-footer\">\n <button class=\"clear-all-btn\" (click)=\"ClearAllFilters()\">\n <i class=\"fa-solid fa-times\"></i> Clear All Filters\n </button>\n </div>\n }\n </div>\n </div>\n }\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) === 'Deprecated') {\n <span class=\"status-badge deprecated\">Deprecated</span>\n } @else if (getComponentStatus(component) === 'Published') {\n <span class=\"status-badge published\">Published</span>\n } @else {\n <span class=\"status-badge draft\">Draft</span>\n }\n </div>\n <!-- 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: 12px;\n\n .header-actions {\n display: flex;\n align-items: center;\n gap: 10px;\n width: 100%;\n \n .favorites-toggle,\n .deprecated-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 i {\n font-size: 14px;\n }\n }\n\n .favorites-toggle.active {\n background: #fff3cd;\n border-color: #ffc107;\n color: #856404;\n\n i {\n color: #ffc107;\n }\n }\n\n .deprecated-toggle.active {\n background: #ffe4e1;\n border-color: #ff6b6b;\n color: #c92a2a;\n\n i {\n color: #ff6b6b;\n }\n }\n\n .count-badge {\n margin-left: 4px;\n background: #f59e0b;\n color: white;\n padding: 2px 6px;\n border-radius: 10px;\n font-size: 11px;\n font-weight: 600;\n line-height: 1;\n }\n\n .deprecated-toggle.active .count-badge {\n background: #ff6b6b;\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 margin-bottom: 12px;\n\n kendo-textbox {\n width: 100%;\n }\n\n // Reduce search input font size\n ::ng-deep .k-input-inner {\n font-size: 13px;\n }\n }\n\n // New filter toggle button\n .filter-toggle-btn {\n position: relative;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 6px 10px;\n border: 1px solid #ced4da;\n background: white;\n border-radius: 4px;\n font-size: 13px;\n color: #495057;\n cursor: pointer;\n transition: all 0.2s ease;\n\n &:hover {\n background: #e9ecef;\n border-color: #adb5bd;\n }\n\n &.active {\n background: #e7f3ff;\n border-color: #1e40af;\n color: #1e40af;\n }\n\n i {\n font-size: 13px;\n }\n\n .filter-count-badge {\n position: absolute;\n top: -6px;\n right: -6px;\n background: #1e40af;\n color: white;\n padding: 2px 6px;\n border-radius: 10px;\n font-size: 10px;\n font-weight: 600;\n line-height: 1;\n min-width: 18px;\n text-align: center;\n }\n }\n\n // Collapsible filter panel\n .filter-panel {\n background: #f8f9fa;\n border: 1px solid #dee2e6;\n border-radius: 8px;\n margin-bottom: 12px;\n overflow: hidden;\n animation: slideDown 0.2s ease;\n }\n\n @keyframes slideDown {\n from {\n opacity: 0;\n transform: translateY(-10px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n }\n\n .filter-panel-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 8px 12px;\n background: #e9ecef;\n cursor: pointer;\n font-weight: 600;\n font-size: 12px;\n color: #495057;\n user-select: none;\n\n &:hover {\n background: #dee2e6;\n }\n\n i {\n margin-right: 4px;\n font-size: 10px;\n }\n\n .filter-count-text {\n font-size: 11px;\n font-weight: 500;\n color: #6c757d;\n }\n }\n\n .filter-panel-content {\n padding: 14px;\n }\n\n .filter-section {\n margin-bottom: 16px;\n\n &:last-child {\n margin-bottom: 0;\n }\n\n .filter-section-label {\n display: block;\n font-size: 12px;\n font-weight: 600;\n color: #495057;\n margin-bottom: 8px;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n }\n\n .filter-options {\n display: flex;\n flex-direction: column;\n gap: 8px;\n }\n\n .filter-checkbox {\n display: flex;\n align-items: center;\n gap: 8px;\n cursor: pointer;\n font-size: 13px;\n color: #212529;\n padding: 6px 0;\n\n input[type=\"checkbox\"] {\n width: 16px;\n height: 16px;\n cursor: pointer;\n }\n\n span {\n user-select: none;\n }\n\n .deprecated-count {\n color: #6c757d;\n font-size: 12px;\n margin-left: 4px;\n }\n }\n\n .category-pills-grid {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n }\n\n .category-pill-compact {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 5px 10px;\n border: 2px solid #e9ecef;\n background: white;\n border-radius: 16px;\n font-size: 12px;\n font-weight: 500;\n color: #495057;\n cursor: pointer;\n transition: all 0.15s ease;\n\n &:hover {\n border-color: #adb5bd;\n transform: translateY(-1px);\n }\n\n &.active {\n border-color: var(--pill-color, #6366f1);\n background: var(--pill-color, #6366f1);\n color: white;\n }\n\n .pill-name {\n font-weight: 500;\n }\n\n .pill-count {\n font-size: 11px;\n opacity: 0.8;\n }\n }\n\n .show-more-categories-btn {\n padding: 5px 10px;\n border: 1px dashed #dee2e6;\n background: white;\n border-radius: 16px;\n font-size: 12px;\n color: #6c757d;\n cursor: pointer;\n transition: all 0.15s ease;\n\n &:hover {\n background: #f8f9fa;\n border-color: #adb5bd;\n }\n\n i {\n margin-right: 4px;\n font-size: 10px;\n }\n }\n }\n\n .filter-panel-footer {\n margin-top: 12px;\n padding-top: 12px;\n border-top: 1px solid #dee2e6;\n\n .clear-all-btn {\n width: 100%;\n padding: 8px;\n border: 1px solid #dc3545;\n background: white;\n border-radius: 6px;\n font-size: 13px;\n font-weight: 500;\n color: #dc3545;\n cursor: pointer;\n transition: all 0.15s ease;\n\n &:hover {\n background: #dc3545;\n color: white;\n }\n\n i {\n margin-right: 6px;\n }\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 &.deprecated {\n background: #ffe4e1;\n color: #c92a2a;\n border: 1px solid #ff6b6b;\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}"] }]
2076
+ }], () => [{ type: i0.ChangeDetectorRef }, { type: i1.DialogService }, { type: i0.ViewContainerRef }, { type: i2.MJNotificationService }], { fileInput: [{
1944
2077
  type: ViewChild,
1945
2078
  args: ['fileInput', { static: false }]
1946
2079
  }], onDocumentClick: [{
1947
2080
  type: HostListener,
1948
2081
  args: ['document:click', ['$event']]
1949
2082
  }] }); })();
1950
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ComponentStudioDashboardComponent, { className: "ComponentStudioDashboardComponent", filePath: "src/ComponentStudio/component-studio-dashboard.component.ts", lineNumber: 52 }); })();
2083
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ComponentStudioDashboardComponent, { className: "ComponentStudioDashboardComponent", filePath: "src/ComponentStudio/component-studio-dashboard.component.ts", lineNumber: 53 }); })();
1951
2084
  /**
1952
2085
  * Function to prevent tree shaking of the ComponentStudioDashboardComponent.
1953
2086
  */