@backstage/core-components 0.9.4-next.2 → 0.9.5-next.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,52 @@
1
1
  # @backstage/core-components
2
2
 
3
+ ## 0.9.5-next.1
4
+
5
+ ### Patch Changes
6
+
7
+ - feb4e8de07: Fix EntityPage tab scrolling overflow bug on Firefox
8
+ - 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
9
+ - bff65e6958: The `SidebarPinStateContext` and `SidebarContext` have been deprecated and will be removed in a future release. Instead, use `<SidebarPinStateProvider>` + `useSidebarPinState()` and/or `<SidebarOpenStateProvider>` + `useSidebarOpenState()`.
10
+
11
+ This was done to ensure that sidebar state can be shared successfully across components exported by different packages, regardless of what version of this package is resolved and installed for each individual package.
12
+
13
+ - Updated dependencies
14
+ - @backstage/core-plugin-api@1.0.3-next.0
15
+
16
+ ## 0.9.5-next.0
17
+
18
+ ### Patch Changes
19
+
20
+ - 65840b17be: Fix issue where right arrow icon was incorrectly added to side bar items without a sub-menu
21
+ - 6968b65ba1: Updated dependency `@react-hookz/web` to `^14.0.0`.
22
+ - 96d1e01641: Accessibility updates:
23
+
24
+ - Added `aria-label` to the `Select` component
25
+ - Changed heading level used in the header of `Table` component
26
+
27
+ ## 0.9.4
28
+
29
+ ### Patch Changes
30
+
31
+ - ac19f82936: Added ARIA landmark <main> to Page component and added ARIA landmark <nav> to DesktopSidebar and Sidebar components
32
+ - 55f68c386a: Enabled select component to be enabled by keyboard
33
+ - c0055ece91: Announce external links to screen readers
34
+ - e210c0cab8: Add ability to customize `Read More` destination with `readMoreUrl` prop for `MissingAnnotationEmptyState` component.
35
+ - 52c02ac02b: Don't set the background color on an Avatar component that has a picture.
36
+ - cfc0f2e5bd: Added optional anchorOrigin alignment prop to AlertDisplay
37
+ - f4380eb602: Add an aria-label to the support button to improve accessibility for screen readers
38
+ - ba97b80421: Updated dependency `@types/react-syntax-highlighter` to `^15.0.0`.
39
+ - e462112be5: Updated dependency `rc-progress` to `3.3.2`.
40
+ - 2bcb0a0e2b: Sidebar NAV now includes aria-label. Component AboutField now uses h2 variant instead of subtitle2 (font properties unchanged)
41
+ - c7f32b53a4: Fixed multiple scrolls appearing on Page when added InfoCard with external bottom link
42
+ - 3603014e0e: Add ARIA landmark( <main>), & label and a heading to OAuthRequestDialog. Removed nested interactive control (button).
43
+ - 2025d7c123: Properly highlight `SidebarSubmenuItem` dropdown items on hover, use ellipsis styling on long labels in `SidebarSubmenu`, allow `icon` and `to` properties to be optional on `SidebarSubmenuItem`, and fix `SidebarPage` padding to be responsive to pinned state
44
+ - 2295b4ab2b: Add controls to Storybook stories
45
+ - 521293b22e: Added a chevron Indicator when the sidebar is collapsed and has a sub-menu
46
+ - Updated dependencies
47
+ - @backstage/core-plugin-api@1.0.2
48
+ - @backstage/config@1.0.1
49
+
3
50
  ## 0.9.4-next.2
4
51
 
5
52
  ### Patch Changes
package/dist/index.d.ts CHANGED
@@ -553,6 +553,7 @@ declare type EmptyStateImageClassKey = 'generalImg';
553
553
 
554
554
  declare type Props$g = {
555
555
  annotation: string;
556
+ readMoreUrl?: string;
556
557
  };
557
558
  declare type MissingAnnotationEmptyStateClassKey = 'code';
558
559
  declare function MissingAnnotationEmptyState(props: Props$g): JSX.Element;
@@ -1420,17 +1421,6 @@ declare const sidebarConfig: {
1420
1421
  mobileSidebarHeight: number;
1421
1422
  };
1422
1423
  declare const SIDEBAR_INTRO_LOCAL_STORAGE = "@backstage/core/sidebar-intro-dismissed";
1423
- /**
1424
- * Types for the `SidebarContext`
1425
- */
1426
- declare type SidebarContextType = {
1427
- isOpen: boolean;
1428
- setOpen: (open: boolean) => void;
1429
- };
1430
- /**
1431
- * Context whether the `Sidebar` is open
1432
- */
1433
- declare const SidebarContext: React.Context<SidebarContextType>;
1434
1424
 
1435
1425
  /** @public */
1436
1426
  declare type SidebarClassKey = 'drawer' | 'drawerOpen';
