@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,75 @@
1
+ import { jsxs, jsx } from 'react/jsx-runtime';
2
+ import { InfoCard, Progress, ResponseErrorPanel, StructuredMetadataTable } from '@backstage/core-components';
3
+ import { useApi } from '@backstage/frontend-plugin-api';
4
+ import { useEntity } from '@backstage/plugin-catalog-react';
5
+ import { instanceUrl, environmentUrl, projectUrl } from '@massdriver/backstage-plugin-common';
6
+ import { massdriverApiRef } from '../../api.esm.js';
7
+ import { getMassdriverScope } from '../../entity.esm.js';
8
+ import { useMassdriverInstances } from '../../useInstances.esm.js';
9
+ import { InstanceStatusIndicator } from '../InstanceStatusIndicator.esm.js';
10
+
11
+ const deepLinkFor = (scope, appUrl, orgId) => {
12
+ switch (scope.kind) {
13
+ case "project":
14
+ return projectUrl(appUrl, orgId, scope.projectId);
15
+ case "environment":
16
+ return environmentUrl(appUrl, orgId, scope.environmentId);
17
+ case "instance":
18
+ return instanceUrl(appUrl, orgId, scope.instanceId);
19
+ default:
20
+ return appUrl;
21
+ }
22
+ };
23
+ const summaryMetadata = (scope, instances) => {
24
+ if (scope.kind === "instance") {
25
+ const instance = instances[0];
26
+ if (!instance) {
27
+ return { Status: "Not found" };
28
+ }
29
+ return {
30
+ Status: /* @__PURE__ */ jsx(InstanceStatusIndicator, { status: instance.status }),
31
+ "Resolved version": instance.resolvedVersion ?? "\u2014",
32
+ "Deployed version": instance.deployedVersion ?? "\u2014"
33
+ };
34
+ }
35
+ const provisioned = instances.filter((i) => i.status === "PROVISIONED").length;
36
+ const failed = instances.filter((i) => i.status === "FAILED").length;
37
+ return {
38
+ Instances: instances.length,
39
+ Provisioned: provisioned,
40
+ Failed: failed
41
+ };
42
+ };
43
+ const EntityMassdriverOverviewCard = () => {
44
+ const { entity } = useEntity();
45
+ const api = useApi(massdriverApiRef);
46
+ const scope = getMassdriverScope(entity);
47
+ const orgId = scope?.orgId || api.organizationId;
48
+ const { value: instances, loading, error } = useMassdriverInstances(scope);
49
+ if (!scope) {
50
+ return null;
51
+ }
52
+ return /* @__PURE__ */ jsxs(
53
+ InfoCard,
54
+ {
55
+ title: "Massdriver",
56
+ deepLink: {
57
+ title: "Open in Massdriver",
58
+ link: deepLinkFor(scope, api.appUrl, orgId)
59
+ },
60
+ children: [
61
+ loading && /* @__PURE__ */ jsx(Progress, {}),
62
+ error && /* @__PURE__ */ jsx(ResponseErrorPanel, { error }),
63
+ !loading && !error && /* @__PURE__ */ jsx(
64
+ StructuredMetadataTable,
65
+ {
66
+ metadata: summaryMetadata(scope, instances ?? [])
67
+ }
68
+ )
69
+ ]
70
+ }
71
+ );
72
+ };
73
+
74
+ export { EntityMassdriverOverviewCard };
75
+ //# sourceMappingURL=EntityMassdriverOverviewCard.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EntityMassdriverOverviewCard.esm.js","sources":["../../../src/components/EntityMassdriverOverviewCard/EntityMassdriverOverviewCard.tsx"],"sourcesContent":["import {\n InfoCard,\n Progress,\n ResponseErrorPanel,\n StructuredMetadataTable,\n} from '@backstage/core-components';\nimport { useApi } from '@backstage/frontend-plugin-api';\nimport { useEntity } from '@backstage/plugin-catalog-react';\nimport {\n environmentUrl,\n instanceUrl,\n projectUrl,\n} from '@massdriver/backstage-plugin-common';\nimport { massdriverApiRef } from '../../api';\nimport { getMassdriverScope, MassdriverScope } from '../../entity';\nimport { InstanceRow } from '../../queries';\nimport { useMassdriverInstances } from '../../useInstances';\nimport { InstanceStatusIndicator } from '../InstanceStatusIndicator';\n\nconst deepLinkFor = (\n scope: MassdriverScope,\n appUrl: string,\n orgId: string,\n): string => {\n switch (scope.kind) {\n case 'project':\n return projectUrl(appUrl, orgId, scope.projectId);\n case 'environment':\n return environmentUrl(appUrl, orgId, scope.environmentId);\n case 'instance':\n return instanceUrl(appUrl, orgId, scope.instanceId);\n default:\n return appUrl;\n }\n};\n\nconst summaryMetadata = (\n scope: MassdriverScope,\n instances: InstanceRow[],\n): Record<string, unknown> => {\n if (scope.kind === 'instance') {\n const instance = instances[0];\n if (!instance) {\n return { Status: 'Not found' };\n }\n return {\n Status: <InstanceStatusIndicator status={instance.status} />,\n 'Resolved version': instance.resolvedVersion ?? '—',\n 'Deployed version': instance.deployedVersion ?? '—',\n };\n }\n\n const provisioned = instances.filter(i => i.status === 'PROVISIONED').length;\n const failed = instances.filter(i => i.status === 'FAILED').length;\n return {\n Instances: instances.length,\n Provisioned: provisioned,\n Failed: failed,\n };\n};\n\n/**\n * Entity overview card summarizing the entity's Massdriver status with a\n * deep-link into the web app.\n *\n * @public\n */\nexport const EntityMassdriverOverviewCard = () => {\n const { entity } = useEntity();\n const api = useApi(massdriverApiRef);\n const scope = getMassdriverScope(entity);\n const orgId = scope?.orgId || api.organizationId;\n const { value: instances, loading, error } = useMassdriverInstances(scope);\n\n if (!scope) {\n return null;\n }\n\n return (\n <InfoCard\n title=\"Massdriver\"\n deepLink={{\n title: 'Open in Massdriver',\n link: deepLinkFor(scope, api.appUrl, orgId),\n }}\n >\n {loading && <Progress />}\n {error && <ResponseErrorPanel error={error} />}\n {!loading && !error && (\n <StructuredMetadataTable\n metadata={summaryMetadata(scope, instances ?? [])}\n />\n )}\n </InfoCard>\n );\n};\n"],"names":[],"mappings":";;;;;;;;;;AAmBA,MAAM,WAAA,GAAc,CAClB,KAAA,EACA,MAAA,EACA,KAAA,KACW;AACX,EAAA,QAAQ,MAAM,IAAA;AAAM,IAClB,KAAK,SAAA;AACH,MAAA,OAAO,UAAA,CAAW,MAAA,EAAQ,KAAA,EAAO,KAAA,CAAM,SAAS,CAAA;AAAA,IAClD,KAAK,aAAA;AACH,MAAA,OAAO,cAAA,CAAe,MAAA,EAAQ,KAAA,EAAO,KAAA,CAAM,aAAa,CAAA;AAAA,IAC1D,KAAK,UAAA;AACH,MAAA,OAAO,WAAA,CAAY,MAAA,EAAQ,KAAA,EAAO,KAAA,CAAM,UAAU,CAAA;AAAA,IACpD;AACE,MAAA,OAAO,MAAA;AAAA;AAEb,CAAA;AAEA,MAAM,eAAA,GAAkB,CACtB,KAAA,EACA,SAAA,KAC4B;AAC5B,EAAA,IAAI,KAAA,CAAM,SAAS,UAAA,EAAY;AAC7B,IAAA,MAAM,QAAA,GAAW,UAAU,CAAC,CAAA;AAC5B,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,OAAO,EAAE,QAAQ,WAAA,EAAY;AAAA,IAC/B;AACA,IAAA,OAAO;AAAA,MACL,MAAA,kBAAQ,GAAA,CAAC,uBAAA,EAAA,EAAwB,MAAA,EAAQ,SAAS,MAAA,EAAQ,CAAA;AAAA,MAC1D,kBAAA,EAAoB,SAAS,eAAA,IAAmB,QAAA;AAAA,MAChD,kBAAA,EAAoB,SAAS,eAAA,IAAmB;AAAA,KAClD;AAAA,EACF;AAEA,EAAA,MAAM,cAAc,SAAA,CAAU,MAAA,CAAO,OAAK,CAAA,CAAE,MAAA,KAAW,aAAa,CAAA,CAAE,MAAA;AACtE,EAAA,MAAM,SAAS,SAAA,CAAU,MAAA,CAAO,OAAK,CAAA,CAAE,MAAA,KAAW,QAAQ,CAAA,CAAE,MAAA;AAC5D,EAAA,OAAO;AAAA,IACL,WAAW,SAAA,CAAU,MAAA;AAAA,IACrB,WAAA,EAAa,WAAA;AAAA,IACb,MAAA,EAAQ;AAAA,GACV;AACF,CAAA;AAQO,MAAM,+BAA+B,MAAM;AAChD,EAAA,MAAM,EAAE,MAAA,EAAO,GAAI,SAAA,EAAU;AAC7B,EAAA,MAAM,GAAA,GAAM,OAAO,gBAAgB,CAAA;AACnC,EAAA,MAAM,KAAA,GAAQ,mBAAmB,MAAM,CAAA;AACvC,EAAA,MAAM,KAAA,GAAQ,KAAA,EAAO,KAAA,IAAS,GAAA,CAAI,cAAA;AAClC,EAAA,MAAM,EAAE,KAAA,EAAO,SAAA,EAAW,SAAS,KAAA,EAAM,GAAI,uBAAuB,KAAK,CAAA;AAEzE,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,uBACE,IAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAM,YAAA;AAAA,MACN,QAAA,EAAU;AAAA,QACR,KAAA,EAAO,oBAAA;AAAA,QACP,IAAA,EAAM,WAAA,CAAY,KAAA,EAAO,GAAA,CAAI,QAAQ,KAAK;AAAA,OAC5C;AAAA,MAEC,QAAA,EAAA;AAAA,QAAA,OAAA,wBAAY,QAAA,EAAA,EAAS,CAAA;AAAA,QACrB,KAAA,oBAAS,GAAA,CAAC,kBAAA,EAAA,EAAmB,KAAA,EAAc,CAAA;AAAA,QAC3C,CAAC,OAAA,IAAW,CAAC,KAAA,oBACZ,GAAA;AAAA,UAAC,uBAAA;AAAA,UAAA;AAAA,YACC,QAAA,EAAU,eAAA,CAAgB,KAAA,EAAO,SAAA,IAAa,EAAE;AAAA;AAAA;AAClD;AAAA;AAAA,GAEJ;AAEJ;;;;"}
@@ -0,0 +1,6 @@
1
+ import { EntityMassdriverOverviewCard } from './EntityMassdriverOverviewCard.esm.js';
2
+
3
+
4
+
5
+ export { EntityMassdriverOverviewCard };
6
+ //# sourceMappingURL=index.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
@@ -0,0 +1,84 @@
1
+ import { jsx, jsxs } from 'react/jsx-runtime';
2
+ import Box from '@massdriver/ui/Box';
3
+ import Tooltip from '@massdriver/ui/Tooltip';
4
+ import stylin from '@massdriver/ui/stylin';
5
+ import { formatAbsoluteTime, formatRelativeTime } from '../utils/formatRelativeTime.esm.js';
6
+
7
+ const TOOLTIP_SLOT_PROPS = {
8
+ tooltip: { sx: { maxWidth: 280, px: 1.25, py: 1 } }
9
+ };
10
+ const ForkPill = ({
11
+ parent,
12
+ createdAt,
13
+ size = "small"
14
+ }) => {
15
+ if (!parent) {
16
+ return null;
17
+ }
18
+ const absolute = formatAbsoluteTime(createdAt);
19
+ return /* @__PURE__ */ jsx(
20
+ Tooltip,
21
+ {
22
+ arrow: true,
23
+ enterDelay: 300,
24
+ placement: "top",
25
+ slotProps: TOOLTIP_SLOT_PROPS,
26
+ title: /* @__PURE__ */ jsxs(TooltipBody, { children: [
27
+ /* @__PURE__ */ jsxs(TooltipRow, { children: [
28
+ /* @__PURE__ */ jsx(TooltipLabel, { children: "Forked from" }),
29
+ /* @__PURE__ */ jsx(TooltipValue, { children: parent.name })
30
+ ] }),
31
+ createdAt ? /* @__PURE__ */ jsxs(TooltipRow, { children: [
32
+ /* @__PURE__ */ jsx(TooltipLabel, { children: "Forked" }),
33
+ /* @__PURE__ */ jsx(TooltipValue, { children: formatRelativeTime(createdAt) })
34
+ ] }) : null,
35
+ absolute ? /* @__PURE__ */ jsx(TooltipMeta, { children: absolute }) : null
36
+ ] }),
37
+ children: /* @__PURE__ */ jsx(Pill, { size, children: "Fork" })
38
+ }
39
+ );
40
+ };
41
+ const Pill = stylin(Box, ["size"])(
42
+ ({ theme, size }) => {
43
+ const color = theme.palette.info.main;
44
+ return {
45
+ display: "inline-flex",
46
+ alignItems: "center",
47
+ flexShrink: 0,
48
+ lineHeight: 1,
49
+ padding: size === "small" ? "3px 6px 1px" : "5px 8px 3px",
50
+ borderRadius: theme.custom.general.borderRadiusSm,
51
+ fontSize: theme.typography.pxToRem(size === "small" ? 10 : 11),
52
+ fontWeight: theme.typography.fontWeightMedium,
53
+ letterSpacing: "0.4px",
54
+ textTransform: "uppercase",
55
+ color,
56
+ backgroundColor: `${color}1f`,
57
+ border: `1px solid ${color}33`,
58
+ cursor: "default",
59
+ userSelect: "none"
60
+ };
61
+ }
62
+ );
63
+ const TooltipBody = stylin("span")(({ theme }) => ({
64
+ display: "flex",
65
+ flexDirection: "column",
66
+ gap: theme.spacing(0.25)
67
+ }));
68
+ const TooltipRow = stylin("span")(({ theme }) => ({
69
+ display: "flex",
70
+ alignItems: "baseline",
71
+ gap: theme.spacing(0.75),
72
+ fontSize: theme.typography.pxToRem(12),
73
+ lineHeight: 1.4
74
+ }));
75
+ const TooltipLabel = stylin("span")({ fontWeight: 600, opacity: 0.7 });
76
+ const TooltipValue = stylin("span")({ fontWeight: 500 });
77
+ const TooltipMeta = stylin("span")(({ theme }) => ({
78
+ fontSize: theme.typography.pxToRem(11),
79
+ opacity: 0.6,
80
+ marginTop: theme.spacing(0.25)
81
+ }));
82
+
83
+ export { ForkPill };
84
+ //# sourceMappingURL=ForkPill.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ForkPill.esm.js","sources":["../../src/components/ForkPill.tsx"],"sourcesContent":["import Box from '@massdriver/ui/Box';\nimport Tooltip from '@massdriver/ui/Tooltip';\nimport stylin from '@massdriver/ui/stylin';\nimport {\n formatAbsoluteTime,\n formatRelativeTime,\n} from '../utils/formatRelativeTime';\n\nconst TOOLTIP_SLOT_PROPS = {\n tooltip: { sx: { maxWidth: 280, px: 1.25, py: 1 } },\n};\n\n/** \"Fork\" pill shown on forked environments (mirrors the web app). */\nexport const ForkPill = ({\n parent,\n createdAt,\n size = 'small',\n}: {\n parent?: { name?: string } | null;\n createdAt?: string | null;\n size?: 'small' | 'medium';\n}) => {\n if (!parent) {\n return null;\n }\n const absolute = formatAbsoluteTime(createdAt);\n\n return (\n <Tooltip\n arrow\n enterDelay={300}\n placement=\"top\"\n slotProps={TOOLTIP_SLOT_PROPS}\n title={\n <TooltipBody>\n <TooltipRow>\n <TooltipLabel>Forked from</TooltipLabel>\n <TooltipValue>{parent.name}</TooltipValue>\n </TooltipRow>\n {createdAt ? (\n <TooltipRow>\n <TooltipLabel>Forked</TooltipLabel>\n <TooltipValue>{formatRelativeTime(createdAt)}</TooltipValue>\n </TooltipRow>\n ) : null}\n {absolute ? <TooltipMeta>{absolute}</TooltipMeta> : null}\n </TooltipBody>\n }\n >\n <Pill size={size}>Fork</Pill>\n </Tooltip>\n );\n};\n\nconst Pill = stylin(Box, ['size'])(\n ({ theme, size }: { theme: any; size: string }) => {\n const color = theme.palette.info.main;\n return {\n display: 'inline-flex',\n alignItems: 'center',\n flexShrink: 0,\n lineHeight: 1,\n padding: size === 'small' ? '3px 6px 1px' : '5px 8px 3px',\n borderRadius: theme.custom.general.borderRadiusSm,\n fontSize: theme.typography.pxToRem(size === 'small' ? 10 : 11),\n fontWeight: theme.typography.fontWeightMedium,\n letterSpacing: '0.4px',\n textTransform: 'uppercase',\n color,\n backgroundColor: `${color}1f`,\n border: `1px solid ${color}33`,\n cursor: 'default',\n userSelect: 'none',\n };\n },\n);\n\nconst TooltipBody = stylin('span')(({ theme }: { theme: any }) => ({\n display: 'flex',\n flexDirection: 'column',\n gap: theme.spacing(0.25),\n}));\n\nconst TooltipRow = stylin('span')(({ theme }: { theme: any }) => ({\n display: 'flex',\n alignItems: 'baseline',\n gap: theme.spacing(0.75),\n fontSize: theme.typography.pxToRem(12),\n lineHeight: 1.4,\n}));\n\nconst TooltipLabel = stylin('span')({ fontWeight: 600, opacity: 0.7 });\nconst TooltipValue = stylin('span')({ fontWeight: 500 });\nconst TooltipMeta = stylin('span')(({ theme }: { theme: any }) => ({\n fontSize: theme.typography.pxToRem(11),\n opacity: 0.6,\n marginTop: theme.spacing(0.25),\n}));\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import { StatusPending, StatusAborted, StatusError, StatusOK } from '@backstage/core-components';
3
+
4
+ const InstanceStatusIndicator = ({
5
+ status
6
+ }) => {
7
+ switch (status) {
8
+ case "PROVISIONED":
9
+ return /* @__PURE__ */ jsx(StatusOK, { children: "Provisioned" });
10
+ case "FAILED":
11
+ return /* @__PURE__ */ jsx(StatusError, { children: "Failed" });
12
+ case "DECOMMISSIONED":
13
+ return /* @__PURE__ */ jsx(StatusAborted, { children: "Decommissioned" });
14
+ case "INITIALIZED":
15
+ default:
16
+ return /* @__PURE__ */ jsx(StatusPending, { children: "Initialized" });
17
+ }
18
+ };
19
+
20
+ export { InstanceStatusIndicator };
21
+ //# sourceMappingURL=InstanceStatusIndicator.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InstanceStatusIndicator.esm.js","sources":["../../src/components/InstanceStatusIndicator.tsx"],"sourcesContent":["import {\n StatusAborted,\n StatusError,\n StatusOK,\n StatusPending,\n} from '@backstage/core-components';\nimport { InstanceStatus } from '@massdriver/backstage-plugin-common';\n\n/** Render a Massdriver instance status as a Backstage status indicator. */\nexport const InstanceStatusIndicator = ({\n status,\n}: {\n status: InstanceStatus;\n}) => {\n switch (status) {\n case 'PROVISIONED':\n return <StatusOK>Provisioned</StatusOK>;\n case 'FAILED':\n return <StatusError>Failed</StatusError>;\n case 'DECOMMISSIONED':\n return <StatusAborted>Decommissioned</StatusAborted>;\n case 'INITIALIZED':\n default:\n return <StatusPending>Initialized</StatusPending>;\n }\n};\n"],"names":[],"mappings":";;;AASO,MAAM,0BAA0B,CAAC;AAAA,EACtC;AACF,CAAA,KAEM;AACJ,EAAA,QAAQ,MAAA;AAAQ,IACd,KAAK,aAAA;AACH,MAAA,uBAAO,GAAA,CAAC,YAAS,QAAA,EAAA,aAAA,EAAW,CAAA;AAAA,IAC9B,KAAK,QAAA;AACH,MAAA,uBAAO,GAAA,CAAC,eAAY,QAAA,EAAA,QAAA,EAAM,CAAA;AAAA,IAC5B,KAAK,gBAAA;AACH,MAAA,uBAAO,GAAA,CAAC,iBAAc,QAAA,EAAA,gBAAA,EAAc,CAAA;AAAA,IACtC,KAAK,aAAA;AAAA,IACL;AACE,MAAA,uBAAO,GAAA,CAAC,iBAAc,QAAA,EAAA,aAAA,EAAW,CAAA;AAAA;AAEvC;;;;"}
@@ -0,0 +1,67 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import Chip from '@massdriver/ui/Chip';
3
+ import stylin from '@massdriver/ui/stylin';
4
+ import { instanceStatusColors } from '@massdriver/ui/theme';
5
+ import { isInstanceStatusActionable, formatInstanceStatus, INSTANCE_STATUS } from '../utils/instanceStatuses.esm.js';
6
+ import { chipClasses } from '@mui/material/Chip';
7
+ import '@mui/material/Drawer';
8
+ import '@mui/material/OutlinedInput';
9
+ import '@mui/material/Select';
10
+ import '@mui/material/ToggleButton';
11
+
12
+ const InstanceStatusPill = ({
13
+ status,
14
+ onClick,
15
+ size = "small",
16
+ ...props
17
+ }) => {
18
+ const clickable = Boolean(onClick) && isInstanceStatusActionable(status);
19
+ const handleClick = clickable ? (event) => {
20
+ event?.stopPropagation?.();
21
+ onClick?.();
22
+ } : void 0;
23
+ const label = formatInstanceStatus(status);
24
+ const color = (status && instanceStatusColors[status]) ?? null;
25
+ return /* @__PURE__ */ jsx(
26
+ StyledChip,
27
+ {
28
+ label,
29
+ size,
30
+ statusColor: color,
31
+ external: status === INSTANCE_STATUS.EXTERNAL,
32
+ clickable,
33
+ onClick: handleClick,
34
+ ...props
35
+ }
36
+ );
37
+ };
38
+ const StyledChip = stylin(Chip, ["statusColor", "external", "clickable"])(
39
+ ({
40
+ theme,
41
+ statusColor,
42
+ external,
43
+ clickable
44
+ }) => ({
45
+ height: "auto",
46
+ fontSize: theme.typography.pxToRem(11),
47
+ fontWeight: theme.typography.fontWeightMedium,
48
+ letterSpacing: "0.3px",
49
+ textTransform: "lowercase",
50
+ color: statusColor ?? theme.palette.text.secondary,
51
+ backgroundColor: statusColor ? `${statusColor}1f` : theme.palette.action.hover,
52
+ border: statusColor ? `${external ? "2px dashed" : "1px solid"} ${statusColor}${external ? "" : "33"}` : `1px solid ${theme.palette.divider}`,
53
+ fontStyle: external ? "italic" : void 0,
54
+ ...clickable && {
55
+ cursor: "pointer",
56
+ "&:hover": {
57
+ filter: "brightness(0.96)"
58
+ }
59
+ },
60
+ [`& .${chipClasses.label}`]: {
61
+ textTransform: "lowercase"
62
+ }
63
+ })
64
+ );
65
+
66
+ export { InstanceStatusPill };
67
+ //# sourceMappingURL=InstanceStatusPill.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InstanceStatusPill.esm.js","sources":["../../src/components/InstanceStatusPill.tsx"],"sourcesContent":["import Chip from '@massdriver/ui/Chip';\nimport stylin from '@massdriver/ui/stylin';\nimport { instanceStatusColors } from '@massdriver/ui/theme';\nimport {\n INSTANCE_STATUS,\n formatInstanceStatus,\n isInstanceStatusActionable,\n} from '../utils/instanceStatuses';\nimport { chipClasses } from '../theme/muiClasses';\n\n/**\n * Presentational instance/deployment status pill — the web app's\n * `InstanceStatusPill` rendering (12% / 20% alpha tints of the flat status\n * color, lowercase label, dashed border for remote references). Takes a static\n * or compound status string; callers with a deployment at hand compose it via\n * `composeInstanceStatus`. The live, latest-deployment-aware variant wraps this\n * in `features/environment/components/InstanceStatusPill`.\n *\n * The pill is only clickable while the status is actionable (a deployment in\n * flight or failed), mirroring the web app's click-to-logs affordance.\n */\nexport const InstanceStatusPill = ({\n status,\n onClick,\n size = 'small',\n ...props\n}: {\n status?: string | null;\n onClick?: () => void;\n size?: string;\n [key: string]: unknown;\n}) => {\n const clickable = Boolean(onClick) && isInstanceStatusActionable(status);\n // Stop propagation so the pill click doesn't fall through to ancestor click\n // handlers (e.g. a row or diagram node opening its own detail surface).\n const handleClick = clickable\n ? (event: { stopPropagation?: () => void }) => {\n event?.stopPropagation?.();\n onClick?.();\n }\n : undefined;\n\n const label = formatInstanceStatus(status);\n const color = (status && instanceStatusColors[status]) ?? null;\n return (\n <StyledChip\n label={label}\n size={size}\n statusColor={color}\n external={status === INSTANCE_STATUS.EXTERNAL}\n clickable={clickable}\n onClick={handleClick}\n {...props}\n />\n );\n};\n\nexport default InstanceStatusPill;\n\n// Background and border use 12% / 20% alpha tints of the flat status color,\n// matching the web app's pill so surfaces stay visually consistent.\nconst StyledChip = stylin(Chip, ['statusColor', 'external', 'clickable'])(\n ({\n theme,\n statusColor,\n external,\n clickable,\n }: {\n theme: any;\n statusColor: string | null;\n external: boolean;\n clickable: boolean;\n }) => ({\n height: 'auto',\n fontSize: theme.typography.pxToRem(11),\n fontWeight: theme.typography.fontWeightMedium,\n letterSpacing: '0.3px',\n textTransform: 'lowercase',\n color: statusColor ?? theme.palette.text.secondary,\n backgroundColor: statusColor\n ? `${statusColor}1f`\n : theme.palette.action.hover,\n border: statusColor\n ? `${external ? '2px dashed' : '1px solid'} ${statusColor}${\n external ? '' : '33'\n }`\n : `1px solid ${theme.palette.divider}`,\n fontStyle: external ? 'italic' : undefined,\n ...(clickable && {\n cursor: 'pointer',\n '&:hover': {\n filter: 'brightness(0.96)',\n },\n }),\n [`& .${chipClasses.label}`]: {\n textTransform: 'lowercase',\n },\n }),\n);\n"],"names":[],"mappings":";;;;;;;;;;;AAqBO,MAAM,qBAAqB,CAAC;AAAA,EACjC,MAAA;AAAA,EACA,OAAA;AAAA,EACA,IAAA,GAAO,OAAA;AAAA,EACP,GAAG;AACL,CAAA,KAKM;AACJ,EAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,OAAO,CAAA,IAAK,2BAA2B,MAAM,CAAA;AAGvE,EAAA,MAAM,WAAA,GAAc,SAAA,GAChB,CAAC,KAAA,KAA4C;AAC3C,IAAA,KAAA,EAAO,eAAA,IAAkB;AACzB,IAAA,OAAA,IAAU;AAAA,EACZ,CAAA,GACA,MAAA;AAEJ,EAAA,MAAM,KAAA,GAAQ,qBAAqB,MAAM,CAAA;AACzC,EAAA,MAAM,KAAA,GAAA,CAAS,MAAA,IAAU,oBAAA,CAAqB,MAAM,CAAA,KAAM,IAAA;AAC1D,EAAA,uBACE,GAAA;AAAA,IAAC,UAAA;AAAA,IAAA;AAAA,MACC,KAAA;AAAA,MACA,IAAA;AAAA,MACA,WAAA,EAAa,KAAA;AAAA,MACb,QAAA,EAAU,WAAW,eAAA,CAAgB,QAAA;AAAA,MACrC,SAAA;AAAA,MACA,OAAA,EAAS,WAAA;AAAA,MACR,GAAG;AAAA;AAAA,GACN;AAEJ;AAMA,MAAM,aAAa,MAAA,CAAO,IAAA,EAAM,CAAC,aAAA,EAAe,UAAA,EAAY,WAAW,CAAC,CAAA;AAAA,EACtE,CAAC;AAAA,IACC,KAAA;AAAA,IACA,WAAA;AAAA,IACA,QAAA;AAAA,IACA;AAAA,GACF,MAKO;AAAA,IACL,MAAA,EAAQ,MAAA;AAAA,IACR,QAAA,EAAU,KAAA,CAAM,UAAA,CAAW,OAAA,CAAQ,EAAE,CAAA;AAAA,IACrC,UAAA,EAAY,MAAM,UAAA,CAAW,gBAAA;AAAA,IAC7B,aAAA,EAAe,OAAA;AAAA,IACf,aAAA,EAAe,WAAA;AAAA,IACf,KAAA,EAAO,WAAA,IAAe,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,SAAA;AAAA,IACzC,iBAAiB,WAAA,GACb,CAAA,EAAG,WAAW,CAAA,EAAA,CAAA,GACd,KAAA,CAAM,QAAQ,MAAA,CAAO,KAAA;AAAA,IACzB,QAAQ,WAAA,GACJ,CAAA,EAAG,QAAA,GAAW,YAAA,GAAe,WAAW,CAAA,CAAA,EAAI,WAAW,CAAA,EACrD,QAAA,GAAW,KAAK,IAClB,CAAA,CAAA,GACA,CAAA,UAAA,EAAa,KAAA,CAAM,QAAQ,OAAO,CAAA,CAAA;AAAA,IACtC,SAAA,EAAW,WAAW,QAAA,GAAW,MAAA;AAAA,IACjC,GAAI,SAAA,IAAa;AAAA,MACf,MAAA,EAAQ,SAAA;AAAA,MACR,SAAA,EAAW;AAAA,QACT,MAAA,EAAQ;AAAA;AACV,KACF;AAAA,IACA,CAAC,CAAA,GAAA,EAAM,WAAA,CAAY,KAAK,EAAE,GAAG;AAAA,MAC3B,aAAA,EAAe;AAAA;AACjB,GACF;AACF,CAAA;;;;"}
@@ -0,0 +1,13 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import SvgIcon from '@material-ui/core/SvgIcon';
3
+
4
+ const MassdriverIcon = (props) => /* @__PURE__ */ jsx(SvgIcon, { viewBox: "0 0 400 447", ...props, children: /* @__PURE__ */ jsx(
5
+ "path",
6
+ {
7
+ fillRule: "evenodd",
8
+ d: "M194.818 0.308 C 189.725 0.839,183.846 2.521,178.837 4.880 C 175.016 6.680,24.875 93.350,21.289 95.827 C 9.766 103.783,2.418 115.910,0.515 130.112 C -0.029 134.174,-0.042 312.597,0.502 316.387 C 2.628 331.206,10.015 343.144,21.989 351.109 C 23.683 352.236,42.717 363.339,64.286 375.782 C 85.854 388.224,119.762 407.798,139.636 419.278 C 159.510 430.758,177.157 440.807,178.852 441.609 C 192.365 448.002,207.407 448.053,220.872 441.750 C 222.414 441.029,240.566 430.690,261.208 418.775 C 281.850 406.861,315.882 387.223,336.835 375.135 C 357.787 363.048,376.317 352.236,378.011 351.109 C 389.992 343.139,397.534 330.944,399.485 316.387 C 400.043 312.222,400.040 134.250,399.482 130.112 C 397.565 115.897,390.220 103.773,378.711 95.827 C 375.125 93.350,224.984 6.680,221.163 4.880 C 212.802 0.942,203.771 -0.625,194.818 0.308 M208.255 15.971 C 211.852 16.673,216.197 18.077,219.419 19.579 C 221.894 20.733,361.703 101.360,365.406 103.769 C 377.631 111.722,384.889 123.763,386.277 138.391 C 386.490 140.638,386.556 166.723,386.496 225.630 L 386.411 309.664 385.769 312.885 C 383.226 325.650,376.197 336.194,365.686 343.013 C 363.450 344.464,304.268 378.706,303.832 378.801 C 303.635 378.844,296.435 366.523,280.276 338.490 L 276.548 332.022 279.240 330.046 C 295.782 317.908,309.706 301.196,319.003 282.322 L 321.709 276.829 327.171 276.686 C 342.597 276.282,347.294 269.469,350.686 242.577 C 353.034 223.956,351.671 202.592,347.023 185.154 C 345.100 177.941,340.422 172.555,334.803 171.085 L 334.174 170.921 334.174 154.420 L 334.174 137.919 335.773 136.817 C 344.320 130.924,340.319 117.828,329.972 117.828 C 319.625 117.828,315.624 130.924,324.171 136.817 L 325.770 137.919 325.770 154.114 L 325.770 170.308 323.739 170.302 L 321.709 170.295 320.341 167.226 C 301.470 124.875,257.767 94.752,209.818 91.047 C 155.407 86.843,101.389 118.458,79.659 167.226 L 78.291 170.295 73.364 170.302 C 61.758 170.317,55.769 174.680,52.977 185.154 C 46.742 208.546,46.583 235.884,52.542 259.933 C 55.559 272.106,60.721 276.368,72.829 276.686 L 78.291 276.829 80.997 282.322 C 90.224 301.053,103.543 317.119,120.265 329.688 L 122.919 331.683 120.758 335.519 C 119.569 337.629,113.571 348.271,107.429 359.167 L 96.262 378.978 95.400 378.451 C 94.926 378.161,81.492 370.396,65.546 361.197 C 49.601 351.997,35.546 343.815,34.314 343.014 C 23.797 336.186,16.774 325.650,14.231 312.885 L 13.589 309.664 13.504 225.630 C 13.444 166.723,13.510 140.638,13.723 138.391 C 15.093 123.944,22.224 111.976,34.174 104.065 C 35.637 103.096,62.171 87.685,93.137 69.818 C 124.104 51.951,155.931 33.578,163.866 28.989 C 179.234 20.102,181.220 19.064,185.784 17.537 C 192.969 15.133,201.068 14.569,208.255 15.971 M214.006 102.929 C 306.850 114.450,352.960 221.227,297.300 295.815 C 243.693 367.649,133.353 358.679,92.267 279.145 C 52.292 201.764,103.632 110.162,191.317 102.417 C 194.620 102.126,210.400 102.481,214.006 102.929 M188.235 133.224 C 166.240 134.679,152.505 137.073,137.749 142.024 C 112.526 150.487,100.764 162.883,94.569 187.535 C 88.211 212.836,91.466 247.634,102.153 268.607 C 120.973 305.542,172.634 325.886,225.210 317.067 C 262.599 310.795,290.145 290.895,300.788 262.465 C 312.658 230.757,310.956 188.992,296.868 166.278 C 285.453 147.873,259.720 137.202,218.067 133.602 C 214.600 133.302,191.483 133.009,188.235 133.224 M218.908 146.057 C 247.861 148.739,269.202 154.863,278.695 163.215 C 293.245 176.016,299.192 203.828,294.105 235.294 C 289.670 262.733,278.907 278.982,257.297 290.860 C 253.303 293.055,253.418 293.090,255.288 290.248 C 271.754 265.220,273.434 209.061,258.510 182.542 C 246.750 161.646,224.027 149.440,190.336 145.921 C 188.641 145.745,187.192 145.536,187.115 145.459 C 186.776 145.117,214.361 145.636,218.908 146.057 M142.437 343.153 C 179.604 361.050,222.943 360.611,259.944 341.963 C 264.996 339.417,265.434 339.247,265.771 339.703 C 267.274 341.735,269.766 346.597,269.424 346.832 C 268.057 347.774,256.480 353.217,252.661 354.714 C 217.829 368.363,180.472 368.138,145.518 354.068 C 141.995 352.650,131.161 347.454,130.195 346.720 C 129.762 346.391,129.910 346.021,131.865 342.555 L 134.011 338.751 135.983 339.873 C 137.068 340.490,139.972 341.966,142.437 343.153 M129.307 360.984 C 148.104 370.523,169.119 376.272,189.776 377.527 L 193.137 377.731 193.209 404.518 L 193.280 431.306 191.108 430.902 C 188.008 430.325,182.738 428.513,179.591 426.941 C 177.635 425.964,108.213 386.058,107.620 385.570 C 107.488 385.461,123.374 357.990,123.529 358.060 C 123.606 358.095,126.206 359.411,129.307 360.984 M284.256 371.569 C 288.429 378.810,291.917 384.928,292.007 385.164 C 292.146 385.530,229.713 421.969,221.130 426.531 C 217.566 428.425,212.618 430.086,207.073 431.251 L 206.443 431.383 206.443 404.657 C 206.443 380.545,206.486 377.914,206.886 377.761 C 207.129 377.668,207.991 377.591,208.801 377.591 C 225.464 377.591,251.508 370.599,270.448 361.041 C 273.683 359.408,276.407 358.147,276.499 358.238 C 276.592 358.329,280.083 364.328,284.256 371.569"
9
+ }
10
+ ) });
11
+
12
+ export { MassdriverIcon };
13
+ //# sourceMappingURL=MassdriverIcon.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MassdriverIcon.esm.js","sources":["../../src/components/MassdriverIcon.tsx"],"sourcesContent":["import SvgIcon, { SvgIconProps } from '@material-ui/core/SvgIcon';\n\nexport const MassdriverIcon = (props: SvgIconProps) => (\n <SvgIcon viewBox=\"0 0 400 447\" {...props}>\n <path\n fillRule=\"evenodd\"\n d=\"M194.818 0.308 C 189.725 0.839,183.846 2.521,178.837 4.880 C 175.016 6.680,24.875 93.350,21.289 95.827 C 9.766 103.783,2.418 115.910,0.515 130.112 C -0.029 134.174,-0.042 312.597,0.502 316.387 C 2.628 331.206,10.015 343.144,21.989 351.109 C 23.683 352.236,42.717 363.339,64.286 375.782 C 85.854 388.224,119.762 407.798,139.636 419.278 C 159.510 430.758,177.157 440.807,178.852 441.609 C 192.365 448.002,207.407 448.053,220.872 441.750 C 222.414 441.029,240.566 430.690,261.208 418.775 C 281.850 406.861,315.882 387.223,336.835 375.135 C 357.787 363.048,376.317 352.236,378.011 351.109 C 389.992 343.139,397.534 330.944,399.485 316.387 C 400.043 312.222,400.040 134.250,399.482 130.112 C 397.565 115.897,390.220 103.773,378.711 95.827 C 375.125 93.350,224.984 6.680,221.163 4.880 C 212.802 0.942,203.771 -0.625,194.818 0.308 M208.255 15.971 C 211.852 16.673,216.197 18.077,219.419 19.579 C 221.894 20.733,361.703 101.360,365.406 103.769 C 377.631 111.722,384.889 123.763,386.277 138.391 C 386.490 140.638,386.556 166.723,386.496 225.630 L 386.411 309.664 385.769 312.885 C 383.226 325.650,376.197 336.194,365.686 343.013 C 363.450 344.464,304.268 378.706,303.832 378.801 C 303.635 378.844,296.435 366.523,280.276 338.490 L 276.548 332.022 279.240 330.046 C 295.782 317.908,309.706 301.196,319.003 282.322 L 321.709 276.829 327.171 276.686 C 342.597 276.282,347.294 269.469,350.686 242.577 C 353.034 223.956,351.671 202.592,347.023 185.154 C 345.100 177.941,340.422 172.555,334.803 171.085 L 334.174 170.921 334.174 154.420 L 334.174 137.919 335.773 136.817 C 344.320 130.924,340.319 117.828,329.972 117.828 C 319.625 117.828,315.624 130.924,324.171 136.817 L 325.770 137.919 325.770 154.114 L 325.770 170.308 323.739 170.302 L 321.709 170.295 320.341 167.226 C 301.470 124.875,257.767 94.752,209.818 91.047 C 155.407 86.843,101.389 118.458,79.659 167.226 L 78.291 170.295 73.364 170.302 C 61.758 170.317,55.769 174.680,52.977 185.154 C 46.742 208.546,46.583 235.884,52.542 259.933 C 55.559 272.106,60.721 276.368,72.829 276.686 L 78.291 276.829 80.997 282.322 C 90.224 301.053,103.543 317.119,120.265 329.688 L 122.919 331.683 120.758 335.519 C 119.569 337.629,113.571 348.271,107.429 359.167 L 96.262 378.978 95.400 378.451 C 94.926 378.161,81.492 370.396,65.546 361.197 C 49.601 351.997,35.546 343.815,34.314 343.014 C 23.797 336.186,16.774 325.650,14.231 312.885 L 13.589 309.664 13.504 225.630 C 13.444 166.723,13.510 140.638,13.723 138.391 C 15.093 123.944,22.224 111.976,34.174 104.065 C 35.637 103.096,62.171 87.685,93.137 69.818 C 124.104 51.951,155.931 33.578,163.866 28.989 C 179.234 20.102,181.220 19.064,185.784 17.537 C 192.969 15.133,201.068 14.569,208.255 15.971 M214.006 102.929 C 306.850 114.450,352.960 221.227,297.300 295.815 C 243.693 367.649,133.353 358.679,92.267 279.145 C 52.292 201.764,103.632 110.162,191.317 102.417 C 194.620 102.126,210.400 102.481,214.006 102.929 M188.235 133.224 C 166.240 134.679,152.505 137.073,137.749 142.024 C 112.526 150.487,100.764 162.883,94.569 187.535 C 88.211 212.836,91.466 247.634,102.153 268.607 C 120.973 305.542,172.634 325.886,225.210 317.067 C 262.599 310.795,290.145 290.895,300.788 262.465 C 312.658 230.757,310.956 188.992,296.868 166.278 C 285.453 147.873,259.720 137.202,218.067 133.602 C 214.600 133.302,191.483 133.009,188.235 133.224 M218.908 146.057 C 247.861 148.739,269.202 154.863,278.695 163.215 C 293.245 176.016,299.192 203.828,294.105 235.294 C 289.670 262.733,278.907 278.982,257.297 290.860 C 253.303 293.055,253.418 293.090,255.288 290.248 C 271.754 265.220,273.434 209.061,258.510 182.542 C 246.750 161.646,224.027 149.440,190.336 145.921 C 188.641 145.745,187.192 145.536,187.115 145.459 C 186.776 145.117,214.361 145.636,218.908 146.057 M142.437 343.153 C 179.604 361.050,222.943 360.611,259.944 341.963 C 264.996 339.417,265.434 339.247,265.771 339.703 C 267.274 341.735,269.766 346.597,269.424 346.832 C 268.057 347.774,256.480 353.217,252.661 354.714 C 217.829 368.363,180.472 368.138,145.518 354.068 C 141.995 352.650,131.161 347.454,130.195 346.720 C 129.762 346.391,129.910 346.021,131.865 342.555 L 134.011 338.751 135.983 339.873 C 137.068 340.490,139.972 341.966,142.437 343.153 M129.307 360.984 C 148.104 370.523,169.119 376.272,189.776 377.527 L 193.137 377.731 193.209 404.518 L 193.280 431.306 191.108 430.902 C 188.008 430.325,182.738 428.513,179.591 426.941 C 177.635 425.964,108.213 386.058,107.620 385.570 C 107.488 385.461,123.374 357.990,123.529 358.060 C 123.606 358.095,126.206 359.411,129.307 360.984 M284.256 371.569 C 288.429 378.810,291.917 384.928,292.007 385.164 C 292.146 385.530,229.713 421.969,221.130 426.531 C 217.566 428.425,212.618 430.086,207.073 431.251 L 206.443 431.383 206.443 404.657 C 206.443 380.545,206.486 377.914,206.886 377.761 C 207.129 377.668,207.991 377.591,208.801 377.591 C 225.464 377.591,251.508 370.599,270.448 361.041 C 273.683 359.408,276.407 358.147,276.499 358.238 C 276.592 358.329,280.083 364.328,284.256 371.569\"\n />\n </SvgIcon>\n);\n"],"names":[],"mappings":";;;AAEO,MAAM,cAAA,GAAiB,CAAC,KAAA,qBAC7B,GAAA,CAAC,WAAQ,OAAA,EAAQ,aAAA,EAAe,GAAG,KAAA,EACjC,QAAA,kBAAA,GAAA;AAAA,EAAC,MAAA;AAAA,EAAA;AAAA,IACC,QAAA,EAAS,SAAA;AAAA,IACT,CAAA,EAAE;AAAA;AACJ,CAAA,EACF;;;;"}
@@ -0,0 +1,45 @@
1
+ import { jsx, jsxs } from 'react/jsx-runtime';
2
+ import { SidebarItem, SidebarSubmenu, SidebarSubmenuItem } from '@backstage/core-components';
3
+ import { internalRoutes } from '../internalRoutes.esm.js';
4
+ import { MassdriverIcon } from './MassdriverIcon.esm.js';
5
+ import { BundleIcon } from './icons/BundleIcon.esm.js';
6
+ import { FolderOutlinedIcon } from './icons/FolderOutlinedIcon.esm.js';
7
+ import { TokenIcon } from './icons/TokenIcon.esm.js';
8
+
9
+ const MassdriverSidebarItem = () => /* @__PURE__ */ jsx(
10
+ SidebarItem,
11
+ {
12
+ icon: MassdriverIcon,
13
+ to: internalRoutes.projects(),
14
+ text: "Massdriver",
15
+ children: /* @__PURE__ */ jsxs(SidebarSubmenu, { title: "Massdriver", children: [
16
+ /* @__PURE__ */ jsx(
17
+ SidebarSubmenuItem,
18
+ {
19
+ title: "Projects",
20
+ to: internalRoutes.projects(),
21
+ icon: FolderOutlinedIcon
22
+ }
23
+ ),
24
+ /* @__PURE__ */ jsx(
25
+ SidebarSubmenuItem,
26
+ {
27
+ title: "Resources",
28
+ to: internalRoutes.resources(),
29
+ icon: TokenIcon
30
+ }
31
+ ),
32
+ /* @__PURE__ */ jsx(
33
+ SidebarSubmenuItem,
34
+ {
35
+ title: "Repositories",
36
+ to: internalRoutes.repositories(),
37
+ icon: BundleIcon
38
+ }
39
+ )
40
+ ] })
41
+ }
42
+ );
43
+
44
+ export { MassdriverSidebarItem };
45
+ //# sourceMappingURL=MassdriverSidebarItem.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MassdriverSidebarItem.esm.js","sources":["../../src/components/MassdriverSidebarItem.tsx"],"sourcesContent":["import {\n SidebarItem,\n SidebarSubmenu,\n SidebarSubmenuItem,\n} from '@backstage/core-components';\nimport { internalRoutes } from '../internalRoutes';\nimport { MassdriverIcon } from './MassdriverIcon';\nimport { BundleIcon } from './icons/BundleIcon';\nimport { FolderOutlinedIcon } from './icons/FolderOutlinedIcon';\nimport { TokenIcon } from './icons/TokenIcon';\n\n/**\n * Ready-made sidebar entry for host apps that customize their nav: the\n * Massdriver logo linking to the projects list, with a submenu mirroring the\n * Massdriver web app's sidebar (Projects / Resources / Repositories).\n *\n * Apps on the default nav don't need this — the plugin's page already\n * contributes a flat \"Massdriver\" nav item automatically. Apps overriding the\n * nav with `NavContentBlueprint` can render this in place of that item.\n *\n * Boot-graph constraint: this component is reachable from the package root,\n * which Backstage `require()`s eagerly at app boot — it must never import\n * `@massdriver/ui` (whose components pull the `@mui/material` barrel); see\n * `src/index.test.ts`.\n *\n * @public\n */\nexport const MassdriverSidebarItem = () => (\n <SidebarItem\n icon={MassdriverIcon}\n to={internalRoutes.projects()}\n text=\"Massdriver\"\n >\n <SidebarSubmenu title=\"Massdriver\">\n <SidebarSubmenuItem\n title=\"Projects\"\n to={internalRoutes.projects()}\n icon={FolderOutlinedIcon}\n />\n <SidebarSubmenuItem\n title=\"Resources\"\n to={internalRoutes.resources()}\n icon={TokenIcon}\n />\n <SidebarSubmenuItem\n title=\"Repositories\"\n to={internalRoutes.repositories()}\n icon={BundleIcon}\n />\n </SidebarSubmenu>\n </SidebarItem>\n);\n"],"names":[],"mappings":";;;;;;;;AA2BO,MAAM,wBAAwB,sBACnC,GAAA;AAAA,EAAC,WAAA;AAAA,EAAA;AAAA,IACC,IAAA,EAAM,cAAA;AAAA,IACN,EAAA,EAAI,eAAe,QAAA,EAAS;AAAA,IAC5B,IAAA,EAAK,YAAA;AAAA,IAEL,QAAA,kBAAA,IAAA,CAAC,cAAA,EAAA,EAAe,KAAA,EAAM,YAAA,EACpB,QAAA,EAAA;AAAA,sBAAA,GAAA;AAAA,QAAC,kBAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAM,UAAA;AAAA,UACN,EAAA,EAAI,eAAe,QAAA,EAAS;AAAA,UAC5B,IAAA,EAAM;AAAA;AAAA,OACR;AAAA,sBACA,GAAA;AAAA,QAAC,kBAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAM,WAAA;AAAA,UACN,EAAA,EAAI,eAAe,SAAA,EAAU;AAAA,UAC7B,IAAA,EAAM;AAAA;AAAA,OACR;AAAA,sBACA,GAAA;AAAA,QAAC,kBAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAM,cAAA;AAAA,UACN,EAAA,EAAI,eAAe,YAAA,EAAa;AAAA,UAChC,IAAA,EAAM;AAAA;AAAA;AACR,KAAA,EACF;AAAA;AACF;;;;"}
@@ -0,0 +1,44 @@
1
+ import { jsxs, jsx } 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 stylin from '@massdriver/ui/stylin';
6
+ import SearchOffIcon from '@mui/icons-material/SearchOff';
7
+ import { RouterLinkAdapter } from './RouterLinkAdapter.esm.js';
8
+ import { internalRoutes } from '../internalRoutes.esm.js';
9
+
10
+ const NotFound = ({
11
+ title = "Not found",
12
+ message = "We couldn't find what you were looking for. It may have been deleted, or the link may be incorrect."
13
+ }) => /* @__PURE__ */ jsxs(Root, { children: [
14
+ /* @__PURE__ */ jsx(Icon, {}),
15
+ /* @__PURE__ */ jsx(Typography, { variant: "h5", children: title }),
16
+ /* @__PURE__ */ jsx(Message, { variant: "body2", color: "text.secondary", children: message }),
17
+ /* @__PURE__ */ jsx(
18
+ Button,
19
+ {
20
+ component: RouterLinkAdapter,
21
+ href: internalRoutes.projects(),
22
+ variant: "outlined",
23
+ children: "Back to projects"
24
+ }
25
+ )
26
+ ] });
27
+ const Root = stylin(Box)(({ theme }) => ({
28
+ minHeight: "100%",
29
+ display: "flex",
30
+ flexDirection: "column",
31
+ alignItems: "center",
32
+ justifyContent: "center",
33
+ gap: theme.spacing(1.5),
34
+ padding: theme.spacing(8, 4),
35
+ textAlign: "center"
36
+ }));
37
+ const Icon = stylin(SearchOffIcon)(({ theme }) => ({
38
+ fontSize: 48,
39
+ color: theme.palette.text.disabled
40
+ }));
41
+ const Message = stylin(Typography)({ maxWidth: 420 });
42
+
43
+ export { NotFound };
44
+ //# sourceMappingURL=NotFound.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NotFound.esm.js","sources":["../../src/components/NotFound.tsx"],"sourcesContent":["import Box from '@massdriver/ui/Box';\nimport Button from '@massdriver/ui/Button';\nimport Typography from '@massdriver/ui/Typography';\nimport stylin from '@massdriver/ui/stylin';\nimport SearchOffIcon from '@mui/icons-material/SearchOff';\nimport { RouterLinkAdapter } from './RouterLinkAdapter';\nimport { internalRoutes } from '../internalRoutes';\n\n/** Read-only 404 for unknown routes or unresolved Massdriver ids. */\nexport const NotFound = ({\n title = 'Not found',\n message = \"We couldn't find what you were looking for. It may have been deleted, or the link may be incorrect.\",\n}: {\n title?: string;\n message?: string;\n}) => (\n <Root>\n <Icon />\n <Typography variant=\"h5\">{title}</Typography>\n <Message variant=\"body2\" color=\"text.secondary\">\n {message}\n </Message>\n <Button\n component={RouterLinkAdapter}\n href={internalRoutes.projects()}\n variant=\"outlined\"\n >\n Back to projects\n </Button>\n </Root>\n);\n\nexport default NotFound;\n\nconst Root = stylin(Box)(({ theme }: { theme: any }) => ({\n minHeight: '100%',\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n gap: theme.spacing(1.5),\n padding: theme.spacing(8, 4),\n textAlign: 'center',\n}));\n\nconst Icon = stylin(SearchOffIcon)(({ theme }: { theme: any }) => ({\n fontSize: 48,\n color: theme.palette.text.disabled,\n}));\n\nconst Message = stylin(Typography)({ maxWidth: 420 });\n"],"names":[],"mappings":";;;;;;;;;AASO,MAAM,WAAW,CAAC;AAAA,EACvB,KAAA,GAAQ,WAAA;AAAA,EACR,OAAA,GAAU;AACZ,CAAA,0BAIG,IAAA,EAAA,EACC,QAAA,EAAA;AAAA,kBAAA,GAAA,CAAC,IAAA,EAAA,EAAK,CAAA;AAAA,kBACN,GAAA,CAAC,UAAA,EAAA,EAAW,OAAA,EAAQ,IAAA,EAAM,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,sBAC/B,OAAA,EAAA,EAAQ,OAAA,EAAQ,OAAA,EAAQ,KAAA,EAAM,kBAC5B,QAAA,EAAA,OAAA,EACH,CAAA;AAAA,kBACA,GAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,iBAAA;AAAA,MACX,IAAA,EAAM,eAAe,QAAA,EAAS;AAAA,MAC9B,OAAA,EAAQ,UAAA;AAAA,MACT,QAAA,EAAA;AAAA;AAAA;AAED,CAAA,EACF;AAKF,MAAM,OAAO,MAAA,CAAO,GAAG,EAAE,CAAC,EAAE,OAAM,MAAuB;AAAA,EACvD,SAAA,EAAW,MAAA;AAAA,EACX,OAAA,EAAS,MAAA;AAAA,EACT,aAAA,EAAe,QAAA;AAAA,EACf,UAAA,EAAY,QAAA;AAAA,EACZ,cAAA,EAAgB,QAAA;AAAA,EAChB,GAAA,EAAK,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA;AAAA,EACtB,OAAA,EAAS,KAAA,CAAM,OAAA,CAAQ,CAAA,EAAG,CAAC,CAAA;AAAA,EAC3B,SAAA,EAAW;AACb,CAAA,CAAE,CAAA;AAEF,MAAM,OAAO,MAAA,CAAO,aAAa,EAAE,CAAC,EAAE,OAAM,MAAuB;AAAA,EACjE,QAAA,EAAU,EAAA;AAAA,EACV,KAAA,EAAO,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK;AAC5B,CAAA,CAAE,CAAA;AAEF,MAAM,UAAU,MAAA,CAAO,UAAU,EAAE,EAAE,QAAA,EAAU,KAAK,CAAA;;;;"}
@@ -0,0 +1,24 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import Button from '@massdriver/ui/Button';
3
+ import OpenInNewIcon from '@massdriver/ui/icons/OpenInNewIcon';
4
+
5
+ const OpenInMassdriverButton = ({
6
+ url,
7
+ children = "Open in Massdriver",
8
+ variant = "contained",
9
+ size
10
+ }) => /* @__PURE__ */ jsx(
11
+ Button,
12
+ {
13
+ href: url,
14
+ target: "_blank",
15
+ rel: "noopener noreferrer",
16
+ variant,
17
+ size,
18
+ endIcon: /* @__PURE__ */ jsx(OpenInNewIcon, { fontSize: "small" }),
19
+ children
20
+ }
21
+ );
22
+
23
+ export { OpenInMassdriverButton };
24
+ //# sourceMappingURL=OpenInMassdriverButton.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OpenInMassdriverButton.esm.js","sources":["../../src/components/OpenInMassdriverButton.tsx"],"sourcesContent":["import Button from '@massdriver/ui/Button';\nimport OpenInNewIcon from '@massdriver/ui/icons/OpenInNewIcon';\nimport { ReactNode } from 'react';\n\n/**\n * Button that deep-links out to the Massdriver web app (opens in a new tab).\n * Used wherever the read-only plugin would otherwise let you edit something.\n */\nexport const OpenInMassdriverButton = ({\n url,\n children = 'Open in Massdriver',\n variant = 'contained',\n size,\n}: {\n url: string;\n children?: ReactNode;\n variant?: string;\n size?: string;\n}) => (\n <Button\n href={url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n variant={variant}\n size={size}\n endIcon={<OpenInNewIcon fontSize=\"small\" />}\n >\n {children}\n </Button>\n);\n"],"names":[],"mappings":";;;;AAQO,MAAM,yBAAyB,CAAC;AAAA,EACrC,GAAA;AAAA,EACA,QAAA,GAAW,oBAAA;AAAA,EACX,OAAA,GAAU,WAAA;AAAA,EACV;AACF,CAAA,qBAME,GAAA;AAAA,EAAC,MAAA;AAAA,EAAA;AAAA,IACC,IAAA,EAAM,GAAA;AAAA,IACN,MAAA,EAAO,QAAA;AAAA,IACP,GAAA,EAAI,qBAAA;AAAA,IACJ,OAAA;AAAA,IACA,IAAA;AAAA,IACA,OAAA,kBAAS,GAAA,CAAC,aAAA,EAAA,EAAc,QAAA,EAAS,OAAA,EAAQ,CAAA;AAAA,IAExC;AAAA;AACH;;;;"}
@@ -0,0 +1,88 @@
1
+ import { jsxs, jsx } from 'react/jsx-runtime';
2
+ import Box from '@massdriver/ui/Box';
3
+ import Divider from '@massdriver/ui/Divider';
4
+ import Stack from '@massdriver/ui/Stack';
5
+ import Typography from '@massdriver/ui/Typography';
6
+ import stylin from '@massdriver/ui/stylin';
7
+
8
+ const PageLayout = ({
9
+ title,
10
+ description,
11
+ headerActions,
12
+ actions,
13
+ maxWidth = 1400,
14
+ flush = false,
15
+ children
16
+ }) => /* @__PURE__ */ jsxs(Root, { children: [
17
+ /* @__PURE__ */ jsxs(PageHeader, { maxWidth, children: [
18
+ /* @__PURE__ */ jsxs(HeaderText, { children: [
19
+ /* @__PURE__ */ jsx(Typography, { variant: "h3", component: "h1", children: title }),
20
+ description && /* @__PURE__ */ jsx(Description, { variant: "body2", children: description })
21
+ ] }),
22
+ headerActions && /* @__PURE__ */ jsx(HeaderActions, { children: headerActions })
23
+ ] }),
24
+ /* @__PURE__ */ jsx(ZoneDivider, {}),
25
+ actions && /* @__PURE__ */ jsx(Toolbar, { maxWidth, children: /* @__PURE__ */ jsx(Stack, { direction: "row", spacing: 1.5, flexWrap: "wrap", useFlexGap: true, children: actions }) }),
26
+ flush ? /* @__PURE__ */ jsx(FlushContent, { children }) : /* @__PURE__ */ jsx(Content, { maxWidth, children })
27
+ ] });
28
+ const Root = stylin(Box)({
29
+ display: "flex",
30
+ flexDirection: "column",
31
+ height: "100%"
32
+ });
33
+ const PageHeader = stylin(Box, ["maxWidth"])(
34
+ ({ theme, maxWidth }) => ({
35
+ maxWidth,
36
+ mx: "auto",
37
+ width: "100%",
38
+ padding: theme.spacing(3, 4, 3, 4),
39
+ display: "flex",
40
+ alignItems: "flex-start",
41
+ justifyContent: "space-between",
42
+ gap: theme.spacing(3)
43
+ })
44
+ );
45
+ const HeaderText = stylin(Box)({ minWidth: 0, flex: 1 });
46
+ const HeaderActions = stylin(Box)({
47
+ flexShrink: 0,
48
+ display: "flex",
49
+ alignItems: "center"
50
+ });
51
+ const Description = stylin(Typography)(({ theme }) => ({
52
+ color: theme.palette.text.secondary,
53
+ mt: theme.spacing(0.75)
54
+ }));
55
+ const Toolbar = stylin(Box, ["maxWidth"])(
56
+ ({ theme, maxWidth }) => ({
57
+ maxWidth,
58
+ mx: "auto",
59
+ width: "100%",
60
+ display: "flex",
61
+ alignItems: "center",
62
+ padding: theme.spacing(3, 4, 0, 4)
63
+ })
64
+ );
65
+ const ZoneDivider = stylin(Divider)(({ theme }) => ({
66
+ height: "1px",
67
+ backgroundColor: theme.palette.divider
68
+ }));
69
+ const Content = stylin(Box, ["maxWidth"])(
70
+ ({ theme, maxWidth }) => ({
71
+ maxWidth,
72
+ mx: "auto",
73
+ width: "100%",
74
+ padding: theme.spacing(3, 4, 3, 4),
75
+ flex: 1
76
+ })
77
+ );
78
+ const FlushContent = stylin(Box)({
79
+ width: "100%",
80
+ flex: 1,
81
+ display: "flex",
82
+ flexDirection: "column",
83
+ minHeight: 0,
84
+ minWidth: 0
85
+ });
86
+
87
+ export { PageLayout };
88
+ //# sourceMappingURL=PageLayout.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PageLayout.esm.js","sources":["../../src/components/PageLayout.tsx"],"sourcesContent":["import Box from '@massdriver/ui/Box';\nimport Divider from '@massdriver/ui/Divider';\nimport Stack from '@massdriver/ui/Stack';\nimport Typography from '@massdriver/ui/Typography';\nimport stylin from '@massdriver/ui/stylin';\nimport { ReactNode } from 'react';\n\n/**\n * Page frame mirroring the web app's `shared/components/PageLayout` — title +\n * description header, a divider, an optional actions toolbar, and content.\n */\nexport const PageLayout = ({\n title,\n description,\n headerActions,\n actions,\n maxWidth = 1400,\n flush = false,\n children,\n}: {\n title: ReactNode;\n description?: ReactNode;\n headerActions?: ReactNode;\n actions?: ReactNode;\n maxWidth?: number;\n flush?: boolean;\n children: ReactNode;\n}) => (\n <Root>\n <PageHeader maxWidth={maxWidth}>\n <HeaderText>\n <Typography variant=\"h3\" component=\"h1\">\n {title}\n </Typography>\n {description && (\n <Description variant=\"body2\">{description}</Description>\n )}\n </HeaderText>\n {headerActions && <HeaderActions>{headerActions}</HeaderActions>}\n </PageHeader>\n <ZoneDivider />\n {actions && (\n <Toolbar maxWidth={maxWidth}>\n <Stack direction=\"row\" spacing={1.5} flexWrap=\"wrap\" useFlexGap>\n {actions}\n </Stack>\n </Toolbar>\n )}\n {flush ? (\n <FlushContent>{children}</FlushContent>\n ) : (\n <Content maxWidth={maxWidth}>{children}</Content>\n )}\n </Root>\n);\n\nconst Root = stylin(Box)({\n display: 'flex',\n flexDirection: 'column',\n height: '100%',\n});\n\nconst PageHeader = stylin(Box, ['maxWidth'])(\n ({ theme, maxWidth }: { theme: any; maxWidth: number }) => ({\n maxWidth,\n mx: 'auto',\n width: '100%',\n padding: theme.spacing(3, 4, 3, 4),\n display: 'flex',\n alignItems: 'flex-start',\n justifyContent: 'space-between',\n gap: theme.spacing(3),\n }),\n);\n\nconst HeaderText = stylin(Box)({ minWidth: 0, flex: 1 });\n\nconst HeaderActions = stylin(Box)({\n flexShrink: 0,\n display: 'flex',\n alignItems: 'center',\n});\n\nconst Description = stylin(Typography)(({ theme }: { theme: any }) => ({\n color: theme.palette.text.secondary,\n mt: theme.spacing(0.75),\n}));\n\nconst Toolbar = stylin(Box, ['maxWidth'])(\n ({ theme, maxWidth }: { theme: any; maxWidth: number }) => ({\n maxWidth,\n mx: 'auto',\n width: '100%',\n display: 'flex',\n alignItems: 'center',\n padding: theme.spacing(3, 4, 0, 4),\n }),\n);\n\nconst ZoneDivider = stylin(Divider)(({ theme }: { theme: any }) => ({\n height: '1px',\n backgroundColor: theme.palette.divider,\n}));\n\nconst Content = stylin(Box, ['maxWidth'])(\n ({ theme, maxWidth }: { theme: any; maxWidth: number }) => ({\n maxWidth,\n mx: 'auto',\n width: '100%',\n padding: theme.spacing(3, 4, 3, 4),\n flex: 1,\n }),\n);\n\nconst FlushContent = stylin(Box)({\n width: '100%',\n flex: 1,\n display: 'flex',\n flexDirection: 'column',\n minHeight: 0,\n minWidth: 0,\n});\n"],"names":[],"mappings":";;;;;;;AAWO,MAAM,aAAa,CAAC;AAAA,EACzB,KAAA;AAAA,EACA,WAAA;AAAA,EACA,aAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA,GAAW,IAAA;AAAA,EACX,KAAA,GAAQ,KAAA;AAAA,EACR;AACF,CAAA,0BASG,IAAA,EAAA,EACC,QAAA,EAAA;AAAA,kBAAA,IAAA,CAAC,cAAW,QAAA,EACV,QAAA,EAAA;AAAA,oBAAA,IAAA,CAAC,UAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,UAAA,EAAA,EAAW,OAAA,EAAQ,IAAA,EAAK,SAAA,EAAU,MAChC,QAAA,EAAA,KAAA,EACH,CAAA;AAAA,MACC,WAAA,oBACC,GAAA,CAAC,WAAA,EAAA,EAAY,OAAA,EAAQ,SAAS,QAAA,EAAA,WAAA,EAAY;AAAA,KAAA,EAE9C,CAAA;AAAA,IACC,aAAA,oBAAiB,GAAA,CAAC,aAAA,EAAA,EAAe,QAAA,EAAA,aAAA,EAAc;AAAA,GAAA,EAClD,CAAA;AAAA,sBACC,WAAA,EAAA,EAAY,CAAA;AAAA,EACZ,OAAA,oBACC,GAAA,CAAC,OAAA,EAAA,EAAQ,QAAA,EACP,8BAAC,KAAA,EAAA,EAAM,SAAA,EAAU,KAAA,EAAM,OAAA,EAAS,KAAK,QAAA,EAAS,MAAA,EAAO,UAAA,EAAU,IAAA,EAC5D,mBACH,CAAA,EACF,CAAA;AAAA,EAED,KAAA,uBACE,YAAA,EAAA,EAAc,QAAA,EAAS,oBAExB,GAAA,CAAC,OAAA,EAAA,EAAQ,UAAqB,QAAA,EAAS;AAAA,CAAA,EAE3C;AAGF,MAAM,IAAA,GAAO,MAAA,CAAO,GAAG,CAAA,CAAE;AAAA,EACvB,OAAA,EAAS,MAAA;AAAA,EACT,aAAA,EAAe,QAAA;AAAA,EACf,MAAA,EAAQ;AACV,CAAC,CAAA;AAED,MAAM,UAAA,GAAa,MAAA,CAAO,GAAA,EAAK,CAAC,UAAU,CAAC,CAAA;AAAA,EACzC,CAAC,EAAE,KAAA,EAAO,QAAA,EAAS,MAAyC;AAAA,IAC1D,QAAA;AAAA,IACA,EAAA,EAAI,MAAA;AAAA,IACJ,KAAA,EAAO,MAAA;AAAA,IACP,SAAS,KAAA,CAAM,OAAA,CAAQ,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC,CAAA;AAAA,IACjC,OAAA,EAAS,MAAA;AAAA,IACT,UAAA,EAAY,YAAA;AAAA,IACZ,cAAA,EAAgB,eAAA;AAAA,IAChB,GAAA,EAAK,KAAA,CAAM,OAAA,CAAQ,CAAC;AAAA,GACtB;AACF,CAAA;AAEA,MAAM,UAAA,GAAa,OAAO,GAAG,CAAA,CAAE,EAAE,QAAA,EAAU,CAAA,EAAG,IAAA,EAAM,CAAA,EAAG,CAAA;AAEvD,MAAM,aAAA,GAAgB,MAAA,CAAO,GAAG,CAAA,CAAE;AAAA,EAChC,UAAA,EAAY,CAAA;AAAA,EACZ,OAAA,EAAS,MAAA;AAAA,EACT,UAAA,EAAY;AACd,CAAC,CAAA;AAED,MAAM,cAAc,MAAA,CAAO,UAAU,EAAE,CAAC,EAAE,OAAM,MAAuB;AAAA,EACrE,KAAA,EAAO,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,SAAA;AAAA,EAC1B,EAAA,EAAI,KAAA,CAAM,OAAA,CAAQ,IAAI;AACxB,CAAA,CAAE,CAAA;AAEF,MAAM,OAAA,GAAU,MAAA,CAAO,GAAA,EAAK,CAAC,UAAU,CAAC,CAAA;AAAA,EACtC,CAAC,EAAE,KAAA,EAAO,QAAA,EAAS,MAAyC;AAAA,IAC1D,QAAA;AAAA,IACA,EAAA,EAAI,MAAA;AAAA,IACJ,KAAA,EAAO,MAAA;AAAA,IACP,OAAA,EAAS,MAAA;AAAA,IACT,UAAA,EAAY,QAAA;AAAA,IACZ,SAAS,KAAA,CAAM,OAAA,CAAQ,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC;AAAA,GACnC;AACF,CAAA;AAEA,MAAM,cAAc,MAAA,CAAO,OAAO,EAAE,CAAC,EAAE,OAAM,MAAuB;AAAA,EAClE,MAAA,EAAQ,KAAA;AAAA,EACR,eAAA,EAAiB,MAAM,OAAA,CAAQ;AACjC,CAAA,CAAE,CAAA;AAEF,MAAM,OAAA,GAAU,MAAA,CAAO,GAAA,EAAK,CAAC,UAAU,CAAC,CAAA;AAAA,EACtC,CAAC,EAAE,KAAA,EAAO,QAAA,EAAS,MAAyC;AAAA,IAC1D,QAAA;AAAA,IACA,EAAA,EAAI,MAAA;AAAA,IACJ,KAAA,EAAO,MAAA;AAAA,IACP,SAAS,KAAA,CAAM,OAAA,CAAQ,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC,CAAA;AAAA,IACjC,IAAA,EAAM;AAAA,GACR;AACF,CAAA;AAEA,MAAM,YAAA,GAAe,MAAA,CAAO,GAAG,CAAA,CAAE;AAAA,EAC/B,KAAA,EAAO,MAAA;AAAA,EACP,IAAA,EAAM,CAAA;AAAA,EACN,OAAA,EAAS,MAAA;AAAA,EACT,aAAA,EAAe,QAAA;AAAA,EACf,SAAA,EAAW,CAAA;AAAA,EACX,QAAA,EAAU;AACZ,CAAC,CAAA;;;;"}
@@ -0,0 +1,12 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import { forwardRef } from 'react';
3
+ import { Link } from 'react-router-dom';
4
+
5
+ const RouterLinkAdapter = forwardRef(({ href, shallow: _shallow, ...rest }, ref) => (
6
+ // `shallow` is a Next-ism forwarded by PageTabs; drop it so it doesn't land
7
+ // on the DOM anchor.
8
+ /* @__PURE__ */ jsx(Link, { ref, to: href ?? "", ...rest })
9
+ ));
10
+
11
+ export { RouterLinkAdapter };
12
+ //# sourceMappingURL=RouterLinkAdapter.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RouterLinkAdapter.esm.js","sources":["../../src/components/RouterLinkAdapter.tsx"],"sourcesContent":["import { forwardRef } from 'react';\nimport { Link as RouterLink } from 'react-router-dom';\n\n/**\n * Adapts `@massdriver/ui` link cells (which pass an `href`) to react-router's\n * `Link` (which navigates via `to`), so DataList link columns keep the app's\n * styling while doing client-side SPA navigation instead of full reloads.\n */\nexport const RouterLinkAdapter = forwardRef<\n HTMLAnchorElement,\n { href?: string; shallow?: boolean }\n>(({ href, shallow: _shallow, ...rest }, ref) => (\n // `shallow` is a Next-ism forwarded by PageTabs; drop it so it doesn't land\n // on the DOM anchor.\n <RouterLink ref={ref} to={href ?? ''} {...rest} />\n));\n"],"names":["RouterLink"],"mappings":";;;;AAQO,MAAM,iBAAA,GAAoB,WAG/B,CAAC,EAAE,MAAM,OAAA,EAAS,QAAA,EAAU,GAAG,IAAA,EAAK,EAAG,GAAA;AAAA;AAAA;AAAA,sBAGtCA,IAAA,EAAA,EAAW,GAAA,EAAU,IAAI,IAAA,IAAQ,EAAA,EAAK,GAAG,IAAA,EAAM;AAAA,CACjD;;;;"}