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