@@ -1551,16 +1541,6 @@ declare type SidebarSubmenuProps = {
1551
1541
  declare const SidebarSubmenu: (props: SidebarSubmenuProps) => JSX.Element;
1552
1542
 
1553
1543
  declare type SidebarPageClassKey = 'root';
1554
- /**
1555
- * Type of `SidebarPinStateContext`
1556
- *
1557
- * @public
1558
- */
1559
- declare type SidebarPinStateContextType = {
1560
- isPinned: boolean;
1561
- toggleSidebarPinState: () => any;
1562
- isMobile?: boolean;
1563
- };
1564
1544
  /**
1565
1545
  * Props for SidebarPage
1566
1546
  *
@@ -1569,12 +1549,6 @@ declare type SidebarPinStateContextType = {
1569
1549
  declare type SidebarPageProps = {
1570
1550
  children?: React__default.ReactNode;
1571
1551
  };
1572
- /**
1573
- * Contains the state on how the `Sidebar` is rendered
1574
- *
1575
- * @public
1576
- */
1577
- declare const SidebarPinStateContext: React__default.Context<SidebarPinStateContextType>;
1578
1552
  declare function SidebarPage(props: SidebarPageProps): JSX.Element;
1579
1553
  /**
1580
1554
  * This hook provides a react ref to the main content.
@@ -1611,6 +1585,7 @@ declare type SidebarItemBaseProps = {
1611
1585
  icon: IconComponent;
1612
1586
  text?: string;
1613
1587
  hasNotifications?: boolean;
1588
+ hasSubmenu?: boolean;
1614
1589
  disableHighlight?: boolean;
1615
1590
  className?: string;
1616
1591
  };
@@ -1677,6 +1652,114 @@ declare type IntroCardProps = {
1677
1652
  declare function IntroCard(props: IntroCardProps): JSX.Element;
1678
1653
  declare function SidebarIntro(_props: {}): JSX.Element | null;
1679
1654
 
1655
+ /**
1656
+ * Types for the `SidebarContext`
1657
+ *
1658
+ * @public @deprecated
1659
+ * Use `SidebarOpenState` instead.
1660
+ */
1661
+ declare type SidebarContextType = {
1662
+ isOpen: boolean;
1663
+ setOpen: (open: boolean) => void;
1664
+ };
1665
+ /**
1666
+ * The open state of the sidebar.
1667
+ *
1668
+ * @public
1669
+ */
1670
+ declare type SidebarOpenState = {
1671
+ /**
1672
+ * Whether or not the sidebar is open and full-width. When `false`, the
1673
+ * sidebar is "closed" and typically only shows icons with no text.
1674
+ */
1675
+ isOpen: boolean;
1676
+ /**
1677
+ * A function to set whether or not the sidebar is open. Pass `true` to open
1678
+ * the sidebar. Pass `false` to close it.
1679
+ */
1680
+ setOpen: (open: boolean) => void;
1681
+ };
1682
+ /**
1683
+ * Context whether the `Sidebar` is open
1684
+ *
1685
+ * @public @deprecated
1686
+ * Use `<SidebarContextProvider>` + `useSidebar()` instead.
1687
+ */
1688
+ declare const LegacySidebarContext: React__default.Context<SidebarContextType>;
1689
+ /**
1690
+ * Provides context for reading and updating sidebar state.
1691
+ *
1692
+ * @public
1693
+ */
1694
+ declare const SidebarOpenStateProvider: ({ children, value, }: {
1695
+ children: ReactNode;
1696
+ value: SidebarOpenState;
1697
+ }) => JSX.Element;
1698
+ /**
1699
+ * Hook to read and update the sidebar's open state, which controls whether or
1700
+ * not the sidebar is open and full-width, or closed and only displaying icons.
1701
+ *
1702
+ * @public
1703
+ */
1704
+ declare const useSidebarOpenState: () => SidebarOpenState;
1705
+
1706
+ /**
1707
+ * Type of `SidebarPinStateContext`
1708
+ *
1709
+ * @public @deprecated
1710
+ * Use `SidebarPinState` instead.
1711
+ */
1712
+ declare type SidebarPinStateContextType = {
1713
+ isPinned: boolean;
1714
+ toggleSidebarPinState: () => any;
1715
+ isMobile?: boolean;
1716
+ };
1717
+ /**
1718
+ * The pin state of the sidebar.
1719
+ *
1720
+ * @public
1721
+ */
1722
+ declare type SidebarPinState = {
1723
+ /**
1724
+ * Whether or not the sidebar is pinned to the `open` state. When `isPinned`
1725
+ * is `false`, the sidebar opens and closes on hover. When `true`, the
1726
+ * sidebar is permanently opened, regardless of user interaction.
1727
+ */
1728
+ isPinned: boolean;
1729
+ /**
1730
+ * A function to toggle the pin state of the sidebar.
1731
+ */
1732
+ toggleSidebarPinState: () => any;
1733
+ /**
1734
+ * Whether or not the sidebar is or should be rendered in a mobile-optimized
1735
+ * way.
1736
+ */
1737
+ isMobile?: boolean;
1738
+ };
1739
+ /**
1740
+ * Contains the state on how the `Sidebar` is rendered
1741
+ *
1742
+ * @public @deprecated
1743
+ * Use `<SidebarPinStateContextProvider>` + `useSidebarPinState()` instead.
1744
+ */
1745
+ declare const LegacySidebarPinStateContext: React__default.Context<SidebarPinStateContextType>;
1746
+ /**
1747
+ * Provides state for how the `Sidebar` is rendered
1748
+ *
1749
+ * @public
1750
+ */
1751
+ declare const SidebarPinStateProvider: ({ children, value, }: {
1752
+ children: ReactNode;
1753
+ value: SidebarPinStateContextType;
1754
+ }) => JSX.Element;
1755
+ /**
1756
+ * Hook to read and update sidebar pin state, which controls whether or not the
1757
+ * sidebar is pinned open.
1758
+ *
1759
+ * @public
1760
+ */
1761
+ declare const useSidebarPinState: () => SidebarPinState;
1762
+
1680
1763
  declare type SignInProviderConfig = {
1681
1764
  id: string;
1682
1765
  title: string;
@@ -1899,4 +1982,4 @@ declare type BackstageOverrides = Overrides & {
1899
1982
  [Name in keyof BackstageComponentsNameToClassKey]?: Partial<StyleRules<BackstageComponentsNameToClassKey[Name]>>;
1900
1983
  };
1901
1984
 
1902
- export { AlertDisplay, AlertDisplayProps, Avatar, AvatarClassKey, AvatarProps, BackstageContentClassKey, BackstageOverrides, BoldHeaderClassKey, BottomLink, BottomLinkClassKey, BottomLinkProps, Breadcrumbs, BreadcrumbsClickableTextClassKey, BreadcrumbsStyledBoxClassKey, BrokenImageIcon, Button, ButtonProps, CardActionsTopRightClassKey, CardTab, CardTabClassKey, CatalogIcon, ChatIcon, ClosedDropdownClassKey, CodeSnippet, CodeSnippetProps, Content, ContentHeader, ContentHeaderClassKey, CopyTextButton, CopyTextButtonProps, CreateButton, CreateButtonProps, CustomProviderClassKey, DashboardIcon, DependencyGraph, DependencyGraphDefaultLabelClassKey, DependencyGraphDefaultNodeClassKey, DependencyGraphEdgeClassKey, DependencyGraphNodeClassKey, DependencyGraphProps, types_d as DependencyGraphTypes, DismissableBanner, DismissableBannerClassKey, DismissbleBannerClassKey, DocsIcon, EmailIcon, EmptyState, EmptyStateClassKey, EmptyStateImageClassKey, ErrorBoundary, ErrorBoundaryProps, ErrorPage, ErrorPageClassKey, ErrorPanel, ErrorPanelClassKey, ErrorPanelProps, FeatureCalloutCircleClassKey, FeatureCalloutCircular, FiltersContainerClassKey, Gauge, GaugeCard, GaugeCardClassKey, GaugeClassKey, GaugeProps, GaugePropsGetColor, GaugePropsGetColorOptions, GitHubIcon, GroupIcon, Header, HeaderClassKey, HeaderIconLinkRow, HeaderIconLinkRowClassKey, HeaderLabel, HeaderLabelClassKey, HeaderTabs, HeaderTabsClassKey, HelpIcon, HomepageTimer, HorizontalScrollGrid, HorizontalScrollGridClassKey, IconLinkVerticalClassKey, IconLinkVerticalProps, IdentityProviders, InfoCard, InfoCardClassKey, InfoCardVariants, IntroCard, ItemCard, ItemCardGrid, ItemCardGridClassKey, ItemCardGridProps, ItemCardHeader, ItemCardHeaderClassKey, ItemCardHeaderProps, Lifecycle, LifecycleClassKey, LinearGauge, Link, LinkProps, LogViewer, LogViewerClassKey, LogViewerProps, LoginRequestListItemClassKey, MarkdownContent, MarkdownContentClassKey, MetadataTableCellClassKey, MetadataTableListClassKey, MetadataTableListItemClassKey, MetadataTableTitleCellClassKey, MicDropClassKey, MissingAnnotationEmptyState, MissingAnnotationEmptyStateClassKey, MobileSidebar, MobileSidebarProps, OAuthRequestDialog, OAuthRequestDialogClassKey, OpenedDropdownClassKey, OverflowTooltip, OverflowTooltipClassKey, Page, PageClassKey, PageWithHeader, Progress, ProxiedSignInPage, ProxiedSignInPageProps, ResponseErrorPanel, ResponseErrorPanelClassKey, RoutedTabs, SIDEBAR_INTRO_LOCAL_STORAGE, SelectComponent as Select, SelectClassKey, SelectInputBaseClassKey, SelectItem, SelectedItems, Sidebar, SidebarClassKey, SidebarContext, SidebarContextType, SidebarDivider, SidebarDividerClassKey, SidebarExpandButton, SidebarGroup, SidebarGroupProps, SidebarIntro, SidebarIntroClassKey, SidebarItem, SidebarItemClassKey, SidebarOptions, SidebarPage, SidebarPageClassKey, SidebarPageProps, SidebarPinStateContext, SidebarPinStateContextType, SidebarProps, SidebarScrollWrapper, SidebarSearchField, SidebarSpace, SidebarSpaceClassKey, SidebarSpacer, SidebarSpacerClassKey, SidebarSubmenu, SidebarSubmenuItem, SidebarSubmenuItemDropdownItem, SidebarSubmenuItemProps, SidebarSubmenuProps, SignInPage, SignInPageClassKey, SignInProviderConfig, SimpleStepper, SimpleStepperFooterClassKey, SimpleStepperStep, SimpleStepperStepClassKey, StatusAborted, StatusClassKey, StatusError, StatusOK, StatusPending, StatusRunning, StatusWarning, StructuredMetadataTable, StructuredMetadataTableListClassKey, StructuredMetadataTableNestedListClassKey, SubmenuOptions, SubvalueCell, SubvalueCellClassKey, SupportButton, SupportButtonClassKey, SupportConfig, SupportItem, SupportItemLink, Tab, TabBarClassKey, TabClassKey, TabIconClassKey, TabbedCard, TabbedCardClassKey, TabbedLayout, Table, TableClassKey, TableColumn, TableFilter, TableFiltersClassKey, TableHeaderClassKey, TableProps, TableState, TableToolbarClassKey, Tabs, TabsClassKey, TrendLine, UserIcon, UserIdentity, WarningIcon, WarningPanel, WarningPanelClassKey, sidebarConfig, useContent, useQueryParamState, useSupportConfig };
1985
+ export { AlertDisplay, AlertDisplayProps, Avatar, AvatarClassKey, AvatarProps, BackstageContentClassKey, BackstageOverrides, BoldHeaderClassKey, BottomLink, BottomLinkClassKey, BottomLinkProps, Breadcrumbs, BreadcrumbsClickableTextClassKey, BreadcrumbsStyledBoxClassKey, BrokenImageIcon, Button, ButtonProps, CardActionsTopRightClassKey, CardTab, CardTabClassKey, CatalogIcon, ChatIcon, ClosedDropdownClassKey, CodeSnippet, CodeSnippetProps, Content, ContentHeader, ContentHeaderClassKey, CopyTextButton, CopyTextButtonProps, CreateButton, CreateButtonProps, CustomProviderClassKey, DashboardIcon, DependencyGraph, DependencyGraphDefaultLabelClassKey, DependencyGraphDefaultNodeClassKey, DependencyGraphEdgeClassKey, DependencyGraphNodeClassKey, DependencyGraphProps, types_d as DependencyGraphTypes, DismissableBanner, DismissableBannerClassKey, DismissbleBannerClassKey, DocsIcon, EmailIcon, EmptyState, EmptyStateClassKey, EmptyStateImageClassKey, ErrorBoundary, ErrorBoundaryProps, ErrorPage, ErrorPageClassKey, ErrorPanel, ErrorPanelClassKey, ErrorPanelProps, FeatureCalloutCircleClassKey, FeatureCalloutCircular, FiltersContainerClassKey, Gauge, GaugeCard, GaugeCardClassKey, GaugeClassKey, GaugeProps, GaugePropsGetColor, GaugePropsGetColorOptions, GitHubIcon, GroupIcon, Header, HeaderClassKey, HeaderIconLinkRow, HeaderIconLinkRowClassKey, HeaderLabel, HeaderLabelClassKey, HeaderTabs, HeaderTabsClassKey, HelpIcon, HomepageTimer, HorizontalScrollGrid, HorizontalScrollGridClassKey, IconLinkVerticalClassKey, IconLinkVerticalProps, IdentityProviders, InfoCard, InfoCardClassKey, InfoCardVariants, IntroCard, ItemCard, ItemCardGrid, ItemCardGridClassKey, ItemCardGridProps, ItemCardHeader, ItemCardHeaderClassKey, ItemCardHeaderProps, Lifecycle, LifecycleClassKey, LinearGauge, Link, LinkProps, LogViewer, LogViewerClassKey, LogViewerProps, LoginRequestListItemClassKey, MarkdownContent, MarkdownContentClassKey, MetadataTableCellClassKey, MetadataTableListClassKey, MetadataTableListItemClassKey, MetadataTableTitleCellClassKey, MicDropClassKey, MissingAnnotationEmptyState, MissingAnnotationEmptyStateClassKey, MobileSidebar, MobileSidebarProps, OAuthRequestDialog, OAuthRequestDialogClassKey, OpenedDropdownClassKey, OverflowTooltip, OverflowTooltipClassKey, Page, PageClassKey, PageWithHeader, Progress, ProxiedSignInPage, ProxiedSignInPageProps, ResponseErrorPanel, ResponseErrorPanelClassKey, RoutedTabs, SIDEBAR_INTRO_LOCAL_STORAGE, SelectComponent as Select, SelectClassKey, SelectInputBaseClassKey, SelectItem, SelectedItems, Sidebar, SidebarClassKey, LegacySidebarContext as SidebarContext, SidebarContextType, SidebarDivider, SidebarDividerClassKey, SidebarExpandButton, SidebarGroup, SidebarGroupProps, SidebarIntro, SidebarIntroClassKey, SidebarItem, SidebarItemClassKey, SidebarOpenState, SidebarOpenStateProvider, SidebarOptions, SidebarPage, SidebarPageClassKey, SidebarPageProps, SidebarPinState, LegacySidebarPinStateContext as SidebarPinStateContext, SidebarPinStateContextType, SidebarPinStateProvider, SidebarProps, SidebarScrollWrapper, SidebarSearchField, SidebarSpace, SidebarSpaceClassKey, SidebarSpacer, SidebarSpacerClassKey, SidebarSubmenu, SidebarSubmenuItem, SidebarSubmenuItemDropdownItem, SidebarSubmenuItemProps, SidebarSubmenuProps, SignInPage, SignInPageClassKey, SignInProviderConfig, SimpleStepper, SimpleStepperFooterClassKey, SimpleStepperStep, SimpleStepperStepClassKey, StatusAborted, StatusClassKey, StatusError, StatusOK, StatusPending, StatusRunning, StatusWarning, StructuredMetadataTable, StructuredMetadataTableListClassKey, StructuredMetadataTableNestedListClassKey, SubmenuOptions, SubvalueCell, SubvalueCellClassKey, SupportButton, SupportButtonClassKey, SupportConfig, SupportItem, SupportItemLink, Tab, TabBarClassKey, TabClassKey, TabIconClassKey, TabbedCard, TabbedCardClassKey, TabbedLayout, Table, TableClassKey, TableColumn, TableFilter, TableFiltersClassKey, TableHeaderClassKey, TableProps, TableState, TableToolbarClassKey, Tabs, TabsClassKey, TrendLine, UserIcon, UserIdentity, WarningIcon, WarningPanel, WarningPanelClassKey, sidebarConfig, useContent, useQueryParamState, useSidebarOpenState, useSidebarPinState, useSupportConfig };
package/dist/index.esm.js CHANGED
@@ -8,6 +8,7 @@ import pluralize from 'pluralize';
8
8
  import { makeStyles, createStyles, useTheme, darken, lighten, withStyles, styled, ThemeProvider } from '@material-ui/core/styles';
9
9
  import MaterialAvatar from '@material-ui/core/Avatar';
10
10
  import Button$1 from '@material-ui/core/Button';
11
+ import classNames from 'classnames';
11
12
  import Link$1 from '@material-ui/core/Link';
12
13
  import { Link as Link$2, useSearchParams, useLocation, useResolvedPath, resolvePath } from 'react-router-dom';
13
14
  import Tooltip from '@material-ui/core/Tooltip';
@@ -27,7 +28,6 @@ import makeStyles$1 from '@material-ui/core/styles/makeStyles';
27
28
  import * as d3Shape from 'd3-shape';
28
29
  import isFinite from 'lodash/isFinite';
29
30
  import useObservable from 'react-use/lib/useObservable';
30
- import classNames from 'classnames';
31
31
  import SnackbarContent from '@material-ui/core/SnackbarContent';
32
32
  import Grid from '@material-ui/core/Grid';
33
33
  import Typography from '@material-ui/core/Typography';
@@ -91,6 +91,7 @@ import qs from 'qs';
91
91
  import MuiBrokenImageIcon from '@material-ui/icons/BrokenImage';
92
92
  import { Helmet } from 'react-helmet';
93
93
  import { useLocation as useLocation$1, useNavigate, useParams, useRoutes, matchRoutes } from 'react-router';
94
+ import { createVersionedContext, createVersionedValueMap } from '@backstage/version-bridge';
94
95
  import BottomNavigation from '@material-ui/core/BottomNavigation';
95
96
  import Drawer from '@material-ui/core/Drawer';
96
97
  import MenuIcon from '@material-ui/icons/Menu';
@@ -217,6 +218,9 @@ const useStyles$R = makeStyles({
217
218
  whiteSpace: "nowrap",
218
219
  height: 1,
219
220
  width: 1
221
+ },
222
+ externalLink: {
223
+ position: "relative"
220
224
  }
221
225
  }, { name: "Link" });
222
226
  const isExternalUri = (uri) => /^([a-z+.-]+):/.test(uri);
@@ -251,7 +255,8 @@ const Link = React.forwardRef(({ onClick, noTrack, ...props }, ref) => {
251
255
  href: to,
252
256
  onClick: handleClick,
253
257
  ...newWindow ? { target: "_blank", rel: "noopener" } : {},
254
- ...props
258
+ ...props,
259
+ className: classNames(classes.externalLink, props.className)
255
260
  }, props.children, /* @__PURE__ */ React.createElement("span", {
256
261
  className: classes.visuallyHidden
257
262
  }, ", Opens in a new window")) : /* @__PURE__ */ React.createElement(Link$1, {
@@ -946,7 +951,8 @@ const useStyles$J = makeStyles((theme) => ({
946
951
  }
947
952
  }), { name: "BackstageMissingAnnotationEmptyState" });
948
953
  function MissingAnnotationEmptyState(props) {
949
- const { annotation } = props;
954
+ const { annotation, readMoreUrl } = props;
955
+ const url = readMoreUrl || "https://backstage.io/docs/features/software-catalog/well-known-annotations";
950
956
  const classes = useStyles$J();
951
957
  const description = /* @__PURE__ */ React.createElement(React.Fragment, null, "The ", /* @__PURE__ */ React.createElement("code", null, annotation), " annotation is missing. You need to add the annotation to your component if you want to enable this tool.");
952
958
  return /* @__PURE__ */ React.createElement(EmptyState, {
@@ -966,7 +972,7 @@ function MissingAnnotationEmptyState(props) {
966
972
  })), /* @__PURE__ */ React.createElement(Button$1, {
967
973
  color: "primary",
968
974
  component: Link,
969
- to: "https://backstage.io/docs/features/software-catalog/well-known-annotations"
975
+ to: url
970
976
  }, "Read more"))
971
977
  });
