@memberjunction/ng-dashboards 5.22.0 → 5.23.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (204) hide show
  1. package/README.md +51 -0
  2. package/dist/AI/components/agents/agent-configuration.component.d.ts.map +1 -1
  3. package/dist/AI/components/agents/agent-configuration.component.js +364 -362
  4. package/dist/AI/components/agents/agent-configuration.component.js.map +1 -1
  5. package/dist/AI/components/agents/agent-editor.component.js +2 -2
  6. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts +275 -64
  7. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts.map +1 -1
  8. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js +2645 -436
  9. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js.map +1 -1
  10. package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts +240 -6
  11. package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts.map +1 -1
  12. package/dist/AI/components/duplicates/duplicate-detection-resource.component.js +2166 -256
  13. package/dist/AI/components/duplicates/duplicate-detection-resource.component.js.map +1 -1
  14. package/dist/AI/components/execution-monitoring.component.d.ts.map +1 -1
  15. package/dist/AI/components/execution-monitoring.component.js +191 -197
  16. package/dist/AI/components/execution-monitoring.component.js.map +1 -1
  17. package/dist/AI/components/models/model-management.component.js +9 -8
  18. package/dist/AI/components/models/model-management.component.js.map +1 -1
  19. package/dist/AI/components/prompts/prompt-management.component.js +305 -299
  20. package/dist/AI/components/prompts/prompt-management.component.js.map +1 -1
  21. package/dist/AI/components/system/system-configuration.component.js +319 -313
  22. package/dist/AI/components/system/system-configuration.component.js.map +1 -1
  23. package/dist/AI/components/vectors/vector-management-resource.component.d.ts +1 -2
  24. package/dist/AI/components/vectors/vector-management-resource.component.d.ts.map +1 -1
  25. package/dist/AI/components/vectors/vector-management-resource.component.js +12 -27
  26. package/dist/AI/components/vectors/vector-management-resource.component.js.map +1 -1
  27. package/dist/APIKeys/api-applications-panel.component.js +10 -12
  28. package/dist/APIKeys/api-applications-panel.component.js.map +1 -1
  29. package/dist/APIKeys/api-key-create-dialog.component.js +13 -19
  30. package/dist/APIKeys/api-key-create-dialog.component.js.map +1 -1
  31. package/dist/APIKeys/api-key-edit-panel.component.js +12 -14
  32. package/dist/APIKeys/api-key-edit-panel.component.js.map +1 -1
  33. package/dist/APIKeys/api-scopes-panel.component.js +61 -68
  34. package/dist/APIKeys/api-scopes-panel.component.js.map +1 -1
  35. package/dist/APIKeys/api-usage-panel.component.js +10 -11
  36. package/dist/APIKeys/api-usage-panel.component.js.map +1 -1
  37. package/dist/Actions/components/actions-list-view.component.js +82 -96
  38. package/dist/Actions/components/actions-list-view.component.js.map +1 -1
  39. package/dist/Actions/components/actions-overview.component.js +130 -134
  40. package/dist/Actions/components/actions-overview.component.js.map +1 -1
  41. package/dist/Actions/components/categories-list-view.component.d.ts.map +1 -1
  42. package/dist/Actions/components/categories-list-view.component.js +40 -46
  43. package/dist/Actions/components/categories-list-view.component.js.map +1 -1
  44. package/dist/Actions/components/code-management.component.js +2 -2
  45. package/dist/Actions/components/code-management.component.js.map +1 -1
  46. package/dist/Actions/components/entity-integration.component.js +2 -2
  47. package/dist/Actions/components/entity-integration.component.js.map +1 -1
  48. package/dist/Actions/components/execution-monitoring.component.js +127 -132
  49. package/dist/Actions/components/execution-monitoring.component.js.map +1 -1
  50. package/dist/Actions/components/executions-list-view.component.js +2 -2
  51. package/dist/Actions/components/executions-list-view.component.js.map +1 -1
  52. package/dist/Actions/components/explorer/action-card.component.js +11 -17
  53. package/dist/Actions/components/explorer/action-card.component.js.map +1 -1
  54. package/dist/Actions/components/explorer/action-explorer.component.js +5 -11
  55. package/dist/Actions/components/explorer/action-explorer.component.js.map +1 -1
  56. package/dist/Actions/components/explorer/action-list-item.component.js +8 -10
  57. package/dist/Actions/components/explorer/action-list-item.component.js.map +1 -1
  58. package/dist/Actions/components/explorer/action-toolbar.component.js +112 -133
  59. package/dist/Actions/components/explorer/action-toolbar.component.js.map +1 -1
  60. package/dist/Actions/components/explorer/action-tree-panel.component.js +63 -83
  61. package/dist/Actions/components/explorer/action-tree-panel.component.js.map +1 -1
  62. package/dist/Actions/components/explorer/new-action-panel.component.js +17 -21
  63. package/dist/Actions/components/explorer/new-action-panel.component.js.map +1 -1
  64. package/dist/Actions/components/explorer/new-category-panel.component.js +17 -21
  65. package/dist/Actions/components/explorer/new-category-panel.component.js.map +1 -1
  66. package/dist/Actions/components/scheduled-actions.component.js +2 -2
  67. package/dist/Actions/components/scheduled-actions.component.js.map +1 -1
  68. package/dist/Actions/components/security-permissions.component.js +2 -2
  69. package/dist/Actions/components/security-permissions.component.js.map +1 -1
  70. package/dist/ComponentStudio/component-studio-dashboard.component.d.ts +13 -5
  71. package/dist/ComponentStudio/component-studio-dashboard.component.d.ts.map +1 -1
  72. package/dist/ComponentStudio/component-studio-dashboard.component.js +168 -145
  73. package/dist/ComponentStudio/component-studio-dashboard.component.js.map +1 -1
  74. package/dist/ComponentStudio/components/artifact-load-dialog.component.d.ts +4 -5
  75. package/dist/ComponentStudio/components/artifact-load-dialog.component.d.ts.map +1 -1
  76. package/dist/ComponentStudio/components/artifact-load-dialog.component.js +197 -200
  77. package/dist/ComponentStudio/components/artifact-load-dialog.component.js.map +1 -1
  78. package/dist/ComponentStudio/components/artifact-selection-dialog.component.d.ts +5 -7
  79. package/dist/ComponentStudio/components/artifact-selection-dialog.component.d.ts.map +1 -1
  80. package/dist/ComponentStudio/components/artifact-selection-dialog.component.js +142 -148
  81. package/dist/ComponentStudio/components/artifact-selection-dialog.component.js.map +1 -1
  82. package/dist/ComponentStudio/components/browser/component-browser.component.js +153 -166
  83. package/dist/ComponentStudio/components/browser/component-browser.component.js.map +1 -1
  84. package/dist/ComponentStudio/components/editors/code-editor-panel.component.js +15 -20
  85. package/dist/ComponentStudio/components/editors/code-editor-panel.component.js.map +1 -1
  86. package/dist/ComponentStudio/components/editors/data-requirements-editor.component.js +16 -21
  87. package/dist/ComponentStudio/components/editors/data-requirements-editor.component.js.map +1 -1
  88. package/dist/ComponentStudio/components/editors/requirements-editor.component.js +18 -23
  89. package/dist/ComponentStudio/components/editors/requirements-editor.component.js.map +1 -1
  90. package/dist/ComponentStudio/components/editors/spec-editor.component.js +25 -30
  91. package/dist/ComponentStudio/components/editors/spec-editor.component.js.map +1 -1
  92. package/dist/ComponentStudio/components/new-component-dialog/new-component-dialog.component.js +10 -11
  93. package/dist/ComponentStudio/components/new-component-dialog/new-component-dialog.component.js.map +1 -1
  94. package/dist/ComponentStudio/components/save-version-dialog/save-version-dialog.component.d.ts.map +1 -1
  95. package/dist/ComponentStudio/components/save-version-dialog/save-version-dialog.component.js +24 -35
  96. package/dist/ComponentStudio/components/save-version-dialog/save-version-dialog.component.js.map +1 -1
  97. package/dist/ComponentStudio/components/text-import-dialog.component.js +15 -17
  98. package/dist/ComponentStudio/components/text-import-dialog.component.js.map +1 -1
  99. package/dist/Credentials/components/credentials-categories-resource.component.js +7 -6
  100. package/dist/Credentials/components/credentials-categories-resource.component.js.map +1 -1
  101. package/dist/Credentials/components/credentials-list-resource.component.js +6 -5
  102. package/dist/Credentials/components/credentials-list-resource.component.js.map +1 -1
  103. package/dist/Credentials/components/credentials-types-resource.component.js +7 -6
  104. package/dist/Credentials/components/credentials-types-resource.component.js.map +1 -1
  105. package/dist/DashboardBrowser/dashboard-share-dialog.component.js +9 -9
  106. package/dist/DashboardBrowser/dashboard-share-dialog.component.js.map +1 -1
  107. package/dist/Home/home-dashboard.component.js +4 -4
  108. package/dist/Home/home-dashboard.component.js.map +1 -1
  109. package/dist/Integration/components/connections/connections.component.js +4 -4
  110. package/dist/Integration/components/connections/connections.component.js.map +1 -1
  111. package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js +246 -259
  112. package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js.map +1 -1
  113. package/dist/Integration/components/widgets/integration-card.component.js +7 -9
  114. package/dist/Integration/components/widgets/integration-card.component.js.map +1 -1
  115. package/dist/Integration/integration.module.d.ts +6 -10
  116. package/dist/Integration/integration.module.d.ts.map +1 -1
  117. package/dist/Integration/integration.module.js +12 -20
  118. package/dist/Integration/integration.module.js.map +1 -1
  119. package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.d.ts +106 -0
  120. package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.d.ts.map +1 -0
  121. package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js +607 -0
  122. package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js.map +1 -0
  123. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.d.ts +7 -2
  124. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.d.ts.map +1 -1
  125. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js +59 -31
  126. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js.map +1 -1
  127. package/dist/KnowledgeHub/index.d.ts +1 -0
  128. package/dist/KnowledgeHub/index.d.ts.map +1 -1
  129. package/dist/KnowledgeHub/index.js +1 -0
  130. package/dist/KnowledgeHub/index.js.map +1 -1
  131. package/dist/Lists/components/lists-browse-resource.component.d.ts.map +1 -1
  132. package/dist/Lists/components/lists-browse-resource.component.js +9 -7
  133. package/dist/Lists/components/lists-browse-resource.component.js.map +1 -1
  134. package/dist/Lists/components/lists-my-lists-resource.component.js +5 -4
  135. package/dist/Lists/components/lists-my-lists-resource.component.js.map +1 -1
  136. package/dist/Lists/components/lists-operations-resource.component.js +10 -9
  137. package/dist/Lists/components/lists-operations-resource.component.js.map +1 -1
  138. package/dist/MCP/components/mcp-connection-dialog.component.js +141 -132
  139. package/dist/MCP/components/mcp-connection-dialog.component.js.map +1 -1
  140. package/dist/MCP/components/mcp-log-detail-panel.component.js +4 -4
  141. package/dist/MCP/components/mcp-log-detail-panel.component.js.map +1 -1
  142. package/dist/MCP/components/mcp-server-dialog.component.js +141 -128
  143. package/dist/MCP/components/mcp-server-dialog.component.js.map +1 -1
  144. package/dist/MCP/components/mcp-test-tool-dialog.component.js +210 -218
  145. package/dist/MCP/components/mcp-test-tool-dialog.component.js.map +1 -1
  146. package/dist/MCP/mcp-dashboard.component.js +2 -2
  147. package/dist/MCP/mcp-dashboard.component.js.map +1 -1
  148. package/dist/MCP/mcp.module.d.ts +6 -9
  149. package/dist/MCP/mcp.module.d.ts.map +1 -1
  150. package/dist/MCP/mcp.module.js +20 -22
  151. package/dist/MCP/mcp.module.js.map +1 -1
  152. package/dist/Scheduling/components/scheduling-activity.component.js +5 -4
  153. package/dist/Scheduling/components/scheduling-activity.component.js.map +1 -1
  154. package/dist/Scheduling/components/scheduling-jobs.component.js +6 -5
  155. package/dist/Scheduling/components/scheduling-jobs.component.js.map +1 -1
  156. package/dist/Scheduling/components/scheduling-overview.component.js +93 -92
  157. package/dist/Scheduling/components/scheduling-overview.component.js.map +1 -1
  158. package/dist/Testing/testing-dashboard.component.js +9 -10
  159. package/dist/Testing/testing-dashboard.component.js.map +1 -1
  160. package/dist/actions-dashboards.module.d.ts +8 -13
  161. package/dist/actions-dashboards.module.d.ts.map +1 -1
  162. package/dist/actions-dashboards.module.js +6 -27
  163. package/dist/actions-dashboards.module.js.map +1 -1
  164. package/dist/ai-dashboards.module.d.ts +16 -20
  165. package/dist/ai-dashboards.module.d.ts.map +1 -1
  166. package/dist/ai-dashboards.module.js +23 -44
  167. package/dist/ai-dashboards.module.js.map +1 -1
  168. package/dist/communication-dashboards.module.d.ts +4 -8
  169. package/dist/communication-dashboards.module.d.ts.map +1 -1
  170. package/dist/communication-dashboards.module.js +0 -19
  171. package/dist/communication-dashboards.module.js.map +1 -1
  172. package/dist/component-studio-dashboards.module.d.ts +7 -11
  173. package/dist/component-studio-dashboards.module.d.ts.map +1 -1
  174. package/dist/component-studio-dashboards.module.js +22 -34
  175. package/dist/component-studio-dashboards.module.js.map +1 -1
  176. package/dist/core-dashboards.module.d.ts +12 -18
  177. package/dist/core-dashboards.module.d.ts.map +1 -1
  178. package/dist/core-dashboards.module.js +15 -31
  179. package/dist/core-dashboards.module.js.map +1 -1
  180. package/dist/credentials-dashboards.module.d.ts +5 -8
  181. package/dist/credentials-dashboards.module.d.ts.map +1 -1
  182. package/dist/credentials-dashboards.module.js +3 -19
  183. package/dist/credentials-dashboards.module.js.map +1 -1
  184. package/dist/data-explorer-dashboards.module.d.ts +7 -13
  185. package/dist/data-explorer-dashboards.module.d.ts.map +1 -1
  186. package/dist/data-explorer-dashboards.module.js +0 -27
  187. package/dist/data-explorer-dashboards.module.js.map +1 -1
  188. package/dist/lists-dashboards.module.d.ts +5 -8
  189. package/dist/lists-dashboards.module.d.ts.map +1 -1
  190. package/dist/lists-dashboards.module.js +3 -19
  191. package/dist/lists-dashboards.module.js.map +1 -1
  192. package/dist/public-api.d.ts +1 -0
  193. package/dist/public-api.d.ts.map +1 -1
  194. package/dist/public-api.js +1 -0
  195. package/dist/public-api.js.map +1 -1
  196. package/dist/scheduling-dashboards.module.d.ts +6 -10
  197. package/dist/scheduling-dashboards.module.d.ts.map +1 -1
  198. package/dist/scheduling-dashboards.module.js +3 -23
  199. package/dist/scheduling-dashboards.module.js.map +1 -1
  200. package/dist/testing-dashboards.module.d.ts +7 -13
  201. package/dist/testing-dashboards.module.d.ts.map +1 -1
  202. package/dist/testing-dashboards.module.js +0 -27
  203. package/dist/testing-dashboards.module.js.map +1 -1
  204. package/package.json +47 -55
