mirror of https://github.com/grafana/grafana.git
basic theme playground
This commit is contained in:
parent
db09f1134f
commit
34a9f4f2a1
|
|
@ -18,17 +18,20 @@ import { Icon } from '../Icon/Icon';
|
|||
import { Input } from '../Input/Input';
|
||||
import { BackgroundColor, BorderColor, Box, BoxShadow } from '../Layout/Box/Box';
|
||||
import { Stack } from '../Layout/Stack/Stack';
|
||||
import { ScrollContainer } from '../ScrollContainer/ScrollContainer';
|
||||
import { Switch } from '../Switch/Switch';
|
||||
import { Text, TextProps } from '../Text/Text';
|
||||
|
||||
interface DemoBoxProps {
|
||||
bg?: BackgroundColor;
|
||||
border?: BorderColor;
|
||||
scrollable?: boolean;
|
||||
shadow?: BoxShadow;
|
||||
textColor?: TextProps['color'];
|
||||
}
|
||||
|
||||
const DemoBox = ({ bg, border, children, shadow }: React.PropsWithChildren<DemoBoxProps>) => {
|
||||
const DemoBox = ({ bg, border, children, shadow, scrollable }: React.PropsWithChildren<DemoBoxProps>) => {
|
||||
const MaybeScroll = scrollable ? ScrollContainer : React.Fragment;
|
||||
return (
|
||||
<Box
|
||||
backgroundColor={bg ? bg : undefined}
|
||||
|
|
@ -38,7 +41,7 @@ const DemoBox = ({ bg, border, children, shadow }: React.PropsWithChildren<DemoB
|
|||
boxShadow={shadow}
|
||||
borderRadius={'default'}
|
||||
>
|
||||
{children}
|
||||
<MaybeScroll>{children}</MaybeScroll>
|
||||
</Box>
|
||||
);
|
||||
};
|
||||
|
|
@ -121,7 +124,7 @@ export const ThemeDemo = () => {
|
|||
</DemoBox>
|
||||
</CollapsableSection>
|
||||
<CollapsableSection label="Text colors" isOpen={true}>
|
||||
<Stack justifyContent="flex-start">
|
||||
<Stack justifyContent="flex-start" wrap="wrap">
|
||||
<DemoBox>
|
||||
<TextColors t={t} />
|
||||
</DemoBox>
|
||||
|
|
@ -134,7 +137,7 @@ export const ThemeDemo = () => {
|
|||
</Stack>
|
||||
</CollapsableSection>
|
||||
<CollapsableSection label="Rich colors" isOpen={true}>
|
||||
<DemoBox bg="primary">
|
||||
<DemoBox bg="primary" scrollable>
|
||||
<table className={colorsTableStyle}>
|
||||
<thead>
|
||||
<tr>
|
||||
|
|
@ -154,7 +157,7 @@ export const ThemeDemo = () => {
|
|||
</DemoBox>
|
||||
</CollapsableSection>
|
||||
<CollapsableSection label="Viz hues" isOpen={true}>
|
||||
<DemoBox bg="primary">
|
||||
<DemoBox bg="primary" scrollable>
|
||||
<table className={colorsTableStyle}>
|
||||
<thead>
|
||||
<tr>
|
||||
|
|
@ -229,7 +232,7 @@ export const ThemeDemo = () => {
|
|||
<CollapsableSection label="Buttons" isOpen={true}>
|
||||
<DemoBox bg="primary">
|
||||
<Stack direction="column" gap={3}>
|
||||
<Stack>
|
||||
<Stack wrap="wrap">
|
||||
{allButtonVariants.map((variant) => (
|
||||
<Button variant={variant} key={variant}>
|
||||
{variant}
|
||||
|
|
@ -353,6 +356,7 @@ export function RichColorDemo({ theme, color }: RichColorDemoProps) {
|
|||
|
||||
const colorsTableStyle = css({
|
||||
textAlign: 'center',
|
||||
overflow: 'auto',
|
||||
|
||||
td: {
|
||||
padding: '8px',
|
||||
|
|
|
|||
|
|
@ -21,6 +21,10 @@ export const ThemeProvider = ({ children, value }: { children: React.ReactNode;
|
|||
return () => sub.unsubscribe();
|
||||
}, []);
|
||||
|
||||
useEffect(() => {
|
||||
setTheme(value);
|
||||
}, [value]);
|
||||
|
||||
return (
|
||||
<ThemeContext.Provider value={theme}>
|
||||
<SkeletonTheme
|
||||
|
|
|
|||
|
|
@ -1,8 +1,15 @@
|
|||
import { getThemeById } from '@grafana/data';
|
||||
import { css } from '@emotion/css';
|
||||
import { useState } from 'react';
|
||||
|
||||
import { AppEvents, createTheme, GrafanaTheme2 } from '@grafana/data';
|
||||
import { t } from '@grafana/i18n';
|
||||
import { useChromeHeaderHeight } from '@grafana/runtime';
|
||||
import { CodeEditor, Stack, useStyles2 } from '@grafana/ui';
|
||||
import { ThemeDemo } from '@grafana/ui/internal';
|
||||
import { Page } from 'app/core/components/Page/Page';
|
||||
|
||||
import tron from '../../../../packages/grafana-data/src/themes/themeDefinitions/tron';
|
||||
import appEvents from '../../core/app_events';
|
||||
import { HOME_NAV_ID } from '../../core/reducers/navModel';
|
||||
import { getNavModel } from '../../core/selectors/navModel';
|
||||
import { ThemeProvider } from '../../core/utils/ConfigProvider';
|
||||
|
|
@ -15,7 +22,19 @@ export default function ThemePlayground() {
|
|||
text: t('theme-playground.title', 'Theme playground'),
|
||||
parentItem: homeNav,
|
||||
};
|
||||
const theme = getThemeById('tron');
|
||||
const [theme, setTheme] = useState(tron);
|
||||
const chromeHeaderHeight = useChromeHeaderHeight();
|
||||
const styles = useStyles2(getStyles, chromeHeaderHeight);
|
||||
|
||||
const onBlur = (value: string) => {
|
||||
try {
|
||||
const themeInput = JSON.parse(value);
|
||||
setTheme(themeInput);
|
||||
} catch (error) {
|
||||
appEvents.emit(AppEvents.alertError, ['Failed to modify theme', error]);
|
||||
}
|
||||
};
|
||||
|
||||
return (
|
||||
<Page
|
||||
navModel={{
|
||||
|
|
@ -23,9 +42,41 @@ export default function ThemePlayground() {
|
|||
main: navModel,
|
||||
}}
|
||||
>
|
||||
<ThemeProvider value={theme}>
|
||||
<ThemeDemo />
|
||||
</ThemeProvider>
|
||||
<Stack
|
||||
direction={{
|
||||
xs: 'column',
|
||||
md: 'row',
|
||||
}}
|
||||
height="100%"
|
||||
>
|
||||
<CodeEditor
|
||||
width="100%"
|
||||
value={JSON.stringify(theme, null, 2)}
|
||||
language="json"
|
||||
showLineNumbers={true}
|
||||
showMiniMap={true}
|
||||
containerStyles={styles.codeEditor}
|
||||
onBlur={onBlur}
|
||||
/>
|
||||
<ThemeProvider value={createTheme(theme)}>
|
||||
<ThemeDemo />
|
||||
</ThemeProvider>
|
||||
</Stack>
|
||||
</Page>
|
||||
);
|
||||
}
|
||||
|
||||
const getStyles = (theme: GrafanaTheme2, chromeHeaderHeight: number | undefined) => ({
|
||||
codeEditor: css({
|
||||
height: '40vh',
|
||||
minWidth: '300px',
|
||||
position: 'sticky',
|
||||
top: chromeHeaderHeight ? `calc(${chromeHeaderHeight}px + ${theme.spacing(1)})` : 0,
|
||||
width: '100%',
|
||||
zIndex: theme.zIndex.activePanel,
|
||||
[theme.breakpoints.up('md')]: {
|
||||
height: `calc(90vh - ${chromeHeaderHeight ?? 0}px - ${theme.spacing(2)})`,
|
||||
width: '70%',
|
||||
},
|
||||
}),
|
||||
});
|
||||
|
|
|
|||
Loading…
Reference in New Issue