Skip to content

Commit

Permalink
[Emotion] Memoize typography styles & mixins (#7543)
Browse files Browse the repository at this point in the history
  • Loading branch information
cee-chen authored Mar 7, 2024
1 parent 75d7e94 commit 0d0130c
Show file tree
Hide file tree
Showing 14 changed files with 86 additions and 87 deletions.
14 changes: 8 additions & 6 deletions src-docs/src/views/theme/typography/_text_numbers.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,14 @@ import {
EuiTextAlign,
EuiFlexGrid,
EuiFlexItem,
useEuiNumberFormat,
useEuiTheme,
euiNumberFormat,
} from '../../../../../src';
import { css } from '@emotion/react';
import { ThemeExample } from '../_components/_theme_example';

export default () => {
const euiTheme = useEuiTheme();
const themeContext = useContext(ThemeContext);
const currentLanguage = themeContext.themeLanguage;
const showSass = currentLanguage.includes('sass');
Expand All @@ -22,8 +24,8 @@ export default () => {
{/* Mixin */}
{!showSass ? (
<ThemeExample
title={<code>useEuiNumberFormat()</code>}
type="hook"
title={<code>euiNumberFormat(euiTheme)</code>}
type="function"
description={
<p>
Applies{' '}
Expand All @@ -49,7 +51,7 @@ export default () => {
<EuiFlexItem>
<p
css={css`
${useEuiNumberFormat()}
${euiNumberFormat(euiTheme)}
`}
>
<strong>With function</strong>
Expand All @@ -62,7 +64,7 @@ export default () => {
</EuiFlexGrid>
</EuiTextAlign>
}
snippet={'${useEuiNumberFormat()}'}
snippet={'${euiNumberFormat(useEuiTheme())}'}
snippetLanguage="emotion"
/>
) : (
Expand All @@ -84,7 +86,7 @@ export default () => {
type="className"
description={
<p>
Applies the <EuiCode>useEuiNumberFormat()</EuiCode> styles as an
Applies the <EuiCode>euiNumberFormat()</EuiCode> styles as an
overriding CSS utility class.
</p>
}
Expand Down
27 changes: 12 additions & 15 deletions src/components/facet/facet_button.styles.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,33 +14,30 @@ import {
logicalTextAlignCSS,
} from '../../global_styling';

import { euiLinkFocusCSS } from '../link/link.styles';

export const euiFacetButtonStyles = ({ euiTheme }: UseEuiTheme) => ({
// Base
euiFacetButton: css`
${logicalTextAlignCSS('left')}
&:hover,
&:focus {
/* Make sure the quantity doesn't get an underline on hover */
&:not(:disabled) [class*='euiFacetButton__text'] {
text-decoration: underline;
&:not(:disabled) {
&:hover,
&:focus {
/* Make sure the quantity doesn't get an underline on hover */
text-decoration: none;
.euiFacetButton__text {
text-decoration: underline;
}
}
}
&:focus:not(:disabled) [class*='euiFacetButton__text'] {
${euiLinkFocusCSS(euiTheme)}
&:focus .euiFacetButton__text {
text-decoration-thickness: ${euiTheme.border.width.thick};
}
}
&:disabled {
color: ${euiTheme.colors.disabledText};
pointer-events: none;
&:hover,
&:focus {
text-decoration: none;
}
}
`,
});
Expand Down
9 changes: 6 additions & 3 deletions src/components/link/external_link_icon.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@

import React, { FunctionComponent, AnchorHTMLAttributes } from 'react';

import { useEuiTheme } from '../../services';
import { useEuiMemoizedStyles, UseEuiTheme } from '../../services';
import { logicalStyle } from '../../global_styling';
import { EuiIcon, EuiIconProps } from '../icon';
import { EuiI18n, useEuiI18n } from '../i18n';
Expand All @@ -28,10 +28,13 @@ export type EuiExternalLinkIconProps = {
external?: boolean;
};

const iconStyle = ({ euiTheme }: UseEuiTheme) =>
logicalStyle('margin-left', euiTheme.size.xs);

export const EuiExternalLinkIcon: FunctionComponent<
EuiExternalLinkIconProps & Partial<EuiIconProps>
> = ({ target, external, ...rest }) => {
const { euiTheme } = useEuiTheme();
const iconCssStyle = useEuiMemoizedStyles(iconStyle);

const showExternalLinkIcon =
(target === '_blank' && external !== false) || external === true;
Expand All @@ -45,7 +48,7 @@ export const EuiExternalLinkIcon: FunctionComponent<
<>
{showExternalLinkIcon && (
<EuiIcon
css={logicalStyle('margin-left', euiTheme.size.xs)}
css={iconCssStyle}
aria-label={iconAriaLabel}
size="s"
type="popout"
Expand Down
38 changes: 13 additions & 25 deletions src/components/link/link.styles.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,42 +10,20 @@ import { css } from '@emotion/react';
import { UseEuiTheme } from '../../services';
import { euiFocusRing, logicalTextAlignCSS } from '../../global_styling';

const _colorCSS = (color: string) => {
return `
color: ${color};
&:target {
color: darken(${color}, 10%);
}
`;
};

export const euiLinkHoverCSS = () => {
return `
text-decoration: underline;
`;
};

export const euiLinkFocusCSS = (euiTheme: UseEuiTheme['euiTheme']) => {
return `
text-decoration: underline;
text-decoration-thickness: ${euiTheme.border.width.thick};
`;
};

export const euiLinkCSS = (euiThemeContext: UseEuiTheme) => {
const { euiTheme } = euiThemeContext;
return `
font-weight: ${euiTheme.font.weight.medium};
${logicalTextAlignCSS('left')}
&:hover {
${euiLinkHoverCSS()}
text-decoration: underline;
}
&:focus {
${euiFocusRing(euiThemeContext, 'outset')}
${euiLinkFocusCSS(euiTheme)}
text-decoration: underline;
text-decoration-thickness: ${euiTheme.border.width.thick};
}
`;
};
Expand Down Expand Up @@ -85,3 +63,13 @@ export const euiLinkStyles = (euiThemeContext: UseEuiTheme) => {
text: css(_colorCSS(euiTheme.colors.text)),
};
};

const _colorCSS = (color: string) => {
return `
color: ${color};
&:target {
color: darken(${color}, 10%);
}
`;
};
5 changes: 2 additions & 3 deletions src/components/link/link.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ import React, {
} from 'react';
import classNames from 'classnames';

import { getSecureRelForTarget, useEuiTheme } from '../../services';
import { getSecureRelForTarget, useEuiMemoizedStyles } from '../../services';
import { CommonProps, ExclusiveUnion } from '../common';
import { validateHref } from '../../services/security/href_validator';

Expand Down Expand Up @@ -92,8 +92,7 @@ const EuiLink = forwardRef<HTMLAnchorElement | HTMLButtonElement, EuiLinkProps>(
},
ref
) => {
const euiTheme = useEuiTheme();
const styles = euiLinkStyles(euiTheme);
const styles = useEuiMemoizedStyles(euiLinkStyles);
const cssStyles = [styles.euiLink];

const isHrefValid = !href || validateHref(href);
Expand Down
5 changes: 2 additions & 3 deletions src/components/text/text.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import React, { FunctionComponent, HTMLAttributes, CSSProperties } from 'react';
import classNames from 'classnames';
import { CommonProps } from '../common';

import { useEuiTheme } from '../../services';
import { useEuiMemoizedStyles } from '../../services';
import { euiTextStyles } from './text.styles';

import { TextColor, EuiTextColor } from './text_color';
Expand Down Expand Up @@ -44,8 +44,7 @@ export const EuiText: FunctionComponent<EuiTextProps> = ({
className,
...rest
}) => {
const euiTheme = useEuiTheme();
const styles = euiTextStyles(euiTheme);
const styles = useEuiMemoizedStyles(euiTextStyles);
const cssStyles = [
styles.euiText,
!grow ? styles.constrainedWidth : undefined,
Expand Down
4 changes: 2 additions & 2 deletions src/components/text/text_align.styles.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
import { css } from '@emotion/react';
import { logicalTextAlignCSS } from '../../global_styling';

export const euiTextAlignStyles = () => ({
export const euiTextAlignStyles = {
euiTextAlign: css``,
left: css`
${logicalTextAlignCSS('left')}
Expand All @@ -20,4 +20,4 @@ export const euiTextAlignStyles = () => ({
center: css`
${logicalTextAlignCSS('center')}
`,
});
};
3 changes: 1 addition & 2 deletions src/components/text/text_align.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ import React, {
import { CommonProps } from '../common';
import { cloneElementWithCss } from '../../services';

import { euiTextAlignStyles } from './text_align.styles';
import { euiTextAlignStyles as styles } from './text_align.styles';

export const ALIGNMENTS = ['left', 'right', 'center'] as const;
export type TextAlignment = (typeof ALIGNMENTS)[number];
Expand All @@ -35,7 +35,6 @@ export const EuiTextAlign: FunctionComponent<EuiTextAlignProps> = ({
cloneElement = false,
...rest
}) => {
const styles = euiTextAlignStyles();
const cssStyles = [styles.euiTextAlign, styles[textAlign]];

const props = { css: cssStyles, ...rest };
Expand Down
5 changes: 2 additions & 3 deletions src/components/text/text_color.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ import React, {
} from 'react';

import { CommonProps } from '../common';
import { useEuiTheme, cloneElementWithCss } from '../../services';
import { useEuiMemoizedStyles, cloneElementWithCss } from '../../services';

import { euiTextColorStyles } from './text_color.styles';

Expand Down Expand Up @@ -60,8 +60,7 @@ export const EuiTextColor: FunctionComponent<EuiTextColorProps> = ({
}) => {
const isNamedColor = COLORS.includes(color as TextColor);

const euiTheme = useEuiTheme();
const styles = euiTextColorStyles(euiTheme);
const styles = useEuiMemoizedStyles(euiTextColorStyles);
const cssStyles = [
styles.euiTextColor,
isNamedColor ? styles[color as TextColor] : styles.customColor,
Expand Down
6 changes: 4 additions & 2 deletions src/components/title/title.styles.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,15 +8,17 @@

import { renderHook } from '@testing-library/react';

import { useEuiTheme } from '../../services';

import { TITLE_SIZES } from './title';
import { useEuiTitle } from './title.styles';
import { euiTitle } from './title.styles';

describe('euiTitle mixin', () => {
describe('returns a static object of title font properties for each title size', () => {
TITLE_SIZES.forEach((size) => {
it(size, () => {
expect(
renderHook(() => useEuiTitle(size)).result.current
renderHook(() => euiTitle(useEuiTheme(), size)).result.current
).toMatchSnapshot();
});
});
Expand Down
11 changes: 1 addition & 10 deletions src/components/title/title.styles.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@

import { CSSProperties } from 'react';
import { css } from '@emotion/react';
import { UseEuiTheme, useEuiTheme } from '../../services';
import { UseEuiTheme } from '../../services';
import {
euiTextBreakWord,
euiFontSize,
Expand Down Expand Up @@ -56,15 +56,6 @@ export const euiTitle = (
};
};

// Hook version
export const useEuiTitle = (
scale: EuiTitleSize,
options?: _FontScaleOptions
): EuiThemeTitle => {
const euiTheme = useEuiTheme();
return euiTitle(euiTheme, scale, options);
};

/**
* Styles
*/
Expand Down
9 changes: 5 additions & 4 deletions src/components/title/title.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,12 @@

import { FunctionComponent, ReactElement } from 'react';
import classNames from 'classnames';
import { useEuiTheme, cloneElementWithCss } from '../../services';
import { euiTitleStyles } from './title.styles';

import { useEuiMemoizedStyles, cloneElementWithCss } from '../../services';
import { CommonProps } from '../common';

import { euiTitleStyles } from './title.styles';

export const TITLE_SIZES = ['xxxs', 'xxs', 'xs', 's', 'm', 'l'] as const;
export type EuiTitleSize = (typeof TITLE_SIZES)[number];

Expand All @@ -35,8 +37,7 @@ export const EuiTitle: FunctionComponent<EuiTitleProps> = ({
textTransform,
...rest
}) => {
const euiTheme = useEuiTheme();
const styles = euiTitleStyles(euiTheme);
const styles = useEuiMemoizedStyles(euiTitleStyles);
const cssStyles = [
styles.euiTitle,
textTransform ? styles[textTransform] : undefined,
Expand Down
5 changes: 3 additions & 2 deletions src/global_styling/mixins/_typography.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,13 @@

import { renderHook } from '@testing-library/react';

import { useEuiTheme } from '../../services';
import { EuiThemeFontScales, EuiThemeFontUnits } from '../variables/typography';
import {
useEuiFontSize,
euiTextBreakWord,
euiTextTruncate,
useEuiNumberFormat,
euiNumberFormat,
} from './_typography';

describe('euiFontSize', () => {
Expand Down Expand Up @@ -66,7 +67,7 @@ describe('euiTextTruncate', () => {
describe('euiNumberFormat', () => {
it('returns a string of CSS text', () => {
expect(
renderHook(() => useEuiNumberFormat()).result.current
renderHook(() => euiNumberFormat(useEuiTheme())).result.current
).toMatchSnapshot();
});
});
Loading

0 comments on commit 0d0130c

Please sign in to comment.