@@ -3,9 +3,9 @@ import * as i0 from "@angular/core";
3
3
  import * as i1 from "../../services/component-studio-state.service";
4
4
  import * as i2 from "@angular/common";
5
5
  import * as i3 from "@angular/forms";
6
- import * as i4 from "@progress/kendo-angular-buttons";
7
- import * as i5 from "@memberjunction/ng-code-editor";
8
- import * as i6 from "@memberjunction/ng-markdown";
6
+ import * as i4 from "@memberjunction/ng-code-editor";
7
+ import * as i5 from "@memberjunction/ng-markdown";
8
+ import * as i6 from "@memberjunction/ng-ui-components";
9
9
  function RequirementsEditorComponent_Conditional_6_Template(rf, ctx) { if (rf & 1) {
10
10
  const _r1 = i0.ɵɵgetCurrentView();
11
11
  i0.ɵɵelementStart(0, "div", 5)(1, "button", 12);
@@ -13,31 +13,26 @@ function RequirementsEditorComponent_Conditional_6_Template(rf, ctx) { if (rf &
13
13
  i0.ɵɵelement(2, "i", 13);
14
14
  i0.ɵɵtext(3, " Apply ");
15
15
  i0.ɵɵelementEnd();
16
- i0.ɵɵelementStart(4, "button", 12);
16
+ i0.ɵɵelementStart(4, "button", 14);
17
17
  i0.ɵɵlistener("click", function RequirementsEditorComponent_Conditional_6_Template_button_click_4_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.CancelChanges()); });
18
18
  i0.ɵɵtext(5, " Cancel ");
19
19
  i0.ɵɵelementEnd()();
20
- } if (rf & 2) {
21
- i0.ɵɵadvance();
22
- i0.ɵɵproperty("themeColor", "primary");
23
- i0.ɵɵadvance(3);
24
- i0.ɵɵproperty("themeColor", "base");
25
20
  } }
26
21
  function RequirementsEditorComponent_Conditional_15_Conditional_0_Conditional_1_Template(rf, ctx) { if (rf & 1) {
27
- i0.ɵɵelement(0, "mj-markdown", 16);
22
+ i0.ɵɵelement(0, "mj-markdown", 17);
28
23
  } if (rf & 2) {
29
24
  const ctx_r1 = i0.ɵɵnextContext(3);
30
25
  i0.ɵɵproperty("data", ctx_r1.EditableContent)("enableCodeCopy", true);
31
26
  } }
32
27
  function RequirementsEditorComponent_Conditional_15_Conditional_0_Conditional_2_Template(rf, ctx) { if (rf & 1) {
33
28
  const _r3 = i0.ɵɵgetCurrentView();
34
- i0.ɵɵelementStart(0, "div", 17);
35
- i0.ɵɵelement(1, "i", 18);
29
+ i0.ɵɵelementStart(0, "div", 18);
30
+ i0.ɵɵelement(1, "i", 19);
36
31
  i0.ɵɵelementStart(2, "p");
37
32
  i0.ɵɵtext(3);
38
33
  i0.ɵɵpipe(4, "lowercase");
39
34
  i0.ɵɵelementEnd();
40
- i0.ɵɵelementStart(5, "button", 19);
35
+ i0.ɵɵelementStart(5, "button", 20);
41
36
  i0.ɵɵlistener("click", function RequirementsEditorComponent_Conditional_15_Conditional_0_Conditional_2_Template_button_click_5_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.SetViewMode("edit")); });
42
37
  i0.ɵɵelement(6, "i", 9);
43
38
  i0.ɵɵtext(7, " Start writing ");
@@ -48,8 +43,8 @@ function RequirementsEditorComponent_Conditional_15_Conditional_0_Conditional_2_
48
43
  i0.ɵɵtextInterpolate1("No ", i0.ɵɵpipeBind1(4, 1, ctx_r1.Title), " defined yet.");
49
44
  } }
50
45
  function RequirementsEditorComponent_Conditional_15_Conditional_0_Template(rf, ctx) { if (rf & 1) {
51
- i0.ɵɵelementStart(0, "div", 14);
52
- i0.ɵɵconditionalCreate(1, RequirementsEditorComponent_Conditional_15_Conditional_0_Conditional_1_Template, 1, 2, "mj-markdown", 16)(2, RequirementsEditorComponent_Conditional_15_Conditional_0_Conditional_2_Template, 8, 3, "div", 17);
46
+ i0.ɵɵelementStart(0, "div", 15);
47
+ i0.ɵɵconditionalCreate(1, RequirementsEditorComponent_Conditional_15_Conditional_0_Conditional_1_Template, 1, 2, "mj-markdown", 17)(2, RequirementsEditorComponent_Conditional_15_Conditional_0_Conditional_2_Template, 8, 3, "div", 18);
53
48
  i0.ɵɵelementEnd();
54
49
  } if (rf & 2) {
55
50
  const ctx_r1 = i0.ɵɵnextContext(2);
@@ -58,7 +53,7 @@ function RequirementsEditorComponent_Conditional_15_Conditional_0_Template(rf, c
58
53
  } }
59
54
  function RequirementsEditorComponent_Conditional_15_Conditional_1_Template(rf, ctx) { if (rf & 1) {
60
55
  const _r4 = i0.ɵɵgetCurrentView();
61
- i0.ɵɵelementStart(0, "div", 15)(1, "mj-code-editor", 20);
56
+ i0.ɵɵelementStart(0, "div", 16)(1, "mj-code-editor", 21);
62
57
  i0.ɵɵtwoWayListener("ngModelChange", function RequirementsEditorComponent_Conditional_15_Conditional_1_Template_mj_code_editor_ngModelChange_1_listener($event) { i0.ɵɵrestoreView(_r4); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.EditableContent, $event) || (ctx_r1.EditableContent = $event); return i0.ɵɵresetView($event); });
63
58
  i0.ɵɵlistener("ngModelChange", function RequirementsEditorComponent_Conditional_15_Conditional_1_Template_mj_code_editor_ngModelChange_1_listener() { i0.ɵɵrestoreView(_r4); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.OnContentChanged()); });
64
59
  i0.ɵɵelementEnd()();
@@ -69,14 +64,14 @@ function RequirementsEditorComponent_Conditional_15_Conditional_1_Template(rf, c
69
64
  i0.ɵɵproperty("language", "markdown")("indentWithTab", true)("placeholder", "Enter " + ctx_r1.Title + " in markdown format...");
70
65
  } }
71
66
  function RequirementsEditorComponent_Conditional_15_Template(rf, ctx) { if (rf & 1) {
72
- i0.ɵɵconditionalCreate(0, RequirementsEditorComponent_Conditional_15_Conditional_0_Template, 3, 1, "div", 14)(1, RequirementsEditorComponent_Conditional_15_Conditional_1_Template, 2, 4, "div", 15);
67
+ i0.ɵɵconditionalCreate(0, RequirementsEditorComponent_Conditional_15_Conditional_0_Template, 3, 1, "div", 15)(1, RequirementsEditorComponent_Conditional_15_Conditional_1_Template, 2, 4, "div", 16);
73
68
  } if (rf & 2) {
74
69
  const ctx_r1 = i0.ɵɵnextContext();
75
70
  i0.ɵɵconditional(ctx_r1.ViewMode === "preview" ? 0 : 1);
76
71
  } }
77
72
  function RequirementsEditorComponent_Conditional_16_Template(rf, ctx) { if (rf & 1) {
78
73
  i0.ɵɵelementStart(0, "div", 11);
79
- i0.ɵɵelement(1, "i", 18);
74
+ i0.ɵɵelement(1, "i", 19);
80
75
  i0.ɵɵelementStart(2, "p");
81
76
  i0.ɵɵtext(3);
82
77
  i0.ɵɵpipe(4, "lowercase");
@@ -152,13 +147,13 @@ export class RequirementsEditorComponent {
152
147
  }
153
148
  }
154
149
  static ɵfac = function RequirementsEditorComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || RequirementsEditorComponent)(i0.ɵɵdirectiveInject(i1.ComponentStudioStateService), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); };
155
- static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: RequirementsEditorComponent, selectors: [["mj-requirements-editor"]], inputs: { Field: "Field", Title: "Title" }, standalone: false, decls: 17, vars: 8, consts: [[1, "requirements-editor"], [1, "editor-header"], [1, "header-title"], [1, "fa-solid", 3, "ngClass"], [1, "header-right"], [1, "action-buttons"], [1, "mode-toggle"], [1, "mode-btn", 3, "click"], [1, "fa-solid", "fa-eye"], [1, "fa-solid", "fa-pencil"], [1, "editor-body"], [1, "empty-state"], ["kendoButton", "", 1, "action-btn", 3, "click", "themeColor"], [1, "fa-solid", "fa-check"], [1, "preview-container"], [1, "code-editor-container"], [3, "data", "enableCodeCopy"], [1, "empty-preview"], [1, "fa-solid", "fa-file-lines"], [1, "edit-link", 3, "click"], [3, "ngModelChange", "ngModel", "language", "indentWithTab", "placeholder"]], template: function RequirementsEditorComponent_Template(rf, ctx) { if (rf & 1) {
150
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: RequirementsEditorComponent, selectors: [["mj-requirements-editor"]], inputs: { Field: "Field", Title: "Title" }, standalone: false, decls: 17, vars: 8, consts: [[1, "requirements-editor"], [1, "editor-header"], [1, "header-title"], [1, "fa-solid", 3, "ngClass"], [1, "header-right"], [1, "action-buttons"], [1, "mode-toggle"], [1, "mode-btn", 3, "click"], [1, "fa-solid", "fa-eye"], [1, "fa-solid", "fa-pencil"], [1, "editor-body"], [1, "empty-state"], ["mjButton", "", "variant", "primary", 1, "action-btn", 3, "click"], [1, "fa-solid", "fa-check"], ["mjButton", "", 1, "action-btn", 3, "click"], [1, "preview-container"], [1, "code-editor-container"], [3, "data", "enableCodeCopy"], [1, "empty-preview"], [1, "fa-solid", "fa-file-lines"], [1, "edit-link", 3, "click"], [3, "ngModelChange", "ngModel", "language", "indentWithTab", "placeholder"]], template: function RequirementsEditorComponent_Template(rf, ctx) { if (rf & 1) {
156
151
  i0.ɵɵelementStart(0, "div", 0)(1, "div", 1)(2, "span", 2);
157
152
  i0.ɵɵelement(3, "i", 3);
158
153
  i0.ɵɵtext(4);
159
154
  i0.ɵɵelementEnd();
160
155
  i0.ɵɵelementStart(5, "div", 4);
161
- i0.ɵɵconditionalCreate(6, RequirementsEditorComponent_Conditional_6_Template, 6, 2, "div", 5);
156
+ i0.ɵɵconditionalCreate(6, RequirementsEditorComponent_Conditional_6_Template, 6, 0, "div", 5);
162
157
  i0.ɵɵelementStart(7, "div", 6)(8, "button", 7);
163
158
  i0.ɵɵlistener("click", function RequirementsEditorComponent_Template_button_click_8_listener() { return ctx.SetViewMode("preview"); });
164
159
  i0.ɵɵelement(9, "i", 8);
@@ -185,7 +180,7 @@ export class RequirementsEditorComponent {
185
180
  i0.ɵɵclassProp("active", ctx.ViewMode === "edit");
186
181
  i0.ɵɵadvance(4);
187
182
  i0.ɵɵconditional(ctx.State.SelectedComponent ? 15 : 16);
188
- } }, dependencies: [i2.NgClass, i3.NgControlStatus, i3.NgModel, i4.ButtonComponent, i5.CodeEditorComponent, i6.MarkdownComponent, i2.LowerCasePipe], styles: [".requirements-editor[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n height: 100%;\n }\n\n .editor-header[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 8px 12px;\n border-bottom: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n flex-shrink: 0;\n gap: 8px;\n }\n\n .header-title[_ngcontent-%COMP%] {\n font-weight: 600;\n font-size: 13px;\n color: var(--mj-text-primary);\n white-space: nowrap;\n }\n\n .header-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n margin-right: 6px;\n color: var(--mj-brand-primary);\n }\n\n .header-right[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .action-buttons[_ngcontent-%COMP%] {\n display: flex;\n gap: 6px;\n }\n\n .action-btn[_ngcontent-%COMP%] {\n font-size: 12px;\n }\n\n .mode-toggle[_ngcontent-%COMP%] {\n display: inline-flex;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n overflow: hidden;\n }\n\n .mode-btn[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 4px 10px;\n border: none;\n background: transparent;\n color: var(--mj-text-secondary);\n font-size: 11px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s ease;\n font-family: inherit;\n }\n\n .mode-btn[_ngcontent-%COMP%]:not(:last-child) {\n border-right: 1px solid var(--mj-border-default);\n }\n\n .mode-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-sunken);\n }\n\n .mode-btn.active[_ngcontent-%COMP%] {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n }\n\n .mode-btn[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 10px;\n }\n\n .editor-body[_ngcontent-%COMP%] {\n flex: 1;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n }\n\n .preview-container[_ngcontent-%COMP%] {\n flex: 1;\n overflow: auto;\n padding: 16px 20px;\n }\n\n .code-editor-container[_ngcontent-%COMP%] {\n flex: 1;\n overflow: hidden;\n }\n\n .code-editor-container[_ngcontent-%COMP%] mj-code-editor[_ngcontent-%COMP%] {\n display: block;\n height: 100%;\n }\n\n .empty-preview[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 40px 20px;\n color: var(--mj-text-secondary);\n }\n\n .empty-preview[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 32px;\n margin-bottom: 12px;\n opacity: 0.4;\n }\n\n .empty-preview[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0 0 12px;\n font-size: 13px;\n }\n\n .edit-link[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 6px 14px;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n background: transparent;\n color: var(--mj-brand-primary);\n font-size: 12px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s ease;\n font-family: inherit;\n }\n\n .edit-link[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n }\n\n .empty-state[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 40px 20px;\n color: var(--mj-text-secondary);\n flex: 1;\n }\n\n .empty-state[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 32px;\n margin-bottom: 12px;\n opacity: 0.4;\n }\n\n .empty-state[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 13px;\n text-align: center;\n }"] });
183
+ } }, dependencies: [i2.NgClass, i3.NgControlStatus, i3.NgModel, i4.CodeEditorComponent, i5.MarkdownComponent, i6.MJButtonDirective, i2.LowerCasePipe], styles: [".requirements-editor[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n height: 100%;\n }\n\n .editor-header[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 8px 12px;\n border-bottom: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n flex-shrink: 0;\n gap: 8px;\n }\n\n .header-title[_ngcontent-%COMP%] {\n font-weight: 600;\n font-size: 13px;\n color: var(--mj-text-primary);\n white-space: nowrap;\n }\n\n .header-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n margin-right: 6px;\n color: var(--mj-brand-primary);\n }\n\n .header-right[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .action-buttons[_ngcontent-%COMP%] {\n display: flex;\n gap: 6px;\n }\n\n .action-btn[_ngcontent-%COMP%] {\n font-size: 12px;\n }\n\n .mode-toggle[_ngcontent-%COMP%] {\n display: inline-flex;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n overflow: hidden;\n }\n\n .mode-btn[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 4px 10px;\n border: none;\n background: transparent;\n color: var(--mj-text-secondary);\n font-size: 11px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s ease;\n font-family: inherit;\n }\n\n .mode-btn[_ngcontent-%COMP%]:not(:last-child) {\n border-right: 1px solid var(--mj-border-default);\n }\n\n .mode-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-sunken);\n }\n\n .mode-btn.active[_ngcontent-%COMP%] {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n }\n\n .mode-btn[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 10px;\n }\n\n .editor-body[_ngcontent-%COMP%] {\n flex: 1;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n }\n\n .preview-container[_ngcontent-%COMP%] {\n flex: 1;\n overflow: auto;\n padding: 16px 20px;\n }\n\n .code-editor-container[_ngcontent-%COMP%] {\n flex: 1;\n overflow: hidden;\n }\n\n .code-editor-container[_ngcontent-%COMP%] mj-code-editor[_ngcontent-%COMP%] {\n display: block;\n height: 100%;\n }\n\n .empty-preview[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 40px 20px;\n color: var(--mj-text-secondary);\n }\n\n .empty-preview[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 32px;\n margin-bottom: 12px;\n opacity: 0.4;\n }\n\n .empty-preview[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0 0 12px;\n font-size: 13px;\n }\n\n .edit-link[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 6px 14px;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n background: transparent;\n color: var(--mj-brand-primary);\n font-size: 12px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s ease;\n font-family: inherit;\n }\n\n .edit-link[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n }\n\n .empty-state[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 40px 20px;\n color: var(--mj-text-secondary);\n flex: 1;\n }\n\n .empty-state[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 32px;\n margin-bottom: 12px;\n opacity: 0.4;\n }\n\n .empty-state[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 13px;\n text-align: center;\n }"] });
189
184
  }
