@memberjunction/ng-dashboards 3.3.0 → 3.4.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 (382) hide show
  1. package/dist/AI/components/agents/agent-configuration.component.d.ts +24 -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 +198 -111
  4. package/dist/AI/components/agents/agent-configuration.component.js.map +1 -1
  5. package/dist/AI/components/models/model-management.component.d.ts +23 -0
  6. package/dist/AI/components/models/model-management.component.d.ts.map +1 -1
  7. package/dist/AI/components/models/model-management.component.js +189 -83
  8. package/dist/AI/components/models/model-management.component.js.map +1 -1
  9. package/dist/AI/components/prompts/prompt-management.component.d.ts +23 -0
  10. package/dist/AI/components/prompts/prompt-management.component.d.ts.map +1 -1
  11. package/dist/AI/components/prompts/prompt-management.component.js +135 -30
  12. package/dist/AI/components/prompts/prompt-management.component.js.map +1 -1
  13. package/dist/APIKeys/api-applications-panel.component.d.ts +5 -3
  14. package/dist/APIKeys/api-applications-panel.component.d.ts.map +1 -1
  15. package/dist/APIKeys/api-applications-panel.component.js +50 -51
  16. package/dist/APIKeys/api-applications-panel.component.js.map +1 -1
  17. package/dist/APIKeys/api-key-create-dialog.component.d.ts +4 -3
  18. package/dist/APIKeys/api-key-create-dialog.component.d.ts.map +1 -1
  19. package/dist/APIKeys/api-key-create-dialog.component.js +119 -94
  20. package/dist/APIKeys/api-key-create-dialog.component.js.map +1 -1
  21. package/dist/APIKeys/api-key-edit-panel.component.d.ts +1 -1
  22. package/dist/APIKeys/api-key-edit-panel.component.d.ts.map +1 -1
  23. package/dist/APIKeys/api-key-edit-panel.component.js +100 -87
  24. package/dist/APIKeys/api-key-edit-panel.component.js.map +1 -1
  25. package/dist/APIKeys/api-key-list.component.d.ts +2 -1
  26. package/dist/APIKeys/api-key-list.component.d.ts.map +1 -1
  27. package/dist/APIKeys/api-key-list.component.js +24 -20
  28. package/dist/APIKeys/api-key-list.component.js.map +1 -1
  29. package/dist/APIKeys/api-keys-resource.component.d.ts +6 -4
  30. package/dist/APIKeys/api-keys-resource.component.d.ts.map +1 -1
  31. package/dist/APIKeys/api-keys-resource.component.js +42 -57
  32. package/dist/APIKeys/api-keys-resource.component.js.map +1 -1
  33. package/dist/Actions/components/explorer/action-breadcrumb.component.d.ts +22 -0
  34. package/dist/Actions/components/explorer/action-breadcrumb.component.d.ts.map +1 -0
  35. package/dist/Actions/components/explorer/action-breadcrumb.component.js +139 -0
  36. package/dist/Actions/components/explorer/action-breadcrumb.component.js.map +1 -0
  37. package/dist/Actions/components/explorer/action-card.component.d.ts +39 -0
  38. package/dist/Actions/components/explorer/action-card.component.d.ts.map +1 -0
  39. package/dist/Actions/components/explorer/action-card.component.js +410 -0
  40. package/dist/Actions/components/explorer/action-card.component.js.map +1 -0
  41. package/dist/Actions/components/explorer/action-explorer.component.d.ts +62 -0
  42. package/dist/Actions/components/explorer/action-explorer.component.d.ts.map +1 -0
  43. package/dist/Actions/components/explorer/action-explorer.component.js +527 -0
  44. package/dist/Actions/components/explorer/action-explorer.component.js.map +1 -0
  45. package/dist/Actions/components/explorer/action-list-item.component.d.ts +24 -0
  46. package/dist/Actions/components/explorer/action-list-item.component.d.ts.map +1 -0
  47. package/dist/Actions/components/explorer/action-list-item.component.js +210 -0
  48. package/dist/Actions/components/explorer/action-list-item.component.js.map +1 -0
  49. package/dist/Actions/components/explorer/action-toolbar.component.d.ts +63 -0
  50. package/dist/Actions/components/explorer/action-toolbar.component.d.ts.map +1 -0
  51. package/dist/Actions/components/explorer/action-toolbar.component.js +483 -0
  52. package/dist/Actions/components/explorer/action-toolbar.component.js.map +1 -0
  53. package/dist/Actions/components/explorer/action-tree-panel.component.d.ts +57 -0
  54. package/dist/Actions/components/explorer/action-tree-panel.component.d.ts.map +1 -0
  55. package/dist/Actions/components/explorer/action-tree-panel.component.js +454 -0
  56. package/dist/Actions/components/explorer/action-tree-panel.component.js.map +1 -0
  57. package/dist/Actions/components/explorer/index.d.ts +10 -0
  58. package/dist/Actions/components/explorer/index.d.ts.map +1 -0
  59. package/dist/Actions/components/explorer/index.js +14 -0
  60. package/dist/Actions/components/explorer/index.js.map +1 -0
  61. package/dist/Actions/components/explorer/new-action-panel.component.d.ts +49 -0
  62. package/dist/Actions/components/explorer/new-action-panel.component.d.ts.map +1 -0
  63. package/dist/Actions/components/explorer/new-action-panel.component.js +359 -0
  64. package/dist/Actions/components/explorer/new-action-panel.component.js.map +1 -0
  65. package/dist/Actions/components/explorer/new-category-panel.component.d.ts +37 -0
  66. package/dist/Actions/components/explorer/new-category-panel.component.d.ts.map +1 -0
  67. package/dist/Actions/components/explorer/new-category-panel.component.js +282 -0
  68. package/dist/Actions/components/explorer/new-category-panel.component.js.map +1 -0
  69. package/dist/Actions/index.d.ts +3 -0
  70. package/dist/Actions/index.d.ts.map +1 -1
  71. package/dist/Actions/index.js +5 -0
  72. package/dist/Actions/index.js.map +1 -1
  73. package/dist/Actions/services/action-explorer-state.service.d.ts +104 -0
  74. package/dist/Actions/services/action-explorer-state.service.d.ts.map +1 -0
  75. package/dist/Actions/services/action-explorer-state.service.js +352 -0
  76. package/dist/Actions/services/action-explorer-state.service.js.map +1 -0
  77. package/dist/Communication/communication-dashboard.component.d.ts +2 -6
  78. package/dist/Communication/communication-dashboard.component.d.ts.map +1 -1
  79. package/dist/Communication/communication-dashboard.component.js +142 -93
  80. package/dist/Communication/communication-dashboard.component.js.map +1 -1
  81. package/dist/Communication/communication-logs-resource.component.d.ts +10 -4
  82. package/dist/Communication/communication-logs-resource.component.d.ts.map +1 -1
  83. package/dist/Communication/communication-logs-resource.component.js +253 -121
  84. package/dist/Communication/communication-logs-resource.component.js.map +1 -1
  85. package/dist/Communication/communication-monitor-resource.component.d.ts +38 -3
  86. package/dist/Communication/communication-monitor-resource.component.d.ts.map +1 -1
  87. package/dist/Communication/communication-monitor-resource.component.js +431 -157
  88. package/dist/Communication/communication-monitor-resource.component.js.map +1 -1
  89. package/dist/Communication/communication-providers-resource.component.d.ts +16 -5
  90. package/dist/Communication/communication-providers-resource.component.d.ts.map +1 -1
  91. package/dist/Communication/communication-providers-resource.component.js +229 -118
  92. package/dist/Communication/communication-providers-resource.component.js.map +1 -1
  93. package/dist/Communication/communication-runs-resource.component.d.ts +4 -2
  94. package/dist/Communication/communication-runs-resource.component.d.ts.map +1 -1
  95. package/dist/Communication/communication-runs-resource.component.js +155 -149
  96. package/dist/Communication/communication-runs-resource.component.js.map +1 -1
  97. package/dist/Communication/communication-templates-resource.component.d.ts +43 -0
  98. package/dist/Communication/communication-templates-resource.component.d.ts.map +1 -0
  99. package/dist/Communication/communication-templates-resource.component.js +371 -0
  100. package/dist/Communication/communication-templates-resource.component.js.map +1 -0
  101. package/dist/ComponentStudio/component-studio-dashboard.component.d.ts +69 -267
  102. package/dist/ComponentStudio/component-studio-dashboard.component.d.ts.map +1 -1
  103. package/dist/ComponentStudio/component-studio-dashboard.component.js +698 -1802
  104. package/dist/ComponentStudio/component-studio-dashboard.component.js.map +1 -1
  105. package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.d.ts +68 -0
  106. package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.d.ts.map +1 -0
  107. package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.js +401 -0
  108. package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.js.map +1 -0
  109. package/dist/ComponentStudio/components/browser/component-browser.component.d.ts +44 -0
  110. package/dist/ComponentStudio/components/browser/component-browser.component.d.ts.map +1 -0
  111. package/dist/ComponentStudio/components/browser/component-browser.component.js +636 -0
  112. package/dist/ComponentStudio/components/browser/component-browser.component.js.map +1 -0
  113. package/dist/ComponentStudio/components/editors/code-editor-panel.component.d.ts +35 -0
  114. package/dist/ComponentStudio/components/editors/code-editor-panel.component.d.ts.map +1 -0
  115. package/dist/ComponentStudio/components/editors/code-editor-panel.component.js +380 -0
  116. package/dist/ComponentStudio/components/editors/code-editor-panel.component.js.map +1 -0
  117. package/dist/ComponentStudio/components/editors/data-requirements-editor.component.d.ts +24 -0
  118. package/dist/ComponentStudio/components/editors/data-requirements-editor.component.d.ts.map +1 -0
  119. package/dist/ComponentStudio/components/editors/data-requirements-editor.component.js +221 -0
  120. package/dist/ComponentStudio/components/editors/data-requirements-editor.component.js.map +1 -0
  121. package/dist/ComponentStudio/components/editors/requirements-editor.component.d.ts +28 -0
  122. package/dist/ComponentStudio/components/editors/requirements-editor.component.d.ts.map +1 -0
  123. package/dist/ComponentStudio/components/editors/requirements-editor.component.js +263 -0
  124. package/dist/ComponentStudio/components/editors/requirements-editor.component.js.map +1 -0
  125. package/dist/ComponentStudio/components/editors/spec-editor.component.d.ts +34 -0
  126. package/dist/ComponentStudio/components/editors/spec-editor.component.d.ts.map +1 -0
  127. package/dist/ComponentStudio/components/editors/spec-editor.component.js +307 -0
  128. package/dist/ComponentStudio/components/editors/spec-editor.component.js.map +1 -0
  129. package/dist/ComponentStudio/components/new-component-dialog/new-component-dialog.component.d.ts +29 -0
  130. package/dist/ComponentStudio/components/new-component-dialog/new-component-dialog.component.d.ts.map +1 -0
  131. package/dist/ComponentStudio/components/new-component-dialog/new-component-dialog.component.js +159 -0
  132. package/dist/ComponentStudio/components/new-component-dialog/new-component-dialog.component.js.map +1 -0
  133. package/dist/ComponentStudio/components/save-version-dialog/save-version-dialog.component.d.ts +20 -0
  134. package/dist/ComponentStudio/components/save-version-dialog/save-version-dialog.component.d.ts.map +1 -0
  135. package/dist/ComponentStudio/components/save-version-dialog/save-version-dialog.component.js +192 -0
  136. package/dist/ComponentStudio/components/save-version-dialog/save-version-dialog.component.js.map +1 -0
  137. package/dist/ComponentStudio/components/workspace/component-preview.component.d.ts +57 -0
  138. package/dist/ComponentStudio/components/workspace/component-preview.component.d.ts.map +1 -0
  139. package/dist/ComponentStudio/components/workspace/component-preview.component.js +342 -0
  140. package/dist/ComponentStudio/components/workspace/component-preview.component.js.map +1 -0
  141. package/dist/ComponentStudio/components/workspace/editor-tabs.component.d.ts +15 -0
  142. package/dist/ComponentStudio/components/workspace/editor-tabs.component.d.ts.map +1 -0
  143. package/dist/ComponentStudio/components/workspace/editor-tabs.component.js +144 -0
  144. package/dist/ComponentStudio/components/workspace/editor-tabs.component.js.map +1 -0
  145. package/dist/ComponentStudio/services/component-studio-state.service.d.ts +203 -0
  146. package/dist/ComponentStudio/services/component-studio-state.service.d.ts.map +1 -0
  147. package/dist/ComponentStudio/services/component-studio-state.service.js +651 -0
  148. package/dist/ComponentStudio/services/component-studio-state.service.js.map +1 -0
  149. package/dist/ComponentStudio/services/component-version.service.d.ts +120 -0
  150. package/dist/ComponentStudio/services/component-version.service.d.ts.map +1 -0
  151. package/dist/ComponentStudio/services/component-version.service.js +394 -0
  152. package/dist/ComponentStudio/services/component-version.service.js.map +1 -0
  153. package/dist/Credentials/components/credentials-categories-resource.component.d.ts +1 -1
  154. package/dist/Credentials/components/credentials-categories-resource.component.d.ts.map +1 -1
  155. package/dist/Credentials/components/credentials-categories-resource.component.js +1 -1
  156. package/dist/Credentials/components/credentials-list-resource.component.d.ts +1 -1
  157. package/dist/Credentials/components/credentials-list-resource.component.d.ts.map +1 -1
  158. package/dist/Credentials/components/credentials-list-resource.component.js +1 -1
  159. package/dist/Credentials/components/credentials-types-resource.component.d.ts +1 -1
  160. package/dist/Credentials/components/credentials-types-resource.component.d.ts.map +1 -1
  161. package/dist/Credentials/components/credentials-types-resource.component.js +1 -1
  162. package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.d.ts +2 -2
  163. package/dist/MCP/components/mcp-connection-dialog.component.d.ts +72 -0
  164. package/dist/MCP/components/mcp-connection-dialog.component.d.ts.map +1 -0
  165. package/dist/MCP/components/mcp-connection-dialog.component.js +529 -0
  166. package/dist/MCP/components/mcp-connection-dialog.component.js.map +1 -0
  167. package/dist/MCP/components/mcp-log-detail-panel.component.d.ts +77 -0
  168. package/dist/MCP/components/mcp-log-detail-panel.component.d.ts.map +1 -0
  169. package/dist/MCP/components/mcp-log-detail-panel.component.js +535 -0
  170. package/dist/MCP/components/mcp-log-detail-panel.component.js.map +1 -0
  171. package/dist/MCP/components/mcp-server-dialog.component.d.ts +77 -0
  172. package/dist/MCP/components/mcp-server-dialog.component.d.ts.map +1 -0
  173. package/dist/MCP/components/mcp-server-dialog.component.js +437 -0
  174. package/dist/MCP/components/mcp-server-dialog.component.js.map +1 -0
  175. package/dist/MCP/components/mcp-test-tool-dialog.component.d.ts +271 -0
  176. package/dist/MCP/components/mcp-test-tool-dialog.component.d.ts.map +1 -0
  177. package/dist/MCP/components/mcp-test-tool-dialog.component.js +1300 -0
  178. package/dist/MCP/components/mcp-test-tool-dialog.component.js.map +1 -0
  179. package/dist/MCP/index.d.ts +11 -0
  180. package/dist/MCP/index.d.ts.map +1 -0
  181. package/dist/MCP/index.js +15 -0
  182. package/dist/MCP/index.js.map +1 -0
  183. package/dist/MCP/mcp-dashboard.component.d.ts +409 -0
  184. package/dist/MCP/mcp-dashboard.component.d.ts.map +1 -0
  185. package/dist/MCP/mcp-dashboard.component.js +2486 -0
  186. package/dist/MCP/mcp-dashboard.component.js.map +1 -0
  187. package/dist/MCP/mcp-resource.component.d.ts +20 -0
  188. package/dist/MCP/mcp-resource.component.d.ts.map +1 -0
  189. package/dist/MCP/mcp-resource.component.js +55 -0
  190. package/dist/MCP/mcp-resource.component.js.map +1 -0
  191. package/dist/MCP/mcp.module.d.ts +27 -0
  192. package/dist/MCP/mcp.module.d.ts.map +1 -0
  193. package/dist/MCP/mcp.module.js +122 -0
  194. package/dist/MCP/mcp.module.js.map +1 -0
  195. package/dist/MCP/services/mcp-tools.service.d.ts +109 -0
  196. package/dist/MCP/services/mcp-tools.service.d.ts.map +1 -0
  197. package/dist/MCP/services/mcp-tools.service.js +222 -0
  198. package/dist/MCP/services/mcp-tools.service.js.map +1 -0
  199. package/dist/Scheduling/components/index.d.ts +5 -8
  200. package/dist/Scheduling/components/index.d.ts.map +1 -1
  201. package/dist/Scheduling/components/index.js +6 -9
  202. package/dist/Scheduling/components/index.js.map +1 -1
  203. package/dist/Scheduling/components/job-slideout.component.d.ts +45 -0
  204. package/dist/Scheduling/components/job-slideout.component.d.ts.map +1 -0
  205. package/dist/Scheduling/components/job-slideout.component.js +458 -0
  206. package/dist/Scheduling/components/job-slideout.component.js.map +1 -0
  207. package/dist/Scheduling/components/scheduling-activity-resource.component.d.ts +19 -0
  208. package/dist/Scheduling/components/scheduling-activity-resource.component.d.ts.map +1 -0
  209. package/dist/Scheduling/components/scheduling-activity-resource.component.js +51 -0
  210. package/dist/Scheduling/components/scheduling-activity-resource.component.js.map +1 -0
  211. package/dist/Scheduling/components/scheduling-activity.component.d.ts +71 -0
  212. package/dist/Scheduling/components/scheduling-activity.component.d.ts.map +1 -0
  213. package/dist/Scheduling/components/scheduling-activity.component.js +714 -0
  214. package/dist/Scheduling/components/scheduling-activity.component.js.map +1 -0
  215. package/dist/Scheduling/components/scheduling-jobs-resource.component.d.ts +3 -4
  216. package/dist/Scheduling/components/scheduling-jobs-resource.component.d.ts.map +1 -1
  217. package/dist/Scheduling/components/scheduling-jobs-resource.component.js +3 -7
  218. package/dist/Scheduling/components/scheduling-jobs-resource.component.js.map +1 -1
  219. package/dist/Scheduling/components/scheduling-jobs.component.d.ts +52 -34
  220. package/dist/Scheduling/components/scheduling-jobs.component.d.ts.map +1 -1
  221. package/dist/Scheduling/components/scheduling-jobs.component.js +446 -261
  222. package/dist/Scheduling/components/scheduling-jobs.component.js.map +1 -1
  223. package/dist/Scheduling/components/scheduling-overview-resource.component.d.ts +19 -0
  224. package/dist/Scheduling/components/scheduling-overview-resource.component.d.ts.map +1 -0
  225. package/dist/Scheduling/components/scheduling-overview-resource.component.js +51 -0
  226. package/dist/Scheduling/components/scheduling-overview-resource.component.js.map +1 -0
  227. package/dist/Scheduling/components/scheduling-overview.component.d.ts +43 -0
  228. package/dist/Scheduling/components/scheduling-overview.component.d.ts.map +1 -0
  229. package/dist/Scheduling/components/scheduling-overview.component.js +595 -0
  230. package/dist/Scheduling/components/scheduling-overview.component.js.map +1 -0
  231. package/dist/Scheduling/scheduling-dashboard.component.d.ts +22 -32
  232. package/dist/Scheduling/scheduling-dashboard.component.d.ts.map +1 -1
  233. package/dist/Scheduling/scheduling-dashboard.component.js +175 -169
  234. package/dist/Scheduling/scheduling-dashboard.component.js.map +1 -1
  235. package/dist/Scheduling/services/scheduling-instrumentation.service.d.ts +49 -6
  236. package/dist/Scheduling/services/scheduling-instrumentation.service.d.ts.map +1 -1
  237. package/dist/Scheduling/services/scheduling-instrumentation.service.js +218 -149
  238. package/dist/Scheduling/services/scheduling-instrumentation.service.js.map +1 -1
  239. package/dist/Testing/components/index.d.ts +7 -8
  240. package/dist/Testing/components/index.d.ts.map +1 -1
  241. package/dist/Testing/components/index.js +8 -9
  242. package/dist/Testing/components/index.js.map +1 -1
  243. package/dist/Testing/components/testing-analytics-resource.component.d.ts +0 -4
  244. package/dist/Testing/components/testing-analytics-resource.component.d.ts.map +1 -1
  245. package/dist/Testing/components/testing-analytics-resource.component.js +1 -7
  246. package/dist/Testing/components/testing-analytics-resource.component.js.map +1 -1
  247. package/dist/Testing/components/testing-analytics.component.d.ts +52 -37
  248. package/dist/Testing/components/testing-analytics.component.d.ts.map +1 -1
  249. package/dist/Testing/components/testing-analytics.component.js +1023 -569
  250. package/dist/Testing/components/testing-analytics.component.js.map +1 -1
  251. package/dist/Testing/components/testing-dashboard-tab-resource.component.d.ts +16 -0
  252. package/dist/Testing/components/testing-dashboard-tab-resource.component.d.ts.map +1 -0
  253. package/dist/Testing/components/testing-dashboard-tab-resource.component.js +47 -0
  254. package/dist/Testing/components/testing-dashboard-tab-resource.component.js.map +1 -0
  255. package/dist/Testing/components/testing-dashboard-tab.component.d.ts +57 -0
  256. package/dist/Testing/components/testing-dashboard-tab.component.d.ts.map +1 -0
  257. package/dist/Testing/components/testing-dashboard-tab.component.js +649 -0
  258. package/dist/Testing/components/testing-dashboard-tab.component.js.map +1 -0
  259. package/dist/{Scheduling/components/scheduling-types-resource.component.d.ts → Testing/components/testing-explorer-resource.component.d.ts} +5 -9
  260. package/dist/Testing/components/testing-explorer-resource.component.d.ts.map +1 -0
  261. package/dist/Testing/components/testing-explorer-resource.component.js +47 -0
  262. package/dist/Testing/components/testing-explorer-resource.component.js.map +1 -0
  263. package/dist/Testing/components/testing-explorer.component.d.ts +193 -0
  264. package/dist/Testing/components/testing-explorer.component.d.ts.map +1 -0
  265. package/dist/Testing/components/testing-explorer.component.js +2212 -0
  266. package/dist/Testing/components/testing-explorer.component.js.map +1 -0
  267. package/dist/Testing/components/testing-review-resource.component.d.ts +16 -0
  268. package/dist/Testing/components/testing-review-resource.component.d.ts.map +1 -0
  269. package/dist/Testing/components/testing-review-resource.component.js +47 -0
  270. package/dist/Testing/components/testing-review-resource.component.js.map +1 -0
  271. package/dist/Testing/components/testing-review.component.d.ts +60 -0
  272. package/dist/Testing/components/testing-review.component.d.ts.map +1 -0
  273. package/dist/Testing/components/testing-review.component.js +985 -0
  274. package/dist/Testing/components/testing-review.component.js.map +1 -0
  275. package/dist/Testing/components/testing-runs-resource.component.d.ts +16 -0
  276. package/dist/Testing/components/testing-runs-resource.component.d.ts.map +1 -0
  277. package/dist/Testing/components/testing-runs-resource.component.js +47 -0
  278. package/dist/Testing/components/testing-runs-resource.component.js.map +1 -0
  279. package/dist/Testing/components/testing-runs.component.d.ts +82 -0
  280. package/dist/Testing/components/testing-runs.component.d.ts.map +1 -0
  281. package/dist/Testing/components/testing-runs.component.js +1067 -0
  282. package/dist/Testing/components/testing-runs.component.js.map +1 -0
  283. package/dist/Testing/testing-dashboard.component.d.ts +12 -15
  284. package/dist/Testing/testing-dashboard.component.d.ts.map +1 -1
  285. package/dist/Testing/testing-dashboard.component.js +46 -68
  286. package/dist/Testing/testing-dashboard.component.js.map +1 -1
  287. package/dist/module.d.ts +121 -104
  288. package/dist/module.d.ts.map +1 -1
  289. package/dist/module.js +185 -93
  290. package/dist/module.js.map +1 -1
  291. package/dist/public-api.d.ts +5 -3
  292. package/dist/public-api.d.ts.map +1 -1
  293. package/dist/public-api.js +23 -16
  294. package/dist/public-api.js.map +1 -1
  295. package/dist/shared/pipes/highlight-search.pipe.d.ts +17 -0
  296. package/dist/shared/pipes/highlight-search.pipe.d.ts.map +1 -0
  297. package/dist/shared/pipes/highlight-search.pipe.js +40 -0
  298. package/dist/shared/pipes/highlight-search.pipe.js.map +1 -0
  299. package/dist/shared/pipes/index.d.ts +2 -0
  300. package/dist/shared/pipes/index.d.ts.map +1 -0
  301. package/dist/shared/pipes/index.js +2 -0
  302. package/dist/shared/pipes/index.js.map +1 -0
  303. package/dist/shared/shared-pipes.module.d.ts +11 -0
  304. package/dist/shared/shared-pipes.module.d.ts.map +1 -0
  305. package/dist/shared/shared-pipes.module.js +24 -0
  306. package/dist/shared/shared-pipes.module.js.map +1 -0
  307. package/package.json +39 -32
  308. package/dist/Credentials/components/credential-category-edit-panel.component.d.ts +0 -44
  309. package/dist/Credentials/components/credential-category-edit-panel.component.d.ts.map +0 -1
  310. package/dist/Credentials/components/credential-category-edit-panel.component.js +0 -456
  311. package/dist/Credentials/components/credential-category-edit-panel.component.js.map +0 -1
  312. package/dist/Credentials/components/credential-edit-panel.component.d.ts +0 -70
  313. package/dist/Credentials/components/credential-edit-panel.component.d.ts.map +0 -1
  314. package/dist/Credentials/components/credential-edit-panel.component.js +0 -694
  315. package/dist/Credentials/components/credential-edit-panel.component.js.map +0 -1
  316. package/dist/Credentials/components/credential-type-edit-panel.component.d.ts +0 -56
  317. package/dist/Credentials/components/credential-type-edit-panel.component.d.ts.map +0 -1
  318. package/dist/Credentials/components/credential-type-edit-panel.component.js +0 -563
  319. package/dist/Credentials/components/credential-type-edit-panel.component.js.map +0 -1
  320. package/dist/Scheduling/components/scheduling-health-resource.component.d.ts +0 -20
  321. package/dist/Scheduling/components/scheduling-health-resource.component.d.ts.map +0 -1
  322. package/dist/Scheduling/components/scheduling-health-resource.component.js +0 -55
  323. package/dist/Scheduling/components/scheduling-health-resource.component.js.map +0 -1
  324. package/dist/Scheduling/components/scheduling-health.component.d.ts +0 -30
  325. package/dist/Scheduling/components/scheduling-health.component.d.ts.map +0 -1
  326. package/dist/Scheduling/components/scheduling-health.component.js +0 -315
  327. package/dist/Scheduling/components/scheduling-health.component.js.map +0 -1
  328. package/dist/Scheduling/components/scheduling-history-resource.component.d.ts +0 -20
  329. package/dist/Scheduling/components/scheduling-history-resource.component.d.ts.map +0 -1
  330. package/dist/Scheduling/components/scheduling-history-resource.component.js +0 -55
  331. package/dist/Scheduling/components/scheduling-history-resource.component.js.map +0 -1
  332. package/dist/Scheduling/components/scheduling-history.component.d.ts +0 -48
  333. package/dist/Scheduling/components/scheduling-history.component.d.ts.map +0 -1
  334. package/dist/Scheduling/components/scheduling-history.component.js +0 -377
  335. package/dist/Scheduling/components/scheduling-history.component.js.map +0 -1
  336. package/dist/Scheduling/components/scheduling-monitor-resource.component.d.ts +0 -20
  337. package/dist/Scheduling/components/scheduling-monitor-resource.component.d.ts.map +0 -1
  338. package/dist/Scheduling/components/scheduling-monitor-resource.component.js +0 -55
  339. package/dist/Scheduling/components/scheduling-monitor-resource.component.js.map +0 -1
  340. package/dist/Scheduling/components/scheduling-monitoring.component.d.ts +0 -37
  341. package/dist/Scheduling/components/scheduling-monitoring.component.d.ts.map +0 -1
  342. package/dist/Scheduling/components/scheduling-monitoring.component.js +0 -488
  343. package/dist/Scheduling/components/scheduling-monitoring.component.js.map +0 -1
  344. package/dist/Scheduling/components/scheduling-types-resource.component.d.ts.map +0 -1
  345. package/dist/Scheduling/components/scheduling-types-resource.component.js +0 -55
  346. package/dist/Scheduling/components/scheduling-types-resource.component.js.map +0 -1
  347. package/dist/Scheduling/components/scheduling-types.component.d.ts +0 -22
  348. package/dist/Scheduling/components/scheduling-types.component.d.ts.map +0 -1
  349. package/dist/Scheduling/components/scheduling-types.component.js +0 -165
  350. package/dist/Scheduling/components/scheduling-types.component.js.map +0 -1
  351. package/dist/Testing/components/testing-execution-resource.component.d.ts +0 -20
  352. package/dist/Testing/components/testing-execution-resource.component.d.ts.map +0 -1
  353. package/dist/Testing/components/testing-execution-resource.component.js +0 -55
  354. package/dist/Testing/components/testing-execution-resource.component.js.map +0 -1
  355. package/dist/Testing/components/testing-execution.component.d.ts +0 -71
  356. package/dist/Testing/components/testing-execution.component.d.ts.map +0 -1
  357. package/dist/Testing/components/testing-execution.component.js +0 -845
  358. package/dist/Testing/components/testing-execution.component.js.map +0 -1
  359. package/dist/Testing/components/testing-feedback-resource.component.d.ts +0 -20
  360. package/dist/Testing/components/testing-feedback-resource.component.d.ts.map +0 -1
  361. package/dist/Testing/components/testing-feedback-resource.component.js +0 -55
  362. package/dist/Testing/components/testing-feedback-resource.component.js.map +0 -1
  363. package/dist/Testing/components/testing-feedback.component.d.ts +0 -111
  364. package/dist/Testing/components/testing-feedback.component.d.ts.map +0 -1
  365. package/dist/Testing/components/testing-feedback.component.js +0 -1486
  366. package/dist/Testing/components/testing-feedback.component.js.map +0 -1
  367. package/dist/Testing/components/testing-overview-resource.component.d.ts +0 -20
  368. package/dist/Testing/components/testing-overview-resource.component.d.ts.map +0 -1
  369. package/dist/Testing/components/testing-overview-resource.component.js +0 -55
  370. package/dist/Testing/components/testing-overview-resource.component.js.map +0 -1
  371. package/dist/Testing/components/testing-overview.component.d.ts +0 -30
  372. package/dist/Testing/components/testing-overview.component.d.ts.map +0 -1
  373. package/dist/Testing/components/testing-overview.component.js +0 -361
  374. package/dist/Testing/components/testing-overview.component.js.map +0 -1
  375. package/dist/Testing/components/testing-version-comparison.component.d.ts +0 -62
  376. package/dist/Testing/components/testing-version-comparison.component.d.ts.map +0 -1
  377. package/dist/Testing/components/testing-version-comparison.component.js +0 -815
  378. package/dist/Testing/components/testing-version-comparison.component.js.map +0 -1
  379. package/dist/Testing/components/testing-version-resource.component.d.ts +0 -20
  380. package/dist/Testing/components/testing-version-resource.component.d.ts.map +0 -1
  381. package/dist/Testing/components/testing-version-resource.component.js +0 -55
  382. package/dist/Testing/components/testing-version-resource.component.js.map +0 -1
