diff --git a/public/app/core/components/NavBar/NavBarItemMenuItem.tsx b/public/app/core/components/NavBar/NavBarItemMenuItem.tsx index 27bb08ec988..4508e7f171c 100644 --- a/public/app/core/components/NavBar/NavBarItemMenuItem.tsx +++ b/public/app/core/components/NavBar/NavBarItemMenuItem.tsx @@ -9,7 +9,6 @@ import { mergeProps } from '@react-aria/utils'; import { Node } from '@react-types/shared'; import { useNavBarItemMenuContext } from './context'; -import { UpgradeBox } from '../Upgrade/UpgradeBox'; export interface NavBarItemMenuItemProps { item: Node; @@ -61,11 +60,6 @@ export function NavBarItemMenuItem({ item, state, onNavigate }: NavBarItemMenuIt
  • {rendered}
  • - {item.value.highlightText && ( -
  • - -
  • - )} ); } diff --git a/public/app/core/components/NavBar/NavBarItemMenuTrigger.tsx b/public/app/core/components/NavBar/NavBarItemMenuTrigger.tsx index 8d532e840b9..7d85be8a65b 100644 --- a/public/app/core/components/NavBar/NavBarItemMenuTrigger.tsx +++ b/public/app/core/components/NavBar/NavBarItemMenuTrigger.tsx @@ -73,12 +73,14 @@ export function NavBarItemMenuTrigger(props: NavBarItemMenuTriggerProps): ReactE // Get props for the button based on the trigger props from useMenuTrigger const { buttonProps } = useButton(menuTriggerProps, ref); - - const buttonContent = ( - - {item?.icon && } - {item?.img && {`${item.text}} - + const Wrapper = item.highlightText ? NavFeatureHighlight : React.Fragment; + const itemContent = ( + + + {item?.icon && } + {item?.img && {`${item.text}} + + ); let element = ( ); @@ -106,10 +108,7 @@ export function NavBarItemMenuTrigger(props: NavBarItemMenuTriggerProps): ReactE className={styles.element} aria-label={label} > - - {item?.icon && } - {item?.img && {`${item.text}} - + {itemContent} ) : ( - - {item?.icon && } - {item?.img && {`${item.text}} - + {itemContent} ); } diff --git a/public/app/core/components/Page/Page.tsx b/public/app/core/components/Page/Page.tsx index 40034d4299f..0fdecd751b7 100644 --- a/public/app/core/components/Page/Page.tsx +++ b/public/app/core/components/Page/Page.tsx @@ -55,7 +55,6 @@ const getStyles = (theme: GrafanaTheme2) => ({ wrapper: css` width: 100%; flex-grow: 1; - width: 100%; min-height: 0; `, }); diff --git a/public/app/core/components/PageHeader/PageHeader.tsx b/public/app/core/components/PageHeader/PageHeader.tsx index ffec4446ec8..8d770f6f051 100644 --- a/public/app/core/components/PageHeader/PageHeader.tsx +++ b/public/app/core/components/PageHeader/PageHeader.tsx @@ -3,6 +3,7 @@ import { css } from '@emotion/css'; import { Tab, TabsBar, Icon, IconName, useStyles2 } from '@grafana/ui'; import { NavModel, NavModelItem, NavModelBreadcrumb, GrafanaTheme2 } from '@grafana/data'; import { PanelHeaderMenuItem } from 'app/features/dashboard/dashgrid/PanelHeader/PanelHeaderMenuItem'; +import { ProBadge } from '../Upgrade/ProBadge'; export interface Props { model: NavModel; @@ -81,7 +82,6 @@ export const PageHeader: FC = ({ model }) => { const main = model.main; const children = main.children; - return (
    @@ -105,20 +105,32 @@ function renderHeaderTitle(main: NavModelItem) {
    - {renderTitle(main.text, main.breadcrumbs ?? [])} + {renderTitle(main.text, main.breadcrumbs ?? [], main.highlightText)} {main.subTitle &&
    {main.subTitle}
    }
    ); } -function renderTitle(title: string, breadcrumbs: NavModelBreadcrumb[]) { +function renderTitle(title: string, breadcrumbs: NavModelBreadcrumb[], highlightText: NavModelItem['highlightText']) { if (!title && (!breadcrumbs || breadcrumbs.length === 0)) { return null; } if (!breadcrumbs || breadcrumbs.length === 0) { - return

    {title}

    ; + return ( +

    + {title} + {highlightText && ( + + )} +

    + ); } const breadcrumbsResult = []; diff --git a/public/app/core/components/Upgrade/UpgradeBox.tsx b/public/app/core/components/Upgrade/UpgradeBox.tsx index 24bf3c1f21c..996f1588272 100644 --- a/public/app/core/components/Upgrade/UpgradeBox.tsx +++ b/public/app/core/components/Upgrade/UpgradeBox.tsx @@ -1,4 +1,4 @@ -import React, { HTMLAttributes } from 'react'; +import React, { ReactNode, HTMLAttributes } from 'react'; import { css, cx } from '@emotion/css'; import { Icon, LinkButton, useStyles2 } from '@grafana/ui'; import { GrafanaTheme2 } from '@grafana/data'; @@ -6,19 +6,25 @@ import { GrafanaTheme2 } from '@grafana/data'; type ComponentSize = 'sm' | 'md'; export interface Props extends HTMLAttributes { - text: string; + text?: string; size?: ComponentSize; + children?: ReactNode; + secondaryAction?: { + url: string; + text: string; + }; } -export const UpgradeBox = ({ text, className, size = 'md', ...htmlProps }: Props) => { +export const UpgradeBox = ({ text, className, children, secondaryAction, size = 'md', ...htmlProps }: Props) => { const styles = useStyles2((theme) => getUpgradeBoxStyles(theme, size)); return (
    - +
    -
    You’ve found a Pro feature!
    -

    {text}

    +

    You’ve found a Pro feature!

    + {text &&

    {text}

    } + {children} Upgrade to Pro + + {secondaryAction && ( + + {secondaryAction.text} + + )}
    ); @@ -53,19 +72,26 @@ const getUpgradeBoxStyles = (theme: GrafanaTheme2, size: ComponentSize) => { `, text: css` margin-bottom: 0; + padding: ${theme.spacing(2, 0)}; + line-height: 1.5; `, button: css` margin-top: ${theme.spacing(2)}; + &:first-of-type { + margin-right: ${theme.spacing(1)}; + } + &:focus-visible { box-shadow: none; color: ${theme.colors.text.primary}; outline: 2px solid ${theme.colors.primary.main}; } `, + buttonSecondary: css` + color: ${theme.colors.text.secondary}; + `, icon: css` - border: 1px solid ${theme.colors.primary.shade}; - border-radius: 50%; margin: ${theme.spacing(0.5, 1, 0.5, 0.5)}; `, };