190
185
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(RequirementsEditorComponent, [{
191
186
  type: Component,
@@ -199,10 +194,10 @@ export class RequirementsEditorComponent {
199
194
  <div class="header-right">
200
195
  @if (IsEditing) {
201
196
  <div class="action-buttons">
202
- <button kendoButton [themeColor]="'primary'" (click)="ApplyChanges()" class="action-btn">
197
+ <button mjButton variant="primary" (click)="ApplyChanges()" class="action-btn">
203
198
  <i class="fa-solid fa-check"></i> Apply
204
199
  </button>
205
- <button kendoButton [themeColor]="'base'" (click)="CancelChanges()" class="action-btn">
200
+ <button mjButton (click)="CancelChanges()" class="action-btn">
206
201
  Cancel
207
202
  </button>
208
203
  </div>
@@ -1 +1 @@
1
- {"version":3,"file":"requirements-editor.component.js","sourceRoot":"","sources":["../../../../src/ComponentStudio/components/editors/requirements-editor.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, Input, OnInit, OnDestroy, ChangeDetectorRef } from '@angular/core';\nimport { Subscription } from 'rxjs';\nimport { ComponentStudioStateService } from '../../services/component-studio-state.service';\nimport { ComponentSpec } from '@memberjunction/interactive-component-types';\n\ntype RequirementsField = 'functionalRequirements' | 'technicalDesign';\ntype EditorMode = 'preview' | 'edit';\n\n@Component({\n standalone: false,\n selector: 'mj-requirements-editor',\n template: `\n <div class=\"requirements-editor\">\n <div class=\"editor-header\">\n <span class=\"header-title\">\n <i class=\"fa-solid\" [ngClass]=\"FieldIcon\"></i>\n {{ Title }}\n </span>\n <div class=\"header-right\">\n @if (IsEditing) {\n <div class=\"action-buttons\">\n <button kendoButton [themeColor]=\"'primary'\" (click)=\"ApplyChanges()\" class=\"action-btn\">\n <i class=\"fa-solid fa-check\"></i> Apply\n </button>\n <button kendoButton [themeColor]=\"'base'\" (click)=\"CancelChanges()\" class=\"action-btn\">\n Cancel\n </button>\n </div>\n }\n <div class=\"mode-toggle\">\n <button class=\"mode-btn\" [class.active]=\"ViewMode === 'preview'\" (click)=\"SetViewMode('preview')\">\n <i class=\"fa-solid fa-eye\"></i> Preview\n </button>\n <button class=\"mode-btn\" [class.active]=\"ViewMode === 'edit'\" (click)=\"SetViewMode('edit')\">\n <i class=\"fa-solid fa-pencil\"></i> Edit\n </button>\n </div>\n </div>\n </div>\n\n <div class=\"editor-body\">\n @if (State.SelectedComponent) {\n @if (ViewMode === 'preview') {\n <div class=\"preview-container\">\n @if (EditableContent) {\n <mj-markdown [data]=\"EditableContent\" [enableCodeCopy]=\"true\"></mj-markdown>\n } @else {\n <div class=\"empty-preview\">\n <i class=\"fa-solid fa-file-lines\"></i>\n <p>No {{ Title | lowercase }} defined yet.</p>\n <button class=\"edit-link\" (click)=\"SetViewMode('edit')\">\n <i class=\"fa-solid fa-pencil\"></i> Start writing\n </button>\n </div>\n }\n </div>\n } @else {\n <div class=\"code-editor-container\">\n <mj-code-editor\n [(ngModel)]=\"EditableContent\"\n [language]=\"'markdown'\"\n [indentWithTab]=\"true\"\n [placeholder]=\"'Enter ' + Title + ' in markdown format...'\"\n (ngModelChange)=\"OnContentChanged()\">\n </mj-code-editor>\n </div>\n }\n } @else {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-file-lines\"></i>\n <p>Select a component to view its {{ Title | lowercase }}.</p>\n </div>\n }\n </div>\n </div>\n `,\n styles: [`\n .requirements-editor {\n display: flex;\n flex-direction: column;\n height: 100%;\n }\n\n .editor-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 8px 12px;\n border-bottom: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n flex-shrink: 0;\n gap: 8px;\n }\n\n .header-title {\n font-weight: 600;\n font-size: 13px;\n color: var(--mj-text-primary);\n white-space: nowrap;\n }\n\n .header-title i {\n margin-right: 6px;\n color: var(--mj-brand-primary);\n }\n\n .header-right {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .action-buttons {\n display: flex;\n gap: 6px;\n }\n\n .action-btn {\n font-size: 12px;\n }\n\n .mode-toggle {\n display: inline-flex;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n overflow: hidden;\n }\n\n .mode-btn {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 4px 10px;\n border: none;\n background: transparent;\n color: var(--mj-text-secondary);\n font-size: 11px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s ease;\n font-family: inherit;\n }\n\n .mode-btn:not(:last-child) {\n border-right: 1px solid var(--mj-border-default);\n }\n\n .mode-btn:hover {\n background: var(--mj-bg-surface-sunken);\n }\n\n .mode-btn.active {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n }\n\n .mode-btn i {\n font-size: 10px;\n }\n\n .editor-body {\n flex: 1;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n }\n\n .preview-container {\n flex: 1;\n overflow: auto;\n padding: 16px 20px;\n }\n\n .code-editor-container {\n flex: 1;\n overflow: hidden;\n }\n\n .code-editor-container mj-code-editor {\n display: block;\n height: 100%;\n }\n\n .empty-preview {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 40px 20px;\n color: var(--mj-text-secondary);\n }\n\n .empty-preview i {\n font-size: 32px;\n margin-bottom: 12px;\n opacity: 0.4;\n }\n\n .empty-preview p {\n margin: 0 0 12px;\n font-size: 13px;\n }\n\n .edit-link {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 6px 14px;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n background: transparent;\n color: var(--mj-brand-primary);\n font-size: 12px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s ease;\n font-family: inherit;\n }\n\n .edit-link:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n }\n\n .empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 40px 20px;\n color: var(--mj-text-secondary);\n flex: 1;\n }\n\n .empty-state i {\n font-size: 32px;\n margin-bottom: 12px;\n opacity: 0.4;\n }\n\n .empty-state p {\n margin: 0;\n font-size: 13px;\n text-align: center;\n }\n `]\n})\nexport class RequirementsEditorComponent implements OnInit, OnDestroy {\n @Input() Field: RequirementsField = 'functionalRequirements';\n @Input() Title: string = 'Functional Requirements';\n\n EditableContent: string = '';\n IsEditing: boolean = false;\n ViewMode: EditorMode = 'preview';\n\n private stateChangedSub: Subscription | null = null;\n\n constructor(\n public State: ComponentStudioStateService,\n private cdr: ChangeDetectorRef\n ) {}\n\n get FieldIcon(): string {\n return this.Field === 'functionalRequirements' ? 'fa-clipboard-list' : 'fa-drafting-compass';\n }\n\n ngOnInit(): void {\n this.loadContent();\n this.stateChangedSub = this.State.StateChanged.subscribe(() => {\n if (!this.IsEditing) {\n this.loadContent();\n }\n this.cdr.detectChanges();\n });\n }\n\n ngOnDestroy(): void {\n if (this.stateChangedSub) {\n this.stateChangedSub.unsubscribe();\n this.stateChangedSub = null;\n }\n }\n\n SetViewMode(mode: EditorMode): void {\n this.ViewMode = mode;\n this.cdr.detectChanges();\n }\n\n OnContentChanged(): void {\n this.IsEditing = true;\n }\n\n ApplyChanges(): void {\n try {\n const spec: ComponentSpec = JSON.parse(this.State.EditableSpec);\n spec[this.Field] = this.EditableContent;\n this.State.UpdateSpec(spec);\n this.IsEditing = false;\n this.ViewMode = 'preview';\n } catch (error) {\n console.error('Error applying requirements changes:', error);\n }\n }\n\n CancelChanges(): void {\n this.loadContent();\n this.IsEditing = false;\n this.ViewMode = 'preview';\n this.cdr.detectChanges();\n }\n\n private loadContent(): void {\n try {\n const spec = JSON.parse(this.State.EditableSpec);\n this.EditableContent = spec[this.Field] || '';\n } catch {\n this.EditableContent = '';\n }\n }\n}\n"]}
1
+ {"version":3,"file":"requirements-editor.component.js","sourceRoot":"","sources":["../../../../src/ComponentStudio/components/editors/requirements-editor.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, Input, OnInit, OnDestroy, ChangeDetectorRef } from '@angular/core';\nimport { Subscription } from 'rxjs';\nimport { ComponentStudioStateService } from '../../services/component-studio-state.service';\nimport { ComponentSpec } from '@memberjunction/interactive-component-types';\n\ntype RequirementsField = 'functionalRequirements' | 'technicalDesign';\ntype EditorMode = 'preview' | 'edit';\n\n@Component({\n standalone: false,\n selector: 'mj-requirements-editor',\n template: `\n <div class=\"requirements-editor\">\n <div class=\"editor-header\">\n <span class=\"header-title\">\n <i class=\"fa-solid\" [ngClass]=\"FieldIcon\"></i>\n {{ Title }}\n </span>\n <div class=\"header-right\">\n @if (IsEditing) {\n <div class=\"action-buttons\">\n <button mjButton variant=\"primary\" (click)=\"ApplyChanges()\" class=\"action-btn\">\n <i class=\"fa-solid fa-check\"></i> Apply\n </button>\n <button mjButton (click)=\"CancelChanges()\" class=\"action-btn\">\n Cancel\n </button>\n </div>\n }\n <div class=\"mode-toggle\">\n <button class=\"mode-btn\" [class.active]=\"ViewMode === 'preview'\" (click)=\"SetViewMode('preview')\">\n <i class=\"fa-solid fa-eye\"></i> Preview\n </button>\n <button class=\"mode-btn\" [class.active]=\"ViewMode === 'edit'\" (click)=\"SetViewMode('edit')\">\n <i class=\"fa-solid fa-pencil\"></i> Edit\n </button>\n </div>\n </div>\n </div>\n\n <div class=\"editor-body\">\n @if (State.SelectedComponent) {\n @if (ViewMode === 'preview') {\n <div class=\"preview-container\">\n @if (EditableContent) {\n <mj-markdown [data]=\"EditableContent\" [enableCodeCopy]=\"true\"></mj-markdown>\n } @else {\n <div class=\"empty-preview\">\n <i class=\"fa-solid fa-file-lines\"></i>\n <p>No {{ Title | lowercase }} defined yet.</p>\n <button class=\"edit-link\" (click)=\"SetViewMode('edit')\">\n <i class=\"fa-solid fa-pencil\"></i> Start writing\n </button>\n </div>\n }\n </div>\n } @else {\n <div class=\"code-editor-container\">\n <mj-code-editor\n [(ngModel)]=\"EditableContent\"\n [language]=\"'markdown'\"\n [indentWithTab]=\"true\"\n [placeholder]=\"'Enter ' + Title + ' in markdown format...'\"\n (ngModelChange)=\"OnContentChanged()\">\n </mj-code-editor>\n </div>\n }\n } @else {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-file-lines\"></i>\n <p>Select a component to view its {{ Title | lowercase }}.</p>\n </div>\n }\n </div>\n </div>\n `,\n styles: [`\n .requirements-editor {\n display: flex;\n flex-direction: column;\n height: 100%;\n }\n\n .editor-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 8px 12px;\n border-bottom: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n flex-shrink: 0;\n gap: 8px;\n }\n\n .header-title {\n font-weight: 600;\n font-size: 13px;\n color: var(--mj-text-primary);\n white-space: nowrap;\n }\n\n .header-title i {\n margin-right: 6px;\n color: var(--mj-brand-primary);\n }\n\n .header-right {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .action-buttons {\n display: flex;\n gap: 6px;\n }\n\n .action-btn {\n font-size: 12px;\n }\n\n .mode-toggle {\n display: inline-flex;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n overflow: hidden;\n }\n\n .mode-btn {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 4px 10px;\n border: none;\n background: transparent;\n color: var(--mj-text-secondary);\n font-size: 11px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s ease;\n font-family: inherit;\n }\n\n .mode-btn:not(:last-child) {\n border-right: 1px solid var(--mj-border-default);\n }\n\n .mode-btn:hover {\n background: var(--mj-bg-surface-sunken);\n }\n\n .mode-btn.active {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n }\n\n .mode-btn i {\n font-size: 10px;\n }\n\n .editor-body {\n flex: 1;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n }\n\n .preview-container {\n flex: 1;\n overflow: auto;\n padding: 16px 20px;\n }\n\n .code-editor-container {\n flex: 1;\n overflow: hidden;\n }\n\n .code-editor-container mj-code-editor {\n display: block;\n height: 100%;\n }\n\n .empty-preview {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 40px 20px;\n color: var(--mj-text-secondary);\n }\n\n .empty-preview i {\n font-size: 32px;\n margin-bottom: 12px;\n opacity: 0.4;\n }\n\n .empty-preview p {\n margin: 0 0 12px;\n font-size: 13px;\n }\n\n .edit-link {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 6px 14px;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n background: transparent;\n color: var(--mj-brand-primary);\n font-size: 12px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s ease;\n font-family: inherit;\n }\n\n .edit-link:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n }\n\n .empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 40px 20px;\n color: var(--mj-text-secondary);\n flex: 1;\n }\n\n .empty-state i {\n font-size: 32px;\n margin-bottom: 12px;\n opacity: 0.4;\n }\n\n .empty-state p {\n margin: 0;\n font-size: 13px;\n text-align: center;\n }\n `]\n})\nexport class RequirementsEditorComponent implements OnInit, OnDestroy {\n @Input() Field: RequirementsField = 'functionalRequirements';\n @Input() Title: string = 'Functional Requirements';\n\n EditableContent: string = '';\n IsEditing: boolean = false;\n ViewMode: EditorMode = 'preview';\n\n private stateChangedSub: Subscription | null = null;\n\n constructor(\n public State: ComponentStudioStateService,\n private cdr: ChangeDetectorRef\n ) {}\n\n get FieldIcon(): string {\n return this.Field === 'functionalRequirements' ? 'fa-clipboard-list' : 'fa-drafting-compass';\n }\n\n ngOnInit(): void {\n this.loadContent();\n this.stateChangedSub = this.State.StateChanged.subscribe(() => {\n if (!this.IsEditing) {\n this.loadContent();\n }\n this.cdr.detectChanges();\n });\n }\n\n ngOnDestroy(): void {\n if (this.stateChangedSub) {\n this.stateChangedSub.unsubscribe();\n this.stateChangedSub = null;\n }\n }\n\n SetViewMode(mode: EditorMode): void {\n this.ViewMode = mode;\n this.cdr.detectChanges();\n }\n\n OnContentChanged(): void {\n this.IsEditing = true;\n }\n\n ApplyChanges(): void {\n try {\n const spec: ComponentSpec = JSON.parse(this.State.EditableSpec);\n spec[this.Field] = this.EditableContent;\n this.State.UpdateSpec(spec);\n this.IsEditing = false;\n this.ViewMode = 'preview';\n } catch (error) {\n console.error('Error applying requirements changes:', error);\n }\n }\n\n CancelChanges(): void {\n this.loadContent();\n this.IsEditing = false;\n this.ViewMode = 'preview';\n this.cdr.detectChanges();\n }\n\n private loadContent(): void {\n try {\n const spec = JSON.parse(this.State.EditableSpec);\n this.EditableContent = spec[this.Field] || '';\n } catch {\n this.EditableContent = '';\n }\n }\n}\n"]}
@@ -2,8 +2,8 @@ import { Component } from '@angular/core';
2
2
  import * as i0 from "@angular/core";
3
3
  import * as i1 from "../../services/component-studio-state.service";
4
4
  import * as i2 from "@angular/forms";
5
- import * as i3 from "@progress/kendo-angular-buttons";
6
- import * as i4 from "@memberjunction/ng-code-editor";
5
+ import * as i3 from "@memberjunction/ng-code-editor";
6
+ import * as i4 from "@memberjunction/ng-ui-components";
7
7
  function SpecEditorComponent_Conditional_9_Template(rf, ctx) { if (rf & 1) {
8
8
  const _r1 = i0.ɵɵgetCurrentView();
9
9
  i0.ɵɵelementStart(0, "div", 6)(1, "button", 10);
@@ -11,18 +11,13 @@ function SpecEditorComponent_Conditional_9_Template(rf, ctx) { if (rf & 1) {
11
11
  i0.ɵɵelement(2, "i", 11);
12
12
  i0.ɵɵtext(3, " Apply ");
13
13
  i0.ɵɵelementEnd();
14
- i0.ɵɵelementStart(4, "button", 10);
14
+ i0.ɵɵelementStart(4, "button", 12);
15
15
  i0.ɵɵlistener("click", function SpecEditorComponent_Conditional_9_Template_button_click_4_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.CancelChanges()); });
16
16
  i0.ɵɵtext(5, " Cancel ");
17
17
  i0.ɵɵelementEnd()();
18
- } if (rf & 2) {
19
- i0.ɵɵadvance();
20
- i0.ɵɵproperty("themeColor", "primary");
21
- i0.ɵɵadvance(3);
22
- i0.ɵɵproperty("themeColor", "base");
23
18
  } }
24
19
  function SpecEditorComponent_Conditional_11_For_11_Template(rf, ctx) { if (rf & 1) {
25
- i0.ɵɵelementStart(0, "option", 17);
20
+ i0.ɵɵelementStart(0, "option", 18);
26
21
  i0.ɵɵtext(1);
27
22
  i0.ɵɵelementEnd();
28
23
  } if (rf & 2) {
@@ -33,51 +28,51 @@ function SpecEditorComponent_Conditional_11_For_11_Template(rf, ctx) { if (rf &
33
28
  } }
34
29
  function SpecEditorComponent_Conditional_11_Template(rf, ctx) { if (rf & 1) {
35
30
  const _r3 = i0.ɵɵgetCurrentView();
36
- i0.ɵɵelementStart(0, "div", 8)(1, "div", 12)(2, "div", 13)(3, "label", 14);
31
+ i0.ɵɵelementStart(0, "div", 8)(1, "div", 13)(2, "div", 14)(3, "label", 15);
37
32
  i0.ɵɵtext(4, "Name");
38
33
  i0.ɵɵelementEnd();
39
- i0.ɵɵelementStart(5, "input", 15);
34
+ i0.ɵɵelementStart(5, "input", 16);
40
35
  i0.ɵɵtwoWayListener("ngModelChange", function SpecEditorComponent_Conditional_11_Template_input_ngModelChange_5_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r1.FormModel.name, $event) || (ctx_r1.FormModel.name = $event); return i0.ɵɵresetView($event); });
41
36
  i0.ɵɵlistener("ngModelChange", function SpecEditorComponent_Conditional_11_Template_input_ngModelChange_5_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnFormChanged()); });
42
37
  i0.ɵɵelementEnd()();
43
- i0.ɵɵelementStart(6, "div", 13)(7, "label", 14);
38
+ i0.ɵɵelementStart(6, "div", 14)(7, "label", 15);
44
39
  i0.ɵɵtext(8, "Type");
45
40
  i0.ɵɵelementEnd();
46
- i0.ɵɵelementStart(9, "select", 16);
41
+ i0.ɵɵelementStart(9, "select", 17);
47
42
  i0.ɵɵtwoWayListener("ngModelChange", function SpecEditorComponent_Conditional_11_Template_select_ngModelChange_9_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r1.FormModel.type, $event) || (ctx_r1.FormModel.type = $event); return i0.ɵɵresetView($event); });
48
43
  i0.ɵɵlistener("ngModelChange", function SpecEditorComponent_Conditional_11_Template_select_ngModelChange_9_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnFormChanged()); });
49
- i0.ɵɵrepeaterCreate(10, SpecEditorComponent_Conditional_11_For_11_Template, 2, 2, "option", 17, i0.ɵɵrepeaterTrackByIdentity);
44
+ i0.ɵɵrepeaterCreate(10, SpecEditorComponent_Conditional_11_For_11_Template, 2, 2, "option", 18, i0.ɵɵrepeaterTrackByIdentity);
50
45
  i0.ɵɵelementEnd()()();
51
- i0.ɵɵelementStart(12, "div", 13)(13, "label", 14);
46
+ i0.ɵɵelementStart(12, "div", 14)(13, "label", 15);
52
47
  i0.ɵɵtext(14, "Title");
53
48
  i0.ɵɵelementEnd();
54
- i0.ɵɵelementStart(15, "input", 15);
49
+ i0.ɵɵelementStart(15, "input", 16);
55
50
  i0.ɵɵtwoWayListener("ngModelChange", function SpecEditorComponent_Conditional_11_Template_input_ngModelChange_15_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r1.FormModel.title, $event) || (ctx_r1.FormModel.title = $event); return i0.ɵɵresetView($event); });
