diff --git a/packages/eslint-plugin/README.md b/packages/eslint-plugin/README.md index ca2a6659bad0..1d121a4f77fa 100644 --- a/packages/eslint-plugin/README.md +++ b/packages/eslint-plugin/README.md @@ -153,7 +153,7 @@ Ensure that `EuiCallOut` components rendered conditionally have the `announceOnM ### `@elastic/eui/no-unnamed-interactive-element` -Ensure that appropriate aria-attributes are set for `EuiBetaBadge`, `EuiButtonIcon`, `EuiComboBox`, `EuiSelect`, `EuiSelectWithWidth`,`EuiSuperSelect`,`EuiPagination`, `EuiTreeView`, `EuiBreadcrumbs`. Without this rule, screen reader users lose context, keyboard navigation can be confusing. +Ensure that appropriate aria-attributes are set for `EuiBadge`, `EuiButtonIcon`, `EuiComboBox`, `EuiSelect`, `EuiSelectWithWidth`,`EuiSuperSelect`,`EuiPagination`, `EuiTreeView`, `EuiBreadcrumbs`. Without this rule, screen reader users lose context, keyboard navigation can be confusing. ### `@elastic/eui/tooltip-focusable-anchor` diff --git a/packages/eslint-plugin/src/rules/a11y/no_unnamed_interactive_element.test.ts b/packages/eslint-plugin/src/rules/a11y/no_unnamed_interactive_element.test.ts index 2588150fe624..d3f1905d57da 100644 --- a/packages/eslint-plugin/src/rules/a11y/no_unnamed_interactive_element.test.ts +++ b/packages/eslint-plugin/src/rules/a11y/no_unnamed_interactive_element.test.ts @@ -23,7 +23,7 @@ const languageOptions = { ruleTester.run('NoUnnamedInteractiveElement', NoUnnamedInteractiveElement, { valid: [ // Components with allowed a11y props - { code: '', languageOptions }, + { code: '', languageOptions }, { code: '', languageOptions }, { code: '', languageOptions }, { code: '', languageOptions }, @@ -57,7 +57,7 @@ ruleTester.run('NoUnnamedInteractiveElement', NoUnnamedInteractiveElement, { invalid: [ // Missing a11y prop for interactive components { - code: '', + code: '', languageOptions, errors: [{ messageId: 'missingA11y' }], }, diff --git a/packages/eslint-plugin/src/rules/a11y/no_unnamed_interactive_element.ts b/packages/eslint-plugin/src/rules/a11y/no_unnamed_interactive_element.ts index c6425bd17d3c..d0da47e8d880 100644 --- a/packages/eslint-plugin/src/rules/a11y/no_unnamed_interactive_element.ts +++ b/packages/eslint-plugin/src/rules/a11y/no_unnamed_interactive_element.ts @@ -15,7 +15,7 @@ import { import { hasA11yPropForComponent } from '../../utils/has_a11y_prop_for_component'; const interactiveComponents = [ - 'EuiBetaBadge', + 'EuiBadge', 'EuiButtonIcon', 'EuiComboBox', 'EuiSelect', @@ -27,7 +27,7 @@ const interactiveComponents = [ ] as const; const wrappingComponents = ['EuiFormRow'] as const; -const interactiveComponentsWithLabel = ['EuiBetaBadge'] as const; +const interactiveComponentsWithLabel = ['EuiBadge'] as const; const baseA11yProps = ['aria-label', 'aria-labelledby'] as const; // Single source of truth for the utils (keeps them reusable) diff --git a/packages/eslint-plugin/src/rules/a11y/tooltip_focusable_anchor.ts b/packages/eslint-plugin/src/rules/a11y/tooltip_focusable_anchor.ts index da2255c5c4ca..644fb47e5966 100644 --- a/packages/eslint-plugin/src/rules/a11y/tooltip_focusable_anchor.ts +++ b/packages/eslint-plugin/src/rules/a11y/tooltip_focusable_anchor.ts @@ -17,7 +17,6 @@ const NON_INTERACTIVE_ELEMENTS = [ 'EuiText', 'EuiImage', 'EuiBadge', - 'EuiBetaBadge' ]; const INTERACTIVE_ATTRS = [ diff --git a/packages/eslint-plugin/src/utils/constants.ts b/packages/eslint-plugin/src/utils/constants.ts index 02013a932396..f62e71a884ec 100644 --- a/packages/eslint-plugin/src/utils/constants.ts +++ b/packages/eslint-plugin/src/utils/constants.ts @@ -100,7 +100,6 @@ export const INTERACTIVE_EUI_COMPONENTS = [ 'EuiFilterSelectItem', 'EuiFilterSelectable', 'EuiBadge', - 'EuiBetaBadge', 'EuiSelectable', 'EuiComboBox', 'EuiSuperSelect', diff --git a/packages/eui/.loki/reference/chrome_desktop_Display_EuiCard_Playground.png b/packages/eui/.loki/reference/chrome_desktop_Display_EuiCard_Playground.png index e6214c368777..1aa66cf43d38 100644 Binary files a/packages/eui/.loki/reference/chrome_desktop_Display_EuiCard_Playground.png and b/packages/eui/.loki/reference/chrome_desktop_Display_EuiCard_Playground.png differ diff --git a/packages/eui/.loki/reference/chrome_desktop_Forms_EuiFilePicker_Controlled_With_Files.png b/packages/eui/.loki/reference/chrome_desktop_Forms_EuiFilePicker_Controlled_With_Files.png new file mode 100644 index 000000000000..52a152ef56eb Binary files /dev/null and b/packages/eui/.loki/reference/chrome_desktop_Forms_EuiFilePicker_Controlled_With_Files.png differ diff --git a/packages/eui/.loki/reference/chrome_desktop_Forms_EuiForm_EuiFormControlButton_High_Contrast_Dark_Mode.png b/packages/eui/.loki/reference/chrome_desktop_Forms_EuiForm_EuiFormControlButton_High_Contrast_Dark_Mode.png index d01c3ac63611..40d5af29a389 100644 Binary files a/packages/eui/.loki/reference/chrome_desktop_Forms_EuiForm_EuiFormControlButton_High_Contrast_Dark_Mode.png and b/packages/eui/.loki/reference/chrome_desktop_Forms_EuiForm_EuiFormControlButton_High_Contrast_Dark_Mode.png differ diff --git a/packages/eui/.loki/reference/chrome_desktop_Forms_EuiForm_EuiFormControlLayoutDelimited_High_Contrast.png b/packages/eui/.loki/reference/chrome_desktop_Forms_EuiForm_EuiFormControlLayoutDelimited_High_Contrast.png index e53a0b405654..f64933d70276 100644 Binary files a/packages/eui/.loki/reference/chrome_desktop_Forms_EuiForm_EuiFormControlLayoutDelimited_High_Contrast.png and b/packages/eui/.loki/reference/chrome_desktop_Forms_EuiForm_EuiFormControlLayoutDelimited_High_Contrast.png differ diff --git a/packages/eui/.loki/reference/chrome_desktop_Forms_EuiForm_EuiFormControlLayoutDelimited_High_Contrast_Dark_Mode.png b/packages/eui/.loki/reference/chrome_desktop_Forms_EuiForm_EuiFormControlLayoutDelimited_High_Contrast_Dark_Mode.png index ecd8624d7745..bc913f8e2a9b 100644 Binary files a/packages/eui/.loki/reference/chrome_desktop_Forms_EuiForm_EuiFormControlLayoutDelimited_High_Contrast_Dark_Mode.png and b/packages/eui/.loki/reference/chrome_desktop_Forms_EuiForm_EuiFormControlLayoutDelimited_High_Contrast_Dark_Mode.png differ diff --git a/packages/eui/.loki/reference/chrome_desktop_Forms_EuiForm_EuiFormControlLayoutDelimited_Kitchen_Sink.png b/packages/eui/.loki/reference/chrome_desktop_Forms_EuiForm_EuiFormControlLayoutDelimited_Kitchen_Sink.png index 87c8443cfcb2..016041e088af 100644 Binary files a/packages/eui/.loki/reference/chrome_desktop_Forms_EuiForm_EuiFormControlLayoutDelimited_Kitchen_Sink.png and b/packages/eui/.loki/reference/chrome_desktop_Forms_EuiForm_EuiFormControlLayoutDelimited_Kitchen_Sink.png differ diff --git a/packages/eui/.loki/reference/chrome_desktop_Navigation_EuiKeyPadMenu_EuiKeyPadMenu_High_Contrast.png b/packages/eui/.loki/reference/chrome_desktop_Navigation_EuiKeyPadMenu_EuiKeyPadMenu_High_Contrast.png index 8a439d1f2dc8..ddd10e27c3f3 100644 Binary files a/packages/eui/.loki/reference/chrome_desktop_Navigation_EuiKeyPadMenu_EuiKeyPadMenu_High_Contrast.png and b/packages/eui/.loki/reference/chrome_desktop_Navigation_EuiKeyPadMenu_EuiKeyPadMenu_High_Contrast.png differ diff --git a/packages/eui/.loki/reference/chrome_desktop_Theming_EuiProvider_Font_Default_Units.png b/packages/eui/.loki/reference/chrome_desktop_Theming_EuiProvider_Font_Default_Units.png index 1de668dd68f8..5ec489c0d989 100644 Binary files a/packages/eui/.loki/reference/chrome_desktop_Theming_EuiProvider_Font_Default_Units.png and b/packages/eui/.loki/reference/chrome_desktop_Theming_EuiProvider_Font_Default_Units.png differ diff --git a/packages/eui/.loki/reference/chrome_desktop_Theming_EuiThemeProvider_CSS_Variables_Nearest.png b/packages/eui/.loki/reference/chrome_desktop_Theming_EuiThemeProvider_CSS_Variables_Nearest.png index 8732cdacbd49..c10732ffb4eb 100644 Binary files a/packages/eui/.loki/reference/chrome_desktop_Theming_EuiThemeProvider_CSS_Variables_Nearest.png and b/packages/eui/.loki/reference/chrome_desktop_Theming_EuiThemeProvider_CSS_Variables_Nearest.png differ diff --git a/packages/eui/.loki/reference/chrome_mobile_Display_EuiCard_Playground.png b/packages/eui/.loki/reference/chrome_mobile_Display_EuiCard_Playground.png index 1eab45096d06..d593f9de4b63 100644 Binary files a/packages/eui/.loki/reference/chrome_mobile_Display_EuiCard_Playground.png and b/packages/eui/.loki/reference/chrome_mobile_Display_EuiCard_Playground.png differ diff --git a/packages/eui/.loki/reference/chrome_mobile_Forms_EuiFilePicker_Controlled_With_Files.png b/packages/eui/.loki/reference/chrome_mobile_Forms_EuiFilePicker_Controlled_With_Files.png new file mode 100644 index 000000000000..b4325f29f902 Binary files /dev/null and b/packages/eui/.loki/reference/chrome_mobile_Forms_EuiFilePicker_Controlled_With_Files.png differ diff --git a/packages/eui/.loki/reference/chrome_mobile_Layout_EuiPopover_EuiPopover_Panel_Padding_Size.png b/packages/eui/.loki/reference/chrome_mobile_Layout_EuiPopover_EuiPopover_Panel_Padding_Size.png index b43023c8da04..26f7a527041d 100644 Binary files a/packages/eui/.loki/reference/chrome_mobile_Layout_EuiPopover_EuiPopover_Panel_Padding_Size.png and b/packages/eui/.loki/reference/chrome_mobile_Layout_EuiPopover_EuiPopover_Panel_Padding_Size.png differ diff --git a/packages/eui/.loki/reference/chrome_mobile_Navigation_EuiKeyPadMenu_EuiKeyPadMenu_High_Contrast.png b/packages/eui/.loki/reference/chrome_mobile_Navigation_EuiKeyPadMenu_EuiKeyPadMenu_High_Contrast.png index 168aa008ac58..66834b5586ea 100644 Binary files a/packages/eui/.loki/reference/chrome_mobile_Navigation_EuiKeyPadMenu_EuiKeyPadMenu_High_Contrast.png and b/packages/eui/.loki/reference/chrome_mobile_Navigation_EuiKeyPadMenu_EuiKeyPadMenu_High_Contrast.png differ diff --git a/packages/eui/src/components/badge/beta_badge/beta_badge.tsx b/packages/eui/src/components/badge/beta_badge/beta_badge.tsx index 9ef89cdee524..807606726797 100644 --- a/packages/eui/src/components/badge/beta_badge/beta_badge.tsx +++ b/packages/eui/src/components/badge/beta_badge/beta_badge.tsx @@ -127,6 +127,9 @@ export type EuiBetaBadgeProps = CommonProps & > & BadgeProps; +/** + * @deprecated Use `EuiBadge` instead + */ export const EuiBetaBadge: FunctionComponent = ({ className, label, diff --git a/packages/eui/src/components/card/__snapshots__/card.test.tsx.snap b/packages/eui/src/components/card/__snapshots__/card.test.tsx.snap index 3a6adcf33024..220f8b2cbd8d 100644 --- a/packages/eui/src/components/card/__snapshots__/card.test.tsx.snap +++ b/packages/eui/src/components/card/__snapshots__/card.test.tsx.snap @@ -33,13 +33,21 @@ exports[`EuiCard betaBadgeProps renders href 1`] = ` class="emotion-euiCard__betaBadgeAnchor" > - Link + + + Link + + diff --git a/packages/eui/src/components/card/card.stories.tsx b/packages/eui/src/components/card/card.stories.tsx index 334df38a938d..576aa2942e29 100644 --- a/packages/eui/src/components/card/card.stories.tsx +++ b/packages/eui/src/components/card/card.stories.tsx @@ -46,6 +46,13 @@ export const Playground: Story = { title: 'Card title', description: 'Card description', footer: '', + betaBadgeProps: { + "color": "accent", + "children": "Hello" + }, + betaBadgeTooltipProps: { + "content": "hello" + } }, render: function Render({ icon, diff --git a/packages/eui/src/components/card/card.styles.ts b/packages/eui/src/components/card/card.styles.ts index c6bb60472405..aae2656c3c96 100644 --- a/packages/eui/src/components/card/card.styles.ts +++ b/packages/eui/src/components/card/card.styles.ts @@ -268,6 +268,16 @@ export const euiCardBetaBadgeStyles = ( euiCard__betaBadge: css` ${logicalCSS('width', '100%')} + + /* Styles to keep visual parity with EuiBetaBadge */ + align-items: center; + block-size: ${euiTheme.size.l}; + display: flex; + font-weight: ${euiTheme.font.weight.semiBold}; + letter-spacing: 0.05em; + padding-inline: ${euiTheme.size.base}; + text-align: center; + text-transform: uppercase; `, }; }; diff --git a/packages/eui/src/components/card/card.test.tsx b/packages/eui/src/components/card/card.test.tsx index 28334a47482b..574b5dcaebde 100644 --- a/packages/eui/src/components/card/card.test.tsx +++ b/packages/eui/src/components/card/card.test.tsx @@ -33,8 +33,8 @@ describe('EuiCard', () => { }); shouldRenderCustomStyles( - , - { childProps: ['betaBadgeProps', 'betaBadgeProps.anchorProps'] } + , + { childProps: ['betaBadgeProps', 'betaBadgeTooltipProps.anchorProps'] } ); describe('props', () => { @@ -329,7 +329,7 @@ describe('EuiCard', () => { description="Card description" betaBadgeProps={{ href: 'http://www.elastic.co/', - label: 'Link', + children: 'Link', }} /> ); diff --git a/packages/eui/src/components/card/card.tsx b/packages/eui/src/components/card/card.tsx index fd5c38071a6b..84675062280a 100644 --- a/packages/eui/src/components/card/card.tsx +++ b/packages/eui/src/components/card/card.tsx @@ -24,12 +24,13 @@ import { useGeneratedHtmlId } from '../../services/accessibility'; import { validateHref } from '../../services/security/href_validator'; import { CommonProps, ExclusiveUnion } from '../common'; -import { EuiText } from '../text'; -import { EuiTitle } from '../title'; -import { EuiBetaBadge, EuiBetaBadgeProps } from '../badge/beta_badge'; +import { EuiBadge, EuiBadgeProps } from '../badge'; import { EuiIconProps } from '../icon'; import { EuiPanel, EuiPanelProps } from '../panel'; import { EuiSpacer } from '../spacer'; +import { EuiText } from '../text'; +import { EuiTitle } from '../title'; +import { EuiToolTip, EuiToolTipProps } from '../tool_tip'; import { EuiCardSelect, EuiCardSelectProps } from './card_select'; import { @@ -114,10 +115,15 @@ export type EuiCardProps = Omit & target?: string; rel?: string; /** - * Adds a badge to top of the card to label it as "Beta" or other non-GA state. - * Accepts all the props of [EuiBetaBadge](#/display/badge#beta-badge-type), where `label` is required. + * Adds a badge to top of the card. + * Accepts all the props of {@link https://eui.elastic.co/docs/components/display/badge/ | EuiBadge}. + */ + betaBadgeProps?: EuiBadgeProps; + /** + * Extends the wrapping {@link https://eui.elastic.co/docs/components/display/tooltip/ | EuiToolTip} props + * when `betaBadgeProps` is provided. */ - betaBadgeProps?: EuiBetaBadgeProps; + betaBadgeTooltipProps?: Omit; /** * Matches to the color property of EuiPanel. If defined, removes any border & shadow. * Leave as `undefined` to display as a default panel. @@ -155,6 +161,7 @@ export const EuiCard: FunctionComponent = ({ target, textAlign = 'center', betaBadgeProps, + betaBadgeTooltipProps, layout = 'vertical', selectable, display, @@ -267,37 +274,61 @@ export const EuiCard: FunctionComponent = ({ } /** - * Optional EuiBetaBadge + * Optional `EuiBadge` */ let optionalBetaBadge; let optionalBetaBadgeID = ''; let optionalBetaCSS; - if (betaBadgeProps?.label) { + + if (betaBadgeProps?.children) { const betaStyles = euiCardBetaBadgeStyles(euiThemeContext, paddingSize); optionalBetaCSS = betaStyles.hasBetaBadge; - const { anchorProps, ...cleanedBetaBadgeProps } = betaBadgeProps; - const anchorCSS = [betaStyles.euiCard__betaBadgeAnchor, anchorProps?.css]; + const { anchorProps: tooltipAnchorProps, ...tooltipPropsRest } = + betaBadgeTooltipProps ?? {}; + const { css: tooltipAnchorCss, ...tooltipAnchorRest } = + tooltipAnchorProps ?? {}; + + const anchorCSS = [betaStyles.euiCard__betaBadgeAnchor, tooltipAnchorCss]; const badgeCSS = [betaStyles.euiCard__betaBadge, betaBadgeProps?.css]; optionalBetaBadgeID = `${ariaId}BetaBadge`; - optionalBetaBadge = ( - ); - // Increase padding size when there is a beta badge unless it's already determined - // paddingSize = paddingSize || 'l'; + const hasTooltip = + betaBadgeTooltipProps?.content != null || + betaBadgeTooltipProps?.title != null; + + optionalBetaBadge = ( + // Card positioning must live on an outer wrapper + + {hasTooltip ? ( + {badge} + ) : ( + badge + )} + + ); } /** diff --git a/packages/eui/src/components/key_pad_menu/__snapshots__/key_pad_menu_item.test.tsx.snap b/packages/eui/src/components/key_pad_menu/__snapshots__/key_pad_menu_item.test.tsx.snap index f3ff07cb30b7..aec1fa7bb3e2 100644 --- a/packages/eui/src/components/key_pad_menu/__snapshots__/key_pad_menu_item.test.tsx.snap +++ b/packages/eui/src/components/key_pad_menu/__snapshots__/key_pad_menu_item.test.tsx.snap @@ -116,13 +116,19 @@ exports[`EuiKeyPadMenuItem props betaBadge renders 1`] = ` - + - + - +