@memberjunction/ng-dashboards 2.100.2 → 2.101.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.
- package/dist/ComponentStudio/component-studio-dashboard.component.d.ts +5 -0
- package/dist/ComponentStudio/component-studio-dashboard.component.d.ts.map +1 -1
- package/dist/ComponentStudio/component-studio-dashboard.component.js +261 -225
- package/dist/ComponentStudio/component-studio-dashboard.component.js.map +1 -1
- package/package.json +10 -10
|
@@ -29,11 +29,11 @@ const _forTrack0 = ($index, $item) => $item.name;
|
|
|
29
29
|
function _forTrack1($index, $item) { return this.getComponentId($item); }
|
|
30
30
|
const _forTrack2 = ($index, $item) => $item.title;
|
|
31
31
|
function ComponentStudioDashboardComponent_Conditional_10_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
32
|
-
i0.ɵɵelement(0, "span",
|
|
32
|
+
i0.ɵɵelement(0, "span", 37);
|
|
33
33
|
i0.ɵɵtext(1, " Show Details ");
|
|
34
34
|
} }
|
|
35
35
|
function ComponentStudioDashboardComponent_Conditional_10_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
36
|
-
i0.ɵɵelement(0, "span",
|
|
36
|
+
i0.ɵɵelement(0, "span", 38);
|
|
37
37
|
i0.ɵɵtext(1, " Hide Details ");
|
|
38
38
|
} }
|
|
39
39
|
function ComponentStudioDashboardComponent_Conditional_10_Template(rf, ctx) { if (rf & 1) {
|
|
@@ -50,40 +50,40 @@ function ComponentStudioDashboardComponent_Conditional_10_Template(rf, ctx) { if
|
|
|
50
50
|
} }
|
|
51
51
|
function ComponentStudioDashboardComponent_Conditional_16_Template(rf, ctx) { if (rf & 1) {
|
|
52
52
|
const _r4 = i0.ɵɵgetCurrentView();
|
|
53
|
-
i0.ɵɵelementStart(0, "div", 12)(1, "button",
|
|
53
|
+
i0.ɵɵelementStart(0, "div", 12)(1, "button", 39);
|
|
54
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.ɵɵelement(2, "i",
|
|
55
|
+
i0.ɵɵelement(2, "i", 40);
|
|
56
56
|
i0.ɵɵtext(3, " Import from File ");
|
|
57
57
|
i0.ɵɵelementEnd();
|
|
58
|
-
i0.ɵɵelementStart(4, "button",
|
|
58
|
+
i0.ɵɵelementStart(4, "button", 39);
|
|
59
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.ɵɵelement(5, "i",
|
|
60
|
+
i0.ɵɵelement(5, "i", 41);
|
|
61
61
|
i0.ɵɵtext(6, " Import from Text ");
|
|
62
62
|
i0.ɵɵelementEnd()();
|
|
63
63
|
} }
|
|
64
64
|
function ComponentStudioDashboardComponent_Conditional_17_Conditional_5_Template(rf, ctx) { if (rf & 1) {
|
|
65
65
|
const _r6 = i0.ɵɵgetCurrentView();
|
|
66
|
-
i0.ɵɵelementStart(0, "div", 12)(1, "button",
|
|
66
|
+
i0.ɵɵelementStart(0, "div", 12)(1, "button", 39);
|
|
67
67
|
i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_17_Conditional_5_Template_button_click_1_listener() { i0.ɵɵrestoreView(_r6); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.exportToArtifact()); });
|
|
68
|
-
i0.ɵɵelement(2, "i",
|
|
68
|
+
i0.ɵɵelement(2, "i", 44);
|
|
69
69
|
i0.ɵɵtext(3, " Export to Artifact ");
|
|
70
70
|
i0.ɵɵelementEnd();
|
|
71
|
-
i0.ɵɵelementStart(4, "button",
|
|
71
|
+
i0.ɵɵelementStart(4, "button", 39);
|
|
72
72
|
i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_17_Conditional_5_Template_button_click_4_listener() { i0.ɵɵrestoreView(_r6); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.exportToFile()); });
|
|
73
|
-
i0.ɵɵelement(5, "i",
|
|
73
|
+
i0.ɵɵelement(5, "i", 40);
|
|
74
74
|
i0.ɵɵtext(6, " Export to File ");
|
|
75
75
|
i0.ɵɵelementEnd();
|
|
76
|
-
i0.ɵɵelementStart(7, "button",
|
|
76
|
+
i0.ɵɵelementStart(7, "button", 39);
|
|
77
77
|
i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_17_Conditional_5_Template_button_click_7_listener() { i0.ɵɵrestoreView(_r6); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.exportToClipboard()); });
|
|
78
|
-
i0.ɵɵelement(8, "i",
|
|
78
|
+
i0.ɵɵelement(8, "i", 45);
|
|
79
79
|
i0.ɵɵtext(9, " Export to Clipboard ");
|
|
80
80
|
i0.ɵɵelementEnd()();
|
|
81
81
|
} }
|
|
82
82
|
function ComponentStudioDashboardComponent_Conditional_17_Template(rf, ctx) { if (rf & 1) {
|
|
83
83
|
const _r5 = i0.ɵɵgetCurrentView();
|
|
84
|
-
i0.ɵɵelementStart(0, "div",
|
|
84
|
+
i0.ɵɵelementStart(0, "div", 42)(1, "button", 9);
|
|
85
85
|
i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_17_Template_button_click_1_listener() { i0.ɵɵrestoreView(_r5); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.toggleExportDropdown()); });
|
|
86
|
-
i0.ɵɵelement(2, "span",
|
|
86
|
+
i0.ɵɵelement(2, "span", 43);
|
|
87
87
|
i0.ɵɵtext(3, " Export ");
|
|
88
88
|
i0.ɵɵelement(4, "span", 11);
|
|
89
89
|
i0.ɵɵelementEnd();
|
|
@@ -98,21 +98,29 @@ function ComponentStudioDashboardComponent_Conditional_17_Template(rf, ctx) { if
|
|
|
98
98
|
i0.ɵɵconditional(ctx_r2.exportDropdownOpen ? 5 : -1);
|
|
99
99
|
} }
|
|
100
100
|
function ComponentStudioDashboardComponent_Conditional_32_Template(rf, ctx) { if (rf & 1) {
|
|
101
|
-
i0.ɵɵelement(0, "i",
|
|
101
|
+
i0.ɵɵelement(0, "i", 46);
|
|
102
102
|
i0.ɵɵtext(1, " Favorites ");
|
|
103
103
|
} }
|
|
104
104
|
function ComponentStudioDashboardComponent_Conditional_33_Template(rf, ctx) { if (rf & 1) {
|
|
105
|
-
i0.ɵɵelement(0, "i",
|
|
105
|
+
i0.ɵɵelement(0, "i", 47);
|
|
106
106
|
i0.ɵɵtext(1, " All ");
|
|
107
107
|
} }
|
|
108
|
-
function
|
|
108
|
+
function ComponentStudioDashboardComponent_Conditional_35_Template(rf, ctx) { if (rf & 1) {
|
|
109
|
+
i0.ɵɵelement(0, "i", 48);
|
|
110
|
+
i0.ɵɵtext(1, " Show Deprecated ");
|
|
111
|
+
} }
|
|
112
|
+
function ComponentStudioDashboardComponent_Conditional_36_Template(rf, ctx) { if (rf & 1) {
|
|
113
|
+
i0.ɵɵelement(0, "i", 49);
|
|
114
|
+
i0.ɵɵtext(1, " Hide Deprecated ");
|
|
115
|
+
} }
|
|
116
|
+
function ComponentStudioDashboardComponent_Conditional_40_For_2_Template(rf, ctx) { if (rf & 1) {
|
|
109
117
|
const _r7 = i0.ɵɵgetCurrentView();
|
|
110
|
-
i0.ɵɵelementStart(0, "button",
|
|
111
|
-
i0.ɵɵlistener("click", function
|
|
112
|
-
i0.ɵɵelementStart(1, "span",
|
|
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);
|
|
113
121
|
i0.ɵɵtext(2);
|
|
114
122
|
i0.ɵɵelementEnd();
|
|
115
|
-
i0.ɵɵelementStart(3, "span",
|
|
123
|
+
i0.ɵɵelementStart(3, "span", 55);
|
|
116
124
|
i0.ɵɵtext(4);
|
|
117
125
|
i0.ɵɵelementEnd()();
|
|
118
126
|
} if (rf & 2) {
|
|
@@ -125,41 +133,41 @@ function ComponentStudioDashboardComponent_Conditional_37_For_2_Template(rf, ctx
|
|
|
125
133
|
i0.ɵɵadvance(2);
|
|
126
134
|
i0.ɵɵtextInterpolate(category_r8.count);
|
|
127
135
|
} }
|
|
128
|
-
function
|
|
129
|
-
i0.ɵɵelement(0, "i",
|
|
136
|
+
function ComponentStudioDashboardComponent_Conditional_40_Conditional_3_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
137
|
+
i0.ɵɵelement(0, "i", 57);
|
|
130
138
|
i0.ɵɵtext(1, " Less ");
|
|
131
139
|
} }
|
|
132
|
-
function
|
|
133
|
-
i0.ɵɵelement(0, "i",
|
|
140
|
+
function ComponentStudioDashboardComponent_Conditional_40_Conditional_3_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
141
|
+
i0.ɵɵelement(0, "i", 58);
|
|
134
142
|
i0.ɵɵtext(1);
|
|
135
143
|
} if (rf & 2) {
|
|
136
144
|
const ctx_r2 = i0.ɵɵnextContext(3);
|
|
137
145
|
i0.ɵɵadvance();
|
|
138
146
|
i0.ɵɵtextInterpolate1(" +", ctx_r2.availableCategories.length - 5, " more ");
|
|
139
147
|
} }
|
|
140
|
-
function
|
|
148
|
+
function ComponentStudioDashboardComponent_Conditional_40_Conditional_3_Template(rf, ctx) { if (rf & 1) {
|
|
141
149
|
const _r9 = i0.ɵɵgetCurrentView();
|
|
142
|
-
i0.ɵɵelementStart(0, "button",
|
|
143
|
-
i0.ɵɵlistener("click", function
|
|
144
|
-
i0.ɵɵtemplate(1,
|
|
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);
|
|
145
153
|
i0.ɵɵelementEnd();
|
|
146
154
|
} if (rf & 2) {
|
|
147
155
|
const ctx_r2 = i0.ɵɵnextContext(2);
|
|
148
156
|
i0.ɵɵadvance();
|
|
149
157
|
i0.ɵɵconditional(ctx_r2.showAllCategories ? 1 : 2);
|
|
150
158
|
} }
|
|
151
|
-
function
|
|
159
|
+
function ComponentStudioDashboardComponent_Conditional_40_Conditional_4_Template(rf, ctx) { if (rf & 1) {
|
|
152
160
|
const _r10 = i0.ɵɵgetCurrentView();
|
|
153
|
-
i0.ɵɵelementStart(0, "button",
|
|
154
|
-
i0.ɵɵlistener("click", function
|
|
155
|
-
i0.ɵɵelement(1, "i",
|
|
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);
|
|
156
164
|
i0.ɵɵtext(2, " Clear ");
|
|
157
165
|
i0.ɵɵelementEnd();
|
|
158
166
|
} }
|
|
159
|
-
function
|
|
160
|
-
i0.ɵɵelementStart(0, "div",
|
|
161
|
-
i0.ɵɵrepeaterCreate(1,
|
|
162
|
-
i0.ɵɵtemplate(3,
|
|
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);
|
|
163
171
|
i0.ɵɵelementEnd();
|
|
164
172
|
} if (rf & 2) {
|
|
165
173
|
const ctx_r2 = i0.ɵɵnextContext();
|
|
@@ -170,35 +178,35 @@ function ComponentStudioDashboardComponent_Conditional_37_Template(rf, ctx) { if
|
|
|
170
178
|
i0.ɵɵadvance();
|
|
171
179
|
i0.ɵɵconditional(ctx_r2.selectedCategories.size > 0 ? 4 : -1);
|
|
172
180
|
} }
|
|
173
|
-
function
|
|
174
|
-
i0.ɵɵelement(0, "i",
|
|
181
|
+
function ComponentStudioDashboardComponent_ng_template_43_Template(rf, ctx) { if (rf & 1) {
|
|
182
|
+
i0.ɵɵelement(0, "i", 61);
|
|
175
183
|
} }
|
|
176
|
-
function
|
|
177
|
-
i0.ɵɵelementStart(0, "div",
|
|
178
|
-
i0.ɵɵelement(1, "i",
|
|
184
|
+
function ComponentStudioDashboardComponent_Conditional_45_Template(rf, ctx) { if (rf & 1) {
|
|
185
|
+
i0.ɵɵelementStart(0, "div", 32);
|
|
186
|
+
i0.ɵɵelement(1, "i", 62);
|
|
179
187
|
i0.ɵɵtext(2, " Loading components... ");
|
|
180
188
|
i0.ɵɵelementEnd();
|
|
181
189
|
} }
|
|
182
|
-
function
|
|
183
|
-
i0.ɵɵelementStart(0, "div",
|
|
184
|
-
i0.ɵɵelement(1, "i",
|
|
190
|
+
function ComponentStudioDashboardComponent_Conditional_46_Template(rf, ctx) { if (rf & 1) {
|
|
191
|
+
i0.ɵɵelementStart(0, "div", 33);
|
|
192
|
+
i0.ɵɵelement(1, "i", 63);
|
|
185
193
|
i0.ɵɵtext(2, " No components found without required custom properties. ");
|
|
186
194
|
i0.ɵɵelement(3, "br");
|
|
187
195
|
i0.ɵɵelementStart(4, "small");
|
|
188
196
|
i0.ɵɵtext(5, "Components with optional custom props can be tested, but not those with required props.");
|
|
189
197
|
i0.ɵɵelementEnd()();
|
|
190
198
|
} }
|
|
191
|
-
function
|
|
192
|
-
i0.ɵɵelement(0, "i", 45);
|
|
193
|
-
} }
|
|
194
|
-
function ComponentStudioDashboardComponent_Conditional_44_For_1_Conditional_4_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
199
|
+
function ComponentStudioDashboardComponent_Conditional_47_For_1_Conditional_4_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
195
200
|
i0.ɵɵelement(0, "i", 46);
|
|
196
201
|
} }
|
|
197
|
-
function
|
|
202
|
+
function ComponentStudioDashboardComponent_Conditional_47_For_1_Conditional_4_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
203
|
+
i0.ɵɵelement(0, "i", 47);
|
|
204
|
+
} }
|
|
205
|
+
function ComponentStudioDashboardComponent_Conditional_47_For_1_Conditional_4_Template(rf, ctx) { if (rf & 1) {
|
|
198
206
|
const _r13 = i0.ɵɵgetCurrentView();
|
|
199
|
-
i0.ɵɵelementStart(0, "button",
|
|
200
|
-
i0.ɵɵlistener("click", function
|
|
201
|
-
i0.ɵɵtemplate(1,
|
|
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);
|
|
202
210
|
i0.ɵɵelementEnd();
|
|
203
211
|
} if (rf & 2) {
|
|
204
212
|
const component_r12 = i0.ɵɵnextContext().$implicit;
|
|
@@ -208,12 +216,12 @@ function ComponentStudioDashboardComponent_Conditional_44_For_1_Conditional_4_Te
|
|
|
208
216
|
i0.ɵɵadvance();
|
|
209
217
|
i0.ɵɵconditional(ctx_r2.isFavorite(component_r12) ? 1 : 2);
|
|
210
218
|
} }
|
|
211
|
-
function
|
|
212
|
-
i0.ɵɵelement(0, "i",
|
|
219
|
+
function ComponentStudioDashboardComponent_Conditional_47_For_1_Conditional_8_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
220
|
+
i0.ɵɵelement(0, "i", 41);
|
|
213
221
|
i0.ɵɵtext(1, " Text Import ");
|
|
214
222
|
} }
|
|
215
|
-
function
|
|
216
|
-
i0.ɵɵelement(0, "i",
|
|
223
|
+
function ComponentStudioDashboardComponent_Conditional_47_For_1_Conditional_8_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
224
|
+
i0.ɵɵelement(0, "i", 40);
|
|
217
225
|
i0.ɵɵtext(1);
|
|
218
226
|
} if (rf & 2) {
|
|
219
227
|
const component_r12 = i0.ɵɵnextContext(2).$implicit;
|
|
@@ -221,9 +229,9 @@ function ComponentStudioDashboardComponent_Conditional_44_For_1_Conditional_8_Co
|
|
|
221
229
|
i0.ɵɵadvance();
|
|
222
230
|
i0.ɵɵtextInterpolate1(" ", ctx_r2.getComponentFilename(component_r12), " ");
|
|
223
231
|
} }
|
|
224
|
-
function
|
|
225
|
-
i0.ɵɵelementStart(0, "span",
|
|
226
|
-
i0.ɵɵtemplate(1,
|
|
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);
|
|
227
235
|
i0.ɵɵelementEnd();
|
|
228
236
|
} if (rf & 2) {
|
|
229
237
|
const component_r12 = i0.ɵɵnextContext().$implicit;
|
|
@@ -232,41 +240,46 @@ function ComponentStudioDashboardComponent_Conditional_44_For_1_Conditional_8_Te
|
|
|
232
240
|
i0.ɵɵadvance();
|
|
233
241
|
i0.ɵɵconditional(ctx_r2.getComponentStatus(component_r12) === "Text" ? 1 : 2);
|
|
234
242
|
} }
|
|
235
|
-
function
|
|
236
|
-
i0.ɵɵelementStart(0, "span",
|
|
243
|
+
function ComponentStudioDashboardComponent_Conditional_47_For_1_Conditional_14_Conditional_0_Template(rf, ctx) { if (rf & 1) {
|
|
244
|
+
i0.ɵɵelementStart(0, "span", 85);
|
|
237
245
|
i0.ɵɵtext(1, "Text");
|
|
238
246
|
i0.ɵɵelementEnd();
|
|
239
247
|
} }
|
|
240
|
-
function
|
|
241
|
-
i0.ɵɵelementStart(0, "span",
|
|
248
|
+
function ComponentStudioDashboardComponent_Conditional_47_For_1_Conditional_14_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
249
|
+
i0.ɵɵelementStart(0, "span", 86);
|
|
242
250
|
i0.ɵɵtext(1, "File");
|
|
243
251
|
i0.ɵɵelementEnd();
|
|
244
252
|
} }
|
|
245
|
-
function
|
|
246
|
-
i0.ɵɵtemplate(0,
|
|
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);
|
|
247
255
|
} if (rf & 2) {
|
|
248
256
|
const component_r12 = i0.ɵɵnextContext().$implicit;
|
|
249
257
|
const ctx_r2 = i0.ɵɵnextContext(2);
|
|
250
258
|
i0.ɵɵconditional(ctx_r2.getComponentStatus(component_r12) === "Text" ? 0 : 1);
|
|
251
259
|
} }
|
|
252
|
-
function
|
|
253
|
-
i0.ɵɵelementStart(0, "span",
|
|
260
|
+
function ComponentStudioDashboardComponent_Conditional_47_For_1_Conditional_15_Template(rf, ctx) { if (rf & 1) {
|
|
261
|
+
i0.ɵɵelementStart(0, "span", 76);
|
|
262
|
+
i0.ɵɵtext(1, "Deprecated");
|
|
263
|
+
i0.ɵɵelementEnd();
|
|
264
|
+
} }
|
|
265
|
+
function ComponentStudioDashboardComponent_Conditional_47_For_1_Conditional_16_Template(rf, ctx) { if (rf & 1) {
|
|
266
|
+
i0.ɵɵelementStart(0, "span", 77);
|
|
254
267
|
i0.ɵɵtext(1, "Published");
|
|
255
268
|
i0.ɵɵelementEnd();
|
|
256
269
|
} }
|
|
257
|
-
function
|
|
258
|
-
i0.ɵɵelementStart(0, "span",
|
|
270
|
+
function ComponentStudioDashboardComponent_Conditional_47_For_1_Conditional_17_Template(rf, ctx) { if (rf & 1) {
|
|
271
|
+
i0.ɵɵelementStart(0, "span", 78);
|
|
259
272
|
i0.ɵɵtext(1, "Draft");
|
|
260
273
|
i0.ɵɵelementEnd();
|
|
261
274
|
} }
|
|
262
|
-
function
|
|
263
|
-
i0.ɵɵelement(0, "i",
|
|
275
|
+
function ComponentStudioDashboardComponent_Conditional_47_For_1_Conditional_23_Template(rf, ctx) { if (rf & 1) {
|
|
276
|
+
i0.ɵɵelement(0, "i", 57);
|
|
264
277
|
} }
|
|
265
|
-
function
|
|
266
|
-
i0.ɵɵelement(0, "i",
|
|
278
|
+
function ComponentStudioDashboardComponent_Conditional_47_For_1_Conditional_24_Template(rf, ctx) { if (rf & 1) {
|
|
279
|
+
i0.ɵɵelement(0, "i", 58);
|
|
267
280
|
} }
|
|
268
|
-
function
|
|
269
|
-
i0.ɵɵelementStart(0, "div",
|
|
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");
|
|
270
283
|
i0.ɵɵtext(2, "Description");
|
|
271
284
|
i0.ɵɵelementEnd();
|
|
272
285
|
i0.ɵɵelementStart(3, "p");
|
|
@@ -278,11 +291,11 @@ function ComponentStudioDashboardComponent_Conditional_44_For_1_Conditional_24_C
|
|
|
278
291
|
i0.ɵɵadvance(4);
|
|
279
292
|
i0.ɵɵtextInterpolate(ctx_r2.getComponentDescription(component_r12));
|
|
280
293
|
} }
|
|
281
|
-
function
|
|
282
|
-
i0.ɵɵelementStart(0, "div",
|
|
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);
|
|
283
296
|
i0.ɵɵtext(2, "Loaded:");
|
|
284
297
|
i0.ɵɵelementEnd();
|
|
285
|
-
i0.ɵɵelementStart(3, "span",
|
|
298
|
+
i0.ɵɵelementStart(3, "span", 91);
|
|
286
299
|
i0.ɵɵtext(4);
|
|
287
300
|
i0.ɵɵpipe(5, "date");
|
|
288
301
|
i0.ɵɵelementEnd()();
|
|
@@ -292,11 +305,11 @@ function ComponentStudioDashboardComponent_Conditional_44_For_1_Conditional_24_C
|
|
|
292
305
|
i0.ɵɵadvance(4);
|
|
293
306
|
i0.ɵɵtextInterpolate(i0.ɵɵpipeBind2(5, 1, ctx_r2.getComponentLoadedAt(component_r12), "short"));
|
|
294
307
|
} }
|
|
295
|
-
function
|
|
296
|
-
i0.ɵɵelementStart(0, "div",
|
|
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);
|
|
297
310
|
i0.ɵɵtext(2, "Updated:");
|
|
298
311
|
i0.ɵɵelementEnd();
|
|
299
|
-
i0.ɵɵelementStart(3, "span",
|
|
312
|
+
i0.ɵɵelementStart(3, "span", 91);
|
|
300
313
|
i0.ɵɵtext(4);
|
|
301
314
|
i0.ɵɵpipe(5, "date");
|
|
302
315
|
i0.ɵɵelementEnd()();
|
|
@@ -306,64 +319,64 @@ function ComponentStudioDashboardComponent_Conditional_44_For_1_Conditional_24_C
|
|
|
306
319
|
i0.ɵɵadvance(4);
|
|
307
320
|
i0.ɵɵtextInterpolate(i0.ɵɵpipeBind2(5, 1, ctx_r2.getComponentUpdatedAt(component_r12), "short"));
|
|
308
321
|
} }
|
|
309
|
-
function
|
|
322
|
+
function ComponentStudioDashboardComponent_Conditional_47_For_1_Conditional_25_Conditional_24_Template(rf, ctx) { if (rf & 1) {
|
|
310
323
|
const _r14 = i0.ɵɵgetCurrentView();
|
|
311
324
|
i0.ɵɵelementStart(0, "button", 9);
|
|
312
|
-
i0.ɵɵlistener("click", function
|
|
313
|
-
i0.ɵɵelement(1, "span",
|
|
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);
|
|
314
327
|
i0.ɵɵtext(2, " Stop Component ");
|
|
315
328
|
i0.ɵɵelementEnd();
|
|
316
329
|
} if (rf & 2) {
|
|
317
330
|
i0.ɵɵproperty("themeColor", "error");
|
|
318
331
|
} }
|
|
319
|
-
function
|
|
332
|
+
function ComponentStudioDashboardComponent_Conditional_47_For_1_Conditional_25_Conditional_25_Template(rf, ctx) { if (rf & 1) {
|
|
320
333
|
const _r15 = i0.ɵɵgetCurrentView();
|
|
321
|
-
i0.ɵɵelementStart(0, "button",
|
|
322
|
-
i0.ɵɵlistener("click", function
|
|
323
|
-
i0.ɵɵelement(1, "span",
|
|
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);
|
|
324
337
|
i0.ɵɵtext(2, " Switch to This Component ");
|
|
325
338
|
i0.ɵɵelementEnd();
|
|
326
339
|
} if (rf & 2) {
|
|
327
340
|
i0.ɵɵproperty("themeColor", "base");
|
|
328
341
|
} }
|
|
329
|
-
function
|
|
342
|
+
function ComponentStudioDashboardComponent_Conditional_47_For_1_Conditional_25_Conditional_26_Template(rf, ctx) { if (rf & 1) {
|
|
330
343
|
const _r16 = i0.ɵɵgetCurrentView();
|
|
331
344
|
i0.ɵɵelementStart(0, "button", 9);
|
|
332
|
-
i0.ɵɵlistener("click", function
|
|
333
|
-
i0.ɵɵelement(1, "span",
|
|
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);
|
|
334
347
|
i0.ɵɵtext(2, " Run Component ");
|
|
335
348
|
i0.ɵɵelementEnd();
|
|
336
349
|
} if (rf & 2) {
|
|
337
350
|
i0.ɵɵproperty("themeColor", "primary");
|
|
338
351
|
} }
|
|
339
|
-
function
|
|
340
|
-
i0.ɵɵelementStart(0, "div",
|
|
341
|
-
i0.ɵɵtemplate(1,
|
|
342
|
-
i0.ɵɵelementStart(2, "div",
|
|
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");
|
|
343
356
|
i0.ɵɵtext(4, "Component Info");
|
|
344
357
|
i0.ɵɵelementEnd();
|
|
345
|
-
i0.ɵɵelementStart(5, "div",
|
|
358
|
+
i0.ɵɵelementStart(5, "div", 88)(6, "div", 89)(7, "span", 90);
|
|
346
359
|
i0.ɵɵtext(8, "Type:");
|
|
347
360
|
i0.ɵɵelementEnd();
|
|
348
|
-
i0.ɵɵelementStart(9, "span",
|
|
361
|
+
i0.ɵɵelementStart(9, "span", 91);
|
|
349
362
|
i0.ɵɵtext(10);
|
|
350
363
|
i0.ɵɵelementEnd()();
|
|
351
|
-
i0.ɵɵelementStart(11, "div",
|
|
364
|
+
i0.ɵɵelementStart(11, "div", 89)(12, "span", 90);
|
|
352
365
|
i0.ɵɵtext(13, "Version:");
|
|
353
366
|
i0.ɵɵelementEnd();
|
|
354
|
-
i0.ɵɵelementStart(14, "span",
|
|
367
|
+
i0.ɵɵelementStart(14, "span", 91);
|
|
355
368
|
i0.ɵɵtext(15);
|
|
356
369
|
i0.ɵɵelementEnd()();
|
|
357
|
-
i0.ɵɵelementStart(16, "div",
|
|
370
|
+
i0.ɵɵelementStart(16, "div", 89)(17, "span", 90);
|
|
358
371
|
i0.ɵɵtext(18, "Status:");
|
|
359
372
|
i0.ɵɵelementEnd();
|
|
360
|
-
i0.ɵɵelementStart(19, "span",
|
|
373
|
+
i0.ɵɵelementStart(19, "span", 91);
|
|
361
374
|
i0.ɵɵtext(20);
|
|
362
375
|
i0.ɵɵelementEnd()();
|
|
363
|
-
i0.ɵɵtemplate(21,
|
|
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);
|
|
364
377
|
i0.ɵɵelementEnd()();
|
|
365
|
-
i0.ɵɵelementStart(23, "div",
|
|
366
|
-
i0.ɵɵtemplate(24,
|
|
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);
|
|
367
380
|
i0.ɵɵelementEnd()();
|
|
368
381
|
} if (rf & 2) {
|
|
369
382
|
const component_r12 = i0.ɵɵnextContext().$implicit;
|
|
@@ -381,34 +394,34 @@ function ComponentStudioDashboardComponent_Conditional_44_For_1_Conditional_24_T
|
|
|
381
394
|
i0.ɵɵadvance(3);
|
|
382
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);
|
|
383
396
|
} }
|
|
384
|
-
function
|
|
397
|
+
function ComponentStudioDashboardComponent_Conditional_47_For_1_Template(rf, ctx) { if (rf & 1) {
|
|
385
398
|
const _r11 = i0.ɵɵgetCurrentView();
|
|
386
|
-
i0.ɵɵelementStart(0, "div",
|
|
387
|
-
i0.ɵɵlistener("click", function
|
|
388
|
-
i0.ɵɵelementStart(2, "div",
|
|
389
|
-
i0.ɵɵelement(3, "i",
|
|
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);
|
|
390
403
|
i0.ɵɵelementEnd();
|
|
391
|
-
i0.ɵɵtemplate(4,
|
|
392
|
-
i0.ɵɵelementStart(5, "div",
|
|
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);
|
|
393
406
|
i0.ɵɵtext(7);
|
|
394
|
-
i0.ɵɵtemplate(8,
|
|
407
|
+
i0.ɵɵtemplate(8, ComponentStudioDashboardComponent_Conditional_47_For_1_Conditional_8_Template, 3, 2, "span", 72);
|
|
395
408
|
i0.ɵɵelementEnd();
|
|
396
|
-
i0.ɵɵelementStart(9, "div",
|
|
409
|
+
i0.ɵɵelementStart(9, "div", 73)(10, "span", 74);
|
|
397
410
|
i0.ɵɵtext(11);
|
|
398
411
|
i0.ɵɵelementEnd();
|
|
399
|
-
i0.ɵɵelementStart(12, "span",
|
|
412
|
+
i0.ɵɵelementStart(12, "span", 75);
|
|
400
413
|
i0.ɵɵtext(13);
|
|
401
414
|
i0.ɵɵelementEnd();
|
|
402
|
-
i0.ɵɵtemplate(14,
|
|
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);
|
|
403
416
|
i0.ɵɵelementEnd();
|
|
404
|
-
i0.ɵɵelementStart(
|
|
405
|
-
i0.ɵɵelement(
|
|
406
|
-
i0.ɵɵtext(
|
|
417
|
+
i0.ɵɵelementStart(18, "div", 79)(19, "span", 80);
|
|
418
|
+
i0.ɵɵelement(20, "i", 81);
|
|
419
|
+
i0.ɵɵtext(21);
|
|
407
420
|
i0.ɵɵelementEnd()()();
|
|
408
|
-
i0.ɵɵelementStart(
|
|
409
|
-
i0.ɵɵtemplate(
|
|
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);
|
|
410
423
|
i0.ɵɵelementEnd()();
|
|
411
|
-
i0.ɵɵtemplate(
|
|
424
|
+
i0.ɵɵtemplate(25, ComponentStudioDashboardComponent_Conditional_47_For_1_Conditional_25_Template, 27, 6, "div", 83);
|
|
412
425
|
i0.ɵɵelementEnd();
|
|
413
426
|
} if (rf & 2) {
|
|
414
427
|
const component_r12 = ctx.$implicit;
|
|
@@ -429,25 +442,25 @@ function ComponentStudioDashboardComponent_Conditional_44_For_1_Template(rf, ctx
|
|
|
429
442
|
i0.ɵɵadvance(2);
|
|
430
443
|
i0.ɵɵtextInterpolate1("v", ctx_r2.getComponentVersion(component_r12), "");
|
|
431
444
|
i0.ɵɵadvance();
|
|
432
|
-
i0.ɵɵconditional(ctx_r2.isFileLoadedComponent(component_r12) ? 14 : ctx_r2.getComponentStatus(component_r12) === "
|
|
433
|
-
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);
|
|
446
|
+
i0.ɵɵadvance(5);
|
|
434
447
|
i0.ɵɵstyleProp("background-color", ctx_r2.getNamespaceColor(ctx_r2.getComponentNamespace(component_r12)));
|
|
435
448
|
i0.ɵɵproperty("title", ctx_r2.getComponentNamespace(component_r12) || "Uncategorized");
|
|
436
449
|
i0.ɵɵadvance(2);
|
|
437
450
|
i0.ɵɵtextInterpolate1(" ", ctx_r2.formatNamespace(ctx_r2.getComponentNamespace(component_r12)), " ");
|
|
438
451
|
i0.ɵɵadvance(2);
|
|
439
|
-
i0.ɵɵconditional(ctx_r2.expandedComponent && ctx_r2.getComponentId(ctx_r2.expandedComponent) === ctx_r2.getComponentId(component_r12) ?
|
|
452
|
+
i0.ɵɵconditional(ctx_r2.expandedComponent && ctx_r2.getComponentId(ctx_r2.expandedComponent) === ctx_r2.getComponentId(component_r12) ? 23 : 24);
|
|
440
453
|
i0.ɵɵadvance(2);
|
|
441
|
-
i0.ɵɵconditional(ctx_r2.expandedComponent && ctx_r2.getComponentId(ctx_r2.expandedComponent) === ctx_r2.getComponentId(component_r12) ?
|
|
454
|
+
i0.ɵɵconditional(ctx_r2.expandedComponent && ctx_r2.getComponentId(ctx_r2.expandedComponent) === ctx_r2.getComponentId(component_r12) ? 25 : -1);
|
|
442
455
|
} }
|
|
443
|
-
function
|
|
444
|
-
i0.ɵɵrepeaterCreate(0,
|
|
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);
|
|
445
458
|
} if (rf & 2) {
|
|
446
459
|
const ctx_r2 = i0.ɵɵnextContext();
|
|
447
460
|
i0.ɵɵrepeater(ctx_r2.filteredComponents);
|
|
448
461
|
} }
|
|
449
|
-
function
|
|
450
|
-
i0.ɵɵelementStart(0, "details",
|
|
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");
|
|
451
464
|
i0.ɵɵtext(2, "Technical Details (click to expand)");
|
|
452
465
|
i0.ɵɵelementEnd();
|
|
453
466
|
i0.ɵɵelementStart(3, "pre");
|
|
@@ -458,21 +471,21 @@ function ComponentStudioDashboardComponent_Conditional_47_Conditional_3_Conditio
|
|
|
458
471
|
i0.ɵɵadvance(4);
|
|
459
472
|
i0.ɵɵtextInterpolate(ctx_r2.formatTechnicalDetails(ctx_r2.currentError.technicalDetails));
|
|
460
473
|
} }
|
|
461
|
-
function
|
|
474
|
+
function ComponentStudioDashboardComponent_Conditional_50_Conditional_3_Conditional_0_Template(rf, ctx) { if (rf & 1) {
|
|
462
475
|
const _r18 = i0.ɵɵgetCurrentView();
|
|
463
|
-
i0.ɵɵelementStart(0, "div",
|
|
464
|
-
i0.ɵɵelement(3, "i",
|
|
476
|
+
i0.ɵɵelementStart(0, "div", 103)(1, "div", 105)(2, "div", 106);
|
|
477
|
+
i0.ɵɵelement(3, "i", 48);
|
|
465
478
|
i0.ɵɵelementStart(4, "h3");
|
|
466
479
|
i0.ɵɵtext(5, "Component Error");
|
|
467
480
|
i0.ɵɵelementEnd();
|
|
468
|
-
i0.ɵɵelementStart(6, "button",
|
|
469
|
-
i0.ɵɵlistener("click", function
|
|
470
|
-
i0.ɵɵelement(7, "i",
|
|
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);
|
|
471
484
|
i0.ɵɵelementEnd()();
|
|
472
|
-
i0.ɵɵelementStart(8, "p",
|
|
485
|
+
i0.ɵɵelementStart(8, "p", 109);
|
|
473
486
|
i0.ɵɵtext(9, " The component could not be rendered due to the following error: ");
|
|
474
487
|
i0.ɵɵelementEnd();
|
|
475
|
-
i0.ɵɵelementStart(10, "div",
|
|
488
|
+
i0.ɵɵelementStart(10, "div", 110)(11, "strong");
|
|
476
489
|
i0.ɵɵtext(12, "Error Type:");
|
|
477
490
|
i0.ɵɵelementEnd();
|
|
478
491
|
i0.ɵɵtext(13);
|
|
@@ -481,9 +494,9 @@ function ComponentStudioDashboardComponent_Conditional_47_Conditional_3_Conditio
|
|
|
481
494
|
i0.ɵɵtext(16, "Message:");
|
|
482
495
|
i0.ɵɵelementEnd();
|
|
483
496
|
i0.ɵɵtext(17);
|
|
484
|
-
i0.ɵɵtemplate(18,
|
|
497
|
+
i0.ɵɵtemplate(18, ComponentStudioDashboardComponent_Conditional_50_Conditional_3_Conditional_0_Conditional_18_Template, 5, 1, "details", 111);
|
|
485
498
|
i0.ɵɵelementEnd();
|
|
486
|
-
i0.ɵɵelementStart(19, "div",
|
|
499
|
+
i0.ɵɵelementStart(19, "div", 112)(20, "strong");
|
|
487
500
|
i0.ɵɵtext(21, "What to do:");
|
|
488
501
|
i0.ɵɵelementEnd();
|
|
489
502
|
i0.ɵɵelementStart(22, "ol")(23, "li");
|
|
@@ -498,14 +511,14 @@ function ComponentStudioDashboardComponent_Conditional_47_Conditional_3_Conditio
|
|
|
498
511
|
i0.ɵɵelementStart(29, "li");
|
|
499
512
|
i0.ɵɵtext(30, "Contact your system administrator if the issue persists");
|
|
500
513
|
i0.ɵɵelementEnd()()();
|
|
501
|
-
i0.ɵɵelementStart(31, "div",
|
|
502
|
-
i0.ɵɵlistener("click", function
|
|
503
|
-
i0.ɵɵelement(33, "span",
|
|
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);
|
|
504
517
|
i0.ɵɵtext(34, " Retry ");
|
|
505
518
|
i0.ɵɵelementEnd();
|
|
506
519
|
i0.ɵɵelementStart(35, "button", 9);
|
|
507
|
-
i0.ɵɵlistener("click", function
|
|
508
|
-
i0.ɵɵelement(36, "span",
|
|
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);
|
|
509
522
|
i0.ɵɵtext(37, " Stop ");
|
|
510
523
|
i0.ɵɵelementEnd()()()();
|
|
511
524
|
} if (rf & 2) {
|
|
@@ -519,34 +532,34 @@ function ComponentStudioDashboardComponent_Conditional_47_Conditional_3_Conditio
|
|
|
519
532
|
i0.ɵɵadvance(17);
|
|
520
533
|
i0.ɵɵproperty("themeColor", "error");
|
|
521
534
|
} }
|
|
522
|
-
function
|
|
535
|
+
function ComponentStudioDashboardComponent_Conditional_50_Conditional_3_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
523
536
|
const _r19 = i0.ɵɵgetCurrentView();
|
|
524
|
-
i0.ɵɵelementStart(0, "mj-react-component",
|
|
525
|
-
i0.ɵɵlistener("componentEvent", function
|
|
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)); });
|
|
526
539
|
i0.ɵɵelementEnd();
|
|
527
540
|
} if (rf & 2) {
|
|
528
541
|
const ctx_r2 = i0.ɵɵnextContext(3);
|
|
529
542
|
i0.ɵɵproperty("component", ctx_r2.componentSpec);
|
|
530
543
|
} }
|
|
531
|
-
function
|
|
532
|
-
i0.ɵɵtemplate(0,
|
|
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);
|
|
533
546
|
} if (rf & 2) {
|
|
534
547
|
const ctx_r2 = i0.ɵɵnextContext(2);
|
|
535
548
|
i0.ɵɵconditional(ctx_r2.currentError ? 0 : 1);
|
|
536
549
|
} }
|
|
537
|
-
function
|
|
550
|
+
function ComponentStudioDashboardComponent_Conditional_50_Conditional_4_Template(rf, ctx) { if (rf & 1) {
|
|
538
551
|
const _r20 = i0.ɵɵgetCurrentView();
|
|
539
|
-
i0.ɵɵelementStart(0, "div",
|
|
540
|
-
i0.ɵɵelement(1, "i",
|
|
552
|
+
i0.ɵɵelementStart(0, "div", 99);
|
|
553
|
+
i0.ɵɵelement(1, "i", 117);
|
|
541
554
|
i0.ɵɵelementStart(2, "h3");
|
|
542
555
|
i0.ɵɵtext(3);
|
|
543
556
|
i0.ɵɵelementEnd();
|
|
544
557
|
i0.ɵɵelementStart(4, "p");
|
|
545
558
|
i0.ɵɵtext(5);
|
|
546
559
|
i0.ɵɵelementEnd();
|
|
547
|
-
i0.ɵɵelementStart(6, "button",
|
|
548
|
-
i0.ɵɵlistener("click", function
|
|
549
|
-
i0.ɵɵelement(7, "span",
|
|
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);
|
|
550
563
|
i0.ɵɵtext(8, " Run Component ");
|
|
551
564
|
i0.ɵɵelementEnd()();
|
|
552
565
|
} if (rf & 2) {
|
|
@@ -558,43 +571,43 @@ function ComponentStudioDashboardComponent_Conditional_47_Conditional_4_Template
|
|
|
558
571
|
i0.ɵɵadvance();
|
|
559
572
|
i0.ɵɵproperty("themeColor", "primary")("size", "large");
|
|
560
573
|
} }
|
|
561
|
-
function
|
|
574
|
+
function ComponentStudioDashboardComponent_Conditional_50_ng_template_9_Conditional_6_Template(rf, ctx) { if (rf & 1) {
|
|
562
575
|
const _r22 = i0.ɵɵgetCurrentView();
|
|
563
576
|
i0.ɵɵelementStart(0, "button", 9);
|
|
564
|
-
i0.ɵɵlistener("click", function
|
|
565
|
-
i0.ɵɵelement(1, "span",
|
|
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);
|
|
566
579
|
i0.ɵɵtext(2, " Apply Changes ");
|
|
567
580
|
i0.ɵɵelementEnd();
|
|
568
|
-
i0.ɵɵelementStart(3, "button",
|
|
569
|
-
i0.ɵɵlistener("click", function
|
|
570
|
-
i0.ɵɵelement(4, "span",
|
|
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);
|
|
571
584
|
i0.ɵɵtext(5, " Cancel ");
|
|
572
585
|
i0.ɵɵelementEnd();
|
|
573
586
|
} if (rf & 2) {
|
|
574
587
|
i0.ɵɵproperty("themeColor", "primary");
|
|
575
588
|
} }
|
|
576
|
-
function
|
|
589
|
+
function ComponentStudioDashboardComponent_Conditional_50_ng_template_9_Conditional_7_Template(rf, ctx) { if (rf & 1) {
|
|
577
590
|
const _r23 = i0.ɵɵgetCurrentView();
|
|
578
591
|
i0.ɵɵelementStart(0, "button", 9);
|
|
579
|
-
i0.ɵɵlistener("click", function
|
|
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()); });
|
|
580
593
|
i0.ɵɵelement(1, "span", 15);
|
|
581
594
|
i0.ɵɵtext(2, " Refresh Component ");
|
|
582
595
|
i0.ɵɵelementEnd();
|
|
583
596
|
} if (rf & 2) {
|
|
584
597
|
i0.ɵɵproperty("themeColor", "info");
|
|
585
598
|
} }
|
|
586
|
-
function
|
|
599
|
+
function ComponentStudioDashboardComponent_Conditional_50_ng_template_9_Template(rf, ctx) { if (rf & 1) {
|
|
587
600
|
const _r21 = i0.ɵɵgetCurrentView();
|
|
588
|
-
i0.ɵɵelementStart(0, "div",
|
|
589
|
-
i0.ɵɵelement(3, "i",
|
|
601
|
+
i0.ɵɵelementStart(0, "div", 119)(1, "div", 120)(2, "h4");
|
|
602
|
+
i0.ɵɵelement(3, "i", 121);
|
|
590
603
|
i0.ɵɵtext(4, " Component Specification (JSON)");
|
|
591
604
|
i0.ɵɵelementEnd();
|
|
592
|
-
i0.ɵɵelementStart(5, "div",
|
|
593
|
-
i0.ɵɵtemplate(6,
|
|
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);
|
|
594
607
|
i0.ɵɵelementEnd()();
|
|
595
|
-
i0.ɵɵelementStart(8, "div",
|
|
596
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
597
|
-
i0.ɵɵlistener("ngModelChange", function
|
|
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)); });
|
|
598
611
|
i0.ɵɵelementEnd()()();
|
|
599
612
|
} if (rf & 2) {
|
|
600
613
|
const ctx_r2 = i0.ɵɵnextContext(2);
|
|
@@ -606,58 +619,58 @@ function ComponentStudioDashboardComponent_Conditional_47_ng_template_9_Template
|
|
|
606
619
|
i0.ɵɵtwoWayProperty("ngModel", ctx_r2.editableSpec);
|
|
607
620
|
i0.ɵɵproperty("language", "json")("readonly", false);
|
|
608
621
|
} }
|
|
609
|
-
function
|
|
622
|
+
function ComponentStudioDashboardComponent_Conditional_50_ng_template_11_Conditional_6_Template(rf, ctx) { if (rf & 1) {
|
|
610
623
|
const _r24 = i0.ɵɵgetCurrentView();
|
|
611
624
|
i0.ɵɵelementStart(0, "button", 9);
|
|
612
|
-
i0.ɵɵlistener("click", function
|
|
613
|
-
i0.ɵɵelement(1, "span",
|
|
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);
|
|
614
627
|
i0.ɵɵtext(2, " Apply Changes ");
|
|
615
628
|
i0.ɵɵelementEnd();
|
|
616
|
-
i0.ɵɵelementStart(3, "button",
|
|
617
|
-
i0.ɵɵlistener("click", function
|
|
618
|
-
i0.ɵɵelement(4, "span",
|
|
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);
|
|
619
632
|
i0.ɵɵtext(5, " Cancel ");
|
|
620
633
|
i0.ɵɵelementEnd();
|
|
621
634
|
} if (rf & 2) {
|
|
622
635
|
i0.ɵɵproperty("themeColor", "primary");
|
|
623
636
|
} }
|
|
624
|
-
function
|
|
637
|
+
function ComponentStudioDashboardComponent_Conditional_50_ng_template_11_Conditional_7_Template(rf, ctx) { if (rf & 1) {
|
|
625
638
|
const _r25 = i0.ɵɵgetCurrentView();
|
|
626
639
|
i0.ɵɵelementStart(0, "button", 9);
|
|
627
|
-
i0.ɵɵlistener("click", function
|
|
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()); });
|
|
628
641
|
i0.ɵɵelement(1, "span", 15);
|
|
629
642
|
i0.ɵɵtext(2, " Refresh Component ");
|
|
630
643
|
i0.ɵɵelementEnd();
|
|
631
644
|
} if (rf & 2) {
|
|
632
645
|
i0.ɵɵproperty("themeColor", "info");
|
|
633
646
|
} }
|
|
634
|
-
function
|
|
647
|
+
function ComponentStudioDashboardComponent_Conditional_50_ng_template_11_For_11_ng_template_1_Template(rf, ctx) { if (rf & 1) {
|
|
635
648
|
const _r26 = i0.ɵɵgetCurrentView();
|
|
636
|
-
i0.ɵɵelementStart(0, "mj-code-editor",
|
|
637
|
-
i0.ɵɵlistener("ngModelChange", function
|
|
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)); });
|
|
638
651
|
i0.ɵɵelementEnd();
|
|
639
652
|
} if (rf & 2) {
|
|
640
653
|
const section_r28 = i0.ɵɵnextContext().$implicit;
|
|
641
654
|
i0.ɵɵproperty("ngModel", section_r28.code)("language", "javascript")("readonly", false);
|
|
642
655
|
} }
|
|
643
|
-
function
|
|
644
|
-
i0.ɵɵelementStart(0, "kendo-panelbar-item",
|
|
645
|
-
i0.ɵɵtemplate(1,
|
|
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);
|
|
646
659
|
i0.ɵɵelementEnd();
|
|
647
660
|
} if (rf & 2) {
|
|
648
661
|
const section_r28 = ctx.$implicit;
|
|
649
662
|
i0.ɵɵproperty("title", section_r28.title)("expanded", section_r28.expanded);
|
|
650
663
|
} }
|
|
651
|
-
function
|
|
652
|
-
i0.ɵɵelementStart(0, "div",
|
|
653
|
-
i0.ɵɵelement(3, "i",
|
|
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);
|
|
654
667
|
i0.ɵɵtext(4, " Component Code (JavaScript/React)");
|
|
655
668
|
i0.ɵɵelementEnd();
|
|
656
|
-
i0.ɵɵelementStart(5, "div",
|
|
657
|
-
i0.ɵɵtemplate(6,
|
|
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);
|
|
658
671
|
i0.ɵɵelementEnd()();
|
|
659
|
-
i0.ɵɵelementStart(8, "div",
|
|
660
|
-
i0.ɵɵrepeaterCreate(10,
|
|
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);
|
|
661
674
|
i0.ɵɵelementEnd()()();
|
|
662
675
|
} if (rf & 2) {
|
|
663
676
|
const ctx_r2 = i0.ɵɵnextContext(2);
|
|
@@ -668,21 +681,21 @@ function ComponentStudioDashboardComponent_Conditional_47_ng_template_11_Templat
|
|
|
668
681
|
i0.ɵɵadvance(3);
|
|
669
682
|
i0.ɵɵrepeater(ctx_r2.getComponentCodeSections());
|
|
670
683
|
} }
|
|
671
|
-
function
|
|
672
|
-
function
|
|
684
|
+
function ComponentStudioDashboardComponent_Conditional_50_Conditional_12_Template(rf, ctx) { }
|
|
685
|
+
function ComponentStudioDashboardComponent_Conditional_50_Template(rf, ctx) { if (rf & 1) {
|
|
673
686
|
const _r17 = i0.ɵɵgetCurrentView();
|
|
674
|
-
i0.ɵɵelementStart(0, "kendo-splitter", 17)(1, "kendo-splitter-pane",
|
|
675
|
-
i0.ɵɵtemplate(3,
|
|
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);
|
|
676
689
|
i0.ɵɵelementEnd()();
|
|
677
|
-
i0.ɵɵelementStart(5, "kendo-splitter-pane",
|
|
678
|
-
i0.ɵɵlistener("tabSelect", function
|
|
679
|
-
i0.ɵɵelementStart(8, "kendo-tabstrip-tab",
|
|
680
|
-
i0.ɵɵtemplate(9,
|
|
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);
|
|
681
694
|
i0.ɵɵelementEnd();
|
|
682
|
-
i0.ɵɵelementStart(10, "kendo-tabstrip-tab",
|
|
683
|
-
i0.ɵɵtemplate(11,
|
|
695
|
+
i0.ɵɵelementStart(10, "kendo-tabstrip-tab", 101);
|
|
696
|
+
i0.ɵɵtemplate(11, ComponentStudioDashboardComponent_Conditional_50_ng_template_11_Template, 12, 2, "ng-template", 102);
|
|
684
697
|
i0.ɵɵelementEnd()()()()();
|
|
685
|
-
i0.ɵɵtemplate(12,
|
|
698
|
+
i0.ɵɵtemplate(12, ComponentStudioDashboardComponent_Conditional_50_Conditional_12_Template, 0, 0);
|
|
686
699
|
} if (rf & 2) {
|
|
687
700
|
const ctx_r2 = i0.ɵɵnextContext();
|
|
688
701
|
i0.ɵɵadvance();
|
|
@@ -698,9 +711,9 @@ function ComponentStudioDashboardComponent_Conditional_47_Template(rf, ctx) { if
|
|
|
698
711
|
i0.ɵɵadvance(2);
|
|
699
712
|
i0.ɵɵconditional(!ctx_r2.isDetailsPaneCollapsed ? 12 : -1);
|
|
700
713
|
} }
|
|
701
|
-
function
|
|
702
|
-
i0.ɵɵelementStart(0, "div",
|
|
703
|
-
i0.ɵɵelement(1, "i",
|
|
714
|
+
function ComponentStudioDashboardComponent_Conditional_51_Template(rf, ctx) { if (rf & 1) {
|
|
715
|
+
i0.ɵɵelementStart(0, "div", 36);
|
|
716
|
+
i0.ɵɵelement(1, "i", 132);
|
|
704
717
|
i0.ɵɵelementStart(2, "h2");
|
|
705
718
|
i0.ɵɵtext(3, "Ready to Test Components");
|
|
706
719
|
i0.ɵɵelementEnd();
|
|
@@ -730,6 +743,7 @@ let ComponentStudioDashboardComponent = class ComponentStudioDashboardComponent
|
|
|
730
743
|
// Favorites
|
|
731
744
|
favoriteComponents = new Set(); // Set of component IDs
|
|
732
745
|
showOnlyFavorites = false; // Filter to show only favorites
|
|
746
|
+
showDeprecatedComponents = false; // Filter to show/hide deprecated components
|
|
733
747
|
metadata = new Metadata();
|
|
734
748
|
// Error handling
|
|
735
749
|
currentError = null;
|
|
@@ -868,6 +882,13 @@ let ComponentStudioDashboardComponent = class ComponentStudioDashboardComponent
|
|
|
868
882
|
this.showOnlyFavorites = !this.showOnlyFavorites;
|
|
869
883
|
this.combineAndFilterComponents();
|
|
870
884
|
}
|
|
885
|
+
/**
|
|
886
|
+
* Toggle showing deprecated components
|
|
887
|
+
*/
|
|
888
|
+
toggleShowDeprecatedComponents() {
|
|
889
|
+
this.showDeprecatedComponents = !this.showDeprecatedComponents;
|
|
890
|
+
this.combineAndFilterComponents();
|
|
891
|
+
}
|
|
871
892
|
onSearchChange(query) {
|
|
872
893
|
this.searchQuery = query;
|
|
873
894
|
this.combineAndFilterComponents();
|
|
@@ -882,7 +903,14 @@ let ComponentStudioDashboardComponent = class ComponentStudioDashboardComponent
|
|
|
882
903
|
this.buildCategories();
|
|
883
904
|
// Apply filters
|
|
884
905
|
let filtered = [...this.allComponents];
|
|
885
|
-
//
|
|
906
|
+
// Filter out deprecated components unless explicitly shown
|
|
907
|
+
if (!this.showDeprecatedComponents) {
|
|
908
|
+
filtered = filtered.filter(c => {
|
|
909
|
+
const status = this.getComponentStatus(c);
|
|
910
|
+
return status !== 'Deprecated';
|
|
911
|
+
});
|
|
912
|
+
}
|
|
913
|
+
// Apply favorites filter if enabled
|
|
886
914
|
if (this.showOnlyFavorites) {
|
|
887
915
|
filtered = filtered.filter(c => this.isFavorite(c));
|
|
888
916
|
}
|
|
@@ -1813,7 +1841,7 @@ ${this.currentError.technicalDetails ? '\nTechnical Details:\n' + JSON.stringify
|
|
|
1813
1841
|
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.fileInput = _t.first);
|
|
1814
1842
|
} }, hostBindings: function ComponentStudioDashboardComponent_HostBindings(rf, ctx) { if (rf & 1) {
|
|
1815
1843
|
i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_click_HostBindingHandler($event) { return ctx.onDocumentClick($event); }, false, i0.ɵɵresolveDocument);
|
|
1816
|
-
} }, features: [i0.ɵɵInheritDefinitionFeature], decls:
|
|
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) {
|
|
1817
1845
|
const _r1 = i0.ɵɵgetCurrentView();
|
|
1818
1846
|
i0.ɵɵelementStart(0, "div", 1)(1, "div", 2)(2, "div", 3)(3, "div")(4, "h1");
|
|
1819
1847
|
i0.ɵɵelement(5, "i", 4);
|
|
@@ -1848,21 +1876,25 @@ ${this.currentError.technicalDetails ? '\nTechnical Details:\n' + JSON.stringify
|
|
|
1848
1876
|
i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Template_button_click_31_listener() { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.toggleShowOnlyFavorites()); });
|
|
1849
1877
|
i0.ɵɵtemplate(32, ComponentStudioDashboardComponent_Conditional_32_Template, 2, 0)(33, ComponentStudioDashboardComponent_Conditional_33_Template, 2, 0);
|
|
1850
1878
|
i0.ɵɵelementEnd();
|
|
1851
|
-
i0.ɵɵelementStart(34, "
|
|
1852
|
-
i0.ɵɵ
|
|
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);
|
|
1853
1885
|
i0.ɵɵelementEnd()()();
|
|
1854
|
-
i0.ɵɵelementStart(
|
|
1855
|
-
i0.ɵɵtemplate(
|
|
1886
|
+
i0.ɵɵelementStart(39, "div", 26);
|
|
1887
|
+
i0.ɵɵtemplate(40, ComponentStudioDashboardComponent_Conditional_40_Template, 5, 2, "div", 27);
|
|
1856
1888
|
i0.ɵɵelementEnd();
|
|
1857
|
-
i0.ɵɵelementStart(
|
|
1858
|
-
i0.ɵɵlistener("valueChange", function
|
|
1859
|
-
i0.ɵɵtemplate(
|
|
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);
|
|
1860
1892
|
i0.ɵɵelementEnd()()();
|
|
1861
|
-
i0.ɵɵelementStart(
|
|
1862
|
-
i0.ɵɵtemplate(
|
|
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);
|
|
1863
1895
|
i0.ɵɵelementEnd()()();
|
|
1864
|
-
i0.ɵɵelementStart(
|
|
1865
|
-
i0.ɵɵtemplate(
|
|
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);
|
|
1866
1898
|
i0.ɵɵelementEnd()()()();
|
|
1867
1899
|
} if (rf & 2) {
|
|
1868
1900
|
i0.ɵɵadvance(10);
|
|
@@ -1883,19 +1915,23 @@ ${this.currentError.technicalDetails ? '\nTechnical Details:\n' + JSON.stringify
|
|
|
1883
1915
|
i0.ɵɵclassProp("active", ctx.showOnlyFavorites);
|
|
1884
1916
|
i0.ɵɵadvance();
|
|
1885
1917
|
i0.ɵɵconditional(ctx.showOnlyFavorites ? 32 : 33);
|
|
1918
|
+
i0.ɵɵadvance(2);
|
|
1919
|
+
i0.ɵɵclassProp("active", ctx.showDeprecatedComponents);
|
|
1920
|
+
i0.ɵɵadvance();
|
|
1921
|
+
i0.ɵɵconditional(ctx.showDeprecatedComponents ? 35 : 36);
|
|
1886
1922
|
i0.ɵɵadvance(3);
|
|
1887
1923
|
i0.ɵɵtextInterpolate2("", ctx.filteredComponents.length, " of ", ctx.allComponents.length, "");
|
|
1888
1924
|
i0.ɵɵadvance(2);
|
|
1889
|
-
i0.ɵɵconditional(ctx.availableCategories.length > 0 ?
|
|
1925
|
+
i0.ɵɵconditional(ctx.availableCategories.length > 0 ? 40 : -1);
|
|
1890
1926
|
i0.ɵɵadvance(2);
|
|
1891
1927
|
i0.ɵɵproperty("value", ctx.searchQuery)("clearButton", true);
|
|
1892
1928
|
i0.ɵɵadvance(3);
|
|
1893
|
-
i0.ɵɵconditional(ctx.isLoading ?
|
|
1929
|
+
i0.ɵɵconditional(ctx.isLoading ? 45 : ctx.filteredComponents.length === 0 ? 46 : 47);
|
|
1894
1930
|
i0.ɵɵadvance(3);
|
|
1895
1931
|
i0.ɵɵproperty("min", "400px");
|
|
1896
1932
|
i0.ɵɵadvance(2);
|
|
1897
|
-
i0.ɵɵconditional(ctx.selectedComponent ?
|
|
1898
|
-
} }, dependencies: [i2.NgClass, i3.NgControlStatus, i3.NgModel, i4.TextBoxComponent, i4.TextBoxPrefixTemplateDirective, i5.PanelBarComponent, i5.PanelBarItemComponent, i5.PanelBarContentDirective, i5.SplitterComponent, i5.SplitterPaneComponent, i5.TabStripComponent, i5.TabStripTabComponent, i5.TabContentDirective, i6.CodeEditorComponent, i7.ButtonComponent, i8.MJReactComponent, i2.DatePipe], styles: ["[_nghost-%COMP%] {\n display: block;\n width: 100%;\n height: 100%;\n}\n\n.component-studio[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n height: 100vh;\n background: #f8f9fa;\n overflow: hidden;\n position: relative;\n\n .dashboard-header {\n background: white;\n border-bottom: 1px solid #dee2e6;\n padding: 16px 24px;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05);\n \n .header-content {\n display: flex;\n justify-content: space-between;\n align-items: center;\n \n .header-buttons {\n display: flex;\n gap: 8px;\n \n .import-dropdown, .export-dropdown {\n position: relative;\n \n .dropdown-menu {\n position: absolute;\n top: calc(100% + 4px);\n left: 0;\n background: white;\n border: 1px solid #dee2e6;\n border-radius: 4px;\n box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);\n z-index: 1000;\n min-width: 180px;\n \n .dropdown-item {\n display: flex;\n align-items: center;\n gap: 10px;\n width: 100%;\n padding: 10px 16px;\n border: none;\n background: none;\n text-align: left;\n cursor: pointer;\n font-size: 14px;\n color: #212529;\n transition: background-color 0.2s;\n \n &:hover {\n background-color: #f8f9fa;\n }\n \n &:not(:last-child) {\n border-bottom: 1px solid #e9ecef;\n }\n \n i {\n width: 16px;\n text-align: center;\n color: #6366f1;\n }\n }\n }\n }\n }\n \n h1 {\n margin: 0;\n font-size: 24px;\n font-weight: 600;\n color: #212529;\n display: flex;\n align-items: center;\n gap: 12px;\n \n i {\n color: #6366f1;\n }\n }\n \n .header-subtitle {\n margin: 4px 0 0 0;\n font-size: 13px;\n color: #6c757d;\n font-weight: normal;\n }\n }\n }\n\n kendo-splitter {\n flex: 1;\n background: white;\n display: flex;\n height: 100%;\n min-height: 0;\n overflow: hidden;\n \n ::ng-deep .k-pane {\n overflow: hidden;\n height: 100%;\n }\n }\n\n .components-panel {\n height: 100%;\n display: flex;\n flex-direction: column;\n background: #f8f9fa;\n \n .panel-header {\n padding: 20px;\n background: white;\n border-bottom: 1px solid #dee2e6;\n \n .panel-header-top {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 16px;\n \n h3 {\n margin: 0;\n font-size: 18px;\n font-weight: 600;\n color: #212529;\n }\n \n .header-actions {\n display: flex;\n align-items: center;\n gap: 12px;\n \n .favorites-toggle {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n border: 1px solid #dee2e6;\n background: white;\n border-radius: 20px;\n font-size: 13px;\n font-weight: 500;\n color: #6c757d;\n cursor: pointer;\n transition: all 0.2s ease;\n \n &:hover {\n background: #f8f9fa;\n border-color: #adb5bd;\n }\n \n &.active {\n background: #fff3cd;\n border-color: #ffc107;\n color: #856404;\n \n i {\n color: #ffc107;\n }\n }\n \n i {\n font-size: 14px;\n }\n }\n \n .component-count {\n font-size: 13px;\n color: #6c757d;\n background: #f8f9fa;\n padding: 4px 10px;\n border-radius: 12px;\n font-weight: 500;\n }\n }\n }\n \n .category-filters {\n margin-bottom: 16px;\n \n .filter-pills {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n \n .category-pill {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n border: 2px solid #e9ecef;\n background: white;\n border-radius: 20px;\n font-size: 13px;\n cursor: pointer;\n transition: all 0.2s ease;\n position: relative;\n overflow: hidden;\n \n &:hover {\n transform: translateY(-1px);\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\n }\n \n &.active {\n border-color: var(--pill-color);\n background: var(--pill-color);\n color: white;\n \n .pill-count {\n background: rgba(255, 255, 255, 0.3);\n color: white;\n }\n }\n \n .pill-name {\n font-weight: 500;\n }\n \n .pill-count {\n background: #f1f3f5;\n padding: 2px 6px;\n border-radius: 10px;\n font-size: 11px;\n font-weight: 600;\n min-width: 20px;\n text-align: center;\n }\n }\n \n .more-button,\n .clear-filters-button {\n padding: 6px 12px;\n border: 1px solid #dee2e6;\n background: white;\n border-radius: 20px;\n font-size: 13px;\n cursor: pointer;\n transition: all 0.2s ease;\n color: #6c757d;\n \n &:hover {\n background: #f8f9fa;\n border-color: #adb5bd;\n }\n \n i {\n font-size: 11px;\n margin-right: 4px;\n }\n }\n \n .clear-filters-button {\n background: #fee2e2;\n border-color: #fca5a5;\n color: #dc2626;\n \n &:hover {\n background: #fca5a5;\n color: white;\n }\n }\n }\n }\n \n .search-box {\n kendo-textbox {\n width: 100%;\n }\n }\n }\n \n .components-list {\n flex: 1;\n overflow-y: auto;\n overflow-x: hidden;\n padding: 16px;\n \n .loading-message,\n .empty-message {\n padding: 48px 24px;\n text-align: center;\n color: #6c757d;\n font-size: 14px;\n \n i {\n margin-right: 8px;\n }\n }\n \n .component-card {\n background: white;\n border: 1px solid #dee2e6;\n border-radius: 8px;\n margin-bottom: 12px;\n transition: all 0.2s ease;\n \n &:hover {\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);\n }\n \n &.expanded {\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);\n border-color: #6366f1;\n }\n \n &.running {\n border-color: #10b981;\n box-shadow: 0 0 0 3px rgba(16, 185, 129, 0.1);\n background: linear-gradient(to right, rgba(16, 185, 129, 0.03) 0%, white 100%);\n \n .card-header {\n &::before {\n content: '';\n position: absolute;\n left: 0;\n top: 0;\n bottom: 0;\n width: 4px;\n background: #10b981;\n }\n }\n }\n \n &.file-loaded {\n background: linear-gradient(135deg, #f0f8ff 0%, white 100%);\n border-style: dashed;\n border-color: #3b82f6;\n \n &:hover {\n box-shadow: 0 2px 8px rgba(59, 130, 246, 0.15);\n }\n \n &.expanded {\n border-style: solid;\n box-shadow: 0 4px 12px rgba(59, 130, 246, 0.2);\n }\n }\n \n .card-header {\n display: flex;\n align-items: center;\n padding: 16px;\n cursor: pointer;\n user-select: none;\n position: relative;\n \n &:hover {\n background: #f8f9fa;\n }\n \n .card-icon {\n font-size: 24px;\n margin-right: 16px;\n width: 32px;\n text-align: center;\n flex-shrink: 0;\n }\n \n .favorite-btn {\n position: absolute;\n top: 12px;\n right: 48px; // Leave room for chevron\n background: white;\n border: 1px solid #dee2e6;\n border-radius: 50%;\n width: 32px;\n height: 32px;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n transition: all 0.2s ease;\n color: #6c757d;\n \n &:hover {\n background: #f8f9fa;\n transform: scale(1.1);\n }\n \n &.is-favorite {\n color: #ffc107;\n border-color: #ffc107;\n background: #fff3cd;\n \n &:hover {\n background: #ffe69c;\n }\n }\n \n i {\n font-size: 14px;\n }\n }\n \n .card-info {\n flex: 1;\n min-width: 0;\n \n .card-name {\n font-size: 15px;\n font-weight: 600;\n color: #212529;\n margin-bottom: 4px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n display: flex;\n align-items: center;\n gap: 8px;\n \n .file-badge {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 2px 6px;\n background: #e0f2fe;\n color: #0369a1;\n border-radius: 4px;\n font-size: 11px;\n font-weight: 500;\n flex-shrink: 0;\n \n i {\n font-size: 10px;\n }\n }\n }\n \n .card-meta {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 12px;\n color: #6c757d;\n \n .card-type {\n font-weight: 500;\n }\n \n .card-version {\n color: #868e96;\n }\n \n .status-badge {\n padding: 2px 6px;\n border-radius: 10px;\n font-size: 10px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.3px;\n \n &.published {\n background: #d1fae5;\n color: #065f46;\n }\n \n &.draft {\n background: #fef3c7;\n color: #92400e;\n }\n \n &.file {\n background: #e0f2fe;\n color: #0369a1;\n }\n \n &.text {\n background: #f3e8ff;\n color: #6b21a8;\n }\n }\n }\n \n .card-namespace {\n margin-top: 8px;\n \n .namespace-chip {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 10px;\n border-radius: 16px;\n font-size: 12px;\n font-weight: 500;\n color: white;\n \n i {\n font-size: 11px;\n opacity: 0.9;\n }\n }\n }\n }\n \n .card-chevron {\n color: #6c757d;\n font-size: 12px;\n margin-left: 12px;\n transition: transform 0.2s ease;\n }\n }\n \n .card-details {\n padding: 0 16px 16px 16px;\n border-top: 1px solid #e9ecef;\n animation: slideDown 0.2s ease;\n \n .detail-section {\n margin-top: 16px;\n \n label {\n display: block;\n font-size: 11px;\n font-weight: 600;\n color: #6c757d;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n margin-bottom: 8px;\n }\n \n p {\n margin: 0;\n font-size: 13px;\n color: #495057;\n line-height: 1.5;\n }\n \n .info-grid {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 8px;\n \n .info-item {\n display: flex;\n align-items: baseline;\n gap: 6px;\n font-size: 13px;\n \n .info-label {\n font-weight: 500;\n color: #6c757d;\n min-width: 50px;\n }\n \n .info-value {\n color: #212529;\n }\n }\n }\n }\n \n .card-actions {\n margin-top: 16px;\n display: flex;\n gap: 8px;\n \n button {\n flex: 1;\n }\n }\n }\n }\n }\n }\n\n .component-display {\n height: 100%;\n display: flex;\n flex-direction: column;\n background: white;\n position: relative;\n overflow: hidden;\n \n .empty-state {\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n color: #868e96;\n padding: 48px;\n text-align: center;\n \n i {\n color: #dee2e6;\n margin-bottom: 24px;\n }\n \n h2 {\n margin: 0 0 12px 0;\n font-size: 24px;\n font-weight: 600;\n color: #495057;\n }\n \n p {\n margin: 0;\n font-size: 14px;\n max-width: 400px;\n }\n }\n \n .error-display {\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 24px;\n background: #f8f9fa;\n \n .error-container {\n width: 100%;\n max-width: 600px;\n background: white;\n border: 2px solid #dc3545;\n border-radius: 8px;\n padding: 24px;\n box-shadow: 0 4px 12px rgba(220, 53, 69, 0.15);\n \n .error-header {\n display: flex;\n align-items: center;\n gap: 12px;\n margin-bottom: 20px;\n color: #dc3545;\n position: relative;\n \n i {\n font-size: 24px;\n }\n \n h3 {\n margin: 0;\n font-size: 20px;\n flex: 1;\n }\n \n .copy-button {\n background: white;\n border: 1px solid #dee2e6;\n border-radius: 4px;\n padding: 6px 10px;\n cursor: pointer;\n color: #6c757d;\n transition: all 0.2s;\n \n &:hover {\n background: #e9ecef;\n color: #495057;\n }\n \n i {\n font-size: 14px;\n }\n }\n }\n \n .error-intro {\n color: #495057;\n margin-bottom: 20px;\n font-size: 14px;\n }\n \n .error-details {\n background: #f8f9fa;\n border: 1px solid #dee2e6;\n border-radius: 4px;\n padding: 16px;\n margin-bottom: 20px;\n font-family: 'SF Mono', Monaco, 'Courier New', monospace;\n font-size: 13px;\n \n .technical-details {\n margin-top: 12px;\n \n summary {\n cursor: pointer;\n color: #0066cc;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n \n &:hover {\n text-decoration: underline;\n }\n }\n \n pre {\n margin-top: 8px;\n white-space: pre-wrap;\n word-break: break-word;\n font-size: 11px;\n color: #495057;\n max-height: 200px;\n overflow-y: auto;\n }\n }\n }\n \n .error-help {\n background: #e7f3ff;\n border: 1px solid #b3d9ff;\n border-radius: 4px;\n padding: 16px;\n margin-bottom: 20px;\n font-size: 13px;\n \n strong {\n display: block;\n margin-bottom: 8px;\n font-size: 14px;\n color: #0066cc;\n }\n \n ol {\n margin: 0;\n padding-left: 20px;\n \n li {\n margin-bottom: 4px;\n color: #495057;\n }\n }\n }\n \n .error-actions {\n display: flex;\n gap: 12px;\n \n button {\n min-width: 100px;\n }\n }\n }\n }\n \n mj-react-component {\n flex: 1;\n width: 100%;\n height: 100%;\n display: block;\n overflow-y: auto;\n overflow-x: hidden;\n }\n \n // Component and editor splitter\n .component-editor-splitter {\n height: 100%;\n overflow: hidden;\n \n ::ng-deep .k-splitter-bar {\n background: #6366f1; // Same blue as Import button\n width: 6px; // Make it slightly wider for visibility\n \n &:hover {\n background: #4f52d9; // Darker blue on hover\n }\n \n .k-resize-handle {\n background-color: rgba(255, 255, 255, 0.3);\n }\n }\n \n ::ng-deep .k-pane {\n overflow: hidden;\n display: flex;\n flex-direction: column;\n }\n }\n \n // Component runtime area\n .component-runtime {\n height: 100%;\n display: flex;\n flex-direction: column;\n background: white;\n position: relative;\n overflow-y: auto;\n overflow-x: hidden;\n \n .run-empty-state {\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 48px;\n text-align: center;\n \n i {\n color: #10b981;\n margin-bottom: 24px;\n }\n \n h3 {\n margin: 0 0 12px 0;\n font-size: 20px;\n font-weight: 600;\n color: #212529;\n }\n \n p {\n margin: 0 0 24px 0;\n font-size: 14px;\n color: #6c757d;\n max-width: 400px;\n }\n }\n }\n \n // Editor tabs on the right\n .editor-tabs {\n height: 100%;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n \n ::ng-deep .k-tabstrip-items-wrapper {\n background: #f8f9fa;\n border-bottom: 2px solid #dee2e6;\n flex-shrink: 0;\n }\n \n ::ng-deep .k-tabstrip-content {\n flex: 1;\n padding: 0;\n overflow: hidden;\n min-height: 0;\n display: flex;\n flex-direction: column;\n }\n \n ::ng-deep .k-item.k-tabstrip-item {\n font-weight: 500;\n \n &.k-active {\n background: white;\n border-bottom-color: white;\n }\n }\n }\n \n .tab-content {\n height: 100%;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n \n &.spec-tab, &.code-tab {\n height: 100%;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n \n .editor-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 12px 16px;\n background: #f8f9fa;\n border-bottom: 1px solid #dee2e6;\n flex-shrink: 0;\n min-width: 0; // Fix width issue\n \n h4 {\n margin: 0;\n font-size: 14px;\n font-weight: 600;\n color: #495057;\n display: flex;\n align-items: center;\n gap: 8px;\n flex-shrink: 1; // Allow title to shrink\n min-width: 0; // Prevent overflow\n \n i {\n color: #6366f1;\n flex-shrink: 0; // Keep icon from shrinking\n }\n }\n \n .editor-actions {\n display: flex;\n gap: 8px;\n flex-shrink: 0; // Prevent buttons from shrinking\n \n button {\n min-width: auto;\n padding: 4px 12px;\n font-size: 13px;\n white-space: nowrap; // Prevent button text wrapping\n }\n }\n }\n \n .editor-wrapper {\n flex: 1;\n overflow-y: auto;\n overflow-x: hidden;\n min-height: 0;\n position: relative;\n }\n \n ::ng-deep .monaco-editor {\n border: 1px solid #dee2e6;\n }\n }\n \n .code-sections {\n height: 100%;\n \n ::ng-deep .k-panelbar-item-header {\n background: #f8f9fa;\n font-weight: 500;\n font-size: 14px;\n }\n \n ::ng-deep .k-panelbar-content {\n padding: 0;\n }\n }\n }\n }\n}\n\n//[_ngcontent-%COMP%] Removed[_ngcontent-%COMP%] tree[_ngcontent-%COMP%] view[_ngcontent-%COMP%] styles[_ngcontent-%COMP%] -[_ngcontent-%COMP%] using[_ngcontent-%COMP%] modern[_ngcontent-%COMP%] category[_ngcontent-%COMP%] filters[_ngcontent-%COMP%] instead\n\n@keyframes[_ngcontent-%COMP%] slideDown[_ngcontent-%COMP%] {\n from {\n opacity: 0;\n transform: translateY(-10px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n@keyframes _ngcontent-%COMP%_pulse {\n 0%, 100% {\n opacity: 1;\n }\n 50% {\n opacity: 0.5;\n }\n}"] });
|
|
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}"] });
|
|
1899
1935
|
};
|
|
1900
1936
|
ComponentStudioDashboardComponent = __decorate([
|
|
1901
1937
|
RegisterClass(BaseDashboard, 'ComponentStudioDashboard')
|
|
@@ -1903,7 +1939,7 @@ ComponentStudioDashboardComponent = __decorate([
|
|
|
1903
1939
|
export { ComponentStudioDashboardComponent };
|
|
1904
1940
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ComponentStudioDashboardComponent, [{
|
|
1905
1941
|
type: Component,
|
|
1906
|
-
args: [{ selector: 'mj-component-studio-dashboard', template: "<div class=\"component-studio\">\n <!-- Header -->\n <div class=\"dashboard-header\">\n <div class=\"header-content\">\n <div>\n <h1><i class=\"fa-solid fa-puzzle-piece\"></i> Component Studio</h1>\n <p class=\"header-subtitle\">Testing components without required custom properties</p>\n </div>\n <div class=\"header-buttons\">\n @if (selectedComponent && isRunning) {\n <button kendoButton (click)=\"toggleDetailsPane()\" [themeColor]=\"'base'\">\n @if (isDetailsPaneCollapsed) {\n <span class=\"fa-solid fa-eye\"></span> Show Details\n } @else {\n <span class=\"fa-solid fa-eye-slash\"></span> Hide Details\n }\n </button>\n }\n <div class=\"import-dropdown\" [class.open]=\"importDropdownOpen\">\n <button kendoButton (click)=\"toggleImportDropdown()\" [themeColor]=\"'info'\">\n <span class=\"fa-solid fa-file-import\"></span> Import\n <span class=\"fa-solid fa-chevron-down\" style=\"margin-left: 5px; font-size: 10px;\"></span>\n </button>\n @if (importDropdownOpen) {\n <div class=\"dropdown-menu\">\n <button class=\"dropdown-item\" (click)=\"importFromFile()\">\n <i class=\"fa-solid fa-file\"></i> Import from File\n </button>\n <button class=\"dropdown-item\" (click)=\"importFromText()\">\n <i class=\"fa-solid fa-keyboard\"></i> Import from Text\n </button>\n </div>\n }\n </div>\n @if (selectedComponent && isRunning) {\n <div class=\"export-dropdown\" [class.open]=\"exportDropdownOpen\">\n <button kendoButton (click)=\"toggleExportDropdown()\" [themeColor]=\"'primary'\">\n <span class=\"fa-solid fa-file-export\"></span> Export\n <span class=\"fa-solid fa-chevron-down\" style=\"margin-left: 5px; font-size: 10px;\"></span>\n </button>\n @if (exportDropdownOpen) {\n <div class=\"dropdown-menu\">\n <button class=\"dropdown-item\" (click)=\"exportToArtifact()\">\n <i class=\"fa-solid fa-save\"></i> Export to Artifact\n </button>\n <button class=\"dropdown-item\" (click)=\"exportToFile()\">\n <i class=\"fa-solid fa-file\"></i> Export to File\n </button>\n <button class=\"dropdown-item\" (click)=\"exportToClipboard()\">\n <i class=\"fa-solid fa-clipboard\"></i> Export to Clipboard\n </button>\n </div>\n }\n </div>\n }\n <button kendoButton (click)=\"refreshData()\" [disabled]=\"isLoading\">\n <span class=\"fa-solid fa-sync\"></span> Refresh\n </button>\n </div>\n <!-- Hidden file input -->\n <input #fileInput type=\"file\" accept=\".json\" (change)=\"handleFileSelect($event)\" style=\"display: none;\" />\n </div>\n </div>\n\n <!-- Main Content with Splitter -->\n <kendo-splitter orientation=\"horizontal\">\n <!-- Left Panel - Component List -->\n <kendo-splitter-pane [min]=\"'350px'\" [max]=\"'650px'\" [size]=\"'400px'\">\n <div class=\"components-panel\">\n <div class=\"panel-header\">\n <div class=\"panel-header-top\">\n <h3>Components</h3>\n <div class=\"header-actions\">\n <button \n class=\"favorites-toggle\"\n [class.active]=\"showOnlyFavorites\"\n (click)=\"toggleShowOnlyFavorites()\"\n title=\"Show only favorites\">\n @if (showOnlyFavorites) {\n <i class=\"fa-solid fa-star\"></i> Favorites\n } @else {\n <i class=\"fa-regular fa-star\"></i> All\n }\n </button>\n <span class=\"component-count\">{{ filteredComponents.length }} of {{ allComponents.length }}</span>\n </div>\n </div>\n \n <!-- Modern Category Filter Pills -->\n <div class=\"category-filters\">\n @if (availableCategories.length > 0) {\n <div class=\"filter-pills\">\n @for (category of getVisibleCategories(); track category.name) {\n <button \n class=\"category-pill\"\n [class.active]=\"isCategorySelected(category.name)\"\n [style.--pill-color]=\"category.color\"\n (click)=\"toggleCategory(category.name)\">\n <span class=\"pill-name\">{{ category.name }}</span>\n <span class=\"pill-count\">{{ category.count }}</span>\n </button>\n }\n @if (availableCategories.length > 5) {\n <button \n class=\"more-button\"\n (click)=\"toggleShowAllCategories()\">\n @if (showAllCategories) {\n <i class=\"fa-solid fa-chevron-up\"></i> Less\n } @else {\n <i class=\"fa-solid fa-chevron-down\"></i> +{{ availableCategories.length - 5 }} more\n }\n </button>\n }\n @if (selectedCategories.size > 0) {\n <button \n class=\"clear-filters-button\"\n (click)=\"clearCategoryFilters()\">\n <i class=\"fa-solid fa-times\"></i> Clear\n </button>\n }\n </div>\n }\n </div>\n \n <div class=\"search-box\">\n <kendo-textbox \n [value]=\"searchQuery\"\n (valueChange)=\"onSearchChange($event)\"\n placeholder=\"Search components...\"\n [clearButton]=\"true\">\n <ng-template kendoTextBoxPrefixTemplate>\n <i class=\"fa-solid fa-search\"></i>\n </ng-template>\n </kendo-textbox>\n </div>\n </div>\n \n <div class=\"components-list\">\n @if (isLoading) {\n <div class=\"loading-message\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Loading components...\n </div>\n } @else if (filteredComponents.length === 0) {\n <div class=\"empty-message\">\n <i class=\"fa-solid fa-info-circle\"></i> No components found without required custom properties.\n <br>\n <small>Components with optional custom props can be tested, but not those with required props.</small>\n </div>\n } @else {\n <!-- Component Cards -->\n @for (component of filteredComponents; track getComponentId(component)) {\n <div class=\"component-card\" \n [class.expanded]=\"expandedComponent && getComponentId(expandedComponent) === getComponentId(component)\"\n [class.running]=\"selectedComponent && getComponentId(selectedComponent) === getComponentId(component) && isRunning\"\n [class.file-loaded]=\"isFileLoadedComponent(component)\">\n \n <!-- Card Header - Always visible -->\n <div class=\"card-header\" (click)=\"toggleComponentExpansion(component)\">\n <div class=\"card-icon\" [style.color]=\"getComponentTypeColor(getComponentType(component))\">\n <i class=\"fa-solid\" [ngClass]=\"getComponentTypeIcon(getComponentType(component))\"></i>\n </div>\n @if (!isFileLoadedComponent(component)) {\n <button \n class=\"favorite-btn\"\n [class.is-favorite]=\"isFavorite(component)\"\n (click)=\"toggleFavorite(component, $event)\"\n [title]=\"isFavorite(component) ? 'Remove from favorites' : 'Add to favorites'\">\n @if (isFavorite(component)) {\n <i class=\"fa-solid fa-star\"></i>\n } @else {\n <i class=\"fa-regular fa-star\"></i>\n }\n </button>\n }\n <div class=\"card-info\">\n <div class=\"card-name\">\n {{ getComponentName(component) }}\n @if (isFileLoadedComponent(component)) {\n <span class=\"file-badge\" [title]=\"getComponentStatus(component) === 'Text' ? 'Imported from text input' : 'Loaded from ' + getComponentFilename(component)\">\n @if (getComponentStatus(component) === 'Text') {\n <i class=\"fa-solid fa-keyboard\"></i> Text Import\n } @else {\n <i class=\"fa-solid fa-file\"></i> {{ getComponentFilename(component) }}\n }\n </span>\n }\n </div>\n <div class=\"card-meta\">\n <span class=\"card-type\">{{ getComponentType(component) || 'Component' }}</span>\n <span class=\"card-version\">v{{ getComponentVersion(component) }}</span>\n @if (isFileLoadedComponent(component)) {\n @if (getComponentStatus(component) === 'Text') {\n <span class=\"status-badge text\">Text</span>\n } @else {\n <span class=\"status-badge file\">File</span>\n }\n } @else if (getComponentStatus(component) === 'Published') {\n <span class=\"status-badge published\">Published</span>\n } @else {\n <span class=\"status-badge draft\">Draft</span>\n }\n </div>\n <!-- Namespace chip with color coding -->\n <div class=\"card-namespace\">\n <span class=\"namespace-chip\" \n [style.background-color]=\"getNamespaceColor(getComponentNamespace(component))\"\n [title]=\"getComponentNamespace(component) || 'Uncategorized'\">\n <i class=\"fa-solid fa-folder-tree\"></i>\n {{ formatNamespace(getComponentNamespace(component)) }}\n </span>\n </div>\n </div>\n <div class=\"card-chevron\">\n @if (expandedComponent && getComponentId(expandedComponent) === getComponentId(component)) {\n <i class=\"fa-solid fa-chevron-up\"></i>\n } @else {\n <i class=\"fa-solid fa-chevron-down\"></i>\n }\n </div>\n </div>\n \n <!-- Card Details - Only visible when expanded -->\n @if (expandedComponent && getComponentId(expandedComponent) === getComponentId(component)) {\n <div class=\"card-details\">\n @if (getComponentDescription(component)) {\n <div class=\"detail-section\">\n <label>Description</label>\n <p>{{ getComponentDescription(component) }}</p>\n </div>\n }\n \n <div class=\"detail-section\">\n <label>Component Info</label>\n <div class=\"info-grid\">\n <div class=\"info-item\">\n <span class=\"info-label\">Type:</span>\n <span class=\"info-value\">{{ getComponentType(component) || 'Unknown' }}</span>\n </div>\n <div class=\"info-item\">\n <span class=\"info-label\">Version:</span>\n <span class=\"info-value\">{{ getComponentVersion(component) }}</span>\n </div>\n <div class=\"info-item\">\n <span class=\"info-label\">Status:</span>\n <span class=\"info-value\">{{ getComponentStatus(component) || 'Draft' }}</span>\n </div>\n @if (isFileLoadedComponent(component)) {\n <div class=\"info-item\">\n <span class=\"info-label\">Loaded:</span>\n <span class=\"info-value\">{{ getComponentLoadedAt(component) | date:'short' }}</span>\n </div>\n } @else if (!isFileLoadedComponent(component) && getComponentUpdatedAt(component)) {\n <div class=\"info-item\">\n <span class=\"info-label\">Updated:</span>\n <span class=\"info-value\">{{ getComponentUpdatedAt(component) | date:'short' }}</span>\n </div>\n }\n </div>\n </div>\n \n <div class=\"card-actions\">\n @if (selectedComponent && getComponentId(selectedComponent) === getComponentId(component) && isRunning) {\n <button kendoButton \n [themeColor]=\"'error'\"\n (click)=\"stopComponent(); $event.stopPropagation()\">\n <span class=\"fa-solid fa-stop\"></span> Stop Component\n </button>\n } @else if (isRunning && selectedComponent && getComponentId(selectedComponent) !== getComponentId(component)) {\n <button kendoButton \n [themeColor]=\"'base'\"\n title=\"Stop current component and run this one\"\n (click)=\"runComponent(component); $event.stopPropagation()\">\n <span class=\"fa-solid fa-play\"></span> Switch to This Component\n </button>\n } @else {\n <button kendoButton \n [themeColor]=\"'primary'\"\n (click)=\"runComponent(component); $event.stopPropagation()\">\n <span class=\"fa-solid fa-play\"></span> Run Component\n </button>\n }\n </div>\n </div>\n }\n </div>\n }\n }\n </div>\n </div>\n </kendo-splitter-pane>\n\n <!-- Right Panel - Component Display with Editor Splitter -->\n <kendo-splitter-pane [min]=\"'400px'\">\n <div class=\"component-display\">\n @if (selectedComponent) {\n <kendo-splitter orientation=\"horizontal\">\n <kendo-splitter-pane [size]=\"isDetailsPaneCollapsed ? '100%' : '50%'\">\n <div class=\"component-runtime\">\n @if (isRunning && componentSpec) {\n @if (currentError) {\n <!-- Error Display -->\n <div class=\"error-display\">\n <div class=\"error-container\">\n <div class=\"error-header\">\n <i class=\"fa-solid fa-exclamation-triangle\"></i>\n <h3>Component Error</h3>\n <button class=\"copy-button\" (click)=\"copyErrorToClipboard()\" title=\"Copy error details\">\n <i class=\"fa-solid fa-copy\"></i>\n </button>\n </div>\n \n <p class=\"error-intro\">\n The component could not be rendered due to the following error:\n </p>\n \n <div class=\"error-details\">\n <strong>Error Type:</strong> {{ currentError.type }}<br>\n <strong>Message:</strong> {{ currentError.message }}\n @if (currentError.technicalDetails) {\n <details class=\"technical-details\">\n <summary>Technical Details (click to expand)</summary>\n <pre>{{ formatTechnicalDetails(currentError.technicalDetails) }}</pre>\n </details>\n }\n </div>\n \n <div class=\"error-help\">\n <strong>What to do:</strong>\n <ol>\n <li>Check that the component code is valid JavaScript/React</li>\n <li>Ensure all required dependencies are available</li>\n <li>Review the technical details for specific error information</li>\n <li>Contact your system administrator if the issue persists</li>\n </ol>\n </div>\n \n <div class=\"error-actions\">\n <button kendoButton (click)=\"retryComponent()\">\n <span class=\"fa-solid fa-rotate\"></span> Retry\n </button>\n <button kendoButton (click)=\"stopComponent()\" [themeColor]=\"'error'\">\n <span class=\"fa-solid fa-stop\"></span> Stop\n </button>\n </div>\n </div>\n </div>\n } @else {\n <!-- React Component -->\n <mj-react-component \n [component]=\"componentSpec\"\n (componentEvent)=\"onComponentEvent($event)\"\n (openEntityRecord)=\"onOpenEntityRecord($event)\">\n </mj-react-component>\n }\n } @else {\n <!-- Component Not Running State -->\n <div class=\"run-empty-state\">\n <i class=\"fa-solid fa-play-circle fa-3x\"></i>\n <h3>Component: {{ getComponentName(selectedComponent) }}</h3>\n <p>{{ getComponentDescription(selectedComponent) || 'No description available' }}</p>\n <button kendoButton [themeColor]=\"'primary'\" [size]=\"'large'\" (click)=\"runComponent(selectedComponent)\">\n <span class=\"fa-solid fa-play\"></span> Run Component\n </button>\n </div>\n }\n </div>\n\n </kendo-splitter-pane>\n <kendo-splitter-pane [size]=\"isDetailsPaneCollapsed ? '0px' : '50%'\">\n <div>\n <kendo-tabstrip (tabSelect)=\"onTabSelect($event)\" class=\"editor-tabs\">\n <!-- Spec Tab -->\n <kendo-tabstrip-tab [title]=\"'Spec'\" [selected]=\"activeTab === 0\">\n <ng-template kendoTabContent>\n <div class=\"tab-content spec-tab\">\n <div class=\"editor-header\">\n <h4><i class=\"fa-solid fa-code\"></i> Component Specification (JSON)</h4>\n <div class=\"editor-actions\">\n @if (isEditingSpec) {\n <button kendoButton [themeColor]=\"'primary'\" (click)=\"applySpecChanges()\">\n <span class=\"fa-solid fa-check\"></span> Apply Changes\n </button>\n <button kendoButton (click)=\"initializeEditors()\">\n <span class=\"fa-solid fa-times\"></span> Cancel\n </button>\n }\n @if (isRunning) {\n <button kendoButton (click)=\"refreshComponent()\" [themeColor]=\"'info'\">\n <span class=\"fa-solid fa-sync\"></span> Refresh Component\n </button>\n }\n </div>\n </div>\n <div class=\"editor-wrapper\">\n <mj-code-editor\n [(ngModel)]=\"editableSpec\"\n (ngModelChange)=\"onSpecChange($event)\"\n [language]=\"'json'\"\n [readonly]=\"false\"\n style=\"height: 100%; width: 100%;\">\n </mj-code-editor>\n </div>\n </div>\n </ng-template>\n </kendo-tabstrip-tab>\n \n <!-- Code Tab -->\n <kendo-tabstrip-tab [title]=\"'Code'\" [selected]=\"activeTab === 1\">\n <ng-template kendoTabContent>\n <div class=\"tab-content code-tab\">\n <div class=\"editor-header\">\n <h4><i class=\"fa-solid fa-file-code\"></i> Component Code (JavaScript/React)</h4>\n <div class=\"editor-actions\">\n @if (isEditingCode) {\n <button kendoButton [themeColor]=\"'primary'\" (click)=\"applyCodeChanges()\">\n <span class=\"fa-solid fa-check\"></span> Apply Changes\n </button>\n <button kendoButton (click)=\"initializeEditors()\">\n <span class=\"fa-solid fa-times\"></span> Cancel\n </button>\n }\n @if (isRunning) {\n <button kendoButton (click)=\"refreshComponent()\" [themeColor]=\"'info'\">\n <span class=\"fa-solid fa-sync\"></span> Refresh Component\n </button>\n }\n </div>\n </div>\n \n <!-- Always use panel bar for consistency and to show all components -->\n <div class=\"editor-wrapper\">\n <kendo-panelbar class=\"code-sections\">\n @for (section of getComponentCodeSections(); track section.title; let i = $index) {\n <kendo-panelbar-item [title]=\"section.title\" [expanded]=\"section.expanded\">\n <ng-template kendoPanelBarContent>\n <mj-code-editor\n [ngModel]=\"section.code\"\n (ngModelChange)=\"onCodeSectionChange($event, i)\"\n [language]=\"'javascript'\"\n [readonly]=\"false\"\n style=\"height: 400px; width: 100%;\">\n </mj-code-editor>\n </ng-template>\n </kendo-panelbar-item>\n }\n </kendo-panelbar>\n </div>\n </div>\n </ng-template>\n </kendo-tabstrip-tab>\n </kendo-tabstrip>\n </div>\n </kendo-splitter-pane>\n </kendo-splitter>\n\n @if (!isDetailsPaneCollapsed) {\n \n }\n } @else {\n <!-- Empty State when no component selected -->\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-rocket fa-3x\"></i>\n <h2>Ready to Test Components</h2>\n <p>Select a component from the list to view its details and run it</p>\n </div>\n }\n </div>\n </kendo-splitter-pane>\n </kendo-splitter>\n</div>", styles: [":host {\n display: block;\n width: 100%;\n height: 100%;\n}\n\n.component-studio {\n display: flex;\n flex-direction: column;\n height: 100vh;\n background: #f8f9fa;\n overflow: hidden;\n position: relative;\n\n .dashboard-header {\n background: white;\n border-bottom: 1px solid #dee2e6;\n padding: 16px 24px;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05);\n \n .header-content {\n display: flex;\n justify-content: space-between;\n align-items: center;\n \n .header-buttons {\n display: flex;\n gap: 8px;\n \n .import-dropdown, .export-dropdown {\n position: relative;\n \n .dropdown-menu {\n position: absolute;\n top: calc(100% + 4px);\n left: 0;\n background: white;\n border: 1px solid #dee2e6;\n border-radius: 4px;\n box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);\n z-index: 1000;\n min-width: 180px;\n \n .dropdown-item {\n display: flex;\n align-items: center;\n gap: 10px;\n width: 100%;\n padding: 10px 16px;\n border: none;\n background: none;\n text-align: left;\n cursor: pointer;\n font-size: 14px;\n color: #212529;\n transition: background-color 0.2s;\n \n &:hover {\n background-color: #f8f9fa;\n }\n \n &:not(:last-child) {\n border-bottom: 1px solid #e9ecef;\n }\n \n i {\n width: 16px;\n text-align: center;\n color: #6366f1;\n }\n }\n }\n }\n }\n \n h1 {\n margin: 0;\n font-size: 24px;\n font-weight: 600;\n color: #212529;\n display: flex;\n align-items: center;\n gap: 12px;\n \n i {\n color: #6366f1;\n }\n }\n \n .header-subtitle {\n margin: 4px 0 0 0;\n font-size: 13px;\n color: #6c757d;\n font-weight: normal;\n }\n }\n }\n\n kendo-splitter {\n flex: 1;\n background: white;\n display: flex;\n height: 100%;\n min-height: 0;\n overflow: hidden;\n \n ::ng-deep .k-pane {\n overflow: hidden;\n height: 100%;\n }\n }\n\n .components-panel {\n height: 100%;\n display: flex;\n flex-direction: column;\n background: #f8f9fa;\n \n .panel-header {\n padding: 20px;\n background: white;\n border-bottom: 1px solid #dee2e6;\n \n .panel-header-top {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 16px;\n \n h3 {\n margin: 0;\n font-size: 18px;\n font-weight: 600;\n color: #212529;\n }\n \n .header-actions {\n display: flex;\n align-items: center;\n gap: 12px;\n \n .favorites-toggle {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n border: 1px solid #dee2e6;\n background: white;\n border-radius: 20px;\n font-size: 13px;\n font-weight: 500;\n color: #6c757d;\n cursor: pointer;\n transition: all 0.2s ease;\n \n &:hover {\n background: #f8f9fa;\n border-color: #adb5bd;\n }\n \n &.active {\n background: #fff3cd;\n border-color: #ffc107;\n color: #856404;\n \n i {\n color: #ffc107;\n }\n }\n \n i {\n font-size: 14px;\n }\n }\n \n .component-count {\n font-size: 13px;\n color: #6c757d;\n background: #f8f9fa;\n padding: 4px 10px;\n border-radius: 12px;\n font-weight: 500;\n }\n }\n }\n \n .category-filters {\n margin-bottom: 16px;\n \n .filter-pills {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n \n .category-pill {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n border: 2px solid #e9ecef;\n background: white;\n border-radius: 20px;\n font-size: 13px;\n cursor: pointer;\n transition: all 0.2s ease;\n position: relative;\n overflow: hidden;\n \n &:hover {\n transform: translateY(-1px);\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\n }\n \n &.active {\n border-color: var(--pill-color);\n background: var(--pill-color);\n color: white;\n \n .pill-count {\n background: rgba(255, 255, 255, 0.3);\n color: white;\n }\n }\n \n .pill-name {\n font-weight: 500;\n }\n \n .pill-count {\n background: #f1f3f5;\n padding: 2px 6px;\n border-radius: 10px;\n font-size: 11px;\n font-weight: 600;\n min-width: 20px;\n text-align: center;\n }\n }\n \n .more-button,\n .clear-filters-button {\n padding: 6px 12px;\n border: 1px solid #dee2e6;\n background: white;\n border-radius: 20px;\n font-size: 13px;\n cursor: pointer;\n transition: all 0.2s ease;\n color: #6c757d;\n \n &:hover {\n background: #f8f9fa;\n border-color: #adb5bd;\n }\n \n i {\n font-size: 11px;\n margin-right: 4px;\n }\n }\n \n .clear-filters-button {\n background: #fee2e2;\n border-color: #fca5a5;\n color: #dc2626;\n \n &:hover {\n background: #fca5a5;\n color: white;\n }\n }\n }\n }\n \n .search-box {\n kendo-textbox {\n width: 100%;\n }\n }\n }\n \n .components-list {\n flex: 1;\n overflow-y: auto;\n overflow-x: hidden;\n padding: 16px;\n \n .loading-message,\n .empty-message {\n padding: 48px 24px;\n text-align: center;\n color: #6c757d;\n font-size: 14px;\n \n i {\n margin-right: 8px;\n }\n }\n \n .component-card {\n background: white;\n border: 1px solid #dee2e6;\n border-radius: 8px;\n margin-bottom: 12px;\n transition: all 0.2s ease;\n \n &:hover {\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);\n }\n \n &.expanded {\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);\n border-color: #6366f1;\n }\n \n &.running {\n border-color: #10b981;\n box-shadow: 0 0 0 3px rgba(16, 185, 129, 0.1);\n background: linear-gradient(to right, rgba(16, 185, 129, 0.03) 0%, white 100%);\n \n .card-header {\n &::before {\n content: '';\n position: absolute;\n left: 0;\n top: 0;\n bottom: 0;\n width: 4px;\n background: #10b981;\n }\n }\n }\n \n &.file-loaded {\n background: linear-gradient(135deg, #f0f8ff 0%, white 100%);\n border-style: dashed;\n border-color: #3b82f6;\n \n &:hover {\n box-shadow: 0 2px 8px rgba(59, 130, 246, 0.15);\n }\n \n &.expanded {\n border-style: solid;\n box-shadow: 0 4px 12px rgba(59, 130, 246, 0.2);\n }\n }\n \n .card-header {\n display: flex;\n align-items: center;\n padding: 16px;\n cursor: pointer;\n user-select: none;\n position: relative;\n \n &:hover {\n background: #f8f9fa;\n }\n \n .card-icon {\n font-size: 24px;\n margin-right: 16px;\n width: 32px;\n text-align: center;\n flex-shrink: 0;\n }\n \n .favorite-btn {\n position: absolute;\n top: 12px;\n right: 48px; // Leave room for chevron\n background: white;\n border: 1px solid #dee2e6;\n border-radius: 50%;\n width: 32px;\n height: 32px;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n transition: all 0.2s ease;\n color: #6c757d;\n \n &:hover {\n background: #f8f9fa;\n transform: scale(1.1);\n }\n \n &.is-favorite {\n color: #ffc107;\n border-color: #ffc107;\n background: #fff3cd;\n \n &:hover {\n background: #ffe69c;\n }\n }\n \n i {\n font-size: 14px;\n }\n }\n \n .card-info {\n flex: 1;\n min-width: 0;\n \n .card-name {\n font-size: 15px;\n font-weight: 600;\n color: #212529;\n margin-bottom: 4px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n display: flex;\n align-items: center;\n gap: 8px;\n \n .file-badge {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 2px 6px;\n background: #e0f2fe;\n color: #0369a1;\n border-radius: 4px;\n font-size: 11px;\n font-weight: 500;\n flex-shrink: 0;\n \n i {\n font-size: 10px;\n }\n }\n }\n \n .card-meta {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 12px;\n color: #6c757d;\n \n .card-type {\n font-weight: 500;\n }\n \n .card-version {\n color: #868e96;\n }\n \n .status-badge {\n padding: 2px 6px;\n border-radius: 10px;\n font-size: 10px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.3px;\n \n &.published {\n background: #d1fae5;\n color: #065f46;\n }\n \n &.draft {\n background: #fef3c7;\n color: #92400e;\n }\n \n &.file {\n background: #e0f2fe;\n color: #0369a1;\n }\n \n &.text {\n background: #f3e8ff;\n color: #6b21a8;\n }\n }\n }\n \n .card-namespace {\n margin-top: 8px;\n \n .namespace-chip {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 10px;\n border-radius: 16px;\n font-size: 12px;\n font-weight: 500;\n color: white;\n \n i {\n font-size: 11px;\n opacity: 0.9;\n }\n }\n }\n }\n \n .card-chevron {\n color: #6c757d;\n font-size: 12px;\n margin-left: 12px;\n transition: transform 0.2s ease;\n }\n }\n \n .card-details {\n padding: 0 16px 16px 16px;\n border-top: 1px solid #e9ecef;\n animation: slideDown 0.2s ease;\n \n .detail-section {\n margin-top: 16px;\n \n label {\n display: block;\n font-size: 11px;\n font-weight: 600;\n color: #6c757d;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n margin-bottom: 8px;\n }\n \n p {\n margin: 0;\n font-size: 13px;\n color: #495057;\n line-height: 1.5;\n }\n \n .info-grid {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 8px;\n \n .info-item {\n display: flex;\n align-items: baseline;\n gap: 6px;\n font-size: 13px;\n \n .info-label {\n font-weight: 500;\n color: #6c757d;\n min-width: 50px;\n }\n \n .info-value {\n color: #212529;\n }\n }\n }\n }\n \n .card-actions {\n margin-top: 16px;\n display: flex;\n gap: 8px;\n \n button {\n flex: 1;\n }\n }\n }\n }\n }\n }\n\n .component-display {\n height: 100%;\n display: flex;\n flex-direction: column;\n background: white;\n position: relative;\n overflow: hidden;\n \n .empty-state {\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n color: #868e96;\n padding: 48px;\n text-align: center;\n \n i {\n color: #dee2e6;\n margin-bottom: 24px;\n }\n \n h2 {\n margin: 0 0 12px 0;\n font-size: 24px;\n font-weight: 600;\n color: #495057;\n }\n \n p {\n margin: 0;\n font-size: 14px;\n max-width: 400px;\n }\n }\n \n .error-display {\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 24px;\n background: #f8f9fa;\n \n .error-container {\n width: 100%;\n max-width: 600px;\n background: white;\n border: 2px solid #dc3545;\n border-radius: 8px;\n padding: 24px;\n box-shadow: 0 4px 12px rgba(220, 53, 69, 0.15);\n \n .error-header {\n display: flex;\n align-items: center;\n gap: 12px;\n margin-bottom: 20px;\n color: #dc3545;\n position: relative;\n \n i {\n font-size: 24px;\n }\n \n h3 {\n margin: 0;\n font-size: 20px;\n flex: 1;\n }\n \n .copy-button {\n background: white;\n border: 1px solid #dee2e6;\n border-radius: 4px;\n padding: 6px 10px;\n cursor: pointer;\n color: #6c757d;\n transition: all 0.2s;\n \n &:hover {\n background: #e9ecef;\n color: #495057;\n }\n \n i {\n font-size: 14px;\n }\n }\n }\n \n .error-intro {\n color: #495057;\n margin-bottom: 20px;\n font-size: 14px;\n }\n \n .error-details {\n background: #f8f9fa;\n border: 1px solid #dee2e6;\n border-radius: 4px;\n padding: 16px;\n margin-bottom: 20px;\n font-family: 'SF Mono', Monaco, 'Courier New', monospace;\n font-size: 13px;\n \n .technical-details {\n margin-top: 12px;\n \n summary {\n cursor: pointer;\n color: #0066cc;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n \n &:hover {\n text-decoration: underline;\n }\n }\n \n pre {\n margin-top: 8px;\n white-space: pre-wrap;\n word-break: break-word;\n font-size: 11px;\n color: #495057;\n max-height: 200px;\n overflow-y: auto;\n }\n }\n }\n \n .error-help {\n background: #e7f3ff;\n border: 1px solid #b3d9ff;\n border-radius: 4px;\n padding: 16px;\n margin-bottom: 20px;\n font-size: 13px;\n \n strong {\n display: block;\n margin-bottom: 8px;\n font-size: 14px;\n color: #0066cc;\n }\n \n ol {\n margin: 0;\n padding-left: 20px;\n \n li {\n margin-bottom: 4px;\n color: #495057;\n }\n }\n }\n \n .error-actions {\n display: flex;\n gap: 12px;\n \n button {\n min-width: 100px;\n }\n }\n }\n }\n \n mj-react-component {\n flex: 1;\n width: 100%;\n height: 100%;\n display: block;\n overflow-y: auto;\n overflow-x: hidden;\n }\n \n // Component and editor splitter\n .component-editor-splitter {\n height: 100%;\n overflow: hidden;\n \n ::ng-deep .k-splitter-bar {\n background: #6366f1; // Same blue as Import button\n width: 6px; // Make it slightly wider for visibility\n \n &:hover {\n background: #4f52d9; // Darker blue on hover\n }\n \n .k-resize-handle {\n background-color: rgba(255, 255, 255, 0.3);\n }\n }\n \n ::ng-deep .k-pane {\n overflow: hidden;\n display: flex;\n flex-direction: column;\n }\n }\n \n // Component runtime area\n .component-runtime {\n height: 100%;\n display: flex;\n flex-direction: column;\n background: white;\n position: relative;\n overflow-y: auto;\n overflow-x: hidden;\n \n .run-empty-state {\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 48px;\n text-align: center;\n \n i {\n color: #10b981;\n margin-bottom: 24px;\n }\n \n h3 {\n margin: 0 0 12px 0;\n font-size: 20px;\n font-weight: 600;\n color: #212529;\n }\n \n p {\n margin: 0 0 24px 0;\n font-size: 14px;\n color: #6c757d;\n max-width: 400px;\n }\n }\n }\n \n // Editor tabs on the right\n .editor-tabs {\n height: 100%;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n \n ::ng-deep .k-tabstrip-items-wrapper {\n background: #f8f9fa;\n border-bottom: 2px solid #dee2e6;\n flex-shrink: 0;\n }\n \n ::ng-deep .k-tabstrip-content {\n flex: 1;\n padding: 0;\n overflow: hidden;\n min-height: 0;\n display: flex;\n flex-direction: column;\n }\n \n ::ng-deep .k-item.k-tabstrip-item {\n font-weight: 500;\n \n &.k-active {\n background: white;\n border-bottom-color: white;\n }\n }\n }\n \n .tab-content {\n height: 100%;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n \n &.spec-tab, &.code-tab {\n height: 100%;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n \n .editor-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 12px 16px;\n background: #f8f9fa;\n border-bottom: 1px solid #dee2e6;\n flex-shrink: 0;\n min-width: 0; // Fix width issue\n \n h4 {\n margin: 0;\n font-size: 14px;\n font-weight: 600;\n color: #495057;\n display: flex;\n align-items: center;\n gap: 8px;\n flex-shrink: 1; // Allow title to shrink\n min-width: 0; // Prevent overflow\n \n i {\n color: #6366f1;\n flex-shrink: 0; // Keep icon from shrinking\n }\n }\n \n .editor-actions {\n display: flex;\n gap: 8px;\n flex-shrink: 0; // Prevent buttons from shrinking\n \n button {\n min-width: auto;\n padding: 4px 12px;\n font-size: 13px;\n white-space: nowrap; // Prevent button text wrapping\n }\n }\n }\n \n .editor-wrapper {\n flex: 1;\n overflow-y: auto;\n overflow-x: hidden;\n min-height: 0;\n position: relative;\n }\n \n ::ng-deep .monaco-editor {\n border: 1px solid #dee2e6;\n }\n }\n \n .code-sections {\n height: 100%;\n \n ::ng-deep .k-panelbar-item-header {\n background: #f8f9fa;\n font-weight: 500;\n font-size: 14px;\n }\n \n ::ng-deep .k-panelbar-content {\n padding: 0;\n }\n }\n }\n }\n}\n\n// Removed tree view styles - using modern category filters instead\n\n@keyframes slideDown {\n from {\n opacity: 0;\n transform: translateY(-10px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n@keyframes pulse {\n 0%, 100% {\n opacity: 1;\n }\n 50% {\n opacity: 0.5;\n }\n}"] }]
|
|
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}"] }]
|
|
1907
1943
|
}], () => [{ type: i0.ChangeDetectorRef }, { type: i1.DialogService }, { type: i0.ViewContainerRef }], { fileInput: [{
|
|
1908
1944
|
type: ViewChild,
|
|
1909
1945
|
args: ['fileInput', { static: false }]
|