56
51
  i0.ɵɵlistener("ngModelChange", function SpecEditorComponent_Conditional_11_Template_input_ngModelChange_15_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnFormChanged()); });
57
52
  i0.ɵɵelementEnd()();
58
- i0.ɵɵelementStart(16, "div", 13)(17, "label", 14);
53
+ i0.ɵɵelementStart(16, "div", 14)(17, "label", 15);
59
54
  i0.ɵɵtext(18, "Description");
60
55
  i0.ɵɵelementEnd();
61
- i0.ɵɵelementStart(19, "textarea", 18);
56
+ i0.ɵɵelementStart(19, "textarea", 19);
62
57
  i0.ɵɵtwoWayListener("ngModelChange", function SpecEditorComponent_Conditional_11_Template_textarea_ngModelChange_19_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r1.FormModel.description, $event) || (ctx_r1.FormModel.description = $event); return i0.ɵɵresetView($event); });
63
58
  i0.ɵɵlistener("ngModelChange", function SpecEditorComponent_Conditional_11_Template_textarea_ngModelChange_19_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnFormChanged()); });
64
59
  i0.ɵɵelementEnd()();
65
- i0.ɵɵelementStart(20, "div", 12)(21, "div", 13)(22, "label", 14);
60
+ i0.ɵɵelementStart(20, "div", 13)(21, "div", 14)(22, "label", 15);
66
61
  i0.ɵɵtext(23, "Location");
67
62
  i0.ɵɵelementEnd();
68
- i0.ɵɵelementStart(24, "select", 16);
63
+ i0.ɵɵelementStart(24, "select", 17);
69
64
  i0.ɵɵtwoWayListener("ngModelChange", function SpecEditorComponent_Conditional_11_Template_select_ngModelChange_24_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r1.FormModel.location, $event) || (ctx_r1.FormModel.location = $event); return i0.ɵɵresetView($event); });
70
65
  i0.ɵɵlistener("ngModelChange", function SpecEditorComponent_Conditional_11_Template_select_ngModelChange_24_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnFormChanged()); });
71
- i0.ɵɵelementStart(25, "option", 19);
66
+ i0.ɵɵelementStart(25, "option", 20);
72
67
  i0.ɵɵtext(26, "embedded");
73
68
  i0.ɵɵelementEnd();
74
- i0.ɵɵelementStart(27, "option", 20);
69
+ i0.ɵɵelementStart(27, "option", 21);
75
70
  i0.ɵɵtext(28, "standalone");
76
71
  i0.ɵɵelementEnd()()();
77
- i0.ɵɵelementStart(29, "div", 13)(30, "label", 14);
72
+ i0.ɵɵelementStart(29, "div", 14)(30, "label", 15);
78
73
  i0.ɵɵtext(31, "Example Usage");
79
74
  i0.ɵɵelementEnd();
80
- i0.ɵɵelementStart(32, "input", 21);
75
+ i0.ɵɵelementStart(32, "input", 22);
81
76
  i0.ɵɵtwoWayListener("ngModelChange", function SpecEditorComponent_Conditional_11_Template_input_ngModelChange_32_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r1.FormModel.exampleUsage, $event) || (ctx_r1.FormModel.exampleUsage = $event); return i0.ɵɵresetView($event); });
