-
Notifications
You must be signed in to change notification settings - Fork 842
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
EuiSkeleton components #6502
EuiSkeleton components #6502
Conversation
Since this is a community submitted pull request, a Jenkins build has not been kicked off automatically. Can an Elastic organization member please verify the contents of this patch and then kick off a build manually? |
💚 CLA has been signed |
jenkins test this |
Preview documentation changes for this PR: https://eui.elastic.co/pr_6502/ |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks @AndreaDellaValle,
This PR is looking great. I like your approach for the implementation:
myCondition
? <EuiSkeletonCircle size="s" />
: <EuiAvatar size="s" />
I'm a product designer on EUI team and my review is more focused on design aspects.
General feedback on this first draft.
- Overall effectiveness: I have nothing to say. It looks great.
- Developer experience: The DX looks good. The EUI team can then follow up with some usage guidelines. And we can also consider adding a more complex demo where we showcase a progessive loading of contents. But what you have looks great to merge.
- The 4 components structure: I think for now it is a good start. We can consider adding more components in the future. Only in case, it is really necessary.
- The props of the single components: I left some comments directly in the code.
- Naming: I left some comments directly in the code.
Let me know if you need any help.
@AndreaDellaValle it looks like we still need you to sign the CLA (under the email address tied to your GitHub commits) - if you could take a look at that in addition to Elizabet's feedback items, that'd be super appreciated! ❤️ Thank you for your amazing contribution - as a heads up, we'll merge it into a feature branch in order to add more docs before releasing it. |
Hello @cee-chen 😀 I've signed the agreement for the third time (the last try was some minutes ago) and finally I can see that the check is green and we can move on ^_^ I take advantage of this comment to confirm that I'll take care of the CR pointed out by @miukimiu also. Thanks to both of you for the feedback and the instructions! PS: sorry for closing/reopening the PR, it was a mistake. |
Preview documentation changes for this PR: https://eui.elastic.co/pr_6502/ |
Co-authored-by: Elizabet Oliveira <[email protected]>
Co-authored-by: Elizabet Oliveira <[email protected]>
Co-authored-by: Elizabet Oliveira <[email protected]>
…sizes with euiTitle ones
Hey @AndreaDellaValle! I've pushed up the size/scaling updates as well as some minor improvement and cleanup feedback items (should all have been atomically committed and have explanations in each git commit message - please let me know if anything doesn't make sense). This is looking super great and I'm very excited for it! I'm signing off for today but have some very minor docs work I'd like to do left (playground, copy passes, and finally, updating EDIT: apologies for the force push, I totally f-ed up my merges. Completely my bad - hopefully did it quickly enough that it didn't screw up your local. |
- in favor of calling `euiTitle`'s font utils and grabbing `lineHeight` directly from it
- should exist in the base styles instead + bonus - DRY out `logicalSizeCSS` to only require 1 input if both sides are the same
…stead The reason for this is performance - Emotion generates a completely new hash/className for every single possible permutation of width/height passed to it. We want to avoid this for wildcard prop-based styles and use inline styles instead
+ cover all props + prefer RTL over Enzyme (part of ongoing migration) + fix type issue found during testing
4d897ef
to
e3437dd
Compare
Thank you for the amazing work @cee-chen ! You basically put in place everything that was missing and much more 🎊 I was putting this on ready for review but I found a bug on Safari 🐞 that is not rendering the EDIT: I can work on Figma components as well, but I don't know how to share them with you. General checklist
Emotion conversion checklist
|
- allow numbers as well as strings - now that we're using inline `style`s for the dimensions, React accepts numbers as well (which matches EuiImage API) - remove image URI in favor of a picsum link - set width/height on img to prevent page jumping
- for whatever reason, using `|` prints the line numbers in non-ascending order in the props table - using an array and `as const` fixes this, and is reusable in tests
+ improve mobile display of demos
- move EuiSkeletonCircle slightly lower in docs order - EuiSkeletonText is likely going to be more popular since it already exists - misc copy tweaks
- since `euiLoadingStrings.ariaLabel` already exists, just reuse that instead of making our translators re-translate the same string
- note: this is already broken on prod as well for `EuiLoadingContent`
AMAZING catch on this @AndreaDellaValle! Safari will be the death of me 💀 I poked at it a bit and discovered the issue is that the parent container's
No worries on this one, we usually have our designers handle this - @miukimiu can likely grab it. I'll go through the checklist as well and strike off or delete items that don't apply to this PR. Thanks again for your amazing work!! 🎉 🎉 I've pushed up all the PR feedback/changes I wanted to see personally, and think this is ready to merge. I'll handle deprecating |
Great fixes on the fly @cee-chen !
For sure! I already saw some minors on the playgrounds but I think I can handle them on the fly tonight after dinner. I also think that Skeletons for |
Assuming that these kinds of tests are far more comprehensive if executed with some tool like Playwright (that I'm still not using... 🥲), I've tested both the rendering and the docs playgrounds and they're looking pretty good to me:
There are some micro minors that are confined to the playgrounds but that I think are not relevant:
I'm asking for the review formally to @cee-chen in order to follow the standard process (but you already saw everything I think), and if you want to involve other reviewers they are more than welcome 🤠 Thank you again |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Woohoo! Let's ship it. Very excited for this to land (hopefully by next Tuesday's release!)
for EuiSkeletonText it does not limit the range of lines like the component do, and numbers are rendered in sparse order
For what it's worth we have several other components (with limited number inputs) that behave this way, so I'm not super worried about it. It's something we'd need to enhance our playground controls for in a separate PR.
* Setup EuiSkeleton files and folders structure * Moved Skeleton under the Display side menu category * Component variants setup * feat: skeleton setup [text, rect, circle] * feat: added skeleton item draft and other minors * chore: renamed sizes * feat: added Heading in favor of Rect component * Update src-docs/src/views/skeleton/skeleton_example.js Co-authored-by: Elizabet Oliveira <[email protected]> * Update src-docs/src/views/skeleton/skeleton_example.js Co-authored-by: Elizabet Oliveira <[email protected]> * Update src-docs/src/views/skeleton/skeleton_example.js Co-authored-by: Elizabet Oliveira <[email protected]> * chore: wrapped p with EuiText and indentation * chore: removed useless styles * chore: centralized and renamed skeleton animation keyfram * refactor: renamed euiSkeletonHeading to euiSkeletonTitle and updated sizes with euiTitle ones * chore: renamed EuiSkeletonItem to EuiSkeletonRectangle * Remove hard-coded `euiSkeletonTitleStyles` heights map - in favor of calling `euiTitle`'s font utils and grabbing `lineHeight` directly from it * [docs] Add EuiSwitch toggle to EuiSkeletonTitle tests - this toggle help demonstrates to consumers how to conditionally switch from loading to non-loading components, and also allows us to test heights * Add `size` prop to `EuiSkeletonText` + add calculations & offsets to account for text scale + update docs to allow changing size & toggle between text to test visual behavior * [docs] Add loading toggle for EuiSkeletonCircle + prettier fixes * [PR feedback] Fix incorrect BEM naming; remove extra modifier classes - BEM: `__` should only be used for children/descendants, and these are parent-level styles and should use regular camelCasing - modifier classes removal: we're moving away from setting these extra CSS classes, which do not have any actual CSS tied to them (since we're using Emotion CSS-in-JS instead). The top-level className remains as an API for consumers to hook into for overrides if needed. * [PR feedback] DRY out all `aria`/a11y attributes to reusable helper - not all components were correctly receiving all the aria attrs they should have been - this helper fixes that * [PR feedback] Rename` _skeleton` to `utils`, DRY out repeated gradient CSS - `utils` better matches naming/architecture convention in other components (+ ignore i18n complaint) + tweak gradient size and animation for circle and rectangle components to look a bit better + rename global animation to a more generic name/usage * [PR feedback] DRY out repeated CSS between modifiers - should exist in the base styles instead + bonus - DRY out `logicalSizeCSS` to only require 1 input if both sides are the same * [PR feedback] Avoid dynamic wildcard Emotion classes - use `style` instead The reason for this is performance - Emotion generates a completely new hash/className for every single possible permutation of width/height passed to it. We want to avoid this for wildcard prop-based styles and use inline styles instead * [PR feedback] Improve/add unit tests + cover all props + prefer RTL over Enzyme (part of ongoing migration) + fix type issue found during testing * [docs] Add toggle to EuiSkeletonRectangle example * [PR feedback] EuiSkeletonRectangle tweaks - allow numbers as well as strings - now that we're using inline `style`s for the dimensions, React accepts numbers as well (which matches EuiImage API) - remove image URI in favor of a picsum link - set width/height on img to prevent page jumping * [PR feedback] Tweak EuiSkeletonText typing - for whatever reason, using `|` prints the line numbers in non-ascending order in the props table - using an array and `as const` fixes this, and is reusable in tests * [PR feedback] Convert docs files to Typescript + improve mobile display of demos * [PR feedback] Documentation copy + order - move EuiSkeletonCircle slightly lower in docs order - EuiSkeletonText is likely going to be more popular since it already exists - misc copy tweaks * [Docs] Set up playgrounds * DRY out aria-label further - since `euiLoadingStrings.ariaLabel` already exists, just reuse that instead of making our translators re-translate the same string * Add fix for Safari workaround - note: this is already broken on prod as well for `EuiLoadingContent` * Changelog * chore: comment typo and zero value for border radius --------- Co-authored-by: Elizabet Oliveira <[email protected]> Co-authored-by: Constance Chen <[email protected]>
* EuiSkeleton components (#6502) * Setup EuiSkeleton files and folders structure * Moved Skeleton under the Display side menu category * Component variants setup * feat: skeleton setup [text, rect, circle] * feat: added skeleton item draft and other minors * chore: renamed sizes * feat: added Heading in favor of Rect component * Update src-docs/src/views/skeleton/skeleton_example.js Co-authored-by: Elizabet Oliveira <[email protected]> * Update src-docs/src/views/skeleton/skeleton_example.js Co-authored-by: Elizabet Oliveira <[email protected]> * Update src-docs/src/views/skeleton/skeleton_example.js Co-authored-by: Elizabet Oliveira <[email protected]> * chore: wrapped p with EuiText and indentation * chore: removed useless styles * chore: centralized and renamed skeleton animation keyfram * refactor: renamed euiSkeletonHeading to euiSkeletonTitle and updated sizes with euiTitle ones * chore: renamed EuiSkeletonItem to EuiSkeletonRectangle * Remove hard-coded `euiSkeletonTitleStyles` heights map - in favor of calling `euiTitle`'s font utils and grabbing `lineHeight` directly from it * [docs] Add EuiSwitch toggle to EuiSkeletonTitle tests - this toggle help demonstrates to consumers how to conditionally switch from loading to non-loading components, and also allows us to test heights * Add `size` prop to `EuiSkeletonText` + add calculations & offsets to account for text scale + update docs to allow changing size & toggle between text to test visual behavior * [docs] Add loading toggle for EuiSkeletonCircle + prettier fixes * [PR feedback] Fix incorrect BEM naming; remove extra modifier classes - BEM: `__` should only be used for children/descendants, and these are parent-level styles and should use regular camelCasing - modifier classes removal: we're moving away from setting these extra CSS classes, which do not have any actual CSS tied to them (since we're using Emotion CSS-in-JS instead). The top-level className remains as an API for consumers to hook into for overrides if needed. * [PR feedback] DRY out all `aria`/a11y attributes to reusable helper - not all components were correctly receiving all the aria attrs they should have been - this helper fixes that * [PR feedback] Rename` _skeleton` to `utils`, DRY out repeated gradient CSS - `utils` better matches naming/architecture convention in other components (+ ignore i18n complaint) + tweak gradient size and animation for circle and rectangle components to look a bit better + rename global animation to a more generic name/usage * [PR feedback] DRY out repeated CSS between modifiers - should exist in the base styles instead + bonus - DRY out `logicalSizeCSS` to only require 1 input if both sides are the same * [PR feedback] Avoid dynamic wildcard Emotion classes - use `style` instead The reason for this is performance - Emotion generates a completely new hash/className for every single possible permutation of width/height passed to it. We want to avoid this for wildcard prop-based styles and use inline styles instead * [PR feedback] Improve/add unit tests + cover all props + prefer RTL over Enzyme (part of ongoing migration) + fix type issue found during testing * [docs] Add toggle to EuiSkeletonRectangle example * [PR feedback] EuiSkeletonRectangle tweaks - allow numbers as well as strings - now that we're using inline `style`s for the dimensions, React accepts numbers as well (which matches EuiImage API) - remove image URI in favor of a picsum link - set width/height on img to prevent page jumping * [PR feedback] Tweak EuiSkeletonText typing - for whatever reason, using `|` prints the line numbers in non-ascending order in the props table - using an array and `as const` fixes this, and is reusable in tests * [PR feedback] Convert docs files to Typescript + improve mobile display of demos * [PR feedback] Documentation copy + order - move EuiSkeletonCircle slightly lower in docs order - EuiSkeletonText is likely going to be more popular since it already exists - misc copy tweaks * [Docs] Set up playgrounds * DRY out aria-label further - since `euiLoadingStrings.ariaLabel` already exists, just reuse that instead of making our translators re-translate the same string * Add fix for Safari workaround - note: this is already broken on prod as well for `EuiLoadingContent` * Changelog * chore: comment typo and zero value for border radius --------- Co-authored-by: Elizabet Oliveira <[email protected]> Co-authored-by: Constance Chen <[email protected]> * Design review (#6560) * Deprecate `EuiLoadingContent` in favor of `EuiSkeletonText` (#6557) * Deprecate EuiLoadingContent + dogfood EuiSkeletonText * Remove unnecessary tests - leave a basic `is rendered` test in just to confirm the content, but should be deleted in the future * Update documentation with deprecation notice * changelog * Fix Emotion styles var name * [EuiSkeletonLoading] Improve loading accessibility and bake in `isLoading` API handling (#6562) * Create reusable `EuiSkeletonLoading` component - for DRYing out correct accessibility attributes, wrappers, and a simpler loading API * Convert `EuiSkeletonText` to dogfood new `EuiSkeletonLoading` wrapper + update docs/example to how `isLoading`/`children` behavior * Convert `EuiSkeletonTitle` to dogfood new `EuiSkeletonLoading` wrapper + update docs/example to how `isLoading`/`children` behavior * Convert `EuiSkeletonRectangle` to dogfood new `EuiSkeletonLoading` wrapper + update docs/example to how `isLoading`/`children` behavior * Convert `EuiSkeletonRectangle` to dogfood new `EuiSkeletonLoading` wrapper + update docs/example to how `isLoading`/`children` behavior * Add docs example + a11y callout for `EuiSkeletonLoading` * Fix annoying Safari bug popping up again - the new `aria-busy` wrapper appears to make the `z-index` workaround not work, so use `isolation` (https://developer.mozilla.org/en-US/docs/Web/CSS/isolation) instead to force the necessary stacking context * changelog * [PR feedback] use `div` instead of `section` (or in this case, `EuiPanel` for looks * [PR feedback] Add `children` to playground - Missed in #6562 - Playground still isn't perfect; but good enough for now * Tweak default `EuiSkeletonCircle` size to match default `EuiAvatar` size --------- Co-authored-by: Andrea Della Valle <[email protected]> Co-authored-by: Elizabet Oliveira <[email protected]>
## Summary `[email protected]` ⏩ `[email protected]` ___ ## [`74.1.0`](https://github.com/elastic/eui/releases/tag/v74.1.0) - Added new `EuiSkeletonText`, `EuiSkeletonTitle`, `EuiSkeletonCircle`, and `EuiSkeletonRectangle` components ([#6502](elastic/eui#6502)) - Updated `EuiSuperSelect` screen reader instructions to be more specific ([#6549](elastic/eui#6549)) - Added `error` and updated `alert` glyphs to `EuiIcon` ([#6550](elastic/eui#6550)) - All `EuiSkeleton` components now accept an `isLoading` flag and `children`, which automatically handles conditionally rendering loading skeletons vs. loaded content (`children`) ([#6562](elastic/eui#6562)) - All `EuiSkeleton` components now accept a `contentAriaLabel` prop, which more meaningfully describes the loaded content to screen readers ([#6562](elastic/eui#6562)) - Updated `EuiPopover` screen reader instructions for mobile and click behaviors ([#6567](elastic/eui#6567)) **Bug fixes** - Fixed `EuiCard` to ensure `onClick` method only runs once when `title` contains a React node ([#6551](elastic/eui#6551)) **Deprecations** - Deprecated `EuiLoadingContent` - use `EuiSkeletonText` instead ([#6557](elastic/eui#6557)) --------- Co-authored-by: Kibana Machine <[email protected]>
Summary
Hello folks 👋
I've previously left a comment in this discussion here because like some of you I'm in the need of a proper Skeleton component, so with this draft PR I'm trying to revive the discussion with an actual testable proposal.
Context
I've checked others design system skeletons and tried to reshape them for the EUI use case (from basic apps to very complex back-office dashboards) while trying to avoid overdoing it, otherwise it's better to directly switch to a 'skeleton' prop for every component as suggested in the discussion linked.
Proposal
The basic implementation can be within a ternary operator à la Material UI just to say
I know it's not the fanciest way, but it was also the fastest to show you a working example, we can discuss about a wrapper solution or similar once the component variants will be agreed.
Skeleton Component Structure
EuiLoadingContent
)height
width
andradius
EuiLoadingContent
component [BREAKING] (but still alive in this draft)Missing (but willing to include):
SkeletonText
Request
General feedback on this first draft, and especially about:
I'm leaving some screenshots and records but you can also checkout this branch and testing it:
https://user-images.githubusercontent.com/15049973/209408005-8a0ccc19-8ec7-42bc-9f86-6c9a75936473.mov
SkeletonCircle props:

SkeletonText props:

SkeletonHeading props:

SkeletonItem props:

QA
General checklist
I'll go trough the entire checklist once requirements will be reviewed and approved.
Tests and styles are in TODO state as well, also the code here and there it's still a mess, any advice is welcome.