@techdocs/cli 1.11.1 → 1.11.2-next.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.
- package/CHANGELOG.md +8 -0
- package/dist/embedded-app/.config-schema.json +1967 -1200
- package/dist/embedded-app/index.html +1 -1
- package/dist/embedded-app/index.html.tmpl +1 -1
- package/dist/embedded-app/static/123.bcb96abf.chunk.js +2 -0
- package/dist/embedded-app/static/123.bcb96abf.chunk.js.map +1 -0
- package/dist/embedded-app/static/1659.fe3e020b.chunk.js +2 -0
- package/dist/embedded-app/static/1659.fe3e020b.chunk.js.map +1 -0
- package/dist/embedded-app/static/3641.2f6dbbcb.chunk.js +2 -0
- package/dist/embedded-app/static/3641.2f6dbbcb.chunk.js.map +1 -0
- package/dist/embedded-app/static/3641.3641.9c1b1a2e.css +2 -0
- package/dist/embedded-app/static/3641.3641.9c1b1a2e.css.map +1 -0
- package/dist/embedded-app/static/4587.9946f651.chunk.js +2 -0
- package/dist/embedded-app/static/4587.9946f651.chunk.js.map +1 -0
- package/dist/embedded-app/static/{5443.fa47af87.chunk.js → 5443.835e027f.chunk.js} +2 -2
- package/dist/embedded-app/static/{5443.fa47af87.chunk.js.map → 5443.835e027f.chunk.js.map} +1 -1
- package/dist/embedded-app/static/{3939.3939.44355183.css → 5954.5954.8056ed76.css} +1 -1
- package/dist/embedded-app/static/{3939.3939.44355183.css.map → 5954.5954.8056ed76.css.map} +1 -1
- package/dist/embedded-app/static/5954.f0710c0b.chunk.js +2 -0
- package/dist/embedded-app/static/5954.f0710c0b.chunk.js.map +1 -0
- package/dist/embedded-app/static/{4815.b2bde1a3.chunk.js → 7213.e2116c72.chunk.js} +2 -2
- package/dist/embedded-app/static/7213.e2116c72.chunk.js.map +1 -0
- package/dist/embedded-app/static/{7226.8c68c3d3.chunk.js → 7226.07a43ca6.chunk.js} +2 -2
- package/dist/embedded-app/static/7226.07a43ca6.chunk.js.map +1 -0
- package/dist/embedded-app/static/{7477.a970d20a.chunk.js → 7227.69beafef.chunk.js} +5 -5
- package/dist/embedded-app/static/7227.69beafef.chunk.js.map +1 -0
- package/dist/embedded-app/static/{main.728cdf6e.css → main.2a45aed3.css} +2 -2
- package/dist/embedded-app/static/main.2a45aed3.css.map +1 -0
- package/dist/embedded-app/static/main.3aa6c085.js +523 -0
- package/dist/embedded-app/static/main.3aa6c085.js.map +1 -0
- package/dist/embedded-app/static/{module-material-ui.972bd852.js → module-material-ui.0bea4977.js} +2 -2
- package/dist/embedded-app/static/module-material-ui.0bea4977.js.map +1 -0
- package/dist/embedded-app/static/module-react-aria-components.edebf589.js +2 -0
- package/dist/embedded-app/static/module-react-aria-components.edebf589.js.map +1 -0
- package/dist/embedded-app/static/module-react-aria.84a78dd1.js +13 -0
- package/dist/embedded-app/static/module-react-aria.84a78dd1.js.map +1 -0
- package/dist/embedded-app/static/{module-react-stately.97fc37eb.js → module-react-stately.3db88231.js} +2 -2
- package/dist/embedded-app/static/module-react-stately.3db88231.js.map +1 -0
- package/dist/embedded-app/static/module-remixicon.4e40b5b6.js +2 -0
- package/dist/embedded-app/static/{module-remixicon.0feb7353.js.map → module-remixicon.4e40b5b6.js.map} +1 -1
- package/dist/embedded-app/static/{runtime.8fda57a9.js → runtime.9fcbc8ae.js} +2 -2
- package/dist/embedded-app/static/runtime.9fcbc8ae.js.map +1 -0
- package/dist/package.json.cjs.js +1 -1
- package/package.json +7 -7
- package/dist/embedded-app/static/123.59719fa4.chunk.js +0 -2
- package/dist/embedded-app/static/123.59719fa4.chunk.js.map +0 -1
- package/dist/embedded-app/static/1659.6b3694d1.chunk.js +0 -2
- package/dist/embedded-app/static/1659.6b3694d1.chunk.js.map +0 -1
- package/dist/embedded-app/static/3939.265160c5.chunk.js +0 -2
- package/dist/embedded-app/static/3939.265160c5.chunk.js.map +0 -1
- package/dist/embedded-app/static/4587.baab3514.chunk.js +0 -2
- package/dist/embedded-app/static/4587.baab3514.chunk.js.map +0 -1
- package/dist/embedded-app/static/4815.b2bde1a3.chunk.js.map +0 -1
- package/dist/embedded-app/static/7226.8c68c3d3.chunk.js.map +0 -1
- package/dist/embedded-app/static/7477.a970d20a.chunk.js.map +0 -1
- package/dist/embedded-app/static/main.728cdf6e.css.map +0 -1
- package/dist/embedded-app/static/main.fbc1b502.js +0 -523
- package/dist/embedded-app/static/main.fbc1b502.js.map +0 -1
- package/dist/embedded-app/static/module-material-ui.972bd852.js.map +0 -1
- package/dist/embedded-app/static/module-react-aria-components.ab7cc6df.js +0 -2
- package/dist/embedded-app/static/module-react-aria-components.ab7cc6df.js.map +0 -1
- package/dist/embedded-app/static/module-react-aria.e3e38de1.js +0 -13
- package/dist/embedded-app/static/module-react-aria.e3e38de1.js.map +0 -1
- package/dist/embedded-app/static/module-react-stately.97fc37eb.js.map +0 -1
- package/dist/embedded-app/static/module-remixicon.0feb7353.js +0 -2
- package/dist/embedded-app/static/runtime.8fda57a9.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"static/3939.265160c5.chunk.js","sources":["webpack://techdocs-cli-embedded-app/../core-components/src/components/DependencyGraph/types.ts","webpack://techdocs-cli-embedded-app/../core-components/src/components/FavoriteToggle/FavoriteToggle.tsx","webpack://techdocs-cli-embedded-app/../core-components/src/layout/HeaderLabel/HeaderLabel.tsx","webpack://techdocs-cli-embedded-app/../ui/src/components/ButtonIcon/definition.ts","webpack://techdocs-cli-embedded-app/../ui/src/components/ButtonIcon/ButtonIcon.module.css?cd9c","webpack://techdocs-cli-embedded-app/../ui/src/components/ButtonIcon/ButtonIcon.tsx","webpack://techdocs-cli-embedded-app/../../plugins/catalog-react/src/hooks/useStarredEntity.ts","webpack://techdocs-cli-embedded-app/../../plugins/catalog-react/src/components/FavoriteEntity/FavoriteEntity.tsx","webpack://techdocs-cli-embedded-app/../core-components/src/components/DependencyGraph/DependencyGraph.tsx","webpack://techdocs-cli-embedded-app/../../plugins/catalog-react/src/components/InspectEntityDialog/components/EntityKindIcon.tsx","webpack://techdocs-cli-embedded-app/../../plugins/catalog-react/src/components/InspectEntityDialog/components/AncestryPage.tsx","webpack://techdocs-cli-embedded-app/../../plugins/catalog-react/src/components/InspectEntityDialog/components/common.tsx","webpack://techdocs-cli-embedded-app/../../plugins/catalog-react/src/components/InspectEntityDialog/components/ColocatedPage.tsx","webpack://techdocs-cli-embedded-app/../../plugins/catalog-react/src/components/InspectEntityDialog/components/util.ts","webpack://techdocs-cli-embedded-app/../../plugins/catalog-react/src/components/InspectEntityDialog/components/JsonPage.tsx","webpack://techdocs-cli-embedded-app/../ui/src/components/TagGroup/TagGroup.module.css?dc18","webpack://techdocs-cli-embedded-app/../ui/src/components/TagGroup/definition.ts","webpack://techdocs-cli-embedded-app/../ui/src/components/TagGroup/TagGroup.tsx","webpack://techdocs-cli-embedded-app/../../plugins/catalog-react/src/components/InspectEntityDialog/components/OverviewPage.tsx","webpack://techdocs-cli-embedded-app/../../plugins/catalog-react/src/components/InspectEntityDialog/components/YamlPage.tsx","webpack://techdocs-cli-embedded-app/../../plugins/catalog-react/src/components/InspectEntityDialog/InspectEntityDialog.tsx","webpack://techdocs-cli-embedded-app/../../plugins/catalog/src/alpha/components/EntityLabels/EntityLabels.tsx","webpack://techdocs-cli-embedded-app/../../plugins/catalog/src/components/EntityContextMenu/UnregisterEntity.tsx","webpack://techdocs-cli-embedded-app/../../plugins/catalog/src/context/EntityContextMenuContext.tsx","webpack://techdocs-cli-embedded-app/../../plugins/catalog/src/components/EntityContextMenu/EntityContextMenu.tsx","webpack://techdocs-cli-embedded-app/../../plugins/catalog/src/alpha/components/EntityHeader/EntityHeader.tsx","webpack://techdocs-cli-embedded-app/../../plugins/catalog/src/alpha/components/EntityTabs/EntityTabsPanel.tsx","webpack://techdocs-cli-embedded-app/../../plugins/catalog/src/alpha/components/EntityTabs/EntityTabsGroup.tsx","webpack://techdocs-cli-embedded-app/../../plugins/catalog/src/alpha/components/EntityTabs/EntityTabsList.tsx","webpack://techdocs-cli-embedded-app/../../plugins/catalog/src/alpha/components/EntityTabs/EntityTabs.tsx","webpack://techdocs-cli-embedded-app/../../plugins/catalog/src/alpha/components/EntityLayout/EntityLayout.tsx"],"sourcesContent":["/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/* We want to maintain the same information as an enum, so we disable the redeclaration warning */\n/* eslint-disable @typescript-eslint/no-redeclare */\n\n/**\n * Types used to customize and provide data to {@link DependencyGraph}\n *\n * @packageDocumentation\n */\n\nimport { ReactNode } from 'react';\n\n/**\n * Types for the {@link DependencyGraph} component.\n *\n * @public\n */\nexport namespace DependencyGraphTypes {\n /**\n * Edge of {@link DependencyGraph}\n *\n * @public\n */\n export type DependencyEdge<T = {}> = T & {\n /**\n * ID of {@link DependencyNode} from where the Edge start\n */\n from: string;\n /**\n * ID of {@link DependencyNode} to where the Edge goes to\n */\n to: string;\n /**\n * Label assigned and rendered with the Edge\n */\n label?: string;\n /**\n * Distance to a root entity\n */\n distance?: number;\n };\n\n /**\n * Properties of {@link DependencyGraphTypes.RenderLabelFunction} for {@link DependencyGraphTypes.DependencyEdge}\n *\n * @public\n */\n export type RenderLabelProps<T = unknown> = { edge: DependencyEdge<T> };\n\n /**\n * Custom React component for edge labels\n *\n * @public\n */\n export type RenderLabelFunction<T = {}> = (\n props: RenderLabelProps<T>,\n ) => ReactNode;\n\n /**\n * Node of {@link DependencyGraph}\n *\n * @public\n */\n export type DependencyNode<T = {}> = T & {\n id: string;\n };\n\n /**\n * Properties of {@link DependencyGraphTypes.RenderNodeFunction} for {@link DependencyGraphTypes.DependencyNode}\n *\n * @public\n */\n export type RenderNodeProps<T = unknown> = { node: DependencyNode<T> };\n\n /**\n * Custom React component for graph {@link DependencyGraphTypes.DependencyNode}\n *\n * @public\n */\n export type RenderNodeFunction<T = {}> = (\n props: RenderNodeProps<T>,\n ) => ReactNode;\n\n /**\n * Properties of {@link DependencyGraphTypes.RenderEdgeFunction} for {@link DependencyGraphTypes.DependencyEdge}\n *\n * @public\n */\n export type RenderEdgeProps<T = {}> = {\n edge: T & {\n points: { x: number; y: number }[];\n label?: string;\n labeloffset?: number;\n labelpos?: string;\n width?: number;\n height?: number;\n weight?: number;\n minlen?: number;\n showArrowHeads?: boolean;\n from?: string;\n to?: string;\n relations?: string[];\n };\n id: {\n v: string;\n w: string;\n name?: string | undefined;\n };\n };\n\n /**\n * Custom React component for graph {@link DependencyGraphTypes.DependencyEdge}\n *\n * @public\n */\n export type RenderEdgeFunction<T = {}> = (\n props: RenderEdgeProps<T>,\n ) => ReactNode;\n\n /**\n * Graph direction\n *\n * @public\n */\n export const Direction = {\n /**\n * Top to Bottom\n */\n TOP_BOTTOM: 'TB',\n /**\n * Bottom to Top\n */\n BOTTOM_TOP: 'BT',\n /**\n * Left to Right\n */\n LEFT_RIGHT: 'LR',\n /**\n * Right to Left\n */\n RIGHT_LEFT: 'RL',\n } as const;\n\n /**\n * @public\n */\n export type Direction = (typeof Direction)[keyof typeof Direction];\n\n /**\n * @public\n */\n export namespace Direction {\n export type TOP_BOTTOM = typeof Direction.TOP_BOTTOM;\n export type BOTTOM_TOP = typeof Direction.BOTTOM_TOP;\n export type LEFT_RIGHT = typeof Direction.LEFT_RIGHT;\n export type RIGHT_LEFT = typeof Direction.RIGHT_LEFT;\n }\n\n /**\n * Node alignment\n *\n * @public\n */\n export const Alignment = {\n /**\n * Up Left\n */\n UP_LEFT: 'UL',\n /**\n * Up Right\n */\n UP_RIGHT: 'UR',\n /**\n * Down Left\n */\n DOWN_LEFT: 'DL',\n /**\n * Down Right\n */\n DOWN_RIGHT: 'DR',\n } as const;\n\n /**\n * @public\n */\n export type Alignment = (typeof Alignment)[keyof typeof Alignment];\n\n /**\n * @public\n */\n export namespace Alignment {\n export type UP_LEFT = typeof Alignment.UP_LEFT;\n export type UP_RIGHT = typeof Alignment.UP_RIGHT;\n export type DOWN_LEFT = typeof Alignment.DOWN_LEFT;\n export type DOWN_RIGHT = typeof Alignment.DOWN_RIGHT;\n }\n\n /**\n * Algorithm used to rand nodes in graph\n *\n * @public\n */\n export const Ranker = {\n /**\n * {@link https://en.wikipedia.org/wiki/Network_simplex_algorithm | Network Simplex} algorithm\n */\n NETWORK_SIMPLEX: 'network-simplex',\n /**\n * Tight Tree algorithm\n */\n TIGHT_TREE: 'tight-tree',\n /**\n * Longest path algorithm\n *\n * @remarks\n *\n * Simplest and fastest\n */\n LONGEST_PATH: 'longest-path',\n } as const;\n\n /**\n * @public\n */\n export type Ranker = (typeof Ranker)[keyof typeof Ranker];\n\n /**\n * @public\n */\n export namespace Ranker {\n export type NETWORK_SIMPLEX = typeof Ranker.NETWORK_SIMPLEX;\n export type TIGHT_TREE = typeof Ranker.TIGHT_TREE;\n export type LONGEST_PATH = typeof Ranker.LONGEST_PATH;\n }\n\n /**\n * Position of label in relation to the edge\n *\n * @public\n */\n export const LabelPosition = {\n LEFT: 'l',\n RIGHT: 'r',\n CENTER: 'c',\n } as const;\n\n /**\n * @public\n */\n export type LabelPosition =\n (typeof LabelPosition)[keyof typeof LabelPosition];\n\n /**\n * @public\n */\n export namespace LabelPosition {\n export type LEFT = typeof LabelPosition.LEFT;\n export type RIGHT = typeof LabelPosition.RIGHT;\n export type CENTER = typeof LabelPosition.CENTER;\n }\n}\n","/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { ComponentProps } from 'react';\nimport IconButton from '@material-ui/core/IconButton';\nimport Tooltip from '@material-ui/core/Tooltip';\nimport Typography from '@material-ui/core/Typography';\nimport { Theme, makeStyles } from '@material-ui/core/styles';\nimport { StarIcon, UnstarredIcon } from '../../icons';\n\nconst useStyles = makeStyles<Theme>(\n () => ({\n icon: {\n color: '#f3ba37',\n cursor: 'pointer',\n display: 'inline-flex',\n },\n iconBorder: {\n color: 'inherit',\n cursor: 'pointer',\n display: 'inline-flex',\n },\n }),\n { name: 'BackstageFavoriteToggleIcon' },\n);\n\n/**\n * @public\n */\nexport type FavoriteToggleIconClassKey = 'icon' | 'iconBorder';\n\n/**\n * Icon used in FavoriteToggle component.\n *\n * Can be used independently, useful when used as {@link @material-table/core#MaterialTableProps.actions} in {@link @material-table/core#MaterialTable}\n *\n * @public\n */\nexport function FavoriteToggleIcon(props: { isFavorite: boolean }) {\n const { isFavorite } = props;\n const classes = useStyles();\n\n return (\n <Typography\n component=\"span\"\n className={isFavorite ? classes.icon : classes.iconBorder}\n >\n {isFavorite ? <StarIcon /> : <UnstarredIcon />}\n </Typography>\n );\n}\n\n/**\n * Props for the {@link FavoriteToggle} component.\n *\n * @public\n */\nexport type FavoriteToggleProps = ComponentProps<typeof IconButton> & {\n id: string;\n title: string;\n isFavorite: boolean;\n onToggle: (value: boolean) => void;\n};\n\n/**\n * Toggle encapsulating logic for marking something as favorite,\n * primarily used in various instances of entity lists and cards but can be used elsewhere.\n *\n * This component can only be used in as a controlled toggle and does not keep internal state.\n *\n * @public\n */\nexport function FavoriteToggle(props: FavoriteToggleProps) {\n const {\n id,\n title,\n isFavorite: value,\n onToggle: onChange,\n ...iconButtonProps\n } = props;\n return (\n <Tooltip id={id} title={title}>\n <IconButton\n aria-label={title}\n id={id}\n onClick={() => onChange(!value)}\n color=\"inherit\"\n {...iconButtonProps}\n >\n <FavoriteToggleIcon isFavorite={value} />\n </IconButton>\n </Tooltip>\n );\n}\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport Grid from '@material-ui/core/Grid';\nimport { alpha, makeStyles } from '@material-ui/core/styles';\nimport Typography from '@material-ui/core/Typography';\nimport { ReactNode, PropsWithChildren } from 'react';\nimport { Link } from '../../components/Link';\n\n/** @public */\nexport type HeaderLabelClassKey = 'root' | 'label' | 'value';\n\nconst useStyles = makeStyles(\n theme => ({\n root: {\n textAlign: 'left',\n },\n label: {\n color: theme.page.fontColor,\n fontWeight: theme.typography.fontWeightBold,\n letterSpacing: 0,\n fontSize: theme.typography.fontSize,\n marginBottom: theme.spacing(1) / 2,\n lineHeight: 1,\n },\n value: {\n color: alpha(theme.page.fontColor, 0.8),\n fontSize: theme.typography.fontSize,\n lineHeight: 1,\n },\n }),\n { name: 'BackstageHeaderLabel' },\n);\n\ntype HeaderLabelContentProps = PropsWithChildren<{\n value: ReactNode;\n className: string;\n typographyRootComponent?: keyof JSX.IntrinsicElements;\n}>;\n\nconst HeaderLabelContent = ({\n value,\n className,\n typographyRootComponent,\n}: HeaderLabelContentProps) => {\n return (\n <Typography\n component={\n typographyRootComponent ?? (typeof value === 'string' ? 'p' : 'span')\n }\n className={className}\n >\n {value}\n </Typography>\n );\n};\n\ntype HeaderLabelProps = {\n label: string;\n value?: HeaderLabelContentProps['value'];\n contentTypograpyRootComponent?: HeaderLabelContentProps['typographyRootComponent'];\n url?: string;\n};\n\n/**\n * Additional label to main {@link Header}\n *\n * @public\n *\n */\nexport function HeaderLabel(props: HeaderLabelProps) {\n const { label, value, url, contentTypograpyRootComponent } = props;\n const classes = useStyles();\n const content = (\n <HeaderLabelContent\n className={classes.value}\n value={value || '<Unknown>'}\n typographyRootComponent={contentTypograpyRootComponent}\n />\n );\n return (\n <Grid item>\n <Typography component=\"span\" className={classes.root}>\n <Typography className={classes.label}>{label}</Typography>\n {url ? <Link to={url}>{content}</Link> : content}\n </Typography>\n </Grid>\n );\n}\n","/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { defineComponent } from '../../hooks/useDefinition';\nimport type { ButtonIconOwnProps } from './types';\nimport styles from './ButtonIcon.module.css';\n\n/**\n * Component definition for ButtonIcon\n * @public\n */\nexport const ButtonIconDefinition = defineComponent<ButtonIconOwnProps>()({\n styles,\n classNames: {\n root: 'bui-ButtonIcon',\n content: 'bui-ButtonIconContent',\n spinner: 'bui-ButtonIconSpinner',\n },\n bg: 'consumer',\n propDefs: {\n size: { dataAttribute: true, default: 'small' },\n variant: { dataAttribute: true, default: 'primary' },\n isPending: { dataAttribute: true },\n loading: { dataAttribute: true },\n icon: {},\n className: {},\n },\n});\n","// extracted by css-extract-rspack-plugin\nexport default {\"bui-ButtonIcon\":\"oswl8eimGwGMv65g\",\"bui-ButtonIconContent\":\"nupI988ZoWQXN2ow\",\"bui-ButtonIconSpinner\":\"S0ip8O7B0EhQCtAt\",\"bui-spin\":\"wvp018_1ftcIUJUQ\"};","/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { forwardRef, Ref } from 'react';\nimport { Button as RAButton, ProgressBar } from 'react-aria-components';\nimport { RiLoader4Line } from '@remixicon/react';\nimport type { ButtonIconProps } from './types';\nimport { useDefinition } from '../../hooks/useDefinition';\nimport { ButtonIconDefinition } from './definition';\n\n/**\n * An icon-only button that supports a loading state and requires an accessible label.\n *\n * @public\n */\nexport const ButtonIcon = forwardRef(\n (props: ButtonIconProps, ref: Ref<HTMLButtonElement>) => {\n const { ownProps, restProps, dataAttributes } = useDefinition(\n ButtonIconDefinition,\n // Merge deprecated `loading` into `isPending` so data attributes and\n // internal logic only need to check a single prop.\n {\n ...props,\n isPending:\n props.isPending || props.loading\n ? true\n : props.isPending ?? props.loading,\n },\n );\n const { classes, icon, isPending } = ownProps;\n\n return (\n <RAButton\n className={classes.root}\n ref={ref}\n isPending={isPending}\n {...dataAttributes}\n {...restProps}\n >\n {({ isPending }) => (\n <>\n <span className={classes.content}>{icon}</span>\n\n {isPending && (\n <ProgressBar\n aria-label=\"Loading\"\n isIndeterminate\n className={classes.spinner}\n >\n <RiLoader4Line aria-hidden=\"true\" />\n </ProgressBar>\n )}\n </>\n )}\n </RAButton>\n );\n },\n);\n\nButtonIcon.displayName = 'ButtonIcon';\n","/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n Entity,\n CompoundEntityRef,\n stringifyEntityRef,\n} from '@backstage/catalog-model';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { useCallback, useEffect, useState } from 'react';\nimport { starredEntitiesApiRef } from '../apis';\n\nfunction getEntityRef(\n entityOrRef: Entity | CompoundEntityRef | string,\n): string {\n return typeof entityOrRef === 'string'\n ? entityOrRef\n : stringifyEntityRef(entityOrRef);\n}\n\n/** @public */\nexport function useStarredEntity(\n entityOrRef: Entity | CompoundEntityRef | string,\n): {\n toggleStarredEntity: () => void;\n isStarredEntity: boolean;\n} {\n const starredEntitiesApi = useApi(starredEntitiesApiRef);\n\n const [isStarredEntity, setIsStarredEntity] = useState(false);\n\n useEffect(() => {\n const subscription = starredEntitiesApi.starredEntitie$().subscribe({\n next(starredEntities: Set<string>) {\n setIsStarredEntity(starredEntities.has(getEntityRef(entityOrRef)));\n },\n });\n\n return () => {\n subscription.unsubscribe();\n };\n }, [entityOrRef, starredEntitiesApi]);\n\n const toggleStarredEntity = useCallback(\n () => starredEntitiesApi.toggleStarred(getEntityRef(entityOrRef)).then(),\n [entityOrRef, starredEntitiesApi],\n );\n\n return {\n toggleStarredEntity,\n isStarredEntity,\n };\n}\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Entity, stringifyEntityRef } from '@backstage/catalog-model';\nimport IconButton from '@material-ui/core/IconButton';\nimport { ComponentProps } from 'react';\nimport { useStarredEntity } from '../../hooks/useStarredEntity';\nimport { catalogReactTranslationRef } from '../../translation';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { FavoriteToggle } from '@backstage/core-components';\n\n/** @public */\nexport type FavoriteEntityProps = ComponentProps<typeof IconButton> & {\n entity: Entity;\n};\n\n/**\n * IconButton for showing if a current entity is starred and adding/removing it from the favorite entities\n * @param props - MaterialUI IconButton props extended by required `entity` prop\n * @public\n */\nexport const FavoriteEntity = (props: FavoriteEntityProps) => {\n const { toggleStarredEntity, isStarredEntity } = useStarredEntity(\n props.entity,\n );\n const { t } = useTranslationRef(catalogReactTranslationRef);\n const title = isStarredEntity\n ? t('favoriteEntity.removeFromFavorites')\n : t('favoriteEntity.addToFavorites');\n\n const id = `favorite-${stringifyEntityRef(props.entity).replace(\n /[^a-zA-Z0-9-_]/g,\n '-',\n )}`;\n\n return (\n <FavoriteToggle\n title={title}\n id={id}\n isFavorite={isStarredEntity}\n onToggle={toggleStarredEntity}\n {...props}\n />\n );\n};\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { type ComponentType, Suspense, lazy } from 'react';\nimport type { DependencyGraphProps } from './DependencyGraphContent';\n\nexport type { DependencyGraphProps } from './DependencyGraphContent';\n\nconst LazyDependencyGraphContent = lazy(() =>\n import('./DependencyGraphContent').then(m => ({\n default: m.DependencyGraph as ComponentType<any>,\n })),\n);\n\n/**\n * Graph component used to visualize relations between entities\n *\n * @public\n */\nexport function DependencyGraph<NodeData, EdgeData>(\n props: DependencyGraphProps<NodeData, EdgeData>,\n) {\n return (\n <Suspense fallback={<div />}>\n <LazyDependencyGraphContent {...props} />\n </Suspense>\n );\n}\n","/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { parseEntityRef } from '@backstage/catalog-model';\nimport { useApp } from '@backstage/core-plugin-api';\nimport SvgIcon from '@material-ui/core/SvgIcon';\n\nconst DEFAULT_ICON = SvgIcon;\n\nfunction getKind(\n kind: string | undefined,\n entityRef: string | undefined,\n): string | undefined {\n if (kind) {\n return kind.toLocaleLowerCase('en-US');\n }\n\n if (entityRef) {\n try {\n return parseEntityRef(entityRef).kind.toLocaleLowerCase('en-US');\n } catch {\n return undefined;\n }\n }\n\n return undefined;\n}\n\nfunction useIcon(kind: string | undefined, entityRef: string | undefined) {\n const app = useApp();\n\n const actualKind = getKind(kind, entityRef);\n if (!actualKind) {\n return DEFAULT_ICON;\n }\n\n const icon = app.getSystemIcon(`kind:${actualKind}`);\n return icon || DEFAULT_ICON;\n}\n\nexport function EntityKindIcon(props: {\n kind?: string;\n entityRef?: string;\n x?: number;\n y?: number;\n width?: number;\n height?: number;\n className?: string;\n}) {\n const { kind, entityRef, ...otherProps } = props;\n const Icon = useIcon(kind, entityRef);\n return <Icon {...otherProps} />;\n}\n","/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n Entity,\n DEFAULT_NAMESPACE,\n stringifyEntityRef,\n} from '@backstage/catalog-model';\nimport {\n DependencyGraph,\n DependencyGraphTypes,\n Link,\n Progress,\n ResponseErrorPanel,\n} from '@backstage/core-components';\nimport { useApi, useApp, useRouteRef } from '@backstage/core-plugin-api';\nimport { Text, Box } from '@backstage/ui';\nimport { makeStyles } from '@material-ui/core/styles';\nimport classNames from 'classnames';\nimport { useLayoutEffect, useRef, useState } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport useAsync from 'react-use/esm/useAsync';\nimport { catalogApiRef } from '../../../api';\nimport { entityRouteRef } from '../../../routes';\nimport { useEntityPresentation } from '../../../apis';\nimport { EntityKindIcon } from './EntityKindIcon';\nimport { catalogReactTranslationRef } from '../../../translation';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\n\nconst useStyles = makeStyles(theme => ({\n node: {\n fill: theme.palette.grey[300],\n stroke: theme.palette.grey[300],\n '&.primary': {\n fill: theme.palette.primary.light,\n stroke: theme.palette.primary.light,\n },\n '&.secondary': {\n fill: theme.palette.secondary.light,\n stroke: theme.palette.secondary.light,\n },\n },\n text: {\n fill: theme.palette.getContrastText(theme.palette.grey[300]),\n '&.primary': {\n fill: theme.palette.primary.contrastText,\n },\n '&.secondary': {\n fill: theme.palette.secondary.contrastText,\n },\n '&.focused': {\n fontWeight: 'bold',\n },\n },\n clickable: {\n cursor: 'pointer',\n },\n}));\n\ntype NodeType = Entity & { root: boolean };\n\nfunction useAncestry(root: Entity): {\n loading: boolean;\n error?: Error;\n nodes: DependencyGraphTypes.DependencyNode<NodeType>[];\n edges: DependencyGraphTypes.DependencyEdge[];\n} {\n const catalogClient = useApi(catalogApiRef);\n const entityRef = stringifyEntityRef(root);\n\n const { loading, error, value } = useAsync(async () => {\n const response = await catalogClient.getEntityAncestors({ entityRef });\n const nodes = new Array<DependencyGraphTypes.DependencyNode<NodeType>>();\n const edges = new Array<DependencyGraphTypes.DependencyEdge>();\n for (const current of response.items) {\n const currentRef = stringifyEntityRef(current.entity);\n const isRootNode = currentRef === response.rootEntityRef;\n nodes.push({ id: currentRef, root: isRootNode, ...current.entity });\n for (const parentRef of current.parentEntityRefs) {\n edges.push({ from: currentRef, to: parentRef });\n }\n }\n return { nodes, edges };\n }, [entityRef]);\n\n return {\n loading,\n error,\n nodes: value?.nodes || [],\n edges: value?.edges || [],\n };\n}\n\nfunction CustomNode({ node }: DependencyGraphTypes.RenderNodeProps<NodeType>) {\n const classes = useStyles();\n const navigate = useNavigate();\n const entityRoute = useRouteRef(entityRouteRef);\n const [width, setWidth] = useState(0);\n const [height, setHeight] = useState(0);\n const app = useApp();\n const idRef = useRef<SVGTextElement | null>(null);\n\n useLayoutEffect(() => {\n // set the width to the length of the ID\n if (idRef.current) {\n let { height: renderedHeight, width: renderedWidth } =\n idRef.current.getBBox();\n renderedHeight = Math.round(renderedHeight);\n renderedWidth = Math.round(renderedWidth);\n if (renderedHeight !== height || renderedWidth !== width) {\n setWidth(renderedWidth);\n setHeight(renderedHeight);\n }\n }\n }, [width, height]);\n\n const hasKindIcon = app.getSystemIcon(\n `kind:${node.kind.toLocaleLowerCase('en-US')}`,\n );\n const padding = 10;\n const iconSize = height;\n const paddedIconWidth = hasKindIcon ? iconSize + padding : 0;\n const paddedWidth = paddedIconWidth + width + padding * 2;\n const paddedHeight = height + padding * 2;\n\n const { primaryTitle: displayTitle } = useEntityPresentation(node);\n\n const onClick = () => {\n navigate(\n entityRoute({\n kind: node.kind,\n namespace: node.metadata.namespace || DEFAULT_NAMESPACE,\n name: node.metadata.name,\n }),\n );\n };\n\n return (\n <g onClick={onClick} className={classes.clickable}>\n <rect\n className={classNames(\n classes.node,\n node.root ? 'secondary' : 'primary',\n )}\n width={paddedWidth}\n height={paddedHeight}\n rx={10}\n />\n {hasKindIcon && (\n <EntityKindIcon\n kind={node.kind}\n y={padding}\n x={padding}\n width={iconSize}\n height={iconSize}\n className={classNames(\n classes.text,\n node.root ? 'secondary' : 'primary',\n )}\n />\n )}\n <text\n ref={idRef}\n className={classNames(\n classes.text,\n node.root ? 'secondary' : 'primary',\n )}\n y={paddedHeight / 2}\n x={paddedIconWidth + (width + padding * 2) / 2}\n textAnchor=\"middle\"\n alignmentBaseline=\"middle\"\n >\n {displayTitle}\n </text>\n </g>\n );\n}\n\nexport function AncestryPage(props: { entity: Entity }) {\n const { loading, error, nodes, edges } = useAncestry(props.entity);\n const { t } = useTranslationRef(catalogReactTranslationRef);\n if (loading) {\n return <Progress />;\n } else if (error) {\n return <ResponseErrorPanel error={error} />;\n }\n\n return (\n <>\n <Box mb=\"2\">\n <Text as=\"p\">\n {t('inspectEntityDialog.ancestryPage.description', {\n processorsLink: (\n <Link to=\"https://backstage.io/docs/features/software-catalog/life-of-an-entity\">\n {t('inspectEntityDialog.ancestryPage.processorsLink')}\n </Link>\n ),\n })}\n </Text>\n </Box>\n <Box mt=\"8\">\n <DependencyGraph\n nodes={nodes}\n edges={edges}\n renderNode={CustomNode}\n direction={DependencyGraphTypes.Direction.BOTTOM_TOP}\n zoom=\"enable-on-click\"\n />\n </Box>\n </>\n );\n}\n","/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { makeStyles } from '@material-ui/core/styles';\nimport classNames from 'classnames';\nimport { ReactNode } from 'react';\n\nconst useStyles = makeStyles({\n list: {\n listStyle: 'none',\n margin: 0,\n padding: 0,\n },\n indented: {\n paddingLeft: 'var(--bui-space-4)',\n },\n listItem: {\n display: 'flex',\n alignItems: 'flex-start',\n marginTop: 'var(--bui-space-1)',\n paddingLeft: 'var(--bui-space-4)',\n fontFamily: 'monospace',\n fontSize: 'var(--bui-font-size-3)',\n '&:first-child': {\n marginTop: 0,\n },\n },\n});\n\nexport function ListSection(props: {\n children: ReactNode;\n indent?: boolean;\n className?: string;\n 'aria-label'?: string;\n}) {\n const classes = useStyles();\n return (\n <ul\n className={classNames(\n classes.list,\n props.indent && classes.indented,\n props.className,\n )}\n aria-label={props['aria-label']}\n >\n {props.children}\n </ul>\n );\n}\n\n/**\n * A dense monospace list item.\n */\nexport function ListItemRow(props: { children: ReactNode }) {\n const classes = useStyles();\n return <li className={classes.listItem}>{props.children}</li>;\n}\n","/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// Native HTML elements like <p> and <header> are used intentionally for\n// semantic markup. The react/forbid-elements rule predates the BUI migration.\n/* eslint-disable react/forbid-elements */\n\nimport {\n Entity,\n ANNOTATION_LOCATION,\n ANNOTATION_ORIGIN_LOCATION,\n stringifyEntityRef,\n} from '@backstage/catalog-model';\nimport { Progress, ResponseErrorPanel } from '@backstage/core-components';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { Text, Alert } from '@backstage/ui';\nimport useAsync from 'react-use/esm/useAsync';\nimport { catalogApiRef } from '../../../api';\nimport { EntityRefLink } from '../../EntityRefLink';\nimport { makeStyles } from '@material-ui/core/styles';\nimport { ListSection, ListItemRow } from './common';\n\nimport { catalogReactTranslationRef } from '../../../translation';\n\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\n\nconst useStyles = makeStyles({\n header: {\n paddingLeft: 'var(--bui-space-4)',\n marginTop: 'var(--bui-space-4)',\n marginBottom: 'var(--bui-space-4)',\n },\n headerLabel: {\n margin: 0,\n fontFamily: 'monospace',\n fontSize: 'var(--bui-font-size-3)',\n fontWeight: 'var(--bui-font-weight-regular)' as any,\n },\n entityList: {\n marginTop: 'var(--bui-space-4)',\n },\n headerValue: {\n margin: 0,\n marginTop: 'var(--bui-space-1)',\n fontFamily: 'monospace',\n fontSize: 'var(--bui-font-size-3)',\n overflow: 'hidden',\n whiteSpace: 'nowrap',\n textOverflow: 'ellipsis',\n },\n});\n\nfunction useColocated(entity: Entity): {\n loading: boolean;\n error?: Error;\n location?: string;\n originLocation?: string;\n colocatedEntities?: Entity[];\n} {\n const catalogApi = useApi(catalogApiRef);\n const currentEntityRef = stringifyEntityRef(entity);\n const location = entity.metadata.annotations?.[ANNOTATION_LOCATION];\n const origin = entity.metadata.annotations?.[ANNOTATION_ORIGIN_LOCATION];\n\n const { loading, error, value } = useAsync(async () => {\n if (!location && !origin) {\n return [];\n }\n const response = await catalogApi.getEntities({\n filter: [\n ...(location\n ? [{ [`metadata.annotations.${ANNOTATION_LOCATION}`]: location }]\n : []),\n ...(origin\n ? [\n {\n [`metadata.annotations.${ANNOTATION_ORIGIN_LOCATION}`]: origin,\n },\n ]\n : []),\n ],\n });\n return response.items;\n }, [location, origin]);\n\n return {\n loading,\n error,\n location,\n originLocation: origin,\n colocatedEntities: value?.filter(\n colocated => stringifyEntityRef(colocated) !== currentEntityRef,\n ),\n };\n}\n\nfunction EntityList(props: { entities: Entity[]; header?: [string, string] }) {\n const classes = useStyles();\n const { t } = useTranslationRef(catalogReactTranslationRef);\n return (\n <>\n {props.header && (\n <header className={classes.header}>\n <h4 className={classes.headerLabel}>{props.header[0]}</h4>\n <p className={classes.headerValue}>{props.header[1]}</p>\n </header>\n )}\n <ListSection\n aria-label={t('inspectEntityDialog.colocatedPage.entityListAriaLabel')}\n className={classes.entityList}\n >\n {props.entities.map(entity => (\n <ListItemRow key={stringifyEntityRef(entity)}>\n <EntityRefLink entityRef={entity} />\n </ListItemRow>\n ))}\n </ListSection>\n </>\n );\n}\n\nfunction Contents(props: { entity: Entity }) {\n const { entity } = props;\n const { t } = useTranslationRef(catalogReactTranslationRef);\n\n const { loading, error, location, originLocation, colocatedEntities } =\n useColocated(entity);\n if (loading) {\n return <Progress />;\n } else if (error) {\n return <ResponseErrorPanel error={error} />;\n }\n\n if (!location && !originLocation) {\n return (\n <Alert\n status=\"warning\"\n description={t('inspectEntityDialog.colocatedPage.alertNoLocation')}\n mt=\"4\"\n />\n );\n } else if (!colocatedEntities?.length) {\n return (\n <Alert\n status=\"info\"\n description={t('inspectEntityDialog.colocatedPage.alertNoEntity')}\n mt=\"4\"\n />\n );\n }\n\n if (location === originLocation) {\n return <EntityList entities={colocatedEntities} />;\n }\n\n const atLocation = colocatedEntities.filter(\n e => e.metadata.annotations?.[ANNOTATION_LOCATION] === location,\n );\n const atOrigin = colocatedEntities.filter(\n e =>\n e.metadata.annotations?.[ANNOTATION_ORIGIN_LOCATION] === originLocation,\n );\n\n return (\n <>\n {atLocation.length > 0 && (\n <EntityList\n entities={atLocation}\n header={[\n t('inspectEntityDialog.colocatedPage.locationHeader'),\n location!,\n ]}\n />\n )}\n {atOrigin.length > 0 && (\n <EntityList\n entities={atOrigin}\n header={[\n t('inspectEntityDialog.colocatedPage.originHeader'),\n originLocation!,\n ]}\n />\n )}\n </>\n );\n}\n\nexport function ColocatedPage(props: { entity: Entity }) {\n const { t } = useTranslationRef(catalogReactTranslationRef);\n return (\n <>\n <Text as=\"p\">{t('inspectEntityDialog.colocatedPage.description')}</Text>\n <Contents entity={props.entity} />\n </>\n );\n}\n","/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { JsonObject } from '@backstage/types';\n\nexport function sortKeys(data: JsonObject): JsonObject {\n // we could do something custom, but lexicographical sorting is actually a\n // good choice at least for the default set of keys\n return Object.fromEntries(\n [...Object.entries(data)].sort((a, b) => (a[0] < b[0] ? -1 : 1)),\n );\n}\n","/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Entity } from '@backstage/catalog-model';\nimport { CodeSnippet } from '@backstage/core-components';\nimport { Text } from '@backstage/ui';\nimport { sortKeys } from './util';\nimport { catalogReactTranslationRef } from '../../../translation';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\n\nexport function JsonPage(props: { entity: Entity }) {\n const { t } = useTranslationRef(catalogReactTranslationRef);\n return (\n <>\n <Text as=\"p\">{t('inspectEntityDialog.jsonPage.description')}</Text>\n <div data-testid=\"code-snippet\">\n <CodeSnippet\n text={JSON.stringify(sortKeys(props.entity), undefined, 2)}\n language=\"json\"\n showCopyCodeButton\n />\n </div>\n </>\n );\n}\n","// extracted by css-extract-rspack-plugin\nexport default {\"bui-TagList\":\"RH6vZOMUe3ozH13w\",\"bui-Tag\":\"RbVv4ECvOgnU1Dwb\",\"bui-TagRemoveButton\":\"l9zJlYdsd_AvoCWG\",\"bui-TagIcon\":\"APxTgEybjsYQrIC6\"};","/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { defineComponent } from '../../hooks/useDefinition';\nimport type { TagGroupOwnProps, TagOwnProps } from './types';\nimport styles from './TagGroup.module.css';\n\n/**\n * Component definition for TagGroup\n * @public\n */\nexport const TagGroupDefinition = defineComponent<TagGroupOwnProps>()({\n styles,\n classNames: {\n root: 'bui-TagGroup',\n list: 'bui-TagList',\n },\n propDefs: {\n items: {},\n children: {},\n renderEmptyState: {},\n className: {},\n },\n});\n\n/** @internal */\nexport const TagDefinition = defineComponent<TagOwnProps>()({\n styles,\n classNames: {\n root: 'bui-Tag',\n icon: 'bui-TagIcon',\n removeButton: 'bui-TagRemoveButton',\n },\n analytics: true,\n propDefs: {\n noTrack: {},\n icon: {},\n size: { dataAttribute: true, default: 'small' },\n href: {},\n children: {},\n className: {},\n },\n});\n","/*\n * Copyright 2025 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { TagProps, TagGroupProps } from './types';\nimport {\n TagGroup as ReactAriaTagGroup,\n TagList as ReactAriaTagList,\n Tag as ReactAriaTag,\n Button as ReactAriaButton,\n} from 'react-aria-components';\nimport { forwardRef, type ReactNode } from 'react';\nimport { RiCloseCircleLine } from '@remixicon/react';\nimport { useDefinition } from '../../hooks/useDefinition';\nimport { TagGroupDefinition, TagDefinition } from './definition';\nimport { getNodeText } from '../../analytics/getNodeText';\n\n/**\n * A component that renders a list of tags.\n *\n * @public\n */\nexport const TagGroup = <T extends object>(props: TagGroupProps<T>) => {\n const { ownProps, restProps } = useDefinition(TagGroupDefinition, props);\n const { classes, items, children, renderEmptyState } = ownProps;\n\n return (\n <ReactAriaTagGroup className={classes.root} {...restProps}>\n <ReactAriaTagList\n className={classes.list}\n items={items}\n renderEmptyState={renderEmptyState}\n >\n {children}\n </ReactAriaTagList>\n </ReactAriaTagGroup>\n );\n};\n\n/**\n * A component that renders a tag.\n *\n * @public\n */\nexport const Tag = forwardRef<HTMLDivElement, TagProps>((props, ref) => {\n const { ownProps, restProps, dataAttributes, analytics } = useDefinition(\n TagDefinition,\n props,\n );\n const { classes, children, icon, href } = ownProps;\n const textValue = typeof children === 'string' ? children : undefined;\n\n const handlePress = () => {\n if (href) {\n const text =\n (props as React.AriaAttributes)['aria-label'] ??\n textValue ??\n getNodeText(children) ??\n String(href);\n analytics.captureEvent('click', text, {\n attributes: { to: String(href) },\n });\n }\n };\n\n return (\n <ReactAriaTag\n ref={ref}\n textValue={textValue}\n className={classes.root}\n href={href}\n {...dataAttributes}\n {...restProps}\n onPress={e => {\n restProps.onPress?.(e);\n handlePress();\n }}\n >\n {({ allowsRemoving }) => (\n <>\n {icon && <span className={classes.icon}>{icon}</span>}\n {children as ReactNode}\n {allowsRemoving && (\n <ReactAriaButton className={classes.removeButton} slot=\"remove\">\n <RiCloseCircleLine size={16} />\n </ReactAriaButton>\n )}\n </>\n )}\n </ReactAriaTag>\n );\n});\n","/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { AlphaEntity } from '@backstage/catalog-model/alpha';\nimport { Link } from '@backstage/core-components';\nimport {\n Text,\n Box,\n Flex,\n Card,\n CardHeader,\n CardBody,\n TagGroup,\n Tag,\n ButtonIcon,\n ButtonLink,\n VisuallyHidden,\n} from '@backstage/ui';\nimport { makeStyles } from '@material-ui/core/styles';\nimport classNames from 'classnames';\nimport { RiFileCopyLine, RiCheckLine, RiQuestionLine } from '@remixicon/react';\nimport groupBy from 'lodash/groupBy';\nimport sortBy from 'lodash/sortBy';\nimport { ReactNode, useEffect, useRef, useState } from 'react';\nimport { EntityRefLink } from '../../EntityRefLink';\nimport { ListSection, ListItemRow } from './common';\nimport { stringifyEntityRef } from '@backstage/catalog-model';\nimport { catalogReactTranslationRef } from '../../../translation';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\n\nconst useStyles = makeStyles({\n headingWithIcon: {\n display: 'flex',\n alignItems: 'center',\n },\n definitionList: {\n margin: 0,\n padding: 0,\n },\n definitionItem: {\n display: 'flex',\n alignItems: 'flex-start',\n marginTop: 'var(--bui-space-4)',\n paddingLeft: 'var(--bui-space-4)',\n fontFamily: 'monospace',\n fontSize: 'var(--bui-font-size-3)',\n '&:first-child': {\n marginTop: 0,\n },\n },\n definitionContent: {\n flex: 1,\n minWidth: 0,\n },\n definitionKey: {\n fontWeight: 'bold',\n },\n definitionValue: {\n margin: 0,\n marginTop: 'var(--bui-space-1)',\n overflow: 'hidden',\n whiteSpace: 'nowrap',\n textOverflow: 'ellipsis',\n },\n copyAction: {\n marginLeft: 'var(--bui-space-2)',\n flexShrink: 0,\n },\n relationGroup: {\n '& + &': {\n marginTop: 'var(--bui-space-4)',\n },\n },\n monospace: {\n fontFamily: 'monospace',\n },\n sectionHeading: {\n marginTop: 'var(--bui-space-3)',\n },\n metadataList: {\n marginTop: 'var(--bui-space-2)',\n },\n relationList: {\n marginTop: 'var(--bui-space-2)',\n },\n tagGroup: {\n marginTop: 'var(--bui-space-3)',\n paddingLeft: 'var(--bui-space-4)',\n },\n});\n\n// Extracts a link from a value, if possible\nfunction findLink(value: string): string | undefined {\n if (value.match(/^url:https?:\\/\\//)) {\n return value.slice('url:'.length);\n }\n if (value.match(/^https?:\\/\\//)) {\n return value;\n }\n return undefined;\n}\n\nfunction entriesToItems(entries: [string, string][]) {\n return entries.map(([key, value]) => {\n const link = findLink(value);\n return {\n key,\n value: link ? <Link to={link}>{value}</Link> : value,\n };\n });\n}\n\nfunction CopyButton({ text, label }: { text: string; label: string }) {\n const { t } = useTranslationRef(catalogReactTranslationRef);\n const [copied, setCopied] = useState(false);\n const timerRef = useRef<ReturnType<typeof setTimeout>>();\n\n useEffect(() => () => clearTimeout(timerRef.current), []);\n\n const handlePress = async () => {\n try {\n await window.navigator.clipboard.writeText(text);\n setCopied(true);\n timerRef.current = setTimeout(() => setCopied(false), 2000);\n } catch {\n // Clipboard access denied or unavailable\n }\n };\n\n return (\n <>\n <ButtonIcon\n icon={copied ? <RiCheckLine /> : <RiFileCopyLine />}\n aria-label={t('inspectEntityDialog.overviewPage.copyAriaLabel', {\n label,\n })}\n variant=\"tertiary\"\n size=\"small\"\n onPress={handlePress}\n />\n <VisuallyHidden role=\"status\">\n {copied ? t('inspectEntityDialog.overviewPage.copiedStatus') : ''}\n </VisuallyHidden>\n </>\n );\n}\n\nfunction HelpIcon(props: { to: string }) {\n const { t } = useTranslationRef(catalogReactTranslationRef);\n return (\n <ButtonLink\n href={props.to}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n variant=\"tertiary\"\n size=\"small\"\n iconStart={<RiQuestionLine />}\n aria-label={t('inspectEntityDialog.overviewPage.helpLinkAriaLabel')}\n />\n );\n}\n\nfunction Container(props: {\n title: ReactNode;\n helpLink?: string;\n children: ReactNode;\n}) {\n const classes = useStyles();\n return (\n <Card>\n <CardHeader>\n <Text\n variant=\"title-x-small\"\n as=\"h3\"\n className={props.helpLink ? classes.headingWithIcon : undefined}\n >\n {props.title}\n {props.helpLink && <HelpIcon to={props.helpLink} />}\n </Text>\n </CardHeader>\n <CardBody>{props.children}</CardBody>\n </Card>\n );\n}\n\nfunction ListSubheader(props: { children: ReactNode; className?: string }) {\n const classes = useStyles();\n return (\n <Text\n variant=\"body-large\"\n as=\"h4\"\n className={classNames(classes.headingWithIcon, props.className)}\n >\n {props.children}\n </Text>\n );\n}\n\nfunction KeyValueList(props: {\n items: { key: string; value: ReactNode; copyable?: boolean }[];\n className?: string;\n 'aria-label'?: string;\n}) {\n const classes = useStyles();\n return (\n <dl\n className={classNames(classes.definitionList, props.className)}\n aria-label={props['aria-label']}\n >\n {props.items.map(item => (\n <div key={item.key} className={classes.definitionItem}>\n <div className={classes.definitionContent}>\n <dt className={classes.definitionKey}>{item.key}</dt>\n <dd className={classes.definitionValue}>{item.value}</dd>\n </div>\n {item.copyable && typeof item.value === 'string' && (\n <div className={classes.copyAction}>\n <CopyButton text={item.value} label={item.key} />\n </div>\n )}\n </div>\n ))}\n </dl>\n );\n}\n\nexport function OverviewPage(props: { entity: AlphaEntity }) {\n const classes = useStyles();\n const {\n apiVersion,\n kind,\n metadata,\n spec,\n relations = [],\n status = {},\n } = props.entity;\n\n const groupedRelations = groupBy(\n sortBy(relations, r => r.targetRef),\n 'type',\n );\n const { t } = useTranslationRef(catalogReactTranslationRef);\n\n const entityRef = stringifyEntityRef(props.entity);\n return (\n <Flex direction=\"column\" gap=\"4\">\n <Container title={t('inspectEntityDialog.overviewPage.identity.title')}>\n <KeyValueList\n aria-label={t('inspectEntityDialog.overviewPage.identity.title')}\n items={[\n { key: 'apiVersion', value: apiVersion },\n { key: 'kind', value: kind },\n ...(spec?.type\n ? [{ key: 'spec.type', value: spec.type.toString() }]\n : []),\n ...(metadata.uid\n ? [{ key: 'uid', value: metadata.uid, copyable: true }]\n : []),\n ...(metadata.etag\n ? [{ key: 'etag', value: metadata.etag, copyable: true }]\n : []),\n { key: 'entityRef', value: entityRef, copyable: true },\n ]}\n />\n </Container>\n\n <Container title={t('inspectEntityDialog.overviewPage.metadata.title')}>\n {!!Object.keys(metadata.annotations || {}).length && (\n <>\n <ListSubheader>\n {t('inspectEntityDialog.overviewPage.annotations')}\n <HelpIcon to=\"https://backstage.io/docs/features/software-catalog/well-known-annotations\" />\n </ListSubheader>\n <KeyValueList\n items={entriesToItems(Object.entries(metadata.annotations!))}\n aria-label={t('inspectEntityDialog.overviewPage.annotations')}\n className={classes.metadataList}\n />\n </>\n )}\n {!!Object.keys(metadata.labels || {}).length && (\n <>\n <ListSubheader className={classes.sectionHeading}>\n {t('inspectEntityDialog.overviewPage.labels')}\n </ListSubheader>\n <KeyValueList\n items={entriesToItems(Object.entries(metadata.labels!))}\n aria-label={t('inspectEntityDialog.overviewPage.labels')}\n className={classes.metadataList}\n />\n </>\n )}\n {!!metadata.tags?.length && (\n <>\n <ListSubheader className={classes.sectionHeading}>\n {t('inspectEntityDialog.overviewPage.tags')}\n </ListSubheader>\n <TagGroup\n aria-label={t('inspectEntityDialog.overviewPage.tags')}\n className={classes.tagGroup}\n >\n {metadata.tags.map(tag => (\n <Tag key={tag} id={tag}>\n {tag}\n </Tag>\n ))}\n </TagGroup>\n </>\n )}\n </Container>\n\n {!!relations.length && (\n <Container\n title={t('inspectEntityDialog.overviewPage.relation.title')}\n helpLink=\"https://backstage.io/docs/features/software-catalog/well-known-relations\"\n >\n {Object.entries(groupedRelations).map(([type, groupRelations]) => (\n <div key={type} className={classes.relationGroup}>\n <ListSubheader className={classes.monospace}>\n {type}\n </ListSubheader>\n <ListSection aria-label={type} className={classes.relationList}>\n {groupRelations.map(group => (\n <ListItemRow key={group.targetRef}>\n <EntityRefLink entityRef={group.targetRef} />\n </ListItemRow>\n ))}\n </ListSection>\n </div>\n ))}\n </Container>\n )}\n\n {!!status.items?.length && (\n <Container\n title={t('inspectEntityDialog.overviewPage.status.title')}\n helpLink=\"https://backstage.io/docs/features/software-catalog/well-known-statuses\"\n >\n {status.items.map((item, index) => (\n <div key={index}>\n <Text>\n {item.level}: {item.type}\n </Text>\n <Box ml=\"4\">{item.message}</Box>\n </div>\n ))}\n </Container>\n )}\n </Flex>\n );\n}\n","/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Entity } from '@backstage/catalog-model';\nimport { CodeSnippet } from '@backstage/core-components';\nimport { Text } from '@backstage/ui';\nimport YAML from 'yaml';\nimport { sortKeys } from './util';\nimport { catalogReactTranslationRef } from '../../../translation';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\n\nexport function YamlPage(props: { entity: Entity }) {\n const { t } = useTranslationRef(catalogReactTranslationRef);\n return (\n <>\n <Text as=\"p\">{t('inspectEntityDialog.yamlPage.description')}</Text>\n <div data-testid=\"code-snippet\">\n <CodeSnippet\n text={YAML.stringify(sortKeys(props.entity))}\n language=\"yaml\"\n showCopyCodeButton\n />\n </div>\n </>\n );\n}\n","/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Entity } from '@backstage/catalog-model';\nimport {\n Dialog,\n DialogHeader,\n DialogBody,\n Tabs,\n TabList,\n Tab,\n TabPanel,\n} from '@backstage/ui';\nimport { useMemo } from 'react';\nimport { AncestryPage } from './components/AncestryPage';\nimport { ColocatedPage } from './components/ColocatedPage';\nimport { JsonPage } from './components/JsonPage';\nimport { OverviewPage } from './components/OverviewPage';\nimport { YamlPage } from './components/YamlPage';\nimport { catalogReactTranslationRef } from '../../translation';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\n\ntype TabKey = 'overview' | 'ancestry' | 'colocated' | 'json' | 'yaml';\n\nconst TAB_KEYS: TabKey[] = [\n 'overview',\n 'ancestry',\n 'colocated',\n 'json',\n 'yaml',\n];\n\nfunction DialogContents(props: {\n entity: Entity;\n initialTab?: TabKey;\n onSelect?: (tab: string) => void;\n}) {\n const { entity, initialTab, onSelect } = props;\n const { t } = useTranslationRef(catalogReactTranslationRef);\n\n const tabNames = useMemo(\n () => ({\n overview: t('inspectEntityDialog.tabNames.overview'),\n ancestry: t('inspectEntityDialog.tabNames.ancestry'),\n colocated: t('inspectEntityDialog.tabNames.colocated'),\n json: t('inspectEntityDialog.tabNames.json'),\n yaml: t('inspectEntityDialog.tabNames.yaml'),\n }),\n [t],\n );\n\n const tabContent: Record<TabKey, JSX.Element> = {\n overview: <OverviewPage entity={entity} />,\n ancestry: <AncestryPage entity={entity} />,\n colocated: <ColocatedPage entity={entity} />,\n json: <JsonPage entity={entity} />,\n yaml: <YamlPage entity={entity} />,\n };\n\n return (\n <>\n <DialogHeader>{t('inspectEntityDialog.title')}</DialogHeader>\n <DialogBody>\n <Tabs\n defaultSelectedKey={initialTab || 'overview'}\n onSelectionChange={key => onSelect?.(key as string)}\n >\n <TabList aria-label={t('inspectEntityDialog.tabsAriaLabel')}>\n {TAB_KEYS.map(tab => (\n <Tab key={tab} id={tab}>\n {tabNames[tab]}\n </Tab>\n ))}\n </TabList>\n {TAB_KEYS.map(tab => (\n <TabPanel key={tab} id={tab}>\n {tabContent[tab]}\n </TabPanel>\n ))}\n </Tabs>\n </DialogBody>\n </>\n );\n}\n\n/**\n * A dialog that lets users inspect the low level details of their entities.\n *\n * @public\n */\nexport function InspectEntityDialog(props: {\n open: boolean;\n entity: Entity;\n initialTab?: 'overview' | 'ancestry' | 'colocated' | 'json' | 'yaml';\n onClose: () => void;\n onSelect?: (tab: string) => void;\n}) {\n const { open, entity, initialTab, onClose, onSelect } = props;\n\n if (!entity) {\n return null;\n }\n\n return (\n <Dialog\n isOpen={open}\n onOpenChange={isOpen => !isOpen && onClose()}\n width=\"940px\"\n height=\"100vh\"\n >\n {open && (\n <DialogContents\n entity={entity}\n initialTab={initialTab}\n onSelect={onSelect}\n />\n )}\n </Dialog>\n );\n}\n","/*\n * Copyright 2025 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { HeaderLabel } from '@backstage/core-components';\nimport { Entity, RELATION_OWNED_BY } from '@backstage/catalog-model';\nimport {\n EntityRefLinks,\n getEntityRelations,\n} from '@backstage/plugin-catalog-react';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { catalogTranslationRef } from '../../translation';\n\ntype EntityLabelsProps = {\n entity: Entity;\n};\n\nexport function EntityLabels(props: EntityLabelsProps) {\n const { entity } = props;\n const ownedByRelations = getEntityRelations(entity, RELATION_OWNED_BY);\n const { t } = useTranslationRef(catalogTranslationRef);\n return (\n <>\n {ownedByRelations.length > 0 && (\n <HeaderLabel\n label={t('entityLabels.ownerLabel')}\n contentTypograpyRootComponent=\"p\"\n value={\n <EntityRefLinks\n entityRefs={ownedByRelations}\n defaultKind=\"Group\"\n color=\"inherit\"\n />\n }\n />\n )}\n {entity.spec?.lifecycle && (\n <HeaderLabel\n label={t('entityLabels.lifecycleLabel')}\n value={entity.spec.lifecycle?.toString()}\n />\n )}\n </>\n );\n}\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport ListItemIcon from '@material-ui/core/ListItemIcon';\nimport ListItemText from '@material-ui/core/ListItemText';\nimport MenuItem from '@material-ui/core/MenuItem';\nimport CancelIcon from '@material-ui/icons/Cancel';\nimport { catalogTranslationRef } from '../../alpha/translation';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { forwardRef } from 'react';\n\ntype VisibleType = 'visible' | 'hidden' | 'disable';\n\nexport type UnregisterEntityOptions = {\n disableUnregister: boolean | VisibleType;\n};\n\ninterface UnregisterEntityProps {\n unregisterEntityOptions?: UnregisterEntityOptions;\n isUnregisterAllowed: boolean;\n onUnregisterEntity: () => void;\n onClose: () => void;\n}\n\n// TODO: When Backstage supports only React 19+, remove the forwardRef\nexport const UnregisterEntity = forwardRef<\n HTMLLIElement,\n UnregisterEntityProps\n>((props, ref) => {\n const {\n unregisterEntityOptions,\n isUnregisterAllowed,\n onUnregisterEntity,\n onClose,\n } = props;\n const { t } = useTranslationRef(catalogTranslationRef);\n\n const isBoolean =\n typeof unregisterEntityOptions?.disableUnregister === 'boolean';\n\n const isDisabled =\n (!isUnregisterAllowed ||\n (isBoolean\n ? !!unregisterEntityOptions?.disableUnregister\n : unregisterEntityOptions?.disableUnregister === 'disable')) ??\n false;\n\n if (unregisterEntityOptions?.disableUnregister !== 'hidden') {\n return (\n <MenuItem\n ref={ref}\n onClick={() => {\n onClose();\n onUnregisterEntity();\n }}\n disabled={isDisabled}\n {...props}\n >\n <ListItemIcon>\n <CancelIcon fontSize=\"small\" />\n </ListItemIcon>\n <ListItemText primary={t('entityContextMenu.unregisterMenuTitle')} />\n </MenuItem>\n );\n }\n\n return null;\n});\n","/*\n * Copyright 2025 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport {\n createVersionedContext,\n createVersionedValueMap,\n} from '@backstage/version-bridge';\nimport { ReactNode } from 'react';\n\n/** @internal */\nexport type EntityContextMenuContextValue = {\n onMenuClose: () => void;\n};\n\nconst EntityContextMenuContext = createVersionedContext<{\n 1: EntityContextMenuContextValue;\n}>('entity-context-menu-context');\n\n/** @internal */\nexport interface EntityContextMenuProviderProps {\n children: ReactNode;\n onMenuClose: () => void;\n}\n\n/** @internal */\nexport const EntityContextMenuProvider = (\n props: EntityContextMenuProviderProps,\n) => {\n const { children, onMenuClose } = props;\n const value = { onMenuClose };\n\n return (\n <EntityContextMenuContext.Provider\n value={createVersionedValueMap({ 1: value })}\n >\n {children}\n </EntityContextMenuContext.Provider>\n );\n};\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport Divider from '@material-ui/core/Divider';\nimport FileCopyTwoToneIcon from '@material-ui/icons/FileCopyTwoTone';\nimport IconButton from '@material-ui/core/IconButton';\nimport ListItemIcon from '@material-ui/core/ListItemIcon';\nimport ListItemText from '@material-ui/core/ListItemText';\nimport MenuItem from '@material-ui/core/MenuItem';\nimport MenuList from '@material-ui/core/MenuList';\nimport Popover from '@material-ui/core/Popover';\nimport Tooltip from '@material-ui/core/Tooltip';\nimport { Theme, makeStyles } from '@material-ui/core/styles';\nimport BugReportIcon from '@material-ui/icons/BugReport';\nimport MoreVert from '@material-ui/icons/MoreVert';\nimport { Fragment, SyntheticEvent, useEffect, useState } from 'react';\nimport { IconComponent } from '@backstage/core-plugin-api';\nimport { useEntityPermission } from '@backstage/plugin-catalog-react/alpha';\nimport { catalogEntityDeletePermission } from '@backstage/plugin-catalog-common/alpha';\nimport { UnregisterEntity, UnregisterEntityOptions } from './UnregisterEntity';\nimport { useApi, alertApiRef } from '@backstage/core-plugin-api';\nimport useCopyToClipboard from 'react-use/esm/useCopyToClipboard';\nimport { catalogTranslationRef } from '../../alpha/translation';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { EntityContextMenuProvider } from '../../context';\n\n/** @public */\nexport type EntityContextMenuClassKey = 'button';\n\nconst useStyles = makeStyles(\n (theme: Theme) => {\n return {\n button: {\n color: theme.page.fontColor,\n },\n };\n },\n { name: 'PluginCatalogEntityContextMenu' },\n);\n\n// NOTE(freben): Intentionally not exported at this point, since it's part of\n// the unstable extra context menu items concept below\ninterface ExtraContextMenuItem {\n title: string;\n Icon: IconComponent;\n onClick: () => void;\n}\n\ninterface EntityContextMenuProps {\n UNSTABLE_extraContextMenuItems?: ExtraContextMenuItem[];\n UNSTABLE_contextMenuOptions?: UnregisterEntityOptions;\n contextMenuItems?: React.JSX.Element[];\n onUnregisterEntity: () => void;\n onInspectEntity: () => void;\n}\n\nexport function EntityContextMenu(props: EntityContextMenuProps) {\n const {\n UNSTABLE_extraContextMenuItems,\n UNSTABLE_contextMenuOptions,\n contextMenuItems,\n onUnregisterEntity,\n onInspectEntity,\n } = props;\n const { t } = useTranslationRef(catalogTranslationRef);\n const [anchorEl, setAnchorEl] = useState<HTMLButtonElement>();\n const classes = useStyles();\n const unregisterPermission = useEntityPermission(\n catalogEntityDeletePermission,\n );\n const isAllowed = unregisterPermission.allowed;\n\n const onOpen = (event: SyntheticEvent<HTMLButtonElement>) => {\n setAnchorEl(event.currentTarget);\n };\n\n const onClose = () => {\n setAnchorEl(undefined);\n };\n\n const alertApi = useApi(alertApiRef);\n const [copyState, copyToClipboard] = useCopyToClipboard();\n useEffect(() => {\n if (!copyState.error && copyState.value) {\n alertApi.post({\n message: t('entityContextMenu.copiedMessage'),\n severity: 'info',\n display: 'transient',\n });\n }\n }, [copyState, alertApi, t]);\n\n const extraItems = UNSTABLE_extraContextMenuItems?.length\n ? [\n ...UNSTABLE_extraContextMenuItems.map(item => (\n <MenuItem\n key={item.title}\n onClick={() => {\n onClose();\n item.onClick();\n }}\n >\n <ListItemIcon>\n <item.Icon fontSize=\"small\" />\n </ListItemIcon>\n <ListItemText primary={item.title} />\n </MenuItem>\n )),\n <Divider key=\"the divider is here!\" />,\n ]\n : null;\n\n const defaultMenuItems = [\n <UnregisterEntity\n unregisterEntityOptions={UNSTABLE_contextMenuOptions}\n isUnregisterAllowed={isAllowed}\n onUnregisterEntity={onUnregisterEntity}\n onClose={onClose}\n key=\"unregister-entity\"\n />,\n <MenuItem\n onClick={() => {\n onClose();\n onInspectEntity();\n }}\n key=\"inspect-entity\"\n >\n <ListItemIcon>\n <BugReportIcon fontSize=\"small\" />\n </ListItemIcon>\n <ListItemText primary={t('entityContextMenu.inspectMenuTitle')} />\n </MenuItem>,\n <MenuItem\n onClick={() => {\n onClose();\n copyToClipboard(window.location.toString());\n }}\n key=\"copy-url\"\n >\n <ListItemIcon>\n <FileCopyTwoToneIcon fontSize=\"small\" />\n </ListItemIcon>\n <ListItemText primary={t('entityContextMenu.copyURLMenuTitle')} />\n </MenuItem>,\n ];\n\n return (\n <>\n <Tooltip title={t('entityContextMenu.moreButtonTitle')} arrow>\n <IconButton\n aria-label={t('entityContextMenu.moreButtonAriaLabel')}\n aria-controls=\"long-menu\"\n aria-haspopup=\"true\"\n aria-expanded={!!anchorEl}\n role=\"button\"\n onClick={onOpen}\n data-testid=\"menu-button\"\n className={classes.button}\n id=\"long-menu\"\n >\n <MoreVert />\n </IconButton>\n </Tooltip>\n <Popover\n open={Boolean(anchorEl)}\n onClose={onClose}\n anchorEl={anchorEl}\n anchorOrigin={{ vertical: 'bottom', horizontal: 'right' }}\n transformOrigin={{ vertical: 'top', horizontal: 'right' }}\n aria-labelledby=\"long-menu\"\n PaperProps={{\n style: { minWidth: 200 },\n }}\n >\n <MenuList autoFocusItem={Boolean(anchorEl)}>\n {extraItems}\n {contextMenuItems === undefined ? (\n defaultMenuItems\n ) : (\n <EntityContextMenuProvider onMenuClose={onClose}>\n {contextMenuItems.map((item, index) => (\n <Fragment key={index}>{item}</Fragment>\n ))}\n </EntityContextMenuProvider>\n )}\n </MenuList>\n </Popover>\n </>\n );\n}\n","/*\n * Copyright 2025 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n useState,\n useCallback,\n useEffect,\n ComponentProps,\n ReactNode,\n} from 'react';\nimport { useNavigate, useLocation, useSearchParams } from 'react-router-dom';\nimport useAsync from 'react-use/esm/useAsync';\n\nimport { makeStyles } from '@material-ui/core/styles';\nimport Box from '@material-ui/core/Box';\n\nimport { Header, Breadcrumbs } from '@backstage/core-components';\nimport {\n useApi,\n useRouteRef,\n useRouteRefParams,\n} from '@backstage/core-plugin-api';\nimport { IconComponent } from '@backstage/frontend-plugin-api';\n\nimport {\n Entity,\n EntityRelation,\n DEFAULT_NAMESPACE,\n} from '@backstage/catalog-model';\n\nimport {\n useAsyncEntity,\n entityRouteRef,\n catalogApiRef,\n EntityRefLink,\n InspectEntityDialog,\n UnregisterEntityDialog,\n EntityDisplayName,\n FavoriteEntity,\n} from '@backstage/plugin-catalog-react';\n\nimport { EntityLabels } from '../EntityLabels';\nimport { EntityContextMenu } from '../../../components/EntityContextMenu';\nimport { rootRouteRef, unregisterRedirectRouteRef } from '../../../routes';\n\nfunction headerProps(\n paramKind: string | undefined,\n paramNamespace: string | undefined,\n paramName: string | undefined,\n entity: Entity | undefined,\n): { headerTitle: string; headerType: string } {\n const kind = paramKind ?? entity?.kind ?? '';\n const namespace = paramNamespace ?? entity?.metadata.namespace ?? '';\n const name =\n entity?.metadata.title ?? paramName ?? entity?.metadata.name ?? '';\n\n return {\n headerTitle: `${name}${\n namespace && namespace !== DEFAULT_NAMESPACE ? ` in ${namespace}` : ''\n }`,\n headerType: (() => {\n let t = kind.toLocaleLowerCase('en-US');\n if (entity && entity.spec && 'type' in entity.spec) {\n t += ' — ';\n t += (entity.spec as { type: string }).type.toLocaleLowerCase('en-US');\n }\n return t;\n })(),\n };\n}\n\nfunction findParentRelation(\n entityRelations: EntityRelation[] = [],\n relationTypes: string[] = [],\n) {\n for (const type of relationTypes) {\n const foundRelation = entityRelations.find(\n relation => relation.type === type,\n );\n if (foundRelation) {\n return foundRelation; // Return the first found relation and stop\n }\n }\n return null;\n}\n\nconst useStyles = makeStyles(theme => ({\n breadcrumbs: {\n color: theme.page.fontColor,\n fontSize: theme.typography.caption.fontSize,\n textTransform: 'uppercase',\n marginTop: theme.spacing(1),\n opacity: 0.8,\n '& span ': {\n color: theme.page.fontColor,\n textDecoration: 'underline',\n textUnderlineOffset: '3px',\n },\n },\n}));\n\nfunction EntityHeaderTitle() {\n const { entity } = useAsyncEntity();\n const { kind, namespace, name } = useRouteRefParams(entityRouteRef);\n const { headerTitle: title } = headerProps(kind, namespace, name, entity);\n return (\n <Box display=\"inline-flex\" alignItems=\"center\" height=\"1em\" maxWidth=\"100%\">\n <Box\n component=\"span\"\n textOverflow=\"ellipsis\"\n whiteSpace=\"nowrap\"\n overflow=\"hidden\"\n >\n {entity ? <EntityDisplayName entityRef={entity} hideIcon /> : title}\n </Box>\n {entity && <FavoriteEntity entity={entity} />}\n </Box>\n );\n}\n\nfunction EntityHeaderSubtitle(props: { parentEntityRelations?: string[] }) {\n const { parentEntityRelations } = props;\n const classes = useStyles();\n const { entity } = useAsyncEntity();\n const { name } = useRouteRefParams(entityRouteRef);\n const parentEntity = findParentRelation(\n entity?.relations ?? [],\n parentEntityRelations ?? [],\n );\n\n const catalogApi = useApi(catalogApiRef);\n\n const { value: ancestorEntity } = useAsync(async () => {\n if (parentEntity) {\n return findParentRelation(\n (await catalogApi.getEntityByRef(parentEntity?.targetRef))?.relations,\n parentEntityRelations,\n );\n }\n return null;\n }, [parentEntity, catalogApi]);\n\n return parentEntity ? (\n <Breadcrumbs separator=\">\" className={classes.breadcrumbs}>\n {ancestorEntity && (\n <EntityRefLink entityRef={ancestorEntity.targetRef} disableTooltip />\n )}\n <EntityRefLink entityRef={parentEntity.targetRef} disableTooltip />\n {name}\n </Breadcrumbs>\n ) : null;\n}\n\n/** @alpha */\nexport function EntityHeader(props: {\n // NOTE(freben): Intentionally not exported at this point, since it's part of\n // the unstable extra context menu items concept below\n UNSTABLE_extraContextMenuItems?: {\n title: string;\n Icon: IconComponent;\n onClick: () => void;\n }[];\n // NOTE(blam): Intentionally not exported at this point, since it's part of\n // unstable context menu option, eg: disable the unregister entity menu\n UNSTABLE_contextMenuOptions?: {\n disableUnregister: boolean | 'visible' | 'hidden' | 'disable';\n };\n contextMenuItems?: React.JSX.Element[];\n /**\n * An array of relation types used to determine the parent entities in the hierarchy.\n * These relations are prioritized in the order provided, allowing for flexible\n * navigation through entity relationships.\n *\n * For example, use relation types like `[\"partOf\", \"memberOf\", \"ownedBy\"]` to define how the entity is related to\n * its parents in the Entity Catalog.\n *\n * It adds breadcrumbs in the Entity page to enhance user navigation and context awareness.\n */\n parentEntityRelations?: string[];\n title?: ReactNode;\n subtitle?: ReactNode;\n}) {\n const {\n UNSTABLE_extraContextMenuItems,\n UNSTABLE_contextMenuOptions,\n contextMenuItems,\n parentEntityRelations,\n title,\n subtitle,\n } = props;\n const { entity } = useAsyncEntity();\n const { kind, namespace, name } = useRouteRefParams(entityRouteRef);\n const { headerTitle: entityFallbackText, headerType: type } = headerProps(\n kind,\n namespace,\n name,\n entity,\n );\n\n const location = useLocation();\n const navigate = useNavigate();\n const catalogRoute = useRouteRef(rootRouteRef);\n const unregisterRedirectRoute = useRouteRef(unregisterRedirectRouteRef);\n\n const [confirmationDialogOpen, setConfirmationDialogOpen] = useState(false);\n\n const openUnregisterEntityDialog = useCallback(\n () => setConfirmationDialogOpen(true),\n [setConfirmationDialogOpen],\n );\n\n const closeUnregisterEntityDialog = useCallback(\n () => setConfirmationDialogOpen(false),\n [setConfirmationDialogOpen],\n );\n\n const cleanUpAfterUnregisterConfirmation = useCallback(async () => {\n setConfirmationDialogOpen(false);\n navigate(\n unregisterRedirectRoute ? unregisterRedirectRoute() : catalogRoute(),\n );\n }, [\n navigate,\n catalogRoute,\n unregisterRedirectRoute,\n setConfirmationDialogOpen,\n ]);\n\n // Make sure to close the dialog if the user clicks links in it that navigate\n // to another entity.\n useEffect(() => {\n setConfirmationDialogOpen(false);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [location.pathname]);\n\n const [searchParams, setSearchParams] = useSearchParams();\n const selectedInspectEntityDialogTab = searchParams.get('inspect');\n\n const setInspectEntityDialogTab = useCallback(\n (newTab: string) => setSearchParams(`inspect=${newTab}`),\n [setSearchParams],\n );\n\n const openInspectEntityDialog = useCallback(\n () => setSearchParams('inspect'),\n [setSearchParams],\n );\n\n const closeInspectEntityDialog = useCallback(\n () => setSearchParams(),\n [setSearchParams],\n );\n\n const inspectDialogOpen = typeof selectedInspectEntityDialogTab === 'string';\n\n return (\n <Header\n pageTitleOverride={entityFallbackText}\n type={type}\n title={title ?? <EntityHeaderTitle />}\n subtitle={\n subtitle ?? (\n <EntityHeaderSubtitle parentEntityRelations={parentEntityRelations} />\n )\n }\n >\n {entity && (\n <>\n <EntityLabels entity={entity} />\n <EntityContextMenu\n UNSTABLE_extraContextMenuItems={UNSTABLE_extraContextMenuItems}\n UNSTABLE_contextMenuOptions={UNSTABLE_contextMenuOptions}\n contextMenuItems={contextMenuItems}\n onInspectEntity={openInspectEntityDialog}\n onUnregisterEntity={openUnregisterEntityDialog}\n />\n <InspectEntityDialog\n entity={entity!}\n initialTab={\n (selectedInspectEntityDialogTab as ComponentProps<\n typeof InspectEntityDialog\n >['initialTab']) || undefined\n }\n open={inspectDialogOpen}\n onClose={closeInspectEntityDialog}\n onSelect={setInspectEntityDialogTab}\n />\n <UnregisterEntityDialog\n entity={entity!}\n open={confirmationDialogOpen}\n onClose={closeUnregisterEntityDialog}\n onConfirm={cleanUpAfterUnregisterConfirmation}\n />\n </>\n )}\n </Header>\n );\n}\n","/*\n * Copyright 2025 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport classNames from 'classnames';\nimport { PropsWithChildren } from 'react';\nimport { makeStyles, Theme } from '@material-ui/core/styles';\n\n/** @public */\nexport type EntityTabsPanelClassKey = 'root' | 'stretch' | 'noPadding';\n\nconst useStyles = makeStyles(\n (theme: Theme) => ({\n root: {\n gridArea: 'pageContent',\n minWidth: 0,\n paddingTop: theme.spacing(3),\n paddingBottom: theme.spacing(3),\n paddingLeft: theme.spacing(2),\n paddingRight: theme.spacing(2),\n [theme.breakpoints.up('sm')]: {\n paddingLeft: theme.spacing(3),\n paddingRight: theme.spacing(3),\n },\n },\n stretch: {\n display: 'flex',\n flexDirection: 'column',\n flexGrow: 1,\n },\n noPadding: {\n padding: 0,\n },\n }),\n { name: 'EntityTabsPanel' },\n);\n\ntype EntityTabsPanelProps = PropsWithChildren<{\n stretch?: boolean;\n noPadding?: boolean;\n className?: string;\n}>;\n\nexport function EntityTabsPanel(props: EntityTabsPanelProps) {\n const { className, stretch, noPadding, children, ...restProps } = props;\n\n const classes = useStyles();\n return (\n <article\n {...restProps}\n className={classNames(classes.root, className, {\n [classes.stretch]: stretch,\n [classes.noPadding]: noPadding,\n })}\n >\n {children}\n </article>\n );\n}\n","/*\n * Copyright 2025 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport {\n ReactNode,\n forwardRef,\n useState,\n MouseEvent,\n MouseEventHandler,\n ReactElement,\n} from 'react';\nimport { Link } from 'react-router-dom';\nimport classnames from 'classnames';\n\nimport Typography from '@material-ui/core/Typography';\nimport Popover from '@material-ui/core/Popover';\nimport { TabProps, TabClassKey } from '@material-ui/core/Tab';\nimport { capitalize } from '@material-ui/core/utils';\nimport { createStyles, Theme, withStyles } from '@material-ui/core/styles';\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\nimport Button from '@material-ui/core/Button';\nimport ListItem from '@material-ui/core/ListItem';\nimport ListItemIcon from '@material-ui/core/ListItemIcon';\nimport ListItemText from '@material-ui/core/ListItemText';\nimport List from '@material-ui/core/List';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { IconsApi, iconsApiRef } from '@backstage/frontend-plugin-api';\n\nconst styles = (theme: Theme) =>\n createStyles({\n /* Styles applied to the root element. */\n root: {\n ...theme.typography.button,\n maxWidth: 264,\n minWidth: 72,\n position: 'relative',\n boxSizing: 'border-box',\n minHeight: 48,\n flexShrink: 0,\n padding: '6px 12px',\n [theme.breakpoints.up('sm')]: {\n padding: '6px 24px',\n },\n overflow: 'hidden',\n whiteSpace: 'normal',\n textAlign: 'center',\n [theme.breakpoints.up('sm')]: {\n minWidth: 160,\n },\n },\n defaultTab: {\n ...theme.typography.caption,\n padding: theme.spacing(3, 3),\n textTransform: 'uppercase',\n fontWeight: theme.typography.fontWeightBold,\n color: theme.palette.text.secondary,\n },\n /* Styles applied to the root element if both `icon` and `label` are provided. */\n labelIcon: {\n minHeight: 72,\n paddingTop: 9,\n '& $wrapper > *:first-child': {\n marginBottom: 6,\n },\n },\n /* Styles applied to the root element if the parent [`Tabs`](/api/tabs/) has `textColor=\"inherit\"`. */\n textColorInherit: {\n color: 'inherit',\n opacity: 0.7,\n '&$selected': {\n opacity: 1,\n },\n '&$disabled': {\n opacity: 0.5,\n },\n },\n selectedButton: {\n color: `${theme.palette.text.primary}`,\n opacity: `${1}`,\n },\n unselectedButton: {\n color: `${theme.palette.text.secondary}`,\n opacity: `${0.7}`,\n },\n /* Styles applied to the root element if the parent [`Tabs`](/api/tabs/) has `textColor=\"primary\"`. */\n textColorPrimary: {\n color: theme.palette.text.secondary,\n '&$selected': {\n color: theme.palette.primary.main,\n },\n '&$disabled': {\n color: theme.palette.text.disabled,\n },\n },\n /* Styles applied to the root element if the parent [`Tabs`](/api/tabs/) has `textColor=\"secondary\"`. */\n textColorSecondary: {\n color: theme.palette.text.secondary,\n '&$selected': {\n color: theme.palette.secondary.main,\n },\n '&$disabled': {\n color: theme.palette.text.disabled,\n },\n },\n /* Pseudo-class applied to the root element if `selected={true}` (controlled by the Tabs component). */\n selected: {},\n /* Pseudo-class applied to the root element if `disabled={true}` (controlled by the Tabs component). */\n disabled: {},\n /* Styles applied to the root element if `fullWidth={true}` (controlled by the Tabs component). */\n fullWidth: {\n flexShrink: 1,\n flexGrow: 1,\n flexBasis: 0,\n maxWidth: 'none',\n },\n /* Styles applied to the root element if `wrapped={true}`. */\n wrapped: {\n fontSize: theme.typography.pxToRem(12),\n lineHeight: 1.5,\n },\n /* Styles applied to the `icon` and `label`'s wrapper element. */\n wrapper: {\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '100%',\n flexDirection: 'row',\n },\n });\n\ntype EntityTabsGroupItem = {\n id: string;\n label: string;\n path: string;\n icon?: string | ReactElement;\n};\n\ntype EntityTabsGroupProps = TabProps & {\n classes?: Partial<ReturnType<typeof styles>>;\n indicator?: ReactNode;\n highlightedButton?: string;\n items: EntityTabsGroupItem[];\n onSelectTab?: MouseEventHandler<HTMLAnchorElement>;\n showIcons?: boolean;\n};\n\nfunction resolveIcon(\n icon: string | ReactElement | undefined,\n iconsApi: IconsApi,\n showIcons: boolean,\n) {\n if (!showIcons) {\n return undefined;\n }\n if (typeof icon === 'string') {\n const Icon = iconsApi.getIcon(icon);\n if (Icon) {\n return <Icon />;\n }\n return undefined;\n }\n return icon;\n}\n\nconst Tab = forwardRef(function Tab(props: EntityTabsGroupProps, ref: any) {\n const [anchorEl, setAnchorEl] = useState<HTMLButtonElement | null>(null);\n const iconsApi = useApi(iconsApiRef);\n\n const open = Boolean(anchorEl);\n const submenuId = open ? 'tabbed-submenu' : undefined;\n\n const {\n classes,\n className,\n disabled = false,\n disableFocusRipple = false,\n items,\n fullWidth,\n indicator,\n label,\n onSelectTab,\n selected,\n textColor = 'inherit',\n wrapped = false,\n highlightedButton,\n showIcons = false,\n } = props;\n\n const groupIcon = resolveIcon(props.icon, iconsApi, showIcons);\n const testId = 'data-testid' in props && props['data-testid'];\n\n const handleMenuClose = () => {\n setAnchorEl(null);\n };\n\n const handleMenuClick = (event: MouseEvent<HTMLButtonElement>) => {\n setAnchorEl(event.currentTarget);\n };\n\n const classArray = [\n classes?.root,\n classes?.[`textColor${capitalize(textColor)}` as TabClassKey],\n classes && {\n [classes.disabled!]: disabled,\n [classes.selected!]: selected,\n [classes.labelIcon!]: label && groupIcon,\n [classes.fullWidth!]: fullWidth,\n [classes.wrapped!]: wrapped,\n },\n className,\n ];\n\n if (items.length === 1) {\n return (\n <Button\n focusRipple={!disableFocusRipple}\n data-testid={testId}\n className={classnames(\n classArray,\n classes && {\n [classes.labelIcon!]: label && (items[0].icon ?? groupIcon),\n },\n )}\n ref={ref}\n role=\"tab\"\n aria-selected={selected}\n disabled={disabled}\n component={Link}\n onClick={onSelectTab}\n to={items[0]?.path}\n startIcon={resolveIcon(items[0].icon, iconsApi, showIcons)}\n >\n <Typography className={classes?.wrapper} variant=\"button\">\n {items[0].label}\n </Typography>\n {indicator}\n </Button>\n );\n }\n const hasIcons = showIcons && items.some(i => i.icon);\n return (\n <>\n <Button\n data-testid={testId}\n focusRipple={!disableFocusRipple}\n className={classnames(classArray)}\n ref={ref}\n role=\"tab\"\n aria-selected={selected}\n disabled={disabled}\n onClick={handleMenuClick}\n startIcon={groupIcon}\n >\n <Typography className={classes?.wrapper} variant=\"button\">\n {label}\n </Typography>\n <ExpandMoreIcon />\n </Button>\n <Popover\n id={submenuId}\n open={open}\n anchorEl={anchorEl}\n onClose={handleMenuClose}\n anchorOrigin={{\n vertical: 'bottom',\n horizontal: 'center',\n }}\n transformOrigin={{\n vertical: 'top',\n horizontal: 'center',\n }}\n >\n <List component=\"nav\">\n {items.map(i => {\n const itemIcon = resolveIcon(i.icon, iconsApi, showIcons);\n return (\n <ListItem\n key={`popover_item_${i.id}`}\n button\n focusRipple={!disableFocusRipple}\n classes={{\n selected: classnames(classes?.selectedButton),\n default: classnames(classes?.unselectedButton),\n disabled: classnames(classes?.disabled),\n }}\n ref={ref}\n aria-selected={selected}\n disabled={disabled}\n selected={highlightedButton === i.id}\n component={Link}\n onClick={e => {\n handleMenuClose();\n onSelectTab?.(e);\n }}\n to={i.path}\n >\n {itemIcon && <ListItemIcon>{itemIcon}</ListItemIcon>}\n <ListItemText\n inset={!itemIcon && hasIcons}\n primary={\n <>\n <Typography variant=\"button\">{i.label}</Typography>\n {indicator}\n </>\n }\n />\n </ListItem>\n );\n })}\n </List>\n </Popover>\n </>\n );\n});\n\n// @ts-ignore\nexport const EntityTabsGroup = withStyles(styles, { name: 'MuiTab' })(Tab);\n","/*\n * Copyright 2025 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { ReactElement, useMemo } from 'react';\nimport Box from '@material-ui/core/Box';\nimport Tabs from '@material-ui/core/Tabs';\nimport { makeStyles } from '@material-ui/core/styles';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { EntityContentGroupDefinitions } from '@backstage/plugin-catalog-react/alpha';\n\nimport { EntityTabsGroup } from './EntityTabsGroup';\nimport { catalogTranslationRef } from '../../translation';\n\n/** @public */\nexport type HeaderTabsClassKey =\n | 'tabsWrapper'\n | 'defaultTab'\n | 'selected'\n | 'tabRoot';\n\nconst useStyles = makeStyles(\n theme => ({\n tabsWrapper: {\n gridArea: 'pageSubheader',\n backgroundColor: theme.palette.background.paper,\n paddingLeft: theme.spacing(3),\n minWidth: 0,\n },\n defaultTab: {\n ...theme.typography.caption,\n padding: theme.spacing(3, 3),\n textTransform: 'uppercase',\n fontWeight: theme.typography.fontWeightBold,\n color: theme.palette.text.secondary,\n },\n selected: {\n color: theme.palette.text.primary,\n },\n tabRoot: {\n '&:hover': {\n backgroundColor: theme.palette.background.default,\n color: theme.palette.text.primary,\n },\n },\n }),\n { name: 'BackstageHeaderTabs' },\n);\n\ntype Tab = {\n id: string;\n label: string;\n path: string;\n group?: string;\n icon?: string | ReactElement;\n};\n\ntype TabGroup = {\n group?: {\n title: string;\n icon?: string | ReactElement;\n };\n items: Array<Omit<Tab, 'group'>>;\n};\n\ntype EntityTabsListProps = {\n tabs: Tab[];\n groupDefinitions: EntityContentGroupDefinitions;\n defaultContentOrder?: 'title' | 'natural';\n showIcons?: boolean;\n selectedIndex?: number;\n};\n\nfunction resolveGroupId(\n tabGroup: string | undefined,\n groupDefinitions: EntityContentGroupDefinitions,\n aliasToGroup: Record<string, string>,\n): string | undefined {\n if (!tabGroup) {\n return undefined;\n }\n if (groupDefinitions[tabGroup]) {\n return tabGroup;\n }\n return aliasToGroup[tabGroup];\n}\n\nexport function EntityTabsList(props: EntityTabsListProps) {\n const styles = useStyles();\n const { t } = useTranslationRef(catalogTranslationRef);\n\n const {\n tabs: items,\n selectedIndex = 0,\n showIcons,\n groupDefinitions,\n defaultContentOrder = 'title',\n } = props;\n\n const aliasToGroup = useMemo(\n () =>\n Object.entries(groupDefinitions).reduce((map, [groupId, def]) => {\n for (const alias of def.aliases ?? []) {\n map[alias] = groupId;\n }\n return map;\n }, {} as Record<string, string>),\n [groupDefinitions],\n );\n\n const groups = useMemo(() => {\n const byKey = items.reduce((result, tab) => {\n const resolvedGroupId = resolveGroupId(\n tab.group,\n groupDefinitions,\n aliasToGroup,\n );\n const group = resolvedGroupId\n ? groupDefinitions[resolvedGroupId]\n : undefined;\n const groupOrId = group && resolvedGroupId ? resolvedGroupId : tab.id;\n result[groupOrId] = result[groupOrId] ?? {\n group,\n items: [],\n };\n result[groupOrId].items.push(tab);\n return result;\n }, {} as Record<string, TabGroup>);\n\n const groupOrder = Object.keys(groupDefinitions);\n const sorted = Object.entries(byKey).sort(([a], [b]) => {\n const ai = groupOrder.indexOf(a);\n const bi = groupOrder.indexOf(b);\n if (ai !== -1 && bi !== -1) {\n return ai - bi;\n }\n if (ai !== -1) {\n return -1;\n }\n if (bi !== -1) {\n return 1;\n }\n return 0;\n });\n\n for (const [id, tabGroup] of sorted) {\n const groupDef = groupDefinitions[id];\n if (groupDef) {\n const order = groupDef.contentOrder ?? defaultContentOrder;\n if (order === 'title') {\n tabGroup.items.sort((a, b) =>\n a.label.localeCompare(b.label, undefined, { sensitivity: 'base' }),\n );\n }\n }\n }\n\n return sorted;\n }, [items, groupDefinitions, aliasToGroup, defaultContentOrder]);\n\n const selectedItem = selectedIndex >= 0 ? items[selectedIndex] : undefined;\n const selectedGroup = resolveGroupId(\n selectedItem?.group,\n groupDefinitions,\n aliasToGroup,\n );\n return (\n <Box className={styles.tabsWrapper}>\n <Tabs\n selectionFollowsFocus\n indicatorColor=\"primary\"\n textColor=\"inherit\"\n variant=\"scrollable\"\n scrollButtons=\"auto\"\n aria-label={t('entityTabs.tabsAriaLabel')}\n value={selectedGroup ?? selectedItem?.id ?? false}\n >\n {groups.map(([id, tabGroup]) => (\n <EntityTabsGroup\n data-testid={`header-tab-${id}`}\n className={styles.defaultTab}\n classes={{ selected: styles.selected, root: styles.tabRoot }}\n key={id}\n label={tabGroup.group?.title}\n icon={tabGroup.group?.icon}\n value={id}\n items={tabGroup.items}\n highlightedButton={selectedItem?.id}\n showIcons={showIcons}\n />\n ))}\n </Tabs>\n </Box>\n );\n}\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { ReactElement, useMemo } from 'react';\nimport { Helmet } from 'react-helmet';\nimport { matchRoutes, useParams, useRoutes } from 'react-router-dom';\nimport { NotFoundErrorPage } from '@backstage/frontend-plugin-api';\nimport { EntityTabsPanel } from './EntityTabsPanel';\nimport { EntityTabsList } from './EntityTabsList';\nimport { EntityContentGroupDefinitions } from '@backstage/plugin-catalog-react/alpha';\n\ntype SubRoute = {\n group?: string;\n path: string;\n title: string;\n icon?: string | ReactElement;\n children: JSX.Element;\n};\n\n// Normalize a route path so it can be matched correctly:\n// - strip leading slashes\n// - if the path already ends with a `*`, keep it as-is so explicit wildcards\n// like `/*` or `/foo/*` aren't double-suffixed into `*/*` / `foo/*/*`\n// - otherwise strip trailing slashes and append `/*` for nested matching;\n// a bare `/` collapses to the empty string so it acts as an index route\n// rather than a wildcard that would swallow every sub-path\nfunction normalizeRoutePath(path: string): string {\n const withoutLeading = path.replace(/^\\/+/, '');\n if (withoutLeading.endsWith('*')) {\n return withoutLeading;\n }\n const trimmed = withoutLeading.replace(/\\/+$/, '');\n return trimmed ? `${trimmed}/*` : '';\n}\n\nexport function useSelectedSubRoute(subRoutes: SubRoute[]): {\n index: number;\n route?: SubRoute;\n element?: JSX.Element;\n} {\n const params = useParams();\n\n const routes = useMemo(\n () =>\n subRoutes.map(({ path, children }) => ({\n caseSensitive: false,\n path: normalizeRoutePath(path),\n element: children,\n })),\n [subRoutes],\n );\n\n const element = useRoutes(routes) ?? undefined;\n\n let currentRoute = params['*'] ?? '';\n if (!currentRoute.startsWith('/')) {\n currentRoute = `/${currentRoute}`;\n }\n\n const [matchedRoute] = matchRoutes(routes, currentRoute) ?? [];\n const foundIndex = matchedRoute\n ? routes.findIndex(r => r.path === matchedRoute.route.path)\n : -1;\n\n return {\n index: foundIndex,\n element,\n route: subRoutes[foundIndex],\n };\n}\n\ntype EntityTabsProps = {\n routes: SubRoute[];\n groupDefinitions: EntityContentGroupDefinitions;\n defaultContentOrder?: 'title' | 'natural';\n showIcons?: boolean;\n};\n\nexport function EntityTabs(props: EntityTabsProps) {\n const { routes, groupDefinitions, defaultContentOrder, showIcons } = props;\n\n const { index, route, element } = useSelectedSubRoute(routes);\n\n const tabs = useMemo(\n () =>\n routes.map(r => {\n const { path, title, group, icon } = r;\n let to = path;\n // Remove trailing /*\n to = to.replace(/\\/\\*$/, '');\n // And remove leading / for relative navigation\n to = to.replace(/^\\//, '');\n return {\n group,\n id: path,\n path: to,\n label: title,\n icon,\n };\n }),\n [routes],\n );\n\n return (\n <>\n <EntityTabsList\n tabs={tabs}\n selectedIndex={index}\n showIcons={showIcons}\n groupDefinitions={groupDefinitions}\n defaultContentOrder={defaultContentOrder}\n />\n <EntityTabsPanel>\n <Helmet title={route?.title} />\n {element ?? <NotFoundErrorPage />}\n </EntityTabsPanel>\n </>\n );\n}\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { ComponentProps, ReactNode, ReactElement } from 'react';\n\nimport Alert from '@material-ui/lab/Alert';\n\nimport {\n attachComponentData,\n useElementFilter,\n useRouteRefParams,\n} from '@backstage/core-plugin-api';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport {\n Content,\n Link,\n Page,\n Progress,\n WarningPanel,\n} from '@backstage/core-components';\nimport { Entity } from '@backstage/catalog-model';\nimport {\n entityRouteRef,\n useAsyncEntity,\n} from '@backstage/plugin-catalog-react';\n\nimport { catalogTranslationRef } from '../../translation';\nimport { EntityHeader } from '../EntityHeader';\nimport { EntityTabs } from '../EntityTabs';\nimport { EntityContentGroupDefinitions } from '@backstage/plugin-catalog-react/alpha';\n\nexport type EntityLayoutRouteProps = {\n path: string;\n title: string;\n group?: string;\n icon?: string | ReactElement;\n children: JSX.Element;\n if?: (entity: Entity) => boolean;\n};\n\nconst dataKey = 'plugin.catalog.entityLayoutRoute';\nconst Route: (props: EntityLayoutRouteProps) => null = () => null;\nattachComponentData(Route, dataKey, true);\nattachComponentData(Route, 'core.gatherMountPoints', true); // This causes all mount points that are discovered within this route to use the path of the route itself\n\n/** @public */\nexport interface EntityLayoutProps {\n UNSTABLE_contextMenuOptions?: ComponentProps<\n typeof EntityHeader\n >['UNSTABLE_contextMenuOptions'];\n UNSTABLE_extraContextMenuItems?: ComponentProps<\n typeof EntityHeader\n >['UNSTABLE_extraContextMenuItems'];\n contextMenuItems?: ComponentProps<typeof EntityHeader>['contextMenuItems'];\n children?: ReactNode;\n header?: JSX.Element;\n NotFoundComponent?: ReactNode;\n /**\n * An array of relation types used to determine the parent entities in the hierarchy.\n * These relations are prioritized in the order provided, allowing for flexible\n * navigation through entity relationships.\n *\n * For example, use relation types like `[\"partOf\", \"memberOf\", \"ownedBy\"]` to define how the entity is related to\n * its parents in the Entity Catalog.\n *\n * It adds breadcrumbs in the Entity page to enhance user navigation and context awareness.\n */\n parentEntityRelations?: string[];\n groupDefinitions: EntityContentGroupDefinitions;\n defaultContentOrder?: 'title' | 'natural';\n showNavItemIcons?: boolean;\n}\n\n/**\n * EntityLayout is a compound component, which allows you to define a layout for\n * entities using a sub-navigation mechanism.\n *\n * Consists of two parts: EntityLayout and EntityLayout.Route\n *\n * @example\n * ```jsx\n * <EntityLayout>\n * <EntityLayout.Route path=\"/example\" title=\"Example tab\">\n * <div>This is rendered under /example/anything-here route</div>\n * </EntityLayout.Route>\n * </EntityLayout>\n * ```\n *\n * @public\n */\nexport const EntityLayout = (props: EntityLayoutProps) => {\n const {\n UNSTABLE_extraContextMenuItems,\n UNSTABLE_contextMenuOptions,\n contextMenuItems,\n children,\n header,\n NotFoundComponent,\n parentEntityRelations,\n groupDefinitions,\n defaultContentOrder,\n showNavItemIcons,\n } = props;\n const { kind } = useRouteRefParams(entityRouteRef);\n const { entity, loading, error } = useAsyncEntity();\n\n const routes = useElementFilter(\n children,\n elements =>\n elements\n .selectByComponentData({\n key: dataKey,\n withStrictError:\n 'Child of EntityLayout must be an EntityLayout.Route',\n })\n .getElements<EntityLayoutRouteProps>() // all nodes, element data, maintain structure or not?\n .flatMap(({ props: elementProps }) => {\n if (!entity) {\n return [];\n }\n if (elementProps.if && !elementProps.if(entity)) {\n return [];\n }\n return [\n {\n path: elementProps.path,\n title: elementProps.title,\n group: elementProps.group,\n children: elementProps.children,\n icon: elementProps.icon,\n },\n ];\n }),\n [entity],\n );\n\n const { t } = useTranslationRef(catalogTranslationRef);\n\n return (\n <Page themeId={entity?.spec?.type?.toString() ?? 'home'}>\n {header ?? (\n <EntityHeader\n parentEntityRelations={parentEntityRelations}\n UNSTABLE_contextMenuOptions={UNSTABLE_contextMenuOptions}\n UNSTABLE_extraContextMenuItems={UNSTABLE_extraContextMenuItems}\n contextMenuItems={contextMenuItems}\n />\n )}\n\n {loading && <Progress />}\n\n {entity && (\n <EntityTabs\n routes={routes}\n groupDefinitions={groupDefinitions}\n defaultContentOrder={defaultContentOrder}\n showIcons={showNavItemIcons}\n />\n )}\n\n {error && (\n <Content>\n <Alert severity=\"error\">{error.toString()}</Alert>\n </Content>\n )}\n\n {!loading && !error && !entity && (\n <Content>\n {NotFoundComponent ? (\n NotFoundComponent\n ) : (\n <WarningPanel title={t('entityLabels.warningPanelTitle')}>\n {t('entityPage.notFoundMessage', {\n kind,\n link: (\n <Link to=\"https://backstage.io/docs/features/software-catalog/references\">\n {t('entityPage.notFoundLinkText')}\n </Link>\n ),\n })}\n </WarningPanel>\n )}\n </Content>\n )}\n </Page>\n );\n};\n\nEntityLayout.Route = Route;\n"],"names":["DependencyGraphTypes","useStyles","makeStyles","FavoriteToggleIcon","props","isFavorite","classes","Typography","StarIcon","UnstarredIcon","FavoriteToggle","id","title","value","onChange","iconButtonProps","Tooltip","IconButton","theme","alpha","HeaderLabelContent","className","typographyRootComponent","HeaderLabel","label","url","contentTypograpyRootComponent","content","Grid","Link","ButtonIconDefinition","defineComponent","styles","ButtonIcon","forwardRef","ref","ownProps","restProps","dataAttributes","useDefinition","icon","isPending","RAButton","ProgressBar","RiLoader4Line","getEntityRef","entityOrRef","stringifyEntityRef","FavoriteEntity","toggleStarredEntity","isStarredEntity","useStarredEntity","starredEntitiesApi","useApi","starredEntitiesApiRef","setIsStarredEntity","useState","useEffect","subscription","starredEntities","useCallback","t","useTranslationRef","catalogReactTranslationRef","LazyDependencyGraphContent","lazy","i","m","DependencyGraph","Suspense","DEFAULT_ICON","SvgIcon","EntityKindIcon","app","actualKind","kind","entityRef","otherProps","Icon","useApp","getKind","parseEntityRef","CustomNode","node","navigate","useNavigate","entityRoute","useRouteRef","entityRouteRef","width","setWidth","height","setHeight","idRef","useRef","useLayoutEffect","renderedHeight","renderedWidth","Math","hasKindIcon","paddedIconWidth","iconSize","paddedHeight","padding","displayTitle","useEntityPresentation","DEFAULT_NAMESPACE","classNames","AncestryPage","loading","error","nodes","edges","useAncestry","root","catalogClient","catalogApiRef","useAsync","response","Array","current","currentRef","isRootNode","parentRef","Progress","ResponseErrorPanel","Box","Text","ListSection","ListItemRow","EntityList","entity","EntityRefLink","Contents","location","originLocation","colocatedEntities","useColocated","catalogApi","currentEntityRef","ANNOTATION_LOCATION","origin","ANNOTATION_ORIGIN_LOCATION","colocated","Alert","atLocation","e","atOrigin","ColocatedPage","sortKeys","data","Object","a","b","JsonPage","CodeSnippet","JSON","undefined","TagGroupDefinition","TagDefinition","TagGroup","items","children","renderEmptyState","ReactAriaTagGroup","ReactAriaTagList","Tag","analytics","href","textValue","ReactAriaTag","text","getNodeText","String","allowsRemoving","ReactAriaButton","RiCloseCircleLine","entriesToItems","entries","key","link","CopyButton","copied","setCopied","timerRef","clearTimeout","handlePress","window","setTimeout","RiCheckLine","RiFileCopyLine","VisuallyHidden","HelpIcon","ButtonLink","RiQuestionLine","Container","Card","CardHeader","CardBody","ListSubheader","KeyValueList","item","OverviewPage","apiVersion","metadata","spec","relations","status","groupedRelations","groupBy","sortBy","r","Flex","tag","type","groupRelations","group","index","YamlPage","YAML","TAB_KEYS","DialogContents","initialTab","onSelect","tabNames","useMemo","tabContent","DialogHeader","DialogBody","Tabs","TabList","tab","Tab","TabPanel","InspectEntityDialog","open","onClose","Dialog","isOpen","EntityLabels","ownedByRelations","getEntityRelations","RELATION_OWNED_BY","catalogTranslationRef","EntityRefLinks","UnregisterEntity","unregisterEntityOptions","isUnregisterAllowed","onUnregisterEntity","isBoolean","isDisabled","MenuItem","ListItemIcon","CancelIcon","ListItemText","EntityContextMenuContext","createVersionedContext","EntityContextMenuProvider","onMenuClose","createVersionedValueMap","EntityContextMenu","UNSTABLE_extraContextMenuItems","UNSTABLE_contextMenuOptions","contextMenuItems","onInspectEntity","anchorEl","setAnchorEl","isAllowed","unregisterPermission","useEntityPermission","catalogEntityDeletePermission","alertApi","alertApiRef","copyState","copyToClipboard","useCopyToClipboard","extraItems","Divider","defaultMenuItems","BugReportIcon","FileCopyTwoToneIcon","event","MoreVert","Popover","Boolean","MenuList","Fragment","headerProps","paramKind","paramNamespace","paramName","namespace","name","findParentRelation","entityRelations","relationTypes","foundRelation","relation","EntityHeaderTitle","useAsyncEntity","useRouteRefParams","EntityDisplayName","EntityHeaderSubtitle","parentEntityRelations","parentEntity","ancestorEntity","Breadcrumbs","EntityHeader","subtitle","entityFallbackText","useLocation","catalogRoute","rootRouteRef","unregisterRedirectRoute","unregisterRedirectRouteRef","confirmationDialogOpen","setConfirmationDialogOpen","openUnregisterEntityDialog","closeUnregisterEntityDialog","cleanUpAfterUnregisterConfirmation","searchParams","setSearchParams","useSearchParams","selectedInspectEntityDialogTab","setInspectEntityDialogTab","newTab","openInspectEntityDialog","closeInspectEntityDialog","Header","UnregisterEntityDialog","EntityTabsPanel","stretch","noPadding","resolveIcon","iconsApi","showIcons","iconsApiRef","disabled","disableFocusRipple","fullWidth","indicator","onSelectTab","selected","textColor","wrapped","highlightedButton","groupIcon","testId","handleMenuClose","classArray","capitalize","Button","classnames","hasIcons","ExpandMoreIcon","List","itemIcon","ListItem","EntityTabsGroup","withStyles","createStyles","resolveGroupId","tabGroup","groupDefinitions","aliasToGroup","EntityTabsList","selectedIndex","defaultContentOrder","map","groupId","def","alias","groups","byKey","result","resolvedGroupId","groupOrId","groupOrder","sorted","ai","bi","groupDef","order","selectedItem","selectedGroup","EntityTabs","routes","route","element","useSelectedSubRoute","subRoutes","params","useParams","path","normalizeRoutePath","withoutLeading","trimmed","useRoutes","currentRoute","matchedRoute","matchRoutes","foundIndex","tabs","to","Helmet","NotFoundErrorPage","dataKey","Route","attachComponentData","EntityLayout","header","NotFoundComponent","showNavItemIcons","useElementFilter","elements","elementProps","Page","Content","WarningPanel"],"mappings":"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"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
"use strict";(self.webpackChunktechdocs_cli_embedded_app=self.webpackChunktechdocs_cli_embedded_app||[]).push([["4587"],{20534(e){e.exports=JSON.parse('{"name":"@backstage/plugin-app","version":"0.5.0","backstage":{"role":"frontend-plugin","pluginId":"app","pluginPackages":["@backstage/plugin-app","@backstage/plugin-app-backend","@backstage/plugin-app-node","@backstage/plugin-app-react"]},"publishConfig":{"access":"public"},"repository":{"type":"git","url":"https://github.com/backstage/backstage","directory":"plugins/app"},"license":"Apache-2.0","sideEffects":false,"exports":{".":"./src/index.ts","./alpha":"./src/alpha/index.ts","./package.json":"./package.json"},"main":"src/index.ts","types":"src/index.ts","typesVersions":{"*":{"alpha":["src/alpha/index.ts"],"package.json":["package.json"]}},"files":["dist"],"scripts":{"build":"backstage-cli package build","clean":"backstage-cli package clean","lint":"backstage-cli package lint","prepack":"backstage-cli package prepack","postpack":"backstage-cli package postpack","start":"backstage-cli package start","test":"backstage-cli package test"},"dependencies":{"@backstage/core-components":"workspace:^","@backstage/core-plugin-api":"workspace:^","@backstage/filter-predicates":"workspace:^","@backstage/frontend-plugin-api":"workspace:^","@backstage/integration-react":"workspace:^","@backstage/plugin-app-react":"workspace:^","@backstage/plugin-permission-react":"workspace:^","@backstage/theme":"workspace:^","@backstage/types":"workspace:^","@backstage/ui":"workspace:^","@backstage/version-bridge":"workspace:^","@material-ui/core":"^4.9.13","@material-ui/icons":"^4.9.1","@material-ui/lab":"^4.0.0-alpha.61","@react-hookz/web":"^24.0.0","@remixicon/react":">=4.6.0 <4.9.0","motion":"^12.0.0","react-aria":"~3.48.0","react-stately":"~3.46.0","react-use":"^17.2.4","zen-observable":"^0.10.0","zod":"^4.0.0"},"devDependencies":{"@backstage/cli":"workspace:^","@backstage/dev-utils":"workspace:^","@backstage/frontend-defaults":"workspace:^","@backstage/frontend-test-utils":"workspace:^","@backstage/test-utils":"workspace:^","@testing-library/jest-dom":"^6.0.0","@testing-library/react":"^16.0.0","@testing-library/user-event":"^14.0.0","@types/react":"^18.0.0","msw":"^1.0.0","react":"^18.0.2","react-dom":"^18.0.2","react-router-dom":"^6.30.2"},"peerDependencies":{"@types/react":"^17.0.0 || ^18.0.0","react":"^17.0.0 || ^18.0.0","react-dom":"^17.0.0 || ^18.0.0","react-router-dom":"^6.30.2"},"peerDependenciesMeta":{"@types/react":{"optional":true}}}')}}]);
|
|
2
|
-
//# sourceMappingURL=4587.baab3514.chunk.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"static/4587.baab3514.chunk.js","sources":["webpack://techdocs-cli-embedded-app/json|/home/runner/work/publishing/publishing/plugins/app/package.json"],"sourcesContent":["module.exports = JSON.parse('{\"name\":\"@backstage/plugin-app\",\"version\":\"0.5.0\",\"backstage\":{\"role\":\"frontend-plugin\",\"pluginId\":\"app\",\"pluginPackages\":[\"@backstage/plugin-app\",\"@backstage/plugin-app-backend\",\"@backstage/plugin-app-node\",\"@backstage/plugin-app-react\"]},\"publishConfig\":{\"access\":\"public\"},\"repository\":{\"type\":\"git\",\"url\":\"https://github.com/backstage/backstage\",\"directory\":\"plugins/app\"},\"license\":\"Apache-2.0\",\"sideEffects\":false,\"exports\":{\".\":\"./src/index.ts\",\"./alpha\":\"./src/alpha/index.ts\",\"./package.json\":\"./package.json\"},\"main\":\"src/index.ts\",\"types\":\"src/index.ts\",\"typesVersions\":{\"*\":{\"alpha\":[\"src/alpha/index.ts\"],\"package.json\":[\"package.json\"]}},\"files\":[\"dist\"],\"scripts\":{\"build\":\"backstage-cli package build\",\"clean\":\"backstage-cli package clean\",\"lint\":\"backstage-cli package lint\",\"prepack\":\"backstage-cli package prepack\",\"postpack\":\"backstage-cli package postpack\",\"start\":\"backstage-cli package start\",\"test\":\"backstage-cli package test\"},\"dependencies\":{\"@backstage/core-components\":\"workspace:^\",\"@backstage/core-plugin-api\":\"workspace:^\",\"@backstage/filter-predicates\":\"workspace:^\",\"@backstage/frontend-plugin-api\":\"workspace:^\",\"@backstage/integration-react\":\"workspace:^\",\"@backstage/plugin-app-react\":\"workspace:^\",\"@backstage/plugin-permission-react\":\"workspace:^\",\"@backstage/theme\":\"workspace:^\",\"@backstage/types\":\"workspace:^\",\"@backstage/ui\":\"workspace:^\",\"@backstage/version-bridge\":\"workspace:^\",\"@material-ui/core\":\"^4.9.13\",\"@material-ui/icons\":\"^4.9.1\",\"@material-ui/lab\":\"^4.0.0-alpha.61\",\"@react-hookz/web\":\"^24.0.0\",\"@remixicon/react\":\">=4.6.0 <4.9.0\",\"motion\":\"^12.0.0\",\"react-aria\":\"~3.48.0\",\"react-stately\":\"~3.46.0\",\"react-use\":\"^17.2.4\",\"zen-observable\":\"^0.10.0\",\"zod\":\"^4.0.0\"},\"devDependencies\":{\"@backstage/cli\":\"workspace:^\",\"@backstage/dev-utils\":\"workspace:^\",\"@backstage/frontend-defaults\":\"workspace:^\",\"@backstage/frontend-test-utils\":\"workspace:^\",\"@backstage/test-utils\":\"workspace:^\",\"@testing-library/jest-dom\":\"^6.0.0\",\"@testing-library/react\":\"^16.0.0\",\"@testing-library/user-event\":\"^14.0.0\",\"@types/react\":\"^18.0.0\",\"msw\":\"^1.0.0\",\"react\":\"^18.0.2\",\"react-dom\":\"^18.0.2\",\"react-router-dom\":\"^6.30.2\"},\"peerDependencies\":{\"@types/react\":\"^17.0.0 || ^18.0.0\",\"react\":\"^17.0.0 || ^18.0.0\",\"react-dom\":\"^17.0.0 || ^18.0.0\",\"react-router-dom\":\"^6.30.2\"},\"peerDependenciesMeta\":{\"@types/react\":{\"optional\":true}}}')"],"names":["JSON"],"mappings":"kIAAA,EAAO,OAAO,CAAGA,KAAK,KAAK,CAAC,g0E"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"static/4815.b2bde1a3.chunk.js","sources":["webpack://techdocs-cli-embedded-app/../../node_modules/@material-ui/core/esm/internal/svg-icons/CheckBoxOutlineBlank.js","webpack://techdocs-cli-embedded-app/../../node_modules/@material-ui/core/esm/internal/svg-icons/CheckBox.js","webpack://techdocs-cli-embedded-app/../../node_modules/@material-ui/core/esm/internal/svg-icons/IndeterminateCheckBox.js","webpack://techdocs-cli-embedded-app/../../node_modules/@material-ui/core/esm/Checkbox/Checkbox.js","webpack://techdocs-cli-embedded-app/../../node_modules/@material-ui/core/esm/FormControlLabel/FormControlLabel.js","webpack://techdocs-cli-embedded-app/../../node_modules/@material-ui/core/esm/ListItemSecondaryAction/ListItemSecondaryAction.js","webpack://techdocs-cli-embedded-app/../../node_modules/@material-ui/core/esm/ListSubheader/ListSubheader.js","webpack://techdocs-cli-embedded-app/../../node_modules/@material-ui/core/esm/internal/SwitchBase.js","webpack://techdocs-cli-embedded-app/../../node_modules/fast-deep-equal/react.js"],"sourcesContent":["import * as React from 'react';\nimport createSvgIcon from '../../utils/createSvgIcon';\n/**\n * @ignore - internal component.\n */\n\nexport default createSvgIcon( /*#__PURE__*/React.createElement(\"path\", {\n d: \"M19 5v14H5V5h14m0-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2z\"\n}), 'CheckBoxOutlineBlank');","import * as React from 'react';\nimport createSvgIcon from '../../utils/createSvgIcon';\n/**\n * @ignore - internal component.\n */\n\nexport default createSvgIcon( /*#__PURE__*/React.createElement(\"path\", {\n d: \"M19 3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.11 0 2-.9 2-2V5c0-1.1-.89-2-2-2zm-9 14l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z\"\n}), 'CheckBox');","import * as React from 'react';\nimport createSvgIcon from '../../utils/createSvgIcon';\n/**\n * @ignore - internal component.\n */\n\nexport default createSvgIcon( /*#__PURE__*/React.createElement(\"path\", {\n d: \"M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-2 10H7v-2h10v2z\"\n}), 'IndeterminateCheckBox');","import _extends from \"@babel/runtime/helpers/esm/extends\";\nimport _objectWithoutProperties from \"@babel/runtime/helpers/esm/objectWithoutProperties\";\nimport * as React from 'react';\nimport PropTypes from 'prop-types';\nimport clsx from 'clsx';\nimport { refType } from '@material-ui/utils';\nimport SwitchBase from '../internal/SwitchBase';\nimport CheckBoxOutlineBlankIcon from '../internal/svg-icons/CheckBoxOutlineBlank';\nimport CheckBoxIcon from '../internal/svg-icons/CheckBox';\nimport { alpha } from '../styles/colorManipulator';\nimport IndeterminateCheckBoxIcon from '../internal/svg-icons/IndeterminateCheckBox';\nimport capitalize from '../utils/capitalize';\nimport withStyles from '../styles/withStyles';\nexport var styles = function styles(theme) {\n return {\n /* Styles applied to the root element. */\n root: {\n color: theme.palette.text.secondary\n },\n\n /* Pseudo-class applied to the root element if `checked={true}`. */\n checked: {},\n\n /* Pseudo-class applied to the root element if `disabled={true}`. */\n disabled: {},\n\n /* Pseudo-class applied to the root element if `indeterminate={true}`. */\n indeterminate: {},\n\n /* Styles applied to the root element if `color=\"primary\"`. */\n colorPrimary: {\n '&$checked': {\n color: theme.palette.primary.main,\n '&:hover': {\n backgroundColor: alpha(theme.palette.primary.main, theme.palette.action.hoverOpacity),\n // Reset on touch devices, it doesn't add specificity\n '@media (hover: none)': {\n backgroundColor: 'transparent'\n }\n }\n },\n '&$disabled': {\n color: theme.palette.action.disabled\n }\n },\n\n /* Styles applied to the root element if `color=\"secondary\"`. */\n colorSecondary: {\n '&$checked': {\n color: theme.palette.secondary.main,\n '&:hover': {\n backgroundColor: alpha(theme.palette.secondary.main, theme.palette.action.hoverOpacity),\n // Reset on touch devices, it doesn't add specificity\n '@media (hover: none)': {\n backgroundColor: 'transparent'\n }\n }\n },\n '&$disabled': {\n color: theme.palette.action.disabled\n }\n }\n };\n};\nvar defaultCheckedIcon = /*#__PURE__*/React.createElement(CheckBoxIcon, null);\nvar defaultIcon = /*#__PURE__*/React.createElement(CheckBoxOutlineBlankIcon, null);\nvar defaultIndeterminateIcon = /*#__PURE__*/React.createElement(IndeterminateCheckBoxIcon, null);\nvar Checkbox = /*#__PURE__*/React.forwardRef(function Checkbox(props, ref) {\n var _props$checkedIcon = props.checkedIcon,\n checkedIcon = _props$checkedIcon === void 0 ? defaultCheckedIcon : _props$checkedIcon,\n classes = props.classes,\n _props$color = props.color,\n color = _props$color === void 0 ? 'secondary' : _props$color,\n _props$icon = props.icon,\n iconProp = _props$icon === void 0 ? defaultIcon : _props$icon,\n _props$indeterminate = props.indeterminate,\n indeterminate = _props$indeterminate === void 0 ? false : _props$indeterminate,\n _props$indeterminateI = props.indeterminateIcon,\n indeterminateIconProp = _props$indeterminateI === void 0 ? defaultIndeterminateIcon : _props$indeterminateI,\n inputProps = props.inputProps,\n _props$size = props.size,\n size = _props$size === void 0 ? 'medium' : _props$size,\n other = _objectWithoutProperties(props, [\"checkedIcon\", \"classes\", \"color\", \"icon\", \"indeterminate\", \"indeterminateIcon\", \"inputProps\", \"size\"]);\n\n var icon = indeterminate ? indeterminateIconProp : iconProp;\n var indeterminateIcon = indeterminate ? indeterminateIconProp : checkedIcon;\n return /*#__PURE__*/React.createElement(SwitchBase, _extends({\n type: \"checkbox\",\n classes: {\n root: clsx(classes.root, classes[\"color\".concat(capitalize(color))], indeterminate && classes.indeterminate),\n checked: classes.checked,\n disabled: classes.disabled\n },\n color: color,\n inputProps: _extends({\n 'data-indeterminate': indeterminate\n }, inputProps),\n icon: /*#__PURE__*/React.cloneElement(icon, {\n fontSize: icon.props.fontSize === undefined && size === \"small\" ? size : icon.props.fontSize\n }),\n checkedIcon: /*#__PURE__*/React.cloneElement(indeterminateIcon, {\n fontSize: indeterminateIcon.props.fontSize === undefined && size === \"small\" ? size : indeterminateIcon.props.fontSize\n }),\n ref: ref\n }, other));\n});\nprocess.env.NODE_ENV !== \"production\" ? Checkbox.propTypes = {\n // ----------------------------- Warning --------------------------------\n // | These PropTypes are generated from the TypeScript type definitions |\n // | To update them edit the d.ts file and run \"yarn proptypes\" |\n // ----------------------------------------------------------------------\n\n /**\n * If `true`, the component is checked.\n */\n checked: PropTypes.bool,\n\n /**\n * The icon to display when the component is checked.\n */\n checkedIcon: PropTypes.node,\n\n /**\n * Override or extend the styles applied to the component.\n * See [CSS API](#css) below for more details.\n */\n classes: PropTypes.object,\n\n /**\n * The color of the component. It supports those theme colors that make sense for this component.\n */\n color: PropTypes.oneOf(['default', 'primary', 'secondary']),\n\n /**\n * If `true`, the checkbox will be disabled.\n */\n disabled: PropTypes.bool,\n\n /**\n * If `true`, the ripple effect will be disabled.\n */\n disableRipple: PropTypes.bool,\n\n /**\n * The icon to display when the component is unchecked.\n */\n icon: PropTypes.node,\n\n /**\n * The id of the `input` element.\n */\n id: PropTypes.string,\n\n /**\n * If `true`, the component appears indeterminate.\n * This does not set the native input element to indeterminate due\n * to inconsistent behavior across browsers.\n * However, we set a `data-indeterminate` attribute on the input.\n */\n indeterminate: PropTypes.bool,\n\n /**\n * The icon to display when the component is indeterminate.\n */\n indeterminateIcon: PropTypes.node,\n\n /**\n * [Attributes](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#Attributes) applied to the `input` element.\n */\n inputProps: PropTypes.object,\n\n /**\n * Pass a ref to the `input` element.\n */\n inputRef: refType,\n\n /**\n * Callback fired when the state is changed.\n *\n * @param {object} event The event source of the callback.\n * You can pull out the new checked state by accessing `event.target.checked` (boolean).\n */\n onChange: PropTypes.func,\n\n /**\n * If `true`, the `input` element will be required.\n */\n required: PropTypes.bool,\n\n /**\n * The size of the checkbox.\n * `small` is equivalent to the dense checkbox styling.\n */\n size: PropTypes.oneOf(['medium', 'small']),\n\n /**\n * The value of the component. The DOM API casts this to a string.\n * The browser uses \"on\" as the default value.\n */\n value: PropTypes.any\n} : void 0;\nexport default withStyles(styles, {\n name: 'MuiCheckbox'\n})(Checkbox);","import _extends from \"@babel/runtime/helpers/esm/extends\";\nimport _objectWithoutProperties from \"@babel/runtime/helpers/esm/objectWithoutProperties\";\nimport * as React from 'react';\nimport PropTypes from 'prop-types';\nimport clsx from 'clsx';\nimport { refType } from '@material-ui/utils';\nimport { useFormControl } from '../FormControl';\nimport withStyles from '../styles/withStyles';\nimport Typography from '../Typography';\nimport capitalize from '../utils/capitalize';\nexport var styles = function styles(theme) {\n return {\n /* Styles applied to the root element. */\n root: {\n display: 'inline-flex',\n alignItems: 'center',\n cursor: 'pointer',\n // For correct alignment with the text.\n verticalAlign: 'middle',\n WebkitTapHighlightColor: 'transparent',\n marginLeft: -11,\n marginRight: 16,\n // used for row presentation of radio/checkbox\n '&$disabled': {\n cursor: 'default'\n }\n },\n\n /* Styles applied to the root element if `labelPlacement=\"start\"`. */\n labelPlacementStart: {\n flexDirection: 'row-reverse',\n marginLeft: 16,\n // used for row presentation of radio/checkbox\n marginRight: -11\n },\n\n /* Styles applied to the root element if `labelPlacement=\"top\"`. */\n labelPlacementTop: {\n flexDirection: 'column-reverse',\n marginLeft: 16\n },\n\n /* Styles applied to the root element if `labelPlacement=\"bottom\"`. */\n labelPlacementBottom: {\n flexDirection: 'column',\n marginLeft: 16\n },\n\n /* Pseudo-class applied to the root element if `disabled={true}`. */\n disabled: {},\n\n /* Styles applied to the label's Typography component. */\n label: {\n '&$disabled': {\n color: theme.palette.text.disabled\n }\n }\n };\n};\n/**\n * Drop in replacement of the `Radio`, `Switch` and `Checkbox` component.\n * Use this component if you want to display an extra label.\n */\n\nvar FormControlLabel = /*#__PURE__*/React.forwardRef(function FormControlLabel(props, ref) {\n var checked = props.checked,\n classes = props.classes,\n className = props.className,\n control = props.control,\n disabledProp = props.disabled,\n inputRef = props.inputRef,\n label = props.label,\n _props$labelPlacement = props.labelPlacement,\n labelPlacement = _props$labelPlacement === void 0 ? 'end' : _props$labelPlacement,\n name = props.name,\n onChange = props.onChange,\n value = props.value,\n other = _objectWithoutProperties(props, [\"checked\", \"classes\", \"className\", \"control\", \"disabled\", \"inputRef\", \"label\", \"labelPlacement\", \"name\", \"onChange\", \"value\"]);\n\n var muiFormControl = useFormControl();\n var disabled = disabledProp;\n\n if (typeof disabled === 'undefined' && typeof control.props.disabled !== 'undefined') {\n disabled = control.props.disabled;\n }\n\n if (typeof disabled === 'undefined' && muiFormControl) {\n disabled = muiFormControl.disabled;\n }\n\n var controlProps = {\n disabled: disabled\n };\n ['checked', 'name', 'onChange', 'value', 'inputRef'].forEach(function (key) {\n if (typeof control.props[key] === 'undefined' && typeof props[key] !== 'undefined') {\n controlProps[key] = props[key];\n }\n });\n return /*#__PURE__*/React.createElement(\"label\", _extends({\n className: clsx(classes.root, className, labelPlacement !== 'end' && classes[\"labelPlacement\".concat(capitalize(labelPlacement))], disabled && classes.disabled),\n ref: ref\n }, other), /*#__PURE__*/React.cloneElement(control, controlProps), /*#__PURE__*/React.createElement(Typography, {\n component: \"span\",\n className: clsx(classes.label, disabled && classes.disabled)\n }, label));\n});\nprocess.env.NODE_ENV !== \"production\" ? FormControlLabel.propTypes = {\n // ----------------------------- Warning --------------------------------\n // | These PropTypes are generated from the TypeScript type definitions |\n // | To update them edit the d.ts file and run \"yarn proptypes\" |\n // ----------------------------------------------------------------------\n\n /**\n * If `true`, the component appears selected.\n */\n checked: PropTypes.bool,\n\n /**\n * Override or extend the styles applied to the component.\n * See [CSS API](#css) below for more details.\n */\n classes: PropTypes.object,\n\n /**\n * @ignore\n */\n className: PropTypes.string,\n\n /**\n * A control element. For instance, it can be be a `Radio`, a `Switch` or a `Checkbox`.\n */\n control: PropTypes.element.isRequired,\n\n /**\n * If `true`, the control will be disabled.\n */\n disabled: PropTypes.bool,\n\n /**\n * Pass a ref to the `input` element.\n */\n inputRef: refType,\n\n /**\n * The text to be used in an enclosing label element.\n */\n label: PropTypes.node,\n\n /**\n * The position of the label.\n */\n labelPlacement: PropTypes.oneOf(['bottom', 'end', 'start', 'top']),\n\n /**\n * @ignore\n */\n name: PropTypes.string,\n\n /**\n * Callback fired when the state is changed.\n *\n * @param {object} event The event source of the callback.\n * You can pull out the new checked state by accessing `event.target.checked` (boolean).\n */\n onChange: PropTypes.func,\n\n /**\n * The value of the component.\n */\n value: PropTypes.any\n} : void 0;\nexport default withStyles(styles, {\n name: 'MuiFormControlLabel'\n})(FormControlLabel);","import _extends from \"@babel/runtime/helpers/esm/extends\";\nimport _objectWithoutProperties from \"@babel/runtime/helpers/esm/objectWithoutProperties\";\nimport * as React from 'react';\nimport PropTypes from 'prop-types';\nimport clsx from 'clsx';\nimport withStyles from '../styles/withStyles';\nexport var styles = {\n /* Styles applied to the root element. */\n root: {\n position: 'absolute',\n right: 16,\n top: '50%',\n transform: 'translateY(-50%)'\n }\n};\n/**\n * Must be used as the last child of ListItem to function properly.\n */\n\nvar ListItemSecondaryAction = /*#__PURE__*/React.forwardRef(function ListItemSecondaryAction(props, ref) {\n var classes = props.classes,\n className = props.className,\n other = _objectWithoutProperties(props, [\"classes\", \"className\"]);\n\n return /*#__PURE__*/React.createElement(\"div\", _extends({\n className: clsx(classes.root, className),\n ref: ref\n }, other));\n});\nprocess.env.NODE_ENV !== \"production\" ? ListItemSecondaryAction.propTypes = {\n // ----------------------------- Warning --------------------------------\n // | These PropTypes are generated from the TypeScript type definitions |\n // | To update them edit the d.ts file and run \"yarn proptypes\" |\n // ----------------------------------------------------------------------\n\n /**\n * The content of the component, normally an `IconButton` or selection control.\n */\n children: PropTypes.node,\n\n /**\n * Override or extend the styles applied to the component.\n * See [CSS API](#css) below for more details.\n */\n classes: PropTypes.object,\n\n /**\n * @ignore\n */\n className: PropTypes.string\n} : void 0;\nListItemSecondaryAction.muiName = 'ListItemSecondaryAction';\nexport default withStyles(styles, {\n name: 'MuiListItemSecondaryAction'\n})(ListItemSecondaryAction);","import _extends from \"@babel/runtime/helpers/esm/extends\";\nimport _objectWithoutProperties from \"@babel/runtime/helpers/esm/objectWithoutProperties\";\nimport * as React from 'react';\nimport PropTypes from 'prop-types';\nimport clsx from 'clsx';\nimport withStyles from '../styles/withStyles';\nimport capitalize from '../utils/capitalize';\nexport var styles = function styles(theme) {\n return {\n /* Styles applied to the root element. */\n root: {\n boxSizing: 'border-box',\n lineHeight: '48px',\n listStyle: 'none',\n color: theme.palette.text.secondary,\n fontFamily: theme.typography.fontFamily,\n fontWeight: theme.typography.fontWeightMedium,\n fontSize: theme.typography.pxToRem(14)\n },\n\n /* Styles applied to the root element if `color=\"primary\"`. */\n colorPrimary: {\n color: theme.palette.primary.main\n },\n\n /* Styles applied to the root element if `color=\"inherit\"`. */\n colorInherit: {\n color: 'inherit'\n },\n\n /* Styles applied to the inner `component` element if `disableGutters={false}`. */\n gutters: {\n paddingLeft: 16,\n paddingRight: 16\n },\n\n /* Styles applied to the root element if `inset={true}`. */\n inset: {\n paddingLeft: 72\n },\n\n /* Styles applied to the root element if `disableSticky={false}`. */\n sticky: {\n position: 'sticky',\n top: 0,\n zIndex: 1,\n backgroundColor: 'inherit'\n }\n };\n};\nvar ListSubheader = /*#__PURE__*/React.forwardRef(function ListSubheader(props, ref) {\n var classes = props.classes,\n className = props.className,\n _props$color = props.color,\n color = _props$color === void 0 ? 'default' : _props$color,\n _props$component = props.component,\n Component = _props$component === void 0 ? 'li' : _props$component,\n _props$disableGutters = props.disableGutters,\n disableGutters = _props$disableGutters === void 0 ? false : _props$disableGutters,\n _props$disableSticky = props.disableSticky,\n disableSticky = _props$disableSticky === void 0 ? false : _props$disableSticky,\n _props$inset = props.inset,\n inset = _props$inset === void 0 ? false : _props$inset,\n other = _objectWithoutProperties(props, [\"classes\", \"className\", \"color\", \"component\", \"disableGutters\", \"disableSticky\", \"inset\"]);\n\n return /*#__PURE__*/React.createElement(Component, _extends({\n className: clsx(classes.root, className, color !== 'default' && classes[\"color\".concat(capitalize(color))], inset && classes.inset, !disableSticky && classes.sticky, !disableGutters && classes.gutters),\n ref: ref\n }, other));\n});\nprocess.env.NODE_ENV !== \"production\" ? ListSubheader.propTypes = {\n /**\n * The content of the component.\n */\n children: PropTypes.node,\n\n /**\n * Override or extend the styles applied to the component.\n * See [CSS API](#css) below for more details.\n */\n classes: PropTypes.object.isRequired,\n\n /**\n * @ignore\n */\n className: PropTypes.string,\n\n /**\n * The color of the component. It supports those theme colors that make sense for this component.\n */\n color: PropTypes.oneOf(['default', 'primary', 'inherit']),\n\n /**\n * The component used for the root node.\n * Either a string to use a HTML element or a component.\n */\n component: PropTypes\n /* @typescript-to-proptypes-ignore */\n .elementType,\n\n /**\n * If `true`, the List Subheader will not have gutters.\n */\n disableGutters: PropTypes.bool,\n\n /**\n * If `true`, the List Subheader will not stick to the top during scroll.\n */\n disableSticky: PropTypes.bool,\n\n /**\n * If `true`, the List Subheader will be indented.\n */\n inset: PropTypes.bool\n} : void 0;\nexport default withStyles(styles, {\n name: 'MuiListSubheader'\n})(ListSubheader);","import _extends from \"@babel/runtime/helpers/esm/extends\";\nimport _slicedToArray from \"@babel/runtime/helpers/esm/slicedToArray\";\nimport _objectWithoutProperties from \"@babel/runtime/helpers/esm/objectWithoutProperties\";\nimport * as React from 'react';\nimport PropTypes from 'prop-types';\nimport clsx from 'clsx';\nimport { refType } from '@material-ui/utils';\nimport useControlled from '../utils/useControlled';\nimport useFormControl from '../FormControl/useFormControl';\nimport withStyles from '../styles/withStyles';\nimport IconButton from '../IconButton';\nexport var styles = {\n root: {\n padding: 9\n },\n checked: {},\n disabled: {},\n input: {\n cursor: 'inherit',\n position: 'absolute',\n opacity: 0,\n width: '100%',\n height: '100%',\n top: 0,\n left: 0,\n margin: 0,\n padding: 0,\n zIndex: 1\n }\n};\n/**\n * @ignore - internal component.\n */\n\nvar SwitchBase = /*#__PURE__*/React.forwardRef(function SwitchBase(props, ref) {\n var autoFocus = props.autoFocus,\n checkedProp = props.checked,\n checkedIcon = props.checkedIcon,\n classes = props.classes,\n className = props.className,\n defaultChecked = props.defaultChecked,\n disabledProp = props.disabled,\n icon = props.icon,\n id = props.id,\n inputProps = props.inputProps,\n inputRef = props.inputRef,\n name = props.name,\n onBlur = props.onBlur,\n onChange = props.onChange,\n onFocus = props.onFocus,\n readOnly = props.readOnly,\n required = props.required,\n tabIndex = props.tabIndex,\n type = props.type,\n value = props.value,\n other = _objectWithoutProperties(props, [\"autoFocus\", \"checked\", \"checkedIcon\", \"classes\", \"className\", \"defaultChecked\", \"disabled\", \"icon\", \"id\", \"inputProps\", \"inputRef\", \"name\", \"onBlur\", \"onChange\", \"onFocus\", \"readOnly\", \"required\", \"tabIndex\", \"type\", \"value\"]);\n\n var _useControlled = useControlled({\n controlled: checkedProp,\n default: Boolean(defaultChecked),\n name: 'SwitchBase',\n state: 'checked'\n }),\n _useControlled2 = _slicedToArray(_useControlled, 2),\n checked = _useControlled2[0],\n setCheckedState = _useControlled2[1];\n\n var muiFormControl = useFormControl();\n\n var handleFocus = function handleFocus(event) {\n if (onFocus) {\n onFocus(event);\n }\n\n if (muiFormControl && muiFormControl.onFocus) {\n muiFormControl.onFocus(event);\n }\n };\n\n var handleBlur = function handleBlur(event) {\n if (onBlur) {\n onBlur(event);\n }\n\n if (muiFormControl && muiFormControl.onBlur) {\n muiFormControl.onBlur(event);\n }\n };\n\n var handleInputChange = function handleInputChange(event) {\n var newChecked = event.target.checked;\n setCheckedState(newChecked);\n\n if (onChange) {\n // TODO v5: remove the second argument.\n onChange(event, newChecked);\n }\n };\n\n var disabled = disabledProp;\n\n if (muiFormControl) {\n if (typeof disabled === 'undefined') {\n disabled = muiFormControl.disabled;\n }\n }\n\n var hasLabelFor = type === 'checkbox' || type === 'radio';\n return /*#__PURE__*/React.createElement(IconButton, _extends({\n component: \"span\",\n className: clsx(classes.root, className, checked && classes.checked, disabled && classes.disabled),\n disabled: disabled,\n tabIndex: null,\n role: undefined,\n onFocus: handleFocus,\n onBlur: handleBlur,\n ref: ref\n }, other), /*#__PURE__*/React.createElement(\"input\", _extends({\n autoFocus: autoFocus,\n checked: checkedProp,\n defaultChecked: defaultChecked,\n className: classes.input,\n disabled: disabled,\n id: hasLabelFor && id,\n name: name,\n onChange: handleInputChange,\n readOnly: readOnly,\n ref: inputRef,\n required: required,\n tabIndex: tabIndex,\n type: type,\n value: value\n }, inputProps)), checked ? checkedIcon : icon);\n}); // NB: If changed, please update Checkbox, Switch and Radio\n// so that the API documentation is updated.\n\nprocess.env.NODE_ENV !== \"production\" ? SwitchBase.propTypes = {\n /**\n * If `true`, the `input` element will be focused during the first mount.\n */\n autoFocus: PropTypes.bool,\n\n /**\n * If `true`, the component is checked.\n */\n checked: PropTypes.bool,\n\n /**\n * The icon to display when the component is checked.\n */\n checkedIcon: PropTypes.node.isRequired,\n\n /**\n * Override or extend the styles applied to the component.\n * See [CSS API](#css) below for more details.\n */\n classes: PropTypes.object.isRequired,\n\n /**\n * @ignore\n */\n className: PropTypes.string,\n\n /**\n * @ignore\n */\n defaultChecked: PropTypes.bool,\n\n /**\n * If `true`, the switch will be disabled.\n */\n disabled: PropTypes.bool,\n\n /**\n * The icon to display when the component is unchecked.\n */\n icon: PropTypes.node.isRequired,\n\n /**\n * The id of the `input` element.\n */\n id: PropTypes.string,\n\n /**\n * [Attributes](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#Attributes) applied to the `input` element.\n */\n inputProps: PropTypes.object,\n\n /**\n * Pass a ref to the `input` element.\n */\n inputRef: refType,\n\n /*\n * @ignore\n */\n name: PropTypes.string,\n\n /**\n * @ignore\n */\n onBlur: PropTypes.func,\n\n /**\n * Callback fired when the state is changed.\n *\n * @param {object} event The event source of the callback.\n * You can pull out the new checked state by accessing `event.target.checked` (boolean).\n */\n onChange: PropTypes.func,\n\n /**\n * @ignore\n */\n onFocus: PropTypes.func,\n\n /**\n * It prevents the user from changing the value of the field\n * (not from interacting with the field).\n */\n readOnly: PropTypes.bool,\n\n /**\n * If `true`, the `input` element will be required.\n */\n required: PropTypes.bool,\n\n /**\n * @ignore\n */\n tabIndex: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n\n /**\n * The input component prop `type`.\n */\n type: PropTypes.string.isRequired,\n\n /**\n * The value of the component.\n */\n value: PropTypes.any\n} : void 0;\nexport default withStyles(styles, {\n name: 'PrivateSwitchBase'\n})(SwitchBase);","'use strict';\n\n// do not edit .js files directly - edit src/index.jst\n\n\n\nmodule.exports = function equal(a, b) {\n if (a === b) return true;\n\n if (a && b && typeof a == 'object' && typeof b == 'object') {\n if (a.constructor !== b.constructor) return false;\n\n var length, i, keys;\n if (Array.isArray(a)) {\n length = a.length;\n if (length != b.length) return false;\n for (i = length; i-- !== 0;)\n if (!equal(a[i], b[i])) return false;\n return true;\n }\n\n\n\n if (a.constructor === RegExp) return a.source === b.source && a.flags === b.flags;\n if (a.valueOf !== Object.prototype.valueOf) return a.valueOf() === b.valueOf();\n if (a.toString !== Object.prototype.toString) return a.toString() === b.toString();\n\n keys = Object.keys(a);\n length = keys.length;\n if (length !== Object.keys(b).length) return false;\n\n for (i = length; i-- !== 0;)\n if (!Object.prototype.hasOwnProperty.call(b, keys[i])) return false;\n\n for (i = length; i-- !== 0;) {\n var key = keys[i];\n\n if (key === '_owner' && a.$$typeof) {\n // React-specific: avoid traversing React elements' _owner.\n // _owner contains circular references\n // and is not needed when comparing the actual elements (and not their owners)\n continue;\n }\n\n if (!equal(a[key], b[key])) return false;\n }\n\n return true;\n }\n\n // true if both NaN, false otherwise\n return a!==a && b!==b;\n};\n"],"names":["c","e","Array","RegExp","Object"],"mappings":"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"}
|