82
77
  i0.ɵɵlistener("ngModelChange", function SpecEditorComponent_Conditional_11_Template_input_ngModelChange_32_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnFormChanged()); });
83
78
  i0.ɵɵelementEnd()()()();
@@ -100,7 +95,7 @@ function SpecEditorComponent_Conditional_11_Template(rf, ctx) { if (rf & 1) {
100
95
  } }
101
96
  function SpecEditorComponent_Conditional_12_Template(rf, ctx) { if (rf & 1) {
102
97
  const _r5 = i0.ɵɵgetCurrentView();
103
- i0.ɵɵelementStart(0, "div", 9)(1, "mj-code-editor", 22);
98
+ i0.ɵɵelementStart(0, "div", 9)(1, "mj-code-editor", 23);
104
99
  i0.ɵɵtwoWayListener("ngModelChange", function SpecEditorComponent_Conditional_12_Template_mj_code_editor_ngModelChange_1_listener($event) { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r1.State.EditableSpec, $event) || (ctx_r1.State.EditableSpec = $event); return i0.ɵɵresetView($event); });
105
100
  i0.ɵɵlistener("ngModelChange", function SpecEditorComponent_Conditional_12_Template_mj_code_editor_ngModelChange_1_listener() { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnJsonChanged()); });
106
101
  i0.ɵɵelementEnd()();
@@ -198,7 +193,7 @@ export class SpecEditorComponent {
198
193
  }
199
194
  }
200
195
  static ɵfac = function SpecEditorComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || SpecEditorComponent)(i0.ɵɵdirectiveInject(i1.ComponentStudioStateService), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); };
201
- static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: SpecEditorComponent, selectors: [["mj-spec-editor"]], standalone: false, decls: 13, vars: 6, consts: [[1, "spec-editor"], [1, "editor-header"], [1, "mode-toggle"], [1, "mode-btn", 3, "click"], [1, "fa-solid", "fa-wpforms"], [1, "fa-solid", "fa-code"], [1, "action-buttons"], [1, "editor-body"], [1, "form-mode"], [1, "json-mode"], ["kendoButton", "", 1, "action-btn", 3, "click", "themeColor"], [1, "fa-solid", "fa-check"], [1, "form-row"], [1, "form-field"], [1, "form-label"], [1, "form-input", 3, "ngModelChange", "ngModel"], [1, "form-select", 3, "ngModelChange", "ngModel"], [3, "value"], ["rows", "3", 1, "form-textarea", 3, "ngModelChange", "ngModel"], ["value", "embedded"], ["value", "standalone"], ["placeholder", "Optional", 1, "form-input", 3, "ngModelChange", "ngModel"], [3, "ngModelChange", "ngModel", "language", "indentWithTab"]], template: function SpecEditorComponent_Template(rf, ctx) { if (rf & 1) {
196
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: SpecEditorComponent, selectors: [["mj-spec-editor"]], standalone: false, decls: 13, vars: 6, consts: [[1, "spec-editor"], [1, "editor-header"], [1, "mode-toggle"], [1, "mode-btn", 3, "click"], [1, "fa-solid", "fa-wpforms"], [1, "fa-solid", "fa-code"], [1, "action-buttons"], [1, "editor-body"], [1, "form-mode"], [1, "json-mode"], ["mjButton", "", "variant", "primary", 1, "action-btn", 3, "click"], [1, "fa-solid", "fa-check"], ["mjButton", "", 1, "action-btn", 3, "click"], [1, "form-row"], [1, "form-field"], [1, "form-label"], [1, "form-input", 3, "ngModelChange", "ngModel"], [1, "form-select", 3, "ngModelChange", "ngModel"], [3, "value"], ["rows", "3", 1, "form-textarea", 3, "ngModelChange", "ngModel"], ["value", "embedded"], ["value", "standalone"], ["placeholder", "Optional", 1, "form-input", 3, "ngModelChange", "ngModel"], [3, "ngModelChange", "ngModel", "language", "indentWithTab"]], template: function SpecEditorComponent_Template(rf, ctx) { if (rf & 1) {
202
197
  i0.ɵɵelementStart(0, "div", 0)(1, "div", 1)(2, "div", 2)(3, "button", 3);
203
198
  i0.ɵɵlistener("click", function SpecEditorComponent_Template_button_click_3_listener() { return ctx.SetMode("form"); });
204
199
  i0.ɵɵelement(4, "i", 4);
@@ -209,7 +204,7 @@ export class SpecEditorComponent {
209
204
  i0.ɵɵelement(7, "i", 5);
210
205
  i0.ɵɵtext(8, " JSON ");
211
206
  i0.ɵɵelementEnd()();
212
- i0.ɵɵconditionalCreate(9, SpecEditorComponent_Conditional_9_Template, 6, 2, "div", 6);
207
+ i0.ɵɵconditionalCreate(9, SpecEditorComponent_Conditional_9_Template, 6, 0, "div", 6);
213
208
  i0.ɵɵelementEnd();
214
209
  i0.ɵɵelementStart(10, "div", 7);
215
210
  i0.ɵɵconditionalCreate(11, SpecEditorComponent_Conditional_11_Template, 33, 6, "div", 8)(12, SpecEditorComponent_Conditional_12_Template, 2, 3, "div", 9);
@@ -223,7 +218,7 @@ export class SpecEditorComponent {
223
218
  i0.ɵɵconditional(ctx.State.IsEditingSpec ? 9 : -1);
224
219
  i0.ɵɵadvance(2);
225
220
  i0.ɵɵconditional(ctx.Mode === "form" ? 11 : 12);
226
- } }, dependencies: [i2.NgSelectOption, i2.ɵNgSelectMultipleOption, i2.DefaultValueAccessor, i2.SelectControlValueAccessor, i2.NgControlStatus, i2.NgModel, i3.ButtonComponent, i4.CodeEditorComponent], styles: [".spec-editor[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n height: 100%;\n }\n\n .editor-header[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 8px 12px;\n border-bottom: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n flex-shrink: 0;\n }\n\n .mode-toggle[_ngcontent-%COMP%] {\n display: inline-flex;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n overflow: hidden;\n }\n\n .mode-btn[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 4px 12px;\n border: none;\n background: transparent;\n color: var(--mj-text-secondary);\n font-size: 12px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s ease;\n font-family: inherit;\n }\n\n .mode-btn[_ngcontent-%COMP%]:not(:last-child) {\n border-right: 1px solid var(--mj-border-default);\n }\n\n .mode-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-sunken);\n }\n\n .mode-btn.active[_ngcontent-%COMP%] {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n }\n\n .mode-btn[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 11px;\n }\n\n .action-buttons[_ngcontent-%COMP%] {\n display: flex;\n gap: 6px;\n }\n\n .action-btn[_ngcontent-%COMP%] {\n font-size: 12px;\n }\n\n .editor-body[_ngcontent-%COMP%] {\n flex: 1;\n overflow: auto;\n }\n\n .form-mode[_ngcontent-%COMP%] {\n padding: 16px;\n display: flex;\n flex-direction: column;\n gap: 14px;\n }\n\n .form-field[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 4px;\n flex: 1;\n }\n\n .form-label[_ngcontent-%COMP%] {\n font-size: 11px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n }\n\n .form-input[_ngcontent-%COMP%] {\n padding: 8px 12px;\n border: 1px solid var(--mj-border-strong);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n font-size: 13px;\n font-family: inherit;\n outline: none;\n transition: border-color 0.15s ease;\n }\n\n .form-input[_ngcontent-%COMP%]:focus {\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 2px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n }\n\n .form-textarea[_ngcontent-%COMP%] {\n padding: 8px 12px;\n border: 1px solid var(--mj-border-strong);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n font-size: 13px;\n font-family: inherit;\n resize: vertical;\n min-height: 60px;\n outline: none;\n transition: border-color 0.15s ease;\n }\n\n .form-textarea[_ngcontent-%COMP%]:focus {\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 2px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n }\n\n .form-select[_ngcontent-%COMP%] {\n padding: 8px 12px;\n border: 1px solid var(--mj-border-strong);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n font-size: 13px;\n font-family: inherit;\n outline: none;\n cursor: pointer;\n transition: border-color 0.15s ease;\n }\n\n .form-select[_ngcontent-%COMP%]:focus {\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 2px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n }\n\n .form-row[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 12px;\n }\n\n .json-mode[_ngcontent-%COMP%] {\n height: 100%;\n }\n\n .json-mode[_ngcontent-%COMP%] mj-code-editor[_ngcontent-%COMP%] {\n display: block;\n height: 100%;\n }"] });
221
+ } }, dependencies: [i2.NgSelectOption, i2.ɵNgSelectMultipleOption, i2.DefaultValueAccessor, i2.SelectControlValueAccessor, i2.NgControlStatus, i2.NgModel, i3.CodeEditorComponent, i4.MJButtonDirective], styles: [".spec-editor[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n height: 100%;\n }\n\n .editor-header[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 8px 12px;\n border-bottom: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n flex-shrink: 0;\n }\n\n .mode-toggle[_ngcontent-%COMP%] {\n display: inline-flex;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n overflow: hidden;\n }\n\n .mode-btn[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 4px 12px;\n border: none;\n background: transparent;\n color: var(--mj-text-secondary);\n font-size: 12px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s ease;\n font-family: inherit;\n }\n\n .mode-btn[_ngcontent-%COMP%]:not(:last-child) {\n border-right: 1px solid var(--mj-border-default);\n }\n\n .mode-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-sunken);\n }\n\n .mode-btn.active[_ngcontent-%COMP%] {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n }\n\n .mode-btn[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 11px;\n }\n\n .action-buttons[_ngcontent-%COMP%] {\n display: flex;\n gap: 6px;\n }\n\n .action-btn[_ngcontent-%COMP%] {\n font-size: 12px;\n }\n\n .editor-body[_ngcontent-%COMP%] {\n flex: 1;\n overflow: auto;\n }\n\n .form-mode[_ngcontent-%COMP%] {\n padding: 16px;\n display: flex;\n flex-direction: column;\n gap: 14px;\n }\n\n .form-field[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 4px;\n flex: 1;\n }\n\n .form-label[_ngcontent-%COMP%] {\n font-size: 11px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n }\n\n .form-input[_ngcontent-%COMP%] {\n padding: 8px 12px;\n border: 1px solid var(--mj-border-strong);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n font-size: 13px;\n font-family: inherit;\n outline: none;\n transition: border-color 0.15s ease;\n }\n\n .form-input[_ngcontent-%COMP%]:focus {\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 2px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n }\n\n .form-textarea[_ngcontent-%COMP%] {\n padding: 8px 12px;\n border: 1px solid var(--mj-border-strong);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n font-size: 13px;\n font-family: inherit;\n resize: vertical;\n min-height: 60px;\n outline: none;\n transition: border-color 0.15s ease;\n }\n\n .form-textarea[_ngcontent-%COMP%]:focus {\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 2px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n }\n\n .form-select[_ngcontent-%COMP%] {\n padding: 8px 12px;\n border: 1px solid var(--mj-border-strong);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n font-size: 13px;\n font-family: inherit;\n outline: none;\n cursor: pointer;\n transition: border-color 0.15s ease;\n }\n\n .form-select[_ngcontent-%COMP%]:focus {\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 2px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n }\n\n .form-row[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 12px;\n }\n\n .json-mode[_ngcontent-%COMP%] {\n height: 100%;\n }\n\n .json-mode[_ngcontent-%COMP%] mj-code-editor[_ngcontent-%COMP%] {\n display: block;\n height: 100%;\n }"] });
227
222
  }
