@massdriver/backstage-plugin 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (346) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +196 -0
  3. package/dist/MassdriverRouter.esm.js +78 -0
  4. package/dist/MassdriverRouter.esm.js.map +1 -0
  5. package/dist/api.esm.js +119 -0
  6. package/dist/api.esm.js.map +1 -0
  7. package/dist/assets/massdriver-logo-dark.svg +55 -0
  8. package/dist/assets/massdriver-logo-light.svg +50 -0
  9. package/dist/components/AttributesColumn.esm.js +95 -0
  10. package/dist/components/AttributesColumn.esm.js.map +1 -0
  11. package/dist/components/AttributesSummaryCell.esm.js +103 -0
  12. package/dist/components/AttributesSummaryCell.esm.js.map +1 -0
  13. package/dist/components/AuthedIcon.esm.js +26 -0
  14. package/dist/components/AuthedIcon.esm.js.map +1 -0
  15. package/dist/components/ConditionsCell.esm.js +48 -0
  16. package/dist/components/ConditionsCell.esm.js.map +1 -0
  17. package/dist/components/DisabledAction.esm.js +30 -0
  18. package/dist/components/DisabledAction.esm.js.map +1 -0
  19. package/dist/components/EntityMassdriverContent/EntityMassdriverContent.esm.js +80 -0
  20. package/dist/components/EntityMassdriverContent/EntityMassdriverContent.esm.js.map +1 -0
  21. package/dist/components/EntityMassdriverContent/index.esm.js +6 -0
  22. package/dist/components/EntityMassdriverContent/index.esm.js.map +1 -0
  23. package/dist/components/EntityMassdriverOverviewCard/EntityMassdriverOverviewCard.esm.js +75 -0
  24. package/dist/components/EntityMassdriverOverviewCard/EntityMassdriverOverviewCard.esm.js.map +1 -0
  25. package/dist/components/EntityMassdriverOverviewCard/index.esm.js +6 -0
  26. package/dist/components/EntityMassdriverOverviewCard/index.esm.js.map +1 -0
  27. package/dist/components/ForkPill.esm.js +84 -0
  28. package/dist/components/ForkPill.esm.js.map +1 -0
  29. package/dist/components/InstanceStatusIndicator.esm.js +21 -0
  30. package/dist/components/InstanceStatusIndicator.esm.js.map +1 -0
  31. package/dist/components/InstanceStatusPill.esm.js +67 -0
  32. package/dist/components/InstanceStatusPill.esm.js.map +1 -0
  33. package/dist/components/MassdriverIcon.esm.js +13 -0
  34. package/dist/components/MassdriverIcon.esm.js.map +1 -0
  35. package/dist/components/MassdriverSidebarItem.esm.js +45 -0
  36. package/dist/components/MassdriverSidebarItem.esm.js.map +1 -0
  37. package/dist/components/NotFound.esm.js +44 -0
  38. package/dist/components/NotFound.esm.js.map +1 -0
  39. package/dist/components/OpenInMassdriverButton.esm.js +24 -0
  40. package/dist/components/OpenInMassdriverButton.esm.js.map +1 -0
  41. package/dist/components/PageLayout.esm.js +88 -0
  42. package/dist/components/PageLayout.esm.js.map +1 -0
  43. package/dist/components/RouterLinkAdapter.esm.js +12 -0
  44. package/dist/components/RouterLinkAdapter.esm.js.map +1 -0
  45. package/dist/components/VersionBadge.esm.js +57 -0
  46. package/dist/components/VersionBadge.esm.js.map +1 -0
  47. package/dist/components/grantColumns.esm.js +56 -0
  48. package/dist/components/grantColumns.esm.js.map +1 -0
  49. package/dist/components/icons/BundleIcon.esm.js +7 -0
  50. package/dist/components/icons/BundleIcon.esm.js.map +1 -0
  51. package/dist/components/icons/FolderOutlinedIcon.esm.js +7 -0
  52. package/dist/components/icons/FolderOutlinedIcon.esm.js.map +1 -0
  53. package/dist/components/icons/TokenIcon.esm.js +7 -0
  54. package/dist/components/icons/TokenIcon.esm.js.map +1 -0
  55. package/dist/entity.esm.js +23 -0
  56. package/dist/entity.esm.js.map +1 -0
  57. package/dist/features/environment/CompareDeploymentsDialog/CompareDeploymentsDialog.esm.js +115 -0
  58. package/dist/features/environment/CompareDeploymentsDialog/CompareDeploymentsDialog.esm.js.map +1 -0
  59. package/dist/features/environment/CompareDeploymentsDialog/ResultsStep.esm.js +165 -0
  60. package/dist/features/environment/CompareDeploymentsDialog/ResultsStep.esm.js.map +1 -0
  61. package/dist/features/environment/CompareDeploymentsDialog/SelectStep.esm.js +216 -0
  62. package/dist/features/environment/CompareDeploymentsDialog/SelectStep.esm.js.map +1 -0
  63. package/dist/features/environment/CompareDeploymentsDialog/compareColumns.esm.js +86 -0
  64. package/dist/features/environment/CompareDeploymentsDialog/compareColumns.esm.js.map +1 -0
  65. package/dist/features/environment/CompareDeploymentsDialog/flattenDeploymentComparison.esm.js +57 -0
  66. package/dist/features/environment/CompareDeploymentsDialog/flattenDeploymentComparison.esm.js.map +1 -0
  67. package/dist/features/environment/CompareDeploymentsDialog/queries.esm.js +53 -0
  68. package/dist/features/environment/CompareDeploymentsDialog/queries.esm.js.map +1 -0
  69. package/dist/features/environment/CompareEnvironmentsDialog/CompareEnvironmentsDialog.esm.js +94 -0
  70. package/dist/features/environment/CompareEnvironmentsDialog/CompareEnvironmentsDialog.esm.js.map +1 -0
  71. package/dist/features/environment/CompareEnvironmentsDialog/ComparisonValueCell.esm.js +67 -0
  72. package/dist/features/environment/CompareEnvironmentsDialog/ComparisonValueCell.esm.js.map +1 -0
  73. package/dist/features/environment/CompareEnvironmentsDialog/ResultsStep.esm.js +202 -0
  74. package/dist/features/environment/CompareEnvironmentsDialog/ResultsStep.esm.js.map +1 -0
  75. package/dist/features/environment/CompareEnvironmentsDialog/SelectStep.esm.js +183 -0
  76. package/dist/features/environment/CompareEnvironmentsDialog/SelectStep.esm.js.map +1 -0
  77. package/dist/features/environment/CompareEnvironmentsDialog/compareColumns.esm.js +73 -0
  78. package/dist/features/environment/CompareEnvironmentsDialog/compareColumns.esm.js.map +1 -0
  79. package/dist/features/environment/CompareEnvironmentsDialog/flattenComparison.esm.js +70 -0
  80. package/dist/features/environment/CompareEnvironmentsDialog/flattenComparison.esm.js.map +1 -0
  81. package/dist/features/environment/CompareEnvironmentsDialog/queries.esm.js +32 -0
  82. package/dist/features/environment/CompareEnvironmentsDialog/queries.esm.js.map +1 -0
  83. package/dist/features/environment/EnvironmentGraphPage.esm.js +131 -0
  84. package/dist/features/environment/EnvironmentGraphPage.esm.js.map +1 -0
  85. package/dist/features/environment/GraphHeader/EnvironmentDefaults.esm.js +252 -0
  86. package/dist/features/environment/GraphHeader/EnvironmentDefaults.esm.js.map +1 -0
  87. package/dist/features/environment/GraphHeader/GraphHeader.esm.js +247 -0
  88. package/dist/features/environment/GraphHeader/GraphHeader.esm.js.map +1 -0
  89. package/dist/features/environment/GraphHeader/HeaderActions.esm.js +127 -0
  90. package/dist/features/environment/GraphHeader/HeaderActions.esm.js.map +1 -0
  91. package/dist/features/environment/GraphHeader/Switcher.esm.js +75 -0
  92. package/dist/features/environment/GraphHeader/Switcher.esm.js.map +1 -0
  93. package/dist/features/environment/GraphHeader/queries.esm.js +60 -0
  94. package/dist/features/environment/GraphHeader/queries.esm.js.map +1 -0
  95. package/dist/features/environment/InstanceDrawer/AlarmCard.esm.js +151 -0
  96. package/dist/features/environment/InstanceDrawer/AlarmCard.esm.js.map +1 -0
  97. package/dist/features/environment/InstanceDrawer/InstanceDrawer.esm.js +165 -0
  98. package/dist/features/environment/InstanceDrawer/InstanceDrawer.esm.js.map +1 -0
  99. package/dist/features/environment/InstanceDrawer/InstanceDrawerHeader.esm.js +241 -0
  100. package/dist/features/environment/InstanceDrawer/InstanceDrawerHeader.esm.js.map +1 -0
  101. package/dist/features/environment/InstanceDrawer/InstanceTabs.esm.js +119 -0
  102. package/dist/features/environment/InstanceDrawer/InstanceTabs.esm.js.map +1 -0
  103. package/dist/features/environment/InstanceDrawer/TabState.esm.js +30 -0
  104. package/dist/features/environment/InstanceDrawer/TabState.esm.js.map +1 -0
  105. package/dist/features/environment/InstanceDrawer/formsDataSource.esm.js +25 -0
  106. package/dist/features/environment/InstanceDrawer/formsDataSource.esm.js.map +1 -0
  107. package/dist/features/environment/InstanceDrawer/helpers.esm.js +282 -0
  108. package/dist/features/environment/InstanceDrawer/helpers.esm.js.map +1 -0
  109. package/dist/features/environment/InstanceDrawer/queries.esm.js +281 -0
  110. package/dist/features/environment/InstanceDrawer/queries.esm.js.map +1 -0
  111. package/dist/features/environment/InstanceDrawer/tabs/ConfigTab.esm.js +170 -0
  112. package/dist/features/environment/InstanceDrawer/tabs/ConfigTab.esm.js.map +1 -0
  113. package/dist/features/environment/InstanceDrawer/tabs/DependenciesTab.esm.js +413 -0
  114. package/dist/features/environment/InstanceDrawer/tabs/DependenciesTab.esm.js.map +1 -0
  115. package/dist/features/environment/InstanceDrawer/tabs/DeploymentLogsPanel.esm.js +191 -0
  116. package/dist/features/environment/InstanceDrawer/tabs/DeploymentLogsPanel.esm.js.map +1 -0
  117. package/dist/features/environment/InstanceDrawer/tabs/DeploymentReadOnlyActions.esm.js +63 -0
  118. package/dist/features/environment/InstanceDrawer/tabs/DeploymentReadOnlyActions.esm.js.map +1 -0
  119. package/dist/features/environment/InstanceDrawer/tabs/GuideTab.esm.js +48 -0
  120. package/dist/features/environment/InstanceDrawer/tabs/GuideTab.esm.js.map +1 -0
  121. package/dist/features/environment/InstanceDrawer/tabs/HistoryTab.esm.js +446 -0
  122. package/dist/features/environment/InstanceDrawer/tabs/HistoryTab.esm.js.map +1 -0
  123. package/dist/features/environment/InstanceDrawer/tabs/MonitorTab.esm.js +146 -0
  124. package/dist/features/environment/InstanceDrawer/tabs/MonitorTab.esm.js.map +1 -0
  125. package/dist/features/environment/InstanceDrawer/tabs/OverviewTab.esm.js +572 -0
  126. package/dist/features/environment/InstanceDrawer/tabs/OverviewTab.esm.js.map +1 -0
  127. package/dist/features/environment/InstanceDrawer/tabs/ResourcesTab.esm.js +471 -0
  128. package/dist/features/environment/InstanceDrawer/tabs/ResourcesTab.esm.js.map +1 -0
  129. package/dist/features/environment/InstanceDrawer/tabs/SecretsTab.esm.js +109 -0
  130. package/dist/features/environment/InstanceDrawer/tabs/SecretsTab.esm.js.map +1 -0
  131. package/dist/features/environment/InstanceDrawer/tabs/ViewDeploymentDetails.esm.js +384 -0
  132. package/dist/features/environment/InstanceDrawer/tabs/ViewDeploymentDetails.esm.js.map +1 -0
  133. package/dist/features/environment/InstanceDrawer/tabs/flattenParams.esm.js +23 -0
  134. package/dist/features/environment/InstanceDrawer/tabs/flattenParams.esm.js.map +1 -0
  135. package/dist/features/environment/InstanceDrawer/useInstanceApiQuery.esm.js +6 -0
  136. package/dist/features/environment/InstanceDrawer/useInstanceApiQuery.esm.js.map +1 -0
  137. package/dist/features/environment/InstanceDrawer/useOverflowMeasure.esm.js +55 -0
  138. package/dist/features/environment/InstanceDrawer/useOverflowMeasure.esm.js.map +1 -0
  139. package/dist/features/environment/InstanceDrawer/useResizableWidth.esm.js +44 -0
  140. package/dist/features/environment/InstanceDrawer/useResizableWidth.esm.js.map +1 -0
  141. package/dist/features/environment/components/InstanceStatusPill.esm.js +54 -0
  142. package/dist/features/environment/components/InstanceStatusPill.esm.js.map +1 -0
  143. package/dist/features/environment/graph/Diagram.esm.js +143 -0
  144. package/dist/features/environment/graph/Diagram.esm.js.map +1 -0
  145. package/dist/features/environment/graph/DiagramNode.constants.esm.js +5 -0
  146. package/dist/features/environment/graph/DiagramNode.constants.esm.js.map +1 -0
  147. package/dist/features/environment/graph/DiagramNode.esm.js +221 -0
  148. package/dist/features/environment/graph/DiagramNode.esm.js.map +1 -0
  149. package/dist/features/environment/graph/NodeMeta.esm.js +182 -0
  150. package/dist/features/environment/graph/NodeMeta.esm.js.map +1 -0
  151. package/dist/features/environment/graph/NodeVersionBadges.esm.js +150 -0
  152. package/dist/features/environment/graph/NodeVersionBadges.esm.js.map +1 -0
  153. package/dist/features/environment/graph/diagramFactory.esm.js +151 -0
  154. package/dist/features/environment/graph/diagramFactory.esm.js.map +1 -0
  155. package/dist/features/environment/graph/handles/ExpandableHandleWrapper.esm.js +174 -0
  156. package/dist/features/environment/graph/handles/ExpandableHandleWrapper.esm.js.map +1 -0
  157. package/dist/features/environment/graph/handles/NodeHandle.esm.js +45 -0
  158. package/dist/features/environment/graph/handles/NodeHandle.esm.js.map +1 -0
  159. package/dist/features/environment/graph/handles/NodeHandleTooltip.esm.js +134 -0
  160. package/dist/features/environment/graph/handles/NodeHandleTooltip.esm.js.map +1 -0
  161. package/dist/features/environment/graph/handles/handleTypes.esm.js +170 -0
  162. package/dist/features/environment/graph/handles/handleTypes.esm.js.map +1 -0
  163. package/dist/features/environment/graph/handles/useAnimationFrameSync.esm.js +19 -0
  164. package/dist/features/environment/graph/handles/useAnimationFrameSync.esm.js.map +1 -0
  165. package/dist/features/environment/graph/handles/useRadialPositions.esm.js +37 -0
  166. package/dist/features/environment/graph/handles/useRadialPositions.esm.js.map +1 -0
  167. package/dist/features/environment/graph/handles/useTransitionLifecycle.esm.js +19 -0
  168. package/dist/features/environment/graph/handles/useTransitionLifecycle.esm.js.map +1 -0
  169. package/dist/features/environment/graph/hasUndeployedPlan.esm.js +43 -0
  170. package/dist/features/environment/graph/hasUndeployedPlan.esm.js.map +1 -0
  171. package/dist/features/environment/graph/queries.esm.js +103 -0
  172. package/dist/features/environment/graph/queries.esm.js.map +1 -0
  173. package/dist/features/environment/graph/useDiagramSnapshot.esm.js +43 -0
  174. package/dist/features/environment/graph/useDiagramSnapshot.esm.js.map +1 -0
  175. package/dist/features/environment/realtime/RealtimeProvider.esm.js +43 -0
  176. package/dist/features/environment/realtime/RealtimeProvider.esm.js.map +1 -0
  177. package/dist/features/environment/realtime/queries.esm.js +76 -0
  178. package/dist/features/environment/realtime/queries.esm.js.map +1 -0
  179. package/dist/features/environment/realtime/useLiveRelayQuery.esm.js +36 -0
  180. package/dist/features/environment/realtime/useLiveRelayQuery.esm.js.map +1 -0
  181. package/dist/features/project/ProjectDetailsPage.esm.js +101 -0
  182. package/dist/features/project/ProjectDetailsPage.esm.js.map +1 -0
  183. package/dist/features/project/tabs/ComponentsTab.esm.js +149 -0
  184. package/dist/features/project/tabs/ComponentsTab.esm.js.map +1 -0
  185. package/dist/features/project/tabs/EnvStatus.esm.js +149 -0
  186. package/dist/features/project/tabs/EnvStatus.esm.js.map +1 -0
  187. package/dist/features/project/tabs/EnvironmentsTab.esm.js +199 -0
  188. package/dist/features/project/tabs/EnvironmentsTab.esm.js.map +1 -0
  189. package/dist/features/project/tabs/OverviewTab.esm.js +420 -0
  190. package/dist/features/project/tabs/OverviewTab.esm.js.map +1 -0
  191. package/dist/features/projects/ProjectsListPage.esm.js +50 -0
  192. package/dist/features/projects/ProjectsListPage.esm.js.map +1 -0
  193. package/dist/features/projects/ProjectsListPageLazy.esm.js +12 -0
  194. package/dist/features/projects/ProjectsListPageLazy.esm.js.map +1 -0
  195. package/dist/features/projects/projectColumns.esm.js +38 -0
  196. package/dist/features/projects/projectColumns.esm.js.map +1 -0
  197. package/dist/features/projects/useProjects.esm.js +48 -0
  198. package/dist/features/projects/useProjects.esm.js.map +1 -0
  199. package/dist/features/repo/DeploymentLogsDrawer.esm.js +213 -0
  200. package/dist/features/repo/DeploymentLogsDrawer.esm.js.map +1 -0
  201. package/dist/features/repo/DeploymentLogsDrawer.loading.esm.js +43 -0
  202. package/dist/features/repo/DeploymentLogsDrawer.loading.esm.js.map +1 -0
  203. package/dist/features/repo/FileTree.esm.js +179 -0
  204. package/dist/features/repo/FileTree.esm.js.map +1 -0
  205. package/dist/features/repo/FileViewer.esm.js +115 -0
  206. package/dist/features/repo/FileViewer.esm.js.map +1 -0
  207. package/dist/features/repo/FileViewer.helpers.esm.js +54 -0
  208. package/dist/features/repo/FileViewer.helpers.esm.js.map +1 -0
  209. package/dist/features/repo/RepoDetailsPage.esm.js +127 -0
  210. package/dist/features/repo/RepoDetailsPage.esm.js.map +1 -0
  211. package/dist/features/repo/RepoEmptyState.esm.js +58 -0
  212. package/dist/features/repo/RepoEmptyState.esm.js.map +1 -0
  213. package/dist/features/repo/RepoNoVersionsState.esm.js +29 -0
  214. package/dist/features/repo/RepoNoVersionsState.esm.js.map +1 -0
  215. package/dist/features/repo/RepoTabHeader.esm.js +30 -0
  216. package/dist/features/repo/RepoTabHeader.esm.js.map +1 -0
  217. package/dist/features/repo/RepoTabLayout.esm.js +18 -0
  218. package/dist/features/repo/RepoTabLayout.esm.js.map +1 -0
  219. package/dist/features/repo/RepoVersionSelect.esm.js +176 -0
  220. package/dist/features/repo/RepoVersionSelect.esm.js.map +1 -0
  221. package/dist/features/repo/ViewDeploymentDetailsDialog.esm.js +427 -0
  222. package/dist/features/repo/ViewDeploymentDetailsDialog.esm.js.map +1 -0
  223. package/dist/features/repo/deploymentHelpers.esm.js +74 -0
  224. package/dist/features/repo/deploymentHelpers.esm.js.map +1 -0
  225. package/dist/features/repo/fileTreeHelpers.esm.js +45 -0
  226. package/dist/features/repo/fileTreeHelpers.esm.js.map +1 -0
  227. package/dist/features/repo/flattenParams.esm.js +23 -0
  228. package/dist/features/repo/flattenParams.esm.js.map +1 -0
  229. package/dist/features/repo/queries.esm.js +239 -0
  230. package/dist/features/repo/queries.esm.js.map +1 -0
  231. package/dist/features/repo/repoFilter.esm.js +9 -0
  232. package/dist/features/repo/repoFilter.esm.js.map +1 -0
  233. package/dist/features/repo/repoTabs.esm.js +22 -0
  234. package/dist/features/repo/repoTabs.esm.js.map +1 -0
  235. package/dist/features/repo/resolveVersion.esm.js +22 -0
  236. package/dist/features/repo/resolveVersion.esm.js.map +1 -0
  237. package/dist/features/repo/tabs/DeploymentRow.esm.js +201 -0
  238. package/dist/features/repo/tabs/DeploymentRow.esm.js.map +1 -0
  239. package/dist/features/repo/tabs/DeploymentsTab.esm.js +188 -0
  240. package/dist/features/repo/tabs/DeploymentsTab.esm.js.map +1 -0
  241. package/dist/features/repo/tabs/DeploymentsTab.helpers.esm.js +46 -0
  242. package/dist/features/repo/tabs/DeploymentsTab.helpers.esm.js.map +1 -0
  243. package/dist/features/repo/tabs/DeploymentsTab.loading.esm.js +37 -0
  244. package/dist/features/repo/tabs/DeploymentsTab.loading.esm.js.map +1 -0
  245. package/dist/features/repo/tabs/FilesTab.esm.js +142 -0
  246. package/dist/features/repo/tabs/FilesTab.esm.js.map +1 -0
  247. package/dist/features/repo/tabs/InstanceRow.esm.js +121 -0
  248. package/dist/features/repo/tabs/InstanceRow.esm.js.map +1 -0
  249. package/dist/features/repo/tabs/InstancesTab.esm.js +147 -0
  250. package/dist/features/repo/tabs/InstancesTab.esm.js.map +1 -0
  251. package/dist/features/repo/tabs/InstancesTab.helpers.esm.js +44 -0
  252. package/dist/features/repo/tabs/InstancesTab.helpers.esm.js.map +1 -0
  253. package/dist/features/repo/tabs/InstancesTab.loading.esm.js +33 -0
  254. package/dist/features/repo/tabs/InstancesTab.loading.esm.js.map +1 -0
  255. package/dist/features/repo/tabs/OverviewTab.esm.js +77 -0
  256. package/dist/features/repo/tabs/OverviewTab.esm.js.map +1 -0
  257. package/dist/features/repo/tabs/PermissionsTab.esm.js +56 -0
  258. package/dist/features/repo/tabs/PermissionsTab.esm.js.map +1 -0
  259. package/dist/features/repo/tabs/VersionsTab.esm.js +152 -0
  260. package/dist/features/repo/tabs/VersionsTab.esm.js.map +1 -0
  261. package/dist/features/repo/useInfiniteRelayList.esm.js +92 -0
  262. package/dist/features/repo/useInfiniteRelayList.esm.js.map +1 -0
  263. package/dist/features/repo/useInfiniteScroll.esm.js +21 -0
  264. package/dist/features/repo/useInfiniteScroll.esm.js.map +1 -0
  265. package/dist/features/repos/ReposListPage.esm.js +53 -0
  266. package/dist/features/repos/ReposListPage.esm.js.map +1 -0
  267. package/dist/features/repos/queries.esm.js +40 -0
  268. package/dist/features/repos/queries.esm.js.map +1 -0
  269. package/dist/features/repos/repoColumns.esm.js +121 -0
  270. package/dist/features/repos/repoColumns.esm.js.map +1 -0
  271. package/dist/features/repos/useRepos.esm.js +22 -0
  272. package/dist/features/repos/useRepos.esm.js.map +1 -0
  273. package/dist/features/resource/OriginChip.esm.js +42 -0
  274. package/dist/features/resource/OriginChip.esm.js.map +1 -0
  275. package/dist/features/resource/ResourceDetailsPage.esm.js +167 -0
  276. package/dist/features/resource/ResourceDetailsPage.esm.js.map +1 -0
  277. package/dist/features/resource/queries.esm.js +141 -0
  278. package/dist/features/resource/queries.esm.js.map +1 -0
  279. package/dist/features/resource/tabs/GeneralTab.esm.js +247 -0
  280. package/dist/features/resource/tabs/GeneralTab.esm.js.map +1 -0
  281. package/dist/features/resource/tabs/GeneralTab.loading.esm.js +76 -0
  282. package/dist/features/resource/tabs/GeneralTab.loading.esm.js.map +1 -0
  283. package/dist/features/resource/tabs/PermissionsTab.esm.js +57 -0
  284. package/dist/features/resource/tabs/PermissionsTab.esm.js.map +1 -0
  285. package/dist/features/resource/tabs/SettingsTabLayout.esm.js +18 -0
  286. package/dist/features/resource/tabs/SettingsTabLayout.esm.js.map +1 -0
  287. package/dist/features/resource/tabs/TabHeader.esm.js +30 -0
  288. package/dist/features/resource/tabs/TabHeader.esm.js.map +1 -0
  289. package/dist/features/resource/tabs/UsagePanel.esm.js +35 -0
  290. package/dist/features/resource/tabs/UsagePanel.esm.js.map +1 -0
  291. package/dist/features/resource/tabs/UsageTab.esm.js +91 -0
  292. package/dist/features/resource/tabs/UsageTab.esm.js.map +1 -0
  293. package/dist/features/resource/tabs/UsageTab.helpers.esm.js +168 -0
  294. package/dist/features/resource/tabs/UsageTab.helpers.esm.js.map +1 -0
  295. package/dist/features/resources/ResourcesEmptyState.esm.js +148 -0
  296. package/dist/features/resources/ResourcesEmptyState.esm.js.map +1 -0
  297. package/dist/features/resources/ResourcesListPage.esm.js +115 -0
  298. package/dist/features/resources/ResourcesListPage.esm.js.map +1 -0
  299. package/dist/features/resources/queries.esm.js +50 -0
  300. package/dist/features/resources/queries.esm.js.map +1 -0
  301. package/dist/features/resources/resourceColumns.esm.js +158 -0
  302. package/dist/features/resources/resourceColumns.esm.js.map +1 -0
  303. package/dist/features/resources/resourceConstants.esm.js +7 -0
  304. package/dist/features/resources/resourceConstants.esm.js.map +1 -0
  305. package/dist/features/resources/toResourceRow.esm.js +29 -0
  306. package/dist/features/resources/toResourceRow.esm.js.map +1 -0
  307. package/dist/hooks/useAuthedSvg.esm.js +34 -0
  308. package/dist/hooks/useAuthedSvg.esm.js.map +1 -0
  309. package/dist/hooks/useCursorPagination.esm.js +40 -0
  310. package/dist/hooks/useCursorPagination.esm.js.map +1 -0
  311. package/dist/hooks/useMassdriverSubscription.esm.js +61 -0
  312. package/dist/hooks/useMassdriverSubscription.esm.js.map +1 -0
  313. package/dist/hooks/usePaginatedRelayQuery.esm.js +68 -0
  314. package/dist/hooks/usePaginatedRelayQuery.esm.js.map +1 -0
  315. package/dist/index.d.ts +256 -0
  316. package/dist/index.esm.js +8 -0
  317. package/dist/index.esm.js.map +1 -0
  318. package/dist/internalRoutes.esm.js +29 -0
  319. package/dist/internalRoutes.esm.js.map +1 -0
  320. package/dist/plugin.esm.js +57 -0
  321. package/dist/plugin.esm.js.map +1 -0
  322. package/dist/queries.esm.js +54 -0
  323. package/dist/queries.esm.js.map +1 -0
  324. package/dist/routes.esm.js +6 -0
  325. package/dist/routes.esm.js.map +1 -0
  326. package/dist/shell/MassdriverHeader.esm.js +37 -0
  327. package/dist/shell/MassdriverHeader.esm.js.map +1 -0
  328. package/dist/shell/MassdriverShell.esm.js +30 -0
  329. package/dist/shell/MassdriverShell.esm.js.map +1 -0
  330. package/dist/theme/MassdriverThemeScope.esm.js +30 -0
  331. package/dist/theme/MassdriverThemeScope.esm.js.map +1 -0
  332. package/dist/theme/ThemeModeContext.esm.js +35 -0
  333. package/dist/theme/ThemeModeContext.esm.js.map +1 -0
  334. package/dist/theme/muiClassNameAudit.esm.js +11 -0
  335. package/dist/theme/muiClassNameAudit.esm.js.map +1 -0
  336. package/dist/useInstances.esm.js +39 -0
  337. package/dist/useInstances.esm.js.map +1 -0
  338. package/dist/utils/attributes.esm.js +28 -0
  339. package/dist/utils/attributes.esm.js.map +1 -0
  340. package/dist/utils/conditions.esm.js +20 -0
  341. package/dist/utils/conditions.esm.js.map +1 -0
  342. package/dist/utils/formatRelativeTime.esm.js +40 -0
  343. package/dist/utils/formatRelativeTime.esm.js.map +1 -0
  344. package/dist/utils/instanceStatuses.esm.js +74 -0
  345. package/dist/utils/instanceStatuses.esm.js.map +1 -0
  346. package/package.json +92 -0