@@ -1,6 +1,7 @@
1
1
  import { Component, EventEmitter, HostListener, Input, Output } from '@angular/core';
2
- import { Metadata, RunView } from '@memberjunction/core';
2
+ import { Metadata } from '@memberjunction/core';
3
3
  import { GraphQLEncryptionClient } from '@memberjunction/graphql-dataprovider';
4
+ import { APIKeysEngineBase, parseAPIScopeUIConfig } from '@memberjunction/api-keys-base';
4
5
  import * as i0 from "@angular/core";
5
6
  import * as i1 from "@angular/common";
6
7
  import * as i2 from "@angular/forms";
@@ -149,7 +150,7 @@ function APIKeyCreateDialogComponent_div_10_Template(rf, ctx) { if (rf & 1) {
149
150
  i0.ɵɵproperty("ngIf", ctx_r1.Error);
150
151
  } }
151
152
  function APIKeyCreateDialogComponent_div_11_div_7_Template(rf, ctx) { if (rf & 1) {
152
- i0.ɵɵelementStart(0, "div", 52)(1, "span", 53);
153
+ i0.ɵɵelementStart(0, "div", 53)(1, "span", 54);
153
154
  i0.ɵɵtext(2);
154
155
  i0.ɵɵelementEnd();
155
156
  i0.ɵɵtext(3, " selected ");
@@ -160,10 +161,10 @@ function APIKeyCreateDialogComponent_div_11_div_7_Template(rf, ctx) { if (rf & 1
160
161
  i0.ɵɵtextInterpolate(ctx_r1.getSelectedScopeCount());
161
162
  } }
162
163
  function APIKeyCreateDialogComponent_div_11_mj_loading_8_Template(rf, ctx) { if (rf & 1) {
163
- i0.ɵɵelement(0, "mj-loading", 54);
164
+ i0.ɵɵelement(0, "mj-loading", 55);
164
165
  } }
165
166
  function APIKeyCreateDialogComponent_div_11_div_9_div_1_div_14_div_1_span_6_Template(rf, ctx) { if (rf & 1) {
166
- i0.ɵɵelementStart(0, "span", 74);
167
+ i0.ɵɵelementStart(0, "span", 75);
167
168
  i0.ɵɵtext(1);
168
169
  i0.ɵɵelementEnd();
169
170
  } if (rf & 2) {
@@ -173,14 +174,14 @@ function APIKeyCreateDialogComponent_div_11_div_9_div_1_div_14_div_1_span_6_Temp
173
174
  } }
174
175
  function APIKeyCreateDialogComponent_div_11_div_9_div_1_div_14_div_1_Template(rf, ctx) { if (rf & 1) {
175
176
  const _r10 = i0.ɵɵgetCurrentView();
176
- i0.ɵɵelementStart(0, "div", 69)(1, "label", 70)(2, "input", 30);
177
+ i0.ɵɵelementStart(0, "div", 70)(1, "label", 71)(2, "input", 30);
177
178
  i0.ɵɵtwoWayListener("ngModelChange", function APIKeyCreateDialogComponent_div_11_div_9_div_1_div_14_div_1_Template_input_ngModelChange_2_listener($event) { const item_r11 = i0.ɵɵrestoreView(_r10).$implicit; i0.ɵɵtwoWayBindingSet(item_r11.selected, $event) || (item_r11.selected = $event); return i0.ɵɵresetView($event); });
178
179
  i0.ɵɵlistener("change", function APIKeyCreateDialogComponent_div_11_div_9_div_1_div_14_div_1_Template_input_change_2_listener() { i0.ɵɵrestoreView(_r10); const category_r9 = i0.ɵɵnextContext(2).$implicit; const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.updateCategoryState(category_r9)); });
179
180
  i0.ɵɵelementEnd();
180
- i0.ɵɵelementStart(3, "div", 71)(4, "span", 72);
181
+ i0.ɵɵelementStart(3, "div", 72)(4, "span", 73);
181
182
  i0.ɵɵtext(5);
182
183
  i0.ɵɵelementEnd();
183
- i0.ɵɵtemplate(6, APIKeyCreateDialogComponent_div_11_div_9_div_1_div_14_div_1_span_6_Template, 2, 1, "span", 73);
184
+ i0.ɵɵtemplate(6, APIKeyCreateDialogComponent_div_11_div_9_div_1_div_14_div_1_span_6_Template, 2, 1, "span", 74);
184
185
  i0.ɵɵelementEnd()()();
185
186
  } if (rf & 2) {
186
187
  const item_r11 = ctx.$implicit;
@@ -192,8 +193,8 @@ function APIKeyCreateDialogComponent_div_11_div_9_div_1_div_14_div_1_Template(rf
192
193
  i0.ɵɵproperty("ngIf", item_r11.scope.Description);
193
194
  } }
194
195
  function APIKeyCreateDialogComponent_div_11_div_9_div_1_div_14_Template(rf, ctx) { if (rf & 1) {
195
- i0.ɵɵelementStart(0, "div", 67);
196
- i0.ɵɵtemplate(1, APIKeyCreateDialogComponent_div_11_div_9_div_1_div_14_div_1_Template, 7, 3, "div", 68);
196
+ i0.ɵɵelementStart(0, "div", 68);
197
+ i0.ɵɵtemplate(1, APIKeyCreateDialogComponent_div_11_div_9_div_1_div_14_div_1_Template, 7, 3, "div", 69);
197
198
  i0.ɵɵelementEnd();
198
199
  } if (rf & 2) {
199
200
  const category_r9 = i0.ɵɵnextContext().$implicit;
@@ -202,27 +203,27 @@ function APIKeyCreateDialogComponent_div_11_div_9_div_1_div_14_Template(rf, ctx)
202
203
  } }
203
204
  function APIKeyCreateDialogComponent_div_11_div_9_div_1_Template(rf, ctx) { if (rf & 1) {
204
205
  const _r8 = i0.ɵɵgetCurrentView();
205
- i0.ɵɵelementStart(0, "div", 57)(1, "div", 58);
206
+ i0.ɵɵelementStart(0, "div", 58)(1, "div", 59);
206
207
  i0.ɵɵlistener("click", function APIKeyCreateDialogComponent_div_11_div_9_div_1_Template_div_click_1_listener() { const category_r9 = i0.ɵɵrestoreView(_r8).$implicit; const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.toggleCategory(category_r9)); });
207
- i0.ɵɵelementStart(2, "div", 59);
208
+ i0.ɵɵelementStart(2, "div", 60);
208
209
  i0.ɵɵelement(3, "i");
209
- i0.ɵɵelementStart(4, "span", 60);
210
+ i0.ɵɵelementStart(4, "span", 61);
210
211
  i0.ɵɵtext(5);
211
212
  i0.ɵɵelementEnd();
212
- i0.ɵɵelementStart(6, "span", 61);
213
+ i0.ɵɵelementStart(6, "span", 62);
213
214
  i0.ɵɵtext(7);
214
215
  i0.ɵɵelementEnd()();
215
- i0.ɵɵelementStart(8, "div", 62)(9, "label", 63);
216
+ i0.ɵɵelementStart(8, "div", 63)(9, "label", 64);
216
217
  i0.ɵɵlistener("click", function APIKeyCreateDialogComponent_div_11_div_9_div_1_Template_label_click_9_listener($event) { i0.ɵɵrestoreView(_r8); return i0.ɵɵresetView($event.stopPropagation()); });
217
- i0.ɵɵelementStart(10, "input", 64);
218
+ i0.ɵɵelementStart(10, "input", 65);
218
219
  i0.ɵɵlistener("change", function APIKeyCreateDialogComponent_div_11_div_9_div_1_Template_input_change_10_listener() { const category_r9 = i0.ɵɵrestoreView(_r8).$implicit; const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.toggleCategoryAll(category_r9)); });
219
220
  i0.ɵɵelementEnd();
220
221
  i0.ɵɵelementStart(11, "span");
221
222
  i0.ɵɵtext(12, "All");
222
223
  i0.ɵɵelementEnd()();
223
- i0.ɵɵelement(13, "i", 65);
224
+ i0.ɵɵelement(13, "i", 66);
224
225
  i0.ɵɵelementEnd()();
225
- i0.ɵɵtemplate(14, APIKeyCreateDialogComponent_div_11_div_9_div_1_div_14_Template, 2, 1, "div", 66);
226
+ i0.ɵɵtemplate(14, APIKeyCreateDialogComponent_div_11_div_9_div_1_div_14_Template, 2, 1, "div", 67);
226
227
  i0.ɵɵelementEnd();
227
228
  } if (rf & 2) {
228
229
  const category_r9 = ctx.$implicit;
@@ -241,14 +242,28 @@ function APIKeyCreateDialogComponent_div_11_div_9_div_1_Template(rf, ctx) { if (
241
242
  i0.ɵɵproperty("ngIf", category_r9.expanded);
242
243
  } }
243
244
  function APIKeyCreateDialogComponent_div_11_div_9_Template(rf, ctx) { if (rf & 1) {
244
- i0.ɵɵelementStart(0, "div", 55);
245
- i0.ɵɵtemplate(1, APIKeyCreateDialogComponent_div_11_div_9_div_1_Template, 15, 12, "div", 56);
245
+ i0.ɵɵelementStart(0, "div", 56);
246
+ i0.ɵɵtemplate(1, APIKeyCreateDialogComponent_div_11_div_9_div_1_Template, 15, 12, "div", 57);
246
247
  i0.ɵɵelementEnd();
247
248
  } if (rf & 2) {
248
249
  const ctx_r1 = i0.ɵɵnextContext(2);
249
250
  i0.ɵɵadvance();
250
251
  i0.ɵɵproperty("ngForOf", ctx_r1.ScopeCategories);
251
252
  } }
253
+ function APIKeyCreateDialogComponent_div_11_div_17_Template(rf, ctx) { if (rf & 1) {
254
+ i0.ɵɵelementStart(0, "div", 76);
255
+ i0.ɵɵelement(1, "i", 77);
256
+ i0.ɵɵelementStart(2, "div")(3, "strong");
257
+ i0.ɵɵtext(4, "Warning: No permissions selected");
258
+ i0.ɵɵelementEnd();
259
+ i0.ɵɵelementStart(5, "p");
260
+ i0.ɵɵtext(6, "API keys without any assigned scopes will have ");
261
+ i0.ɵɵelementStart(7, "strong");
262
+ i0.ɵɵtext(8, "no permissions");
263
+ i0.ɵɵelementEnd();
264
+ i0.ɵɵtext(9, " and cannot perform any operations. This key will be rejected by all API endpoints until scopes are assigned.");
265
+ i0.ɵɵelementEnd()()();
266
+ } }
252
267
  function APIKeyCreateDialogComponent_div_11_Template(rf, ctx) { if (rf & 1) {
253
268
  i0.ɵɵelementStart(0, "div", 44)(1, "div", 45)(2, "div", 46)(3, "h4");
254
269
  i0.ɵɵtext(4, "Select Permission Scopes");
@@ -267,7 +282,9 @@ function APIKeyCreateDialogComponent_div_11_Template(rf, ctx) { if (rf & 1) {
267
282
  i0.ɵɵtext(15, "entities:*");
268
283
  i0.ɵɵelementEnd();
269
284
  i0.ɵɵtext(16, " for broad access within a category");
270
- i0.ɵɵelementEnd()()();
285
+ i0.ɵɵelementEnd()();
286
+ i0.ɵɵtemplate(17, APIKeyCreateDialogComponent_div_11_div_17_Template, 10, 0, "div", 52);
287
+ i0.ɵɵelementEnd();
271
288
  } if (rf & 2) {
272
289
  const ctx_r1 = i0.ɵɵnextContext();
273
290
  i0.ɵɵadvance(7);
@@ -276,12 +293,14 @@ function APIKeyCreateDialogComponent_div_11_Template(rf, ctx) { if (rf & 1) {
276
293
  i0.ɵɵproperty("ngIf", ctx_r1.IsLoadingScopes);
277
294
  i0.ɵɵadvance();
278
295
  i0.ɵɵproperty("ngIf", !ctx_r1.IsLoadingScopes);
296
+ i0.ɵɵadvance(8);
297
+ i0.ɵɵproperty("ngIf", !ctx_r1.IsLoadingScopes && ctx_r1.getSelectedScopeCount() === 0);
279
298
  } }
280
299
  function APIKeyCreateDialogComponent_div_12_div_23_Template(rf, ctx) { if (rf & 1) {
281
- i0.ɵɵelementStart(0, "div", 85)(1, "span", 86);
300
+ i0.ɵɵelementStart(0, "div", 87)(1, "span", 88);
282
301
  i0.ɵɵtext(2, "Description:");
283
302
  i0.ɵɵelementEnd();
284
- i0.ɵɵelementStart(3, "span", 87);
303
+ i0.ɵɵelementStart(3, "span", 89);
285
304
  i0.ɵɵtext(4);
286
305
  i0.ɵɵelementEnd()();
287
306
  } if (rf & 2) {
@@ -291,48 +310,48 @@ function APIKeyCreateDialogComponent_div_12_div_23_Template(rf, ctx) { if (rf &
291
310
  } }
292
311
  function APIKeyCreateDialogComponent_div_12_Template(rf, ctx) { if (rf & 1) {
293
312
  const _r12 = i0.ɵɵgetCurrentView();
294
- i0.ɵɵelementStart(0, "div", 75)(1, "div", 76);
295
- i0.ɵɵelement(2, "i", 77);
313
+ i0.ɵɵelementStart(0, "div", 78)(1, "div", 79);
314
+ i0.ɵɵelement(2, "i", 80);
296
315
  i0.ɵɵelementEnd();
297
- i0.ɵɵelementStart(3, "h3", 78);
316
+ i0.ɵɵelementStart(3, "h3", 81);
298
317
  i0.ɵɵtext(4, "API Key Created Successfully!");
299
318
  i0.ɵɵelementEnd();
300
- i0.ɵɵelementStart(5, "div", 79)(6, "div", 80);
301
- i0.ɵɵelement(7, "i", 81);
319
+ i0.ɵɵelementStart(5, "div", 82)(6, "div", 83);
320
+ i0.ɵɵelement(7, "i", 77);
302
321
  i0.ɵɵelementStart(8, "span");
303
322
  i0.ɵɵtext(9, "Copy this key now. It won't be shown again!");
304
323
  i0.ɵɵelementEnd()();
305
- i0.ɵɵelementStart(10, "div", 82)(11, "code");
324
+ i0.ɵɵelementStart(10, "div", 84)(11, "code");
306
325
  i0.ɵɵtext(12);
307
326
  i0.ɵɵelementEnd();
308
- i0.ɵɵelementStart(13, "button", 83);
327
+ i0.ɵɵelementStart(13, "button", 85);
309
328
  i0.ɵɵlistener("click", function APIKeyCreateDialogComponent_div_12_Template_button_click_13_listener() { i0.ɵɵrestoreView(_r12); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.copyKey()); });
310
- i0.ɵɵelement(14, "i", 65);
329
+ i0.ɵɵelement(14, "i", 66);
311
330
  i0.ɵɵelementStart(15, "span");
312
331
  i0.ɵɵtext(16);
313
332
  i0.ɵɵelementEnd()()()();
314
- i0.ɵɵelementStart(17, "div", 84)(18, "div", 85)(19, "span", 86);
333
+ i0.ɵɵelementStart(17, "div", 86)(18, "div", 87)(19, "span", 88);
315
334
  i0.ɵɵtext(20, "Label:");
316
335
  i0.ɵɵelementEnd();
317
- i0.ɵɵelementStart(21, "span", 87);
336
+ i0.ɵɵelementStart(21, "span", 89);
318
337
  i0.ɵɵtext(22);
319
338
  i0.ɵɵelementEnd()();
320
- i0.ɵɵtemplate(23, APIKeyCreateDialogComponent_div_12_div_23_Template, 5, 1, "div", 88);
321
- i0.ɵɵelementStart(24, "div", 85)(25, "span", 86);
339
+ i0.ɵɵtemplate(23, APIKeyCreateDialogComponent_div_12_div_23_Template, 5, 1, "div", 90);
340
+ i0.ɵɵelementStart(24, "div", 87)(25, "span", 88);
322
341
  i0.ɵɵtext(26, "Expires:");
323
342
  i0.ɵɵelementEnd();
324
- i0.ɵɵelementStart(27, "span", 87);
343
+ i0.ɵɵelementStart(27, "span", 89);
325
344
  i0.ɵɵtext(28);
326
345
  i0.ɵɵpipe(29, "date");
327
346
  i0.ɵɵelementEnd()();
328
- i0.ɵɵelementStart(30, "div", 85)(31, "span", 86);
347
+ i0.ɵɵelementStart(30, "div", 87)(31, "span", 88);
329
348
  i0.ɵɵtext(32, "Scopes:");
330
349
  i0.ɵɵelementEnd();
331
- i0.ɵɵelementStart(33, "span", 87);
350
+ i0.ɵɵelementStart(33, "span", 89);
332
351
  i0.ɵɵtext(34);
333
352
  i0.ɵɵelementEnd()()();
334
- i0.ɵɵelementStart(35, "div", 89);
335
- i0.ɵɵelement(36, "i", 90);
353
+ i0.ɵɵelementStart(35, "div", 91);
354
+ i0.ɵɵelement(36, "i", 92);
336
355
  i0.ɵɵelementStart(37, "div")(38, "strong");
337
356
  i0.ɵɵtext(39, "Security Note:");
338
357
  i0.ɵɵelementEnd();
@@ -360,12 +379,12 @@ function APIKeyCreateDialogComponent_div_12_Template(rf, ctx) { if (rf & 1) {
360
379
  function APIKeyCreateDialogComponent_ng_container_14_Template(rf, ctx) { if (rf & 1) {
361
380
  const _r13 = i0.ɵɵgetCurrentView();
362
381
  i0.ɵɵelementContainerStart(0);
363
- i0.ɵɵelementStart(1, "button", 91);
382
+ i0.ɵɵelementStart(1, "button", 93);
364
383
  i0.ɵɵlistener("click", function APIKeyCreateDialogComponent_ng_container_14_Template_button_click_1_listener() { i0.ɵɵrestoreView(_r13); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.goToScopes()); });
365
384
  i0.ɵɵtext(2, " Next: Permissions ");
366
- i0.ɵɵelement(3, "i", 92);
385
+ i0.ɵɵelement(3, "i", 94);
367
386
  i0.ɵɵelementEnd();
368
- i0.ɵɵelementStart(4, "button", 93);
387
+ i0.ɵɵelementStart(4, "button", 95);
369
388
  i0.ɵɵlistener("click", function APIKeyCreateDialogComponent_ng_container_14_Template_button_click_4_listener() { i0.ɵɵrestoreView(_r13); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.close()); });
370
389
  i0.ɵɵtext(5, "Cancel");
371
390
  i0.ɵɵelementEnd();
@@ -375,7 +394,7 @@ function APIKeyCreateDialogComponent_ng_container_14_Template(rf, ctx) { if (rf
375
394
  i0.ɵɵproperty("themeColor", "primary");
376
395
  } }
377
396
  function APIKeyCreateDialogComponent_ng_container_15_mj_loading_2_Template(rf, ctx) { if (rf & 1) {
378
- i0.ɵɵelement(0, "mj-loading", 97);
397
+ i0.ɵɵelement(0, "mj-loading", 99);
379
398
  } if (rf & 2) {
380
399
  i0.ɵɵproperty("showText", false);
381
400
  } }
@@ -388,13 +407,13 @@ function APIKeyCreateDialogComponent_ng_container_15_span_3_Template(rf, ctx) {
388
407
  function APIKeyCreateDialogComponent_ng_container_15_Template(rf, ctx) { if (rf & 1) {
389
408
  const _r14 = i0.ɵɵgetCurrentView();
390
409
  i0.ɵɵelementContainerStart(0);
391
- i0.ɵɵelementStart(1, "button", 94);
410
+ i0.ɵɵelementStart(1, "button", 96);
392
411
  i0.ɵɵlistener("click", function APIKeyCreateDialogComponent_ng_container_15_Template_button_click_1_listener() { i0.ɵɵrestoreView(_r14); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.createKey()); });
393
- i0.ɵɵtemplate(2, APIKeyCreateDialogComponent_ng_container_15_mj_loading_2_Template, 1, 1, "mj-loading", 95)(3, APIKeyCreateDialogComponent_ng_container_15_span_3_Template, 3, 0, "span", 12);
412
+ i0.ɵɵtemplate(2, APIKeyCreateDialogComponent_ng_container_15_mj_loading_2_Template, 1, 1, "mj-loading", 97)(3, APIKeyCreateDialogComponent_ng_container_15_span_3_Template, 3, 0, "span", 12);
394
413
  i0.ɵɵelementEnd();
395
- i0.ɵɵelementStart(4, "button", 93);
414
+ i0.ɵɵelementStart(4, "button", 95);
396
415
  i0.ɵɵlistener("click", function APIKeyCreateDialogComponent_ng_container_15_Template_button_click_4_listener() { i0.ɵɵrestoreView(_r14); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.goBack()); });
397
- i0.ɵɵelement(5, "i", 96);
416
+ i0.ɵɵelement(5, "i", 98);
398
417
  i0.ɵɵtext(6, " Back ");
399
418
  i0.ɵɵelementEnd();
400
419
  i0.ɵɵelementContainerEnd();
@@ -410,9 +429,9 @@ function APIKeyCreateDialogComponent_ng_container_15_Template(rf, ctx) { if (rf
410
429
  function APIKeyCreateDialogComponent_ng_container_16_Template(rf, ctx) { if (rf & 1) {
411
430
  const _r15 = i0.ɵɵgetCurrentView();
412
431
  i0.ɵɵelementContainerStart(0);
413
- i0.ɵɵelementStart(1, "button", 91);
432
+ i0.ɵɵelementStart(1, "button", 93);
414
433
  i0.ɵɵlistener("click", function APIKeyCreateDialogComponent_ng_container_16_Template_button_click_1_listener() { i0.ɵɵrestoreView(_r15); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.close()); });
415
- i0.ɵɵelement(2, "i", 98);
434
+ i0.ɵɵelement(2, "i", 100);
416
435
  i0.ɵɵtext(3, " Done ");
417
436
  i0.ɵɵelementEnd();
418
437
  i0.ɵɵelementContainerEnd();
@@ -455,19 +474,13 @@ export class APIKeyCreateDialogComponent {
455
474
  RawApiKey = '';
456
475
  KeyCopied = false;
457
476
  Error = '';
458
- // Category icons and colors
459
- categoryConfig = {
460
- 'Entities': { icon: 'fa-solid fa-database', color: '#6366f1' },
461
- 'Agents': { icon: 'fa-solid fa-robot', color: '#10b981' },
462
- 'Admin': { icon: 'fa-solid fa-shield-halved', color: '#f59e0b' },
463
- 'Actions': { icon: 'fa-solid fa-bolt', color: '#8b5cf6' },
464
- 'Queries': { icon: 'fa-solid fa-magnifying-glass', color: '#3b82f6' },
465
- 'Reports': { icon: 'fa-solid fa-chart-bar', color: '#ef4444' },
466
- 'Communication': { icon: 'fa-solid fa-envelope', color: '#ec4899' },
467
- 'Other': { icon: 'fa-solid fa-ellipsis', color: '#6b7280' }
477
+ // Default UI config for categories without explicit configuration
478
+ defaultUIConfig = {
479
+ icon: 'fa-solid fa-ellipsis',
480
+ color: '#6b7280'
468
481
  };
469
- async ngOnInit() {
470
- await this.loadScopes();
482
+ ngOnInit() {
483
+ this.loadScopes();
471
484
  }
472
485
  /**
473
486
  * Handle escape key to close dialog
@@ -478,41 +491,53 @@ export class APIKeyCreateDialogComponent {
478
491
  }
479
492
  }
480
493
  /**
481
- * Load available scopes
494
+ * Load available scopes from cached data.
495
+ * Uses UIConfig from root scopes for category icons/colors.
482
496
  */
483
- async loadScopes() {
497
+ loadScopes() {
484
498
  this.IsLoadingScopes = true;
485
499
  try {
486
- const rv = new RunView();
487
- const result = await rv.RunView({
488
- EntityName: 'MJ: API Scopes',
489
- OrderBy: 'Category, Name',
490
- ResultType: 'entity_object'
491
- });
492
- if (result.Success) {
493
- const categoryMap = new Map();
494
- for (const scope of result.Results) {
495
- const category = scope.Category || 'Other';
496
- if (!categoryMap.has(category)) {
497
- categoryMap.set(category, []);
498
- }
499
- categoryMap.get(category).push({
500
- scope,
501
- selected: false
500
+ const base = APIKeysEngineBase.Instance;
501
+ const scopes = base.Scopes;
502
+ // Build a map of category -> root scope UIConfig
503
+ // Root scopes (ParentID is null) define the UI appearance for their category
504
+ const categoryUIConfigs = new Map();
505
+ for (const scope of scopes) {
506
+ if (!scope.ParentID) {
507
+ // This is a root scope - use its UIConfig for the category
508
+ const uiConfig = parseAPIScopeUIConfig(scope);
509
+ categoryUIConfigs.set(scope.Category, {
510
+ icon: uiConfig.icon || this.defaultUIConfig.icon,
511
+ color: uiConfig.color || this.defaultUIConfig.color
502
512
  });
503
513
  }
504
- this.ScopeCategories = Array.from(categoryMap.entries()).map(([name, scopes]) => {
505
- const config = this.categoryConfig[name] || this.categoryConfig['Other'];
506
- return {
507
- name,
508
- icon: config.icon,
509
- color: config.color,
510
- scopes,
511
- expanded: false,
512
- allSelected: false
513
- };
514
+ }
515
+ // Group scopes by category
516
+ const categoryMap = new Map();
517
+ for (const scope of scopes) {
518
+ const category = scope.Category || 'Other';
519
+ if (!categoryMap.has(category)) {
520
+ categoryMap.set(category, []);
521
+ }
522
+ categoryMap.get(category).push({
523
+ scope,
524
+ selected: false
514
525
  });
515
526
  }
527
+ // Build categories with UI config from root scopes
528
+ this.ScopeCategories = Array.from(categoryMap.entries())
529
+ .sort(([a], [b]) => a.localeCompare(b))
530
+ .map(([name, scopeItems]) => {
531
+ const config = categoryUIConfigs.get(name) || this.defaultUIConfig;
532
+ return {
533
+ name,
534
+ icon: config.icon,
535
+ color: config.color,
536
+ scopes: scopeItems.sort((a, b) => a.scope.Name.localeCompare(b.scope.Name)),
537
+ expanded: false,
538
+ allSelected: false
539
+ };
540
+ });
516
541
  }
517
542
  catch (error) {
518
543
  console.error('Error loading scopes:', error);
@@ -686,7 +711,7 @@ export class APIKeyCreateDialogComponent {
686
711
  static ɵfac = function APIKeyCreateDialogComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || APIKeyCreateDialogComponent)(); };
687
712
  static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: APIKeyCreateDialogComponent, selectors: [["mj-api-key-create-dialog"]], hostBindings: function APIKeyCreateDialogComponent_HostBindings(rf, ctx) { if (rf & 1) {
688
713
  i0.ɵɵlistener("keydown.escape", function APIKeyCreateDialogComponent_keydown_escape_HostBindingHandler() { return ctx.onEscapeKey(); }, false, i0.ɵɵresolveDocument);
689
- } }, inputs: { Visible: "Visible" }, outputs: { VisibleChange: "VisibleChange", Created: "Created", Closed: "Closed" }, decls: 17, vars: 11, consts: [["class", "slideout-backdrop", 3, "click", 4, "ngIf"], [1, "slideout-panel"], [1, "slideout-header"], [1, "slideout-title"], [1, "fa-solid", "fa-key"], ["class", "slideout-close", "title", "Close (Esc)", 3, "click", 4, "ngIf"], ["class", "step-indicator", 4, "ngIf"], [1, "slideout-content"], ["class", "step-panel", 4, "ngIf"], ["class", "step-panel scopes-step", 4, "ngIf"], ["class", "step-panel success-step", 4, "ngIf"], [1, "slideout-footer"], [4, "ngIf"], [1, "slideout-backdrop", 3, "click"], ["title", "Close (Esc)", 1, "slideout-close", 3, "click"], [1, "fa-solid", "fa-times"], [1, "step-indicator"], [1, "step"], [1, "step-number"], [1, "step-label"], [1, "step-connector"], [1, "step-panel"], [1, "form-section"], [1, "form-label", "required"], ["kendoTextBox", "", "placeholder", "e.g., ElevenLabs Integration, CI/CD Pipeline", 1, "form-input", 3, "ngModelChange", "ngModel"], [1, "form-hint"], [1, "form-label"], ["kendoTextArea", "", "placeholder", "Optional notes about how this key will be used...", 1, "form-textarea", 3, "ngModelChange", "ngModel", "rows"], [1, "expiration-options"], [1, "checkbox-label"], ["type", "checkbox", "kendoCheckBox", "", 3, "ngModelChange", "change", "ngModel"], ["class", "preset-buttons", 4, "ngIf"], ["class", "custom-date", 4, "ngIf"], ["class", "expiration-preview", 4, "ngIf"], ["class", "error-message", 4, "ngIf"], [1, "preset-buttons"], ["class", "preset-btn", 3, "active", "click", 4, "ngFor", "ngForOf"], [1, "preset-btn", 3, "click"], [1, "custom-date"], ["format", "MMM d, yyyy", "placeholder", "Select expiration date", 3, "ngModelChange", "ngModel", "min"], [1, "expiration-preview"], [1, "fa-solid", "fa-calendar-check"], [1, "error-message"], [1, "fa-solid", "fa-circle-exclamation"], [1, "step-panel", "scopes-step"], [1, "scopes-header"], [1, "scopes-info"], ["class", "scopes-count", 4, "ngIf"], ["text", "Loading scopes...", 4, "ngIf"], ["class", "scope-categories", 4, "ngIf"], [1, "scope-tip"], [1, "fa-solid", "fa-lightbulb"], [1, "scopes-count"], [1, "count"], ["text", "Loading scopes..."], [1, "scope-categories"], ["class", "scope-category", 4, "ngFor", "ngForOf"], [1, "scope-category"], [1, "category-header", 3, "click"], [1, "category-left"], [1, "category-name"], [1, "category-badge"], [1, "category-right"], [1, "select-all-label", 3, "click"], ["type", "checkbox", "kendoCheckBox", "", 3, "change", "checked"], [1, "fa-solid"], ["class", "category-scopes", 4, "ngIf"], [1, "category-scopes"], ["class", "scope-item", 4, "ngFor", "ngForOf"], [1, "scope-item"], [1, "scope-label"], [1, "scope-info"], [1, "scope-name"], ["class", "scope-desc", 4, "ngIf"], [1, "scope-desc"], [1, "step-panel", "success-step"], [1, "success-icon"], [1, "fa-solid", "fa-check-circle"], [1, "success-title"], [1, "key-display"], [1, "key-warning"], [1, "fa-solid", "fa-triangle-exclamation"], [1, "key-value"], [1, "copy-btn", 3, "click"], [1, "key-details"], [1, "detail-row"], [1, "detail-label"], [1, "detail-value"], ["class", "detail-row", 4, "ngIf"], [1, "security-note"], [1, "fa-solid", "fa-shield-check"], ["kendoButton", "", 3, "click", "themeColor"], [1, "fa-solid", "fa-arrow-right"], ["kendoButton", "", 3, "click"], ["kendoButton", "", 3, "click", "themeColor", "disabled"], ["size", "small", 3, "showText", 4, "ngIf"], [1, "fa-solid", "fa-arrow-left"], ["size", "small", 3, "showText"], [1, "fa-solid", "fa-check"]], template: function APIKeyCreateDialogComponent_Template(rf, ctx) { if (rf & 1) {
714
+ } }, inputs: { Visible: "Visible" }, outputs: { VisibleChange: "VisibleChange", Created: "Created", Closed: "Closed" }, decls: 17, vars: 11, consts: [["class", "slideout-backdrop", 3, "click", 4, "ngIf"], [1, "slideout-panel"], [1, "slideout-header"], [1, "slideout-title"], [1, "fa-solid", "fa-key"], ["class", "slideout-close", "title", "Close (Esc)", 3, "click", 4, "ngIf"], ["class", "step-indicator", 4, "ngIf"], [1, "slideout-content"], ["class", "step-panel", 4, "ngIf"], ["class", "step-panel scopes-step", 4, "ngIf"], ["class", "step-panel success-step", 4, "ngIf"], [1, "slideout-footer"], [4, "ngIf"], [1, "slideout-backdrop", 3, "click"], ["title", "Close (Esc)", 1, "slideout-close", 3, "click"], [1, "fa-solid", "fa-times"], [1, "step-indicator"], [1, "step"], [1, "step-number"], [1, "step-label"], [1, "step-connector"], [1, "step-panel"], [1, "form-section"], [1, "form-label", "required"], ["kendoTextBox", "", "placeholder", "e.g., ElevenLabs Integration, CI/CD Pipeline", 1, "form-input", 3, "ngModelChange", "ngModel"], [1, "form-hint"], [1, "form-label"], ["kendoTextArea", "", "placeholder", "Optional notes about how this key will be used...", 1, "form-textarea", 3, "ngModelChange", "ngModel", "rows"], [1, "expiration-options"], [1, "checkbox-label"], ["type", "checkbox", "kendoCheckBox", "", 3, "ngModelChange", "change", "ngModel"], ["class", "preset-buttons", 4, "ngIf"], ["class", "custom-date", 4, "ngIf"], ["class", "expiration-preview", 4, "ngIf"], ["class", "error-message", 4, "ngIf"], [1, "preset-buttons"], ["class", "preset-btn", 3, "active", "click", 4, "ngFor", "ngForOf"], [1, "preset-btn", 3, "click"], [1, "custom-date"], ["format", "MMM d, yyyy", "placeholder", "Select expiration date", 3, "ngModelChange", "ngModel", "min"], [1, "expiration-preview"], [1, "fa-solid", "fa-calendar-check"], [1, "error-message"], [1, "fa-solid", "fa-circle-exclamation"], [1, "step-panel", "scopes-step"], [1, "scopes-header"], [1, "scopes-info"], ["class", "scopes-count", 4, "ngIf"], ["text", "Loading scopes...", 4, "ngIf"], ["class", "scope-categories", 4, "ngIf"], [1, "scope-tip"], [1, "fa-solid", "fa-lightbulb"], ["class", "no-scopes-warning", 4, "ngIf"], [1, "scopes-count"], [1, "count"], ["text", "Loading scopes..."], [1, "scope-categories"], ["class", "scope-category", 4, "ngFor", "ngForOf"], [1, "scope-category"], [1, "category-header", 3, "click"], [1, "category-left"], [1, "category-name"], [1, "category-badge"], [1, "category-right"], [1, "select-all-label", 3, "click"], ["type", "checkbox", "kendoCheckBox", "", 3, "change", "checked"], [1, "fa-solid"], ["class", "category-scopes", 4, "ngIf"], [1, "category-scopes"], ["class", "scope-item", 4, "ngFor", "ngForOf"], [1, "scope-item"], [1, "scope-label"], [1, "scope-info"], [1, "scope-name"], ["class", "scope-desc", 4, "ngIf"], [1, "scope-desc"], [1, "no-scopes-warning"], [1, "fa-solid", "fa-triangle-exclamation"], [1, "step-panel", "success-step"], [1, "success-icon"], [1, "fa-solid", "fa-check-circle"], [1, "success-title"], [1, "key-display"], [1, "key-warning"], [1, "key-value"], [1, "copy-btn", 3, "click"], [1, "key-details"], [1, "detail-row"], [1, "detail-label"], [1, "detail-value"], ["class", "detail-row", 4, "ngIf"], [1, "security-note"], [1, "fa-solid", "fa-shield-check"], ["kendoButton", "", 3, "click", "themeColor"], [1, "fa-solid", "fa-arrow-right"], ["kendoButton", "", 3, "click"], ["kendoButton", "", 3, "click", "themeColor", "disabled"], ["size", "small", 3, "showText", 4, "ngIf"], [1, "fa-solid", "fa-arrow-left"], ["size", "small", 3, "showText"], [1, "fa-solid", "fa-check"]], template: function APIKeyCreateDialogComponent_Template(rf, ctx) { if (rf & 1) {
690
715
  i0.ɵɵtemplate(0, APIKeyCreateDialogComponent_div_0_Template, 1, 0, "div", 0);
691
716
  i0.ɵɵelementStart(1, "div", 1)(2, "div", 2)(3, "div", 3);
692
717
  i0.ɵɵelement(4, "i", 4);
@@ -697,7 +722,7 @@ export class APIKeyCreateDialogComponent {
697
722
  i0.ɵɵelementEnd();
698
723
  i0.ɵɵtemplate(8, APIKeyCreateDialogComponent_div_8_Template, 12, 8, "div", 6);
699
724
  i0.ɵɵelementStart(9, "div", 7);
700
- i0.ɵɵtemplate(10, APIKeyCreateDialogComponent_div_10_Template, 23, 8, "div", 8)(11, APIKeyCreateDialogComponent_div_11_Template, 17, 3, "div", 9)(12, APIKeyCreateDialogComponent_div_12_Template, 41, 15, "div", 10);
725
+ i0.ɵɵtemplate(10, APIKeyCreateDialogComponent_div_10_Template, 23, 8, "div", 8)(11, APIKeyCreateDialogComponent_div_11_Template, 18, 4, "div", 9)(12, APIKeyCreateDialogComponent_div_12_Template, 41, 15, "div", 10);
701
726
  i0.ɵɵelementEnd();
702
727
  i0.ɵɵelementStart(13, "div", 11);
703
728
  i0.ɵɵtemplate(14, APIKeyCreateDialogComponent_ng_container_14_Template, 6, 1, "ng-container", 12)(15, APIKeyCreateDialogComponent_ng_container_15_Template, 7, 4, "ng-container", 12)(16, APIKeyCreateDialogComponent_ng_container_16_Template, 4, 1, "ng-container", 12);
@@ -722,11 +747,11 @@ export class APIKeyCreateDialogComponent {
722
747
  i0.ɵɵproperty("ngIf", ctx.Step === "scopes");
723
748
  i0.ɵɵadvance();
724
749
  i0.ɵɵproperty("ngIf", ctx.Step === "success");
725
- } }, dependencies: [i1.NgForOf, i1.NgIf, i2.DefaultValueAccessor, i2.CheckboxControlValueAccessor, i2.NgControlStatus, i2.NgModel, i3.TextAreaDirective, i3.TextBoxDirective, i3.CheckBoxDirective, i4.DatePickerComponent, i5.ButtonComponent, i6.LoadingComponent, i1.DatePipe], styles: ["\n\n\n\n\n\n\n.slideout-backdrop[_ngcontent-%COMP%] {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(0, 0, 0, 0.3);\n z-index: 100;\n animation: _ngcontent-%COMP%_fadeIn 0.2s ease;\n}\n\n@keyframes _ngcontent-%COMP%_fadeIn {\n from { opacity: 0; }\n to { opacity: 1; }\n}\n\n\n\n.slideout-panel[_ngcontent-%COMP%] {\n position: absolute;\n top: 0;\n right: 0;\n width: 520px;\n height: 100%;\n max-height: 100%;\n background: var(--card-background, #ffffff);\n box-shadow: -8px 0 32px rgba(0, 0, 0, 0.15);\n z-index: 101;\n display: flex;\n flex-direction: column;\n transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n transform: translateX(100%);\n overflow: hidden;\n}\n\n.slideout-panel.open[_ngcontent-%COMP%] {\n transform: translateX(0);\n}\n\n\n\n.slideout-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 20px 24px;\n background: linear-gradient(135deg, #fafafa 0%, #f3f4f6 100%);\n border-bottom: 1px solid #e5e7eb;\n flex-shrink: 0;\n}\n\n.slideout-title[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n font-weight: 600;\n font-size: 17px;\n color: #1f2937;\n flex: 1;\n min-width: 0;\n}\n\n.slideout-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #f59e0b;\n font-size: 18px;\n flex-shrink: 0;\n}\n\n.slideout-close[_ngcontent-%COMP%] {\n width: 36px;\n height: 36px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: transparent;\n border: none;\n border-radius: 8px;\n color: #9ca3af;\n cursor: pointer;\n transition: all 0.2s ease;\n flex-shrink: 0;\n}\n\n.slideout-close[_ngcontent-%COMP%]:hover {\n background: rgba(0, 0, 0, 0.05);\n color: #374151;\n}\n\n\n\n.slideout-content[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n}\n\n.step-panel[_ngcontent-%COMP%] {\n padding: 24px;\n}\n\n\n\n.slideout-footer[_ngcontent-%COMP%] {\n display: flex;\n gap: 12px;\n padding: 16px 24px;\n background: linear-gradient(135deg, #f9fafb 0%, #f3f4f6 100%);\n border-top: 1px solid #e5e7eb;\n flex-shrink: 0;\n}\n\n[_nghost-%COMP%] .slideout-footer .k-button {\n min-width: 100px;\n padding: 10px 20px;\n font-weight: 600;\n border-radius: 8px;\n transition: all 0.2s ease;\n}\n\n[_nghost-%COMP%] .slideout-footer .k-button-solid-primary {\n background: linear-gradient(135deg, #f59e0b 0%, #d97706 100%);\n border: none;\n box-shadow: 0 2px 8px rgba(245, 158, 11, 0.3);\n}\n\n[_nghost-%COMP%] .slideout-footer .k-button-solid-primary:hover {\n transform: translateY(-1px);\n box-shadow: 0 4px 12px rgba(245, 158, 11, 0.4);\n}\n\n[_nghost-%COMP%] .slideout-footer .k-button i {\n margin: 0 5px;\n}\n\n\n\n.step-indicator[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 20px 24px;\n background: linear-gradient(135deg, #fef3c7 0%, #fde68a 100%);\n border-bottom: 1px solid #fcd34d;\n}\n\n.step[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 6px;\n}\n\n.step-number[_ngcontent-%COMP%] {\n width: 32px;\n height: 32px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: white;\n border: 2px solid #d1d5db;\n border-radius: 50%;\n font-weight: 600;\n font-size: 14px;\n color: #6b7280;\n transition: all 0.2s ease;\n}\n\n.step.active[_ngcontent-%COMP%] .step-number[_ngcontent-%COMP%] {\n background: linear-gradient(135deg, #f59e0b 0%, #d97706 100%);\n border-color: #f59e0b;\n color: white;\n}\n\n.step.completed[_ngcontent-%COMP%] .step-number[_ngcontent-%COMP%] {\n background: #10b981;\n border-color: #10b981;\n color: white;\n}\n\n.step-label[_ngcontent-%COMP%] {\n font-size: 12px;\n font-weight: 500;\n color: #6b7280;\n}\n\n.step.active[_ngcontent-%COMP%] .step-label[_ngcontent-%COMP%] {\n color: #92400e;\n font-weight: 600;\n}\n\n.step-connector[_ngcontent-%COMP%] {\n width: 80px;\n height: 2px;\n background: #d1d5db;\n margin: 0 16px;\n margin-bottom: 20px;\n transition: background 0.2s ease;\n}\n\n.step-connector.active[_ngcontent-%COMP%] {\n background: linear-gradient(90deg, #10b981, #f59e0b);\n}\n\n\n\n.dialog-content[_ngcontent-%COMP%] {\n padding: 24px;\n max-height: 400px;\n overflow-y: auto;\n}\n\n.scopes-content[_ngcontent-%COMP%] {\n max-height: 450px;\n}\n\n\n\n.form-section[_ngcontent-%COMP%] {\n margin-bottom: 24px;\n}\n\n.form-label[_ngcontent-%COMP%] {\n display: block;\n font-weight: 600;\n font-size: 14px;\n color: #374151;\n margin-bottom: 8px;\n}\n\n.form-label.required[_ngcontent-%COMP%]::after {\n content: ' *';\n color: #ef4444;\n}\n\n.form-input[_ngcontent-%COMP%], \n.form-textarea[_ngcontent-%COMP%] {\n width: 100%;\n}\n\n.form-hint[_ngcontent-%COMP%] {\n font-size: 12px;\n color: #6b7280;\n margin-top: 6px;\n}\n\n\n\n.expiration-options[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 12px;\n}\n\n.checkbox-label[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n cursor: pointer;\n font-size: 14px;\n color: #374151;\n}\n\n.preset-buttons[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n flex-wrap: wrap;\n}\n\n.preset-btn[_ngcontent-%COMP%] {\n padding: 8px 16px;\n background: white;\n border: 1px solid #e5e7eb;\n border-radius: 6px;\n font-size: 13px;\n font-weight: 500;\n color: #374151;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.preset-btn[_ngcontent-%COMP%]:hover {\n border-color: #f59e0b;\n background: #fffbeb;\n}\n\n.preset-btn.active[_ngcontent-%COMP%] {\n background: linear-gradient(135deg, #f59e0b 0%, #d97706 100%);\n border-color: #f59e0b;\n color: white;\n}\n\n.custom-date[_ngcontent-%COMP%] {\n margin-top: 4px;\n}\n\n.expiration-preview[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 14px;\n background: #ecfdf5;\n border-radius: 8px;\n font-size: 13px;\n color: #059669;\n}\n\n.expiration-preview[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #10b981;\n}\n\n\n\n.error-message[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px 16px;\n background: #fef2f2;\n border: 1px solid #fecaca;\n border-radius: 8px;\n color: #dc2626;\n font-size: 14px;\n}\n\n\n\n.scopes-header[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n margin-bottom: 20px;\n}\n\n.scopes-info[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] {\n margin: 0 0 4px 0;\n font-size: 16px;\n font-weight: 600;\n color: #1f2937;\n}\n\n.scopes-info[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 13px;\n color: #6b7280;\n}\n\n.scopes-count[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n background: linear-gradient(135deg, #f59e0b 0%, #d97706 100%);\n border-radius: 20px;\n font-size: 13px;\n font-weight: 500;\n color: white;\n}\n\n.scopes-count[_ngcontent-%COMP%] .count[_ngcontent-%COMP%] {\n font-weight: 700;\n}\n\n\n\n.scope-categories[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.scope-category[_ngcontent-%COMP%] {\n background: #f9fafb;\n border: 1px solid #e5e7eb;\n border-radius: 10px;\n overflow: hidden;\n}\n\n.category-header[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 14px 16px;\n cursor: pointer;\n transition: background 0.2s ease;\n}\n\n.category-header[_ngcontent-%COMP%]:hover {\n background: #f3f4f6;\n}\n\n.category-left[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n}\n\n.category-left[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 16px;\n}\n\n.category-name[_ngcontent-%COMP%] {\n font-weight: 600;\n font-size: 14px;\n color: #1f2937;\n}\n\n.category-badge[_ngcontent-%COMP%] {\n padding: 2px 8px;\n background: #e5e7eb;\n border-radius: 10px;\n font-size: 11px;\n font-weight: 500;\n color: #6b7280;\n}\n\n.category-right[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n}\n\n.select-all-label[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 12px;\n color: #6b7280;\n cursor: pointer;\n}\n\n.category-right[_ngcontent-%COMP%] > i[_ngcontent-%COMP%] {\n color: #9ca3af;\n font-size: 12px;\n}\n\n.category-scopes[_ngcontent-%COMP%] {\n padding: 8px 16px 16px;\n border-top: 1px solid #e5e7eb;\n background: white;\n}\n\n.scope-item[_ngcontent-%COMP%] {\n padding: 10px 0;\n border-bottom: 1px solid #f3f4f6;\n}\n\n.scope-item[_ngcontent-%COMP%]:last-child {\n border-bottom: none;\n}\n\n.scope-label[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-start;\n gap: 10px;\n cursor: pointer;\n}\n\n.scope-info[_ngcontent-%COMP%] {\n flex: 1;\n}\n\n.scope-name[_ngcontent-%COMP%] {\n display: block;\n font-weight: 500;\n font-size: 13px;\n color: #374151;\n font-family: monospace;\n}\n\n.scope-desc[_ngcontent-%COMP%] {\n display: block;\n font-size: 12px;\n color: #6b7280;\n margin-top: 2px;\n}\n\n.scope-tip[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 12px 16px;\n background: #eff6ff;\n border-radius: 8px;\n margin-top: 16px;\n font-size: 13px;\n color: #1d4ed8;\n}\n\n.scope-tip[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #3b82f6;\n}\n\n.scope-tip[_ngcontent-%COMP%] code[_ngcontent-%COMP%] {\n background: #dbeafe;\n padding: 2px 6px;\n border-radius: 4px;\n font-family: monospace;\n}\n\n\n\n.success-content[_ngcontent-%COMP%] {\n text-align: center;\n}\n\n.success-icon[_ngcontent-%COMP%] {\n margin-bottom: 16px;\n}\n\n.success-icon[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 64px;\n color: #10b981;\n}\n\n.success-title[_ngcontent-%COMP%] {\n margin: 0 0 24px 0;\n font-size: 20px;\n font-weight: 700;\n color: #1f2937;\n}\n\n\n\n.key-display[_ngcontent-%COMP%] {\n background: #1f2937;\n border-radius: 12px;\n padding: 20px;\n margin-bottom: 24px;\n}\n\n.key-warning[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n padding: 10px 16px;\n background: rgba(245, 158, 11, 0.2);\n border-radius: 8px;\n margin-bottom: 16px;\n font-size: 13px;\n font-weight: 500;\n color: #fcd34d;\n}\n\n.key-value[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n background: #374151;\n border-radius: 8px;\n padding: 12px 16px;\n}\n\n.key-value[_ngcontent-%COMP%] code[_ngcontent-%COMP%] {\n flex: 1;\n font-family: 'Fira Code', 'Consolas', monospace;\n font-size: 14px;\n color: #10b981;\n word-break: break-all;\n text-align: left;\n}\n\n.copy-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 8px 16px;\n background: #4b5563;\n border: none;\n border-radius: 6px;\n font-size: 13px;\n font-weight: 500;\n color: white;\n cursor: pointer;\n transition: all 0.2s ease;\n white-space: nowrap;\n}\n\n.copy-btn[_ngcontent-%COMP%]:hover {\n background: #6b7280;\n}\n\n.copy-btn.copied[_ngcontent-%COMP%] {\n background: #10b981;\n}\n\n\n\n.key-details[_ngcontent-%COMP%] {\n text-align: left;\n background: #f9fafb;\n border-radius: 10px;\n padding: 16px 20px;\n margin-bottom: 20px;\n}\n\n.detail-row[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n padding: 8px 0;\n border-bottom: 1px solid #e5e7eb;\n}\n\n.detail-row[_ngcontent-%COMP%]:last-child {\n border-bottom: none;\n}\n\n.detail-label[_ngcontent-%COMP%] {\n font-size: 13px;\n color: #6b7280;\n}\n\n.detail-value[_ngcontent-%COMP%] {\n font-size: 13px;\n font-weight: 500;\n color: #1f2937;\n}\n\n\n\n.security-note[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-start;\n gap: 12px;\n text-align: left;\n padding: 16px;\n background: linear-gradient(135deg, #ecfdf5 0%, #d1fae5 100%);\n border-radius: 10px;\n font-size: 13px;\n color: #065f46;\n}\n\n.security-note[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 20px;\n color: #10b981;\n margin-top: 2px;\n}\n\n.security-note[_ngcontent-%COMP%] strong[_ngcontent-%COMP%] {\n display: block;\n margin-bottom: 4px;\n}\n\n\n\n[_nghost-%COMP%] .form-input .k-input, \n[_nghost-%COMP%] .form-textarea .k-input-inner, \n[_nghost-%COMP%] .k-datepicker .k-input {\n padding: 10px 14px;\n border-radius: 8px;\n font-size: 14px;\n border-color: #e5e7eb;\n transition: all 0.2s ease;\n}\n\n[_nghost-%COMP%] .form-input:focus-within, \n[_nghost-%COMP%] .form-textarea:focus-within, \n[_nghost-%COMP%] .k-datepicker:focus-within {\n box-shadow: 0 0 0 3px rgba(245, 158, 11, 0.1);\n}"] });
750
+ } }, dependencies: [i1.NgForOf, i1.NgIf, i2.DefaultValueAccessor, i2.CheckboxControlValueAccessor, i2.NgControlStatus, i2.NgModel, i3.TextAreaDirective, i3.TextBoxDirective, i3.CheckBoxDirective, i4.DatePickerComponent, i5.ButtonComponent, i6.LoadingComponent, i1.DatePipe], styles: ["\n\n\n\n\n\n\n.slideout-backdrop[_ngcontent-%COMP%] {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(0, 0, 0, 0.3);\n z-index: 100;\n animation: _ngcontent-%COMP%_fadeIn 0.2s ease;\n}\n\n@keyframes _ngcontent-%COMP%_fadeIn {\n from { opacity: 0; }\n to { opacity: 1; }\n}\n\n\n\n.slideout-panel[_ngcontent-%COMP%] {\n position: absolute;\n top: 0;\n right: 0;\n width: 520px;\n height: 100%;\n max-height: 100%;\n background: var(--card-background, #ffffff);\n box-shadow: -8px 0 32px rgba(0, 0, 0, 0.15);\n z-index: 101;\n display: flex;\n flex-direction: column;\n transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n transform: translateX(100%);\n overflow: hidden;\n}\n\n.slideout-panel.open[_ngcontent-%COMP%] {\n transform: translateX(0);\n}\n\n\n\n.slideout-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 20px 24px;\n background: linear-gradient(135deg, #fafafa 0%, #f3f4f6 100%);\n border-bottom: 1px solid #e5e7eb;\n flex-shrink: 0;\n}\n\n.slideout-title[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n font-weight: 600;\n font-size: 17px;\n color: #1f2937;\n flex: 1;\n min-width: 0;\n}\n\n.slideout-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #f59e0b;\n font-size: 18px;\n flex-shrink: 0;\n}\n\n.slideout-close[_ngcontent-%COMP%] {\n width: 36px;\n height: 36px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: transparent;\n border: none;\n border-radius: 8px;\n color: #9ca3af;\n cursor: pointer;\n transition: all 0.2s ease;\n flex-shrink: 0;\n}\n\n.slideout-close[_ngcontent-%COMP%]:hover {\n background: rgba(0, 0, 0, 0.05);\n color: #374151;\n}\n\n\n\n.slideout-content[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n}\n\n.step-panel[_ngcontent-%COMP%] {\n padding: 24px;\n}\n\n\n\n.slideout-footer[_ngcontent-%COMP%] {\n display: flex;\n gap: 12px;\n padding: 16px 24px;\n background: linear-gradient(135deg, #f9fafb 0%, #f3f4f6 100%);\n border-top: 1px solid #e5e7eb;\n flex-shrink: 0;\n}\n\n[_nghost-%COMP%] .slideout-footer .k-button {\n min-width: 100px;\n padding: 10px 20px;\n font-weight: 600;\n border-radius: 8px;\n transition: all 0.2s ease;\n}\n\n[_nghost-%COMP%] .slideout-footer .k-button-solid-primary {\n background: linear-gradient(135deg, #f59e0b 0%, #d97706 100%);\n border: none;\n box-shadow: 0 2px 8px rgba(245, 158, 11, 0.3);\n}\n\n[_nghost-%COMP%] .slideout-footer .k-button-solid-primary:hover {\n transform: translateY(-1px);\n box-shadow: 0 4px 12px rgba(245, 158, 11, 0.4);\n}\n\n[_nghost-%COMP%] .slideout-footer .k-button i {\n margin: 0 5px;\n}\n\n\n\n.step-indicator[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 20px 24px;\n background: linear-gradient(135deg, #fef3c7 0%, #fde68a 100%);\n border-bottom: 1px solid #fcd34d;\n}\n\n.step[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 6px;\n}\n\n.step-number[_ngcontent-%COMP%] {\n width: 32px;\n height: 32px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: white;\n border: 2px solid #d1d5db;\n border-radius: 50%;\n font-weight: 600;\n font-size: 14px;\n color: #6b7280;\n transition: all 0.2s ease;\n}\n\n.step.active[_ngcontent-%COMP%] .step-number[_ngcontent-%COMP%] {\n background: linear-gradient(135deg, #f59e0b 0%, #d97706 100%);\n border-color: #f59e0b;\n color: white;\n}\n\n.step.completed[_ngcontent-%COMP%] .step-number[_ngcontent-%COMP%] {\n background: #10b981;\n border-color: #10b981;\n color: white;\n}\n\n.step-label[_ngcontent-%COMP%] {\n font-size: 12px;\n font-weight: 500;\n color: #6b7280;\n}\n\n.step.active[_ngcontent-%COMP%] .step-label[_ngcontent-%COMP%] {\n color: #92400e;\n font-weight: 600;\n}\n\n.step-connector[_ngcontent-%COMP%] {\n width: 80px;\n height: 2px;\n background: #d1d5db;\n margin: 0 16px;\n margin-bottom: 20px;\n transition: background 0.2s ease;\n}\n\n.step-connector.active[_ngcontent-%COMP%] {\n background: linear-gradient(90deg, #10b981, #f59e0b);\n}\n\n\n\n.dialog-content[_ngcontent-%COMP%] {\n padding: 24px;\n max-height: 400px;\n overflow-y: auto;\n}\n\n.scopes-content[_ngcontent-%COMP%] {\n max-height: 450px;\n}\n\n\n\n.form-section[_ngcontent-%COMP%] {\n margin-bottom: 24px;\n}\n\n.form-label[_ngcontent-%COMP%] {\n display: block;\n font-weight: 600;\n font-size: 14px;\n color: #374151;\n margin-bottom: 8px;\n}\n\n.form-label.required[_ngcontent-%COMP%]::after {\n content: ' *';\n color: #ef4444;\n}\n\n.form-input[_ngcontent-%COMP%], \n.form-textarea[_ngcontent-%COMP%] {\n width: 100%;\n}\n\n.form-hint[_ngcontent-%COMP%] {\n font-size: 12px;\n color: #6b7280;\n margin-top: 6px;\n}\n\n\n\n.expiration-options[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 12px;\n}\n\n.checkbox-label[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n cursor: pointer;\n font-size: 14px;\n color: #374151;\n}\n\n.preset-buttons[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n flex-wrap: wrap;\n}\n\n.preset-btn[_ngcontent-%COMP%] {\n padding: 8px 16px;\n background: white;\n border: 1px solid #e5e7eb;\n border-radius: 6px;\n font-size: 13px;\n font-weight: 500;\n color: #374151;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.preset-btn[_ngcontent-%COMP%]:hover {\n border-color: #f59e0b;\n background: #fffbeb;\n}\n\n.preset-btn.active[_ngcontent-%COMP%] {\n background: linear-gradient(135deg, #f59e0b 0%, #d97706 100%);\n border-color: #f59e0b;\n color: white;\n}\n\n.custom-date[_ngcontent-%COMP%] {\n margin-top: 4px;\n}\n\n.expiration-preview[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 14px;\n background: #ecfdf5;\n border-radius: 8px;\n font-size: 13px;\n color: #059669;\n}\n\n.expiration-preview[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #10b981;\n}\n\n\n\n.error-message[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px 16px;\n background: #fef2f2;\n border: 1px solid #fecaca;\n border-radius: 8px;\n color: #dc2626;\n font-size: 14px;\n}\n\n\n\n.scopes-header[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n margin-bottom: 20px;\n}\n\n.scopes-info[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] {\n margin: 0 0 4px 0;\n font-size: 16px;\n font-weight: 600;\n color: #1f2937;\n}\n\n.scopes-info[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 13px;\n color: #6b7280;\n}\n\n.scopes-count[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n background: linear-gradient(135deg, #f59e0b 0%, #d97706 100%);\n border-radius: 20px;\n font-size: 13px;\n font-weight: 500;\n color: white;\n}\n\n.scopes-count[_ngcontent-%COMP%] .count[_ngcontent-%COMP%] {\n font-weight: 700;\n}\n\n\n\n.scope-categories[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.scope-category[_ngcontent-%COMP%] {\n background: #f9fafb;\n border: 1px solid #e5e7eb;\n border-radius: 10px;\n overflow: hidden;\n}\n\n.category-header[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 14px 16px;\n cursor: pointer;\n transition: background 0.2s ease;\n}\n\n.category-header[_ngcontent-%COMP%]:hover {\n background: #f3f4f6;\n}\n\n.category-left[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n}\n\n.category-left[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 16px;\n}\n\n.category-name[_ngcontent-%COMP%] {\n font-weight: 600;\n font-size: 14px;\n color: #1f2937;\n}\n\n.category-badge[_ngcontent-%COMP%] {\n padding: 2px 8px;\n background: #e5e7eb;\n border-radius: 10px;\n font-size: 11px;\n font-weight: 500;\n color: #6b7280;\n}\n\n.category-right[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n}\n\n.select-all-label[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 12px;\n color: #6b7280;\n cursor: pointer;\n}\n\n.category-right[_ngcontent-%COMP%] > i[_ngcontent-%COMP%] {\n color: #9ca3af;\n font-size: 12px;\n}\n\n.category-scopes[_ngcontent-%COMP%] {\n padding: 8px 16px 16px;\n border-top: 1px solid #e5e7eb;\n background: white;\n}\n\n.scope-item[_ngcontent-%COMP%] {\n padding: 10px 0;\n border-bottom: 1px solid #f3f4f6;\n}\n\n.scope-item[_ngcontent-%COMP%]:last-child {\n border-bottom: none;\n}\n\n.scope-label[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-start;\n gap: 10px;\n cursor: pointer;\n}\n\n.scope-info[_ngcontent-%COMP%] {\n flex: 1;\n}\n\n.scope-name[_ngcontent-%COMP%] {\n display: block;\n font-weight: 500;\n font-size: 13px;\n color: #374151;\n font-family: monospace;\n}\n\n.scope-desc[_ngcontent-%COMP%] {\n display: block;\n font-size: 12px;\n color: #6b7280;\n margin-top: 2px;\n}\n\n.scope-tip[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 12px 16px;\n background: #eff6ff;\n border-radius: 8px;\n margin-top: 16px;\n font-size: 13px;\n color: #1d4ed8;\n}\n\n.scope-tip[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #3b82f6;\n}\n\n.scope-tip[_ngcontent-%COMP%] code[_ngcontent-%COMP%] {\n background: #dbeafe;\n padding: 2px 6px;\n border-radius: 4px;\n font-family: monospace;\n}\n\n\n\n.no-scopes-warning[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-start;\n gap: 12px;\n padding: 16px;\n background: linear-gradient(135deg, #fef2f2 0%, #fee2e2 100%);\n border: 1px solid #fecaca;\n border-radius: 10px;\n margin-top: 16px;\n font-size: 13px;\n color: #991b1b;\n}\n\n.no-scopes-warning[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 20px;\n color: #dc2626;\n margin-top: 2px;\n flex-shrink: 0;\n}\n\n.no-scopes-warning[_ngcontent-%COMP%] strong[_ngcontent-%COMP%] {\n display: block;\n color: #991b1b;\n font-size: 14px;\n margin-bottom: 4px;\n}\n\n.no-scopes-warning[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0;\n line-height: 1.5;\n}\n\n\n\n.success-content[_ngcontent-%COMP%] {\n text-align: center;\n}\n\n.success-icon[_ngcontent-%COMP%] {\n margin-bottom: 16px;\n}\n\n.success-icon[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 64px;\n color: #10b981;\n}\n\n.success-title[_ngcontent-%COMP%] {\n margin: 0 0 24px 0;\n font-size: 20px;\n font-weight: 700;\n color: #1f2937;\n}\n\n\n\n.key-display[_ngcontent-%COMP%] {\n background: #1f2937;\n border-radius: 12px;\n padding: 20px;\n margin-bottom: 24px;\n}\n\n.key-warning[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n padding: 10px 16px;\n background: rgba(245, 158, 11, 0.2);\n border-radius: 8px;\n margin-bottom: 16px;\n font-size: 13px;\n font-weight: 500;\n color: #fcd34d;\n}\n\n.key-value[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n background: #374151;\n border-radius: 8px;\n padding: 12px 16px;\n}\n\n.key-value[_ngcontent-%COMP%] code[_ngcontent-%COMP%] {\n flex: 1;\n font-family: 'Fira Code', 'Consolas', monospace;\n font-size: 14px;\n color: #10b981;\n word-break: break-all;\n text-align: left;\n}\n\n.copy-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 8px 16px;\n background: #4b5563;\n border: none;\n border-radius: 6px;\n font-size: 13px;\n font-weight: 500;\n color: white;\n cursor: pointer;\n transition: all 0.2s ease;\n white-space: nowrap;\n}\n\n.copy-btn[_ngcontent-%COMP%]:hover {\n background: #6b7280;\n}\n\n.copy-btn.copied[_ngcontent-%COMP%] {\n background: #10b981;\n}\n\n\n\n.key-details[_ngcontent-%COMP%] {\n text-align: left;\n background: #f9fafb;\n border-radius: 10px;\n padding: 16px 20px;\n margin-bottom: 20px;\n}\n\n.detail-row[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n padding: 8px 0;\n border-bottom: 1px solid #e5e7eb;\n}\n\n.detail-row[_ngcontent-%COMP%]:last-child {\n border-bottom: none;\n}\n\n.detail-label[_ngcontent-%COMP%] {\n font-size: 13px;\n color: #6b7280;\n}\n\n.detail-value[_ngcontent-%COMP%] {\n font-size: 13px;\n font-weight: 500;\n color: #1f2937;\n}\n\n\n\n.security-note[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-start;\n gap: 12px;\n text-align: left;\n padding: 16px;\n background: linear-gradient(135deg, #ecfdf5 0%, #d1fae5 100%);\n border-radius: 10px;\n font-size: 13px;\n color: #065f46;\n}\n\n.security-note[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 20px;\n color: #10b981;\n margin-top: 2px;\n}\n\n.security-note[_ngcontent-%COMP%] strong[_ngcontent-%COMP%] {\n display: block;\n margin-bottom: 4px;\n}\n\n\n\n[_nghost-%COMP%] .form-input .k-input, \n[_nghost-%COMP%] .form-textarea .k-input-inner, \n[_nghost-%COMP%] .k-datepicker .k-input {\n padding: 10px 14px;\n border-radius: 8px;\n font-size: 14px;\n border-color: #e5e7eb;\n transition: all 0.2s ease;\n}\n\n[_nghost-%COMP%] .form-input:focus-within, \n[_nghost-%COMP%] .form-textarea:focus-within, \n[_nghost-%COMP%] .k-datepicker:focus-within {\n box-shadow: 0 0 0 3px rgba(245, 158, 11, 0.1);\n}"] });
726
751
  }
727
752
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(APIKeyCreateDialogComponent, [{
728
753
  type: Component,
729
- args: [{ selector: 'mj-api-key-create-dialog', template: "<!-- Slide-out Backdrop -->\n<div class=\"slideout-backdrop\" *ngIf=\"Visible\" (click)=\"Step !== 'success' ? close() : null\"></div>\n\n<!-- Slide-out Panel -->\n<div class=\"slideout-panel\" [class.open]=\"Visible\">\n <!-- Header -->\n <div class=\"slideout-header\">\n <div class=\"slideout-title\">\n <i class=\"fa-solid fa-key\"></i>\n <span>Generate New API Key</span>\n </div>\n <button class=\"slideout-close\" *ngIf=\"Step !== 'success'\" (click)=\"close()\" title=\"Close (Esc)\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n\n <!-- Step Indicator -->\n <div class=\"step-indicator\" *ngIf=\"Step !== 'success'\">\n <div class=\"step\" [class.active]=\"Step === 'configure'\" [class.completed]=\"Step === 'scopes'\">\n <div class=\"step-number\">1</div>\n <div class=\"step-label\">Configure</div>\n </div>\n <div class=\"step-connector\" [class.active]=\"Step === 'scopes'\"></div>\n <div class=\"step\" [class.active]=\"Step === 'scopes'\">\n <div class=\"step-number\">2</div>\n <div class=\"step-label\">Permissions</div>\n </div>\n </div>\n\n <div class=\"slideout-content\">\n <!-- Configure Step -->\n <div class=\"step-panel\" *ngIf=\"Step === 'configure'\">\n <div class=\"form-section\">\n <label class=\"form-label required\">Key Label</label>\n <input kendoTextBox [(ngModel)]=\"Label\"\n placeholder=\"e.g., ElevenLabs Integration, CI/CD Pipeline\"\n class=\"form-input\" />\n <div class=\"form-hint\">A memorable name to identify this key's purpose</div>\n </div>\n\n <div class=\"form-section\">\n <label class=\"form-label\">Description</label>\n <textarea kendoTextArea [(ngModel)]=\"Description\"\n placeholder=\"Optional notes about how this key will be used...\"\n [rows]=\"3\"\n class=\"form-textarea\"></textarea>\n </div>\n\n <div class=\"form-section\">\n <label class=\"form-label\">Expiration</label>\n <div class=\"expiration-options\">\n <label class=\"checkbox-label\">\n <input type=\"checkbox\" kendoCheckBox\n [(ngModel)]=\"NeverExpires\"\n (change)=\"onNeverExpiresChange()\" />\n <span>Never expires</span>\n </label>\n\n <div class=\"preset-buttons\" *ngIf=\"!NeverExpires\">\n <button *ngFor=\"let preset of ExpirationPresets\"\n class=\"preset-btn\"\n [class.active]=\"SelectedPreset === preset\"\n (click)=\"onPresetSelect(preset)\">\n {{preset.label}}\n </button>\n </div>\n\n <div class=\"custom-date\" *ngIf=\"!NeverExpires && SelectedPreset?.days === -1\">\n <kendo-datepicker [(ngModel)]=\"ExpiresAt\"\n [min]=\"getMinDate()\"\n format=\"MMM d, yyyy\"\n placeholder=\"Select expiration date\">\n </kendo-datepicker>\n </div>\n\n <div class=\"expiration-preview\" *ngIf=\"!NeverExpires && ExpiresAt\">\n <i class=\"fa-solid fa-calendar-check\"></i>\n <span>Key will expire on {{ExpiresAt | date:'MMMM d, yyyy'}}</span>\n </div>\n </div>\n </div>\n\n <div class=\"error-message\" *ngIf=\"Error\">\n <i class=\"fa-solid fa-circle-exclamation\"></i>\n {{Error}}\n </div>\n </div>\n\n <!-- Scopes Step -->\n <div class=\"step-panel scopes-step\" *ngIf=\"Step === 'scopes'\">\n <div class=\"scopes-header\">\n <div class=\"scopes-info\">\n <h4>Select Permission Scopes</h4>\n <p>Choose what this API key can access. You can always modify this later.</p>\n </div>\n <div class=\"scopes-count\" *ngIf=\"getSelectedScopeCount() > 0\">\n <span class=\"count\">{{getSelectedScopeCount()}}</span> selected\n </div>\n </div>\n\n <mj-loading *ngIf=\"IsLoadingScopes\" text=\"Loading scopes...\"></mj-loading>\n\n <div class=\"scope-categories\" *ngIf=\"!IsLoadingScopes\">\n <div class=\"scope-category\" *ngFor=\"let category of ScopeCategories\">\n <div class=\"category-header\" (click)=\"toggleCategory(category)\">\n <div class=\"category-left\">\n <i [class]=\"category.icon\" [style.color]=\"category.color\"></i>\n <span class=\"category-name\">{{category.name}}</span>\n <span class=\"category-badge\">{{category.scopes.length}}</span>\n </div>\n <div class=\"category-right\">\n <label class=\"select-all-label\" (click)=\"$event.stopPropagation()\">\n <input type=\"checkbox\" kendoCheckBox\n [checked]=\"category.allSelected\"\n (change)=\"toggleCategoryAll(category)\" />\n <span>All</span>\n </label>\n <i class=\"fa-solid\" [class.fa-chevron-down]=\"!category.expanded\"\n [class.fa-chevron-up]=\"category.expanded\"></i>\n </div>\n </div>\n\n <div class=\"category-scopes\" *ngIf=\"category.expanded\">\n <div class=\"scope-item\" *ngFor=\"let item of category.scopes\">\n <label class=\"scope-label\">\n <input type=\"checkbox\" kendoCheckBox\n [(ngModel)]=\"item.selected\"\n (change)=\"updateCategoryState(category)\" />\n <div class=\"scope-info\">\n <span class=\"scope-name\">{{item.scope.Name}}</span>\n <span class=\"scope-desc\" *ngIf=\"item.scope.Description\">\n {{item.scope.Description}}\n </span>\n </div>\n </label>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"scope-tip\">\n <i class=\"fa-solid fa-lightbulb\"></i>\n <span>Tip: Use wildcards like <code>entities:*</code> for broad access within a category</span>\n </div>\n </div>\n\n <!-- Success Step -->\n <div class=\"step-panel success-step\" *ngIf=\"Step === 'success'\">\n <div class=\"success-icon\">\n <i class=\"fa-solid fa-check-circle\"></i>\n </div>\n <h3 class=\"success-title\">API Key Created Successfully!</h3>\n\n <div class=\"key-display\">\n <div class=\"key-warning\">\n <i class=\"fa-solid fa-triangle-exclamation\"></i>\n <span>Copy this key now. It won't be shown again!</span>\n </div>\n\n <div class=\"key-value\">\n <code>{{RawApiKey}}</code>\n <button class=\"copy-btn\" (click)=\"copyKey()\" [class.copied]=\"KeyCopied\">\n <i class=\"fa-solid\" [class.fa-copy]=\"!KeyCopied\" [class.fa-check]=\"KeyCopied\"></i>\n <span>{{KeyCopied ? 'Copied!' : 'Copy'}}</span>\n </button>\n </div>\n </div>\n\n <div class=\"key-details\">\n <div class=\"detail-row\">\n <span class=\"detail-label\">Label:</span>\n <span class=\"detail-value\">{{Label}}</span>\n </div>\n <div class=\"detail-row\" *ngIf=\"Description\">\n <span class=\"detail-label\">Description:</span>\n <span class=\"detail-value\">{{Description}}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Expires:</span>\n <span class=\"detail-value\">\n {{NeverExpires ? 'Never' : (ExpiresAt | date:'MMMM d, yyyy')}}\n </span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Scopes:</span>\n <span class=\"detail-value\">{{getSelectedScopeCount()}} permissions</span>\n </div>\n </div>\n\n <div class=\"security-note\">\n <i class=\"fa-solid fa-shield-check\"></i>\n <div>\n <strong>Security Note:</strong>\n Store this key securely. We only store a hash - the original key cannot be recovered.\n </div>\n </div>\n </div>\n </div>\n\n <!-- Footer -->\n <div class=\"slideout-footer\">\n <ng-container *ngIf=\"Step === 'configure'\">\n <button kendoButton [themeColor]=\"'primary'\" (click)=\"goToScopes()\">\n Next: Permissions\n <i class=\"fa-solid fa-arrow-right\"></i>\n </button>\n <button kendoButton (click)=\"close()\">Cancel</button>\n </ng-container>\n\n <ng-container *ngIf=\"Step === 'scopes'\">\n <button kendoButton [themeColor]=\"'primary'\"\n [disabled]=\"IsCreating\"\n (click)=\"createKey()\">\n <mj-loading *ngIf=\"IsCreating\" [showText]=\"false\" size=\"small\"></mj-loading>\n <span *ngIf=\"!IsCreating\">\n <i class=\"fa-solid fa-key\"></i>\n Generate Key\n </span>\n </button>\n <button kendoButton (click)=\"goBack()\">\n <i class=\"fa-solid fa-arrow-left\"></i>\n Back\n </button>\n </ng-container>\n\n <ng-container *ngIf=\"Step === 'success'\">\n <button kendoButton [themeColor]=\"'primary'\" (click)=\"close()\">\n <i class=\"fa-solid fa-check\"></i>\n Done\n </button>\n </ng-container>\n </div>\n</div>\n", styles: ["/* ========================================\n Slide-out Panel Styles\n ======================================== */\n\n/* Backdrop */\n.slideout-backdrop {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(0, 0, 0, 0.3);\n z-index: 100;\n animation: fadeIn 0.2s ease;\n}\n\n@keyframes fadeIn {\n from { opacity: 0; }\n to { opacity: 1; }\n}\n\n/* Slide-out Panel */\n.slideout-panel {\n position: absolute;\n top: 0;\n right: 0;\n width: 520px;\n height: 100%;\n max-height: 100%;\n background: var(--card-background, #ffffff);\n box-shadow: -8px 0 32px rgba(0, 0, 0, 0.15);\n z-index: 101;\n display: flex;\n flex-direction: column;\n transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n transform: translateX(100%);\n overflow: hidden;\n}\n\n.slideout-panel.open {\n transform: translateX(0);\n}\n\n/* Panel Header */\n.slideout-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 20px 24px;\n background: linear-gradient(135deg, #fafafa 0%, #f3f4f6 100%);\n border-bottom: 1px solid #e5e7eb;\n flex-shrink: 0;\n}\n\n.slideout-title {\n display: flex;\n align-items: center;\n gap: 12px;\n font-weight: 600;\n font-size: 17px;\n color: #1f2937;\n flex: 1;\n min-width: 0;\n}\n\n.slideout-title i {\n color: #f59e0b;\n font-size: 18px;\n flex-shrink: 0;\n}\n\n.slideout-close {\n width: 36px;\n height: 36px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: transparent;\n border: none;\n border-radius: 8px;\n color: #9ca3af;\n cursor: pointer;\n transition: all 0.2s ease;\n flex-shrink: 0;\n}\n\n.slideout-close:hover {\n background: rgba(0, 0, 0, 0.05);\n color: #374151;\n}\n\n/* Panel Content */\n.slideout-content {\n flex: 1;\n overflow-y: auto;\n}\n\n.step-panel {\n padding: 24px;\n}\n\n/* Panel Footer */\n.slideout-footer {\n display: flex;\n gap: 12px;\n padding: 16px 24px;\n background: linear-gradient(135deg, #f9fafb 0%, #f3f4f6 100%);\n border-top: 1px solid #e5e7eb;\n flex-shrink: 0;\n}\n\n:host ::ng-deep .slideout-footer .k-button {\n min-width: 100px;\n padding: 10px 20px;\n font-weight: 600;\n border-radius: 8px;\n transition: all 0.2s ease;\n}\n\n:host ::ng-deep .slideout-footer .k-button-solid-primary {\n background: linear-gradient(135deg, #f59e0b 0%, #d97706 100%);\n border: none;\n box-shadow: 0 2px 8px rgba(245, 158, 11, 0.3);\n}\n\n:host ::ng-deep .slideout-footer .k-button-solid-primary:hover {\n transform: translateY(-1px);\n box-shadow: 0 4px 12px rgba(245, 158, 11, 0.4);\n}\n\n:host ::ng-deep .slideout-footer .k-button i {\n margin: 0 5px;\n}\n\n/* Step Indicator */\n.step-indicator {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 20px 24px;\n background: linear-gradient(135deg, #fef3c7 0%, #fde68a 100%);\n border-bottom: 1px solid #fcd34d;\n}\n\n.step {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 6px;\n}\n\n.step-number {\n width: 32px;\n height: 32px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: white;\n border: 2px solid #d1d5db;\n border-radius: 50%;\n font-weight: 600;\n font-size: 14px;\n color: #6b7280;\n transition: all 0.2s ease;\n}\n\n.step.active .step-number {\n background: linear-gradient(135deg, #f59e0b 0%, #d97706 100%);\n border-color: #f59e0b;\n color: white;\n}\n\n.step.completed .step-number {\n background: #10b981;\n border-color: #10b981;\n color: white;\n}\n\n.step-label {\n font-size: 12px;\n font-weight: 500;\n color: #6b7280;\n}\n\n.step.active .step-label {\n color: #92400e;\n font-weight: 600;\n}\n\n.step-connector {\n width: 80px;\n height: 2px;\n background: #d1d5db;\n margin: 0 16px;\n margin-bottom: 20px;\n transition: background 0.2s ease;\n}\n\n.step-connector.active {\n background: linear-gradient(90deg, #10b981, #f59e0b);\n}\n\n/* Dialog Content */\n.dialog-content {\n padding: 24px;\n max-height: 400px;\n overflow-y: auto;\n}\n\n.scopes-content {\n max-height: 450px;\n}\n\n/* Form Sections */\n.form-section {\n margin-bottom: 24px;\n}\n\n.form-label {\n display: block;\n font-weight: 600;\n font-size: 14px;\n color: #374151;\n margin-bottom: 8px;\n}\n\n.form-label.required::after {\n content: ' *';\n color: #ef4444;\n}\n\n.form-input,\n.form-textarea {\n width: 100%;\n}\n\n.form-hint {\n font-size: 12px;\n color: #6b7280;\n margin-top: 6px;\n}\n\n/* Expiration Options */\n.expiration-options {\n display: flex;\n flex-direction: column;\n gap: 12px;\n}\n\n.checkbox-label {\n display: flex;\n align-items: center;\n gap: 8px;\n cursor: pointer;\n font-size: 14px;\n color: #374151;\n}\n\n.preset-buttons {\n display: flex;\n gap: 8px;\n flex-wrap: wrap;\n}\n\n.preset-btn {\n padding: 8px 16px;\n background: white;\n border: 1px solid #e5e7eb;\n border-radius: 6px;\n font-size: 13px;\n font-weight: 500;\n color: #374151;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.preset-btn:hover {\n border-color: #f59e0b;\n background: #fffbeb;\n}\n\n.preset-btn.active {\n background: linear-gradient(135deg, #f59e0b 0%, #d97706 100%);\n border-color: #f59e0b;\n color: white;\n}\n\n.custom-date {\n margin-top: 4px;\n}\n\n.expiration-preview {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 14px;\n background: #ecfdf5;\n border-radius: 8px;\n font-size: 13px;\n color: #059669;\n}\n\n.expiration-preview i {\n color: #10b981;\n}\n\n/* Error Message */\n.error-message {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px 16px;\n background: #fef2f2;\n border: 1px solid #fecaca;\n border-radius: 8px;\n color: #dc2626;\n font-size: 14px;\n}\n\n/* Scopes */\n.scopes-header {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n margin-bottom: 20px;\n}\n\n.scopes-info h4 {\n margin: 0 0 4px 0;\n font-size: 16px;\n font-weight: 600;\n color: #1f2937;\n}\n\n.scopes-info p {\n margin: 0;\n font-size: 13px;\n color: #6b7280;\n}\n\n.scopes-count {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n background: linear-gradient(135deg, #f59e0b 0%, #d97706 100%);\n border-radius: 20px;\n font-size: 13px;\n font-weight: 500;\n color: white;\n}\n\n.scopes-count .count {\n font-weight: 700;\n}\n\n/* Scope Categories */\n.scope-categories {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.scope-category {\n background: #f9fafb;\n border: 1px solid #e5e7eb;\n border-radius: 10px;\n overflow: hidden;\n}\n\n.category-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 14px 16px;\n cursor: pointer;\n transition: background 0.2s ease;\n}\n\n.category-header:hover {\n background: #f3f4f6;\n}\n\n.category-left {\n display: flex;\n align-items: center;\n gap: 10px;\n}\n\n.category-left i {\n font-size: 16px;\n}\n\n.category-name {\n font-weight: 600;\n font-size: 14px;\n color: #1f2937;\n}\n\n.category-badge {\n padding: 2px 8px;\n background: #e5e7eb;\n border-radius: 10px;\n font-size: 11px;\n font-weight: 500;\n color: #6b7280;\n}\n\n.category-right {\n display: flex;\n align-items: center;\n gap: 12px;\n}\n\n.select-all-label {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 12px;\n color: #6b7280;\n cursor: pointer;\n}\n\n.category-right > i {\n color: #9ca3af;\n font-size: 12px;\n}\n\n.category-scopes {\n padding: 8px 16px 16px;\n border-top: 1px solid #e5e7eb;\n background: white;\n}\n\n.scope-item {\n padding: 10px 0;\n border-bottom: 1px solid #f3f4f6;\n}\n\n.scope-item:last-child {\n border-bottom: none;\n}\n\n.scope-label {\n display: flex;\n align-items: flex-start;\n gap: 10px;\n cursor: pointer;\n}\n\n.scope-info {\n flex: 1;\n}\n\n.scope-name {\n display: block;\n font-weight: 500;\n font-size: 13px;\n color: #374151;\n font-family: monospace;\n}\n\n.scope-desc {\n display: block;\n font-size: 12px;\n color: #6b7280;\n margin-top: 2px;\n}\n\n.scope-tip {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 12px 16px;\n background: #eff6ff;\n border-radius: 8px;\n margin-top: 16px;\n font-size: 13px;\n color: #1d4ed8;\n}\n\n.scope-tip i {\n color: #3b82f6;\n}\n\n.scope-tip code {\n background: #dbeafe;\n padding: 2px 6px;\n border-radius: 4px;\n font-family: monospace;\n}\n\n/* Success Content */\n.success-content {\n text-align: center;\n}\n\n.success-icon {\n margin-bottom: 16px;\n}\n\n.success-icon i {\n font-size: 64px;\n color: #10b981;\n}\n\n.success-title {\n margin: 0 0 24px 0;\n font-size: 20px;\n font-weight: 700;\n color: #1f2937;\n}\n\n/* Key Display */\n.key-display {\n background: #1f2937;\n border-radius: 12px;\n padding: 20px;\n margin-bottom: 24px;\n}\n\n.key-warning {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n padding: 10px 16px;\n background: rgba(245, 158, 11, 0.2);\n border-radius: 8px;\n margin-bottom: 16px;\n font-size: 13px;\n font-weight: 500;\n color: #fcd34d;\n}\n\n.key-value {\n display: flex;\n align-items: center;\n gap: 12px;\n background: #374151;\n border-radius: 8px;\n padding: 12px 16px;\n}\n\n.key-value code {\n flex: 1;\n font-family: 'Fira Code', 'Consolas', monospace;\n font-size: 14px;\n color: #10b981;\n word-break: break-all;\n text-align: left;\n}\n\n.copy-btn {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 8px 16px;\n background: #4b5563;\n border: none;\n border-radius: 6px;\n font-size: 13px;\n font-weight: 500;\n color: white;\n cursor: pointer;\n transition: all 0.2s ease;\n white-space: nowrap;\n}\n\n.copy-btn:hover {\n background: #6b7280;\n}\n\n.copy-btn.copied {\n background: #10b981;\n}\n\n/* Key Details */\n.key-details {\n text-align: left;\n background: #f9fafb;\n border-radius: 10px;\n padding: 16px 20px;\n margin-bottom: 20px;\n}\n\n.detail-row {\n display: flex;\n justify-content: space-between;\n padding: 8px 0;\n border-bottom: 1px solid #e5e7eb;\n}\n\n.detail-row:last-child {\n border-bottom: none;\n}\n\n.detail-label {\n font-size: 13px;\n color: #6b7280;\n}\n\n.detail-value {\n font-size: 13px;\n font-weight: 500;\n color: #1f2937;\n}\n\n/* Security Note */\n.security-note {\n display: flex;\n align-items: flex-start;\n gap: 12px;\n text-align: left;\n padding: 16px;\n background: linear-gradient(135deg, #ecfdf5 0%, #d1fae5 100%);\n border-radius: 10px;\n font-size: 13px;\n color: #065f46;\n}\n\n.security-note i {\n font-size: 20px;\n color: #10b981;\n margin-top: 2px;\n}\n\n.security-note strong {\n display: block;\n margin-bottom: 4px;\n}\n\n/* Form input styling */\n:host ::ng-deep .form-input .k-input,\n:host ::ng-deep .form-textarea .k-input-inner,\n:host ::ng-deep .k-datepicker .k-input {\n padding: 10px 14px;\n border-radius: 8px;\n font-size: 14px;\n border-color: #e5e7eb;\n transition: all 0.2s ease;\n}\n\n:host ::ng-deep .form-input:focus-within,\n:host ::ng-deep .form-textarea:focus-within,\n:host ::ng-deep .k-datepicker:focus-within {\n box-shadow: 0 0 0 3px rgba(245, 158, 11, 0.1);\n}\n"] }]
754
+ args: [{ selector: 'mj-api-key-create-dialog', template: "<!-- Slide-out Backdrop -->\n<div class=\"slideout-backdrop\" *ngIf=\"Visible\" (click)=\"Step !== 'success' ? close() : null\"></div>\n\n<!-- Slide-out Panel -->\n<div class=\"slideout-panel\" [class.open]=\"Visible\">\n <!-- Header -->\n <div class=\"slideout-header\">\n <div class=\"slideout-title\">\n <i class=\"fa-solid fa-key\"></i>\n <span>Generate New API Key</span>\n </div>\n <button class=\"slideout-close\" *ngIf=\"Step !== 'success'\" (click)=\"close()\" title=\"Close (Esc)\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n\n <!-- Step Indicator -->\n <div class=\"step-indicator\" *ngIf=\"Step !== 'success'\">\n <div class=\"step\" [class.active]=\"Step === 'configure'\" [class.completed]=\"Step === 'scopes'\">\n <div class=\"step-number\">1</div>\n <div class=\"step-label\">Configure</div>\n </div>\n <div class=\"step-connector\" [class.active]=\"Step === 'scopes'\"></div>\n <div class=\"step\" [class.active]=\"Step === 'scopes'\">\n <div class=\"step-number\">2</div>\n <div class=\"step-label\">Permissions</div>\n </div>\n </div>\n\n <div class=\"slideout-content\">\n <!-- Configure Step -->\n <div class=\"step-panel\" *ngIf=\"Step === 'configure'\">\n <div class=\"form-section\">\n <label class=\"form-label required\">Key Label</label>\n <input kendoTextBox [(ngModel)]=\"Label\"\n placeholder=\"e.g., ElevenLabs Integration, CI/CD Pipeline\"\n class=\"form-input\" />\n <div class=\"form-hint\">A memorable name to identify this key's purpose</div>\n </div>\n\n <div class=\"form-section\">\n <label class=\"form-label\">Description</label>\n <textarea kendoTextArea [(ngModel)]=\"Description\"\n placeholder=\"Optional notes about how this key will be used...\"\n [rows]=\"3\"\n class=\"form-textarea\"></textarea>\n </div>\n\n <div class=\"form-section\">\n <label class=\"form-label\">Expiration</label>\n <div class=\"expiration-options\">\n <label class=\"checkbox-label\">\n <input type=\"checkbox\" kendoCheckBox\n [(ngModel)]=\"NeverExpires\"\n (change)=\"onNeverExpiresChange()\" />\n <span>Never expires</span>\n </label>\n\n <div class=\"preset-buttons\" *ngIf=\"!NeverExpires\">\n <button *ngFor=\"let preset of ExpirationPresets\"\n class=\"preset-btn\"\n [class.active]=\"SelectedPreset === preset\"\n (click)=\"onPresetSelect(preset)\">\n {{preset.label}}\n </button>\n </div>\n\n <div class=\"custom-date\" *ngIf=\"!NeverExpires && SelectedPreset?.days === -1\">\n <kendo-datepicker [(ngModel)]=\"ExpiresAt\"\n [min]=\"getMinDate()\"\n format=\"MMM d, yyyy\"\n placeholder=\"Select expiration date\">\n </kendo-datepicker>\n </div>\n\n <div class=\"expiration-preview\" *ngIf=\"!NeverExpires && ExpiresAt\">\n <i class=\"fa-solid fa-calendar-check\"></i>\n <span>Key will expire on {{ExpiresAt | date:'MMMM d, yyyy'}}</span>\n </div>\n </div>\n </div>\n\n <div class=\"error-message\" *ngIf=\"Error\">\n <i class=\"fa-solid fa-circle-exclamation\"></i>\n {{Error}}\n </div>\n </div>\n\n <!-- Scopes Step -->\n <div class=\"step-panel scopes-step\" *ngIf=\"Step === 'scopes'\">\n <div class=\"scopes-header\">\n <div class=\"scopes-info\">\n <h4>Select Permission Scopes</h4>\n <p>Choose what this API key can access. You can always modify this later.</p>\n </div>\n <div class=\"scopes-count\" *ngIf=\"getSelectedScopeCount() > 0\">\n <span class=\"count\">{{getSelectedScopeCount()}}</span> selected\n </div>\n </div>\n\n <mj-loading *ngIf=\"IsLoadingScopes\" text=\"Loading scopes...\"></mj-loading>\n\n <div class=\"scope-categories\" *ngIf=\"!IsLoadingScopes\">\n <div class=\"scope-category\" *ngFor=\"let category of ScopeCategories\">\n <div class=\"category-header\" (click)=\"toggleCategory(category)\">\n <div class=\"category-left\">\n <i [class]=\"category.icon\" [style.color]=\"category.color\"></i>\n <span class=\"category-name\">{{category.name}}</span>\n <span class=\"category-badge\">{{category.scopes.length}}</span>\n </div>\n <div class=\"category-right\">\n <label class=\"select-all-label\" (click)=\"$event.stopPropagation()\">\n <input type=\"checkbox\" kendoCheckBox\n [checked]=\"category.allSelected\"\n (change)=\"toggleCategoryAll(category)\" />\n <span>All</span>\n </label>\n <i class=\"fa-solid\" [class.fa-chevron-down]=\"!category.expanded\"\n [class.fa-chevron-up]=\"category.expanded\"></i>\n </div>\n </div>\n\n <div class=\"category-scopes\" *ngIf=\"category.expanded\">\n <div class=\"scope-item\" *ngFor=\"let item of category.scopes\">\n <label class=\"scope-label\">\n <input type=\"checkbox\" kendoCheckBox\n [(ngModel)]=\"item.selected\"\n (change)=\"updateCategoryState(category)\" />\n <div class=\"scope-info\">\n <span class=\"scope-name\">{{item.scope.Name}}</span>\n <span class=\"scope-desc\" *ngIf=\"item.scope.Description\">\n {{item.scope.Description}}\n </span>\n </div>\n </label>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"scope-tip\">\n <i class=\"fa-solid fa-lightbulb\"></i>\n <span>Tip: Use wildcards like <code>entities:*</code> for broad access within a category</span>\n </div>\n\n <!-- No Scopes Warning -->\n <div class=\"no-scopes-warning\" *ngIf=\"!IsLoadingScopes && getSelectedScopeCount() === 0\">\n <i class=\"fa-solid fa-triangle-exclamation\"></i>\n <div>\n <strong>Warning: No permissions selected</strong>\n <p>API keys without any assigned scopes will have <strong>no permissions</strong> and cannot perform any operations. This key will be rejected by all API endpoints until scopes are assigned.</p>\n </div>\n </div>\n </div>\n\n <!-- Success Step -->\n <div class=\"step-panel success-step\" *ngIf=\"Step === 'success'\">\n <div class=\"success-icon\">\n <i class=\"fa-solid fa-check-circle\"></i>\n </div>\n <h3 class=\"success-title\">API Key Created Successfully!</h3>\n\n <div class=\"key-display\">\n <div class=\"key-warning\">\n <i class=\"fa-solid fa-triangle-exclamation\"></i>\n <span>Copy this key now. It won't be shown again!</span>\n </div>\n\n <div class=\"key-value\">\n <code>{{RawApiKey}}</code>\n <button class=\"copy-btn\" (click)=\"copyKey()\" [class.copied]=\"KeyCopied\">\n <i class=\"fa-solid\" [class.fa-copy]=\"!KeyCopied\" [class.fa-check]=\"KeyCopied\"></i>\n <span>{{KeyCopied ? 'Copied!' : 'Copy'}}</span>\n </button>\n </div>\n </div>\n\n <div class=\"key-details\">\n <div class=\"detail-row\">\n <span class=\"detail-label\">Label:</span>\n <span class=\"detail-value\">{{Label}}</span>\n </div>\n <div class=\"detail-row\" *ngIf=\"Description\">\n <span class=\"detail-label\">Description:</span>\n <span class=\"detail-value\">{{Description}}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Expires:</span>\n <span class=\"detail-value\">\n {{NeverExpires ? 'Never' : (ExpiresAt | date:'MMMM d, yyyy')}}\n </span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Scopes:</span>\n <span class=\"detail-value\">{{getSelectedScopeCount()}} permissions</span>\n </div>\n </div>\n\n <div class=\"security-note\">\n <i class=\"fa-solid fa-shield-check\"></i>\n <div>\n <strong>Security Note:</strong>\n Store this key securely. We only store a hash - the original key cannot be recovered.\n </div>\n </div>\n </div>\n </div>\n\n <!-- Footer -->\n <div class=\"slideout-footer\">\n <ng-container *ngIf=\"Step === 'configure'\">\n <button kendoButton [themeColor]=\"'primary'\" (click)=\"goToScopes()\">\n Next: Permissions\n <i class=\"fa-solid fa-arrow-right\"></i>\n </button>\n <button kendoButton (click)=\"close()\">Cancel</button>\n </ng-container>\n\n <ng-container *ngIf=\"Step === 'scopes'\">\n <button kendoButton [themeColor]=\"'primary'\"\n [disabled]=\"IsCreating\"\n (click)=\"createKey()\">\n <mj-loading *ngIf=\"IsCreating\" [showText]=\"false\" size=\"small\"></mj-loading>\n <span *ngIf=\"!IsCreating\">\n <i class=\"fa-solid fa-key\"></i>\n Generate Key\n </span>\n </button>\n <button kendoButton (click)=\"goBack()\">\n <i class=\"fa-solid fa-arrow-left\"></i>\n Back\n </button>\n </ng-container>\n\n <ng-container *ngIf=\"Step === 'success'\">\n <button kendoButton [themeColor]=\"'primary'\" (click)=\"close()\">\n <i class=\"fa-solid fa-check\"></i>\n Done\n </button>\n </ng-container>\n </div>\n</div>\n", styles: ["/* ========================================\n Slide-out Panel Styles\n ======================================== */\n\n/* Backdrop */\n.slideout-backdrop {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(0, 0, 0, 0.3);\n z-index: 100;\n animation: fadeIn 0.2s ease;\n}\n\n@keyframes fadeIn {\n from { opacity: 0; }\n to { opacity: 1; }\n}\n\n/* Slide-out Panel */\n.slideout-panel {\n position: absolute;\n top: 0;\n right: 0;\n width: 520px;\n height: 100%;\n max-height: 100%;\n background: var(--card-background, #ffffff);\n box-shadow: -8px 0 32px rgba(0, 0, 0, 0.15);\n z-index: 101;\n display: flex;\n flex-direction: column;\n transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n transform: translateX(100%);\n overflow: hidden;\n}\n\n.slideout-panel.open {\n transform: translateX(0);\n}\n\n/* Panel Header */\n.slideout-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 20px 24px;\n background: linear-gradient(135deg, #fafafa 0%, #f3f4f6 100%);\n border-bottom: 1px solid #e5e7eb;\n flex-shrink: 0;\n}\n\n.slideout-title {\n display: flex;\n align-items: center;\n gap: 12px;\n font-weight: 600;\n font-size: 17px;\n color: #1f2937;\n flex: 1;\n min-width: 0;\n}\n\n.slideout-title i {\n color: #f59e0b;\n font-size: 18px;\n flex-shrink: 0;\n}\n\n.slideout-close {\n width: 36px;\n height: 36px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: transparent;\n border: none;\n border-radius: 8px;\n color: #9ca3af;\n cursor: pointer;\n transition: all 0.2s ease;\n flex-shrink: 0;\n}\n\n.slideout-close:hover {\n background: rgba(0, 0, 0, 0.05);\n color: #374151;\n}\n\n/* Panel Content */\n.slideout-content {\n flex: 1;\n overflow-y: auto;\n}\n\n.step-panel {\n padding: 24px;\n}\n\n/* Panel Footer */\n.slideout-footer {\n display: flex;\n gap: 12px;\n padding: 16px 24px;\n background: linear-gradient(135deg, #f9fafb 0%, #f3f4f6 100%);\n border-top: 1px solid #e5e7eb;\n flex-shrink: 0;\n}\n\n:host ::ng-deep .slideout-footer .k-button {\n min-width: 100px;\n padding: 10px 20px;\n font-weight: 600;\n border-radius: 8px;\n transition: all 0.2s ease;\n}\n\n:host ::ng-deep .slideout-footer .k-button-solid-primary {\n background: linear-gradient(135deg, #f59e0b 0%, #d97706 100%);\n border: none;\n box-shadow: 0 2px 8px rgba(245, 158, 11, 0.3);\n}\n\n:host ::ng-deep .slideout-footer .k-button-solid-primary:hover {\n transform: translateY(-1px);\n box-shadow: 0 4px 12px rgba(245, 158, 11, 0.4);\n}\n\n:host ::ng-deep .slideout-footer .k-button i {\n margin: 0 5px;\n}\n\n/* Step Indicator */\n.step-indicator {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 20px 24px;\n background: linear-gradient(135deg, #fef3c7 0%, #fde68a 100%);\n border-bottom: 1px solid #fcd34d;\n}\n\n.step {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 6px;\n}\n\n.step-number {\n width: 32px;\n height: 32px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: white;\n border: 2px solid #d1d5db;\n border-radius: 50%;\n font-weight: 600;\n font-size: 14px;\n color: #6b7280;\n transition: all 0.2s ease;\n}\n\n.step.active .step-number {\n background: linear-gradient(135deg, #f59e0b 0%, #d97706 100%);\n border-color: #f59e0b;\n color: white;\n}\n\n.step.completed .step-number {\n background: #10b981;\n border-color: #10b981;\n color: white;\n}\n\n.step-label {\n font-size: 12px;\n font-weight: 500;\n color: #6b7280;\n}\n\n.step.active .step-label {\n color: #92400e;\n font-weight: 600;\n}\n\n.step-connector {\n width: 80px;\n height: 2px;\n background: #d1d5db;\n margin: 0 16px;\n margin-bottom: 20px;\n transition: background 0.2s ease;\n}\n\n.step-connector.active {\n background: linear-gradient(90deg, #10b981, #f59e0b);\n}\n\n/* Dialog Content */\n.dialog-content {\n padding: 24px;\n max-height: 400px;\n overflow-y: auto;\n}\n\n.scopes-content {\n max-height: 450px;\n}\n\n/* Form Sections */\n.form-section {\n margin-bottom: 24px;\n}\n\n.form-label {\n display: block;\n font-weight: 600;\n font-size: 14px;\n color: #374151;\n margin-bottom: 8px;\n}\n\n.form-label.required::after {\n content: ' *';\n color: #ef4444;\n}\n\n.form-input,\n.form-textarea {\n width: 100%;\n}\n\n.form-hint {\n font-size: 12px;\n color: #6b7280;\n margin-top: 6px;\n}\n\n/* Expiration Options */\n.expiration-options {\n display: flex;\n flex-direction: column;\n gap: 12px;\n}\n\n.checkbox-label {\n display: flex;\n align-items: center;\n gap: 8px;\n cursor: pointer;\n font-size: 14px;\n color: #374151;\n}\n\n.preset-buttons {\n display: flex;\n gap: 8px;\n flex-wrap: wrap;\n}\n\n.preset-btn {\n padding: 8px 16px;\n background: white;\n border: 1px solid #e5e7eb;\n border-radius: 6px;\n font-size: 13px;\n font-weight: 500;\n color: #374151;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.preset-btn:hover {\n border-color: #f59e0b;\n background: #fffbeb;\n}\n\n.preset-btn.active {\n background: linear-gradient(135deg, #f59e0b 0%, #d97706 100%);\n border-color: #f59e0b;\n color: white;\n}\n\n.custom-date {\n margin-top: 4px;\n}\n\n.expiration-preview {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 14px;\n background: #ecfdf5;\n border-radius: 8px;\n font-size: 13px;\n color: #059669;\n}\n\n.expiration-preview i {\n color: #10b981;\n}\n\n/* Error Message */\n.error-message {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px 16px;\n background: #fef2f2;\n border: 1px solid #fecaca;\n border-radius: 8px;\n color: #dc2626;\n font-size: 14px;\n}\n\n/* Scopes */\n.scopes-header {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n margin-bottom: 20px;\n}\n\n.scopes-info h4 {\n margin: 0 0 4px 0;\n font-size: 16px;\n font-weight: 600;\n color: #1f2937;\n}\n\n.scopes-info p {\n margin: 0;\n font-size: 13px;\n color: #6b7280;\n}\n\n.scopes-count {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n background: linear-gradient(135deg, #f59e0b 0%, #d97706 100%);\n border-radius: 20px;\n font-size: 13px;\n font-weight: 500;\n color: white;\n}\n\n.scopes-count .count {\n font-weight: 700;\n}\n\n/* Scope Categories */\n.scope-categories {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.scope-category {\n background: #f9fafb;\n border: 1px solid #e5e7eb;\n border-radius: 10px;\n overflow: hidden;\n}\n\n.category-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 14px 16px;\n cursor: pointer;\n transition: background 0.2s ease;\n}\n\n.category-header:hover {\n background: #f3f4f6;\n}\n\n.category-left {\n display: flex;\n align-items: center;\n gap: 10px;\n}\n\n.category-left i {\n font-size: 16px;\n}\n\n.category-name {\n font-weight: 600;\n font-size: 14px;\n color: #1f2937;\n}\n\n.category-badge {\n padding: 2px 8px;\n background: #e5e7eb;\n border-radius: 10px;\n font-size: 11px;\n font-weight: 500;\n color: #6b7280;\n}\n\n.category-right {\n display: flex;\n align-items: center;\n gap: 12px;\n}\n\n.select-all-label {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 12px;\n color: #6b7280;\n cursor: pointer;\n}\n\n.category-right > i {\n color: #9ca3af;\n font-size: 12px;\n}\n\n.category-scopes {\n padding: 8px 16px 16px;\n border-top: 1px solid #e5e7eb;\n background: white;\n}\n\n.scope-item {\n padding: 10px 0;\n border-bottom: 1px solid #f3f4f6;\n}\n\n.scope-item:last-child {\n border-bottom: none;\n}\n\n.scope-label {\n display: flex;\n align-items: flex-start;\n gap: 10px;\n cursor: pointer;\n}\n\n.scope-info {\n flex: 1;\n}\n\n.scope-name {\n display: block;\n font-weight: 500;\n font-size: 13px;\n color: #374151;\n font-family: monospace;\n}\n\n.scope-desc {\n display: block;\n font-size: 12px;\n color: #6b7280;\n margin-top: 2px;\n}\n\n.scope-tip {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 12px 16px;\n background: #eff6ff;\n border-radius: 8px;\n margin-top: 16px;\n font-size: 13px;\n color: #1d4ed8;\n}\n\n.scope-tip i {\n color: #3b82f6;\n}\n\n.scope-tip code {\n background: #dbeafe;\n padding: 2px 6px;\n border-radius: 4px;\n font-family: monospace;\n}\n\n/* No Scopes Warning */\n.no-scopes-warning {\n display: flex;\n align-items: flex-start;\n gap: 12px;\n padding: 16px;\n background: linear-gradient(135deg, #fef2f2 0%, #fee2e2 100%);\n border: 1px solid #fecaca;\n border-radius: 10px;\n margin-top: 16px;\n font-size: 13px;\n color: #991b1b;\n}\n\n.no-scopes-warning i {\n font-size: 20px;\n color: #dc2626;\n margin-top: 2px;\n flex-shrink: 0;\n}\n\n.no-scopes-warning strong {\n display: block;\n color: #991b1b;\n font-size: 14px;\n margin-bottom: 4px;\n}\n\n.no-scopes-warning p {\n margin: 0;\n line-height: 1.5;\n}\n\n/* Success Content */\n.success-content {\n text-align: center;\n}\n\n.success-icon {\n margin-bottom: 16px;\n}\n\n.success-icon i {\n font-size: 64px;\n color: #10b981;\n}\n\n.success-title {\n margin: 0 0 24px 0;\n font-size: 20px;\n font-weight: 700;\n color: #1f2937;\n}\n\n/* Key Display */\n.key-display {\n background: #1f2937;\n border-radius: 12px;\n padding: 20px;\n margin-bottom: 24px;\n}\n\n.key-warning {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n padding: 10px 16px;\n background: rgba(245, 158, 11, 0.2);\n border-radius: 8px;\n margin-bottom: 16px;\n font-size: 13px;\n font-weight: 500;\n color: #fcd34d;\n}\n\n.key-value {\n display: flex;\n align-items: center;\n gap: 12px;\n background: #374151;\n border-radius: 8px;\n padding: 12px 16px;\n}\n\n.key-value code {\n flex: 1;\n font-family: 'Fira Code', 'Consolas', monospace;\n font-size: 14px;\n color: #10b981;\n word-break: break-all;\n text-align: left;\n}\n\n.copy-btn {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 8px 16px;\n background: #4b5563;\n border: none;\n border-radius: 6px;\n font-size: 13px;\n font-weight: 500;\n color: white;\n cursor: pointer;\n transition: all 0.2s ease;\n white-space: nowrap;\n}\n\n.copy-btn:hover {\n background: #6b7280;\n}\n\n.copy-btn.copied {\n background: #10b981;\n}\n\n/* Key Details */\n.key-details {\n text-align: left;\n background: #f9fafb;\n border-radius: 10px;\n padding: 16px 20px;\n margin-bottom: 20px;\n}\n\n.detail-row {\n display: flex;\n justify-content: space-between;\n padding: 8px 0;\n border-bottom: 1px solid #e5e7eb;\n}\n\n.detail-row:last-child {\n border-bottom: none;\n}\n\n.detail-label {\n font-size: 13px;\n color: #6b7280;\n}\n\n.detail-value {\n font-size: 13px;\n font-weight: 500;\n color: #1f2937;\n}\n\n/* Security Note */\n.security-note {\n display: flex;\n align-items: flex-start;\n gap: 12px;\n text-align: left;\n padding: 16px;\n background: linear-gradient(135deg, #ecfdf5 0%, #d1fae5 100%);\n border-radius: 10px;\n font-size: 13px;\n color: #065f46;\n}\n\n.security-note i {\n font-size: 20px;\n color: #10b981;\n margin-top: 2px;\n}\n\n.security-note strong {\n display: block;\n margin-bottom: 4px;\n}\n\n/* Form input styling */\n:host ::ng-deep .form-input .k-input,\n:host ::ng-deep .form-textarea .k-input-inner,\n:host ::ng-deep .k-datepicker .k-input {\n padding: 10px 14px;\n border-radius: 8px;\n font-size: 14px;\n border-color: #e5e7eb;\n transition: all 0.2s ease;\n}\n\n:host ::ng-deep .form-input:focus-within,\n:host ::ng-deep .form-textarea:focus-within,\n:host ::ng-deep .k-datepicker:focus-within {\n box-shadow: 0 0 0 3px rgba(245, 158, 11, 0.1);\n}\n"] }]
730
755
  }], null, { Visible: [{
731
756
  type: Input
732
757
  }], VisibleChange: [{
@@ -739,5 +764,5 @@ export class APIKeyCreateDialogComponent {
739
764
  type: HostListener,
740
765
  args: ['document:keydown.escape']
741
766
  }] }); })();
742
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(APIKeyCreateDialogComponent, { className: "APIKeyCreateDialogComponent", filePath: "src/APIKeys/api-key-create-dialog.component.ts", lineNumber: 44 }); })();
767
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(APIKeyCreateDialogComponent, { className: "APIKeyCreateDialogComponent", filePath: "src/APIKeys/api-key-create-dialog.component.ts", lineNumber: 45 }); })();
743
768
  //# sourceMappingURL=api-key-create-dialog.component.js.map