228
223
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(SpecEditorComponent, [{
229
224
  type: Component,
@@ -240,10 +235,10 @@ export class SpecEditorComponent {
240
235
  </div>
241
236
  @if (State.IsEditingSpec) {
242
237
  <div class="action-buttons">
243
- <button kendoButton [themeColor]="'primary'" (click)="ApplyChanges()" class="action-btn">
238
+ <button mjButton variant="primary" (click)="ApplyChanges()" class="action-btn">
244
239
  <i class="fa-solid fa-check"></i> Apply
245
240
  </button>
246
- <button kendoButton [themeColor]="'base'" (click)="CancelChanges()" class="action-btn">
241
+ <button mjButton (click)="CancelChanges()" class="action-btn">
247
242
  Cancel
248
243
  </button>
249
244
  </div>
@@ -1 +1 @@
1
- {"version":3,"file":"spec-editor.component.js","sourceRoot":"","sources":["../../../../src/ComponentStudio/components/editors/spec-editor.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit, OnDestroy, ChangeDetectorRef } from '@angular/core';\nimport { Subscription } from 'rxjs';\nimport { ComponentStudioStateService } from '../../services/component-studio-state.service';\n\ntype SpecEditorMode = 'form' | 'json';\n\ninterface SpecFormModel {\n name: string;\n title: string;\n description: string;\n type: string;\n location: string;\n exampleUsage: string;\n}\n\nconst COMPONENT_TYPES = [\n 'Report', 'Dashboard', 'Form', 'Chart', 'Table', 'Widget', 'Navigation', 'Search', 'Utility'\n];\n\n@Component({\n standalone: false,\n selector: 'mj-spec-editor',\n template: `\n <div class=\"spec-editor\">\n <div class=\"editor-header\">\n <div class=\"mode-toggle\">\n <button class=\"mode-btn\" [class.active]=\"Mode === 'form'\" (click)=\"SetMode('form')\">\n <i class=\"fa-solid fa-wpforms\"></i> Form\n </button>\n <button class=\"mode-btn\" [class.active]=\"Mode === 'json'\" (click)=\"SetMode('json')\">\n <i class=\"fa-solid fa-code\"></i> JSON\n </button>\n </div>\n @if (State.IsEditingSpec) {\n <div class=\"action-buttons\">\n <button kendoButton [themeColor]=\"'primary'\" (click)=\"ApplyChanges()\" class=\"action-btn\">\n <i class=\"fa-solid fa-check\"></i> Apply\n </button>\n <button kendoButton [themeColor]=\"'base'\" (click)=\"CancelChanges()\" class=\"action-btn\">\n Cancel\n </button>\n </div>\n }\n </div>\n\n <div class=\"editor-body\">\n @if (Mode === 'form') {\n <div class=\"form-mode\">\n <div class=\"form-row\">\n <div class=\"form-field\">\n <label class=\"form-label\">Name</label>\n <input class=\"form-input\" [(ngModel)]=\"FormModel.name\" (ngModelChange)=\"OnFormChanged()\" />\n </div>\n <div class=\"form-field\">\n <label class=\"form-label\">Type</label>\n <select class=\"form-select\" [(ngModel)]=\"FormModel.type\" (ngModelChange)=\"OnFormChanged()\">\n @for (t of ComponentTypes; track t) {\n <option [value]=\"t\">{{ t }}</option>\n }\n </select>\n </div>\n </div>\n <div class=\"form-field\">\n <label class=\"form-label\">Title</label>\n <input class=\"form-input\" [(ngModel)]=\"FormModel.title\" (ngModelChange)=\"OnFormChanged()\" />\n </div>\n <div class=\"form-field\">\n <label class=\"form-label\">Description</label>\n <textarea class=\"form-textarea\" [(ngModel)]=\"FormModel.description\" (ngModelChange)=\"OnFormChanged()\" rows=\"3\"></textarea>\n </div>\n <div class=\"form-row\">\n <div class=\"form-field\">\n <label class=\"form-label\">Location</label>\n <select class=\"form-select\" [(ngModel)]=\"FormModel.location\" (ngModelChange)=\"OnFormChanged()\">\n <option value=\"embedded\">embedded</option>\n <option value=\"standalone\">standalone</option>\n </select>\n </div>\n <div class=\"form-field\">\n <label class=\"form-label\">Example Usage</label>\n <input class=\"form-input\" [(ngModel)]=\"FormModel.exampleUsage\" (ngModelChange)=\"OnFormChanged()\" placeholder=\"Optional\" />\n </div>\n </div>\n </div>\n } @else {\n <div class=\"json-mode\">\n <mj-code-editor\n [(ngModel)]=\"State.EditableSpec\"\n [language]=\"'json'\"\n [indentWithTab]=\"true\"\n (ngModelChange)=\"OnJsonChanged()\">\n </mj-code-editor>\n </div>\n }\n </div>\n </div>\n `,\n styles: [`\n .spec-editor {\n display: flex;\n flex-direction: column;\n height: 100%;\n }\n\n .editor-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 8px 12px;\n border-bottom: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n flex-shrink: 0;\n }\n\n .mode-toggle {\n display: inline-flex;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n overflow: hidden;\n }\n\n .mode-btn {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 4px 12px;\n border: none;\n background: transparent;\n color: var(--mj-text-secondary);\n font-size: 12px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s ease;\n font-family: inherit;\n }\n\n .mode-btn:not(:last-child) {\n border-right: 1px solid var(--mj-border-default);\n }\n\n .mode-btn:hover {\n background: var(--mj-bg-surface-sunken);\n }\n\n .mode-btn.active {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n }\n\n .mode-btn i {\n font-size: 11px;\n }\n\n .action-buttons {\n display: flex;\n gap: 6px;\n }\n\n .action-btn {\n font-size: 12px;\n }\n\n .editor-body {\n flex: 1;\n overflow: auto;\n }\n\n .form-mode {\n padding: 16px;\n display: flex;\n flex-direction: column;\n gap: 14px;\n }\n\n .form-field {\n display: flex;\n flex-direction: column;\n gap: 4px;\n flex: 1;\n }\n\n .form-label {\n font-size: 11px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n }\n\n .form-input {\n padding: 8px 12px;\n border: 1px solid var(--mj-border-strong);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n font-size: 13px;\n font-family: inherit;\n outline: none;\n transition: border-color 0.15s ease;\n }\n\n .form-input:focus {\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 2px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n }\n\n .form-textarea {\n padding: 8px 12px;\n border: 1px solid var(--mj-border-strong);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n font-size: 13px;\n font-family: inherit;\n resize: vertical;\n min-height: 60px;\n outline: none;\n transition: border-color 0.15s ease;\n }\n\n .form-textarea:focus {\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 2px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n }\n\n .form-select {\n padding: 8px 12px;\n border: 1px solid var(--mj-border-strong);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n font-size: 13px;\n font-family: inherit;\n outline: none;\n cursor: pointer;\n transition: border-color 0.15s ease;\n }\n\n .form-select:focus {\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 2px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n }\n\n .form-row {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 12px;\n }\n\n .json-mode {\n height: 100%;\n }\n\n .json-mode mj-code-editor {\n display: block;\n height: 100%;\n }\n `]\n})\nexport class SpecEditorComponent implements OnInit, OnDestroy {\n Mode: SpecEditorMode = 'form';\n FormModel: SpecFormModel = { name: '', title: '', description: '', type: '', location: '', exampleUsage: '' };\n ComponentTypes: string[] = COMPONENT_TYPES;\n\n private stateChangedSub: Subscription | null = null;\n\n constructor(\n public State: ComponentStudioStateService,\n private cdr: ChangeDetectorRef\n ) {}\n\n ngOnInit(): void {\n this.syncSpecToForm();\n this.stateChangedSub = this.State.StateChanged.subscribe(() => {\n if (this.Mode === 'form' && !this.State.IsEditingSpec) {\n this.syncSpecToForm();\n }\n this.cdr.detectChanges();\n });\n }\n\n ngOnDestroy(): void {\n if (this.stateChangedSub) {\n this.stateChangedSub.unsubscribe();\n this.stateChangedSub = null;\n }\n }\n\n SetMode(mode: SpecEditorMode): void {\n if (mode === 'form') {\n this.syncSpecToForm();\n } else {\n this.syncFormToSpec();\n }\n this.Mode = mode;\n }\n\n OnFormChanged(): void {\n this.syncFormToSpec();\n this.State.IsEditingSpec = true;\n }\n\n OnJsonChanged(): void {\n this.State.IsEditingSpec = true;\n }\n\n ApplyChanges(): void {\n if (this.Mode === 'form') {\n this.syncFormToSpec();\n }\n this.State.ApplySpecChanges();\n }\n\n CancelChanges(): void {\n this.State.InitializeEditors();\n this.syncSpecToForm();\n this.cdr.detectChanges();\n }\n\n private syncSpecToForm(): void {\n try {\n const spec = JSON.parse(this.State.EditableSpec);\n this.FormModel = {\n name: spec.name || '',\n title: spec.title || '',\n description: spec.description || '',\n type: spec.type || '',\n location: spec.location || '',\n exampleUsage: spec.exampleUsage || ''\n };\n } catch {\n // If JSON is invalid, keep current form values\n }\n }\n\n private syncFormToSpec(): void {\n try {\n const spec = JSON.parse(this.State.EditableSpec);\n spec.name = this.FormModel.name;\n spec.title = this.FormModel.title;\n spec.description = this.FormModel.description;\n spec.type = this.FormModel.type;\n spec.location = this.FormModel.location;\n spec.exampleUsage = this.FormModel.exampleUsage;\n this.State.EditableSpec = JSON.stringify(spec, null, 2);\n } catch {\n // If JSON is invalid, skip sync\n }\n }\n}\n"]}
1
+ {"version":3,"file":"spec-editor.component.js","sourceRoot":"","sources":["../../../../src/ComponentStudio/components/editors/spec-editor.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit, OnDestroy, ChangeDetectorRef } from '@angular/core';\nimport { Subscription } from 'rxjs';\nimport { ComponentStudioStateService } from '../../services/component-studio-state.service';\n\ntype SpecEditorMode = 'form' | 'json';\n\ninterface SpecFormModel {\n name: string;\n title: string;\n description: string;\n type: string;\n location: string;\n exampleUsage: string;\n}\n\nconst COMPONENT_TYPES = [\n 'Report', 'Dashboard', 'Form', 'Chart', 'Table', 'Widget', 'Navigation', 'Search', 'Utility'\n];\n\n@Component({\n standalone: false,\n selector: 'mj-spec-editor',\n template: `\n <div class=\"spec-editor\">\n <div class=\"editor-header\">\n <div class=\"mode-toggle\">\n <button class=\"mode-btn\" [class.active]=\"Mode === 'form'\" (click)=\"SetMode('form')\">\n <i class=\"fa-solid fa-wpforms\"></i> Form\n </button>\n <button class=\"mode-btn\" [class.active]=\"Mode === 'json'\" (click)=\"SetMode('json')\">\n <i class=\"fa-solid fa-code\"></i> JSON\n </button>\n </div>\n @if (State.IsEditingSpec) {\n <div class=\"action-buttons\">\n <button mjButton variant=\"primary\" (click)=\"ApplyChanges()\" class=\"action-btn\">\n <i class=\"fa-solid fa-check\"></i> Apply\n </button>\n <button mjButton (click)=\"CancelChanges()\" class=\"action-btn\">\n Cancel\n </button>\n </div>\n }\n </div>\n\n <div class=\"editor-body\">\n @if (Mode === 'form') {\n <div class=\"form-mode\">\n <div class=\"form-row\">\n <div class=\"form-field\">\n <label class=\"form-label\">Name</label>\n <input class=\"form-input\" [(ngModel)]=\"FormModel.name\" (ngModelChange)=\"OnFormChanged()\" />\n </div>\n <div class=\"form-field\">\n <label class=\"form-label\">Type</label>\n <select class=\"form-select\" [(ngModel)]=\"FormModel.type\" (ngModelChange)=\"OnFormChanged()\">\n @for (t of ComponentTypes; track t) {\n <option [value]=\"t\">{{ t }}</option>\n }\n </select>\n </div>\n </div>\n <div class=\"form-field\">\n <label class=\"form-label\">Title</label>\n <input class=\"form-input\" [(ngModel)]=\"FormModel.title\" (ngModelChange)=\"OnFormChanged()\" />\n </div>\n <div class=\"form-field\">\n <label class=\"form-label\">Description</label>\n <textarea class=\"form-textarea\" [(ngModel)]=\"FormModel.description\" (ngModelChange)=\"OnFormChanged()\" rows=\"3\"></textarea>\n </div>\n <div class=\"form-row\">\n <div class=\"form-field\">\n <label class=\"form-label\">Location</label>\n <select class=\"form-select\" [(ngModel)]=\"FormModel.location\" (ngModelChange)=\"OnFormChanged()\">\n <option value=\"embedded\">embedded</option>\n <option value=\"standalone\">standalone</option>\n </select>\n </div>\n <div class=\"form-field\">\n <label class=\"form-label\">Example Usage</label>\n <input class=\"form-input\" [(ngModel)]=\"FormModel.exampleUsage\" (ngModelChange)=\"OnFormChanged()\" placeholder=\"Optional\" />\n </div>\n </div>\n </div>\n } @else {\n <div class=\"json-mode\">\n <mj-code-editor\n [(ngModel)]=\"State.EditableSpec\"\n [language]=\"'json'\"\n [indentWithTab]=\"true\"\n (ngModelChange)=\"OnJsonChanged()\">\n </mj-code-editor>\n </div>\n }\n </div>\n </div>\n `,\n styles: [`\n .spec-editor {\n display: flex;\n flex-direction: column;\n height: 100%;\n }\n\n .editor-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 8px 12px;\n border-bottom: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n flex-shrink: 0;\n }\n\n .mode-toggle {\n display: inline-flex;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n overflow: hidden;\n }\n\n .mode-btn {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 4px 12px;\n border: none;\n background: transparent;\n color: var(--mj-text-secondary);\n font-size: 12px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s ease;\n font-family: inherit;\n }\n\n .mode-btn:not(:last-child) {\n border-right: 1px solid var(--mj-border-default);\n }\n\n .mode-btn:hover {\n background: var(--mj-bg-surface-sunken);\n }\n\n .mode-btn.active {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n }\n\n .mode-btn i {\n font-size: 11px;\n }\n\n .action-buttons {\n display: flex;\n gap: 6px;\n }\n\n .action-btn {\n font-size: 12px;\n }\n\n .editor-body {\n flex: 1;\n overflow: auto;\n }\n\n .form-mode {\n padding: 16px;\n display: flex;\n flex-direction: column;\n gap: 14px;\n }\n\n .form-field {\n display: flex;\n flex-direction: column;\n gap: 4px;\n flex: 1;\n }\n\n .form-label {\n font-size: 11px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n }\n\n .form-input {\n padding: 8px 12px;\n border: 1px solid var(--mj-border-strong);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n font-size: 13px;\n font-family: inherit;\n outline: none;\n transition: border-color 0.15s ease;\n }\n\n .form-input:focus {\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 2px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n }\n\n .form-textarea {\n padding: 8px 12px;\n border: 1px solid var(--mj-border-strong);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n font-size: 13px;\n font-family: inherit;\n resize: vertical;\n min-height: 60px;\n outline: none;\n transition: border-color 0.15s ease;\n }\n\n .form-textarea:focus {\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 2px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n }\n\n .form-select {\n padding: 8px 12px;\n border: 1px solid var(--mj-border-strong);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n font-size: 13px;\n font-family: inherit;\n outline: none;\n cursor: pointer;\n transition: border-color 0.15s ease;\n }\n\n .form-select:focus {\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 2px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n }\n\n .form-row {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 12px;\n }\n\n .json-mode {\n height: 100%;\n }\n\n .json-mode mj-code-editor {\n display: block;\n height: 100%;\n }\n `]\n})\nexport class SpecEditorComponent implements OnInit, OnDestroy {\n Mode: SpecEditorMode = 'form';\n FormModel: SpecFormModel = { name: '', title: '', description: '', type: '', location: '', exampleUsage: '' };\n ComponentTypes: string[] = COMPONENT_TYPES;\n\n private stateChangedSub: Subscription | null = null;\n\n constructor(\n public State: ComponentStudioStateService,\n private cdr: ChangeDetectorRef\n ) {}\n\n ngOnInit(): void {\n this.syncSpecToForm();\n this.stateChangedSub = this.State.StateChanged.subscribe(() => {\n if (this.Mode === 'form' && !this.State.IsEditingSpec) {\n this.syncSpecToForm();\n }\n this.cdr.detectChanges();\n });\n }\n\n ngOnDestroy(): void {\n if (this.stateChangedSub) {\n this.stateChangedSub.unsubscribe();\n this.stateChangedSub = null;\n }\n }\n\n SetMode(mode: SpecEditorMode): void {\n if (mode === 'form') {\n this.syncSpecToForm();\n } else {\n this.syncFormToSpec();\n }\n this.Mode = mode;\n }\n\n OnFormChanged(): void {\n this.syncFormToSpec();\n this.State.IsEditingSpec = true;\n }\n\n OnJsonChanged(): void {\n this.State.IsEditingSpec = true;\n }\n\n ApplyChanges(): void {\n if (this.Mode === 'form') {\n this.syncFormToSpec();\n }\n this.State.ApplySpecChanges();\n }\n\n CancelChanges(): void {\n this.State.InitializeEditors();\n this.syncSpecToForm();\n this.cdr.detectChanges();\n }\n\n private syncSpecToForm(): void {\n try {\n const spec = JSON.parse(this.State.EditableSpec);\n this.FormModel = {\n name: spec.name || '',\n title: spec.title || '',\n description: spec.description || '',\n type: spec.type || '',\n location: spec.location || '',\n exampleUsage: spec.exampleUsage || ''\n };\n } catch {\n // If JSON is invalid, keep current form values\n }\n }\n\n private syncFormToSpec(): void {\n try {\n const spec = JSON.parse(this.State.EditableSpec);\n spec.name = this.FormModel.name;\n spec.title = this.FormModel.title;\n spec.description = this.FormModel.description;\n spec.type = this.FormModel.type;\n spec.location = this.FormModel.location;\n spec.exampleUsage = this.FormModel.exampleUsage;\n this.State.EditableSpec = JSON.stringify(spec, null, 2);\n } catch {\n // If JSON is invalid, skip sync\n }\n }\n}\n"]}
@@ -2,8 +2,7 @@ import { Component, Input, Output, EventEmitter } from '@angular/core';
2
2
  import { Validators } from '@angular/forms';
3
3
  import * as i0 from "@angular/core";
4
4
  import * as i1 from "@angular/forms";
5
- import * as i2 from "@progress/kendo-angular-buttons";
6
- import * as i3 from "@progress/kendo-angular-dialog";
5
+ import * as i2 from "@memberjunction/ng-ui-components";
7
6
  const _forTrack0 = ($index, $item) => $item.value;
8
7
  function NewComponentDialogComponent_Conditional_0_For_16_Template(rf, ctx) { if (rf & 1) {
9
8
  const _r3 = i0.ɵɵgetCurrentView();
@@ -31,8 +30,8 @@ function NewComponentDialogComponent_Conditional_0_For_16_Template(rf, ctx) { if
31
30
  } }
32
31
  function NewComponentDialogComponent_Conditional_0_Template(rf, ctx) { if (rf & 1) {
33
32
  const _r1 = i0.ɵɵgetCurrentView();
34
- i0.ɵɵelementStart(0, "kendo-dialog", 1);
35
- i0.ɵɵlistener("close", function NewComponentDialogComponent_Conditional_0_Template_kendo_dialog_close_0_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnCancel()); });
33
+ i0.ɵɵelementStart(0, "mj-dialog", 1);
34
+ i0.ɵɵlistener("Close", function NewComponentDialogComponent_Conditional_0_Template_mj_dialog_Close_0_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnCancel()); });
36
35
  i0.ɵɵelementStart(1, "form", 2)(2, "div", 3)(3, "div", 4)(4, "label", 5);
37
36
  i0.ɵɵtext(5, "Name ");
38
37
  i0.ɵɵelementStart(6, "span", 6);
@@ -64,7 +63,7 @@ function NewComponentDialogComponent_Conditional_0_Template(rf, ctx) { if (rf &
64
63
  i0.ɵɵelementStart(27, "span", 8);
65
64
  i0.ɵɵtext(28, "Optional description of the component's purpose");
66
65
  i0.ɵɵelementEnd()()()();
67
- i0.ɵɵelementStart(29, "kendo-dialog-actions")(30, "button", 16);
66
+ i0.ɵɵelementStart(29, "mj-dialog-actions")(30, "button", 16);
68
67
  i0.ɵɵlistener("click", function NewComponentDialogComponent_Conditional_0_Template_button_click_30_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnCreate()); });
69
68
  i0.ɵɵelement(31, "span", 17);
70
69
  i0.ɵɵtext(32, " Create ");
@@ -75,13 +74,13 @@ function NewComponentDialogComponent_Conditional_0_Template(rf, ctx) { if (rf &
75
74
  i0.ɵɵelementEnd()()();
76
75
  } if (rf & 2) {
77
76
  const ctx_r1 = i0.ɵɵnextContext();
78
- i0.ɵɵproperty("title", "Create New Component")("width", 520)("minWidth", 400);
77
+ i0.ɵɵproperty("Visible", true)("Width", 520)("MinWidth", 400);
79
78
  i0.ɵɵadvance();
80
79
  i0.ɵɵproperty("formGroup", ctx_r1.form);
81
80
  i0.ɵɵadvance(14);
82
81
  i0.ɵɵrepeater(ctx_r1.TypeOptions);
83
82
  i0.ɵɵadvance(15);
84
- i0.ɵɵproperty("themeColor", "primary")("disabled", !ctx_r1.form.valid);
83
+ i0.ɵɵproperty("disabled", !ctx_r1.form.valid);
85
84
  } }
86
85
  export class NewComponentDialogComponent {
87
86
  fb;
@@ -141,15 +140,15 @@ export class NewComponentDialogComponent {
141
140
  this.lastAutoFilledTitle = '';
142
141
  }
143
142
  static ɵfac = function NewComponentDialogComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || NewComponentDialogComponent)(i0.ɵɵdirectiveInject(i1.FormBuilder)); };
144
- static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: NewComponentDialogComponent, selectors: [["mj-new-component-dialog"]], inputs: { Visible: "Visible" }, outputs: { Close: "Close" }, standalone: false, decls: 1, vars: 1, consts: [[3, "title", "width", "minWidth"], [3, "close", "title", "width", "minWidth"], [3, "formGroup"], [1, "dialog-form"], [1, "form-field"], ["for", "component-name", 1, "form-label"], [1, "required"], ["id", "component-name", "type", "text", "formControlName", "name", "placeholder", "e.g. Sales Overview Dashboard", "autocomplete", "off", 1, "form-input", 3, "input"], [1, "form-hint"], [1, "form-label"], [1, "type-options"], [1, "type-card", 3, "selected"], ["for", "component-title", 1, "form-label"], ["id", "component-title", "type", "text", "formControlName", "title", "placeholder", "Display title (auto-filled from name)", "autocomplete", "off", 1, "form-input"], ["for", "component-description", 1, "form-label"], ["id", "component-description", "formControlName", "description", "placeholder", "Describe what this component does...", "rows", "3", 1, "form-textarea"], ["kendoButton", "", 3, "click", "themeColor", "disabled"], [1, "fa-solid", "fa-plus"], ["kendoButton", "", 3, "click"], [1, "type-card", 3, "click"], [1, "type-card-icon"], [1, "type-card-label"], [1, "type-card-description"]], template: function NewComponentDialogComponent_Template(rf, ctx) { if (rf & 1) {
145
- i0.ɵɵconditionalCreate(0, NewComponentDialogComponent_Conditional_0_Template, 35, 6, "kendo-dialog", 0);
143
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: NewComponentDialogComponent, selectors: [["mj-new-component-dialog"]], inputs: { Visible: "Visible" }, outputs: { Close: "Close" }, standalone: false, decls: 1, vars: 1, consts: [["Title", "Create New Component", 3, "Visible", "Width", "MinWidth"], ["Title", "Create New Component", 3, "Close", "Visible", "Width", "MinWidth"], [3, "formGroup"], [1, "dialog-form"], [1, "form-field"], ["for", "component-name", 1, "form-label"], [1, "required"], ["id", "component-name", "type", "text", "formControlName", "name", "placeholder", "e.g. Sales Overview Dashboard", "autocomplete", "off", 1, "form-input", 3, "input"], [1, "form-hint"], [1, "form-label"], [1, "type-options"], [1, "type-card", 3, "selected"], ["for", "component-title", 1, "form-label"], ["id", "component-title", "type", "text", "formControlName", "title", "placeholder", "Display title (auto-filled from name)", "autocomplete", "off", 1, "form-input"], ["for", "component-description", 1, "form-label"], ["id", "component-description", "formControlName", "description", "placeholder", "Describe what this component does...", "rows", "3", 1, "form-textarea"], ["mjButton", "", "variant", "primary", 3, "click", "disabled"], [1, "fa-solid", "fa-plus"], ["mjButton", "", 3, "click"], [1, "type-card", 3, "click"], [1, "type-card-icon"], [1, "type-card-label"], [1, "type-card-description"]], template: function NewComponentDialogComponent_Template(rf, ctx) { if (rf & 1) {
144
+ i0.ɵɵconditionalCreate(0, NewComponentDialogComponent_Conditional_0_Template, 35, 5, "mj-dialog", 0);
146
145
  } if (rf & 2) {
147
146
  i0.ɵɵconditional(ctx.Visible ? 0 : -1);
148
- } }, dependencies: [i1.ɵNgNoValidate, i1.DefaultValueAccessor, i1.NgControlStatus, i1.NgControlStatusGroup, i1.FormGroupDirective, i1.FormControlName, i2.ButtonComponent, i3.DialogComponent, i3.DialogActionsComponent], styles: ["\n\n.dialog-form[_ngcontent-%COMP%] {\n padding: 16px 8px;\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n\n\n.form-field[_ngcontent-%COMP%] {\n margin-bottom: 16px;\n}\n\n\n\n.form-label[_ngcontent-%COMP%] {\n display: block;\n font-size: 12px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n margin-bottom: 6px;\n}\n\n.form-label[_ngcontent-%COMP%] .required[_ngcontent-%COMP%] {\n color: var(--mj-status-error);\n margin-left: 2px;\n}\n\n\n\n.form-input[_ngcontent-%COMP%] {\n width: 100%;\n padding: 10px 12px;\n font-size: 14px;\n font-family: inherit;\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-strong);\n border-radius: 6px;\n outline: none;\n transition: border-color 0.2s ease, box-shadow 0.2s ease;\n box-sizing: border-box;\n}\n\n.form-input[_ngcontent-%COMP%]:focus {\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 2px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n.form-input[_ngcontent-%COMP%]::placeholder {\n color: var(--mj-text-secondary);\n opacity: 0.6;\n}\n\n\n\n.form-textarea[_ngcontent-%COMP%] {\n width: 100%;\n padding: 10px 12px;\n font-size: 14px;\n font-family: inherit;\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-strong);\n border-radius: 6px;\n outline: none;\n transition: border-color 0.2s ease, box-shadow 0.2s ease;\n box-sizing: border-box;\n resize: vertical;\n min-height: 72px;\n}\n\n.form-textarea[_ngcontent-%COMP%]:focus {\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 2px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n.form-textarea[_ngcontent-%COMP%]::placeholder {\n color: var(--mj-text-secondary);\n opacity: 0.6;\n}\n\n\n\n.form-hint[_ngcontent-%COMP%] {\n display: block;\n font-size: 11px;\n color: var(--mj-text-secondary);\n margin-top: 4px;\n opacity: 0.7;\n}\n\n\n\n.type-options[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 10px;\n}\n\n\n\n.type-card[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n padding: 14px 10px 12px;\n border: 1.5px solid var(--mj-border-default);\n border-radius: 10px;\n background: var(--mj-bg-surface);\n cursor: pointer;\n transition: border-color 0.2s ease, background 0.2s ease, box-shadow 0.2s ease;\n text-align: center;\n user-select: none;\n}\n\n.type-card[_ngcontent-%COMP%]:hover {\n border-color: var(--mj-brand-primary);\n background: var(--mj-bg-surface-sunken);\n}\n\n.type-card.selected[_ngcontent-%COMP%] {\n border-color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n box-shadow: 0 0 0 2px color-mix(in srgb, var(--mj-brand-primary) 20%, transparent);\n}\n\n\n\n.type-card-icon[_ngcontent-%COMP%] {\n font-size: 22px;\n color: var(--mj-text-secondary);\n margin-bottom: 6px;\n transition: color 0.2s ease;\n}\n\n.type-card.selected[_ngcontent-%COMP%] .type-card-icon[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n}\n\n\n\n.type-card-label[_ngcontent-%COMP%] {\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-primary);\n margin-bottom: 2px;\n}\n\n.type-card.selected[_ngcontent-%COMP%] .type-card-label[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n}\n\n\n\n.type-card-description[_ngcontent-%COMP%] {\n font-size: 11px;\n color: var(--mj-text-secondary);\n line-height: 1.3;\n}\n\n.type-card.selected[_ngcontent-%COMP%] .type-card-description[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n opacity: 0.8;\n}"] });
147
+ } }, dependencies: [i1.ɵNgNoValidate, i1.DefaultValueAccessor, i1.NgControlStatus, i1.NgControlStatusGroup, i1.FormGroupDirective, i1.FormControlName, i2.MJButtonDirective, i2.MJDialogComponent, i2.MJDialogActionsComponent], styles: ["\n\n.dialog-form[_ngcontent-%COMP%] {\n padding: 16px 8px;\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n\n\n.form-field[_ngcontent-%COMP%] {\n margin-bottom: 16px;\n}\n\n\n\n.form-label[_ngcontent-%COMP%] {\n display: block;\n font-size: 12px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n margin-bottom: 6px;\n}\n\n.form-label[_ngcontent-%COMP%] .required[_ngcontent-%COMP%] {\n color: var(--mj-status-error);\n margin-left: 2px;\n}\n\n\n\n.form-input[_ngcontent-%COMP%] {\n width: 100%;\n padding: 10px 12px;\n font-size: 14px;\n font-family: inherit;\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-strong);\n border-radius: 6px;\n outline: none;\n transition: border-color 0.2s ease, box-shadow 0.2s ease;\n box-sizing: border-box;\n}\n\n.form-input[_ngcontent-%COMP%]:focus {\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 2px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n.form-input[_ngcontent-%COMP%]::placeholder {\n color: var(--mj-text-secondary);\n opacity: 0.6;\n}\n\n\n\n.form-textarea[_ngcontent-%COMP%] {\n width: 100%;\n padding: 10px 12px;\n font-size: 14px;\n font-family: inherit;\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-strong);\n border-radius: 6px;\n outline: none;\n transition: border-color 0.2s ease, box-shadow 0.2s ease;\n box-sizing: border-box;\n resize: vertical;\n min-height: 72px;\n}\n\n.form-textarea[_ngcontent-%COMP%]:focus {\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 2px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n.form-textarea[_ngcontent-%COMP%]::placeholder {\n color: var(--mj-text-secondary);\n opacity: 0.6;\n}\n\n\n\n.form-hint[_ngcontent-%COMP%] {\n display: block;\n font-size: 11px;\n color: var(--mj-text-secondary);\n margin-top: 4px;\n opacity: 0.7;\n}\n\n\n\n.type-options[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 10px;\n}\n\n\n\n.type-card[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n padding: 14px 10px 12px;\n border: 1.5px solid var(--mj-border-default);\n border-radius: 10px;\n background: var(--mj-bg-surface);\n cursor: pointer;\n transition: border-color 0.2s ease, background 0.2s ease, box-shadow 0.2s ease;\n text-align: center;\n user-select: none;\n}\n\n.type-card[_ngcontent-%COMP%]:hover {\n border-color: var(--mj-brand-primary);\n background: var(--mj-bg-surface-sunken);\n}\n\n.type-card.selected[_ngcontent-%COMP%] {\n border-color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n box-shadow: 0 0 0 2px color-mix(in srgb, var(--mj-brand-primary) 20%, transparent);\n}\n\n\n\n.type-card-icon[_ngcontent-%COMP%] {\n font-size: 22px;\n color: var(--mj-text-secondary);\n margin-bottom: 6px;\n transition: color 0.2s ease;\n}\n\n.type-card.selected[_ngcontent-%COMP%] .type-card-icon[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n}\n\n\n\n.type-card-label[_ngcontent-%COMP%] {\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-primary);\n margin-bottom: 2px;\n}\n\n.type-card.selected[_ngcontent-%COMP%] .type-card-label[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n}\n\n\n\n.type-card-description[_ngcontent-%COMP%] {\n font-size: 11px;\n color: var(--mj-text-secondary);\n line-height: 1.3;\n}\n\n.type-card.selected[_ngcontent-%COMP%] .type-card-description[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n opacity: 0.8;\n}"] });
149
148
  }
