@flowuent-org/diagramming-core 1.3.10 → 1.4.1

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 (677) hide show
  1. package/.editorconfig +13 -13
  2. package/.eslintignore +1 -1
  3. package/.eslintrc.json +35 -35
  4. package/.prettierignore +3 -3
  5. package/.prettierrc +3 -3
  6. package/.vscode/settings.json +6 -6
  7. package/README.md +95 -95
  8. package/apps/authentication/tsconfig.app.json +23 -23
  9. package/apps/authentication/tsconfig.json +21 -21
  10. package/apps/authentication/tsconfig.spec.json +28 -28
  11. package/apps/diagramming/.eslintrc.json +18 -18
  12. package/apps/diagramming/index.html +16 -16
  13. package/apps/diagramming/project.json +53 -53
  14. package/apps/diagramming/public/aws-icons/compute/App Runner.svg +17 -17
  15. package/apps/diagramming/public/aws-icons/compute/Application Auto Scaling.svg +17 -17
  16. package/apps/diagramming/public/aws-icons/compute/Batch.svg +17 -17
  17. package/apps/diagramming/public/aws-icons/compute/Bottlerocket.svg +19 -19
  18. package/apps/diagramming/public/aws-icons/compute/Compute Optimizer.svg +17 -17
  19. package/apps/diagramming/public/aws-icons/compute/EC2 Auto Scaling.svg +17 -17
  20. package/apps/diagramming/public/aws-icons/compute/EC2 Image Builder.svg +17 -17
  21. package/apps/diagramming/public/aws-icons/compute/EC2.svg +17 -17
  22. package/apps/diagramming/public/aws-icons/compute/Elastic Beanstalk.svg +17 -17
  23. package/apps/diagramming/public/aws-icons/compute/Elastic Fabric Adapter.svg +17 -17
  24. package/apps/diagramming/public/aws-icons/compute/Fargate.svg +19 -19
  25. package/apps/diagramming/public/aws-icons/compute/Genomics CLI.svg +17 -17
  26. package/apps/diagramming/public/aws-icons/compute/Lambda.svg +17 -17
  27. package/apps/diagramming/public/aws-icons/compute/Local Zones.svg +17 -17
  28. package/apps/diagramming/public/aws-icons/compute/NICE DCV.svg +17 -17
  29. package/apps/diagramming/public/aws-icons/compute/NICE EnginFrame.svg +17 -17
  30. package/apps/diagramming/public/aws-icons/compute/Nitro Enclaves.svg +17 -17
  31. package/apps/diagramming/public/aws-icons/compute/Outposts family.svg +17 -17
  32. package/apps/diagramming/public/aws-icons/compute/Outposts rack.svg +17 -17
  33. package/apps/diagramming/public/aws-icons/compute/Outposts servers.svg +17 -17
  34. package/apps/diagramming/public/aws-icons/compute/ParallelCluster.svg +17 -17
  35. package/apps/diagramming/public/aws-icons/compute/Serverless Application Repository.svg +17 -17
  36. package/apps/diagramming/public/aws-icons/compute/SimSpace Weaver.svg +17 -17
  37. package/apps/diagramming/public/aws-icons/compute/Thinkbox Deadline.svg +17 -17
  38. package/apps/diagramming/public/aws-icons/compute/Thinkbox Frost.svg +17 -17
  39. package/apps/diagramming/public/aws-icons/compute/Thinkbox Sequoia.svg +17 -17
  40. package/apps/diagramming/public/aws-icons/compute/Thinkbox Stoke.svg +17 -17
  41. package/apps/diagramming/public/aws-icons/compute/Thinkbox XMesh.svg +17 -17
  42. package/apps/diagramming/public/aws-icons/compute/VMware Cloud on AWS.svg +17 -17
  43. package/apps/diagramming/public/aws-icons/compute/Wavelength.svg +17 -17
  44. package/apps/diagramming/public/aws-icons/container/ECS Anywhere.svg +17 -17
  45. package/apps/diagramming/public/aws-icons/container/EKS Anywhere.svg +17 -17
  46. package/apps/diagramming/public/aws-icons/container/EKS Cloud.svg +17 -17
  47. package/apps/diagramming/public/aws-icons/container/EKS Distro.svg +17 -17
  48. package/apps/diagramming/public/aws-icons/container/Elastic Container Registry.svg +17 -17
  49. package/apps/diagramming/public/aws-icons/container/Elastic Container Service.svg +17 -17
  50. package/apps/diagramming/public/aws-icons/container/Elastic Kubernetes Service.svg +17 -17
  51. package/apps/diagramming/public/aws-icons/container/Fargate.svg +19 -19
  52. package/apps/diagramming/public/aws-icons/container/Red Hat OpenShift Service on AWS.svg +17 -17
  53. package/apps/diagramming/public/aws-icons/database/Aurora.svg +17 -17
  54. package/apps/diagramming/public/aws-icons/database/Database Migration Service.svg +17 -17
  55. package/apps/diagramming/public/aws-icons/database/DocumentDB.svg +17 -17
  56. package/apps/diagramming/public/aws-icons/database/ElastiCache.svg +17 -17
  57. package/apps/diagramming/public/aws-icons/database/Keyspaces.svg +15 -15
  58. package/apps/diagramming/public/aws-icons/database/MemoryDB for Redis.svg +17 -17
  59. package/apps/diagramming/public/aws-icons/database/Neptune.svg +17 -17
  60. package/apps/diagramming/public/aws-icons/database/RDS on VMware.svg +17 -17
  61. package/apps/diagramming/public/aws-icons/database/RDS.svg +17 -17
  62. package/apps/diagramming/public/aws-icons/database/Timestream.svg +17 -17
  63. package/apps/diagramming/public/aws-icons/networking/App Mesh.svg +17 -17
  64. package/apps/diagramming/public/aws-icons/networking/Client VPN.svg +17 -17
  65. package/apps/diagramming/public/aws-icons/networking/Cloud Directory.svg +17 -17
  66. package/apps/diagramming/public/aws-icons/networking/Cloud Map.svg +17 -17
  67. package/apps/diagramming/public/aws-icons/networking/Cloud WAN.svg +17 -17
  68. package/apps/diagramming/public/aws-icons/networking/CloudFront.svg +17 -17
  69. package/apps/diagramming/public/aws-icons/networking/Direct Connect.svg +17 -17
  70. package/apps/diagramming/public/aws-icons/networking/Elastic Load Balancing.svg +17 -17
  71. package/apps/diagramming/public/aws-icons/networking/Global Accelerator.svg +17 -17
  72. package/apps/diagramming/public/aws-icons/networking/Private 5G.svg +17 -17
  73. package/apps/diagramming/public/aws-icons/networking/PrivateLink.svg +17 -17
  74. package/apps/diagramming/public/aws-icons/networking/Route 53.svg +17 -17
  75. package/apps/diagramming/public/aws-icons/networking/Site to Site VPN.svg +17 -17
  76. package/apps/diagramming/public/aws-icons/networking/Transit Gateway.svg +17 -17
  77. package/apps/diagramming/public/aws-icons/networking/VPC Lattice.svg +17 -17
  78. package/apps/diagramming/public/aws-icons/networking/Verified Access.svg +17 -17
  79. package/apps/diagramming/public/aws-icons/networking/Virtual Private Cloud.svg +17 -17
  80. package/apps/diagramming/public/aws-icons/security/Artifact.svg +17 -17
  81. package/apps/diagramming/public/aws-icons/security/Audit Manager.svg +17 -17
  82. package/apps/diagramming/public/aws-icons/security/Certificate Manager.svg +17 -17
  83. package/apps/diagramming/public/aws-icons/security/CloudHSM.svg +17 -17
  84. package/apps/diagramming/public/aws-icons/security/Cognito.svg +17 -17
  85. package/apps/diagramming/public/aws-icons/security/Detective.svg +17 -17
  86. package/apps/diagramming/public/aws-icons/security/Directory Service.svg +17 -17
  87. package/apps/diagramming/public/aws-icons/security/Firewall Manager.svg +17 -17
  88. package/apps/diagramming/public/aws-icons/security/GuardDuty.svg +17 -17
  89. package/apps/diagramming/public/aws-icons/security/IAM Identity Center.svg +17 -17
  90. package/apps/diagramming/public/aws-icons/security/Identity and Access Management.svg +17 -17
  91. package/apps/diagramming/public/aws-icons/security/Inspector.svg +17 -17
  92. package/apps/diagramming/public/aws-icons/security/Key Management Service.svg +17 -17
  93. package/apps/diagramming/public/aws-icons/security/Macie.svg +17 -17
  94. package/apps/diagramming/public/aws-icons/security/Network Firewall.svg +17 -17
  95. package/apps/diagramming/public/aws-icons/security/Resource Access Manager.svg +17 -17
  96. package/apps/diagramming/public/aws-icons/security/Secrets Manager.svg +17 -17
  97. package/apps/diagramming/public/aws-icons/security/Security Hub.svg +17 -17
  98. package/apps/diagramming/public/aws-icons/security/Security Lake.svg +17 -17
  99. package/apps/diagramming/public/aws-icons/security/Shield.svg +17 -17
  100. package/apps/diagramming/public/aws-icons/security/Signer.svg +17 -17
  101. package/apps/diagramming/public/aws-icons/security/Verified Permissions.svg +17 -17
  102. package/apps/diagramming/public/aws-icons/security/WAF.svg +17 -17
  103. package/apps/diagramming/public/aws-icons/storage/Backup.svg +17 -17
  104. package/apps/diagramming/public/aws-icons/storage/EFS.svg +17 -17
  105. package/apps/diagramming/public/aws-icons/storage/Elastic Block Store.svg +17 -17
  106. package/apps/diagramming/public/aws-icons/storage/Elastic Disaster Recovery.svg +15 -15
  107. package/apps/diagramming/public/aws-icons/storage/FSx for Lustre.svg +17 -17
  108. package/apps/diagramming/public/aws-icons/storage/FSx for NetApp ONTAP.svg +17 -17
  109. package/apps/diagramming/public/aws-icons/storage/FSx for OpenZFS.svg +17 -17
  110. package/apps/diagramming/public/aws-icons/storage/FSx for WFS.svg +17 -17
  111. package/apps/diagramming/public/aws-icons/storage/FSx.svg +17 -17
  112. package/apps/diagramming/public/aws-icons/storage/File Cache.svg +17 -17
  113. package/apps/diagramming/public/aws-icons/storage/S3 on Outposts.svg +17 -17
  114. package/apps/diagramming/public/aws-icons/storage/Simple Storage Service Glacier.svg +17 -17
  115. package/apps/diagramming/public/aws-icons/storage/Simple Storage Service.svg +17 -17
  116. package/apps/diagramming/public/aws-icons/storage/Snowball Edge.svg +17 -17
  117. package/apps/diagramming/public/aws-icons/storage/Snowball.svg +17 -17
  118. package/apps/diagramming/public/aws-icons/storage/Snowcone.svg +17 -17
  119. package/apps/diagramming/public/aws-icons/storage/Snowmobile.svg +17 -17
  120. package/apps/diagramming/public/aws-icons/storage/Storage Gateway.svg +17 -17
  121. package/apps/diagramming/public/azure-icons/compute/02112-icon-service-Automanaged-VM.svg +1 -1
  122. package/apps/diagramming/public/azure-icons/databases/02390-icon-service-Azure-SQL.svg +1 -1
  123. package/apps/diagramming/public/azure-icons/databases/02392-icon-service-SSIS-Lift-And-Shift-IR.svg +1 -1
  124. package/apps/diagramming/public/azure-icons/networking/02145-icon-service-Resource-Management-Private-Link.svg +1 -1
  125. package/apps/diagramming/public/azure-icons/security/02247-icon-service-Microsoft-Defender-for-IoT.svg +1 -1
  126. package/apps/diagramming/public/sample-node-complete.json +63 -63
  127. package/apps/diagramming/public/sample-node-data.json +63 -63
  128. package/apps/diagramming/src/AutomationDiagramData.ts +147 -480
  129. package/apps/diagramming/src/CollaborationDiagramData.ts +127 -127
  130. package/apps/diagramming/src/CustomIconExamples.ts +233 -233
  131. package/apps/diagramming/src/DiagramTabs.tsx +205 -205
  132. package/apps/diagramming/src/Pages/DevPlayground.tsx +3 -3
  133. package/apps/diagramming/src/Pages/Home.tsx +111 -111
  134. package/apps/diagramming/src/SequenceDiagramData.ts +215 -215
  135. package/apps/diagramming/src/StateMachineDiagramData.ts +64 -64
  136. package/apps/diagramming/src/UseCaseDiagramData.ts +52 -52
  137. package/apps/diagramming/src/cloud-data.ts +371 -371
  138. package/apps/diagramming/src/components/AddNodeView.tsx +252 -252
  139. package/apps/diagramming/src/createSelecors.tsx +17 -17
  140. package/apps/diagramming/src/index.scss +12 -12
  141. package/apps/diagramming/src/main.tsx +463 -463
  142. package/apps/diagramming/src/node-data.ts +664 -664
  143. package/apps/diagramming/src/sample-workflow-content.ts +55 -55
  144. package/apps/diagramming/src/stencil-items.ts +31 -31
  145. package/apps/diagramming/src/style.css +13 -13
  146. package/apps/diagramming/src/tabsStore.tsx +152 -152
  147. package/apps/diagramming/src/vite-env.d.ts +1 -1
  148. package/apps/diagramming/tsconfig.app.json +23 -23
  149. package/apps/diagramming/tsconfig.json +21 -21
  150. package/apps/diagramming/tsconfig.spec.json +28 -28
  151. package/apps/diagramming/vite.config.ts +34 -34
  152. package/apps/diagramming/webpack.config.js +13 -13
  153. package/apps/workflow/.eslintrc.json +18 -18
  154. package/apps/workflow/group/group-form-hooks/index.ts +3 -3
  155. package/apps/workflow/group/group-form-hooks/useFormValidation.ts +20 -20
  156. package/apps/workflow/group/group-form-schema/SettingsTabFormSchema.ts +7 -7
  157. package/apps/workflow/group/group-form-schema/index.ts +3 -3
  158. package/apps/workflow/i18n.ts +19 -19
  159. package/apps/workflow/index.html +16 -16
  160. package/apps/workflow/locales/en/translation.json +713 -713
  161. package/apps/workflow/project.json +8 -8
  162. package/apps/workflow/src/app/app.module.css +1 -1
  163. package/apps/workflow/src/app/app.spec.tsx +15 -15
  164. package/apps/workflow/src/app/app.tsx +370 -370
  165. package/apps/workflow/src/main.tsx +13 -13
  166. package/apps/workflow/src/styles.css +1 -1
  167. package/apps/workflow/src/theme/index.ts +546 -546
  168. package/apps/workflow/tsconfig.app.json +23 -23
  169. package/apps/workflow/tsconfig.json +21 -21
  170. package/apps/workflow/tsconfig.spec.json +28 -28
  171. package/apps/workflow/vite.config.ts +51 -51
  172. package/nx.json +58 -58
  173. package/package.json +1 -1
  174. package/packages/api/.babelrc +12 -12
  175. package/packages/api/.eslintrc.json +18 -18
  176. package/packages/api/README.md +7 -7
  177. package/packages/api/project.json +8 -8
  178. package/packages/api/src/index.ts +3 -3
  179. package/packages/api/src/lib/jsonPlaceholderService/endpoints.ts +3 -3
  180. package/packages/api/src/lib/jsonPlaceholderService/service.ts +13 -13
  181. package/packages/api/tsconfig.json +17 -17
  182. package/packages/api/tsconfig.lib.json +24 -24
  183. package/packages/atoms/.babelrc +12 -12
  184. package/packages/atoms/.eslintrc.json +18 -18
  185. package/packages/atoms/README.md +7 -7
  186. package/packages/atoms/forms/AuthenticationTabForm/authenticationTabForm.json +224 -224
  187. package/packages/atoms/forms/AuthenticationTabForm/index.tsx +255 -255
  188. package/packages/atoms/forms/SettingsTabForm/index.tsx +85 -85
  189. package/packages/atoms/forms/SettingsTabForm/settingTabForm.json +27 -27
  190. package/packages/atoms/forms/index.ts +4 -4
  191. package/packages/atoms/project.json +8 -8
  192. package/packages/atoms/src/index.ts +33 -33
  193. package/packages/atoms/src/lib/Accordion/Accordion.module.css +7 -7
  194. package/packages/atoms/src/lib/Accordion/Accordion.spec.tsx +13 -13
  195. package/packages/atoms/src/lib/Accordion/Accordion.tsx +29 -29
  196. package/packages/atoms/src/lib/Alert/Alert.module.css +7 -7
  197. package/packages/atoms/src/lib/Alert/Alert.spec.tsx +10 -10
  198. package/packages/atoms/src/lib/Alert/Alert.tsx +19 -19
  199. package/packages/atoms/src/lib/Avatar/Avatar.module.css +7 -7
  200. package/packages/atoms/src/lib/Avatar/Avatar.spec.tsx +10 -10
  201. package/packages/atoms/src/lib/Avatar/Avatar.tsx +22 -22
  202. package/packages/atoms/src/lib/Box/Box.module.css +7 -7
  203. package/packages/atoms/src/lib/Box/Box.spec.tsx +10 -10
  204. package/packages/atoms/src/lib/Box/Box.tsx +19 -19
  205. package/packages/atoms/src/lib/BulkEdit/BulkEdit.module.css +7 -7
  206. package/packages/atoms/src/lib/BulkEdit/BulkEdit.spec.tsx +10 -10
  207. package/packages/atoms/src/lib/BulkEdit/BulkEdit.tsx +15 -15
  208. package/packages/atoms/src/lib/Button/Button.module.css +7 -7
  209. package/packages/atoms/src/lib/Button/Button.spec.tsx +10 -10
  210. package/packages/atoms/src/lib/Button/Button.tsx +78 -78
  211. package/packages/atoms/src/lib/Card/Card.module.css +7 -7
  212. package/packages/atoms/src/lib/Card/Card.spec.tsx +10 -10
  213. package/packages/atoms/src/lib/Card/Card.tsx +19 -19
  214. package/packages/atoms/src/lib/CardContent/CardContent.module.css +7 -7
  215. package/packages/atoms/src/lib/CardContent/CardContent.spec.tsx +10 -10
  216. package/packages/atoms/src/lib/CardContent/CardContent.tsx +22 -22
  217. package/packages/atoms/src/lib/FormTextField/FormTextField.module.css +7 -7
  218. package/packages/atoms/src/lib/FormTextField/FormTextField.spec.tsx +10 -10
  219. package/packages/atoms/src/lib/FormTextField/FormTextField.tsx +35 -35
  220. package/packages/atoms/src/lib/Grid/Grid.module.css +7 -7
  221. package/packages/atoms/src/lib/Grid/Grid.spec.tsx +10 -10
  222. package/packages/atoms/src/lib/Grid/Grid.tsx +19 -19
  223. package/packages/atoms/src/lib/Stack/Stack.module.css +7 -7
  224. package/packages/atoms/src/lib/Stack/Stack.spec.tsx +10 -10
  225. package/packages/atoms/src/lib/Stack/Stack.tsx +19 -19
  226. package/packages/atoms/src/lib/Switch/Switch.module.css +7 -7
  227. package/packages/atoms/src/lib/Switch/Switch.spec.tsx +10 -10
  228. package/packages/atoms/src/lib/Switch/Switch.tsx +46 -46
  229. package/packages/atoms/src/lib/TableView/TableView.module.css +7 -7
  230. package/packages/atoms/src/lib/TableView/TableView.spec.tsx +10 -10
  231. package/packages/atoms/src/lib/TableView/TableView.tsx +88 -88
  232. package/packages/atoms/src/lib/TextField/TextField.module.css +7 -7
  233. package/packages/atoms/src/lib/TextField/TextField.spec.tsx +10 -10
  234. package/packages/atoms/src/lib/TextField/TextField.tsx +17 -17
  235. package/packages/atoms/src/lib/Typography/Typography.module.css +7 -7
  236. package/packages/atoms/src/lib/Typography/Typography.spec.tsx +10 -10
  237. package/packages/atoms/src/lib/Typography/Typography.tsx +22 -22
  238. package/packages/atoms/tsconfig.json +17 -17
  239. package/packages/atoms/tsconfig.lib.json +30 -30
  240. package/packages/common/.babelrc +12 -12
  241. package/packages/common/.eslintrc.json +18 -18
  242. package/packages/common/README.md +7 -7
  243. package/packages/common/project.json +8 -8
  244. package/packages/common/src/index.ts +4 -4
  245. package/packages/common/src/lib/generateRandomProfilePic.ts +3 -3
  246. package/packages/common/src/lib/generateValidationSchema.ts +46 -46
  247. package/packages/common/tsconfig.json +17 -17
  248. package/packages/common/tsconfig.lib.json +24 -24
  249. package/packages/contexts/.babelrc +12 -12
  250. package/packages/contexts/.eslintrc.json +18 -18
  251. package/packages/contexts/README.md +7 -7
  252. package/packages/contexts/project.json +8 -8
  253. package/packages/contexts/src/index.ts +2 -2
  254. package/packages/contexts/tsconfig.json +17 -17
  255. package/packages/contexts/tsconfig.lib.json +24 -24
  256. package/packages/diagrams/.babelrc +12 -12
  257. package/packages/diagrams/.ctirc +208 -208
  258. package/packages/diagrams/.eslintrc.json +17 -17
  259. package/packages/diagrams/CUSTOM_ICONS.md +232 -232
  260. package/packages/diagrams/GOOGLE_SHEETS_IMPLEMENTATION.md +233 -233
  261. package/packages/diagrams/NODE_DATA_UPDATE_API.md +430 -430
  262. package/packages/diagrams/README.md +7 -7
  263. package/packages/diagrams/UNDO_REDO_API.md +306 -306
  264. package/packages/diagrams/locales/en/translation.json +713 -713
  265. package/packages/diagrams/package.json +27 -27
  266. package/packages/diagrams/pnpm-lock.yaml +2606 -2606
  267. package/packages/diagrams/project.json +42 -42
  268. package/packages/diagrams/rollup.config.js +26 -26
  269. package/packages/diagrams/src/DiagramFlow.tsx +7 -7
  270. package/packages/diagrams/src/declarations.d.ts +7 -7
  271. package/packages/diagrams/src/index.ts +8 -1
  272. package/packages/diagrams/src/index.ts.bak +99 -99
  273. package/packages/diagrams/src/lib/assets/markers/markers.param.tsx +101 -101
  274. package/packages/diagrams/src/lib/assets/markers/markers.type.ts +10 -10
  275. package/packages/diagrams/src/lib/atoms/ActorNode.tsx +123 -123
  276. package/packages/diagrams/src/lib/atoms/AddParallelColButton.tsx +26 -26
  277. package/packages/diagrams/src/lib/atoms/BendpointNode.tsx +71 -71
  278. package/packages/diagrams/src/lib/atoms/CardBlockTypeSelector.tsx +35 -35
  279. package/packages/diagrams/src/lib/atoms/CardEditableTitle.tsx +76 -76
  280. package/packages/diagrams/src/lib/atoms/CardMainContent.tsx +19 -19
  281. package/packages/diagrams/src/lib/atoms/ConnectionPoints.tsx +149 -149
  282. package/packages/diagrams/src/lib/atoms/ContentAssist.tsx +341 -341
  283. package/packages/diagrams/src/lib/atoms/DiagramControls.tsx +56 -56
  284. package/packages/diagrams/src/lib/atoms/ExpressionInput.tsx +437 -437
  285. package/packages/diagrams/src/lib/atoms/FloatingConnectionLine.tsx +73 -73
  286. package/packages/diagrams/src/lib/atoms/LazyIcon.tsx +31 -31
  287. package/packages/diagrams/src/lib/atoms/MarkerSelector.tsx +106 -106
  288. package/packages/diagrams/src/lib/atoms/MultiSelectInput.tsx +87 -87
  289. package/packages/diagrams/src/lib/atoms/ParameterInput.tsx +199 -199
  290. package/packages/diagrams/src/lib/atoms/PropertyInput.tsx +114 -114
  291. package/packages/diagrams/src/lib/atoms/StyledBox.tsx +69 -69
  292. package/packages/diagrams/src/lib/atoms/ValidationError.tsx +37 -37
  293. package/packages/diagrams/src/lib/atoms/ValidationMessage.tsx +63 -63
  294. package/packages/diagrams/src/lib/components/AiButton.tsx +52 -52
  295. package/packages/diagrams/src/lib/components/ControlEdgeList.tsx +303 -303
  296. package/packages/diagrams/src/lib/components/CreateFunctionModal.tsx +264 -264
  297. package/packages/diagrams/src/lib/components/CustomCodeModal.tsx +287 -287
  298. package/packages/diagrams/src/lib/components/DiagramPanel.tsx +331 -331
  299. package/packages/diagrams/src/lib/components/FunctionModalTooltip.tsx +30 -30
  300. package/packages/diagrams/src/lib/components/GraphQLCustomCodeModal.tsx +210 -210
  301. package/packages/diagrams/src/lib/components/Header.tsx +143 -143
  302. package/packages/diagrams/src/lib/components/MiniMapCommon.tsx +24 -24
  303. package/packages/diagrams/src/lib/components/ResizeIcon.tsx +81 -81
  304. package/packages/diagrams/src/lib/components/SideBar.tsx +40 -40
  305. package/packages/diagrams/src/lib/components/automation/AISuggestionsModal.tsx +269 -269
  306. package/packages/diagrams/src/lib/components/automation/AISuggestionsPanel.tsx +28 -175
  307. package/packages/diagrams/src/lib/components/automation/AutomationApiNode.tsx +1 -1
  308. package/packages/diagrams/src/lib/components/automation/AutomationDecisionNode.tsx +94 -0
  309. package/packages/diagrams/src/lib/components/automation/AutomationEndNode.tsx +1 -1
  310. package/packages/diagrams/src/lib/components/automation/AutomationExecutionPanel.tsx +439 -439
  311. package/packages/diagrams/src/lib/components/automation/AutomationFormattingNode.tsx +1 -1
  312. package/packages/diagrams/src/lib/components/automation/AutomationInteractionNode.tsx +693 -693
  313. package/packages/diagrams/src/lib/components/automation/AutomationMonitoringNode.tsx +399 -399
  314. package/packages/diagrams/src/lib/components/automation/AutomationNavigationNode.tsx +1 -1
  315. package/packages/diagrams/src/lib/components/automation/AutomationNodeCard.tsx +414 -0
  316. package/packages/diagrams/src/lib/components/automation/AutomationSlackNode.tsx +694 -694
  317. package/packages/diagrams/src/lib/components/automation/AutomationSmsNode.tsx +62 -0
  318. package/packages/diagrams/src/lib/components/automation/AutomationStartNode.tsx +1 -1
  319. package/packages/diagrams/src/lib/components/automation/AutomationTelegramNode.tsx +664 -664
  320. package/packages/diagrams/src/lib/components/automation/AutomationVoiceCallNode.tsx +65 -0
  321. package/packages/diagrams/src/lib/components/automation/AutomationWorkflowNode.tsx +85 -0
  322. package/packages/diagrams/src/lib/components/automation/NodeAIAssistantPopup.tsx +504 -504
  323. package/packages/diagrams/src/lib/components/automation/index.ts +29 -19
  324. package/packages/diagrams/src/lib/components/automation/statusColors.ts +124 -124
  325. package/packages/diagrams/src/lib/contexts/CardDataProvider.tsx +111 -111
  326. package/packages/diagrams/src/lib/contexts/DiagramProvider.tsx +392 -391
  327. package/packages/diagrams/src/lib/contexts/diagramStoreTypes.tsx +134 -134
  328. package/packages/diagrams/src/lib/contexts/onConnect.ts +39 -39
  329. package/packages/diagrams/src/lib/contexts/onDragStart.ts +45 -45
  330. package/packages/diagrams/src/lib/contexts/onNodeDragEnd.ts +179 -179
  331. package/packages/diagrams/src/lib/contexts/onNodesChange.ts +406 -406
  332. package/packages/diagrams/src/lib/contexts/onReconnect.ts +59 -59
  333. package/packages/diagrams/src/lib/contexts/onWorkflowNodeDelete.ts +65 -65
  334. package/packages/diagrams/src/lib/contexts/setContentHeight.ts +14 -14
  335. package/packages/diagrams/src/lib/contexts/setDiagramType.ts +10 -10
  336. package/packages/diagrams/src/lib/contexts/setEdgeShapeType.ts +7 -7
  337. package/packages/diagrams/src/lib/contexts/setEdges.ts +9 -9
  338. package/packages/diagrams/src/lib/contexts/setLayoutDirection.ts +9 -9
  339. package/packages/diagrams/src/lib/contexts/setNodeSetting.ts +17 -17
  340. package/packages/diagrams/src/lib/contexts/setNodes.ts +10 -10
  341. package/packages/diagrams/src/lib/contexts/setPannable.ts +7 -7
  342. package/packages/diagrams/src/lib/contexts/setSelectedEdge.ts +7 -7
  343. package/packages/diagrams/src/lib/contexts/setSelectedNode.ts +7 -7
  344. package/packages/diagrams/src/lib/contexts/undo.ts +163 -163
  345. package/packages/diagrams/src/lib/contexts/updateNodeSetting.ts +17 -17
  346. package/packages/diagrams/src/lib/examples/TwilioWhatsAppConfigExample.ts +128 -128
  347. package/packages/diagrams/src/lib/externals.ts +4 -4
  348. package/packages/diagrams/src/lib/hooks/customUseReactFlow.tsx +90 -90
  349. package/packages/diagrams/src/lib/hooks/updateNodes.ts +45 -45
  350. package/packages/diagrams/src/lib/hooks/useAddChildButton.tsx +61 -61
  351. package/packages/diagrams/src/lib/hooks/useAddSwitchCase.ts +75 -75
  352. package/packages/diagrams/src/lib/hooks/useAutoRegisterFunctions.ts +135 -135
  353. package/packages/diagrams/src/lib/hooks/useAutoRegisterVariables.ts +286 -286
  354. package/packages/diagrams/src/lib/hooks/useDeleteNodeByEvent.ts +64 -64
  355. package/packages/diagrams/src/lib/hooks/useDragCallbacks.tsx +122 -122
  356. package/packages/diagrams/src/lib/hooks/useFormValidation.ts +349 -349
  357. package/packages/diagrams/src/lib/hooks/useFunctionFormCallbacks.ts +136 -136
  358. package/packages/diagrams/src/lib/hooks/useIsSelectedNode.ts +11 -11
  359. package/packages/diagrams/src/lib/hooks/useModalControls.ts +13 -13
  360. package/packages/diagrams/src/lib/hooks/useNodeDragHandlers.ts +43 -43
  361. package/packages/diagrams/src/lib/hooks/useNodeSelection.ts +55 -55
  362. package/packages/diagrams/src/lib/hooks/useRenderDividers.tsx +19 -19
  363. package/packages/diagrams/src/lib/hooks/useRenderPins.tsx +74 -74
  364. package/packages/diagrams/src/lib/hooks/useResizeObserver.ts +21 -21
  365. package/packages/diagrams/src/lib/hooks/useTreeChildNode.ts +536 -536
  366. package/packages/diagrams/src/lib/i18n.ts +42 -42
  367. package/packages/diagrams/src/lib/icons/icons.tsx +324 -0
  368. package/packages/diagrams/src/lib/icons/index.ts +29 -0
  369. package/packages/diagrams/src/lib/icons/types.ts +7 -0
  370. package/packages/diagrams/src/lib/molecules/AddingBlock.tsx +147 -147
  371. package/packages/diagrams/src/lib/molecules/AvailableVariablesDisplay.tsx +57 -57
  372. package/packages/diagrams/src/lib/molecules/Block.tsx +143 -143
  373. package/packages/diagrams/src/lib/molecules/BlockProvider.tsx +28 -28
  374. package/packages/diagrams/src/lib/molecules/BlockWrapper.tsx +14 -14
  375. package/packages/diagrams/src/lib/molecules/ConditionRule.tsx +131 -131
  376. package/packages/diagrams/src/lib/molecules/DraggablePane.tsx +198 -198
  377. package/packages/diagrams/src/lib/molecules/EntityNodeBlocks.tsx +66 -66
  378. package/packages/diagrams/src/lib/molecules/SideHandles.tsx +215 -215
  379. package/packages/diagrams/src/lib/molecules/StencilItem.tsx +85 -85
  380. package/packages/diagrams/src/lib/molecules/WorkflowNodeActionButtons.tsx +62 -62
  381. package/packages/diagrams/src/lib/molecules/animated-add-button.tsx +83 -83
  382. package/packages/diagrams/src/lib/molecules/json-viewer.tsx +107 -107
  383. package/packages/diagrams/src/lib/organisms/AddNodeView.tsx +102 -102
  384. package/packages/diagrams/src/lib/organisms/Card/EntityNode.tsx +259 -259
  385. package/packages/diagrams/src/lib/organisms/Card/card.params.ts +29 -29
  386. package/packages/diagrams/src/lib/organisms/Card/card.types.ts +5 -5
  387. package/packages/diagrams/src/lib/organisms/CodeModal.tsx +105 -105
  388. package/packages/diagrams/src/lib/organisms/ConditionRuleGroup.tsx +138 -138
  389. package/packages/diagrams/src/lib/organisms/CustomEdge/EdgeMarkers.tsx +51 -51
  390. package/packages/diagrams/src/lib/organisms/CustomEdge/custom-edge-generator.tsx +135 -135
  391. package/packages/diagrams/src/lib/organisms/CustomEdge/custom-edge.params.ts +6 -6
  392. package/packages/diagrams/src/lib/organisms/CustomEdge/custom-edge.type.ts +15 -15
  393. package/packages/diagrams/src/lib/organisms/CustomEdge/useCreateBendPoint.tsx +121 -121
  394. package/packages/diagrams/src/lib/organisms/CustomEdge/useEdgeModal.ts +37 -37
  395. package/packages/diagrams/src/lib/organisms/CustomEdge/useEdgePath.tsx +99 -99
  396. package/packages/diagrams/src/lib/organisms/DownloadPanel.tsx +345 -345
  397. package/packages/diagrams/src/lib/organisms/EdgeModal.tsx +243 -243
  398. package/packages/diagrams/src/lib/organisms/HistoryPane.tsx +118 -118
  399. package/packages/diagrams/src/lib/organisms/NodeContextMenu.tsx +259 -259
  400. package/packages/diagrams/src/lib/organisms/PropertiesPane.tsx +276 -276
  401. package/packages/diagrams/src/lib/organisms/SmartDynamicForm.tsx +226 -226
  402. package/packages/diagrams/src/lib/organisms/Stencil.tsx +60 -60
  403. package/packages/diagrams/src/lib/organisms/UseDiagramStore.tsx +4 -4
  404. package/packages/diagrams/src/lib/organisms/WorkFlowNode/NodeActionButtons.tsx +45 -45
  405. package/packages/diagrams/src/lib/organisms/WorkFlowNode/NodeTypeDisplay.tsx +114 -114
  406. package/packages/diagrams/src/lib/organisms/WorkFlowNode/WorkflowNodeIcons.tsx +21 -23
  407. package/packages/diagrams/src/lib/organisms/WorkflowNode.tsx +484 -484
  408. package/packages/diagrams/src/lib/services/GoogleSheetsService.ts +961 -961
  409. package/packages/diagrams/src/lib/services/SlackService.ts +134 -134
  410. package/packages/diagrams/src/lib/services/TwilioWhatsAppService.ts +273 -273
  411. package/packages/diagrams/src/lib/styles.css +55 -55
  412. package/packages/diagrams/src/lib/templates/PageLinks.tsx +13 -13
  413. package/packages/diagrams/src/lib/templates/arch/ArchDiagram.tsx +793 -793
  414. package/packages/diagrams/src/lib/templates/arch/components/EdgeDialog.tsx +82 -82
  415. package/packages/diagrams/src/lib/templates/arch/components/EdgeSettings.tsx +81 -81
  416. package/packages/diagrams/src/lib/templates/arch/components/GroupControls.tsx +59 -59
  417. package/packages/diagrams/src/lib/templates/arch/components/GroupSizeDialog.tsx +81 -81
  418. package/packages/diagrams/src/lib/templates/arch/components/NodeDialog.tsx +214 -214
  419. package/packages/diagrams/src/lib/templates/arch/components/nodeTypes.ts +91 -91
  420. package/packages/diagrams/src/lib/templates/arch/controls/ArchDiagramControls.tsx +349 -349
  421. package/packages/diagrams/src/lib/templates/arch/data/templatee-data.ts +212 -212
  422. package/packages/diagrams/src/lib/templates/cloud-arch/components/CloudArchitectureDiagram.tsx +3912 -3912
  423. package/packages/diagrams/src/lib/templates/cloud-arch/components/FormatConverter.tsx +809 -809
  424. package/packages/diagrams/src/lib/templates/cloud-arch/components/FragmentImporter.tsx +276 -276
  425. package/packages/diagrams/src/lib/templates/cloud-arch/components/PropertiesPanel.tsx +1063 -1063
  426. package/packages/diagrams/src/lib/templates/cloud-arch/components/ServiceIconPicker.tsx +138 -138
  427. package/packages/diagrams/src/lib/templates/cloud-arch/components/SettingsSidebar.tsx +656 -656
  428. package/packages/diagrams/src/lib/templates/cloud-arch/components/SubnetSelector.tsx +468 -468
  429. package/packages/diagrams/src/lib/templates/cloud-arch/components/nodes/ServiceNode.tsx +310 -310
  430. package/packages/diagrams/src/lib/templates/cloud-arch/components/nodes/SubnetNode.tsx +475 -475
  431. package/packages/diagrams/src/lib/templates/cloud-arch/components/nodes/UsersNode.tsx +277 -277
  432. package/packages/diagrams/src/lib/templates/cloud-arch/data/diagramManager.ts +364 -364
  433. package/packages/diagrams/src/lib/templates/cloud-arch/data/types.ts +183 -183
  434. package/packages/diagrams/src/lib/templates/cloud-arch/integration/diagramValidator.ts +379 -379
  435. package/packages/diagrams/src/lib/templates/cloud-arch/messages/errorMessages.json +95 -95
  436. package/packages/diagrams/src/lib/templates/cloud-arch/types/localization.ts +368 -368
  437. package/packages/diagrams/src/lib/templates/cloud-arch/types/validation.ts +72 -72
  438. package/packages/diagrams/src/lib/templates/cloud-arch/utils/aws-icons.ts +557 -557
  439. package/packages/diagrams/src/lib/templates/cloud-arch/utils/awsValidation.ts +446 -446
  440. package/packages/diagrams/src/lib/templates/cloud-arch/utils/azure-icons.ts +802 -802
  441. package/packages/diagrams/src/lib/templates/cloud-arch/utils/azureValidation.ts +495 -495
  442. package/packages/diagrams/src/lib/templates/cloud-arch/utils/cloudValidation.ts +929 -929
  443. package/packages/diagrams/src/lib/templates/cloud-arch/utils/errorMessages.ts +283 -283
  444. package/packages/diagrams/src/lib/templates/cloud-arch/utils/gcp-icons.ts +186 -186
  445. package/packages/diagrams/src/lib/templates/cloud-arch/utils/gcpValidation.ts +312 -312
  446. package/packages/diagrams/src/lib/templates/cloud-arch/utils/genericValidation.ts +689 -689
  447. package/packages/diagrams/src/lib/templates/cloud-arch/utils/iconMapping.ts +383 -383
  448. package/packages/diagrams/src/lib/templates/cloud-arch/utils/idGenerator.ts +220 -220
  449. package/packages/diagrams/src/lib/templates/cloud-arch/utils/localizationManager.ts +300 -300
  450. package/packages/diagrams/src/lib/templates/cloud-arch/utils/restrictionEngine.ts +550 -550
  451. package/packages/diagrams/src/lib/templates/cloud-arch/utils/restrictionValidator.ts +400 -400
  452. package/packages/diagrams/src/lib/templates/cloud-arch/utils/serviceIcons.tsx +129 -129
  453. package/packages/diagrams/src/lib/templates/cloud-arch/utils/serviceMapping.ts +330 -330
  454. package/packages/diagrams/src/lib/templates/cloud-arch/utils/translations.ts +54 -54
  455. package/packages/diagrams/src/lib/templates/cloud-arch/utils/validationExtractor.ts +342 -342
  456. package/packages/diagrams/src/lib/templates/collaborationDiagram/CollaborationDiagram.tsx +15 -15
  457. package/packages/diagrams/src/lib/templates/collaborationDiagram/components/AddCollabEdgeDialog.tsx +181 -181
  458. package/packages/diagrams/src/lib/templates/collaborationDiagram/components/CollabLayout.ts +182 -182
  459. package/packages/diagrams/src/lib/templates/collaborationDiagram/components/CollabObjectNodeSettings.tsx +86 -86
  460. package/packages/diagrams/src/lib/templates/collaborationDiagram/components/CollaborationDiagramFlow.tsx +731 -731
  461. package/packages/diagrams/src/lib/templates/collaborationDiagram/components/DraggableEdgeLabel.tsx +123 -123
  462. package/packages/diagrams/src/lib/templates/collaborationDiagram/controls/CollaborationControls.tsx +131 -131
  463. package/packages/diagrams/src/lib/templates/collaborationDiagram/nodes/CollabEdge.tsx +170 -170
  464. package/packages/diagrams/src/lib/templates/collaborationDiagram/nodes/CollabObjectNode.tsx +178 -178
  465. package/packages/diagrams/src/lib/templates/home.style.css +16 -16
  466. package/packages/diagrams/src/lib/templates/node-forms/ApiForm.tsx +416 -416
  467. package/packages/diagrams/src/lib/templates/node-forms/CallForm.tsx +370 -370
  468. package/packages/diagrams/src/lib/templates/node-forms/ForLoopNode.tsx +313 -313
  469. package/packages/diagrams/src/lib/templates/node-forms/FunctionForm.tsx +211 -211
  470. package/packages/diagrams/src/lib/templates/node-forms/GraphQLForm.tsx +679 -679
  471. package/packages/diagrams/src/lib/templates/node-forms/IfNodeForm.tsx +97 -97
  472. package/packages/diagrams/src/lib/templates/node-forms/LetNodeForm.tsx +533 -533
  473. package/packages/diagrams/src/lib/templates/node-forms/LoopNode.tsx +149 -149
  474. package/packages/diagrams/src/lib/templates/node-forms/NodeForm.tsx +383 -383
  475. package/packages/diagrams/src/lib/templates/node-forms/ReturnNodeForm.tsx +96 -96
  476. package/packages/diagrams/src/lib/templates/node-forms/SetNodeForm.tsx +141 -141
  477. package/packages/diagrams/src/lib/templates/node-forms/SwitchNodeForm.tsx +249 -249
  478. package/packages/diagrams/src/lib/templates/node-forms/TryCatchForm.tsx +167 -167
  479. package/packages/diagrams/src/lib/templates/nodeFormSchema.json +84 -84
  480. package/packages/diagrams/src/lib/templates/sequence/SequenceDiagram.tsx +22 -22
  481. package/packages/diagrams/src/lib/templates/sequence/components/ActivationBarNode.tsx +33 -33
  482. package/packages/diagrams/src/lib/templates/sequence/components/AddMessageDialog.tsx +302 -302
  483. package/packages/diagrams/src/lib/templates/sequence/components/CombinedFragmentNode.tsx +65 -65
  484. package/packages/diagrams/src/lib/templates/sequence/components/EntitySettings.tsx +559 -559
  485. package/packages/diagrams/src/lib/templates/sequence/components/FragmentSettings.tsx +116 -116
  486. package/packages/diagrams/src/lib/templates/sequence/components/SequenceComponents.tsx +14 -14
  487. package/packages/diagrams/src/lib/templates/sequence/components/SequenceDiagramFlow.tsx +1361 -1361
  488. package/packages/diagrams/src/lib/templates/sequence/components/SequenceEntityNode.tsx +394 -394
  489. package/packages/diagrams/src/lib/templates/sequence/components/SequenceMessageEdge.tsx +272 -272
  490. package/packages/diagrams/src/lib/templates/sequence/components/SimpleEntitySettings.tsx +89 -89
  491. package/packages/diagrams/src/lib/templates/sequence/controls/DiagramControls.tsx +707 -707
  492. package/packages/diagrams/src/lib/templates/sequence/data/template-data.ts +635 -635
  493. package/packages/diagrams/src/lib/templates/stateMachine/StateMachineDiagram.tsx +66 -66
  494. package/packages/diagrams/src/lib/templates/stateMachine/components/CompositeStateNodeSettings.tsx +638 -638
  495. package/packages/diagrams/src/lib/templates/stateMachine/components/CustomEdge.tsx +220 -220
  496. package/packages/diagrams/src/lib/templates/stateMachine/components/EdgeSettings.tsx +193 -193
  497. package/packages/diagrams/src/lib/templates/stateMachine/components/SelfConnectingEdge.tsx +41 -41
  498. package/packages/diagrams/src/lib/templates/stateMachine/components/StateMachineComponents.tsx +49 -49
  499. package/packages/diagrams/src/lib/templates/stateMachine/components/StateMachineDiagramFlow.tsx +1238 -1238
  500. package/packages/diagrams/src/lib/templates/stateMachine/components/StateMachineLayout.ts +350 -350
  501. package/packages/diagrams/src/lib/templates/stateMachine/components/StateNodeSettings.tsx +188 -188
  502. package/packages/diagrams/src/lib/templates/stateMachine/components/useSelfTransition.ts +114 -114
  503. package/packages/diagrams/src/lib/templates/stateMachine/controls/StateDiagramControls.tsx +488 -488
  504. package/packages/diagrams/src/lib/templates/stateMachine/data/template-data.ts +4 -4
  505. package/packages/diagrams/src/lib/templates/stateMachine/nodes/ChoicePointNode.tsx +54 -54
  506. package/packages/diagrams/src/lib/templates/stateMachine/nodes/CompositeStateNode.tsx +225 -225
  507. package/packages/diagrams/src/lib/templates/stateMachine/nodes/EntryPointNode.tsx +31 -31
  508. package/packages/diagrams/src/lib/templates/stateMachine/nodes/ExitPointNode.tsx +44 -44
  509. package/packages/diagrams/src/lib/templates/stateMachine/nodes/FinalStateNode.tsx +41 -41
  510. package/packages/diagrams/src/lib/templates/stateMachine/nodes/ForkJoinNode.tsx +53 -53
  511. package/packages/diagrams/src/lib/templates/stateMachine/nodes/HistoryStateNode.tsx +36 -36
  512. package/packages/diagrams/src/lib/templates/stateMachine/nodes/InitialStateNode.tsx +29 -29
  513. package/packages/diagrams/src/lib/templates/stateMachine/nodes/JunctionPointNode.tsx +33 -33
  514. package/packages/diagrams/src/lib/templates/stateMachine/nodes/PinPointNode.tsx +111 -111
  515. package/packages/diagrams/src/lib/templates/stateMachine/nodes/StateNode.tsx +124 -124
  516. package/packages/diagrams/src/lib/templates/stateMachine/nodes/bendPoint.tsx +71 -71
  517. package/packages/diagrams/src/lib/templates/systemFlow/SystemFlowDiagram.tsx +67 -67
  518. package/packages/diagrams/src/lib/templates/systemFlow/components/EdgeSettings.tsx +330 -330
  519. package/packages/diagrams/src/lib/templates/systemFlow/components/FloatingEdge.tsx +219 -219
  520. package/packages/diagrams/src/lib/templates/systemFlow/components/SystemFlowComponents.tsx +28 -28
  521. package/packages/diagrams/src/lib/templates/systemFlow/components/SystemFlowDiagramFlow.tsx +1179 -1179
  522. package/packages/diagrams/src/lib/templates/systemFlow/components/SystemFlowNodeSettings.tsx +151 -151
  523. package/packages/diagrams/src/lib/templates/systemFlow/controls/SystemFlowControls.tsx +435 -435
  524. package/packages/diagrams/src/lib/templates/systemFlow/data/template-data.ts +308 -308
  525. package/packages/diagrams/src/lib/templates/systemFlow/demo.tsx +91 -91
  526. package/packages/diagrams/src/lib/templates/systemFlow/index.ts +5 -5
  527. package/packages/diagrams/src/lib/templates/systemFlow/nodes/BendpointNode.tsx +80 -80
  528. package/packages/diagrams/src/lib/templates/systemFlow/nodes/SystemNode.tsx +92 -92
  529. package/packages/diagrams/src/lib/templates/systemFlow/nodes/TreeSystemNode.tsx +755 -755
  530. package/packages/diagrams/src/lib/templates/useCaseDiagram/UseCaseDiagram.tsx +16 -16
  531. package/packages/diagrams/src/lib/templates/useCaseDiagram/components/ActorNodeSettings.tsx +103 -103
  532. package/packages/diagrams/src/lib/templates/useCaseDiagram/components/AddRelationshipDialog.tsx +186 -186
  533. package/packages/diagrams/src/lib/templates/useCaseDiagram/components/PackageNodeSettings.tsx +205 -205
  534. package/packages/diagrams/src/lib/templates/useCaseDiagram/components/UseCaseDiagramFlow.tsx +637 -637
  535. package/packages/diagrams/src/lib/templates/useCaseDiagram/components/UseCaseNodeSettings.tsx +120 -120
  536. package/packages/diagrams/src/lib/templates/useCaseDiagram/controls/UseCaseControls.tsx +289 -289
  537. package/packages/diagrams/src/lib/templates/useCaseDiagram/nodes/PackageNode.tsx +83 -83
  538. package/packages/diagrams/src/lib/templates/useCaseDiagram/nodes/UseCaseEdge.tsx +115 -115
  539. package/packages/diagrams/src/lib/templates/useCaseDiagram/nodes/UseCaseNode.tsx +230 -230
  540. package/packages/diagrams/src/lib/templates/validationSchema.json +277 -277
  541. package/packages/diagrams/src/lib/theme.ts +439 -439
  542. package/packages/diagrams/src/lib/types/FunctionSignature.ts +11 -11
  543. package/packages/diagrams/src/lib/types/SmartDynamicFormField.ts +37 -37
  544. package/packages/diagrams/src/lib/types/automation-node-data-types.ts +45 -131
  545. package/packages/diagrams/src/lib/types/available-variables.ts +18 -18
  546. package/packages/diagrams/src/lib/types/card-node.ts +68 -68
  547. package/packages/diagrams/src/lib/types/collaboration-types.ts +114 -114
  548. package/packages/diagrams/src/lib/types/colors.ts +25 -25
  549. package/packages/diagrams/src/lib/types/condition-builder.ts +18 -18
  550. package/packages/diagrams/src/lib/types/diagram-types.ts +14 -14
  551. package/packages/diagrams/src/lib/types/edge-types.ts +39 -39
  552. package/packages/diagrams/src/lib/types/function-execution.ts +35 -35
  553. package/packages/diagrams/src/lib/types/hooks.types.ts +6 -6
  554. package/packages/diagrams/src/lib/types/ndoe-form-types.ts +139 -139
  555. package/packages/diagrams/src/lib/types/node-types.ts +13 -23
  556. package/packages/diagrams/src/lib/types/sequence-types.ts +178 -178
  557. package/packages/diagrams/src/lib/types/shared-node-types.ts +21 -21
  558. package/packages/diagrams/src/lib/types/state-machine-types.ts +225 -225
  559. package/packages/diagrams/src/lib/types/stencil-item.ts +7 -7
  560. package/packages/diagrams/src/lib/types/structures.ts +80 -80
  561. package/packages/diagrams/src/lib/types/system-flow-types.ts +129 -129
  562. package/packages/diagrams/src/lib/types/usecase-types.ts +84 -84
  563. package/packages/diagrams/src/lib/types/validation-types.ts +134 -134
  564. package/packages/diagrams/src/lib/types/workflow-content-dynamic-form-type.ts +23 -23
  565. package/packages/diagrams/src/lib/types/workflow-node-data-types.ts +172 -172
  566. package/packages/diagrams/src/lib/utils/AutomationExecutionEngine.ts +658 -1179
  567. package/packages/diagrams/src/lib/utils/add-new-block.ts +34 -34
  568. package/packages/diagrams/src/lib/utils/add-new-node.ts +52 -52
  569. package/packages/diagrams/src/lib/utils/addToHistory.ts +15 -15
  570. package/packages/diagrams/src/lib/utils/automation-flow-processor.ts +556 -619
  571. package/packages/diagrams/src/lib/utils/closestPoint.ts +45 -45
  572. package/packages/diagrams/src/lib/utils/color-options.tsx +26 -26
  573. package/packages/diagrams/src/lib/utils/compress-img.ts +59 -59
  574. package/packages/diagrams/src/lib/utils/configLoader.ts +329 -329
  575. package/packages/diagrams/src/lib/utils/constant-lengths.ts +8 -8
  576. package/packages/diagrams/src/lib/utils/create-updated.tsx +40 -40
  577. package/packages/diagrams/src/lib/utils/createHistoryChange.ts +3 -3
  578. package/packages/diagrams/src/lib/utils/dividerUtils.tsx +59 -59
  579. package/packages/diagrams/src/lib/utils/edge-hooks.ts +53 -53
  580. package/packages/diagrams/src/lib/utils/elkLayout.ts +297 -297
  581. package/packages/diagrams/src/lib/utils/event-hooks.ts +69 -69
  582. package/packages/diagrams/src/lib/utils/event-store.ts +58 -58
  583. package/packages/diagrams/src/lib/utils/flow-node-hooks.ts +28 -28
  584. package/packages/diagrams/src/lib/utils/flow-to-js.ts +1465 -1465
  585. package/packages/diagrams/src/lib/utils/functionGenerator.ts +38 -38
  586. package/packages/diagrams/src/lib/utils/generateEdgesFromNodeOrder.ts +113 -113
  587. package/packages/diagrams/src/lib/utils/helpers.types.ts +10 -10
  588. package/packages/diagrams/src/lib/utils/highlightText.tsx +93 -93
  589. package/packages/diagrams/src/lib/utils/iconMapper.tsx +76 -76
  590. package/packages/diagrams/src/lib/utils/logger.ts +5 -5
  591. package/packages/diagrams/src/lib/utils/model-hooks.ts +129 -129
  592. package/packages/diagrams/src/lib/utils/node-hooks.ts +78 -78
  593. package/packages/diagrams/src/lib/utils/nodeAIAssistantConfig.ts +54 -54
  594. package/packages/diagrams/src/lib/utils/nodeOrderByEdges.ts +437 -437
  595. package/packages/diagrams/src/lib/utils/nodeutils.ts +242 -242
  596. package/packages/diagrams/src/lib/utils/object.ts +13 -13
  597. package/packages/diagrams/src/lib/utils/useDebounce.ts +19 -19
  598. package/packages/diagrams/src/lib/utils/utilities.ts +105 -105
  599. package/packages/diagrams/src/lib/utils/validationEngine.ts +610 -610
  600. package/packages/diagrams/src/lib/utils/vhToPixels.ts +9 -9
  601. package/packages/diagrams/tsconfig.json +21 -21
  602. package/packages/diagrams/tsconfig.lib.json +26 -25
  603. package/packages/diagrams/webpack.config.js +17 -17
  604. package/packages/interfaces/.babelrc +12 -12
  605. package/packages/interfaces/.eslintrc.json +18 -18
  606. package/packages/interfaces/README.md +7 -7
  607. package/packages/interfaces/project.json +8 -8
  608. package/packages/interfaces/src/index.ts +21 -21
  609. package/packages/interfaces/src/lib/Button.tsx +1 -1
  610. package/packages/interfaces/src/lib/DataGrid.ts +14 -14
  611. package/packages/interfaces/src/lib/StyledBox.tsx +1 -1
  612. package/packages/interfaces/src/lib/ToolbarItem.ts +7 -7
  613. package/packages/interfaces/src/lib/UserCard.ts +8 -8
  614. package/packages/interfaces/src/lib/yup.ts +3 -3
  615. package/packages/interfaces/tsconfig.json +17 -17
  616. package/packages/interfaces/tsconfig.lib.json +24 -24
  617. package/packages/molecules/.babelrc +12 -12
  618. package/packages/molecules/.eslintrc.json +18 -18
  619. package/packages/molecules/README.md +7 -7
  620. package/packages/molecules/project.json +8 -8
  621. package/packages/molecules/src/index.ts +47 -41
  622. package/packages/molecules/src/lib/ActionTextField/ActionTextField.module.css +7 -7
  623. package/packages/molecules/src/lib/ActionTextField/ActionTextField.spec.tsx +10 -10
  624. package/packages/molecules/src/lib/ActionTextField/ActionTextField.tsx +33 -33
  625. package/packages/molecules/src/lib/ClosableButton/CloseableButton.module.css +7 -7
  626. package/packages/molecules/src/lib/ClosableButton/CloseableButton.spec.tsx +11 -11
  627. package/packages/molecules/src/lib/ClosableButton/CloseableButton.tsx +69 -69
  628. package/packages/molecules/src/lib/EditorTab/EditorTab.module.css +7 -7
  629. package/packages/molecules/src/lib/EditorTab/EditorTab.spec.tsx +10 -10
  630. package/packages/molecules/src/lib/EditorTab/EditorTab.tsx +42 -42
  631. package/packages/molecules/src/lib/EditorTab/TabPanel.tsx +25 -25
  632. package/packages/molecules/src/lib/ParamsActionField/ParamsActionField.module.css +7 -7
  633. package/packages/molecules/src/lib/ParamsActionField/ParamsActionField.spec.tsx +10 -10
  634. package/packages/molecules/src/lib/ParamsActionField/ParamsActionField.tsx +24 -24
  635. package/packages/molecules/src/lib/SvgIcons/icons.tsx +323 -291
  636. package/packages/molecules/src/lib/SvgIcons/index.ts +31 -25
  637. package/packages/molecules/src/lib/SvgIcons/types.ts +7 -7
  638. package/packages/molecules/src/lib/TableWithInlineView/TableWithInlineView.module.css +7 -7
  639. package/packages/molecules/src/lib/TableWithInlineView/TableWithInlineView.spec.tsx +10 -10
  640. package/packages/molecules/src/lib/TableWithInlineView/TableWithInlineView.tsx +47 -47
  641. package/packages/molecules/src/lib/UserCard/UserCard.module.css +7 -7
  642. package/packages/molecules/src/lib/UserCard/UserCard.spec.tsx +11 -11
  643. package/packages/molecules/src/lib/UserCard/UserCard.tsx +22 -22
  644. package/packages/molecules/src/lib/VerbSelection/HTTPVerbSelection.module.css +7 -7
  645. package/packages/molecules/src/lib/VerbSelection/HTTPVerbSelection.spec.tsx +10 -10
  646. package/packages/molecules/src/lib/VerbSelection/HTTPVerbSelection.tsx +72 -72
  647. package/packages/molecules/tsconfig.json +17 -17
  648. package/packages/molecules/tsconfig.lib.json +30 -30
  649. package/packages/organisms/.babelrc +12 -12
  650. package/packages/organisms/.eslintrc.json +18 -18
  651. package/packages/organisms/README.md +7 -7
  652. package/packages/organisms/project.json +8 -8
  653. package/packages/organisms/src/index.ts +4 -4
  654. package/packages/organisms/src/lib/EditorToolbar/EditorToolbar.module.css +7 -7
  655. package/packages/organisms/src/lib/EditorToolbar/EditorToolbar.spec.tsx +10 -10
  656. package/packages/organisms/src/lib/EditorToolbar/EditorToolbar.tsx +117 -117
  657. package/packages/organisms/src/lib/EditorToolbar/SortableItem.tsx +51 -51
  658. package/packages/organisms/src/lib/UserList/UserList.module.css +7 -7
  659. package/packages/organisms/src/lib/UserList/UserList.spec.tsx +11 -11
  660. package/packages/organisms/src/lib/UserList/UserList.tsx +48 -48
  661. package/packages/organisms/src/lib/UserList/store.ts +49 -49
  662. package/packages/organisms/tsconfig.json +17 -17
  663. package/packages/organisms/tsconfig.lib.json +24 -24
  664. package/packages/zustand/.babelrc +12 -12
  665. package/packages/zustand/.eslintrc.json +18 -18
  666. package/packages/zustand/README.md +7 -7
  667. package/packages/zustand/project.json +8 -8
  668. package/packages/zustand/src/index.ts +4 -4
  669. package/packages/zustand/tsconfig.json +17 -17
  670. package/packages/zustand/tsconfig.lib.json +24 -24
  671. package/tsconfig.base.json +29 -29
  672. package/packages/diagrams/src/lib/components/automation/AutomationAISuggestionNode.tsx +0 -304
  673. package/packages/diagrams/src/lib/components/automation/AutomationEmailNode.tsx +0 -773
  674. package/packages/diagrams/src/lib/components/automation/AutomationGoogleServicesNode.tsx +0 -779
  675. package/packages/diagrams/src/lib/components/automation/AutomationNoteNode.tsx +0 -422
  676. package/packages/diagrams/src/lib/components/automation/AutomationSheetsNode.tsx +0 -1135
  677. package/packages/diagrams/src/lib/examples/GoogleSheetsConfigurationExamples.ts +0 -306
@@ -1,1063 +1,1063 @@
1
- import React, { useState } from 'react';
2
- import {
3
- Box,
4
- Typography,
5
- Select,
6
- MenuItem,
7
- Button,
8
- FormControl,
9
- Accordion,
10
- AccordionSummary,
11
- AccordionDetails,
12
- InputBase,
13
- InputAdornment,
14
- Dialog,
15
- DialogTitle,
16
- DialogContent,
17
- DialogActions,
18
- FormControlLabel,
19
- Checkbox,
20
- ButtonGroup,
21
- Divider,
22
- Alert,
23
- InputLabel,
24
- } from '@mui/material';
25
- import ExpandMoreIcon from '@mui/icons-material/ExpandMore';
26
- import SearchIcon from '@mui/icons-material/Search';
27
- import FileDownloadIcon from '@mui/icons-material/FileDownload';
28
- import ViewInArIcon from '@mui/icons-material/ViewInAr';
29
- import NetworkCheckIcon from '@mui/icons-material/NetworkCheck';
30
- import StorageIcon from '@mui/icons-material/Storage';
31
- import TableViewIcon from '@mui/icons-material/TableView';
32
- import SecurityIcon from '@mui/icons-material/Security';
33
- import BuildIcon from '@mui/icons-material/Build';
34
- import SmartToyIcon from '@mui/icons-material/SmartToy';
35
- import AnalyticsIcon from '@mui/icons-material/Analytics';
36
- import AppsIcon from '@mui/icons-material/Apps';
37
- import RouterIcon from '@mui/icons-material/Router';
38
- import SchemaIcon from '@mui/icons-material/Schema';
39
- import DataObjectIcon from '@mui/icons-material/DataObject';
40
- import { Node, XYPosition } from 'reactflow';
41
- import { getServiceIcon } from '../utils/serviceIcons';
42
- import {
43
- AWS_SERVICE_ICONS,
44
- AZURE_SERVICE_ICONS,
45
- GCP_SERVICE_ICONS,
46
- } from '../utils/iconMapping';
47
- import { AWS_CATEGORIES } from '../utils/aws-icons';
48
- import { AZURE_CATEGORIES } from '../utils/azure-icons';
49
- import { GCP_CATEGORIES } from '../utils/gcp-icons';
50
- import VpcIcon from '@mui/icons-material/AccountTree';
51
- import SubnetIcon from '@mui/icons-material/Hub';
52
- import AzIcon from '@mui/icons-material/Domain';
53
- import SecurityGroupIcon from '@mui/icons-material/Security';
54
- import SubscriptionIcon from '@mui/icons-material/Subscriptions';
55
- import ResourceGroupIcon from '@mui/icons-material/Folder';
56
- import VNetIcon from '@mui/icons-material/Cloud';
57
- import ProjectIcon from '@mui/icons-material/Business';
58
- import FolderIcon from '@mui/icons-material/FolderOpen';
59
- import AccountIcon from '@mui/icons-material/AccountBalance';
60
- import LocationOnIcon from '@mui/icons-material/LocationOn';
61
- import {
62
- extractNodeSemantics,
63
- extractNodeRestrictions,
64
- exportEnhancedDiagramData,
65
- } from '../utils/validationExtractor';
66
- import { CloudProvider } from '../types/validation';
67
- // Import data managers and validators
68
- import { diagramDataManager } from '../data/diagramManager';
69
- import { diagramValidator } from '../integration/diagramValidator';
70
-
71
- interface ServiceItem {
72
- type: 'serviceNode' | 'subnetNode';
73
- service: string;
74
- label: string;
75
- canBeChild?: boolean;
76
- icon?: React.ReactNode;
77
- description?: string;
78
- }
79
-
80
- interface PropertiesPanelProps {
81
- onAddNode: (
82
- type: string,
83
- service: string,
84
- position?: XYPosition,
85
- cloudProvider?: 'aws' | 'azure' | 'gcp',
86
- ) => void;
87
- nodes: Node[];
88
- edges?: any[];
89
- }
90
-
91
- type CategoryType =
92
- | (typeof AWS_CATEGORIES)[keyof typeof AWS_CATEGORIES]
93
- | (typeof AZURE_CATEGORIES)[keyof typeof AZURE_CATEGORIES]
94
- | (typeof GCP_CATEGORIES)[keyof typeof GCP_CATEGORIES];
95
-
96
- const PropertiesPanel: React.FC<PropertiesPanelProps> = ({
97
- onAddNode,
98
- nodes,
99
- edges = [],
100
- }) => {
101
- const [selectedProvider, setSelectedProvider] = useState<
102
- 'aws' | 'azure' | 'gcp' | ''
103
- >('');
104
- const [expandedProvider, setExpandedProvider] = useState<string | false>(
105
- false,
106
- );
107
- const [expandedCategory, setExpandedCategory] = useState<string | false>(
108
- false,
109
- );
110
- const [selectedAwsCategory, setSelectedAwsCategory] = useState<CategoryType>(
111
- AWS_CATEGORIES.COMPUTE,
112
- );
113
- const [selectedAzureCategory, setSelectedAzureCategory] =
114
- useState<CategoryType>(AZURE_CATEGORIES.COMPUTE);
115
- const [selectedGcpCategory, setSelectedGcpCategory] =
116
- useState<CategoryType>('Compute');
117
- const [isExportDialogOpen, setIsExportDialogOpen] = useState(false);
118
- const [exportOptions, setExportOptions] = useState({
119
- includeMetadata: true,
120
- });
121
-
122
- const handleProviderChange =
123
- (provider: string) =>
124
- (event: React.SyntheticEvent, isExpanded: boolean) => {
125
- setExpandedProvider(isExpanded ? provider : false);
126
- };
127
-
128
- const handleCategoryChange =
129
- (category: string) =>
130
- (event: React.SyntheticEvent, isExpanded: boolean) => {
131
- setExpandedCategory(isExpanded ? category : false);
132
- };
133
-
134
- // Export diagram data functionality
135
- const handleExport = () => {
136
- const { includeMetadata } = exportOptions;
137
-
138
- try {
139
- // Export user diagram data only
140
- exportDataFile(includeMetadata);
141
- console.log('User diagram data exported successfully');
142
-
143
- setIsExportDialogOpen(false);
144
- } catch (error) {
145
- console.error('Export failed:', error);
146
- }
147
- };
148
-
149
-
150
-
151
- const exportDataFile = (
152
- includeMetadata: boolean,
153
- ) => {
154
- try {
155
- // Use the enhanced diagram data export function
156
- const diagramData = exportEnhancedDiagramData(nodes, edges || []);
157
-
158
- const finalData = includeMetadata ? diagramData : diagramData.diagram;
159
- const content = JSON.stringify(finalData, null, 2);
160
-
161
- downloadFile(
162
- content,
163
- `cloud-architecture-data.json`,
164
- 'application/json',
165
- );
166
- } catch (error) {
167
- console.error('Error exporting data:', error);
168
- }
169
- };
170
-
171
- const downloadFile = (
172
- content: string,
173
- filename: string,
174
- mimeType: string,
175
- ) => {
176
- const blob = new Blob([content], { type: mimeType });
177
- const url = URL.createObjectURL(blob);
178
- const link = document.createElement('a');
179
- link.href = url;
180
- link.download = filename;
181
- document.body.appendChild(link);
182
- link.click();
183
- document.body.removeChild(link);
184
- URL.revokeObjectURL(url);
185
- };
186
-
187
- // Get icon for category
188
- const getCategoryIcon = (category: string) => {
189
- const lowerCategory = category.toLowerCase();
190
- if (lowerCategory.includes('container'))
191
- return <ViewInArIcon sx={{ color: 'gray', fontSize: '18px' }} />;
192
- if (lowerCategory.includes('network'))
193
- return <NetworkCheckIcon sx={{ color: 'gray', fontSize: '18px' }} />;
194
- if (lowerCategory.includes('storage'))
195
- return <StorageIcon sx={{ color: 'gray', fontSize: '18px' }} />;
196
- if (lowerCategory.includes('database'))
197
- return <TableViewIcon sx={{ color: 'gray', fontSize: '18px' }} />;
198
- if (lowerCategory.includes('security'))
199
- return <SecurityIcon sx={{ color: 'gray', fontSize: '18px' }} />;
200
- if (lowerCategory.includes('compute'))
201
- return <BuildIcon sx={{ color: 'gray', fontSize: '18px' }} />;
202
- if (lowerCategory.includes('ai') || lowerCategory.includes('ml'))
203
- return <SmartToyIcon sx={{ color: 'gray', fontSize: '18px' }} />;
204
- if (lowerCategory.includes('analytics'))
205
- return <AnalyticsIcon sx={{ color: 'gray', fontSize: '18px' }} />;
206
- if (lowerCategory.includes('application'))
207
- return <AppsIcon sx={{ color: 'gray', fontSize: '18px' }} />;
208
- if (lowerCategory.includes('iot'))
209
- return <RouterIcon sx={{ color: 'gray', fontSize: '18px' }} />;
210
- return <AppsIcon sx={{ color: 'gray', fontSize: '18px' }} />;
211
- };
212
-
213
- // Get categories based on selected provider
214
- const getProviderCategories = () => {
215
- switch (selectedProvider) {
216
- case 'aws':
217
- return Object.values(AWS_CATEGORIES);
218
- case 'azure':
219
- return Object.values(AZURE_CATEGORIES);
220
- case 'gcp':
221
- return Object.values(GCP_CATEGORIES);
222
- default:
223
- return [];
224
- }
225
- };
226
-
227
- // AWS Container Nodes - Following AWS hierarchy: Account → VPC → Subnet
228
- const awsContainerNodes: ServiceItem[] = [
229
- {
230
- type: 'subnetNode',
231
- service: 'account',
232
- label: 'AWS Account',
233
- canBeChild: false,
234
- icon: <AccountIcon sx={{ color: '#FF9900' }} />,
235
- description:
236
- 'Root container for all AWS resources - billing and access management boundary',
237
- },
238
- {
239
- type: 'subnetNode',
240
- service: 'vpc',
241
- label: 'Virtual Private Cloud (VPC)',
242
- canBeChild: true,
243
- icon: <VpcIcon sx={{ color: '#FF9900' }} />,
244
- description: 'Isolated network environment in AWS cloud',
245
- },
246
- {
247
- type: 'subnetNode',
248
- service: 'subnet',
249
- label: 'Subnet',
250
- canBeChild: true,
251
- icon: <SubnetIcon sx={{ color: '#FF9900' }} />,
252
- description: 'Range of IP addresses within a VPC',
253
- },
254
- {
255
- type: 'subnetNode',
256
- service: 'availability-zone',
257
- label: 'Availability Zone',
258
- canBeChild: true,
259
- icon: <AzIcon sx={{ color: '#FF9900' }} />,
260
- description: 'Distinct data center location within an AWS Region',
261
- },
262
- {
263
- type: 'subnetNode',
264
- service: 'local-zone',
265
- label: 'Local Zone',
266
- canBeChild: true,
267
- icon: <LocationOnIcon sx={{ color: '#FF9900' }} />,
268
- description: 'Edge location for ultra-low latency applications',
269
- },
270
- {
271
- type: 'subnetNode',
272
- service: 'security-group',
273
- label: 'Security Group',
274
- canBeChild: true,
275
- icon: <SecurityGroupIcon sx={{ color: '#FF9900' }} />,
276
- description:
277
- 'Virtual firewall for controlling inbound and outbound traffic',
278
- },
279
- ];
280
-
281
- // Azure Container Nodes - Following Azure hierarchy: Subscription → Resource Group → Virtual Network → Subnet
282
- const azureContainerNodes: ServiceItem[] = [
283
- {
284
- type: 'subnetNode',
285
- service: 'subscription',
286
- label: 'Azure Subscription',
287
- canBeChild: false,
288
- icon: <SubscriptionIcon sx={{ color: '#0078D4' }} />,
289
- description:
290
- 'Root container for all Azure resources - billing and access management boundary',
291
- },
292
- {
293
- type: 'subnetNode',
294
- service: 'resource-group',
295
- label: 'Resource Group',
296
- canBeChild: true,
297
- icon: <ResourceGroupIcon sx={{ color: '#0078D4' }} />,
298
- description:
299
- 'Logical container for resources that share the same lifecycle',
300
- },
301
- {
302
- type: 'subnetNode',
303
- service: 'virtual-network',
304
- label: 'Virtual Network (VNet)',
305
- canBeChild: true,
306
- icon: <VNetIcon sx={{ color: '#4099FF' }} />,
307
- description: 'Isolated network in Azure cloud - similar to AWS VPC',
308
- },
309
- {
310
- type: 'subnetNode',
311
- service: 'subnet',
312
- label: 'Subnet',
313
- canBeChild: true,
314
- icon: <SubnetIcon sx={{ color: '#4099FF' }} />,
315
- description: 'Range of IP addresses within a Virtual Network',
316
- },
317
- {
318
- type: 'subnetNode',
319
- service: 'network-security-group',
320
- label: 'Network Security Group',
321
- canBeChild: true,
322
- icon: <SecurityGroupIcon sx={{ color: '#FF6347' }} />,
323
- description: 'Virtual firewall for controlling network traffic',
324
- },
325
- ];
326
-
327
- // GCP Container Nodes - Following GCP hierarchy: Project → Folder → VPC → Subnet
328
- const gcpContainerNodes: ServiceItem[] = [
329
- {
330
- type: 'subnetNode',
331
- service: 'project',
332
- label: 'GCP Project',
333
- canBeChild: false,
334
- icon: <ProjectIcon sx={{ color: '#4285F4' }} />,
335
- description:
336
- 'Root container for all GCP resources - billing and access management boundary',
337
- },
338
- {
339
- type: 'subnetNode',
340
- service: 'folder',
341
- label: 'Folder',
342
- canBeChild: true,
343
- icon: <FolderIcon sx={{ color: '#34A853' }} />,
344
- description: 'Optional organization unit for grouping projects',
345
- },
346
- {
347
- type: 'subnetNode',
348
- service: 'vpc',
349
- label: 'VPC Network',
350
- canBeChild: true,
351
- icon: <VpcIcon sx={{ color: '#4285F4' }} />,
352
- description: 'Global virtual network in GCP - similar to AWS VPC',
353
- },
354
- {
355
- type: 'subnetNode',
356
- service: 'subnet',
357
- label: 'Subnet',
358
- canBeChild: true,
359
- icon: <SubnetIcon sx={{ color: '#4285F4' }} />,
360
- description: 'Regional IP range within a VPC Network',
361
- },
362
- ];
363
-
364
- // Get services for a specific category and provider
365
- const getServicesByCategory = (category: string) => {
366
- if (!selectedProvider) return [];
367
-
368
- let services: ServiceItem[] = [];
369
- let containerNodes: ServiceItem[] = [];
370
-
371
- switch (selectedProvider) {
372
- case 'aws':
373
- services = Object.entries(AWS_SERVICE_ICONS)
374
- .filter(([_, service]) => service.category === category)
375
- .map(([key, service]) => ({
376
- type: 'serviceNode',
377
- service: key,
378
- label: service.name,
379
- }));
380
- containerNodes = awsContainerNodes;
381
- break;
382
- case 'azure':
383
- services = Object.entries(AZURE_SERVICE_ICONS)
384
- .filter(([_, service]) => service.category === category)
385
- .map(([key, service]) => ({
386
- type: 'serviceNode',
387
- service: key,
388
- label: service.name,
389
- }));
390
- containerNodes = azureContainerNodes;
391
- break;
392
- case 'gcp':
393
- services = Object.entries(GCP_SERVICE_ICONS)
394
- .filter(([_, service]) => service.category === category)
395
- .map(([key, service]) => ({
396
- type: 'serviceNode',
397
- service: key,
398
- label: service.name,
399
- }));
400
- containerNodes = gcpContainerNodes;
401
- break;
402
- }
403
-
404
- // For container category, include container nodes
405
- if (
406
- category.toLowerCase().includes('container') ||
407
- category.toLowerCase().includes('compute')
408
- ) {
409
- return [...containerNodes, ...services];
410
- }
411
-
412
- return services;
413
- };
414
-
415
- // Get all AWS services for the selected category
416
- const awsServices: ServiceItem[] = Object.entries(AWS_SERVICE_ICONS)
417
- .filter(([_, service]) => service.category === selectedAwsCategory)
418
- .map(([key, service]) => ({
419
- type: 'serviceNode',
420
- service: key,
421
- label: service.name,
422
- }));
423
-
424
- // Get all Azure services for the selected category
425
- const azureServices: ServiceItem[] = Object.entries(AZURE_SERVICE_ICONS)
426
- .filter(([_, service]) => service.category === selectedAzureCategory)
427
- .map(([key, service]) => ({
428
- type: 'serviceNode',
429
- service: key,
430
- label: service.name,
431
- }));
432
-
433
- // Get all GCP services for the selected category
434
- const gcpServices: ServiceItem[] = Object.entries(GCP_SERVICE_ICONS)
435
- .filter(([_, service]) => {
436
- return service.category === selectedGcpCategory;
437
- })
438
- .map(([key, service]) => ({
439
- type: 'serviceNode',
440
- service: key,
441
- label: service.name,
442
- }));
443
-
444
- // Filter out container services from regular services
445
- const filteredAwsServices =
446
- selectedAwsCategory === AWS_CATEGORIES.NETWORKING
447
- ? awsServices.filter(
448
- (service) =>
449
- !['vpc', 'subnet', 'security-group'].includes(service.service),
450
- )
451
- : awsServices;
452
-
453
- const filteredAzureServices =
454
- selectedAzureCategory === AZURE_CATEGORIES.NETWORKING
455
- ? azureServices.filter(
456
- (service) => !['virtual-network', 'subnet'].includes(service.service),
457
- )
458
- : azureServices;
459
-
460
- const filteredGcpServices =
461
- selectedGcpCategory === 'Networking'
462
- ? gcpServices.filter(
463
- (service) => !['vpc', 'subnet'].includes(service.service),
464
- )
465
- : gcpServices;
466
-
467
- // Render services grid
468
- const renderServiceGrid = (
469
- services: ServiceItem[],
470
- cloudProvider: 'aws' | 'azure' | 'gcp' = 'aws',
471
- ) => (
472
- <Box
473
- sx={{
474
- display: 'grid',
475
- gridTemplateColumns: 'repeat(2, 1fr)',
476
- gap: 1.5,
477
- mt: 1,
478
- }}
479
- >
480
- {services.map((service) => {
481
- const icon =
482
- service.icon || getServiceIcon(service.service, cloudProvider);
483
-
484
- return (
485
- <Button
486
- key={service.service}
487
- draggable
488
- onDragStart={(e) => {
489
- const dragData = {
490
- service: service.service,
491
- nodeType: service.type,
492
- cloudProvider: cloudProvider,
493
- label: service.label,
494
- };
495
- e.dataTransfer.setData(
496
- 'application/json',
497
- JSON.stringify(dragData),
498
- );
499
- e.dataTransfer.effectAllowed = 'copy';
500
-
501
- // Add visual feedback
502
- e.currentTarget.style.opacity = '0.5';
503
- e.currentTarget.style.transform = 'scale(0.95)';
504
- }}
505
- onDragEnd={(e) => {
506
- // Reset visual feedback
507
- e.currentTarget.style.opacity = '1';
508
- e.currentTarget.style.transform = 'scale(1)';
509
- }}
510
- onClick={() =>
511
- onAddNode(service.type, service.service, undefined, cloudProvider)
512
- }
513
- sx={{
514
- p: 1,
515
- border: '1px solid #333',
516
- borderRadius: '8px',
517
- cursor: 'grab',
518
- textAlign: 'center',
519
- transition: 'all 0.2s ease',
520
- bgcolor: '#2a2a2a',
521
- '&:hover': {
522
- borderColor: '#61dafb',
523
- bgcolor: 'rgba(97, 218, 251, 0.1)',
524
- transform: 'translateY(-2px)',
525
- },
526
- '&:active': {
527
- cursor: 'grabbing',
528
- },
529
- display: 'flex',
530
- alignItems: 'center',
531
- gap: 1,
532
- minHeight: '60px',
533
- justifyContent: 'flex-start',
534
- textTransform: 'none',
535
- '& svg': {
536
- width: '20px',
537
- height: '20px',
538
- flexShrink: 0,
539
- },
540
- }}
541
- >
542
- <Box
543
- sx={{
544
- display: 'flex',
545
- alignItems: 'center',
546
- justifyContent: 'center',
547
- width: '24px',
548
- height: '24px',
549
- flexShrink: 0,
550
- }}
551
- >
552
- {icon}
553
- </Box>
554
- <Typography
555
- variant="body2"
556
- sx={{
557
- flexGrow: 1,
558
- textAlign: 'left',
559
- fontSize: '0.875rem',
560
- lineHeight: 1.2,
561
- overflow: 'hidden',
562
- textOverflow: 'ellipsis',
563
- whiteSpace: 'nowrap',
564
- }}
565
- >
566
- {service.label}
567
- </Typography>
568
- </Button>
569
- );
570
- })}
571
- </Box>
572
- );
573
-
574
- // Render services grid for categories
575
- const renderCategoryServices = (category: string) => {
576
- const services = getServicesByCategory(category);
577
-
578
- if (services.length === 0) {
579
- return (
580
- <Typography
581
- variant="body2"
582
- sx={{ color: '#666', textAlign: 'center', py: 2 }}
583
- >
584
- No services available for this category
585
- </Typography>
586
- );
587
- }
588
-
589
- return (
590
- <Box
591
- sx={{
592
- display: 'grid',
593
- gridTemplateColumns: 'repeat(2, 1fr)',
594
- gap: 2,
595
- mt: 1,
596
- }}
597
- >
598
- {services.map((service) => (
599
- <Box
600
- key={service.service}
601
- draggable
602
- onDragStart={(e) => {
603
- const dragData = {
604
- service: service.service,
605
- nodeType: service.type,
606
- cloudProvider:
607
- selectedProvider !== '' ? selectedProvider : 'aws',
608
- label: service.label,
609
- };
610
- e.dataTransfer.setData(
611
- 'application/json',
612
- JSON.stringify(dragData),
613
- );
614
- e.dataTransfer.effectAllowed = 'copy';
615
-
616
- // Add visual feedback
617
- e.currentTarget.style.opacity = '0.5';
618
- e.currentTarget.style.transform = 'scale(0.95)';
619
- }}
620
- onDragEnd={(e) => {
621
- // Reset visual feedback
622
- e.currentTarget.style.opacity = '1';
623
- e.currentTarget.style.transform = 'scale(1)';
624
- }}
625
- onClick={() =>
626
- onAddNode(
627
- service.type,
628
- service.service,
629
- undefined, // Let automatic assignment choose position
630
- selectedProvider !== '' ? selectedProvider : undefined,
631
- )
632
- }
633
- sx={{
634
- p: 1.5,
635
- border: '1px solid #333',
636
- borderRadius: '8px',
637
- cursor: 'grab',
638
- textAlign: 'center',
639
- transition: 'all 0.2s ease',
640
- bgcolor: '#2a2a2a',
641
- '&:hover': {
642
- borderColor: '#61dafb',
643
- bgcolor: 'rgba(97, 218, 251, 0.1)',
644
- transform: 'translateY(-2px)',
645
- },
646
- '&:active': {
647
- cursor: 'grabbing',
648
- },
649
- }}
650
- >
651
- <Box
652
- sx={{
653
- width: 40,
654
- height: 40,
655
- mx: 'auto',
656
- mb: 1,
657
- display: 'flex',
658
- alignItems: 'center',
659
- justifyContent: 'center',
660
- bgcolor: '#1a1a1a',
661
- borderRadius: '4px',
662
- }}
663
- >
664
- {service.icon ||
665
- getServiceIcon(
666
- service.service,
667
- selectedProvider !== '' ? selectedProvider : 'aws',
668
- )}
669
- </Box>
670
- <Typography
671
- variant="caption"
672
- sx={{
673
- color: '#fff',
674
- fontSize: '0.75rem',
675
- fontWeight: 500,
676
- lineHeight: 1.2,
677
- display: 'block',
678
- }}
679
- >
680
- {service.label}
681
- </Typography>
682
- </Box>
683
- ))}
684
- </Box>
685
- );
686
- };
687
-
688
- // Render category accordions for selected provider
689
- const renderCategoryAccordions = () => {
690
- if (!selectedProvider) return null;
691
-
692
- const categories = getProviderCategories();
693
-
694
- return (
695
- <Box sx={{ mt: 2 }}>
696
- {categories.map((category) => (
697
- <Accordion
698
- key={category}
699
- expanded={expandedCategory === category}
700
- onChange={handleCategoryChange(category)}
701
- sx={{
702
- mb: 2,
703
- bgcolor: 'transparent',
704
- color: '#fff',
705
- boxShadow: 'none',
706
- '&:before': {
707
- display: 'none',
708
- },
709
- border: 'none',
710
- borderBottom: '1px solid #333',
711
- borderRadius: '0 !important',
712
- '&.Mui-expanded': {
713
- margin: '0 0 16px 0',
714
- },
715
- }}
716
- >
717
- <AccordionSummary
718
- expandIcon={
719
- <ExpandMoreIcon sx={{ color: '#999', fontSize: '20px' }} />
720
- }
721
- sx={{
722
- borderRadius: '0',
723
- minHeight: '56px',
724
- px: 0,
725
- '&:hover': {
726
- bgcolor: 'transparent',
727
- },
728
- '& .MuiAccordionSummary-content': {
729
- margin: '12px 0',
730
- display: 'flex',
731
- alignItems: 'center',
732
- gap: 2,
733
- },
734
- }}
735
- >
736
- {getCategoryIcon(category)}
737
- <Typography
738
- sx={{
739
- fontWeight: 400,
740
- color: '#fff',
741
- fontSize: '1rem',
742
- }}
743
- >
744
- {category}
745
- </Typography>
746
- </AccordionSummary>
747
- <AccordionDetails sx={{ padding: '16px' }}>
748
- {renderCategoryServices(category)}
749
- </AccordionDetails>
750
- </Accordion>
751
- ))}
752
- </Box>
753
- );
754
- };
755
-
756
- return (
757
- <>
758
- <Box
759
- sx={{
760
- width: '100%',
761
- height: '100%',
762
- overflow: 'auto',
763
- bgcolor: '#1a1a1a',
764
- color: 'common.white',
765
- display: 'flex',
766
- flexDirection: 'column',
767
- }}
768
- >
769
- {/* Scrollable Content */}
770
- <Box
771
- sx={{
772
- flex: 1,
773
- overflowY: 'auto',
774
- px: 2,
775
- pb: 2,
776
- pt: 2,
777
- }}
778
- >
779
- <Box
780
- sx={{
781
- display: 'flex',
782
- alignItems: 'center',
783
- gap: 2,
784
- mb: 2,
785
- }}
786
- >
787
- <Button
788
- variant="contained"
789
- sx={{
790
- bgcolor: '#4C4CFF',
791
- color: 'white',
792
- fontSize: '0.875rem',
793
- fontWeight: 600,
794
- textTransform: 'none',
795
- borderRadius: '12px',
796
- px: 3,
797
- py: 0.5,
798
- border: '2px solid #4C4CFF',
799
- '&:hover': {
800
- bgcolor: '#3B3BFF',
801
- borderColor: '#3B3BFF',
802
- },
803
- }}
804
- >
805
- Templates
806
- </Button>
807
- <FormControl size="small" sx={{ minWidth: 140 }}>
808
- <Select
809
- value={selectedProvider}
810
- onChange={(e) =>
811
- setSelectedProvider(
812
- e.target.value as 'aws' | 'azure' | 'gcp' | '',
813
- )
814
- }
815
- displayEmpty
816
- sx={{
817
- color: '#fff',
818
- fontSize: '0.875rem',
819
- bgcolor: '#333',
820
- borderRadius: '12px',
821
- '& .MuiOutlinedInput-notchedOutline': {
822
- borderColor: '#444',
823
- },
824
- '&:hover .MuiOutlinedInput-notchedOutline': {
825
- borderColor: '#61dafb',
826
- },
827
- '&.Mui-focused .MuiOutlinedInput-notchedOutline': {
828
- borderColor: '#61dafb',
829
- },
830
- '& .MuiSelect-select': {
831
- display: 'flex',
832
- alignItems: 'center',
833
- gap: 1,
834
- py: 1.5,
835
- px: 2,
836
- },
837
- }}
838
- >
839
- <MenuItem value="">
840
- <Box sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>
841
- <Typography>Select Provider</Typography>
842
- </Box>
843
- </MenuItem>
844
- <MenuItem value="aws">
845
- <Box sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>
846
- <Box
847
- component="img"
848
- src="/aws-icons/compute/EC2.svg"
849
- alt="AWS"
850
- sx={{ width: 20, height: 20 }}
851
- />
852
- <Typography>AWS</Typography>
853
- </Box>
854
- </MenuItem>
855
- <MenuItem value="azure">
856
- <Box sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>
857
- <Box
858
- component="img"
859
- src="/azure-icons/compute/00195-icon-service-Maintenance-Configuration.svg"
860
- alt="Azure"
861
- sx={{ width: 20, height: 20 }}
862
- />
863
- <Typography>Azure</Typography>
864
- </Box>
865
- </MenuItem>
866
- <MenuItem value="gcp">
867
- <Box sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>
868
- <Box
869
- component="img"
870
- src="/gcp-icons/compute/compute-engine.svg"
871
- alt="GCP"
872
- sx={{ width: 20, height: 20 }}
873
- />
874
- <Typography>GCP</Typography>
875
- </Box>
876
- </MenuItem>
877
- </Select>
878
- </FormControl>
879
- </Box>
880
-
881
- <Box
882
- sx={{
883
- display: 'flex',
884
- alignItems: 'center',
885
- gap: 2,
886
- mb: 3,
887
- }}
888
- >
889
- <InputBase
890
- placeholder="Search design resources..."
891
- startAdornment={
892
- <InputAdornment position="start">
893
- <SearchIcon sx={{ color: '#999', fontSize: '20px' }} />
894
- </InputAdornment>
895
- }
896
- sx={{
897
- bgcolor: '#2a2a2a',
898
- borderRadius: '12px',
899
- px: 2,
900
- py: 1.25,
901
- color: 'white',
902
- width: '100%',
903
- fontSize: '14px',
904
- border: '1px solid #333',
905
- '& .MuiInputBase-input': {
906
- padding: 0,
907
- '&::placeholder': {
908
- color: '#999',
909
- opacity: 1,
910
- },
911
- },
912
- '& .MuiInputAdornment-root': {
913
- marginRight: 1,
914
- },
915
- }}
916
- />
917
- <Button
918
- variant="contained"
919
- onClick={() => setIsExportDialogOpen(true)}
920
- sx={{
921
- bgcolor: '#2a2a2a',
922
- borderRadius: '12px',
923
- px: 2,
924
- py: 1.25,
925
- color: 'white',
926
- border: '1px solid #333',
927
- minWidth: 'auto',
928
- '&:hover': {
929
- bgcolor: '#333',
930
- borderColor: '#61dafb',
931
- },
932
- }}
933
- title="Export with schema/data separation - choose what to export and format"
934
- >
935
- <FileDownloadIcon sx={{ color: '#61dafb', fontSize: '20px' }} />
936
- </Button>
937
- </Box>
938
-
939
- {/* Render category accordions based on selected provider */}
940
- {selectedProvider && renderCategoryAccordions()}
941
-
942
- {/* Show message when no provider is selected */}
943
- {!selectedProvider && (
944
- <Box
945
- sx={{
946
- textAlign: 'center',
947
- mt: 4,
948
- p: 3,
949
- border: '1px dashed #444',
950
- borderRadius: '8px',
951
- bgcolor: '#2a2a2a',
952
- }}
953
- >
954
- <Typography
955
- variant="body1"
956
- sx={{
957
- color: '#999',
958
- mb: 1,
959
- }}
960
- >
961
- Select a cloud provider to view services
962
- </Typography>
963
- <Typography
964
- variant="caption"
965
- sx={{
966
- color: '#666',
967
- }}
968
- >
969
- Choose AWS, Azure, or GCP from the dropdown above
970
- </Typography>
971
- </Box>
972
- )}
973
- </Box>
974
- </Box>
975
-
976
- {/* Diagram Data Export Dialog */}
977
- <Dialog
978
- open={isExportDialogOpen}
979
- onClose={() => setIsExportDialogOpen(false)}
980
- maxWidth="sm"
981
- fullWidth
982
- PaperProps={{
983
- sx: {
984
- bgcolor: '#1a1a1a',
985
- color: 'white',
986
- border: '1px solid #333',
987
- },
988
- }}
989
- >
990
- <DialogTitle
991
- sx={{
992
- bgcolor: '#2a2a2a',
993
- borderBottom: '1px solid #333',
994
- display: 'flex',
995
- alignItems: 'center',
996
- gap: 2,
997
- }}
998
- >
999
- <FileDownloadIcon sx={{ color: '#61dafb' }} />
1000
- Export Diagram Data
1001
- </DialogTitle>
1002
-
1003
- <DialogContent sx={{ p: 3 }}>
1004
- <Box sx={{ mb: 3 }}>
1005
- <Typography variant="body1" sx={{ color: '#ccc', mb: 3 }}>
1006
- Export your diagram as JSON containing all the nodes and edges you've created.
1007
- </Typography>
1008
-
1009
- <FormControlLabel
1010
- control={
1011
- <Checkbox
1012
- checked={exportOptions.includeMetadata}
1013
- onChange={(e) =>
1014
- setExportOptions((prev) => ({
1015
- ...prev,
1016
- includeMetadata: e.target.checked,
1017
- }))
1018
- }
1019
- sx={{ color: '#61dafb' }}
1020
- />
1021
- }
1022
- label="Include metadata (timestamps, counts, cloud providers)"
1023
- sx={{ color: '#ccc', mb: 2 }}
1024
- />
1025
-
1026
- <Typography variant="body2" sx={{ color: '#999' }}>
1027
- <strong>File:</strong> cloud-architecture-data.json<br/>
1028
- <strong>Content:</strong> Nodes, edges, positions, and diagram data
1029
- </Typography>
1030
- </Box>
1031
- </DialogContent>
1032
-
1033
- <DialogActions
1034
- sx={{
1035
- bgcolor: '#2a2a2a',
1036
- borderTop: '1px solid #333',
1037
- p: 2,
1038
- }}
1039
- >
1040
- <Button
1041
- onClick={() => setIsExportDialogOpen(false)}
1042
- sx={{ color: '#999' }}
1043
- >
1044
- Cancel
1045
- </Button>
1046
- <Button
1047
- onClick={handleExport}
1048
- variant="contained"
1049
- sx={{
1050
- bgcolor: '#61dafb',
1051
- color: '#000',
1052
- '&:hover': { bgcolor: '#4fc3f7' },
1053
- }}
1054
- >
1055
- Export Diagram Data
1056
- </Button>
1057
- </DialogActions>
1058
- </Dialog>
1059
- </>
1060
- );
1061
- };
1062
-
1063
- export default PropertiesPanel;
1
+ import React, { useState } from 'react';
2
+ import {
3
+ Box,
4
+ Typography,
5
+ Select,
6
+ MenuItem,
7
+ Button,
8
+ FormControl,
9
+ Accordion,
10
+ AccordionSummary,
11
+ AccordionDetails,
12
+ InputBase,
13
+ InputAdornment,
14
+ Dialog,
15
+ DialogTitle,
16
+ DialogContent,
17
+ DialogActions,
18
+ FormControlLabel,
19
+ Checkbox,
20
+ ButtonGroup,
21
+ Divider,
22
+ Alert,
23
+ InputLabel,
24
+ } from '@mui/material';
25
+ import ExpandMoreIcon from '@mui/icons-material/ExpandMore';
26
+ import SearchIcon from '@mui/icons-material/Search';
27
+ import FileDownloadIcon from '@mui/icons-material/FileDownload';
28
+ import ViewInArIcon from '@mui/icons-material/ViewInAr';
29
+ import NetworkCheckIcon from '@mui/icons-material/NetworkCheck';
30
+ import StorageIcon from '@mui/icons-material/Storage';
31
+ import TableViewIcon from '@mui/icons-material/TableView';
32
+ import SecurityIcon from '@mui/icons-material/Security';
33
+ import BuildIcon from '@mui/icons-material/Build';
34
+ import SmartToyIcon from '@mui/icons-material/SmartToy';
35
+ import AnalyticsIcon from '@mui/icons-material/Analytics';
36
+ import AppsIcon from '@mui/icons-material/Apps';
37
+ import RouterIcon from '@mui/icons-material/Router';
38
+ import SchemaIcon from '@mui/icons-material/Schema';
39
+ import DataObjectIcon from '@mui/icons-material/DataObject';
40
+ import { Node, XYPosition } from 'reactflow';
41
+ import { getServiceIcon } from '../utils/serviceIcons';
42
+ import {
43
+ AWS_SERVICE_ICONS,
44
+ AZURE_SERVICE_ICONS,
45
+ GCP_SERVICE_ICONS,
46
+ } from '../utils/iconMapping';
47
+ import { AWS_CATEGORIES } from '../utils/aws-icons';
48
+ import { AZURE_CATEGORIES } from '../utils/azure-icons';
49
+ import { GCP_CATEGORIES } from '../utils/gcp-icons';
50
+ import VpcIcon from '@mui/icons-material/AccountTree';
51
+ import SubnetIcon from '@mui/icons-material/Hub';
52
+ import AzIcon from '@mui/icons-material/Domain';
53
+ import SecurityGroupIcon from '@mui/icons-material/Security';
54
+ import SubscriptionIcon from '@mui/icons-material/Subscriptions';
55
+ import ResourceGroupIcon from '@mui/icons-material/Folder';
56
+ import VNetIcon from '@mui/icons-material/Cloud';
57
+ import ProjectIcon from '@mui/icons-material/Business';
58
+ import FolderIcon from '@mui/icons-material/FolderOpen';
59
+ import AccountIcon from '@mui/icons-material/AccountBalance';
60
+ import LocationOnIcon from '@mui/icons-material/LocationOn';
61
+ import {
62
+ extractNodeSemantics,
63
+ extractNodeRestrictions,
64
+ exportEnhancedDiagramData,
65
+ } from '../utils/validationExtractor';
66
+ import { CloudProvider } from '../types/validation';
67
+ // Import data managers and validators
68
+ import { diagramDataManager } from '../data/diagramManager';
69
+ import { diagramValidator } from '../integration/diagramValidator';
70
+
71
+ interface ServiceItem {
72
+ type: 'serviceNode' | 'subnetNode';
73
+ service: string;
74
+ label: string;
75
+ canBeChild?: boolean;
76
+ icon?: React.ReactNode;
77
+ description?: string;
78
+ }
79
+
80
+ interface PropertiesPanelProps {
81
+ onAddNode: (
82
+ type: string,
83
+ service: string,
84
+ position?: XYPosition,
85
+ cloudProvider?: 'aws' | 'azure' | 'gcp',
86
+ ) => void;
87
+ nodes: Node[];
88
+ edges?: any[];
89
+ }
90
+
91
+ type CategoryType =
92
+ | (typeof AWS_CATEGORIES)[keyof typeof AWS_CATEGORIES]
93
+ | (typeof AZURE_CATEGORIES)[keyof typeof AZURE_CATEGORIES]
94
+ | (typeof GCP_CATEGORIES)[keyof typeof GCP_CATEGORIES];
95
+
96
+ const PropertiesPanel: React.FC<PropertiesPanelProps> = ({
97
+ onAddNode,
98
+ nodes,
99
+ edges = [],
100
+ }) => {
101
+ const [selectedProvider, setSelectedProvider] = useState<
102
+ 'aws' | 'azure' | 'gcp' | ''
103
+ >('');
104
+ const [expandedProvider, setExpandedProvider] = useState<string | false>(
105
+ false,
106
+ );
107
+ const [expandedCategory, setExpandedCategory] = useState<string | false>(
108
+ false,
109
+ );
110
+ const [selectedAwsCategory, setSelectedAwsCategory] = useState<CategoryType>(
111
+ AWS_CATEGORIES.COMPUTE,
112
+ );
113
+ const [selectedAzureCategory, setSelectedAzureCategory] =
114
+ useState<CategoryType>(AZURE_CATEGORIES.COMPUTE);
115
+ const [selectedGcpCategory, setSelectedGcpCategory] =
116
+ useState<CategoryType>('Compute');
117
+ const [isExportDialogOpen, setIsExportDialogOpen] = useState(false);
118
+ const [exportOptions, setExportOptions] = useState({
119
+ includeMetadata: true,
120
+ });
121
+
122
+ const handleProviderChange =
123
+ (provider: string) =>
124
+ (event: React.SyntheticEvent, isExpanded: boolean) => {
125
+ setExpandedProvider(isExpanded ? provider : false);
126
+ };
127
+
128
+ const handleCategoryChange =
129
+ (category: string) =>
130
+ (event: React.SyntheticEvent, isExpanded: boolean) => {
131
+ setExpandedCategory(isExpanded ? category : false);
132
+ };
133
+
134
+ // Export diagram data functionality
135
+ const handleExport = () => {
136
+ const { includeMetadata } = exportOptions;
137
+
138
+ try {
139
+ // Export user diagram data only
140
+ exportDataFile(includeMetadata);
141
+ console.log('User diagram data exported successfully');
142
+
143
+ setIsExportDialogOpen(false);
144
+ } catch (error) {
145
+ console.error('Export failed:', error);
146
+ }
147
+ };
148
+
149
+
150
+
151
+ const exportDataFile = (
152
+ includeMetadata: boolean,
153
+ ) => {
154
+ try {
155
+ // Use the enhanced diagram data export function
156
+ const diagramData = exportEnhancedDiagramData(nodes, edges || []);
157
+
158
+ const finalData = includeMetadata ? diagramData : diagramData.diagram;
159
+ const content = JSON.stringify(finalData, null, 2);
160
+
161
+ downloadFile(
162
+ content,
163
+ `cloud-architecture-data.json`,
164
+ 'application/json',
165
+ );
166
+ } catch (error) {
167
+ console.error('Error exporting data:', error);
168
+ }
169
+ };
170
+
171
+ const downloadFile = (
172
+ content: string,
173
+ filename: string,
174
+ mimeType: string,
175
+ ) => {
176
+ const blob = new Blob([content], { type: mimeType });
177
+ const url = URL.createObjectURL(blob);
178
+ const link = document.createElement('a');
179
+ link.href = url;
180
+ link.download = filename;
181
+ document.body.appendChild(link);
182
+ link.click();
183
+ document.body.removeChild(link);
184
+ URL.revokeObjectURL(url);
185
+ };
186
+
187
+ // Get icon for category
188
+ const getCategoryIcon = (category: string) => {
189
+ const lowerCategory = category.toLowerCase();
190
+ if (lowerCategory.includes('container'))
191
+ return <ViewInArIcon sx={{ color: 'gray', fontSize: '18px' }} />;
192
+ if (lowerCategory.includes('network'))
193
+ return <NetworkCheckIcon sx={{ color: 'gray', fontSize: '18px' }} />;
194
+ if (lowerCategory.includes('storage'))
195
+ return <StorageIcon sx={{ color: 'gray', fontSize: '18px' }} />;
196
+ if (lowerCategory.includes('database'))
197
+ return <TableViewIcon sx={{ color: 'gray', fontSize: '18px' }} />;
198
+ if (lowerCategory.includes('security'))
199
+ return <SecurityIcon sx={{ color: 'gray', fontSize: '18px' }} />;
200
+ if (lowerCategory.includes('compute'))
201
+ return <BuildIcon sx={{ color: 'gray', fontSize: '18px' }} />;
202
+ if (lowerCategory.includes('ai') || lowerCategory.includes('ml'))
203
+ return <SmartToyIcon sx={{ color: 'gray', fontSize: '18px' }} />;
204
+ if (lowerCategory.includes('analytics'))
205
+ return <AnalyticsIcon sx={{ color: 'gray', fontSize: '18px' }} />;
206
+ if (lowerCategory.includes('application'))
207
+ return <AppsIcon sx={{ color: 'gray', fontSize: '18px' }} />;
208
+ if (lowerCategory.includes('iot'))
209
+ return <RouterIcon sx={{ color: 'gray', fontSize: '18px' }} />;
210
+ return <AppsIcon sx={{ color: 'gray', fontSize: '18px' }} />;
211
+ };
212
+
213
+ // Get categories based on selected provider
214
+ const getProviderCategories = () => {
215
+ switch (selectedProvider) {
216
+ case 'aws':
217
+ return Object.values(AWS_CATEGORIES);
218
+ case 'azure':
219
+ return Object.values(AZURE_CATEGORIES);
220
+ case 'gcp':
221
+ return Object.values(GCP_CATEGORIES);
222
+ default:
223
+ return [];
224
+ }
225
+ };
226
+
227
+ // AWS Container Nodes - Following AWS hierarchy: Account → VPC → Subnet
228
+ const awsContainerNodes: ServiceItem[] = [
229
+ {
230
+ type: 'subnetNode',
231
+ service: 'account',
232
+ label: 'AWS Account',
233
+ canBeChild: false,
234
+ icon: <AccountIcon sx={{ color: '#FF9900' }} />,
235
+ description:
236
+ 'Root container for all AWS resources - billing and access management boundary',
237
+ },
238
+ {
239
+ type: 'subnetNode',
240
+ service: 'vpc',
241
+ label: 'Virtual Private Cloud (VPC)',
242
+ canBeChild: true,
243
+ icon: <VpcIcon sx={{ color: '#FF9900' }} />,
244
+ description: 'Isolated network environment in AWS cloud',
245
+ },
246
+ {
247
+ type: 'subnetNode',
248
+ service: 'subnet',
249
+ label: 'Subnet',
250
+ canBeChild: true,
251
+ icon: <SubnetIcon sx={{ color: '#FF9900' }} />,
252
+ description: 'Range of IP addresses within a VPC',
253
+ },
254
+ {
255
+ type: 'subnetNode',
256
+ service: 'availability-zone',
257
+ label: 'Availability Zone',
258
+ canBeChild: true,
259
+ icon: <AzIcon sx={{ color: '#FF9900' }} />,
260
+ description: 'Distinct data center location within an AWS Region',
261
+ },
262
+ {
263
+ type: 'subnetNode',
264
+ service: 'local-zone',
265
+ label: 'Local Zone',
266
+ canBeChild: true,
267
+ icon: <LocationOnIcon sx={{ color: '#FF9900' }} />,
268
+ description: 'Edge location for ultra-low latency applications',
269
+ },
270
+ {
271
+ type: 'subnetNode',
272
+ service: 'security-group',
273
+ label: 'Security Group',
274
+ canBeChild: true,
275
+ icon: <SecurityGroupIcon sx={{ color: '#FF9900' }} />,
276
+ description:
277
+ 'Virtual firewall for controlling inbound and outbound traffic',
278
+ },
279
+ ];
280
+
281
+ // Azure Container Nodes - Following Azure hierarchy: Subscription → Resource Group → Virtual Network → Subnet
282
+ const azureContainerNodes: ServiceItem[] = [
283
+ {
284
+ type: 'subnetNode',
285
+ service: 'subscription',
286
+ label: 'Azure Subscription',
287
+ canBeChild: false,
288
+ icon: <SubscriptionIcon sx={{ color: '#0078D4' }} />,
289
+ description:
290
+ 'Root container for all Azure resources - billing and access management boundary',
291
+ },
292
+ {
293
+ type: 'subnetNode',
294
+ service: 'resource-group',
295
+ label: 'Resource Group',
296
+ canBeChild: true,
297
+ icon: <ResourceGroupIcon sx={{ color: '#0078D4' }} />,
298
+ description:
299
+ 'Logical container for resources that share the same lifecycle',
300
+ },
301
+ {
302
+ type: 'subnetNode',
303
+ service: 'virtual-network',
304
+ label: 'Virtual Network (VNet)',
305
+ canBeChild: true,
306
+ icon: <VNetIcon sx={{ color: '#4099FF' }} />,
307
+ description: 'Isolated network in Azure cloud - similar to AWS VPC',
308
+ },
309
+ {
310
+ type: 'subnetNode',
311
+ service: 'subnet',
312
+ label: 'Subnet',
313
+ canBeChild: true,
314
+ icon: <SubnetIcon sx={{ color: '#4099FF' }} />,
315
+ description: 'Range of IP addresses within a Virtual Network',
316
+ },
317
+ {
318
+ type: 'subnetNode',
319
+ service: 'network-security-group',
320
+ label: 'Network Security Group',
321
+ canBeChild: true,
322
+ icon: <SecurityGroupIcon sx={{ color: '#FF6347' }} />,
323
+ description: 'Virtual firewall for controlling network traffic',
324
+ },
325
+ ];
326
+
327
+ // GCP Container Nodes - Following GCP hierarchy: Project → Folder → VPC → Subnet
328
+ const gcpContainerNodes: ServiceItem[] = [
329
+ {
330
+ type: 'subnetNode',
331
+ service: 'project',
332
+ label: 'GCP Project',
333
+ canBeChild: false,
334
+ icon: <ProjectIcon sx={{ color: '#4285F4' }} />,
335
+ description:
336
+ 'Root container for all GCP resources - billing and access management boundary',
337
+ },
338
+ {
339
+ type: 'subnetNode',
340
+ service: 'folder',
341
+ label: 'Folder',
342
+ canBeChild: true,
343
+ icon: <FolderIcon sx={{ color: '#34A853' }} />,
344
+ description: 'Optional organization unit for grouping projects',
345
+ },
346
+ {
347
+ type: 'subnetNode',
348
+ service: 'vpc',
349
+ label: 'VPC Network',
350
+ canBeChild: true,
351
+ icon: <VpcIcon sx={{ color: '#4285F4' }} />,
352
+ description: 'Global virtual network in GCP - similar to AWS VPC',
353
+ },
354
+ {
355
+ type: 'subnetNode',
356
+ service: 'subnet',
357
+ label: 'Subnet',
358
+ canBeChild: true,
359
+ icon: <SubnetIcon sx={{ color: '#4285F4' }} />,
360
+ description: 'Regional IP range within a VPC Network',
361
+ },
362
+ ];
363
+
364
+ // Get services for a specific category and provider
365
+ const getServicesByCategory = (category: string) => {
366
+ if (!selectedProvider) return [];
367
+
368
+ let services: ServiceItem[] = [];
369
+ let containerNodes: ServiceItem[] = [];
370
+
371
+ switch (selectedProvider) {
372
+ case 'aws':
373
+ services = Object.entries(AWS_SERVICE_ICONS)
374
+ .filter(([_, service]) => service.category === category)
375
+ .map(([key, service]) => ({
376
+ type: 'serviceNode',
377
+ service: key,
378
+ label: service.name,
379
+ }));
380
+ containerNodes = awsContainerNodes;
381
+ break;
382
+ case 'azure':
383
+ services = Object.entries(AZURE_SERVICE_ICONS)
384
+ .filter(([_, service]) => service.category === category)
385
+ .map(([key, service]) => ({
386
+ type: 'serviceNode',
387
+ service: key,
388
+ label: service.name,
389
+ }));
390
+ containerNodes = azureContainerNodes;
391
+ break;
392
+ case 'gcp':
393
+ services = Object.entries(GCP_SERVICE_ICONS)
394
+ .filter(([_, service]) => service.category === category)
395
+ .map(([key, service]) => ({
396
+ type: 'serviceNode',
397
+ service: key,
398
+ label: service.name,
399
+ }));
400
+ containerNodes = gcpContainerNodes;
401
+ break;
402
+ }
403
+
404
+ // For container category, include container nodes
405
+ if (
406
+ category.toLowerCase().includes('container') ||
407
+ category.toLowerCase().includes('compute')
408
+ ) {
409
+ return [...containerNodes, ...services];
410
+ }
411
+
412
+ return services;
413
+ };
414
+
415
+ // Get all AWS services for the selected category
416
+ const awsServices: ServiceItem[] = Object.entries(AWS_SERVICE_ICONS)
417
+ .filter(([_, service]) => service.category === selectedAwsCategory)
418
+ .map(([key, service]) => ({
419
+ type: 'serviceNode',
420
+ service: key,
421
+ label: service.name,
422
+ }));
423
+
424
+ // Get all Azure services for the selected category
425
+ const azureServices: ServiceItem[] = Object.entries(AZURE_SERVICE_ICONS)
426
+ .filter(([_, service]) => service.category === selectedAzureCategory)
427
+ .map(([key, service]) => ({
428
+ type: 'serviceNode',
429
+ service: key,
430
+ label: service.name,
431
+ }));
432
+
433
+ // Get all GCP services for the selected category
434
+ const gcpServices: ServiceItem[] = Object.entries(GCP_SERVICE_ICONS)
435
+ .filter(([_, service]) => {
436
+ return service.category === selectedGcpCategory;
437
+ })
438
+ .map(([key, service]) => ({
439
+ type: 'serviceNode',
440
+ service: key,
441
+ label: service.name,
442
+ }));
443
+
444
+ // Filter out container services from regular services
445
+ const filteredAwsServices =
446
+ selectedAwsCategory === AWS_CATEGORIES.NETWORKING
447
+ ? awsServices.filter(
448
+ (service) =>
449
+ !['vpc', 'subnet', 'security-group'].includes(service.service),
450
+ )
451
+ : awsServices;
452
+
453
+ const filteredAzureServices =
454
+ selectedAzureCategory === AZURE_CATEGORIES.NETWORKING
455
+ ? azureServices.filter(
456
+ (service) => !['virtual-network', 'subnet'].includes(service.service),
457
+ )
458
+ : azureServices;
459
+
460
+ const filteredGcpServices =
461
+ selectedGcpCategory === 'Networking'
462
+ ? gcpServices.filter(
463
+ (service) => !['vpc', 'subnet'].includes(service.service),
464
+ )
465
+ : gcpServices;
466
+
467
+ // Render services grid
468
+ const renderServiceGrid = (
469
+ services: ServiceItem[],
470
+ cloudProvider: 'aws' | 'azure' | 'gcp' = 'aws',
471
+ ) => (
472
+ <Box
473
+ sx={{
474
+ display: 'grid',
475
+ gridTemplateColumns: 'repeat(2, 1fr)',
476
+ gap: 1.5,
477
+ mt: 1,
478
+ }}
479
+ >
480
+ {services.map((service) => {
481
+ const icon =
482
+ service.icon || getServiceIcon(service.service, cloudProvider);
483
+
484
+ return (
485
+ <Button
486
+ key={service.service}
487
+ draggable
488
+ onDragStart={(e) => {
489
+ const dragData = {
490
+ service: service.service,
491
+ nodeType: service.type,
492
+ cloudProvider: cloudProvider,
493
+ label: service.label,
494
+ };
495
+ e.dataTransfer.setData(
496
+ 'application/json',
497
+ JSON.stringify(dragData),
498
+ );
499
+ e.dataTransfer.effectAllowed = 'copy';
500
+
501
+ // Add visual feedback
502
+ e.currentTarget.style.opacity = '0.5';
503
+ e.currentTarget.style.transform = 'scale(0.95)';
504
+ }}
505
+ onDragEnd={(e) => {
506
+ // Reset visual feedback
507
+ e.currentTarget.style.opacity = '1';
508
+ e.currentTarget.style.transform = 'scale(1)';
509
+ }}
510
+ onClick={() =>
511
+ onAddNode(service.type, service.service, undefined, cloudProvider)
512
+ }
513
+ sx={{
514
+ p: 1,
515
+ border: '1px solid #333',
516
+ borderRadius: '8px',
517
+ cursor: 'grab',
518
+ textAlign: 'center',
519
+ transition: 'all 0.2s ease',
520
+ bgcolor: '#2a2a2a',
521
+ '&:hover': {
522
+ borderColor: '#61dafb',
523
+ bgcolor: 'rgba(97, 218, 251, 0.1)',
524
+ transform: 'translateY(-2px)',
525
+ },
526
+ '&:active': {
527
+ cursor: 'grabbing',
528
+ },
529
+ display: 'flex',
530
+ alignItems: 'center',
531
+ gap: 1,
532
+ minHeight: '60px',
533
+ justifyContent: 'flex-start',
534
+ textTransform: 'none',
535
+ '& svg': {
536
+ width: '20px',
537
+ height: '20px',
538
+ flexShrink: 0,
539
+ },
540
+ }}
541
+ >
542
+ <Box
543
+ sx={{
544
+ display: 'flex',
545
+ alignItems: 'center',
546
+ justifyContent: 'center',
547
+ width: '24px',
548
+ height: '24px',
549
+ flexShrink: 0,
550
+ }}
551
+ >
552
+ {icon}
553
+ </Box>
554
+ <Typography
555
+ variant="body2"
556
+ sx={{
557
+ flexGrow: 1,
558
+ textAlign: 'left',
559
+ fontSize: '0.875rem',
560
+ lineHeight: 1.2,
561
+ overflow: 'hidden',
562
+ textOverflow: 'ellipsis',
563
+ whiteSpace: 'nowrap',
564
+ }}
565
+ >
566
+ {service.label}
567
+ </Typography>
568
+ </Button>
569
+ );
570
+ })}
571
+ </Box>
572
+ );
573
+
574
+ // Render services grid for categories
575
+ const renderCategoryServices = (category: string) => {
576
+ const services = getServicesByCategory(category);
577
+
578
+ if (services.length === 0) {
579
+ return (
580
+ <Typography
581
+ variant="body2"
582
+ sx={{ color: '#666', textAlign: 'center', py: 2 }}
583
+ >
584
+ No services available for this category
585
+ </Typography>
586
+ );
587
+ }
588
+
589
+ return (
590
+ <Box
591
+ sx={{
592
+ display: 'grid',
593
+ gridTemplateColumns: 'repeat(2, 1fr)',
594
+ gap: 2,
595
+ mt: 1,
596
+ }}
597
+ >
598
+ {services.map((service) => (
599
+ <Box
600
+ key={service.service}
601
+ draggable
602
+ onDragStart={(e) => {
603
+ const dragData = {
604
+ service: service.service,
605
+ nodeType: service.type,
606
+ cloudProvider:
607
+ selectedProvider !== '' ? selectedProvider : 'aws',
608
+ label: service.label,
609
+ };
610
+ e.dataTransfer.setData(
611
+ 'application/json',
612
+ JSON.stringify(dragData),
613
+ );
614
+ e.dataTransfer.effectAllowed = 'copy';
615
+
616
+ // Add visual feedback
617
+ e.currentTarget.style.opacity = '0.5';
618
+ e.currentTarget.style.transform = 'scale(0.95)';
619
+ }}
620
+ onDragEnd={(e) => {
621
+ // Reset visual feedback
622
+ e.currentTarget.style.opacity = '1';
623
+ e.currentTarget.style.transform = 'scale(1)';
624
+ }}
625
+ onClick={() =>
626
+ onAddNode(
627
+ service.type,
628
+ service.service,
629
+ undefined, // Let automatic assignment choose position
630
+ selectedProvider !== '' ? selectedProvider : undefined,
631
+ )
632
+ }
633
+ sx={{
634
+ p: 1.5,
635
+ border: '1px solid #333',
636
+ borderRadius: '8px',
637
+ cursor: 'grab',
638
+ textAlign: 'center',
639
+ transition: 'all 0.2s ease',
640
+ bgcolor: '#2a2a2a',
641
+ '&:hover': {
642
+ borderColor: '#61dafb',
643
+ bgcolor: 'rgba(97, 218, 251, 0.1)',
644
+ transform: 'translateY(-2px)',
645
+ },
646
+ '&:active': {
647
+ cursor: 'grabbing',
648
+ },
649
+ }}
650
+ >
651
+ <Box
652
+ sx={{
653
+ width: 40,
654
+ height: 40,
655
+ mx: 'auto',
656
+ mb: 1,
657
+ display: 'flex',
658
+ alignItems: 'center',
659
+ justifyContent: 'center',
660
+ bgcolor: '#1a1a1a',
661
+ borderRadius: '4px',
662
+ }}
663
+ >
664
+ {service.icon ||
665
+ getServiceIcon(
666
+ service.service,
667
+ selectedProvider !== '' ? selectedProvider : 'aws',
668
+ )}
669
+ </Box>
670
+ <Typography
671
+ variant="caption"
672
+ sx={{
673
+ color: '#fff',
674
+ fontSize: '0.75rem',
675
+ fontWeight: 500,
676
+ lineHeight: 1.2,
677
+ display: 'block',
678
+ }}
679
+ >
680
+ {service.label}
681
+ </Typography>
682
+ </Box>
683
+ ))}
684
+ </Box>
685
+ );
686
+ };
687
+
688
+ // Render category accordions for selected provider
689
+ const renderCategoryAccordions = () => {
690
+ if (!selectedProvider) return null;
691
+
692
+ const categories = getProviderCategories();
693
+
694
+ return (
695
+ <Box sx={{ mt: 2 }}>
696
+ {categories.map((category) => (
697
+ <Accordion
698
+ key={category}
699
+ expanded={expandedCategory === category}
700
+ onChange={handleCategoryChange(category)}
701
+ sx={{
702
+ mb: 2,
703
+ bgcolor: 'transparent',
704
+ color: '#fff',
705
+ boxShadow: 'none',
706
+ '&:before': {
707
+ display: 'none',
708
+ },
709
+ border: 'none',
710
+ borderBottom: '1px solid #333',
711
+ borderRadius: '0 !important',
712
+ '&.Mui-expanded': {
713
+ margin: '0 0 16px 0',
714
+ },
715
+ }}
716
+ >
717
+ <AccordionSummary
718
+ expandIcon={
719
+ <ExpandMoreIcon sx={{ color: '#999', fontSize: '20px' }} />
720
+ }
721
+ sx={{
722
+ borderRadius: '0',
723
+ minHeight: '56px',
724
+ px: 0,
725
+ '&:hover': {
726
+ bgcolor: 'transparent',
727
+ },
728
+ '& .MuiAccordionSummary-content': {
729
+ margin: '12px 0',
730
+ display: 'flex',
731
+ alignItems: 'center',
732
+ gap: 2,
733
+ },
734
+ }}
735
+ >
736
+ {getCategoryIcon(category)}
737
+ <Typography
738
+ sx={{
739
+ fontWeight: 400,
740
+ color: '#fff',
741
+ fontSize: '1rem',
742
+ }}
743
+ >
744
+ {category}
745
+ </Typography>
746
+ </AccordionSummary>
747
+ <AccordionDetails sx={{ padding: '16px' }}>
748
+ {renderCategoryServices(category)}
749
+ </AccordionDetails>
750
+ </Accordion>
751
+ ))}
752
+ </Box>
753
+ );
754
+ };
755
+
756
+ return (
757
+ <>
758
+ <Box
759
+ sx={{
760
+ width: '100%',
761
+ height: '100%',
762
+ overflow: 'auto',
763
+ bgcolor: '#1a1a1a',
764
+ color: 'common.white',
765
+ display: 'flex',
766
+ flexDirection: 'column',
767
+ }}
768
+ >
769
+ {/* Scrollable Content */}
770
+ <Box
771
+ sx={{
772
+ flex: 1,
773
+ overflowY: 'auto',
774
+ px: 2,
775
+ pb: 2,
776
+ pt: 2,
777
+ }}
778
+ >
779
+ <Box
780
+ sx={{
781
+ display: 'flex',
782
+ alignItems: 'center',
783
+ gap: 2,
784
+ mb: 2,
785
+ }}
786
+ >
787
+ <Button
788
+ variant="contained"
789
+ sx={{
790
+ bgcolor: '#4C4CFF',
791
+ color: 'white',
792
+ fontSize: '0.875rem',
793
+ fontWeight: 600,
794
+ textTransform: 'none',
795
+ borderRadius: '12px',
796
+ px: 3,
797
+ py: 0.5,
798
+ border: '2px solid #4C4CFF',
799
+ '&:hover': {
800
+ bgcolor: '#3B3BFF',
801
+ borderColor: '#3B3BFF',
802
+ },
803
+ }}
804
+ >
805
+ Templates
806
+ </Button>
807
+ <FormControl size="small" sx={{ minWidth: 140 }}>
808
+ <Select
809
+ value={selectedProvider}
810
+ onChange={(e) =>
811
+ setSelectedProvider(
812
+ e.target.value as 'aws' | 'azure' | 'gcp' | '',
813
+ )
814
+ }
815
+ displayEmpty
816
+ sx={{
817
+ color: '#fff',
818
+ fontSize: '0.875rem',
819
+ bgcolor: '#333',
820
+ borderRadius: '12px',
821
+ '& .MuiOutlinedInput-notchedOutline': {
822
+ borderColor: '#444',
823
+ },
824
+ '&:hover .MuiOutlinedInput-notchedOutline': {
825
+ borderColor: '#61dafb',
826
+ },
827
+ '&.Mui-focused .MuiOutlinedInput-notchedOutline': {
828
+ borderColor: '#61dafb',
829
+ },
830
+ '& .MuiSelect-select': {
831
+ display: 'flex',
832
+ alignItems: 'center',
833
+ gap: 1,
834
+ py: 1.5,
835
+ px: 2,
836
+ },
837
+ }}
838
+ >
839
+ <MenuItem value="">
840
+ <Box sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>
841
+ <Typography>Select Provider</Typography>
842
+ </Box>
843
+ </MenuItem>
844
+ <MenuItem value="aws">
845
+ <Box sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>
846
+ <Box
847
+ component="img"
848
+ src="/aws-icons/compute/EC2.svg"
849
+ alt="AWS"
850
+ sx={{ width: 20, height: 20 }}
851
+ />
852
+ <Typography>AWS</Typography>
853
+ </Box>
854
+ </MenuItem>
855
+ <MenuItem value="azure">
856
+ <Box sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>
857
+ <Box
858
+ component="img"
859
+ src="/azure-icons/compute/00195-icon-service-Maintenance-Configuration.svg"
860
+ alt="Azure"
861
+ sx={{ width: 20, height: 20 }}
862
+ />
863
+ <Typography>Azure</Typography>
864
+ </Box>
865
+ </MenuItem>
866
+ <MenuItem value="gcp">
867
+ <Box sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>
868
+ <Box
869
+ component="img"
870
+ src="/gcp-icons/compute/compute-engine.svg"
871
+ alt="GCP"
872
+ sx={{ width: 20, height: 20 }}
873
+ />
874
+ <Typography>GCP</Typography>
875
+ </Box>
876
+ </MenuItem>
877
+ </Select>
878
+ </FormControl>
879
+ </Box>
880
+
881
+ <Box
882
+ sx={{
883
+ display: 'flex',
884
+ alignItems: 'center',
885
+ gap: 2,
886
+ mb: 3,
887
+ }}
888
+ >
889
+ <InputBase
890
+ placeholder="Search design resources..."
891
+ startAdornment={
892
+ <InputAdornment position="start">
893
+ <SearchIcon sx={{ color: '#999', fontSize: '20px' }} />
894
+ </InputAdornment>
895
+ }
896
+ sx={{
897
+ bgcolor: '#2a2a2a',
898
+ borderRadius: '12px',
899
+ px: 2,
900
+ py: 1.25,
901
+ color: 'white',
902
+ width: '100%',
903
+ fontSize: '14px',
904
+ border: '1px solid #333',
905
+ '& .MuiInputBase-input': {
906
+ padding: 0,
907
+ '&::placeholder': {
908
+ color: '#999',
909
+ opacity: 1,
910
+ },
911
+ },
912
+ '& .MuiInputAdornment-root': {
913
+ marginRight: 1,
914
+ },
915
+ }}
916
+ />
917
+ <Button
918
+ variant="contained"
919
+ onClick={() => setIsExportDialogOpen(true)}
920
+ sx={{
921
+ bgcolor: '#2a2a2a',
922
+ borderRadius: '12px',
923
+ px: 2,
924
+ py: 1.25,
925
+ color: 'white',
926
+ border: '1px solid #333',
927
+ minWidth: 'auto',
928
+ '&:hover': {
929
+ bgcolor: '#333',
930
+ borderColor: '#61dafb',
931
+ },
932
+ }}
933
+ title="Export with schema/data separation - choose what to export and format"
934
+ >
935
+ <FileDownloadIcon sx={{ color: '#61dafb', fontSize: '20px' }} />
936
+ </Button>
937
+ </Box>
938
+
939
+ {/* Render category accordions based on selected provider */}
940
+ {selectedProvider && renderCategoryAccordions()}
941
+
942
+ {/* Show message when no provider is selected */}
943
+ {!selectedProvider && (
944
+ <Box
945
+ sx={{
946
+ textAlign: 'center',
947
+ mt: 4,
948
+ p: 3,
949
+ border: '1px dashed #444',
950
+ borderRadius: '8px',
951
+ bgcolor: '#2a2a2a',
952
+ }}
953
+ >
954
+ <Typography
955
+ variant="body1"
956
+ sx={{
957
+ color: '#999',
958
+ mb: 1,
959
+ }}
960
+ >
961
+ Select a cloud provider to view services
962
+ </Typography>
963
+ <Typography
964
+ variant="caption"
965
+ sx={{
966
+ color: '#666',
967
+ }}
968
+ >
969
+ Choose AWS, Azure, or GCP from the dropdown above
970
+ </Typography>
971
+ </Box>
972
+ )}
973
+ </Box>
974
+ </Box>
975
+
976
+ {/* Diagram Data Export Dialog */}
977
+ <Dialog
978
+ open={isExportDialogOpen}
979
+ onClose={() => setIsExportDialogOpen(false)}
980
+ maxWidth="sm"
981
+ fullWidth
982
+ PaperProps={{
983
+ sx: {
984
+ bgcolor: '#1a1a1a',
985
+ color: 'white',
986
+ border: '1px solid #333',
987
+ },
988
+ }}
989
+ >
990
+ <DialogTitle
991
+ sx={{
992
+ bgcolor: '#2a2a2a',
993
+ borderBottom: '1px solid #333',
994
+ display: 'flex',
995
+ alignItems: 'center',
996
+ gap: 2,
997
+ }}
998
+ >
999
+ <FileDownloadIcon sx={{ color: '#61dafb' }} />
1000
+ Export Diagram Data
1001
+ </DialogTitle>
1002
+
1003
+ <DialogContent sx={{ p: 3 }}>
1004
+ <Box sx={{ mb: 3 }}>
1005
+ <Typography variant="body1" sx={{ color: '#ccc', mb: 3 }}>
1006
+ Export your diagram as JSON containing all the nodes and edges you've created.
1007
+ </Typography>
1008
+
1009
+ <FormControlLabel
1010
+ control={
1011
+ <Checkbox
1012
+ checked={exportOptions.includeMetadata}
1013
+ onChange={(e) =>
1014
+ setExportOptions((prev) => ({
1015
+ ...prev,
1016
+ includeMetadata: e.target.checked,
1017
+ }))
1018
+ }
1019
+ sx={{ color: '#61dafb' }}
1020
+ />
1021
+ }
1022
+ label="Include metadata (timestamps, counts, cloud providers)"
1023
+ sx={{ color: '#ccc', mb: 2 }}
1024
+ />
1025
+
1026
+ <Typography variant="body2" sx={{ color: '#999' }}>
1027
+ <strong>File:</strong> cloud-architecture-data.json<br/>
1028
+ <strong>Content:</strong> Nodes, edges, positions, and diagram data
1029
+ </Typography>
1030
+ </Box>
1031
+ </DialogContent>
1032
+
1033
+ <DialogActions
1034
+ sx={{
1035
+ bgcolor: '#2a2a2a',
1036
+ borderTop: '1px solid #333',
1037
+ p: 2,
1038
+ }}
1039
+ >
1040
+ <Button
1041
+ onClick={() => setIsExportDialogOpen(false)}
1042
+ sx={{ color: '#999' }}
1043
+ >
1044
+ Cancel
1045
+ </Button>
1046
+ <Button
1047
+ onClick={handleExport}
1048
+ variant="contained"
1049
+ sx={{
1050
+ bgcolor: '#61dafb',
1051
+ color: '#000',
1052
+ '&:hover': { bgcolor: '#4fc3f7' },
1053
+ }}
1054
+ >
1055
+ Export Diagram Data
1056
+ </Button>
1057
+ </DialogActions>
1058
+ </Dialog>
1059
+ </>
1060
+ );
1061
+ };
1062
+
1063
+ export default PropertiesPanel;