972
978
  }
@@ -2355,6 +2361,7 @@ function SelectComponent(props) {
2355
2361
  }, /* @__PURE__ */ React.createElement(InputLabel, {
2356
2362
  className: classes.formLabel
2357
2363
  }, label), /* @__PURE__ */ React.createElement(Select, {
2364
+ "aria-label": label,
2358
2365
  value,
2359
2366
  native,
2360
2367
  disabled,
@@ -3049,11 +3056,6 @@ const makeSidebarSubmenuConfig = (customSubmenuConfig) => ({
3049
3056
  ...customSubmenuConfig
3050
3057
  });
3051
3058
  const SIDEBAR_INTRO_LOCAL_STORAGE = "@backstage/core/sidebar-intro-dismissed";
3052
- const SidebarContext = createContext({
3053
- isOpen: false,
3054
- setOpen: () => {
3055
- }
3056
- });
3057
3059
  const SidebarConfigContext = createContext({
3058
3060
  sidebarConfig,
3059
3061
  submenuConfig
@@ -3079,6 +3081,35 @@ const LocalStorage = {
3079
3081
  }
3080
3082
  };
3081
3083
 
3084
+ const defaultSidebarPinStateContext = {
3085
+ isPinned: true,
3086
+ toggleSidebarPinState: () => {
3087
+ },
3088
+ isMobile: false
3089
+ };
3090
+ const LegacySidebarPinStateContext = createContext(defaultSidebarPinStateContext);
3091
+ const VersionedSidebarPinStateContext = createVersionedContext("sidebar-pin-state-context");
3092
+ const SidebarPinStateProvider = ({
3093
+ children,
3094
+ value
3095
+ }) => /* @__PURE__ */ React.createElement(LegacySidebarPinStateContext.Provider, {
3096
+ value
3097
+ }, /* @__PURE__ */ React.createElement(VersionedSidebarPinStateContext.Provider, {
3098
+ value: createVersionedValueMap({ 1: value })
3099
+ }, children));
3100
+ const useSidebarPinState = () => {
3101
+ const versionedPinStateContext = useContext(VersionedSidebarPinStateContext);
3102
+ const legacyPinStateContext = useContext(LegacySidebarPinStateContext);
3103
+ if (versionedPinStateContext === void 0) {
3104
+ return legacyPinStateContext || defaultSidebarPinStateContext;
3105
+ }
3106
+ const pinStateContext = versionedPinStateContext.atVersion(1);
3107
+ if (pinStateContext === void 0) {
3108
+ throw new Error("No context found for version 1.");
3109
+ }
3110
+ return pinStateContext;
3111
+ };
3112
+
3082
3113
  const useStyles$n = makeStyles((theme) => ({
3083
3114
  root: {
3084
3115
  width: "100%",
@@ -3099,12 +3130,6 @@ const useStyles$n = makeStyles((theme) => ({
3099
3130
  }
3100
3131
  }
3101
3132
  }), { name: "BackstageSidebarPage" });
3102
- const SidebarPinStateContext = createContext({
3103
- isPinned: true,
3104
- toggleSidebarPinState: () => {
3105
- },
3106
- isMobile: false
3107
- });
3108
3133
  const PageContext = createContext({
3109
3134
  content: {
3110
3135
  contentRef: void 0
@@ -3125,7 +3150,7 @@ function SidebarPage(props) {
3125
3150
  const isMobile = useMediaQuery((theme) => theme.breakpoints.down("xs"), { noSsr: true });
3126
3151
  const toggleSidebarPinState = () => setIsPinned(!isPinned);
3127
3152
  const classes = useStyles$n({ isPinned, sidebarConfig });
3128
- return /* @__PURE__ */ React.createElement(SidebarPinStateContext.Provider, {
3153
+ return /* @__PURE__ */ React.createElement(SidebarPinStateProvider, {
3129
3154
  value: {
3130
3155
  isPinned,
3131
3156
  toggleSidebarPinState,
@@ -3146,6 +3171,34 @@ function useContent() {
3146
3171
  return { focusContent, contentRef: content == null ? void 0 : content.contentRef };
3147
3172
  }
3148
3173
 
3174
+ const defaultSidebarOpenStateContext = {
3175
+ isOpen: false,
3176
+ setOpen: () => {
3177
+ }
3178
+ };
3179
+ const LegacySidebarContext = createContext(defaultSidebarOpenStateContext);
3180
+ const VersionedSidebarContext = createVersionedContext("sidebar-open-state-context");
3181
+ const SidebarOpenStateProvider = ({
3182
+ children,
3183
+ value
3184
+ }) => /* @__PURE__ */ React.createElement(LegacySidebarContext.Provider, {
3185
+ value
3186
+ }, /* @__PURE__ */ React.createElement(VersionedSidebarContext.Provider, {
3187
+ value: createVersionedValueMap({ 1: value })
3188
+ }, children));
3189
+ const useSidebarOpenState = () => {
3190
+ const versionedOpenStateContext = useContext(VersionedSidebarContext);
3191
+ const legacyOpenStateContext = useContext(LegacySidebarContext);
3192
+ if (versionedOpenStateContext === void 0) {
3193
+ return legacyOpenStateContext || defaultSidebarOpenStateContext;
3194
+ }
3195
+ const openStateContext = versionedOpenStateContext.atVersion(1);
3196
+ if (openStateContext === void 0) {
3197
+ throw new Error("No context found for version 1.");
3198
+ }
3199
+ return openStateContext;
3200
+ };
3201
+
3149
3202
  const useStyles$m = makeStyles((theme) => ({
3150
3203
  root: {
3151
3204
  flexGrow: 0,
@@ -3188,7 +3241,7 @@ const MobileSidebarGroup = (props) => {
3188
3241
  };
3189
3242
  const SidebarGroup = (props) => {
3190
3243
  const { children, to, label, icon, value } = props;
3191
- const { isMobile } = useContext(SidebarPinStateContext);
3244
+ const { isMobile } = useSidebarPinState();
3192
3245
  return isMobile ? /* @__PURE__ */ React.createElement(MobileSidebarGroup, {
3193
3246
  to,
3194
3247
  label,
@@ -3288,7 +3341,7 @@ const MobileSidebar = (props) => {
3288
3341
  sidebarGroups = sortSidebarGroupsForPriority(sidebarGroups);
3289
3342
  }
3290
3343
  const shouldShowGroupChildren = selectedMenuItemIndex >= 0 && !sidebarGroups[selectedMenuItemIndex].props.to;
3291
- return /* @__PURE__ */ React.createElement(SidebarContext.Provider, {
3344
+ return /* @__PURE__ */ React.createElement(SidebarOpenStateProvider, {
3292
3345
  value: { isOpen: true, setOpen: () => {
3293
3346
  } }
3294
3347
  }, /* @__PURE__ */ React.createElement(MobileSidebarContext.Provider, {
@@ -3359,7 +3412,7 @@ const DesktopSidebar = (props) => {
3359
3412
  const isSmallScreen = useMediaQuery((theme) => theme.breakpoints.down("md"), { noSsr: true });
3360
3413
  const [state, setState] = useState(0 /* Closed */);
3361
3414
  const hoverTimerRef = useRef();
3362
- const { isPinned, toggleSidebarPinState } = useContext(SidebarPinStateContext);
3415
+ const { isPinned, toggleSidebarPinState } = useSidebarPinState();
3363
3416
  const handleOpen = () => {
3364
3417
  if (isPinned || disableExpandOnHover) {
3365
3418
  return;
@@ -3406,7 +3459,7 @@ const DesktopSidebar = (props) => {
3406
3459
  return /* @__PURE__ */ React.createElement("nav", {
3407
3460
  style: {},
3408
3461
  "aria-label": "sidebar nav"
3409
- }, /* @__PURE__ */ React.createElement(A11ySkipSidebar, null), /* @__PURE__ */ React.createElement(SidebarContext.Provider, {
3462
+ }, /* @__PURE__ */ React.createElement(A11ySkipSidebar, null), /* @__PURE__ */ React.createElement(SidebarOpenStateProvider, {
3410
3463
  value: { isOpen, setOpen }
3411
3464
  }, /* @__PURE__ */ React.createElement("div", {
3412
3465
  className: classes.root,
@@ -3430,7 +3483,7 @@ const Sidebar = (props) => {
3430
3483
  const sidebarConfig = makeSidebarConfig((_a = props.sidebarOptions) != null ? _a : {});
3431
3484
  const submenuConfig = makeSidebarSubmenuConfig((_b = props.submenuOptions) != null ? _b : {});
3432
3485
  const { children, disableExpandOnHover, openDelayMs, closeDelayMs } = props;
3433
- const { isMobile } = useContext(SidebarPinStateContext);
3486
+ const { isMobile } = useSidebarPinState();
3434
3487
  return isMobile ? /* @__PURE__ */ React.createElement(MobileSidebar, null, children) : /* @__PURE__ */ React.createElement(SidebarConfigContext.Provider, {
3435
3488
  value: { sidebarConfig, submenuConfig }
3436
3489
  }, /* @__PURE__ */ React.createElement(DesktopSidebar, {
@@ -3657,7 +3710,7 @@ const useStyles$i = makeStyles((theme) => ({
3657
3710
  }
3658
3711
  }), { name: "BackstageSidebarSubmenu" });
3659
3712
  const SidebarSubmenu = (props) => {
3660
- const { isOpen } = useContext(SidebarContext);
3713
+ const { isOpen } = useSidebarOpenState();
3661
3714
  const { sidebarConfig, submenuConfig } = useContext(SidebarConfigContext);
3662
3715
  const left = isOpen ? sidebarConfig.drawerWidthOpen : sidebarConfig.drawerWidthClosed;
3663
3716
  const classes = useStyles$i({ left, submenuConfig });
@@ -3899,6 +3952,7 @@ const SidebarItemBase = forwardRef((props, ref) => {
3899
3952
  icon: Icon,
3900
3953
  text,
3901
3954
  hasNotifications = false,
3955
+ hasSubmenu = false,
3902
3956
  disableHighlight = false,
3903
3957
  onClick,
3904
3958
  children,
@@ -3907,16 +3961,20 @@ const SidebarItemBase = forwardRef((props, ref) => {
3907
3961
  } = props;
3908
3962
  const { sidebarConfig } = useContext(SidebarConfigContext);
3909
3963
  const classes = useMemoStyles(sidebarConfig);
3910
- const { isOpen } = useContext(SidebarContext);
3964
+ const { isOpen } = useSidebarOpenState();
3965
+ const divStyle = !isOpen && hasSubmenu ? { display: "flex", marginLeft: "24px" } : {};
3966
+ const displayItemIcon = /* @__PURE__ */ React.createElement("div", {
3967
+ style: divStyle
3968
+ }, /* @__PURE__ */ React.createElement(Icon, {
3969
+ fontSize: "small"
3970
+ }), !isOpen && hasSubmenu ? /* @__PURE__ */ React.createElement(ArrowRightIcon, null) : /* @__PURE__ */ React.createElement(React.Fragment, null));
3911
3971
  const itemIcon = /* @__PURE__ */ React.createElement(Badge, {
3912
3972
  color: "secondary",
3913
3973
  variant: "dot",
3914
3974
  overlap: "circular",
3915
3975
  invisible: !hasNotifications,
3916
3976
  className: classNames({ [classes.closedItemIcon]: !isOpen })
3917
- }, /* @__PURE__ */ React.createElement(Icon, {
3918
- fontSize: "small"
3919
- }));
3977
+ }, displayItemIcon);
3920
3978
  const openContent = /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement("div", {
3921
3979
  "data-testid": "login-button",
3922
3980
  className: classes.iconContainer
@@ -3990,6 +4048,7 @@ const SidebarItemWithSubmenu = ({
3990
4048
  onMouseEnter: handleMouseEnter,
3991
4049
  className: classNames(isHoveredOn && classes.highlighted)
3992
4050
  }, /* @__PURE__ */ React.createElement(SidebarItemBase, {
4051
+ hasSubmenu: true,
3993
4052
  className: isActive ? classes.selected : "",
3994
4053
  ...props
3995
4054
  }, arrowIcon()), isHoveredOn && children));
@@ -4095,7 +4154,7 @@ const SidebarScrollWrapper = styled("div")(({ theme }) => {
4095
4154
  const SidebarExpandButton = () => {
4096
4155
  const { sidebarConfig } = useContext(SidebarConfigContext);
4097
4156
  const classes = useMemoStyles(sidebarConfig);
4098
- const { isOpen, setOpen } = useContext(SidebarContext);
4157
+ const { isOpen, setOpen } = useSidebarOpenState();
4099
4158
  const isSmallScreen = useMediaQuery((theme) => theme.breakpoints.down("md"), { noSsr: true });
4100
4159
  if (isSmallScreen) {
4101
4160
  return null;
@@ -4195,7 +4254,7 @@ const starredIntroText = `Fun fact! As you explore all the awesome plugins in Ba
4195
4254
  Keep an eye out for the little star icon (\u2B50) next to the plugin name and give it a click!`;
4196
4255
  const recentlyViewedIntroText = "And your recently viewed plugins will pop up here!";
4197
4256
  function SidebarIntro(_props) {
4198
- const { isOpen } = useContext(SidebarContext);
4257
+ const { isOpen } = useSidebarOpenState();
4199
4258
  const defaultValue = {
4200
4259
  starredItemsDismissed: false,
4201
4260
  recentlyViewedItemsDismissed: false
@@ -4269,7 +4328,8 @@ const useStyles$d = makeStyles((theme) => ({
4269
4328
  tabsWrapper: {
4270
4329
  gridArea: "pageSubheader",
4271
4330
  backgroundColor: theme.palette.background.paper,
4272
- paddingLeft: theme.spacing(3)
4331
+ paddingLeft: theme.spacing(3),
4332
+ minWidth: 0
4273
4333
  },
4274
4334
  defaultTab: {
4275
4335
  padding: theme.spacing(3, 3),
@@ -4814,7 +4874,7 @@ function Table(props) {
4814
4874
  icons: tableIcons,
4815
4875
  title: /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(Typography, {
4816
4876
  variant: "h5",
4817
- component: "h3"
4877
+ component: "h2"
4818
4878
  }, title), subtitle && /* @__PURE__ */ React.createElement(Typography, {
4819
4879
  color: "textSecondary",
4820
4880
  variant: "body1"
@@ -5568,7 +5628,7 @@ const useStyles$1 = makeStyles(() => ({
5568
5628
  }), { name: "BackstagePage" });
5569
5629
  function Page(props) {
5570
5630
  const { themeId, children } = props;
5571
- const { isMobile } = useContext(SidebarPinStateContext);
5631
+ const { isMobile } = useSidebarPinState();
5572
5632
  const classes = useStyles$1({ isMobile });
5573
5633
  return /* @__PURE__ */ React.createElement(ThemeProvider, {
5574
5634
  theme: (baseTheme) => ({
@@ -6368,5 +6428,5 @@ function CardTab(props) {
6368
6428
  });
6369
6429
  }
6370
6430
 
6371
- export { AlertDisplay, Avatar, BottomLink, Breadcrumbs, BrokenImageIcon, Button, CardTab, CatalogIcon, ChatIcon, CodeSnippet, Content, ContentHeader, CopyTextButton, CreateButton, DashboardIcon, DependencyGraph, types as DependencyGraphTypes, DismissableBanner, DocsIcon, EmailIcon, EmptyState, ErrorBoundary, ErrorPage, ErrorPanel, FeatureCalloutCircular, Gauge, GaugeCard, GitHubIcon, GroupIcon, Header, HeaderIconLinkRow, HeaderLabel, HeaderTabs, HelpIcon, HomepageTimer, HorizontalScrollGrid, InfoCard, IntroCard, ItemCard, ItemCardGrid, ItemCardHeader, Lifecycle, LinearGauge, Link, LogViewer, MarkdownContent, MissingAnnotationEmptyState, MobileSidebar, OAuthRequestDialog, OverflowTooltip, Page, PageWithHeader, Progress, ProxiedSignInPage, ResponseErrorPanel, RoutedTabs, SIDEBAR_INTRO_LOCAL_STORAGE, SelectComponent as Select, Sidebar, SidebarContext, SidebarDivider, SidebarExpandButton, SidebarGroup, SidebarIntro, SidebarItem, SidebarPage, SidebarPinStateContext, SidebarScrollWrapper, SidebarSearchField, SidebarSpace, SidebarSpacer, SidebarSubmenu, SidebarSubmenuItem, SignInPage, SimpleStepper, SimpleStepperStep, StatusAborted, StatusError, StatusOK, StatusPending, StatusRunning, StatusWarning, StructuredMetadataTable, SubvalueCell, SupportButton, TabbedCard, TabbedLayout, Table, Tabs, TrendLine, UserIcon, UserIdentity, WarningIcon, WarningPanel, sidebarConfig, useContent, useQueryParamState, useSupportConfig };
6431
+ export { AlertDisplay, Avatar, BottomLink, Breadcrumbs, BrokenImageIcon, Button, CardTab, CatalogIcon, ChatIcon, CodeSnippet, Content, ContentHeader, CopyTextButton, CreateButton, DashboardIcon, DependencyGraph, types as DependencyGraphTypes, DismissableBanner, DocsIcon, EmailIcon, EmptyState, ErrorBoundary, ErrorPage, ErrorPanel, FeatureCalloutCircular, Gauge, GaugeCard, GitHubIcon, GroupIcon, Header, HeaderIconLinkRow, HeaderLabel, HeaderTabs, HelpIcon, HomepageTimer, HorizontalScrollGrid, InfoCard, IntroCard, ItemCard, ItemCardGrid, ItemCardHeader, Lifecycle, LinearGauge, Link, LogViewer, MarkdownContent, MissingAnnotationEmptyState, MobileSidebar, OAuthRequestDialog, OverflowTooltip, Page, PageWithHeader, Progress, ProxiedSignInPage, ResponseErrorPanel, RoutedTabs, SIDEBAR_INTRO_LOCAL_STORAGE, SelectComponent as Select, Sidebar, LegacySidebarContext as SidebarContext, SidebarDivider, SidebarExpandButton, SidebarGroup, SidebarIntro, SidebarItem, SidebarOpenStateProvider, SidebarPage, LegacySidebarPinStateContext as SidebarPinStateContext, SidebarPinStateProvider, SidebarScrollWrapper, SidebarSearchField, SidebarSpace, SidebarSpacer, SidebarSubmenu, SidebarSubmenuItem, SignInPage, SimpleStepper, SimpleStepperStep, StatusAborted, StatusError, StatusOK, StatusPending, StatusRunning, StatusWarning, StructuredMetadataTable, SubvalueCell, SupportButton, TabbedCard, TabbedLayout, Table, Tabs, TrendLine, UserIcon, UserIdentity, WarningIcon, WarningPanel, sidebarConfig, useContent, useQueryParamState, useSidebarOpenState, useSidebarPinState, useSupportConfig };
6372
6432
  //# sourceMappingURL=index.esm.js.map