150
149
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(NewComponentDialogComponent, [{
151
150
  type: Component,
152
- args: [{ standalone: false, selector: 'mj-new-component-dialog', template: "@if (Visible) {\n <kendo-dialog [title]=\"'Create New Component'\" (close)=\"OnCancel()\" [width]=\"520\" [minWidth]=\"400\">\n <form [formGroup]=\"form\">\n <div class=\"dialog-form\">\n <!-- Name field (required) -->\n <div class=\"form-field\">\n <label class=\"form-label\" for=\"component-name\">Name <span class=\"required\">*</span></label>\n <input\n id=\"component-name\"\n class=\"form-input\"\n type=\"text\"\n formControlName=\"name\"\n (input)=\"OnNameChange()\"\n placeholder=\"e.g. Sales Overview Dashboard\"\n autocomplete=\"off\">\n <span class=\"form-hint\">A unique name for your component</span>\n </div>\n\n <!-- Type selection (card grid) -->\n <div class=\"form-field\">\n <label class=\"form-label\">Type</label>\n <div class=\"type-options\">\n @for (option of TypeOptions; track option.value) {\n <div\n class=\"type-card\"\n [class.selected]=\"SelectedType === option.value\"\n (click)=\"OnSelectType(option.value)\">\n <div class=\"type-card-icon\">\n <i [class]=\"option.icon\"></i>\n </div>\n <div class=\"type-card-label\">{{ option.label }}</div>\n <div class=\"type-card-description\">{{ option.description }}</div>\n </div>\n }\n </div>\n </div>\n\n <!-- Title field (auto-filled from name) -->\n <div class=\"form-field\">\n <label class=\"form-label\" for=\"component-title\">Title</label>\n <input\n id=\"component-title\"\n class=\"form-input\"\n type=\"text\"\n formControlName=\"title\"\n placeholder=\"Display title (auto-filled from name)\"\n autocomplete=\"off\">\n <span class=\"form-hint\">The display title shown in the component header</span>\n </div>\n\n <!-- Description (optional textarea) -->\n <div class=\"form-field\">\n <label class=\"form-label\" for=\"component-description\">Description</label>\n <textarea\n id=\"component-description\"\n class=\"form-textarea\"\n formControlName=\"description\"\n placeholder=\"Describe what this component does...\"\n rows=\"3\"></textarea>\n <span class=\"form-hint\">Optional description of the component's purpose</span>\n </div>\n </div>\n </form>\n\n <kendo-dialog-actions>\n <button kendoButton (click)=\"OnCreate()\" [themeColor]=\"'primary'\" [disabled]=\"!form.valid\">\n <span class=\"fa-solid fa-plus\"></span> Create\n </button>\n <button kendoButton (click)=\"OnCancel()\">Cancel</button>\n </kendo-dialog-actions>\n </kendo-dialog>\n}\n", styles: ["/* Dialog form container */\n.dialog-form {\n padding: 16px 8px;\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n/* Form field wrapper */\n.form-field {\n margin-bottom: 16px;\n}\n\n/* Form label */\n.form-label {\n display: block;\n font-size: 12px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n margin-bottom: 6px;\n}\n\n.form-label .required {\n color: var(--mj-status-error);\n margin-left: 2px;\n}\n\n/* Text inputs */\n.form-input {\n width: 100%;\n padding: 10px 12px;\n font-size: 14px;\n font-family: inherit;\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-strong);\n border-radius: 6px;\n outline: none;\n transition: border-color 0.2s ease, box-shadow 0.2s ease;\n box-sizing: border-box;\n}\n\n.form-input:focus {\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 2px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n.form-input::placeholder {\n color: var(--mj-text-secondary);\n opacity: 0.6;\n}\n\n/* Textarea */\n.form-textarea {\n width: 100%;\n padding: 10px 12px;\n font-size: 14px;\n font-family: inherit;\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-strong);\n border-radius: 6px;\n outline: none;\n transition: border-color 0.2s ease, box-shadow 0.2s ease;\n box-sizing: border-box;\n resize: vertical;\n min-height: 72px;\n}\n\n.form-textarea:focus {\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 2px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n.form-textarea::placeholder {\n color: var(--mj-text-secondary);\n opacity: 0.6;\n}\n\n/* Helper text */\n.form-hint {\n display: block;\n font-size: 11px;\n color: var(--mj-text-secondary);\n margin-top: 4px;\n opacity: 0.7;\n}\n\n/* Type selection grid */\n.type-options {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 10px;\n}\n\n/* Type card */\n.type-card {\n display: flex;\n flex-direction: column;\n align-items: center;\n padding: 14px 10px 12px;\n border: 1.5px solid var(--mj-border-default);\n border-radius: 10px;\n background: var(--mj-bg-surface);\n cursor: pointer;\n transition: border-color 0.2s ease, background 0.2s ease, box-shadow 0.2s ease;\n text-align: center;\n user-select: none;\n}\n\n.type-card:hover {\n border-color: var(--mj-brand-primary);\n background: var(--mj-bg-surface-sunken);\n}\n\n.type-card.selected {\n border-color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n box-shadow: 0 0 0 2px color-mix(in srgb, var(--mj-brand-primary) 20%, transparent);\n}\n\n/* Type card icon */\n.type-card-icon {\n font-size: 22px;\n color: var(--mj-text-secondary);\n margin-bottom: 6px;\n transition: color 0.2s ease;\n}\n\n.type-card.selected .type-card-icon {\n color: var(--mj-brand-primary);\n}\n\n/* Type card label */\n.type-card-label {\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-primary);\n margin-bottom: 2px;\n}\n\n.type-card.selected .type-card-label {\n color: var(--mj-brand-primary);\n}\n\n/* Type card description */\n.type-card-description {\n font-size: 11px;\n color: var(--mj-text-secondary);\n line-height: 1.3;\n}\n\n.type-card.selected .type-card-description {\n color: var(--mj-brand-primary);\n opacity: 0.8;\n}\n"] }]
151
+ args: [{ standalone: false, selector: 'mj-new-component-dialog', template: "@if (Visible) {\n <mj-dialog [Visible]=\"true\" Title=\"Create New Component\" (Close)=\"OnCancel()\" [Width]=\"520\" [MinWidth]=\"400\">\n <form [formGroup]=\"form\">\n <div class=\"dialog-form\">\n <!-- Name field (required) -->\n <div class=\"form-field\">\n <label class=\"form-label\" for=\"component-name\">Name <span class=\"required\">*</span></label>\n <input\n id=\"component-name\"\n class=\"form-input\"\n type=\"text\"\n formControlName=\"name\"\n (input)=\"OnNameChange()\"\n placeholder=\"e.g. Sales Overview Dashboard\"\n autocomplete=\"off\">\n <span class=\"form-hint\">A unique name for your component</span>\n </div>\n\n <!-- Type selection (card grid) -->\n <div class=\"form-field\">\n <label class=\"form-label\">Type</label>\n <div class=\"type-options\">\n @for (option of TypeOptions; track option.value) {\n <div\n class=\"type-card\"\n [class.selected]=\"SelectedType === option.value\"\n (click)=\"OnSelectType(option.value)\">\n <div class=\"type-card-icon\">\n <i [class]=\"option.icon\"></i>\n </div>\n <div class=\"type-card-label\">{{ option.label }}</div>\n <div class=\"type-card-description\">{{ option.description }}</div>\n </div>\n }\n </div>\n </div>\n\n <!-- Title field (auto-filled from name) -->\n <div class=\"form-field\">\n <label class=\"form-label\" for=\"component-title\">Title</label>\n <input\n id=\"component-title\"\n class=\"form-input\"\n type=\"text\"\n formControlName=\"title\"\n placeholder=\"Display title (auto-filled from name)\"\n autocomplete=\"off\">\n <span class=\"form-hint\">The display title shown in the component header</span>\n </div>\n\n <!-- Description (optional textarea) -->\n <div class=\"form-field\">\n <label class=\"form-label\" for=\"component-description\">Description</label>\n <textarea\n id=\"component-description\"\n class=\"form-textarea\"\n formControlName=\"description\"\n placeholder=\"Describe what this component does...\"\n rows=\"3\"></textarea>\n <span class=\"form-hint\">Optional description of the component's purpose</span>\n </div>\n </div>\n </form>\n\n <mj-dialog-actions>\n <button mjButton variant=\"primary\" (click)=\"OnCreate()\" [disabled]=\"!form.valid\">\n <span class=\"fa-solid fa-plus\"></span> Create\n </button>\n <button mjButton (click)=\"OnCancel()\">Cancel</button>\n </mj-dialog-actions>\n </mj-dialog>\n}\n", styles: ["/* Dialog form container */\n.dialog-form {\n padding: 16px 8px;\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n/* Form field wrapper */\n.form-field {\n margin-bottom: 16px;\n}\n\n/* Form label */\n.form-label {\n display: block;\n font-size: 12px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n margin-bottom: 6px;\n}\n\n.form-label .required {\n color: var(--mj-status-error);\n margin-left: 2px;\n}\n\n/* Text inputs */\n.form-input {\n width: 100%;\n padding: 10px 12px;\n font-size: 14px;\n font-family: inherit;\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-strong);\n border-radius: 6px;\n outline: none;\n transition: border-color 0.2s ease, box-shadow 0.2s ease;\n box-sizing: border-box;\n}\n\n.form-input:focus {\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 2px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n.form-input::placeholder {\n color: var(--mj-text-secondary);\n opacity: 0.6;\n}\n\n/* Textarea */\n.form-textarea {\n width: 100%;\n padding: 10px 12px;\n font-size: 14px;\n font-family: inherit;\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-strong);\n border-radius: 6px;\n outline: none;\n transition: border-color 0.2s ease, box-shadow 0.2s ease;\n box-sizing: border-box;\n resize: vertical;\n min-height: 72px;\n}\n\n.form-textarea:focus {\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 2px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n.form-textarea::placeholder {\n color: var(--mj-text-secondary);\n opacity: 0.6;\n}\n\n/* Helper text */\n.form-hint {\n display: block;\n font-size: 11px;\n color: var(--mj-text-secondary);\n margin-top: 4px;\n opacity: 0.7;\n}\n\n/* Type selection grid */\n.type-options {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 10px;\n}\n\n/* Type card */\n.type-card {\n display: flex;\n flex-direction: column;\n align-items: center;\n padding: 14px 10px 12px;\n border: 1.5px solid var(--mj-border-default);\n border-radius: 10px;\n background: var(--mj-bg-surface);\n cursor: pointer;\n transition: border-color 0.2s ease, background 0.2s ease, box-shadow 0.2s ease;\n text-align: center;\n user-select: none;\n}\n\n.type-card:hover {\n border-color: var(--mj-brand-primary);\n background: var(--mj-bg-surface-sunken);\n}\n\n.type-card.selected {\n border-color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n box-shadow: 0 0 0 2px color-mix(in srgb, var(--mj-brand-primary) 20%, transparent);\n}\n\n/* Type card icon */\n.type-card-icon {\n font-size: 22px;\n color: var(--mj-text-secondary);\n margin-bottom: 6px;\n transition: color 0.2s ease;\n}\n\n.type-card.selected .type-card-icon {\n color: var(--mj-brand-primary);\n}\n\n/* Type card label */\n.type-card-label {\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-primary);\n margin-bottom: 2px;\n}\n\n.type-card.selected .type-card-label {\n color: var(--mj-brand-primary);\n}\n\n/* Type card description */\n.type-card-description {\n font-size: 11px;\n color: var(--mj-text-secondary);\n line-height: 1.3;\n}\n\n.type-card.selected .type-card-description {\n color: var(--mj-brand-primary);\n opacity: 0.8;\n}\n"] }]
153
152
  }], () => [{ type: i1.FormBuilder }], { Visible: [{
154
153
  type: Input
155
154
  }], Close: [{