@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,30 @@
1
+ import { jsxs, jsx } from 'react/jsx-runtime';
2
+ import Box from '@massdriver/ui/Box';
3
+ import Stack from '@massdriver/ui/Stack';
4
+ import Typography from '@massdriver/ui/Typography';
5
+ import stylin from '@massdriver/ui/stylin';
6
+
7
+ const TabHeader = ({
8
+ title,
9
+ description,
10
+ actions
11
+ }) => /* @__PURE__ */ jsxs(Wrapper, { children: [
12
+ /* @__PURE__ */ jsxs(Heading, { children: [
13
+ /* @__PURE__ */ jsx(Typography, { variant: "h6", children: title }),
14
+ description ? /* @__PURE__ */ jsx(Typography, { variant: "body2", color: "text.secondary", children: description }) : null
15
+ ] }),
16
+ actions ? /* @__PURE__ */ jsx(Stack, { direction: "row", spacing: 1.5, flexWrap: "wrap", useFlexGap: true, children: actions }) : null
17
+ ] });
18
+ const Wrapper = stylin(Box)(({ theme }) => ({
19
+ display: "flex",
20
+ flexDirection: "column",
21
+ gap: theme.spacing(2)
22
+ }));
23
+ const Heading = stylin(Box)(({ theme }) => ({
24
+ display: "flex",
25
+ flexDirection: "column",
26
+ gap: theme.spacing(0.5)
27
+ }));
28
+
29
+ export { TabHeader };
30
+ //# sourceMappingURL=TabHeader.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TabHeader.esm.js","sources":["../../../../src/features/resource/tabs/TabHeader.tsx"],"sourcesContent":["import Box from '@massdriver/ui/Box';\nimport Stack from '@massdriver/ui/Stack';\nimport Typography from '@massdriver/ui/Typography';\nimport stylin from '@massdriver/ui/stylin';\nimport { ReactNode } from 'react';\n\n// Ported from apps/web/shared/components/TabHeader.js. The plugin can't import\n// the web app's shared components, so this is a local, faithful copy: a stacked\n// title + description, with any actions rendered in a row below the heading.\nexport const TabHeader = ({\n title,\n description,\n actions,\n}: {\n title: ReactNode;\n description?: ReactNode;\n actions?: ReactNode;\n}) => (\n <Wrapper>\n <Heading>\n <Typography variant=\"h6\">{title}</Typography>\n {description ? (\n <Typography variant=\"body2\" color=\"text.secondary\">\n {description}\n </Typography>\n ) : null}\n </Heading>\n {actions ? (\n <Stack direction=\"row\" spacing={1.5} flexWrap=\"wrap\" useFlexGap>\n {actions}\n </Stack>\n ) : null}\n </Wrapper>\n);\n\nexport default TabHeader;\n\nconst Wrapper = stylin(Box)(({ theme }: { theme: any }) => ({\n display: 'flex',\n flexDirection: 'column',\n gap: theme.spacing(2),\n}));\n\nconst Heading = stylin(Box)(({ theme }: { theme: any }) => ({\n display: 'flex',\n flexDirection: 'column',\n gap: theme.spacing(0.5),\n}));\n"],"names":[],"mappings":";;;;;;AASO,MAAM,YAAY,CAAC;AAAA,EACxB,KAAA;AAAA,EACA,WAAA;AAAA,EACA;AACF,CAAA,0BAKG,OAAA,EAAA,EACC,QAAA,EAAA;AAAA,kBAAA,IAAA,CAAC,OAAA,EAAA,EACC,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,UAAA,EAAA,EAAW,OAAA,EAAQ,IAAA,EAAM,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,IAC/B,WAAA,uBACE,UAAA,EAAA,EAAW,OAAA,EAAQ,SAAQ,KAAA,EAAM,gBAAA,EAC/B,uBACH,CAAA,GACE;AAAA,GAAA,EACN,CAAA;AAAA,EACC,OAAA,mBACC,GAAA,CAAC,KAAA,EAAA,EAAM,SAAA,EAAU,KAAA,EAAM,OAAA,EAAS,GAAA,EAAK,QAAA,EAAS,MAAA,EAAO,UAAA,EAAU,IAAA,EAC5D,QAAA,EAAA,OAAA,EACH,CAAA,GACE;AAAA,CAAA,EACN;AAKF,MAAM,UAAU,MAAA,CAAO,GAAG,EAAE,CAAC,EAAE,OAAM,MAAuB;AAAA,EAC1D,OAAA,EAAS,MAAA;AAAA,EACT,aAAA,EAAe,QAAA;AAAA,EACf,GAAA,EAAK,KAAA,CAAM,OAAA,CAAQ,CAAC;AACtB,CAAA,CAAE,CAAA;AAEF,MAAM,UAAU,MAAA,CAAO,GAAG,EAAE,CAAC,EAAE,OAAM,MAAuB;AAAA,EAC1D,OAAA,EAAS,MAAA;AAAA,EACT,aAAA,EAAe,QAAA;AAAA,EACf,GAAA,EAAK,KAAA,CAAM,OAAA,CAAQ,GAAG;AACxB,CAAA,CAAE,CAAA;;;;"}
@@ -0,0 +1,35 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import Alert from '@massdriver/ui/Alert';
3
+ import DataList from '@massdriver/ui/DataList';
4
+ import { usePaginatedRelayQuery } from '../../../hooks/usePaginatedRelayQuery.esm.js';
5
+ import { USAGE_TYPE_CONFIG } from './UsageTab.helpers.esm.js';
6
+
7
+ const UsagePanel = ({
8
+ type,
9
+ resourceId
10
+ }) => {
11
+ const config = USAGE_TYPE_CONFIG[type];
12
+ const { items, loading, error, hasMore, dataListParams } = usePaginatedRelayQuery(config.query, {
13
+ responseKey: config.responseKey,
14
+ variables: { id: resourceId },
15
+ pageSize: 20
16
+ });
17
+ const columns = config.buildColumns();
18
+ const rows = items.map(config.mapRow);
19
+ return error ? /* @__PURE__ */ jsx(Alert, { severity: "error", children: String(error.message ?? error) }) : /* @__PURE__ */ jsx(
20
+ DataList,
21
+ {
22
+ rows,
23
+ columns,
24
+ loading,
25
+ serverSide: true,
26
+ hasMore,
27
+ emptyMessage: config.emptyMessage,
28
+ variant: "outlined",
29
+ ...dataListParams
30
+ }
31
+ );
32
+ };
33
+
34
+ export { UsagePanel };
35
+ //# sourceMappingURL=UsagePanel.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UsagePanel.esm.js","sources":["../../../../src/features/resource/tabs/UsagePanel.tsx"],"sourcesContent":["import Alert from '@massdriver/ui/Alert';\nimport DataList from '@massdriver/ui/DataList';\nimport { usePaginatedRelayQuery } from '../../../hooks/usePaginatedRelayQuery';\nimport { USAGE_TYPE_CONFIG, UsageType } from './UsageTab.helpers';\n\n// Ported from apps/web/features/resources/sections/UsageTab/UsagePanel/.\n\n/** One usage list (connections / remote references / environment defaults). */\nexport const UsagePanel = ({\n type,\n resourceId,\n}: {\n type: UsageType;\n resourceId: string;\n}) => {\n const config = USAGE_TYPE_CONFIG[type];\n\n const { items, loading, error, hasMore, dataListParams } =\n usePaginatedRelayQuery<any>(config.query, {\n responseKey: config.responseKey,\n variables: { id: resourceId },\n pageSize: 20,\n });\n\n const columns = config.buildColumns();\n const rows = items.map(config.mapRow);\n\n return error ? (\n <Alert severity=\"error\">{String(error.message ?? error)}</Alert>\n ) : (\n <DataList\n rows={rows}\n columns={columns}\n loading={loading}\n serverSide\n hasMore={hasMore}\n emptyMessage={config.emptyMessage}\n variant=\"outlined\"\n {...dataListParams}\n />\n );\n};\n"],"names":[],"mappings":";;;;;;AAQO,MAAM,aAAa,CAAC;AAAA,EACzB,IAAA;AAAA,EACA;AACF,CAAA,KAGM;AACJ,EAAA,MAAM,MAAA,GAAS,kBAAkB,IAAI,CAAA;AAErC,EAAA,MAAM,EAAE,OAAO,OAAA,EAAS,KAAA,EAAO,SAAS,cAAA,EAAe,GACrD,sBAAA,CAA4B,MAAA,CAAO,KAAA,EAAO;AAAA,IACxC,aAAa,MAAA,CAAO,WAAA;AAAA,IACpB,SAAA,EAAW,EAAE,EAAA,EAAI,UAAA,EAAW;AAAA,IAC5B,QAAA,EAAU;AAAA,GACX,CAAA;AAEH,EAAA,MAAM,OAAA,GAAU,OAAO,YAAA,EAAa;AACpC,EAAA,MAAM,IAAA,GAAO,KAAA,CAAM,GAAA,CAAI,MAAA,CAAO,MAAM,CAAA;AAEpC,EAAA,OAAO,KAAA,mBACL,GAAA,CAAC,KAAA,EAAA,EAAM,QAAA,EAAS,OAAA,EAAS,iBAAO,KAAA,CAAM,OAAA,IAAW,KAAK,CAAA,EAAE,CAAA,mBAExD,GAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,IAAA;AAAA,MACA,OAAA;AAAA,MACA,OAAA;AAAA,MACA,UAAA,EAAU,IAAA;AAAA,MACV,OAAA;AAAA,MACA,cAAc,MAAA,CAAO,YAAA;AAAA,MACrB,OAAA,EAAQ,UAAA;AAAA,MACP,GAAG;AAAA;AAAA,GACN;AAEJ;;;;"}
@@ -0,0 +1,91 @@
1
+ import { jsxs, jsx } from 'react/jsx-runtime';
2
+ import Box from '@massdriver/ui/Box';
3
+ import ToggleButton from '@massdriver/ui/ToggleButton';
4
+ import ToggleButtonGroup from '@massdriver/ui/ToggleButtonGroup';
5
+ import Tooltip from '@massdriver/ui/Tooltip';
6
+ import InfoOutlinedIcon from '@massdriver/ui/icons/InfoOutlinedIcon';
7
+ import stylin from '@massdriver/ui/stylin';
8
+ import { useState } from 'react';
9
+ import { SettingsTabLayout } from './SettingsTabLayout.esm.js';
10
+ import { TabHeader } from './TabHeader.esm.js';
11
+ import { UsagePanel } from './UsagePanel.esm.js';
12
+ import { USAGE_TYPE_ORDER, USAGE_TYPE_CONFIG } from './UsageTab.helpers.esm.js';
13
+
14
+ const TOOLTIP_SLOT_PROPS = {
15
+ tooltip: { sx: { maxWidth: 320, px: 1.25, py: 1 } }
16
+ };
17
+ const UsageTab = ({
18
+ resourceId,
19
+ resourceOrigin
20
+ }) => {
21
+ const isImported = resourceOrigin === "IMPORTED";
22
+ const types = isImported ? USAGE_TYPE_ORDER.filter((type) => type !== "connection") : USAGE_TYPE_ORDER;
23
+ const [activeType, setActiveType] = useState(USAGE_TYPE_ORDER[0]);
24
+ const effectiveType = types.includes(activeType) ? activeType : types[0];
25
+ const activeInfo = USAGE_TYPE_CONFIG[effectiveType].info;
26
+ const handleTypeChange = (value) => {
27
+ if (value && value !== effectiveType) setActiveType(value);
28
+ };
29
+ return /* @__PURE__ */ jsxs(SettingsTabLayout, { children: [
30
+ /* @__PURE__ */ jsx(
31
+ TabHeader,
32
+ {
33
+ title: "Usage",
34
+ description: "Places where this resource is currently being consumed."
35
+ }
36
+ ),
37
+ /* @__PURE__ */ jsxs(FilterBar, { children: [
38
+ /* @__PURE__ */ jsx(
39
+ ToggleButtonGroup,
40
+ {
41
+ value: effectiveType,
42
+ onChange: (_event, value) => handleTypeChange(value),
43
+ exclusive: true,
44
+ size: "small",
45
+ "aria-label": "Usage type",
46
+ children: types.map((type) => /* @__PURE__ */ jsx(ToggleButton, { value: type, children: USAGE_TYPE_CONFIG[type].label }, type))
47
+ }
48
+ ),
49
+ /* @__PURE__ */ jsx(
50
+ Tooltip,
51
+ {
52
+ arrow: true,
53
+ enterDelay: 200,
54
+ slotProps: TOOLTIP_SLOT_PROPS,
55
+ title: /* @__PURE__ */ jsx(TooltipText, { children: activeInfo }),
56
+ children: /* @__PURE__ */ jsx(InfoIconWrapper, { "aria-label": "About this usage type", children: /* @__PURE__ */ jsx(InfoOutlinedIcon, { fontSize: "inherit" }) })
57
+ }
58
+ )
59
+ ] }),
60
+ /* @__PURE__ */ jsx(
61
+ UsagePanel,
62
+ {
63
+ type: effectiveType,
64
+ resourceId
65
+ },
66
+ effectiveType
67
+ )
68
+ ] });
69
+ };
70
+ const FilterBar = stylin(Box)(({ theme }) => ({
71
+ display: "flex",
72
+ alignItems: "center",
73
+ gap: theme.spacing(1),
74
+ marginBottom: theme.spacing(2)
75
+ }));
76
+ const InfoIconWrapper = stylin("span")(({ theme }) => ({
77
+ display: "inline-flex",
78
+ alignItems: "center",
79
+ color: theme.palette.text.disabled,
80
+ fontSize: theme.typography.pxToRem(18),
81
+ "&:hover": {
82
+ color: theme.palette.text.secondary
83
+ }
84
+ }));
85
+ const TooltipText = stylin("span")(({ theme }) => ({
86
+ fontSize: theme.typography.pxToRem(12),
87
+ lineHeight: 1.4
88
+ }));
89
+
90
+ export { UsageTab };
91
+ //# sourceMappingURL=UsageTab.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UsageTab.esm.js","sources":["../../../../src/features/resource/tabs/UsageTab.tsx"],"sourcesContent":["import Box from '@massdriver/ui/Box';\nimport ToggleButton from '@massdriver/ui/ToggleButton';\nimport ToggleButtonGroup from '@massdriver/ui/ToggleButtonGroup';\nimport Tooltip from '@massdriver/ui/Tooltip';\nimport InfoOutlinedIcon from '@massdriver/ui/icons/InfoOutlinedIcon';\nimport stylin from '@massdriver/ui/stylin';\nimport { useState } from 'react';\nimport { SettingsTabLayout } from './SettingsTabLayout';\nimport { TabHeader } from './TabHeader';\nimport { UsagePanel } from './UsagePanel';\nimport {\n USAGE_TYPE_CONFIG,\n USAGE_TYPE_ORDER,\n UsageType,\n} from './UsageTab.helpers';\n\n// Ported from apps/web/features/resources/sections/UsageTab/UsageTab.{container,view}.js.\n// Imported resources have no connections, so that toggle is dropped for them.\n\nconst TOOLTIP_SLOT_PROPS = {\n tooltip: { sx: { maxWidth: 320, px: 1.25, py: 1 } },\n};\n\n/** Read-only Usage tab: consumption of this resource, grouped by usage type. */\nexport const UsageTab = ({\n resourceId,\n resourceOrigin,\n}: {\n resourceId: string;\n resourceOrigin?: string | null;\n}) => {\n const isImported = resourceOrigin === 'IMPORTED';\n const types = isImported\n ? USAGE_TYPE_ORDER.filter(type => type !== 'connection')\n : USAGE_TYPE_ORDER;\n\n const [activeType, setActiveType] = useState<UsageType>(USAGE_TYPE_ORDER[0]);\n // If the current selection isn't available (e.g. an imported resource can't\n // show connections), fall back to the first available type.\n const effectiveType = types.includes(activeType) ? activeType : types[0];\n const activeInfo = USAGE_TYPE_CONFIG[effectiveType].info;\n\n const handleTypeChange = (value: UsageType | null) => {\n if (value && value !== effectiveType) setActiveType(value);\n };\n\n return (\n <SettingsTabLayout>\n <TabHeader\n title=\"Usage\"\n description=\"Places where this resource is currently being consumed.\"\n />\n <FilterBar>\n <ToggleButtonGroup\n value={effectiveType}\n onChange={(_event: unknown, value: UsageType | null) =>\n handleTypeChange(value)\n }\n exclusive\n size=\"small\"\n aria-label=\"Usage type\"\n >\n {types.map(type => (\n <ToggleButton key={type} value={type}>\n {USAGE_TYPE_CONFIG[type].label}\n </ToggleButton>\n ))}\n </ToggleButtonGroup>\n <Tooltip\n arrow\n enterDelay={200}\n slotProps={TOOLTIP_SLOT_PROPS}\n title={<TooltipText>{activeInfo}</TooltipText>}\n >\n <InfoIconWrapper aria-label=\"About this usage type\">\n <InfoOutlinedIcon fontSize=\"inherit\" />\n </InfoIconWrapper>\n </Tooltip>\n </FilterBar>\n {/* key={type} so DataList paging state resets when the type changes. */}\n <UsagePanel\n key={effectiveType}\n type={effectiveType}\n resourceId={resourceId}\n />\n </SettingsTabLayout>\n );\n};\n\nconst FilterBar = stylin(Box)(({ theme }: { theme: any }) => ({\n display: 'flex',\n alignItems: 'center',\n gap: theme.spacing(1),\n marginBottom: theme.spacing(2),\n}));\n\nconst InfoIconWrapper = stylin('span')(({ theme }: { theme: any }) => ({\n display: 'inline-flex',\n alignItems: 'center',\n color: theme.palette.text.disabled,\n fontSize: theme.typography.pxToRem(18),\n '&:hover': {\n color: theme.palette.text.secondary,\n },\n}));\n\nconst TooltipText = stylin('span')(({ theme }: { theme: any }) => ({\n fontSize: theme.typography.pxToRem(12),\n lineHeight: 1.4,\n}));\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,168 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import { parseEnvironmentId, parseInstanceId } from '@massdriver/backstage-plugin-common';
3
+ import Box from '@massdriver/ui/Box';
4
+ import { col } from '@massdriver/ui/DataList';
5
+ import stylin from '@massdriver/ui/stylin';
6
+ import { InstanceStatusPill } from '../../../components/InstanceStatusPill.esm.js';
7
+ import { RouterLinkAdapter } from '../../../components/RouterLinkAdapter.esm.js';
8
+ import { internalRoutes } from '../../../internalRoutes.esm.js';
9
+ import { formatAbsoluteTime, formatRelativeTime } from '../../../utils/formatRelativeTime.esm.js';
10
+ import { RESOURCE_ENVIRONMENT_DEFAULTS_QUERY, RESOURCE_REMOTE_REFERENCES_QUERY, RESOURCE_CONNECTIONS_QUERY } from '../queries.esm.js';
11
+
12
+ const buildInstanceHref = (instance) => {
13
+ if (!instance?.id) return null;
14
+ const { projectId, scopedEnvironmentId, scopedComponentId } = parseInstanceId(
15
+ instance.id
16
+ );
17
+ if (!projectId || !scopedEnvironmentId || !scopedComponentId) return null;
18
+ return internalRoutes.instance(
19
+ projectId,
20
+ scopedEnvironmentId,
21
+ scopedComponentId
22
+ );
23
+ };
24
+ const buildEnvironmentHref = (environment) => {
25
+ if (!environment?.id) return null;
26
+ const { projectId, scopedEnvironmentId } = parseEnvironmentId(environment.id);
27
+ if (!projectId || !scopedEnvironmentId) return null;
28
+ return internalRoutes.environment(projectId, environment.id);
29
+ };
30
+ const buildProjectHref = (project) => project?.id ? internalRoutes.project(project.id) : null;
31
+ const since = (iso) => ({
32
+ when: formatRelativeTime(iso),
33
+ whenAbsolute: formatAbsoluteTime(iso)
34
+ });
35
+ const mapConnectionRow = (connection) => {
36
+ const target = connection.toInstance;
37
+ const project = target?.environment?.project;
38
+ return {
39
+ id: connection.id,
40
+ instance: target?.id ?? "--",
41
+ instanceHref: buildInstanceHref(target),
42
+ field: connection.toField || "--",
43
+ instanceType: target?.bundle?.name ?? "--",
44
+ status: target?.status ?? null,
45
+ project: project?.name ?? "--",
46
+ projectHref: buildProjectHref(project),
47
+ ...since(connection.createdAt)
48
+ };
49
+ };
50
+ const mapRemoteReferenceRow = (reference) => {
51
+ const target = reference.instance;
52
+ const project = target?.environment?.project;
53
+ return {
54
+ id: reference.id,
55
+ instance: target?.id ?? "--",
56
+ instanceHref: buildInstanceHref(target),
57
+ field: reference.field || "--",
58
+ instanceType: target?.bundle?.name ?? "--",
59
+ status: target?.status ?? null,
60
+ project: project?.name ?? "--",
61
+ projectHref: buildProjectHref(project),
62
+ ...since(reference.createdAt)
63
+ };
64
+ };
65
+ const mapEnvironmentDefaultRow = (envDefault) => {
66
+ const target = envDefault.environment;
67
+ return {
68
+ id: envDefault.id,
69
+ environment: target?.name ?? "--",
70
+ environmentHref: buildEnvironmentHref(target),
71
+ project: target?.project?.name ?? "--",
72
+ projectHref: buildProjectHref(target?.project),
73
+ ...since(envDefault.createdAt)
74
+ };
75
+ };
76
+ const renderLink = (hrefField, nameField) => (_value, row) => {
77
+ const name = row[nameField];
78
+ const href = row[hrefField];
79
+ return href ? /* @__PURE__ */ jsx(CellLink, { component: RouterLinkAdapter, href, children: name }) : name;
80
+ };
81
+ const renderStatus = (value) => value ? /* @__PURE__ */ jsx(InstanceStatusPill, { status: value }) : "--";
82
+ const staticCol = (field, header, options = {}) => col.text(field, header, { sortable: false, searchable: false, ...options });
83
+ const whenColumn = (header) => staticCol("when", header, {
84
+ flex: 1,
85
+ minWidth: 130,
86
+ emptyFallback: "\u2014",
87
+ tooltip: (_value, row) => row.whenAbsolute
88
+ });
89
+ const projectColumn = () => col.custom("project", "Project", renderLink("projectHref", "project"), {
90
+ flex: 1,
91
+ minWidth: 150,
92
+ sortable: false,
93
+ searchable: false
94
+ });
95
+ const buildInstanceUsageColumns = (dateHeader) => [
96
+ col.custom("instance", "Instance", renderLink("instanceHref", "instance"), {
97
+ flex: 2,
98
+ minWidth: 200,
99
+ sortable: false,
100
+ searchable: false
101
+ }),
102
+ staticCol("field", "Field", { flex: 1, minWidth: 140 }),
103
+ staticCol("instanceType", "Instance type", { flex: 1, minWidth: 150 }),
104
+ col.custom("status", "Status", renderStatus, {
105
+ width: 150,
106
+ sortable: false,
107
+ searchable: false
108
+ }),
109
+ projectColumn(),
110
+ whenColumn(dateHeader)
111
+ ];
112
+ const buildEnvironmentDefaultColumns = () => [
113
+ col.custom(
114
+ "environment",
115
+ "Environment",
116
+ renderLink("environmentHref", "environment"),
117
+ {
118
+ flex: 2,
119
+ minWidth: 200,
120
+ sortable: false,
121
+ searchable: false
122
+ }
123
+ ),
124
+ projectColumn(),
125
+ whenColumn("Configured")
126
+ ];
127
+ const USAGE_TYPE_ORDER = [
128
+ "connection",
129
+ "reference",
130
+ "default"
131
+ ];
132
+ const USAGE_TYPE_CONFIG = {
133
+ connection: {
134
+ label: "Connections",
135
+ info: "Other instances in your environments that consume this resource at runtime through a blueprint link.",
136
+ query: RESOURCE_CONNECTIONS_QUERY,
137
+ responseKey: ["resource", "connections"],
138
+ mapRow: mapConnectionRow,
139
+ buildColumns: () => buildInstanceUsageColumns("Connected"),
140
+ emptyMessage: "No instances consume this resource through a connection."
141
+ },
142
+ reference: {
143
+ label: "Remote references",
144
+ info: "Per-instance overrides where an instance's connection slot has been explicitly pointed at this resource instead of resolving automatically.",
145
+ query: RESOURCE_REMOTE_REFERENCES_QUERY,
146
+ responseKey: ["resource", "remoteReferences"],
147
+ mapRow: mapRemoteReferenceRow,
148
+ buildColumns: () => buildInstanceUsageColumns("Configured"),
149
+ emptyMessage: "No remote references point at this resource."
150
+ },
151
+ default: {
152
+ label: "Environment defaults",
153
+ info: "Environments where this resource is set as the default for its resource type, used by any new instance that needs this type.",
154
+ query: RESOURCE_ENVIRONMENT_DEFAULTS_QUERY,
155
+ responseKey: ["resource", "environmentDefaults"],
156
+ mapRow: mapEnvironmentDefaultRow,
157
+ buildColumns: buildEnvironmentDefaultColumns,
158
+ emptyMessage: "This resource is not the default in any environment."
159
+ }
160
+ };
161
+ const CellLink = stylin(Box)(({ theme }) => ({
162
+ color: theme.palette.text.primary,
163
+ textDecoration: "none",
164
+ "&:hover": { textDecoration: "underline" }
165
+ }));
166
+
167
+ export { USAGE_TYPE_CONFIG, USAGE_TYPE_ORDER };
168
+ //# sourceMappingURL=UsageTab.helpers.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UsageTab.helpers.esm.js","sources":["../../../../src/features/resource/tabs/UsageTab.helpers.tsx"],"sourcesContent":["import {\n parseEnvironmentId,\n parseInstanceId,\n} from '@massdriver/backstage-plugin-common';\nimport Box from '@massdriver/ui/Box';\nimport { col } from '@massdriver/ui/DataList';\nimport stylin from '@massdriver/ui/stylin';\nimport { ReactNode } from 'react';\nimport { InstanceStatusPill } from '../../../components/InstanceStatusPill';\nimport { RouterLinkAdapter } from '../../../components/RouterLinkAdapter';\nimport { internalRoutes } from '../../../internalRoutes';\nimport {\n formatAbsoluteTime,\n formatRelativeTime,\n} from '../../../utils/formatRelativeTime';\nimport {\n RESOURCE_CONNECTIONS_QUERY,\n RESOURCE_ENVIRONMENT_DEFAULTS_QUERY,\n RESOURCE_REMOTE_REFERENCES_QUERY,\n} from '../queries';\n\n// Ported from apps/web/features/resources/sections/UsageTab/UsageTab.helpers.js.\n// Instance/project/environment links are internal (react-router). The status\n// column uses InstanceStatusPill — the faithful equivalent of the web helper's\n// tinted lowercase StatusChip (renderInstanceStatus).\n\nexport type UsageType = 'connection' | 'reference' | 'default';\n\ninterface UsageRow {\n id: string;\n instance?: string;\n instanceHref?: string | null;\n field?: string;\n instanceType?: string;\n status?: string | null;\n environment?: string;\n environmentHref?: string | null;\n project: string;\n projectHref: string | null;\n when: string;\n whenAbsolute: string;\n}\n\ninterface InstanceLeaf {\n id?: string;\n status?: string | null;\n bundle?: { id: string; name?: string | null } | null;\n environment?: {\n id: string;\n project?: { id: string; name?: string | null } | null;\n } | null;\n}\n\nconst buildInstanceHref = (instance?: InstanceLeaf | null): string | null => {\n if (!instance?.id) return null;\n const { projectId, scopedEnvironmentId, scopedComponentId } = parseInstanceId(\n instance.id,\n );\n if (!projectId || !scopedEnvironmentId || !scopedComponentId) return null;\n return internalRoutes.instance(\n projectId,\n scopedEnvironmentId,\n scopedComponentId,\n );\n};\n\nconst buildEnvironmentHref = (\n environment?: { id?: string } | null,\n): string | null => {\n if (!environment?.id) return null;\n const { projectId, scopedEnvironmentId } = parseEnvironmentId(environment.id);\n if (!projectId || !scopedEnvironmentId) return null;\n return internalRoutes.environment(projectId, environment.id);\n};\n\nconst buildProjectHref = (project?: { id?: string } | null): string | null =>\n project?.id ? internalRoutes.project(project.id) : null;\n\nconst since = (iso?: string | null) => ({\n when: formatRelativeTime(iso),\n whenAbsolute: formatAbsoluteTime(iso),\n});\n\ninterface ConnectionItem {\n id: string;\n toField?: string | null;\n createdAt?: string | null;\n toInstance?: InstanceLeaf | null;\n}\n\ninterface ReferenceItem {\n id: string;\n field?: string | null;\n createdAt?: string | null;\n instance?: InstanceLeaf | null;\n}\n\ninterface EnvironmentDefaultItem {\n id: string;\n createdAt?: string | null;\n environment?: {\n id: string;\n name?: string | null;\n project?: { id: string; name?: string | null } | null;\n } | null;\n}\n\nconst mapConnectionRow = (connection: ConnectionItem): UsageRow => {\n const target = connection.toInstance;\n const project = target?.environment?.project;\n return {\n id: connection.id,\n instance: target?.id ?? '--',\n instanceHref: buildInstanceHref(target),\n field: connection.toField || '--',\n instanceType: target?.bundle?.name ?? '--',\n status: target?.status ?? null,\n project: project?.name ?? '--',\n projectHref: buildProjectHref(project),\n ...since(connection.createdAt),\n };\n};\n\nconst mapRemoteReferenceRow = (reference: ReferenceItem): UsageRow => {\n const target = reference.instance;\n const project = target?.environment?.project;\n return {\n id: reference.id,\n instance: target?.id ?? '--',\n instanceHref: buildInstanceHref(target),\n field: reference.field || '--',\n instanceType: target?.bundle?.name ?? '--',\n status: target?.status ?? null,\n project: project?.name ?? '--',\n projectHref: buildProjectHref(project),\n ...since(reference.createdAt),\n };\n};\n\nconst mapEnvironmentDefaultRow = (\n envDefault: EnvironmentDefaultItem,\n): UsageRow => {\n const target = envDefault.environment;\n return {\n id: envDefault.id,\n environment: target?.name ?? '--',\n environmentHref: buildEnvironmentHref(target),\n project: target?.project?.name ?? '--',\n projectHref: buildProjectHref(target?.project),\n ...since(envDefault.createdAt),\n };\n};\n\nconst renderLink =\n (hrefField: keyof UsageRow, nameField: keyof UsageRow) =>\n (_value: unknown, row: UsageRow): ReactNode => {\n const name = row[nameField] as ReactNode;\n const href = row[hrefField] as string | null | undefined;\n return href ? (\n <CellLink component={RouterLinkAdapter} href={href}>\n {name}\n </CellLink>\n ) : (\n name\n );\n };\n\nconst renderStatus = (value: unknown): ReactNode =>\n value ? <InstanceStatusPill status={value as string} /> : '--';\n\nconst staticCol = (\n field: string,\n header: string,\n options: Record<string, unknown> = {},\n) =>\n col.text(field, header, { sortable: false, searchable: false, ...options });\n\nconst whenColumn = (header: string) =>\n staticCol('when', header, {\n flex: 1,\n minWidth: 130,\n emptyFallback: '—',\n tooltip: (_value: unknown, row: UsageRow) => row.whenAbsolute,\n });\n\nconst projectColumn = () =>\n col.custom('project', 'Project', renderLink('projectHref', 'project'), {\n flex: 1,\n minWidth: 150,\n sortable: false,\n searchable: false,\n });\n\n// Connections and remote references describe the same thing — an instance\n// consuming this resource through a field — so they share a column layout and\n// differ only in the date header (\"Connected\" vs \"Configured\").\nconst buildInstanceUsageColumns = (dateHeader: string) => [\n col.custom('instance', 'Instance', renderLink('instanceHref', 'instance'), {\n flex: 2,\n minWidth: 200,\n sortable: false,\n searchable: false,\n }),\n staticCol('field', 'Field', { flex: 1, minWidth: 140 }),\n staticCol('instanceType', 'Instance type', { flex: 1, minWidth: 150 }),\n col.custom('status', 'Status', renderStatus, {\n width: 150,\n sortable: false,\n searchable: false,\n }),\n projectColumn(),\n whenColumn(dateHeader),\n];\n\nconst buildEnvironmentDefaultColumns = () => [\n col.custom(\n 'environment',\n 'Environment',\n renderLink('environmentHref', 'environment'),\n {\n flex: 2,\n minWidth: 200,\n sortable: false,\n searchable: false,\n },\n ),\n projectColumn(),\n whenColumn('Configured'),\n];\n\nexport const USAGE_TYPE_ORDER: UsageType[] = [\n 'connection',\n 'reference',\n 'default',\n];\n\nexport interface UsageTypeConfig {\n label: string;\n info: string;\n query: string;\n responseKey: string[];\n mapRow: (item: any) => UsageRow;\n buildColumns: () => ReturnType<typeof col.custom>[];\n emptyMessage: string;\n}\n\nexport const USAGE_TYPE_CONFIG: Record<UsageType, UsageTypeConfig> = {\n connection: {\n label: 'Connections',\n info: 'Other instances in your environments that consume this resource at runtime through a blueprint link.',\n query: RESOURCE_CONNECTIONS_QUERY,\n responseKey: ['resource', 'connections'],\n mapRow: mapConnectionRow,\n buildColumns: () => buildInstanceUsageColumns('Connected'),\n emptyMessage: 'No instances consume this resource through a connection.',\n },\n reference: {\n label: 'Remote references',\n info: \"Per-instance overrides where an instance's connection slot has been explicitly pointed at this resource instead of resolving automatically.\",\n query: RESOURCE_REMOTE_REFERENCES_QUERY,\n responseKey: ['resource', 'remoteReferences'],\n mapRow: mapRemoteReferenceRow,\n buildColumns: () => buildInstanceUsageColumns('Configured'),\n emptyMessage: 'No remote references point at this resource.',\n },\n default: {\n label: 'Environment defaults',\n info: 'Environments where this resource is set as the default for its resource type, used by any new instance that needs this type.',\n query: RESOURCE_ENVIRONMENT_DEFAULTS_QUERY,\n responseKey: ['resource', 'environmentDefaults'],\n mapRow: mapEnvironmentDefaultRow,\n buildColumns: buildEnvironmentDefaultColumns,\n emptyMessage: 'This resource is not the default in any environment.',\n },\n};\n\nconst CellLink = stylin(Box)(({ theme }: { theme: any }) => ({\n color: theme.palette.text.primary,\n textDecoration: 'none',\n '&:hover': { textDecoration: 'underline' },\n}));\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,148 @@
1
+ import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
2
+ import Box from '@massdriver/ui/Box';
3
+ import Button from '@massdriver/ui/Button';
4
+ import Typography from '@massdriver/ui/Typography';
5
+ import GitHubIcon from '@massdriver/ui/icons/GitHubIcon';
6
+ import stylin from '@massdriver/ui/stylin';
7
+ import { OpenInMassdriverButton } from '../../components/OpenInMassdriverButton.esm.js';
8
+
9
+ const CATALOG_REPO_URL = "https://github.com/massdriver-cloud/massdriver-catalog";
10
+ const STEPS = [
11
+ {
12
+ title: "Clone the catalog repository",
13
+ description: "This repository contains example resource type definitions and bundle schemas that you will customize for your organization."
14
+ },
15
+ {
16
+ title: "Publish the catalog to Massdriver",
17
+ description: /* @__PURE__ */ jsxs(Fragment, { children: [
18
+ "Use the included ",
19
+ /* @__PURE__ */ jsx("code", { children: "make" }),
20
+ " targets or GitHub Actions to publish resource types and bundles to your Massdriver instance."
21
+ ] })
22
+ },
23
+ {
24
+ title: "Model your architecture in the UI",
25
+ description: "Add bundles to a canvas, configure parameters, and connect resources. Changes made in the repository are reflected in the Massdriver UI as you iterate."
26
+ },
27
+ {
28
+ title: "Implement infrastructure when ready",
29
+ description: "Replace the placeholder OpenTofu/Terraform code in bundles after the model and developer experience are defined."
30
+ }
31
+ ];
32
+ const ResourcesEmptyState = ({ importUrl }) => /* @__PURE__ */ jsxs(Card, { children: [
33
+ /* @__PURE__ */ jsx(Heading, { variant: "h5", children: "Set Up Your Massdriver Catalog" }),
34
+ /* @__PURE__ */ jsx(Body, { children: "The Massdriver Catalog is where you define resource types, infrastructure bundles, and cloud support for your developer platform. Resources flow into Massdriver automatically as instances deploy, or you can import existing resources by hand." }),
35
+ /* @__PURE__ */ jsx(Subtitle, { children: "Next Steps" }),
36
+ /* @__PURE__ */ jsx(Steps, { children: STEPS.map((step, index) => /* @__PURE__ */ jsxs(Step, { children: [
37
+ /* @__PURE__ */ jsx(StepNumber, { children: index + 1 }),
38
+ /* @__PURE__ */ jsxs(StepBody, { children: [
39
+ /* @__PURE__ */ jsx(StepTitle, { children: step.title }),
40
+ /* @__PURE__ */ jsx(StepDescription, { children: step.description })
41
+ ] })
42
+ ] }, step.title)) }),
43
+ /* @__PURE__ */ jsx(Footnote, { children: "For details on structure, workflow, and customization, see the repository README." }),
44
+ /* @__PURE__ */ jsxs(Actions, { children: [
45
+ /* @__PURE__ */ jsx(
46
+ Button,
47
+ {
48
+ variant: "contained",
49
+ component: "a",
50
+ href: CATALOG_REPO_URL,
51
+ target: "_blank",
52
+ rel: "noopener noreferrer",
53
+ startIcon: /* @__PURE__ */ jsx(GitHubIcon, {}),
54
+ children: "Clone the Catalog"
55
+ }
56
+ ),
57
+ importUrl ? /* @__PURE__ */ jsx(OpenInMassdriverButton, { url: importUrl, variant: "outlined", children: "Import a Resource" }) : null
58
+ ] })
59
+ ] });
60
+ const Card = stylin(Box)(({ theme }) => ({
61
+ display: "flex",
62
+ flexDirection: "column",
63
+ padding: theme.spacing(4),
64
+ border: `1px solid ${theme.palette.divider}`,
65
+ borderRadius: 1,
66
+ backgroundColor: theme.palette.background.paper,
67
+ maxWidth: theme.spacing(96),
68
+ marginLeft: "auto",
69
+ marginRight: "auto",
70
+ marginTop: theme.spacing(4)
71
+ }));
72
+ const Heading = stylin(Typography)(({ theme }) => ({
73
+ fontWeight: 700,
74
+ marginBottom: theme.spacing(1.5),
75
+ color: theme.palette.text.primary
76
+ }));
77
+ const Body = stylin(Typography)(({ theme }) => ({
78
+ fontSize: "1rem",
79
+ marginBottom: theme.spacing(3),
80
+ color: theme.palette.text.secondary,
81
+ lineHeight: 1.6
82
+ }));
83
+ const Subtitle = stylin(Typography)(({ theme }) => ({
84
+ fontSize: "1.125rem",
85
+ fontWeight: 600,
86
+ marginBottom: theme.spacing(2),
87
+ color: theme.palette.text.primary
88
+ }));
89
+ const Steps = stylin(Box)(({ theme }) => ({
90
+ display: "flex",
91
+ flexDirection: "column",
92
+ gap: theme.spacing(2),
93
+ marginBottom: theme.spacing(3)
94
+ }));
95
+ const Step = stylin(Box)(({ theme }) => ({
96
+ display: "flex",
97
+ gap: theme.spacing(1.5),
98
+ alignItems: "flex-start"
99
+ }));
100
+ const StepNumber = stylin(Box)(({ theme }) => ({
101
+ width: 24,
102
+ height: 24,
103
+ borderRadius: "50%",
104
+ backgroundColor: theme.palette.primary.main,
105
+ color: theme.palette.primary.contrastText,
106
+ display: "flex",
107
+ alignItems: "center",
108
+ justifyContent: "center",
109
+ fontSize: "0.75rem",
110
+ fontWeight: 600,
111
+ flexShrink: 0,
112
+ marginTop: "1px"
113
+ }));
114
+ const StepBody = stylin(Box)({
115
+ flex: 1
116
+ });
117
+ const StepTitle = stylin(Typography)(({ theme }) => ({
118
+ fontSize: "1rem",
119
+ fontWeight: 600,
120
+ marginBottom: theme.spacing(0.25),
121
+ color: theme.palette.text.primary
122
+ }));
123
+ const StepDescription = stylin(Typography)(({ theme }) => ({
124
+ fontSize: "0.875rem",
125
+ color: theme.palette.text.secondary,
126
+ lineHeight: 1.6,
127
+ "& code": {
128
+ backgroundColor: theme.palette.action.hover,
129
+ padding: "1px 4px",
130
+ borderRadius: "3px",
131
+ fontSize: "0.8125rem",
132
+ fontFamily: "monospace"
133
+ }
134
+ }));
135
+ const Footnote = stylin(Typography)(({ theme }) => ({
136
+ fontSize: "0.875rem",
137
+ color: theme.palette.text.secondary,
138
+ marginBottom: theme.spacing(2)
139
+ }));
140
+ const Actions = stylin(Box)(({ theme }) => ({
141
+ display: "flex",
142
+ justifyContent: "center",
143
+ gap: theme.spacing(1.5),
144
+ flexWrap: "wrap"
145
+ }));
146
+
147
+ export { ResourcesEmptyState };
148
+ //# sourceMappingURL=ResourcesEmptyState.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ResourcesEmptyState.esm.js","sources":["../../../src/features/resources/ResourcesEmptyState.tsx"],"sourcesContent":["import Box from '@massdriver/ui/Box';\nimport Button from '@massdriver/ui/Button';\nimport Typography from '@massdriver/ui/Typography';\nimport GitHubIcon from '@massdriver/ui/icons/GitHubIcon';\nimport stylin from '@massdriver/ui/stylin';\nimport { ReactNode } from 'react';\nimport { OpenInMassdriverButton } from '../../components/OpenInMassdriverButton';\n\n// Ported from apps/web/features/resources/components/ResourcesEmptyState.js.\n// The web app's \"Import a Resource\" opens a dialog; in this read-only mirror it\n// deep-links into Massdriver instead.\n\nconst CATALOG_REPO_URL =\n 'https://github.com/massdriver-cloud/massdriver-catalog';\n\ninterface StepItem {\n title: string;\n description: ReactNode;\n}\n\nconst STEPS: StepItem[] = [\n {\n title: 'Clone the catalog repository',\n description:\n 'This repository contains example resource type definitions and bundle schemas that you will customize for your organization.',\n },\n {\n title: 'Publish the catalog to Massdriver',\n description: (\n <>\n Use the included <code>make</code> targets or GitHub Actions to publish\n resource types and bundles to your Massdriver instance.\n </>\n ),\n },\n {\n title: 'Model your architecture in the UI',\n description:\n 'Add bundles to a canvas, configure parameters, and connect resources. Changes made in the repository are reflected in the Massdriver UI as you iterate.',\n },\n {\n title: 'Implement infrastructure when ready',\n description:\n 'Replace the placeholder OpenTofu/Terraform code in bundles after the model and developer experience are defined.',\n },\n];\n\n/** Catalog-onboarding card shown when there are no resources and no active filters. */\nexport const ResourcesEmptyState = ({ importUrl }: { importUrl?: string }) => (\n <Card>\n <Heading variant=\"h5\">Set Up Your Massdriver Catalog</Heading>\n <Body>\n The Massdriver Catalog is where you define resource types, infrastructure\n bundles, and cloud support for your developer platform. Resources flow\n into Massdriver automatically as instances deploy, or you can import\n existing resources by hand.\n </Body>\n\n <Subtitle>Next Steps</Subtitle>\n\n <Steps>\n {STEPS.map((step, index) => (\n <Step key={step.title}>\n <StepNumber>{index + 1}</StepNumber>\n <StepBody>\n <StepTitle>{step.title}</StepTitle>\n <StepDescription>{step.description}</StepDescription>\n </StepBody>\n </Step>\n ))}\n </Steps>\n\n <Footnote>\n For details on structure, workflow, and customization, see the repository\n README.\n </Footnote>\n\n <Actions>\n <Button\n variant=\"contained\"\n component=\"a\"\n href={CATALOG_REPO_URL}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n startIcon={<GitHubIcon />}\n >\n Clone the Catalog\n </Button>\n {importUrl ? (\n <OpenInMassdriverButton url={importUrl} variant=\"outlined\">\n Import a Resource\n </OpenInMassdriverButton>\n ) : null}\n </Actions>\n </Card>\n);\n\nexport default ResourcesEmptyState;\n\nconst Card = stylin(Box)(({ theme }: { theme: any }) => ({\n display: 'flex',\n flexDirection: 'column',\n padding: theme.spacing(4),\n border: `1px solid ${theme.palette.divider}`,\n borderRadius: 1,\n backgroundColor: theme.palette.background.paper,\n maxWidth: theme.spacing(96),\n marginLeft: 'auto',\n marginRight: 'auto',\n marginTop: theme.spacing(4),\n}));\n\nconst Heading = stylin(Typography)(({ theme }: { theme: any }) => ({\n fontWeight: 700,\n marginBottom: theme.spacing(1.5),\n color: theme.palette.text.primary,\n}));\n\nconst Body = stylin(Typography)(({ theme }: { theme: any }) => ({\n fontSize: '1rem',\n marginBottom: theme.spacing(3),\n color: theme.palette.text.secondary,\n lineHeight: 1.6,\n}));\n\nconst Subtitle = stylin(Typography)(({ theme }: { theme: any }) => ({\n fontSize: '1.125rem',\n fontWeight: 600,\n marginBottom: theme.spacing(2),\n color: theme.palette.text.primary,\n}));\n\nconst Steps = stylin(Box)(({ theme }: { theme: any }) => ({\n display: 'flex',\n flexDirection: 'column',\n gap: theme.spacing(2),\n marginBottom: theme.spacing(3),\n}));\n\nconst Step = stylin(Box)(({ theme }: { theme: any }) => ({\n display: 'flex',\n gap: theme.spacing(1.5),\n alignItems: 'flex-start',\n}));\n\nconst StepNumber = stylin(Box)(({ theme }: { theme: any }) => ({\n width: 24,\n height: 24,\n borderRadius: '50%',\n backgroundColor: theme.palette.primary.main,\n color: theme.palette.primary.contrastText,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n fontSize: '0.75rem',\n fontWeight: 600,\n flexShrink: 0,\n marginTop: '1px',\n}));\n\nconst StepBody = stylin(Box)({\n flex: 1,\n});\n\nconst StepTitle = stylin(Typography)(({ theme }: { theme: any }) => ({\n fontSize: '1rem',\n fontWeight: 600,\n marginBottom: theme.spacing(0.25),\n color: theme.palette.text.primary,\n}));\n\nconst StepDescription = stylin(Typography)(({ theme }: { theme: any }) => ({\n fontSize: '0.875rem',\n color: theme.palette.text.secondary,\n lineHeight: 1.6,\n '& code': {\n backgroundColor: theme.palette.action.hover,\n padding: '1px 4px',\n borderRadius: '3px',\n fontSize: '0.8125rem',\n fontFamily: 'monospace',\n },\n}));\n\nconst Footnote = stylin(Typography)(({ theme }: { theme: any }) => ({\n fontSize: '0.875rem',\n color: theme.palette.text.secondary,\n marginBottom: theme.spacing(2),\n}));\n\nconst Actions = stylin(Box)(({ theme }: { theme: any }) => ({\n display: 'flex',\n justifyContent: 'center',\n gap: theme.spacing(1.5),\n flexWrap: 'wrap',\n}));\n"],"names":[],"mappings":"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"}