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`] = `