@@ -0,0 +1,151 @@
1
+ import { parseInstanceId, parseComponentId } from '@massdriver/backstage-plugin-common';
2
+ import { NODE_HEIGHT, NODE_WIDTH } from './DiagramNode.constants.esm.js';
3
+
4
+ const BASE_EDGE_STYLE = {
5
+ strokeWidth: "3",
6
+ stroke: "#b7b7b7"
7
+ };
8
+ const DISCONNECTED_EDGE_STYLE = {
9
+ ...BASE_EDGE_STYLE,
10
+ strokeDasharray: "6 4"
11
+ };
12
+ const deriveHandleType = ({ resourceType, required }, showFieldStatus) => {
13
+ if (!resourceType) return "error";
14
+ if (showFieldStatus && required) return "required";
15
+ return "default";
16
+ };
17
+ const buildHandles = (slots = [], connectedNames, { showFieldStatus = true } = {}) => slots.filter(
18
+ (slot) => !slot.resourceType || slot.resourceType.connectionOrientation === "LINK"
19
+ ).map((slot) => ({
20
+ id: slot.name,
21
+ name: slot.name,
22
+ required: slot.required,
23
+ resourceTypeId: slot.resourceType?.id ?? null,
24
+ hasConnection: connectedNames.has(slot.name),
25
+ handleType: deriveHandleType(slot, showFieldStatus),
26
+ showFieldStatus
27
+ }));
28
+ const buildDiagram = ({
29
+ components = [],
30
+ links = [],
31
+ instances = [],
32
+ connections = [],
33
+ selectedComponentId = null
34
+ } = {}) => {
35
+ const instancesByScopedComponentId = new Map(
36
+ instances.map((inst) => [parseInstanceId(inst.id).scopedComponentId, inst])
37
+ );
38
+ const connectionsByLinkId = new Map(
39
+ connections.map((conn) => [conn.link?.id, conn]).filter(([id]) => id != null)
40
+ );
41
+ const outgoingByInstanceId = /* @__PURE__ */ new Map();
42
+ const incomingByInstanceId = /* @__PURE__ */ new Map();
43
+ connections.forEach((conn) => {
44
+ const fromId = conn.fromInstance?.id;
45
+ const toId = conn.toInstance?.id;
46
+ if (fromId) {
47
+ if (!outgoingByInstanceId.has(fromId))
48
+ outgoingByInstanceId.set(fromId, /* @__PURE__ */ new Set());
49
+ outgoingByInstanceId.get(fromId).add(conn.fromField);
50
+ }
51
+ if (toId) {
52
+ if (!incomingByInstanceId.has(toId))
53
+ incomingByInstanceId.set(toId, /* @__PURE__ */ new Set());
54
+ incomingByInstanceId.get(toId).add(conn.toField);
55
+ }
56
+ });
57
+ const componentsWithInstance = components.map((component) => ({
58
+ component,
59
+ instance: instancesByScopedComponentId.get(
60
+ parseComponentId(component.id).scopedComponentId
61
+ ) ?? null
62
+ })).filter(
63
+ (entry) => entry.instance !== null
64
+ );
65
+ const instanceByComponentId = new Map(
66
+ componentsWithInstance.map(({ component, instance }) => [
67
+ component.id,
68
+ instance
69
+ ])
70
+ );
71
+ const resourceFieldsByComponentId = new Map(
72
+ componentsWithInstance.map(({ component, instance }) => [
73
+ component.id,
74
+ new Set((instance.bundle?.resources ?? []).map((slot) => slot.name))
75
+ ])
76
+ );
77
+ const dependencyFieldsByComponentId = new Map(
78
+ componentsWithInstance.map(({ component, instance }) => [
79
+ component.id,
80
+ new Set((instance.bundle?.dependencies ?? []).map((slot) => slot.name))
81
+ ])
82
+ );
83
+ const nodes = componentsWithInstance.map(
84
+ ({ component, instance }) => {
85
+ const incoming = incomingByInstanceId.get(instance.id) ?? /* @__PURE__ */ new Set();
86
+ const outgoing = outgoingByInstanceId.get(instance.id) ?? /* @__PURE__ */ new Set();
87
+ const { scopedComponentId } = parseComponentId(component.id);
88
+ return {
89
+ id: component.id,
90
+ position: component.position ?? { x: 0, y: 0 },
91
+ type: "DiagramNode",
92
+ width: NODE_WIDTH,
93
+ height: NODE_HEIGHT,
94
+ data: {
95
+ id: scopedComponentId,
96
+ instanceId: scopedComponentId,
97
+ fullInstanceId: instance.id,
98
+ name: component.name,
99
+ ociRepoName: component.ociRepo?.name ?? null,
100
+ icon: instance.bundle?.icon ?? null,
101
+ version: instance.version ?? null,
102
+ status: instance.status ?? null,
103
+ isSelected: scopedComponentId === selectedComponentId,
104
+ dependencyHandles: buildHandles(
105
+ instance.bundle?.dependencies ?? [],
106
+ incoming
107
+ ),
108
+ resourceHandles: buildHandles(
109
+ instance.bundle?.resources ?? [],
110
+ outgoing,
111
+ {
112
+ showFieldStatus: false
113
+ }
114
+ )
115
+ }
116
+ };
117
+ }
118
+ );
119
+ const edges = links.map((link) => ({
120
+ link,
121
+ connection: connectionsByLinkId.get(link.id) ?? null
122
+ })).filter(({ link }) => {
123
+ const fromInstance = instanceByComponentId.get(link.fromComponent?.id);
124
+ const toInstance = instanceByComponentId.get(link.toComponent?.id);
125
+ if (!fromInstance || !toInstance) return false;
126
+ const resourceFields = resourceFieldsByComponentId.get(
127
+ link.fromComponent.id
128
+ );
129
+ const dependencyFields = dependencyFieldsByComponentId.get(
130
+ link.toComponent.id
131
+ );
132
+ return Boolean(
133
+ resourceFields?.has(link.fromField) && dependencyFields?.has(link.toField)
134
+ );
135
+ }).map(({ link, connection }) => {
136
+ const isConnection = connection !== null;
137
+ return {
138
+ id: link.id,
139
+ source: link.fromComponent.id,
140
+ sourceHandle: link.fromField,
141
+ target: link.toComponent.id,
142
+ targetHandle: link.toField,
143
+ style: isConnection ? BASE_EDGE_STYLE : DISCONNECTED_EDGE_STYLE,
144
+ data: { isConnection }
145
+ };
146
+ });
147
+ return { nodes, edges };
148
+ };
149
+
150
+ export { BASE_EDGE_STYLE, DISCONNECTED_EDGE_STYLE, buildDiagram };
151
+ //# sourceMappingURL=diagramFactory.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diagramFactory.esm.js","sources":["../../../../src/features/environment/graph/diagramFactory.ts"],"sourcesContent":["import type { Edge, Node } from '@xyflow/react';\nimport {\n parseComponentId,\n parseInstanceId,\n} from '@massdriver/backstage-plugin-common';\nimport { NODE_WIDTH, NODE_HEIGHT } from './DiagramNode.constants';\n\n// Ported from apps/web/features/environments/utils/diagramFactory.js. Read-only:\n// edges use the default React Flow edge type (the app's `deletable` edge type\n// is dropped since links cannot be removed here).\n\nconst BASE_EDGE_STYLE = {\n strokeWidth: '3',\n stroke: '#b7b7b7',\n};\n\nconst DISCONNECTED_EDGE_STYLE = {\n ...BASE_EDGE_STYLE,\n strokeDasharray: '6 4',\n};\n\nexport interface ResourceType {\n id: string;\n connectionOrientation?: string | null;\n}\n\nexport interface Slot {\n name: string;\n required?: boolean | null;\n resourceType?: ResourceType | null;\n}\n\nexport interface Bundle {\n id?: string;\n name?: string | null;\n version?: string | null;\n icon?: string | null;\n dependencies?: Slot[] | null;\n resources?: Slot[] | null;\n}\n\nexport interface Instance {\n id: string;\n name?: string | null;\n status?: string | null;\n version?: string | null;\n bundle?: Bundle | null;\n}\n\nexport interface Component {\n id: string;\n name: string;\n position?: { x: number; y: number } | null;\n ociRepo?: { id: string; name?: string | null } | null;\n}\n\nexport interface Link {\n id: string;\n fromField: string;\n toField: string;\n fromComponent?: { id: string } | null;\n toComponent?: { id: string } | null;\n}\n\nexport interface Connection {\n id: string;\n fromField: string;\n toField: string;\n fromInstance?: { id: string } | null;\n toInstance?: { id: string } | null;\n link?: { id: string } | null;\n}\n\nexport interface DiagramHandle {\n id: string;\n name: string;\n required?: boolean | null;\n resourceTypeId: string | null;\n hasConnection: boolean;\n handleType: string;\n showFieldStatus: boolean;\n}\n\nexport interface DiagramNodeData {\n id: string;\n instanceId: string;\n fullInstanceId: string;\n name: string;\n ociRepoName: string | null;\n icon: string | null;\n version: string | null;\n status: string | null;\n isSelected: boolean;\n dependencyHandles: DiagramHandle[];\n resourceHandles: DiagramHandle[];\n [key: string]: unknown;\n}\n\nexport type DiagramNodeType = Node<DiagramNodeData>;\n\ninterface BuildDiagramArgs {\n components?: Component[];\n links?: Link[];\n instances?: Instance[];\n connections?: Connection[];\n selectedComponentId?: string | null;\n}\n\nconst deriveHandleType = (\n { resourceType, required }: Slot,\n showFieldStatus: boolean,\n): string => {\n if (!resourceType) return 'error';\n if (showFieldStatus && required) return 'required';\n return 'default';\n};\n\nconst buildHandles = (\n slots: Slot[] = [],\n connectedNames: Set<string>,\n { showFieldStatus = true }: { showFieldStatus?: boolean } = {},\n): DiagramHandle[] =>\n slots\n .filter(\n slot =>\n !slot.resourceType ||\n slot.resourceType.connectionOrientation === 'LINK',\n )\n .map(slot => ({\n id: slot.name,\n name: slot.name,\n required: slot.required,\n resourceTypeId: slot.resourceType?.id ?? null,\n hasConnection: connectedNames.has(slot.name),\n handleType: deriveHandleType(slot, showFieldStatus),\n showFieldStatus,\n }));\n\nconst buildDiagram = ({\n components = [],\n links = [],\n instances = [],\n connections = [],\n selectedComponentId = null,\n}: BuildDiagramArgs = {}): { nodes: DiagramNodeType[]; edges: Edge[] } => {\n const instancesByScopedComponentId = new Map(\n instances.map(inst => [parseInstanceId(inst.id).scopedComponentId, inst]),\n );\n\n const connectionsByLinkId = new Map(\n connections\n .map(conn => [conn.link?.id, conn] as const)\n .filter(([id]) => id != null),\n );\n\n const outgoingByInstanceId = new Map<string, Set<string>>();\n const incomingByInstanceId = new Map<string, Set<string>>();\n connections.forEach(conn => {\n const fromId = conn.fromInstance?.id;\n const toId = conn.toInstance?.id;\n if (fromId) {\n if (!outgoingByInstanceId.has(fromId))\n outgoingByInstanceId.set(fromId, new Set());\n outgoingByInstanceId.get(fromId)!.add(conn.fromField);\n }\n if (toId) {\n if (!incomingByInstanceId.has(toId))\n incomingByInstanceId.set(toId, new Set());\n incomingByInstanceId.get(toId)!.add(conn.toField);\n }\n });\n\n const componentsWithInstance = components\n .map(component => ({\n component,\n instance:\n instancesByScopedComponentId.get(\n parseComponentId(component.id).scopedComponentId,\n ) ?? null,\n }))\n .filter(\n (entry): entry is { component: Component; instance: Instance } =>\n entry.instance !== null,\n );\n\n const instanceByComponentId = new Map(\n componentsWithInstance.map(({ component, instance }) => [\n component.id,\n instance,\n ]),\n );\n\n const resourceFieldsByComponentId = new Map(\n componentsWithInstance.map(({ component, instance }) => [\n component.id,\n new Set((instance.bundle?.resources ?? []).map(slot => slot.name)),\n ]),\n );\n\n const dependencyFieldsByComponentId = new Map(\n componentsWithInstance.map(({ component, instance }) => [\n component.id,\n new Set((instance.bundle?.dependencies ?? []).map(slot => slot.name)),\n ]),\n );\n\n const nodes: DiagramNodeType[] = componentsWithInstance.map(\n ({ component, instance }) => {\n const incoming = incomingByInstanceId.get(instance.id) ?? new Set();\n const outgoing = outgoingByInstanceId.get(instance.id) ?? new Set();\n const { scopedComponentId } = parseComponentId(component.id);\n\n return {\n id: component.id,\n position: component.position ?? { x: 0, y: 0 },\n type: 'DiagramNode',\n width: NODE_WIDTH,\n height: NODE_HEIGHT,\n data: {\n id: scopedComponentId,\n instanceId: scopedComponentId,\n fullInstanceId: instance.id,\n name: component.name,\n ociRepoName: component.ociRepo?.name ?? null,\n icon: instance.bundle?.icon ?? null,\n version: instance.version ?? null,\n status: instance.status ?? null,\n isSelected: scopedComponentId === selectedComponentId,\n dependencyHandles: buildHandles(\n instance.bundle?.dependencies ?? [],\n incoming,\n ),\n resourceHandles: buildHandles(\n instance.bundle?.resources ?? [],\n outgoing,\n {\n showFieldStatus: false,\n },\n ),\n },\n };\n },\n );\n\n const edges: Edge[] = links\n .map(link => ({\n link,\n connection: connectionsByLinkId.get(link.id) ?? null,\n }))\n .filter(({ link }) => {\n const fromInstance = instanceByComponentId.get(link.fromComponent?.id!);\n const toInstance = instanceByComponentId.get(link.toComponent?.id!);\n if (!fromInstance || !toInstance) return false;\n const resourceFields = resourceFieldsByComponentId.get(\n link.fromComponent!.id,\n );\n const dependencyFields = dependencyFieldsByComponentId.get(\n link.toComponent!.id,\n );\n return Boolean(\n resourceFields?.has(link.fromField) &&\n dependencyFields?.has(link.toField),\n );\n })\n .map(({ link, connection }) => {\n const isConnection = connection !== null;\n return {\n id: link.id,\n source: link.fromComponent!.id,\n sourceHandle: link.fromField,\n target: link.toComponent!.id,\n targetHandle: link.toField,\n style: isConnection ? BASE_EDGE_STYLE : DISCONNECTED_EDGE_STYLE,\n data: { isConnection },\n };\n });\n\n return { nodes, edges };\n};\n\nexport { buildDiagram, BASE_EDGE_STYLE, DISCONNECTED_EDGE_STYLE };\n"],"names":[],"mappings":";;;AAWA,MAAM,eAAA,GAAkB;AAAA,EACtB,WAAA,EAAa,GAAA;AAAA,EACb,MAAA,EAAQ;AACV;AAEA,MAAM,uBAAA,GAA0B;AAAA,EAC9B,GAAG,eAAA;AAAA,EACH,eAAA,EAAiB;AACnB;AAyFA,MAAM,mBAAmB,CACvB,EAAE,YAAA,EAAc,QAAA,IAChB,eAAA,KACW;AACX,EAAA,IAAI,CAAC,cAAc,OAAO,OAAA;AAC1B,EAAA,IAAI,eAAA,IAAmB,UAAU,OAAO,UAAA;AACxC,EAAA,OAAO,SAAA;AACT,CAAA;AAEA,MAAM,YAAA,GAAe,CACnB,KAAA,GAAgB,EAAC,EACjB,cAAA,EACA,EAAE,eAAA,GAAkB,IAAA,EAAK,GAAmC,EAAC,KAE7D,KAAA,CACG,MAAA;AAAA,EACC,UACE,CAAC,IAAA,CAAK,YAAA,IACN,IAAA,CAAK,aAAa,qBAAA,KAA0B;AAChD,CAAA,CACC,IAAI,CAAA,IAAA,MAAS;AAAA,EACZ,IAAI,IAAA,CAAK,IAAA;AAAA,EACT,MAAM,IAAA,CAAK,IAAA;AAAA,EACX,UAAU,IAAA,CAAK,QAAA;AAAA,EACf,cAAA,EAAgB,IAAA,CAAK,YAAA,EAAc,EAAA,IAAM,IAAA;AAAA,EACzC,aAAA,EAAe,cAAA,CAAe,GAAA,CAAI,IAAA,CAAK,IAAI,CAAA;AAAA,EAC3C,UAAA,EAAY,gBAAA,CAAiB,IAAA,EAAM,eAAe,CAAA;AAAA,EAClD;AACF,CAAA,CAAE,CAAA;AAEN,MAAM,eAAe,CAAC;AAAA,EACpB,aAAa,EAAC;AAAA,EACd,QAAQ,EAAC;AAAA,EACT,YAAY,EAAC;AAAA,EACb,cAAc,EAAC;AAAA,EACf,mBAAA,GAAsB;AACxB,CAAA,GAAsB,EAAC,KAAmD;AACxE,EAAA,MAAM,+BAA+B,IAAI,GAAA;AAAA,IACvC,SAAA,CAAU,GAAA,CAAI,CAAA,IAAA,KAAQ,CAAC,eAAA,CAAgB,KAAK,EAAE,CAAA,CAAE,iBAAA,EAAmB,IAAI,CAAC;AAAA,GAC1E;AAEA,EAAA,MAAM,sBAAsB,IAAI,GAAA;AAAA,IAC9B,YACG,GAAA,CAAI,CAAA,IAAA,KAAQ,CAAC,IAAA,CAAK,MAAM,EAAA,EAAI,IAAI,CAAU,CAAA,CAC1C,OAAO,CAAC,CAAC,EAAE,CAAA,KAAM,MAAM,IAAI;AAAA,GAChC;AAEA,EAAA,MAAM,oBAAA,uBAA2B,GAAA,EAAyB;AAC1D,EAAA,MAAM,oBAAA,uBAA2B,GAAA,EAAyB;AAC1D,EAAA,WAAA,CAAY,QAAQ,CAAA,IAAA,KAAQ;AAC1B,IAAA,MAAM,MAAA,GAAS,KAAK,YAAA,EAAc,EAAA;AAClC,IAAA,MAAM,IAAA,GAAO,KAAK,UAAA,EAAY,EAAA;AAC9B,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,IAAI,CAAC,oBAAA,CAAqB,GAAA,CAAI,MAAM,CAAA;AAClC,QAAA,oBAAA,CAAqB,GAAA,CAAI,MAAA,kBAAQ,IAAI,GAAA,EAAK,CAAA;AAC5C,MAAA,oBAAA,CAAqB,GAAA,CAAI,MAAM,CAAA,CAAG,GAAA,CAAI,KAAK,SAAS,CAAA;AAAA,IACtD;AACA,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,IAAI,CAAC,oBAAA,CAAqB,GAAA,CAAI,IAAI,CAAA;AAChC,QAAA,oBAAA,CAAqB,GAAA,CAAI,IAAA,kBAAM,IAAI,GAAA,EAAK,CAAA;AAC1C,MAAA,oBAAA,CAAqB,GAAA,CAAI,IAAI,CAAA,CAAG,GAAA,CAAI,KAAK,OAAO,CAAA;AAAA,IAClD;AAAA,EACF,CAAC,CAAA;AAED,EAAA,MAAM,sBAAA,GAAyB,UAAA,CAC5B,GAAA,CAAI,CAAA,SAAA,MAAc;AAAA,IACjB,SAAA;AAAA,IACA,UACE,4BAAA,CAA6B,GAAA;AAAA,MAC3B,gBAAA,CAAiB,SAAA,CAAU,EAAE,CAAA,CAAE;AAAA,KACjC,IAAK;AAAA,IACP,CAAA,CACD,MAAA;AAAA,IACC,CAAC,KAAA,KACC,KAAA,CAAM,QAAA,KAAa;AAAA,GACvB;AAEF,EAAA,MAAM,wBAAwB,IAAI,GAAA;AAAA,IAChC,uBAAuB,GAAA,CAAI,CAAC,EAAE,SAAA,EAAW,UAAS,KAAM;AAAA,MACtD,SAAA,CAAU,EAAA;AAAA,MACV;AAAA,KACD;AAAA,GACH;AAEA,EAAA,MAAM,8BAA8B,IAAI,GAAA;AAAA,IACtC,uBAAuB,GAAA,CAAI,CAAC,EAAE,SAAA,EAAW,UAAS,KAAM;AAAA,MACtD,SAAA,CAAU,EAAA;AAAA,MACV,IAAI,GAAA,CAAA,CAAK,QAAA,CAAS,MAAA,EAAQ,SAAA,IAAa,EAAC,EAAG,GAAA,CAAI,CAAA,IAAA,KAAQ,IAAA,CAAK,IAAI,CAAC;AAAA,KAClE;AAAA,GACH;AAEA,EAAA,MAAM,gCAAgC,IAAI,GAAA;AAAA,IACxC,uBAAuB,GAAA,CAAI,CAAC,EAAE,SAAA,EAAW,UAAS,KAAM;AAAA,MACtD,SAAA,CAAU,EAAA;AAAA,MACV,IAAI,GAAA,CAAA,CAAK,QAAA,CAAS,MAAA,EAAQ,YAAA,IAAgB,EAAC,EAAG,GAAA,CAAI,CAAA,IAAA,KAAQ,IAAA,CAAK,IAAI,CAAC;AAAA,KACrE;AAAA,GACH;AAEA,EAAA,MAAM,QAA2B,sBAAA,CAAuB,GAAA;AAAA,IACtD,CAAC,EAAE,SAAA,EAAW,QAAA,EAAS,KAAM;AAC3B,MAAA,MAAM,WAAW,oBAAA,CAAqB,GAAA,CAAI,SAAS,EAAE,CAAA,wBAAS,GAAA,EAAI;AAClE,MAAA,MAAM,WAAW,oBAAA,CAAqB,GAAA,CAAI,SAAS,EAAE,CAAA,wBAAS,GAAA,EAAI;AAClE,MAAA,MAAM,EAAE,iBAAA,EAAkB,GAAI,gBAAA,CAAiB,UAAU,EAAE,CAAA;AAE3D,MAAA,OAAO;AAAA,QACL,IAAI,SAAA,CAAU,EAAA;AAAA,QACd,UAAU,SAAA,CAAU,QAAA,IAAY,EAAE,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAE;AAAA,QAC7C,IAAA,EAAM,aAAA;AAAA,QACN,KAAA,EAAO,UAAA;AAAA,QACP,MAAA,EAAQ,WAAA;AAAA,QACR,IAAA,EAAM;AAAA,UACJ,EAAA,EAAI,iBAAA;AAAA,UACJ,UAAA,EAAY,iBAAA;AAAA,UACZ,gBAAgB,QAAA,CAAS,EAAA;AAAA,UACzB,MAAM,SAAA,CAAU,IAAA;AAAA,UAChB,WAAA,EAAa,SAAA,CAAU,OAAA,EAAS,IAAA,IAAQ,IAAA;AAAA,UACxC,IAAA,EAAM,QAAA,CAAS,MAAA,EAAQ,IAAA,IAAQ,IAAA;AAAA,UAC/B,OAAA,EAAS,SAAS,OAAA,IAAW,IAAA;AAAA,UAC7B,MAAA,EAAQ,SAAS,MAAA,IAAU,IAAA;AAAA,UAC3B,YAAY,iBAAA,KAAsB,mBAAA;AAAA,UAClC,iBAAA,EAAmB,YAAA;AAAA,YACjB,QAAA,CAAS,MAAA,EAAQ,YAAA,IAAgB,EAAC;AAAA,YAClC;AAAA,WACF;AAAA,UACA,eAAA,EAAiB,YAAA;AAAA,YACf,QAAA,CAAS,MAAA,EAAQ,SAAA,IAAa,EAAC;AAAA,YAC/B,QAAA;AAAA,YACA;AAAA,cACE,eAAA,EAAiB;AAAA;AACnB;AACF;AACF,OACF;AAAA,IACF;AAAA,GACF;AAEA,EAAA,MAAM,KAAA,GAAgB,KAAA,CACnB,GAAA,CAAI,CAAA,IAAA,MAAS;AAAA,IACZ,IAAA;AAAA,IACA,UAAA,EAAY,mBAAA,CAAoB,GAAA,CAAI,IAAA,CAAK,EAAE,CAAA,IAAK;AAAA,IAChD,CAAA,CACD,MAAA,CAAO,CAAC,EAAE,MAAK,KAAM;AACpB,IAAA,MAAM,YAAA,GAAe,qBAAA,CAAsB,GAAA,CAAI,IAAA,CAAK,eAAe,EAAG,CAAA;AACtE,IAAA,MAAM,UAAA,GAAa,qBAAA,CAAsB,GAAA,CAAI,IAAA,CAAK,aAAa,EAAG,CAAA;AAClE,IAAA,IAAI,CAAC,YAAA,IAAgB,CAAC,UAAA,EAAY,OAAO,KAAA;AACzC,IAAA,MAAM,iBAAiB,2BAAA,CAA4B,GAAA;AAAA,MACjD,KAAK,aAAA,CAAe;AAAA,KACtB;AACA,IAAA,MAAM,mBAAmB,6BAAA,CAA8B,GAAA;AAAA,MACrD,KAAK,WAAA,CAAa;AAAA,KACpB;AACA,IAAA,OAAO,OAAA;AAAA,MACL,cAAA,EAAgB,IAAI,IAAA,CAAK,SAAS,KAChC,gBAAA,EAAkB,GAAA,CAAI,KAAK,OAAO;AAAA,KACtC;AAAA,EACF,CAAC,CAAA,CACA,GAAA,CAAI,CAAC,EAAE,IAAA,EAAM,YAAW,KAAM;AAC7B,IAAA,MAAM,eAAe,UAAA,KAAe,IAAA;AACpC,IAAA,OAAO;AAAA,MACL,IAAI,IAAA,CAAK,EAAA;AAAA,MACT,MAAA,EAAQ,KAAK,aAAA,CAAe,EAAA;AAAA,MAC5B,cAAc,IAAA,CAAK,SAAA;AAAA,MACnB,MAAA,EAAQ,KAAK,WAAA,CAAa,EAAA;AAAA,MAC1B,cAAc,IAAA,CAAK,OAAA;AAAA,MACnB,KAAA,EAAO,eAAe,eAAA,GAAkB,uBAAA;AAAA,MACxC,IAAA,EAAM,EAAE,YAAA;AAAa,KACvB;AAAA,EACF,CAAC,CAAA;AAEH,EAAA,OAAO,EAAE,OAAO,KAAA,EAAM;AACxB;;;;"}
@@ -0,0 +1,174 @@
1
+ import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
2
+ import { useState, useCallback, useEffect } from 'react';
3
+ import { useConnection, Position } from '@xyflow/react';
4
+ import Box from '@massdriver/ui/Box';
5
+ import ExpandCircleDownOutlinedIcon from '@massdriver/ui/icons/ExpandCircleDownOutlinedIcon';
6
+ import stylin from '@massdriver/ui/stylin';
7
+ import NodeHandle from './NodeHandle.esm.js';
8
+ import useRadialPositions from './useRadialPositions.esm.js';
9
+ import useAnimationFrameSync from './useAnimationFrameSync.esm.js';
10
+ import useTransitionLifecycle from './useTransitionLifecycle.esm.js';
11
+ import { NODE_HEIGHT } from '../DiagramNode.constants.esm.js';
12
+
13
+ const HOTSPOT_WIDTH = 200;
14
+ const HOTSPOT_HEIGHT = 200;
15
+ const RADIUS = 70;
16
+ const START_ANGLE = 70;
17
+ const END_ANGLE = -70;
18
+ const TRANSITION_STAGGER_MS = 10;
19
+ const OPEN_EASING = "cubic-bezier(0.4, 0.0, 0.2, 1)";
20
+ const CLOSE_EASING = "cubic-bezier(0.0, 0.0, 0.2, 1)";
21
+ const ORIGIN_X = HOTSPOT_WIDTH / 2;
22
+ const ORIGIN_Y = (HOTSPOT_HEIGHT - NODE_HEIGHT) / 2 + NODE_HEIGHT / 2;
23
+ const CLOSED_POSITION = { xPos: ORIGIN_X, yPos: ORIGIN_Y };
24
+ const connectionSelector = ({ inProgress }) => inProgress;
25
+ const transitionStyle = (isOpen, index) => ({
26
+ transition: isOpen ? `top 250ms ${OPEN_EASING} ${index * TRANSITION_STAGGER_MS}ms, left 250ms ${OPEN_EASING} ${index * TRANSITION_STAGGER_MS}ms, right 250ms ${OPEN_EASING} ${index * TRANSITION_STAGGER_MS}ms` : `top 200ms ${CLOSE_EASING}, left 200ms ${CLOSE_EASING}, right 200ms ${CLOSE_EASING}`,
27
+ willChange: isOpen ? "top, left, right" : "auto"
28
+ });
29
+ const ANIMATING_SAFETY_TIMEOUT_MS = 500;
30
+ const ExpandableHandleWrapper = ({
31
+ type,
32
+ placement,
33
+ handles = [],
34
+ nodeId,
35
+ isOpen: isOpenProp
36
+ }) => {
37
+ const inProgress = useConnection(connectionSelector);
38
+ const isOpen = Boolean(isOpenProp) || inProgress;
39
+ const showFan = handles.length > 1;
40
+ const openPositions = useRadialPositions(
41
+ {
42
+ startAngle: START_ANGLE,
43
+ endAngle: END_ANGLE,
44
+ radius: RADIUS,
45
+ numItems: handles.length,
46
+ originX: ORIGIN_X,
47
+ originY: ORIGIN_Y
48
+ },
49
+ { skip: !showFan }
50
+ );
51
+ const [isAnimating, setIsAnimating] = useState(false);
52
+ const onTransitionStart = useCallback((event) => {
53
+ if (event.propertyName !== "top") return;
54
+ setIsAnimating((prev) => prev ? prev : true);
55
+ }, []);
56
+ const onTransitionEnd = useCallback((event) => {
57
+ if (event.propertyName !== "top") return;
58
+ setIsAnimating((prev) => !prev ? prev : false);
59
+ }, []);
60
+ const onTransitionCancel = useCallback(() => {
61
+ setIsAnimating((prev) => !prev ? prev : false);
62
+ }, []);
63
+ const containerRef = useTransitionLifecycle(
64
+ onTransitionStart,
65
+ onTransitionCancel
66
+ );
67
+ useEffect(() => {
68
+ if (!isAnimating) return void 0;
69
+ const safety = setTimeout(
70
+ () => setIsAnimating(false),
71
+ ANIMATING_SAFETY_TIMEOUT_MS
72
+ );
73
+ return () => clearTimeout(safety);
74
+ }, [isAnimating]);
75
+ useAnimationFrameSync(nodeId, isAnimating);
76
+ if (handles.length === 0) return null;
77
+ const reactFlowPosition = placement === "left" ? Position.Left : Position.Right;
78
+ if (!showFan) {
79
+ const handle = handles[0];
80
+ return /* @__PURE__ */ jsx(
81
+ NodeHandle,
82
+ {
83
+ id: handle.id,
84
+ type,
85
+ position: reactFlowPosition,
86
+ placement,
87
+ handleType: handle.handleType,
88
+ hasConnection: handle.hasConnection,
89
+ resourceTypeId: handle.resourceTypeId,
90
+ fieldName: handle.name,
91
+ required: handle.required,
92
+ showFieldStatus: handle.showFieldStatus,
93
+ xPos: 0,
94
+ yPos: Math.round(NODE_HEIGHT / 2)
95
+ },
96
+ handle.id
97
+ );
98
+ }
99
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
100
+ /* @__PURE__ */ jsx(
101
+ HandleContainer,
102
+ {
103
+ className: "node-handle nodrag",
104
+ ref: containerRef,
105
+ placement,
106
+ children: handles.map((handle, index) => {
107
+ const { xPos, yPos } = isOpen ? openPositions?.[index] ?? CLOSED_POSITION : CLOSED_POSITION;
108
+ return /* @__PURE__ */ jsx(
109
+ NodeHandle,
110
+ {
111
+ id: handle.id,
112
+ type,
113
+ position: reactFlowPosition,
114
+ placement,
115
+ handleType: handle.handleType,
116
+ hasConnection: handle.hasConnection,
117
+ resourceTypeId: handle.resourceTypeId,
118
+ fieldName: handle.name,
119
+ required: handle.required,
120
+ showFieldStatus: handle.showFieldStatus,
121
+ xPos,
122
+ yPos,
123
+ onTransitionEnd,
124
+ sx: transitionStyle(isOpen, index)
125
+ },
126
+ handle.id
127
+ );
128
+ })
129
+ }
130
+ ),
131
+ /* @__PURE__ */ jsx(
132
+ NestedIcon,
133
+ {
134
+ className: "node-handle",
135
+ placement,
136
+ onClick: (event) => event.stopPropagation()
137
+ }
138
+ )
139
+ ] });
140
+ };
141
+ const HandleContainer = stylin(Box, ["placement"])(
142
+ ({ placement }) => ({
143
+ position: "absolute",
144
+ width: `${HOTSPOT_WIDTH}px`,
145
+ height: `${HOTSPOT_HEIGHT}px`,
146
+ top: `calc(50% - ${HOTSPOT_HEIGHT / 2}px)`,
147
+ borderRadius: "50%",
148
+ ...placement === "left" ? {
149
+ left: `-${HOTSPOT_WIDTH / 2}px`,
150
+ clipPath: "polygon(0 0, 50% 0, 50% 100%, 0 100%)"
151
+ } : {
152
+ right: `-${HOTSPOT_WIDTH / 2}px`,
153
+ clipPath: "polygon(50% 0, 100% 0, 100% 100%, 50% 100%)"
154
+ }
155
+ })
156
+ );
157
+ const NestedIcon = stylin(ExpandCircleDownOutlinedIcon, ["placement"])(
158
+ ({ theme, placement }) => ({
159
+ zIndex: 10,
160
+ position: "absolute",
161
+ backgroundColor: theme.palette.background.paper,
162
+ borderRadius: "50%",
163
+ fontSize: "18px",
164
+ width: "27px",
165
+ height: "27px",
166
+ top: "50%",
167
+ left: placement === "left" ? "0%" : "100%",
168
+ transform: `translate(-50%, -50%) rotate(${placement === "left" ? 90 : 270}deg)`,
169
+ color: theme.palette.grey[600]
170
+ })
171
+ );
172
+
173
+ export { ExpandableHandleWrapper as default };
174
+ //# sourceMappingURL=ExpandableHandleWrapper.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExpandableHandleWrapper.esm.js","sources":["../../../../../src/features/environment/graph/handles/ExpandableHandleWrapper.tsx"],"sourcesContent":["import { useCallback, useEffect, useState } from 'react';\nimport { Position, useConnection } from '@xyflow/react';\nimport Box from '@massdriver/ui/Box';\nimport ExpandCircleDownOutlinedIcon from '@massdriver/ui/icons/ExpandCircleDownOutlinedIcon';\nimport stylin from '@massdriver/ui/stylin';\nimport NodeHandle from './NodeHandle';\nimport useRadialPositions from './useRadialPositions';\nimport useAnimationFrameSync from './useAnimationFrameSync';\nimport useTransitionLifecycle from './useTransitionLifecycle';\nimport type { DiagramHandle } from '../diagramFactory';\nimport { NODE_HEIGHT } from '../DiagramNode.constants';\n\nconst HOTSPOT_WIDTH = 200;\nconst HOTSPOT_HEIGHT = 200;\nconst RADIUS = 70;\nconst START_ANGLE = 70;\nconst END_ANGLE = -70;\nconst TRANSITION_STAGGER_MS = 10;\nconst OPEN_EASING = 'cubic-bezier(0.4, 0.0, 0.2, 1)';\nconst CLOSE_EASING = 'cubic-bezier(0.0, 0.0, 0.2, 1)';\n\nconst ORIGIN_X = HOTSPOT_WIDTH / 2;\nconst ORIGIN_Y = (HOTSPOT_HEIGHT - NODE_HEIGHT) / 2 + NODE_HEIGHT / 2;\nconst CLOSED_POSITION = { xPos: ORIGIN_X, yPos: ORIGIN_Y };\n\nconst connectionSelector = ({ inProgress }: { inProgress: boolean }) =>\n inProgress;\n\nconst transitionStyle = (isOpen: boolean, index: number) => ({\n transition: isOpen\n ? `top 250ms ${OPEN_EASING} ${\n index * TRANSITION_STAGGER_MS\n }ms, left 250ms ${OPEN_EASING} ${\n index * TRANSITION_STAGGER_MS\n }ms, right 250ms ${OPEN_EASING} ${index * TRANSITION_STAGGER_MS}ms`\n : `top 200ms ${CLOSE_EASING}, left 200ms ${CLOSE_EASING}, right 200ms ${CLOSE_EASING}`,\n willChange: isOpen ? 'top, left, right' : 'auto',\n});\n\nconst ANIMATING_SAFETY_TIMEOUT_MS = 500;\n\nconst ExpandableHandleWrapper = ({\n type,\n placement,\n handles = [],\n nodeId,\n isOpen: isOpenProp,\n}: {\n type: 'source' | 'target';\n placement: 'left' | 'right';\n handles?: DiagramHandle[];\n nodeId: string;\n isOpen?: boolean;\n}) => {\n const inProgress = useConnection(connectionSelector);\n const isOpen = Boolean(isOpenProp) || inProgress;\n\n const showFan = handles.length > 1;\n\n const openPositions = useRadialPositions(\n {\n startAngle: START_ANGLE,\n endAngle: END_ANGLE,\n radius: RADIUS,\n numItems: handles.length,\n originX: ORIGIN_X,\n originY: ORIGIN_Y,\n },\n { skip: !showFan },\n );\n\n const [isAnimating, setIsAnimating] = useState(false);\n\n const onTransitionStart = useCallback((event: TransitionEvent) => {\n if (event.propertyName !== 'top') return;\n setIsAnimating(prev => (prev ? prev : true));\n }, []);\n\n const onTransitionEnd = useCallback((event: any) => {\n if (event.propertyName !== 'top') return;\n setIsAnimating(prev => (!prev ? prev : false));\n }, []);\n\n const onTransitionCancel = useCallback(() => {\n setIsAnimating(prev => (!prev ? prev : false));\n }, []);\n\n const containerRef = useTransitionLifecycle(\n onTransitionStart,\n onTransitionCancel,\n );\n\n useEffect(() => {\n if (!isAnimating) return undefined;\n const safety = setTimeout(\n () => setIsAnimating(false),\n ANIMATING_SAFETY_TIMEOUT_MS,\n );\n return () => clearTimeout(safety);\n }, [isAnimating]);\n\n useAnimationFrameSync(nodeId, isAnimating);\n\n if (handles.length === 0) return null;\n\n const reactFlowPosition =\n placement === 'left' ? Position.Left : Position.Right;\n\n if (!showFan) {\n const handle = handles[0];\n return (\n <NodeHandle\n key={handle.id}\n id={handle.id}\n type={type}\n position={reactFlowPosition}\n placement={placement}\n handleType={handle.handleType}\n hasConnection={handle.hasConnection}\n resourceTypeId={handle.resourceTypeId}\n fieldName={handle.name}\n required={handle.required}\n showFieldStatus={handle.showFieldStatus}\n xPos={0}\n yPos={Math.round(NODE_HEIGHT / 2)}\n />\n );\n }\n\n return (\n <>\n <HandleContainer\n className=\"node-handle nodrag\"\n ref={containerRef}\n placement={placement}\n >\n {handles.map((handle, index) => {\n const { xPos, yPos } = isOpen\n ? openPositions?.[index] ?? CLOSED_POSITION\n : CLOSED_POSITION;\n\n return (\n <NodeHandle\n key={handle.id}\n id={handle.id}\n type={type}\n position={reactFlowPosition}\n placement={placement}\n handleType={handle.handleType}\n hasConnection={handle.hasConnection}\n resourceTypeId={handle.resourceTypeId}\n fieldName={handle.name}\n required={handle.required}\n showFieldStatus={handle.showFieldStatus}\n xPos={xPos}\n yPos={yPos}\n onTransitionEnd={onTransitionEnd}\n sx={transitionStyle(isOpen, index)}\n />\n );\n })}\n </HandleContainer>\n <NestedIcon\n className=\"node-handle\"\n placement={placement}\n onClick={(event: any) => event.stopPropagation()}\n />\n </>\n );\n};\n\nconst HandleContainer = stylin(Box, ['placement'])(\n ({ placement }: { placement: 'left' | 'right' }) => ({\n position: 'absolute',\n width: `${HOTSPOT_WIDTH}px`,\n height: `${HOTSPOT_HEIGHT}px`,\n top: `calc(50% - ${HOTSPOT_HEIGHT / 2}px)`,\n borderRadius: '50%',\n ...(placement === 'left'\n ? {\n left: `-${HOTSPOT_WIDTH / 2}px`,\n clipPath: 'polygon(0 0, 50% 0, 50% 100%, 0 100%)',\n }\n : {\n right: `-${HOTSPOT_WIDTH / 2}px`,\n clipPath: 'polygon(50% 0, 100% 0, 100% 100%, 50% 100%)',\n }),\n }),\n);\n\nconst NestedIcon = stylin(ExpandCircleDownOutlinedIcon, ['placement'])(\n ({ theme, placement }: { theme: any; placement: 'left' | 'right' }) => ({\n zIndex: 10,\n position: 'absolute',\n backgroundColor: theme.palette.background.paper,\n borderRadius: '50%',\n fontSize: '18px',\n width: '27px',\n height: '27px',\n top: '50%',\n left: placement === 'left' ? '0%' : '100%',\n transform: `translate(-50%, -50%) rotate(${\n placement === 'left' ? 90 : 270\n }deg)`,\n color: theme.palette.grey[600],\n }),\n);\n\nexport default ExpandableHandleWrapper;\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import { HANDLE_TYPES, HANDLE_TYPE } from './handleTypes.esm.js';
3
+ import NodeHandleTooltip from './NodeHandleTooltip.esm.js';
4
+
5
+ const ERROR_MESSAGE = "Resource type not found";
6
+ const NodeHandle = ({
7
+ handleType,
8
+ resourceTypeId,
9
+ fieldName,
10
+ required,
11
+ showFieldStatus = true,
12
+ hasConnection,
13
+ isValidConnectionTarget,
14
+ placement,
15
+ ...handleProps
16
+ }) => {
17
+ const Component = HANDLE_TYPES[handleType] ?? HANDLE_TYPES[HANDLE_TYPE.DEFAULT];
18
+ const isError = handleType === HANDLE_TYPE.ERROR;
19
+ const isRemoteReference = handleType === HANDLE_TYPE.REMOTE_REFERENCE;
20
+ const handle = /* @__PURE__ */ jsx(
21
+ Component,
22
+ {
23
+ className: "node-handle nodrag",
24
+ hasConnection,
25
+ isValidConnectionTarget,
26
+ ...handleProps
27
+ }
28
+ );
29
+ return /* @__PURE__ */ jsx(
30
+ NodeHandleTooltip,
31
+ {
32
+ resourceTypeId: isError ? null : resourceTypeId,
33
+ errorMessage: isError ? ERROR_MESSAGE : null,
34
+ fieldName,
35
+ required,
36
+ isRemoteReference,
37
+ showFieldStatus,
38
+ placement,
39
+ children: handle
40
+ }
41
+ );
42
+ };
43
+
44
+ export { NodeHandle as default };
45
+ //# sourceMappingURL=NodeHandle.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NodeHandle.esm.js","sources":["../../../../../src/features/environment/graph/handles/NodeHandle.tsx"],"sourcesContent":["import { HANDLE_TYPE, HANDLE_TYPES } from './handleTypes';\nimport NodeHandleTooltip from './NodeHandleTooltip';\n\nconst ERROR_MESSAGE = 'Resource type not found';\n\nconst NodeHandle = ({\n handleType,\n resourceTypeId,\n fieldName,\n required,\n showFieldStatus = true,\n hasConnection,\n isValidConnectionTarget,\n placement,\n ...handleProps\n}: {\n handleType: string;\n resourceTypeId?: string | null;\n fieldName?: string;\n required?: boolean | null;\n showFieldStatus?: boolean;\n hasConnection?: boolean;\n isValidConnectionTarget?: boolean;\n placement?: string;\n [key: string]: unknown;\n}) => {\n const Component =\n HANDLE_TYPES[handleType] ?? HANDLE_TYPES[HANDLE_TYPE.DEFAULT];\n const isError = handleType === HANDLE_TYPE.ERROR;\n const isRemoteReference = handleType === HANDLE_TYPE.REMOTE_REFERENCE;\n\n const handle = (\n <Component\n className=\"node-handle nodrag\"\n hasConnection={hasConnection}\n isValidConnectionTarget={isValidConnectionTarget}\n {...handleProps}\n />\n );\n\n return (\n <NodeHandleTooltip\n resourceTypeId={isError ? null : resourceTypeId}\n errorMessage={isError ? ERROR_MESSAGE : null}\n fieldName={fieldName}\n required={required}\n isRemoteReference={isRemoteReference}\n showFieldStatus={showFieldStatus}\n placement={placement}\n >\n {handle}\n </NodeHandleTooltip>\n );\n};\n\nexport default NodeHandle;\n"],"names":[],"mappings":";;;;AAGA,MAAM,aAAA,GAAgB,yBAAA;AAEtB,MAAM,aAAa,CAAC;AAAA,EAClB,UAAA;AAAA,EACA,cAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,eAAA,GAAkB,IAAA;AAAA,EAClB,aAAA;AAAA,EACA,uBAAA;AAAA,EACA,SAAA;AAAA,EACA,GAAG;AACL,CAAA,KAUM;AACJ,EAAA,MAAM,YACJ,YAAA,CAAa,UAAU,CAAA,IAAK,YAAA,CAAa,YAAY,OAAO,CAAA;AAC9D,EAAA,MAAM,OAAA,GAAU,eAAe,WAAA,CAAY,KAAA;AAC3C,EAAA,MAAM,iBAAA,GAAoB,eAAe,WAAA,CAAY,gBAAA;AAErD,EAAA,MAAM,MAAA,mBACJ,GAAA;AAAA,IAAC,SAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAU,oBAAA;AAAA,MACV,aAAA;AAAA,MACA,uBAAA;AAAA,MACC,GAAG;AAAA;AAAA,GACN;AAGF,EAAA,uBACE,GAAA;AAAA,IAAC,iBAAA;AAAA,IAAA;AAAA,MACC,cAAA,EAAgB,UAAU,IAAA,GAAO,cAAA;AAAA,MACjC,YAAA,EAAc,UAAU,aAAA,GAAgB,IAAA;AAAA,MACxC,SAAA;AAAA,MACA,QAAA;AAAA,MACA,iBAAA;AAAA,MACA,eAAA;AAAA,MACA,SAAA;AAAA,MAEC,QAAA,EAAA;AAAA;AAAA,GACH;AAEJ;;;;"}
@@ -0,0 +1,134 @@
1
+ import { jsx, jsxs } from 'react/jsx-runtime';
2
+ import Box from '@massdriver/ui/Box';
3
+ import Typography from '@massdriver/ui/Typography';
4
+ import Tooltip from '@massdriver/ui/Tooltip';
5
+ import Chip from '@massdriver/ui/Chip';
6
+ import stylin from '@massdriver/ui/stylin';
7
+ import { chipClasses } from '@mui/material/Chip';
8
+ import '@mui/material/Drawer';
9
+ import '@mui/material/OutlinedInput';
10
+ import '@mui/material/Select';
11
+ import '@mui/material/ToggleButton';
12
+
13
+ const TOOLTIP_BG = "rgba(34, 51, 84, 0.95)";
14
+ const TOOLTIP_BORDER = "rgba(255, 255, 255, 0.1)";
15
+ const TOOLTIP_TEXT_MUTED = "rgba(255, 255, 255, 0.7)";
16
+ const TOOLTIP_TEXT_SUBTLE = "rgba(255, 255, 255, 0.6)";
17
+ const NodeHandleTooltip = ({
18
+ resourceTypeId,
19
+ errorMessage,
20
+ fieldName,
21
+ required,
22
+ isRemoteReference = false,
23
+ showFieldStatus = true,
24
+ placement,
25
+ children
26
+ }) => {
27
+ const title = errorMessage ? /* @__PURE__ */ jsxs(TooltipContent, { children: [
28
+ /* @__PURE__ */ jsx(ErrorText, { children: errorMessage }),
29
+ /* @__PURE__ */ jsx(FieldName, { as: "span", children: fieldName })
30
+ ] }) : /* @__PURE__ */ jsxs(TooltipContent, { children: [
31
+ /* @__PURE__ */ jsx(HeaderSection, { children: /* @__PURE__ */ jsxs(ContentSection, { children: [
32
+ /* @__PURE__ */ jsx(FieldName, { children: fieldName }),
33
+ /* @__PURE__ */ jsx(TypeText, { children: resourceTypeId })
34
+ ] }) }),
35
+ showFieldStatus ? /* @__PURE__ */ jsxs(MetaSection, { children: [
36
+ /* @__PURE__ */ jsx(FieldStatusLabel, { variant: "caption", children: "Field Status" }),
37
+ /* @__PURE__ */ jsx(
38
+ RequiredChip,
39
+ {
40
+ label: required ? "Required" : "Optional",
41
+ color: required ? isRemoteReference ? "success" : "error" : "info",
42
+ variant: "filled",
43
+ size: "small"
44
+ }
45
+ )
46
+ ] }) : null,
47
+ isRemoteReference ? /* @__PURE__ */ jsx(RemoteReferenceNote, { variant: "caption", children: "Fulfilled by a remote reference." }) : null
48
+ ] });
49
+ return /* @__PURE__ */ jsx(
50
+ Tooltip,
51
+ {
52
+ title,
53
+ arrow: true,
54
+ enterDelay: 600,
55
+ placement,
56
+ componentsProps: TOOLTIP_COMPONENTS_PROPS,
57
+ children
58
+ }
59
+ );
60
+ };
61
+ const TOOLTIP_COMPONENTS_PROPS = {
62
+ tooltip: {
63
+ className: "node-handle",
64
+ sx: {
65
+ bgcolor: TOOLTIP_BG,
66
+ backdropFilter: "blur(8px)",
67
+ border: `1px solid ${TOOLTIP_BORDER}`,
68
+ boxShadow: (theme) => theme.shadows[8]
69
+ }
70
+ },
71
+ arrow: { sx: { color: TOOLTIP_BG } }
72
+ };
73
+ const TooltipContent = stylin(Box)({
74
+ display: "flex",
75
+ flexDirection: "column",
76
+ gap: 1.5,
77
+ minWidth: 200,
78
+ maxWidth: 300
79
+ });
80
+ const HeaderSection = stylin(Box)({
81
+ display: "flex",
82
+ alignItems: "flex-start",
83
+ gap: 1.5
84
+ });
85
+ const ContentSection = stylin(Box)({
86
+ display: "flex",
87
+ flexDirection: "column",
88
+ gap: 0.5,
89
+ flex: 1,
90
+ minWidth: 0
91
+ });
92
+ const MetaSection = stylin(Box)(({ theme }) => ({
93
+ display: "flex",
94
+ alignItems: "center",
95
+ justifyContent: "space-between",
96
+ gap: theme.spacing(1),
97
+ paddingTop: theme.spacing(0.5),
98
+ borderTop: `1px solid ${TOOLTIP_BORDER}`
99
+ }));
100
+ const FieldStatusLabel = stylin(Typography)({
101
+ color: TOOLTIP_TEXT_SUBTLE
102
+ });
103
+ const RemoteReferenceNote = stylin(Typography)(({ theme }) => ({
104
+ color: theme.palette.success.light,
105
+ fontSize: "0.7rem",
106
+ fontStyle: "italic",
107
+ textAlign: "center"
108
+ }));
109
+ const FieldName = stylin(Typography)(({ theme }) => ({
110
+ fontWeight: 600,
111
+ fontSize: "0.875rem",
112
+ color: theme.palette.common.white,
113
+ lineHeight: 1.2
114
+ }));
115
+ const TypeText = stylin(Typography)({
116
+ fontSize: "0.75rem",
117
+ color: TOOLTIP_TEXT_MUTED,
118
+ fontFamily: "monospace",
119
+ lineHeight: 1.2
120
+ });
121
+ const ErrorText = stylin(Typography)(({ theme }) => ({
122
+ color: theme.palette.error.light,
123
+ fontWeight: 600,
124
+ fontSize: "0.875rem"
125
+ }));
126
+ const RequiredChip = stylin(Chip)({
127
+ height: 18,
128
+ fontSize: "0.625rem",
129
+ fontWeight: 600,
130
+ [`& .${chipClasses.label}`]: { px: 0.75 }
131
+ });
132
+
133
+ export { NodeHandleTooltip as default };
134
+ //# sourceMappingURL=NodeHandleTooltip.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NodeHandleTooltip.esm.js","sources":["../../../../../src/features/environment/graph/handles/NodeHandleTooltip.tsx"],"sourcesContent":["import { ReactNode } from 'react';\nimport Box from '@massdriver/ui/Box';\nimport Typography from '@massdriver/ui/Typography';\nimport Tooltip from '@massdriver/ui/Tooltip';\nimport Chip from '@massdriver/ui/Chip';\nimport stylin from '@massdriver/ui/stylin';\nimport { chipClasses } from '../../../../theme/muiClasses';\n\n// Read-only port of NodeHandleTooltip. The web app fetches the resource type\n// (for its icon) lazily on hover; that query is dropped here — the tooltip\n// shows the field name, resource-type id, and required/optional status only.\n\nconst TOOLTIP_BG = 'rgba(34, 51, 84, 0.95)';\nconst TOOLTIP_BORDER = 'rgba(255, 255, 255, 0.1)';\nconst TOOLTIP_TEXT_MUTED = 'rgba(255, 255, 255, 0.7)';\nconst TOOLTIP_TEXT_SUBTLE = 'rgba(255, 255, 255, 0.6)';\n\nconst NodeHandleTooltip = ({\n resourceTypeId,\n errorMessage,\n fieldName,\n required,\n isRemoteReference = false,\n showFieldStatus = true,\n placement,\n children,\n}: {\n resourceTypeId?: string | null;\n errorMessage?: string | null;\n fieldName?: string;\n required?: boolean | null;\n isRemoteReference?: boolean;\n showFieldStatus?: boolean;\n placement?: string;\n children: ReactNode;\n}) => {\n const title = errorMessage ? (\n <TooltipContent>\n <ErrorText>{errorMessage}</ErrorText>\n <FieldName as=\"span\">{fieldName}</FieldName>\n </TooltipContent>\n ) : (\n <TooltipContent>\n <HeaderSection>\n <ContentSection>\n <FieldName>{fieldName}</FieldName>\n <TypeText>{resourceTypeId}</TypeText>\n </ContentSection>\n </HeaderSection>\n {showFieldStatus ? (\n <MetaSection>\n <FieldStatusLabel variant=\"caption\">Field Status</FieldStatusLabel>\n <RequiredChip\n label={required ? 'Required' : 'Optional'}\n color={\n required ? (isRemoteReference ? 'success' : 'error') : 'info'\n }\n variant=\"filled\"\n size=\"small\"\n />\n </MetaSection>\n ) : null}\n {isRemoteReference ? (\n <RemoteReferenceNote variant=\"caption\">\n Fulfilled by a remote reference.\n </RemoteReferenceNote>\n ) : null}\n </TooltipContent>\n );\n\n return (\n <Tooltip\n title={title}\n arrow\n enterDelay={600}\n placement={placement}\n componentsProps={TOOLTIP_COMPONENTS_PROPS}\n >\n {children}\n </Tooltip>\n );\n};\n\nexport default NodeHandleTooltip;\n\nconst TOOLTIP_COMPONENTS_PROPS = {\n tooltip: {\n className: 'node-handle',\n sx: {\n bgcolor: TOOLTIP_BG,\n backdropFilter: 'blur(8px)',\n border: `1px solid ${TOOLTIP_BORDER}`,\n boxShadow: (theme: any) => theme.shadows[8],\n },\n },\n arrow: { sx: { color: TOOLTIP_BG } },\n};\n\nconst TooltipContent = stylin(Box)({\n display: 'flex',\n flexDirection: 'column',\n gap: 1.5,\n minWidth: 200,\n maxWidth: 300,\n});\n\nconst HeaderSection = stylin(Box)({\n display: 'flex',\n alignItems: 'flex-start',\n gap: 1.5,\n});\n\nconst ContentSection = stylin(Box)({\n display: 'flex',\n flexDirection: 'column',\n gap: 0.5,\n flex: 1,\n minWidth: 0,\n});\n\nconst MetaSection = stylin(Box)(({ theme }: { theme: any }) => ({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: theme.spacing(1),\n paddingTop: theme.spacing(0.5),\n borderTop: `1px solid ${TOOLTIP_BORDER}`,\n}));\n\nconst FieldStatusLabel = stylin(Typography)({\n color: TOOLTIP_TEXT_SUBTLE,\n});\n\nconst RemoteReferenceNote = stylin(Typography)(({ theme }: { theme: any }) => ({\n color: theme.palette.success.light,\n fontSize: '0.7rem',\n fontStyle: 'italic',\n textAlign: 'center',\n}));\n\nconst FieldName = stylin(Typography)(({ theme }: { theme: any }) => ({\n fontWeight: 600,\n fontSize: '0.875rem',\n color: theme.palette.common.white,\n lineHeight: 1.2,\n}));\n\nconst TypeText = stylin(Typography)({\n fontSize: '0.75rem',\n color: TOOLTIP_TEXT_MUTED,\n fontFamily: 'monospace',\n lineHeight: 1.2,\n});\n\nconst ErrorText = stylin(Typography)(({ theme }: { theme: any }) => ({\n color: theme.palette.error.light,\n fontWeight: 600,\n fontSize: '0.875rem',\n}));\n\nconst RequiredChip = stylin(Chip)({\n height: 18,\n fontSize: '0.625rem',\n fontWeight: 600,\n [`& .${chipClasses.label}`]: { px: 0.75 },\n});\n"],"names":[],"mappings":"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"}