Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[CSS-in-JS] Convert classNameMaps to direct className keys. #5889

Merged
merged 2 commits into from
May 9, 2022

Conversation

cchaos
Copy link
Contributor

@cchaos cchaos commented May 9, 2022

Conversion Idea

Instead of maintaining the manual maps of property value to class name maps, lets switch to applying the modifier piece of the class name directly as they key.

Example:

const sizeToClassNameMap = {
  s: 'euiAvatar--s',
  m: 'euiAvatar--m',
  l: 'euiAvatar--l',
  xl: 'euiAvatar--xl',
};

export const SIZES = keysOf(sizeToClassNameMap);
export type EuiAvatarSize = keyof typeof sizeToClassNameMap;

const classes = classNames(
  'euiAvatar',
  sizeToClassNameMap[size],
);

Becomes:

export const SIZES = ['s', 'm', 'l', 'xl'] as const;
export type EuiAvatarSize = typeof SIZES[number];

const classes = classNames(
  'euiAvatar',
  {
    [`euiAvatar--${size}`]: size,
  },
);

This removes the idea that we're somehow very specifically using class names by prop value, while still supporting the rendered class name. It also reduces lines of code.

The only time this won't work well is with something like margin = 'left' and class name is euiComponent--marginLeft. But I think we can at least reduce the classname maps to just signify the modifier instead of repeating the component name like:

export const MARGINS = ['none', 'xs', 's', 'm', 'l', 'xl', 'xxl'] as const;
export type EuiHorizontalRuleMargin = typeof MARGINS[number];

const marginToClassNameMap: {
  [value in EuiHorizontalRuleMargin]: string | null;
} = {
  none: null,
  xs: 'marginXSmall',
  s: 'marginSmall',
  m: 'marginMedium',
  l: 'marginLarge',
  xl: 'marginXLarge',
  xxl: 'marginXXLarge',
};

const classes = classNames(
  'euiHorizontalRule',
  {
    [`euiHorizontalRule--${marginToClassNameMap[margin]}`]: margin && margin !== 'none',
  },
);

Checklist

  • [ ] Checked in both light and dark modes
  • [ ] Checked in mobile
  • [ ] Checked in Chrome, Safari, Edge, and Firefox
  • [ ] Props have proper autodocs and playground toggles
  • [ ] Added documentation
  • [ ] Checked Code Sandbox works for any docs examples
  • Added or updated jest and cypress tests
  • [ ] Checked for breaking changes and labeled appropriately
  • [ ] Checked for accessibility including keyboard-only and screenreader modes
  • [ ] Updated the Figma library counterpart
  • [ ] A changelog entry exists and is marked appropriately

@kibanamachine
Copy link

Preview documentation changes for this PR: https://eui.elastic.co/pr_5889/

@cee-chen
Copy link
Member

cee-chen commented May 9, 2022

I'm good with this, but just to check, for modifier classes that we find 0 usages of in Kibana, can we prefer to delete the className maps instead of converting them?

Copy link
Member

@cee-chen cee-chen left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Changes LGTM! Love the cleanup and QA'd all touched components - classNames output looks good!

@cchaos
Copy link
Contributor Author

cchaos commented May 9, 2022

for modifier classes that we find 0 usages of in Kibana, can we prefer to delete the className maps instead of converting them?

Yes, yes of course 😄

@kibanamachine
Copy link

Preview documentation changes for this PR: https://eui.elastic.co/pr_5889/

Copy link
Contributor

@thompsongl thompsongl left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I like it!

@cchaos
Copy link
Contributor Author

cchaos commented May 9, 2022

Sweet! Thanks! I'll merge this and update the Meta issue with guidance.

@cchaos cchaos merged commit fcd9fae into elastic:main May 9, 2022
@cchaos cchaos mentioned this pull request May 9, 2022
49 tasks
@cchaos cchaos deleted the css-in-js/classname_maps_to_key branch May 9, 2022 19:42
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants