diff --git a/public/app/features/alerting/unified/Home.tsx b/public/app/features/alerting/unified/Home.tsx
index da7684870a4..f8e094ebbe9 100644
--- a/public/app/features/alerting/unified/Home.tsx
+++ b/public/app/features/alerting/unified/Home.tsx
@@ -1,10 +1,11 @@
import { css, cx } from '@emotion/css';
import React from 'react';
+import SVG from 'react-inlinesvg';
import { GrafanaTheme2 } from '@grafana/data';
import { Stack } from '@grafana/experimental';
import { config } from '@grafana/runtime';
-import { Icon, LinkButton, useStyles2, useTheme2, Tooltip } from '@grafana/ui';
+import { Icon, useStyles2, useTheme2 } from '@grafana/ui';
import { AlertingPageWrapper } from './components/AlertingPageWrapper';
@@ -17,37 +18,27 @@ export default function Home() {
-
-
- -
- Grafana alerting periodically queries your data sources and evaluates the alerting
- condition you define
-
- -
- If the condition is breached, the alert rule fires and produces alert instances{' '}
-
-
-
-
- -
- Firing instances are sent to the Alertmanager{' '}
-
-
-
-
- -
- Alertmanager routes firing alert instances to notification policies based on whether the
- labels match
-
- -
- Notifications are sent out to the contact point defined in the matching notification
- policy
-
-
+
+
How it works
+
+ -
+ Grafana alerting periodically queries data sources and evaluates the condition defined in the alert rule
+
+ - If the condition is breached, an alert instance fires
+ - Firing instances are routed to notification policies based on matching labels
+ - Notifications are sent out to the contact points specified in the notification policy policy
+
+
+
-
+
+ Get started
-
+
-
Create an alert rule by adding queries and expressions from multiple data sources.
@@ -66,7 +57,7 @@ export default function Home() {
@@ -102,14 +93,19 @@ const getWelcomePageStyles = (theme: GrafanaTheme2) => ({
grid-column: 1 / span 5;
`,
flowBlock: css`
- width: 100%;
grid-column: 1 / span 5;
- img {
- display: block;
- margin: 0 auto;
- height: auto;
- width: 100%;
+ display: flex;
+ flex-wrap: wrap;
+ gap: ${theme.spacing(1)};
+
+ & > div {
+ flex: 2;
+ min-width: 350px;
+ }
+ & > svg {
+ flex: 3;
+ min-width: 500px;
}
`,
videoBlock: css`
@@ -132,22 +128,11 @@ const getWelcomePageStyles = (theme: GrafanaTheme2) => ({
gettingStartedBlock: css`
grid-column: 1 / span 2;
justify-content: space-between;
-
- ul {
- margin-left: ${theme.spacing(2)};
- }
`,
- howItWorks: css`
- display: flex;
- justify-content: space-between;
- flex-wrap: wrap;
- gap: ${theme.spacing(2)};
- list-style: none inside none;
- list-style-type: disclosure-closed;
-
- > li {
- flex: 1;
- min-width: 150px;
+ list: css`
+ margin: ${theme.spacing(0, 2)};
+ & > li {
+ margin-bottom: ${theme.spacing(1)};
}
`,
});
@@ -156,81 +141,73 @@ function WelcomeHeader({ className }: { className?: string }) {
const styles = useStyles2(getWelcomeHeaderStyles);
return (
-
+
+
+
+
+
+
+
);
}
const getWelcomeHeaderStyles = (theme: GrafanaTheme2) => ({
- container: css`
- display: flex;
- flex-direction: column;
- padding: ${theme.spacing(4)};
- background-image: url(public/img/alerting/welcome_cta_bg_${theme.name.toLowerCase()}.svg);
- background-size: cover;
- background-clip: padding-box;
-
- outline: 1px solid hsla(6deg, 60%, 80%, 0.14);
- outline-offset: -1px;
- border-radius: 3px;
- `,
ctaContainer: css`
- padding: ${theme.spacing(4)};
+ padding: ${theme.spacing(4, 2)};
display: flex;
gap: ${theme.spacing(4)};
justify-content: space-between;
flex-wrap: wrap;
+
+ ${theme.breakpoints.down('lg')} {
+ flex-direction: column;
+ }
+ `,
+
+ separator: css`
+ width: 1px;
+ background-color: ${theme.colors.border.medium};
+
+ ${theme.breakpoints.down('lg')} {
+ display: none;
+ }
`,
});
interface WelcomeCTABoxProps {
title: string;
description: string;
- icon: React.ComponentProps['name'];
href: string;
hrefText: string;
}
-function WelcomeCTABox({ title, description, icon, href, hrefText }: WelcomeCTABoxProps) {
+function WelcomeCTABox({ title, description, href, hrefText }: WelcomeCTABoxProps) {
const styles = useStyles2(getWelcomeCTAButtonStyles);
return (
-
-
-
{title}
{description}
-
- {hrefText}
-
+
);
}
@@ -246,6 +223,7 @@ const getWelcomeCTAButtonStyles = (theme: GrafanaTheme2) => ({
`,
title: css`
+ margin-bottom: 0;
grid-column: 2 / span 3;
grid-row: 1;
`,
@@ -255,29 +233,21 @@ const getWelcomeCTAButtonStyles = (theme: GrafanaTheme2) => ({
grid-row: 2;
`,
- actionButton: css`
+ actionRow: css`
grid-column: 2 / span 3;
grid-row: 3;
max-width: 240px;
`,
- icon: css`
- grid-column: 1;
- grid-row: 1 / span 2;
- margin: auto;
- color: #ff8833;
+ link: css`
+ color: ${theme.colors.text.link};
`,
});
-function ContentBox({ children, title, className }: React.PropsWithChildren<{ title?: string; className?: string }>) {
+function ContentBox({ children, className }: React.PropsWithChildren<{ className?: string }>) {
const styles = useStyles2(getContentBoxStyles);
- return (
-
- {title &&
{title}
}
- {children}
-
- );
+ return {children}
;
}
const getContentBoxStyles = (theme: GrafanaTheme2) => ({
diff --git a/public/img/alerting/at_a_glance_dark.svg b/public/img/alerting/at_a_glance_dark.svg
index b36ddedaafe..4c528c2af20 100644
--- a/public/img/alerting/at_a_glance_dark.svg
+++ b/public/img/alerting/at_a_glance_dark.svg
@@ -1,98 +1,219 @@
-