- For buttons on dark color backgrounds, you can pass{' '}
- {'color="ghost"'} to any of the
- button components on this page. These should be used extremely rarely,
- and are only for placing buttons on top of dark or image-based
- backgrounds. A good example of their use is in the{' '}
+ For buttons on dark color backgrounds, it is recommended to wrap the
+ entire area in{' '}
+
+ {''}
+ {' '}
+ to invert all colors to dark mode. The legacy{' '}
+ {'color="ghost"'} now uses this
+ method and is set for deprecation. An example usage of inverted
+ buttons is in combination with{' '}
EuiBottomBar
{' '}
- component.
+ which already wraps its children in dark mode.
To mask the top and bottom of the scrolled content, indicating
visually that there is more content below, pass in true to the
- second paremeter mask.
+ second parameter mask.
To mask the top and bottom of the scrolled content, indicating
visually that there is more content below, pass in true to the
- second paremeter mask.
+ second parameter mask.
{"useEuiOverflowScroll('y', true);"}
diff --git a/src-docs/src/views/theme/color/contrast.tsx b/src-docs/src/views/theme/color/contrast.tsx
index e4e9216ce96..5d533f949bb 100644
--- a/src-docs/src/views/theme/color/contrast.tsx
+++ b/src-docs/src/views/theme/color/contrast.tsx
@@ -338,10 +338,10 @@ export default () => {
{
<>
@@ -157,7 +157,7 @@ export default () => {
setJsonFlyoutIsOpen(true)}
- color="ghost"
+ color="text"
>
View theme JSON
diff --git a/src/components/accessibility/skip_link/__snapshots__/skip_link.test.tsx.snap b/src/components/accessibility/skip_link/__snapshots__/skip_link.test.tsx.snap
index a6951307e41..10f6e9e4a4e 100644
--- a/src/components/accessibility/skip_link/__snapshots__/skip_link.test.tsx.snap
+++ b/src/components/accessibility/skip_link/__snapshots__/skip_link.test.tsx.snap
@@ -3,16 +3,16 @@
exports[`EuiSkipLink is rendered 1`] = `
Skip
@@ -22,82 +22,62 @@ exports[`EuiSkipLink is rendered 1`] = `
exports[`EuiSkipLink props onClick is rendered 1`] = `
-
-
+ class="emotion-euiButtonDisplayContent"
+ />
`;
exports[`EuiSkipLink props position absolute is rendered 1`] = `
-
-
+ class="emotion-euiButtonDisplayContent"
+ />
`;
exports[`EuiSkipLink props position fixed is rendered 1`] = `
-
-
+ class="emotion-euiButtonDisplayContent"
+ />
`;
exports[`EuiSkipLink props position static is rendered 1`] = `
-
-
+ class="emotion-euiButtonDisplayContent"
+ />
`;
exports[`EuiSkipLink props tabIndex is rendered 1`] = `
-
-
+ class="emotion-euiButtonDisplayContent"
+ />
`;
diff --git a/src/components/accessibility/skip_link/skip_link.test.tsx b/src/components/accessibility/skip_link/skip_link.test.tsx
index c8dd6c7d026..19c7f3161ec 100644
--- a/src/components/accessibility/skip_link/skip_link.test.tsx
+++ b/src/components/accessibility/skip_link/skip_link.test.tsx
@@ -37,7 +37,7 @@ describe('EuiSkipLink', () => {
);
const preventDefault = jest.fn();
- component.find('EuiButton').simulate('click', { preventDefault });
+ component.find('a').simulate('click', { preventDefault });
expect(preventDefault).toHaveBeenCalled();
expect(focusSpy).toHaveBeenCalled();
@@ -50,11 +50,11 @@ describe('EuiSkipLink', () => {
const component = mount(
);
- component.find('EuiButton').simulate('click');
+ component.find('a').simulate('click');
expect(scrollSpy).not.toHaveBeenCalled();
mockElement.getBoundingClientRect = () => ({ top: 1000 } as any);
- component.find('EuiButton').simulate('click');
+ component.find('a').simulate('click');
expect(scrollSpy).toHaveBeenCalled();
});
});
diff --git a/src/components/accordion/__snapshots__/accordion.test.tsx.snap b/src/components/accordion/__snapshots__/accordion.test.tsx.snap
index c837f863ea6..a54c39cd561 100644
--- a/src/components/accordion/__snapshots__/accordion.test.tsx.snap
+++ b/src/components/accordion/__snapshots__/accordion.test.tsx.snap
@@ -11,7 +11,7 @@ exports[`EuiAccordion behavior closes when clicked twice 1`] = `
aria-controls="20"
aria-expanded="false"
aria-labelledby="generated-id"
- class="euiButtonIcon euiButtonIcon--text euiButtonIcon--empty euiButtonIcon--xSmall euiAccordion__iconButton emotion-euiAccordion__iconButton"
+ class="euiButtonIcon euiButtonIcon--xSmall euiAccordion__iconButton css-1r6f2je-empty-text-hoverStyles-EuiButtonIcon-euiAccordion__iconButton"
tabindex="-1"
type="button"
>
@@ -65,7 +65,7 @@ exports[`EuiAccordion behavior does not open when isDisabled 1`] = `
aria-controls="18"
aria-expanded="false"
aria-labelledby="generated-id"
- class="euiButtonIcon euiButtonIcon-isDisabled euiButtonIcon--text euiButtonIcon--empty euiButtonIcon--xSmall euiAccordion__iconButton emotion-euiAccordion__iconButton"
+ class="euiButtonIcon euiButtonIcon--xSmall euiAccordion__iconButton css-lc7o8f-empty-disabled-hoverStyles-EuiButtonIcon-euiAccordion__iconButton"
disabled=""
tabindex="-1"
type="button"
@@ -121,7 +121,7 @@ exports[`EuiAccordion behavior opens when clicked once 1`] = `
aria-controls="17"
aria-expanded="true"
aria-labelledby="generated-id"
- class="euiButtonIcon euiButtonIcon--text euiButtonIcon--empty euiButtonIcon--xSmall euiAccordion__iconButton euiAccordion__iconButton-isOpen emotion-euiAccordion__iconButton-isOpen"
+ class="euiButtonIcon euiButtonIcon--xSmall euiAccordion__iconButton euiAccordion__iconButton-isOpen css-1o4u7sp-empty-text-hoverStyles-EuiButtonIcon-euiAccordion__iconButton-isOpen"
tabindex="-1"
type="button"
>
@@ -175,7 +175,7 @@ exports[`EuiAccordion behavior opens when div is clicked if element is a div 1`]
aria-controls="19"
aria-expanded="true"
aria-labelledby="generated-id"
- class="euiButtonIcon euiButtonIcon--text euiButtonIcon--empty euiButtonIcon--xSmall euiAccordion__iconButton euiAccordion__iconButton-isOpen emotion-euiAccordion__iconButton-isOpen"
+ class="euiButtonIcon euiButtonIcon--xSmall euiAccordion__iconButton euiAccordion__iconButton-isOpen css-1o4u7sp-empty-text-hoverStyles-EuiButtonIcon-euiAccordion__iconButton-isOpen"
tabindex="-1"
type="button"
>
@@ -231,7 +231,7 @@ exports[`EuiAccordion is rendered 1`] = `
aria-controls="0"
aria-expanded="false"
aria-labelledby="generated-id"
- class="euiButtonIcon euiButtonIcon--text euiButtonIcon--empty euiButtonIcon--xSmall euiAccordion__iconButton emotion-euiAccordion__iconButton"
+ class="euiButtonIcon euiButtonIcon--xSmall euiAccordion__iconButton css-1r6f2je-empty-text-hoverStyles-EuiButtonIcon-euiAccordion__iconButton"
tabindex="-1"
type="button"
>
@@ -281,7 +281,7 @@ exports[`EuiAccordion isDisabled is rendered 1`] = `
aria-controls="16"
aria-expanded="false"
aria-labelledby="generated-id"
- class="euiButtonIcon euiButtonIcon-isDisabled euiButtonIcon--text euiButtonIcon--empty euiButtonIcon--xSmall euiAccordion__iconButton emotion-euiAccordion__iconButton"
+ class="euiButtonIcon euiButtonIcon--xSmall euiAccordion__iconButton css-lc7o8f-empty-disabled-hoverStyles-EuiButtonIcon-euiAccordion__iconButton"
disabled=""
tabindex="-1"
type="button"
@@ -379,7 +379,7 @@ exports[`EuiAccordion props arrowDisplay right is rendered 1`] = `
aria-controls="8"
aria-expanded="false"
aria-labelledby="generated-id"
- class="euiButtonIcon euiButtonIcon--text euiButtonIcon--empty euiButtonIcon--xSmall euiAccordion__iconButton euiAccordion__iconButton--right emotion-euiAccordion__iconButton-arrowRight"
+ class="euiButtonIcon euiButtonIcon--xSmall euiAccordion__iconButton euiAccordion__iconButton--right css-1f2dcop-empty-text-hoverStyles-EuiButtonIcon-euiAccordion__iconButton-arrowRight"
tabindex="-1"
type="button"
>
@@ -419,7 +419,7 @@ exports[`EuiAccordion props arrowProps is rendered 1`] = `
aria-expanded="false"
aria-label="aria-label"
aria-labelledby="generated-id"
- class="euiButtonIcon euiButtonIcon--text euiButtonIcon--empty euiButtonIcon--xSmall euiAccordion__iconButton testClass1 testClass2 emotion-euiAccordion__iconButton"
+ class="euiButtonIcon euiButtonIcon--xSmall euiAccordion__iconButton testClass1 testClass2 css-1r6f2je-empty-text-hoverStyles-EuiButtonIcon-euiAccordion__iconButton"
data-test-subj="test subject string"
tabindex="-1"
type="button"
@@ -470,7 +470,7 @@ exports[`EuiAccordion props buttonContent is rendered 1`] = `
aria-controls="3"
aria-expanded="false"
aria-labelledby="generated-id"
- class="euiButtonIcon euiButtonIcon--text euiButtonIcon--empty euiButtonIcon--xSmall euiAccordion__iconButton emotion-euiAccordion__iconButton"
+ class="euiButtonIcon euiButtonIcon--xSmall euiAccordion__iconButton css-1r6f2je-empty-text-hoverStyles-EuiButtonIcon-euiAccordion__iconButton"
tabindex="-1"
type="button"
>
@@ -524,7 +524,7 @@ exports[`EuiAccordion props buttonContentClassName is rendered 1`] = `
aria-controls="2"
aria-expanded="false"
aria-labelledby="generated-id"
- class="euiButtonIcon euiButtonIcon--text euiButtonIcon--empty euiButtonIcon--xSmall euiAccordion__iconButton emotion-euiAccordion__iconButton"
+ class="euiButtonIcon euiButtonIcon--xSmall euiAccordion__iconButton css-1r6f2je-empty-text-hoverStyles-EuiButtonIcon-euiAccordion__iconButton"
tabindex="-1"
type="button"
>
@@ -574,7 +574,7 @@ exports[`EuiAccordion props buttonElement is rendered 1`] = `
aria-controls="5"
aria-expanded="false"
aria-labelledby="generated-id"
- class="euiButtonIcon euiButtonIcon--text euiButtonIcon--empty euiButtonIcon--xSmall euiAccordion__iconButton emotion-euiAccordion__iconButton"
+ class="euiButtonIcon euiButtonIcon--xSmall euiAccordion__iconButton css-1r6f2je-empty-text-hoverStyles-EuiButtonIcon-euiAccordion__iconButton"
tabindex="0"
type="button"
>
@@ -623,7 +623,7 @@ exports[`EuiAccordion props buttonProps is rendered 1`] = `
aria-controls="4"
aria-expanded="false"
aria-labelledby="generated-id"
- class="euiButtonIcon euiButtonIcon--text euiButtonIcon--empty euiButtonIcon--xSmall euiAccordion__iconButton emotion-euiAccordion__iconButton"
+ class="euiButtonIcon euiButtonIcon--xSmall euiAccordion__iconButton css-1r6f2je-empty-text-hoverStyles-EuiButtonIcon-euiAccordion__iconButton"
tabindex="-1"
type="button"
>
@@ -675,7 +675,7 @@ exports[`EuiAccordion props element is rendered 1`] = `
aria-controls="1"
aria-expanded="false"
aria-labelledby="generated-id"
- class="euiButtonIcon euiButtonIcon--text euiButtonIcon--empty euiButtonIcon--xSmall euiAccordion__iconButton emotion-euiAccordion__iconButton"
+ class="euiButtonIcon euiButtonIcon--xSmall euiAccordion__iconButton css-1r6f2je-empty-text-hoverStyles-EuiButtonIcon-euiAccordion__iconButton"
tabindex="0"
type="button"
>
@@ -724,7 +724,7 @@ exports[`EuiAccordion props extraAction is rendered 1`] = `
aria-controls="6"
aria-expanded="false"
aria-labelledby="generated-id"
- class="euiButtonIcon euiButtonIcon--text euiButtonIcon--empty euiButtonIcon--xSmall euiAccordion__iconButton emotion-euiAccordion__iconButton"
+ class="euiButtonIcon euiButtonIcon--xSmall euiAccordion__iconButton css-1r6f2je-empty-text-hoverStyles-EuiButtonIcon-euiAccordion__iconButton"
tabindex="-1"
type="button"
>
@@ -781,7 +781,7 @@ exports[`EuiAccordion props forceState closed is rendered 1`] = `
aria-controls="11"
aria-expanded="false"
aria-labelledby="generated-id"
- class="euiButtonIcon euiButtonIcon--text euiButtonIcon--empty euiButtonIcon--xSmall euiAccordion__iconButton emotion-euiAccordion__iconButton"
+ class="euiButtonIcon euiButtonIcon--xSmall euiAccordion__iconButton css-1r6f2je-empty-text-hoverStyles-EuiButtonIcon-euiAccordion__iconButton"
tabindex="-1"
type="button"
>
@@ -835,7 +835,7 @@ exports[`EuiAccordion props forceState open is rendered 1`] = `
aria-controls="12"
aria-expanded="true"
aria-labelledby="generated-id"
- class="euiButtonIcon euiButtonIcon--text euiButtonIcon--empty euiButtonIcon--xSmall euiAccordion__iconButton euiAccordion__iconButton-isOpen emotion-euiAccordion__iconButton-isOpen"
+ class="euiButtonIcon euiButtonIcon--xSmall euiAccordion__iconButton euiAccordion__iconButton-isOpen css-1o4u7sp-empty-text-hoverStyles-EuiButtonIcon-euiAccordion__iconButton-isOpen"
tabindex="-1"
type="button"
>
@@ -889,7 +889,7 @@ exports[`EuiAccordion props initialIsOpen is rendered 1`] = `
aria-controls="7"
aria-expanded="true"
aria-labelledby="generated-id"
- class="euiButtonIcon euiButtonIcon--text euiButtonIcon--empty euiButtonIcon--xSmall euiAccordion__iconButton euiAccordion__iconButton-isOpen emotion-euiAccordion__iconButton-isOpen"
+ class="euiButtonIcon euiButtonIcon--xSmall euiAccordion__iconButton euiAccordion__iconButton-isOpen css-1o4u7sp-empty-text-hoverStyles-EuiButtonIcon-euiAccordion__iconButton-isOpen"
tabindex="-1"
type="button"
>
@@ -943,7 +943,7 @@ exports[`EuiAccordion props isLoading is rendered 1`] = `
aria-controls="14"
aria-expanded="false"
aria-labelledby="generated-id"
- class="euiButtonIcon euiButtonIcon--text euiButtonIcon--empty euiButtonIcon--xSmall euiAccordion__iconButton emotion-euiAccordion__iconButton"
+ class="euiButtonIcon euiButtonIcon--xSmall euiAccordion__iconButton css-1r6f2je-empty-text-hoverStyles-EuiButtonIcon-euiAccordion__iconButton"
tabindex="-1"
type="button"
>
@@ -1002,7 +1002,7 @@ exports[`EuiAccordion props isLoadingMessage is rendered 1`] = `
aria-controls="15"
aria-expanded="false"
aria-labelledby="generated-id"
- class="euiButtonIcon euiButtonIcon--text euiButtonIcon--empty euiButtonIcon--xSmall euiAccordion__iconButton emotion-euiAccordion__iconButton"
+ class="euiButtonIcon euiButtonIcon--xSmall euiAccordion__iconButton css-1r6f2je-empty-text-hoverStyles-EuiButtonIcon-euiAccordion__iconButton"
tabindex="-1"
type="button"
>
diff --git a/src/components/basic_table/__snapshots__/collapsed_item_actions.test.tsx.snap b/src/components/basic_table/__snapshots__/collapsed_item_actions.test.tsx.snap
index a3a0367eb51..5d6158faa98 100644
--- a/src/components/basic_table/__snapshots__/collapsed_item_actions.test.tsx.snap
+++ b/src/components/basic_table/__snapshots__/collapsed_item_actions.test.tsx.snap
@@ -13,7 +13,7 @@ exports[`CollapsedItemActions render 1`] = `
>
@@ -246,7 +247,7 @@ exports[`EuiMarkdownEditor is rendered 1`] = `
>
@@ -263,7 +264,7 @@ exports[`EuiMarkdownEditor is rendered 1`] = `
>
@@ -283,7 +284,7 @@ exports[`EuiMarkdownEditor is rendered 1`] = `
>
@@ -300,7 +301,7 @@ exports[`EuiMarkdownEditor is rendered 1`] = `
>
@@ -317,7 +318,7 @@ exports[`EuiMarkdownEditor is rendered 1`] = `
>
@@ -337,7 +338,7 @@ exports[`EuiMarkdownEditor is rendered 1`] = `
>
@@ -354,7 +355,7 @@ exports[`EuiMarkdownEditor is rendered 1`] = `
>
@@ -371,7 +372,7 @@ exports[`EuiMarkdownEditor is rendered 1`] = `
>
@@ -391,7 +392,7 @@ exports[`EuiMarkdownEditor is rendered 1`] = `
>
@@ -405,7 +406,8 @@ exports[`EuiMarkdownEditor is rendered 1`] = `
@@ -509,7 +511,7 @@ exports[`EuiMarkdownEditor props autoExpandPreview is rendered with false 1`] =
>
@@ -529,7 +531,7 @@ exports[`EuiMarkdownEditor props autoExpandPreview is rendered with false 1`] =
>
@@ -546,7 +548,7 @@ exports[`EuiMarkdownEditor props autoExpandPreview is rendered with false 1`] =
>
@@ -563,7 +565,7 @@ exports[`EuiMarkdownEditor props autoExpandPreview is rendered with false 1`] =
>
@@ -583,7 +585,7 @@ exports[`EuiMarkdownEditor props autoExpandPreview is rendered with false 1`] =
>
@@ -600,7 +602,7 @@ exports[`EuiMarkdownEditor props autoExpandPreview is rendered with false 1`] =
>
@@ -617,7 +619,7 @@ exports[`EuiMarkdownEditor props autoExpandPreview is rendered with false 1`] =
>
@@ -637,7 +639,7 @@ exports[`EuiMarkdownEditor props autoExpandPreview is rendered with false 1`] =
>
@@ -651,7 +653,8 @@ exports[`EuiMarkdownEditor props autoExpandPreview is rendered with false 1`] =
@@ -754,7 +757,7 @@ exports[`EuiMarkdownEditor props height is rendered in full mode 1`] = `
>
@@ -774,7 +777,7 @@ exports[`EuiMarkdownEditor props height is rendered in full mode 1`] = `
>
@@ -791,7 +794,7 @@ exports[`EuiMarkdownEditor props height is rendered in full mode 1`] = `
>
@@ -808,7 +811,7 @@ exports[`EuiMarkdownEditor props height is rendered in full mode 1`] = `
>
@@ -828,7 +831,7 @@ exports[`EuiMarkdownEditor props height is rendered in full mode 1`] = `
>
@@ -845,7 +848,7 @@ exports[`EuiMarkdownEditor props height is rendered in full mode 1`] = `
>
@@ -862,7 +865,7 @@ exports[`EuiMarkdownEditor props height is rendered in full mode 1`] = `
>
@@ -882,7 +885,7 @@ exports[`EuiMarkdownEditor props height is rendered in full mode 1`] = `
>
@@ -896,7 +899,8 @@ exports[`EuiMarkdownEditor props height is rendered in full mode 1`] = `
@@ -999,7 +1003,7 @@ exports[`EuiMarkdownEditor props height is rendered with a custom size 1`] = `
>
@@ -1019,7 +1023,7 @@ exports[`EuiMarkdownEditor props height is rendered with a custom size 1`] = `
>
@@ -1036,7 +1040,7 @@ exports[`EuiMarkdownEditor props height is rendered with a custom size 1`] = `
>
@@ -1053,7 +1057,7 @@ exports[`EuiMarkdownEditor props height is rendered with a custom size 1`] = `
>
@@ -1073,7 +1077,7 @@ exports[`EuiMarkdownEditor props height is rendered with a custom size 1`] = `
>
@@ -1090,7 +1094,7 @@ exports[`EuiMarkdownEditor props height is rendered with a custom size 1`] = `
>
@@ -1107,7 +1111,7 @@ exports[`EuiMarkdownEditor props height is rendered with a custom size 1`] = `
>
@@ -1127,7 +1131,7 @@ exports[`EuiMarkdownEditor props height is rendered with a custom size 1`] = `
>
@@ -1141,7 +1145,8 @@ exports[`EuiMarkdownEditor props height is rendered with a custom size 1`] = `
@@ -1244,7 +1249,7 @@ exports[`EuiMarkdownEditor props maxHeight is rendered with a custom size 1`] =
>
@@ -1264,7 +1269,7 @@ exports[`EuiMarkdownEditor props maxHeight is rendered with a custom size 1`] =
>
@@ -1281,7 +1286,7 @@ exports[`EuiMarkdownEditor props maxHeight is rendered with a custom size 1`] =
>
@@ -1298,7 +1303,7 @@ exports[`EuiMarkdownEditor props maxHeight is rendered with a custom size 1`] =
>
@@ -1318,7 +1323,7 @@ exports[`EuiMarkdownEditor props maxHeight is rendered with a custom size 1`] =
>
@@ -1335,7 +1340,7 @@ exports[`EuiMarkdownEditor props maxHeight is rendered with a custom size 1`] =
>
@@ -1352,7 +1357,7 @@ exports[`EuiMarkdownEditor props maxHeight is rendered with a custom size 1`] =
>
@@ -1372,7 +1377,7 @@ exports[`EuiMarkdownEditor props maxHeight is rendered with a custom size 1`] =
>
@@ -1386,7 +1391,8 @@ exports[`EuiMarkdownEditor props maxHeight is rendered with a custom size 1`] =
@@ -1687,7 +1694,7 @@ exports[`EuiMarkdownEditor props readOnly is set to true 1`] = `
>
diff --git a/src/components/markdown_editor/markdown_editor.test.tsx b/src/components/markdown_editor/markdown_editor.test.tsx
index 903f4c2e7fe..f85d572825e 100644
--- a/src/components/markdown_editor/markdown_editor.test.tsx
+++ b/src/components/markdown_editor/markdown_editor.test.tsx
@@ -119,7 +119,9 @@ describe('EuiMarkdownEditor', () => {
{...requiredProps}
/>
);
- component.find('EuiButtonEmpty').simulate('click');
+ component
+ .find('button[data-test-subj="markdown_editor_preview_button"]')
+ .simulate('click');
const rendered = component.render();
expect(
rendered.find('.euiText.euiMarkdownFormat').find('h2').text()
@@ -138,7 +140,7 @@ describe('EuiMarkdownEditor', () => {
expect(component.find('EuiModal').length).toBe(0);
component
- .find('EuiButtonIcon.euiMarkdownEditorFooter__helpButton')
+ .find('button.euiMarkdownEditorFooter__helpButton')
.simulate('click');
expect(component.find('EuiModal').length).toBe(1);
@@ -163,7 +165,7 @@ describe('EuiMarkdownEditor', () => {
/>
);
component
- .find('EuiButtonIcon.euiMarkdownEditorFooter__helpButton')
+ .find('button.euiMarkdownEditorFooter__helpButton')
.simulate('click');
expect(component.render()).toMatchSnapshot();
diff --git a/src/components/markdown_editor/markdown_editor_toolbar.tsx b/src/components/markdown_editor/markdown_editor_toolbar.tsx
index 727cda75a2a..f179d092ecd 100644
--- a/src/components/markdown_editor/markdown_editor_toolbar.tsx
+++ b/src/components/markdown_editor/markdown_editor_toolbar.tsx
@@ -219,6 +219,7 @@ export const EuiMarkdownEditorToolbar = forwardRef<
{isPreviewing ? (
) : (
@@ -87,15 +87,15 @@ Array [
Confirm Button Text
@@ -142,7 +142,7 @@ Array [
>
@@ -186,15 +186,15 @@ Array [
Confirm Button Text
diff --git a/src/components/modal/__snapshots__/modal.test.tsx.snap b/src/components/modal/__snapshots__/modal.test.tsx.snap
index 23ccb522185..4395d02631a 100644
--- a/src/components/modal/__snapshots__/modal.test.tsx.snap
+++ b/src/components/modal/__snapshots__/modal.test.tsx.snap
@@ -27,7 +27,7 @@ Array [
>
@@ -695,7 +695,7 @@ exports[`EuiNotificationEvent props primaryActionProps is rendered 1`] = `
class="euiNotificationEvent__primaryAction"
>
diff --git a/src/components/notification/__snapshots__/notification_event_read_button.test.tsx.snap b/src/components/notification/__snapshots__/notification_event_read_button.test.tsx.snap
index bafe9b2353a..854ff66f7ca 100644
--- a/src/components/notification/__snapshots__/notification_event_read_button.test.tsx.snap
+++ b/src/components/notification/__snapshots__/notification_event_read_button.test.tsx.snap
@@ -3,7 +3,7 @@
exports[`EuiNotificationEventReadButton is rendered 1`] = `
@@ -203,7 +203,7 @@ exports[`EuiPagination props activePage is rendered 1`] = `
>
@@ -223,7 +223,7 @@ exports[`EuiPagination props activePage is rendered 1`] = `
>
@@ -244,7 +244,7 @@ exports[`EuiPagination props activePage is rendered 1`] = `
@@ -285,7 +285,7 @@ exports[`EuiPagination props activePage is rendered 1`] = `
>
@@ -305,7 +305,7 @@ exports[`EuiPagination props activePage is rendered 1`] = `
>
@@ -325,7 +325,7 @@ exports[`EuiPagination props activePage is rendered 1`] = `
>
@@ -343,7 +343,7 @@ exports[`EuiPagination props activePage is rendered 1`] = `
@@ -657,7 +657,7 @@ exports[`EuiPagination props pageCount is rendered 1`] = `
>
@@ -677,7 +677,7 @@ exports[`EuiPagination props pageCount is rendered 1`] = `
>
@@ -697,7 +697,7 @@ exports[`EuiPagination props pageCount is rendered 1`] = `
>
@@ -723,7 +723,7 @@ exports[`EuiPagination props pageCount is rendered 1`] = `
>
@@ -741,7 +741,7 @@ exports[`EuiPagination props pageCount is rendered 1`] = `
diff --git a/src/components/side_nav/__snapshots__/side_nav.test.tsx.snap b/src/components/side_nav/__snapshots__/side_nav.test.tsx.snap
index 39d64574b3e..ffc72bb4285 100644
--- a/src/components/side_nav/__snapshots__/side_nav.test.tsx.snap
+++ b/src/components/side_nav/__snapshots__/side_nav.test.tsx.snap
@@ -526,7 +526,7 @@ exports[`EuiSideNav props mobileBreakpoints can be adjusted is rendered 1`] = `
>
@@ -54,7 +54,7 @@ exports[`EuiTablePagination is rendered 1`] = `
@@ -96,7 +96,7 @@ exports[`EuiTablePagination is rendered 1`] = `
@@ -137,7 +137,7 @@ exports[`EuiTablePagination is rendered 1`] = `
>
@@ -157,7 +157,7 @@ exports[`EuiTablePagination is rendered 1`] = `
>
@@ -175,7 +175,7 @@ exports[`EuiTablePagination is rendered 1`] = `
@@ -259,7 +259,7 @@ exports[`EuiTablePagination is rendered when hiding the per page options 1`] = `
@@ -300,7 +300,7 @@ exports[`EuiTablePagination is rendered when hiding the per page options 1`] = `
>
@@ -320,7 +320,7 @@ exports[`EuiTablePagination is rendered when hiding the per page options 1`] = `
>
@@ -338,7 +338,7 @@ exports[`EuiTablePagination is rendered when hiding the per page options 1`] = `
diff --git a/src/components/text/text.styles.ts b/src/components/text/text.styles.ts
index e5b08c01a60..2387ff2e3bb 100644
--- a/src/components/text/text.styles.ts
+++ b/src/components/text/text.styles.ts
@@ -226,7 +226,7 @@ export const euiTextStyles = (euiThemeContext: UseEuiTheme) => {
// Style anchors that don't have a class. This prevents overwriting "buttons"
// and other stylized elements passed in.
a:not([class]) {
- ${euiLinkCSS(euiTheme)}
+ ${euiLinkCSS(euiThemeContext)}
}
img {
diff --git a/src/components/toast/__snapshots__/global_toast_list.test.tsx.snap b/src/components/toast/__snapshots__/global_toast_list.test.tsx.snap
index 010b9feba93..ae973e43a96 100644
--- a/src/components/toast/__snapshots__/global_toast_list.test.tsx.snap
+++ b/src/components/toast/__snapshots__/global_toast_list.test.tsx.snap
@@ -45,7 +45,7 @@ exports[`EuiGlobalToastList props side can be changed to left 1`] = `
@@ -92,7 +92,7 @@ exports[`EuiGlobalToastList props side can be changed to left 1`] = `
@@ -148,7 +148,7 @@ exports[`EuiGlobalToastList props toasts is rendered 1`] = `
@@ -195,7 +195,7 @@ exports[`EuiGlobalToastList props toasts is rendered 1`] = `
diff --git a/src/components/toast/global_toast_list.styles.ts b/src/components/toast/global_toast_list.styles.ts
index 8134cc27b7c..8429a1d2173 100644
--- a/src/components/toast/global_toast_list.styles.ts
+++ b/src/components/toast/global_toast_list.styles.ts
@@ -11,6 +11,7 @@ import {
euiBreakpoint,
euiScrollBarStyles,
logicalCSS,
+ logicalCSSWithFallback,
logicalSizeCSS,
} from '../../global_styling';
import { UseEuiTheme } from '../../services';
@@ -34,8 +35,7 @@ export const euiGlobalToastListStyles = (euiThemeContext: UseEuiTheme) => {
${logicalCSS('bottom', 0)};
${logicalCSS('width', `${euiToastWidth + euiTheme.base * 5}px`)}; /* 2 */
${logicalCSS('max-height', '100vh')}; /* 1 */
- overflow-y: auto; // Fallback for the 'overflow-inline' logical property, which is not yet supported
- ${logicalCSS('overflow-y', 'auto')};
+ ${logicalCSSWithFallback('overflow-y', 'auto')};
// Hide the scrollbar entirely
scrollbar-width: none;
diff --git a/src/components/tour/__snapshots__/tour_step.test.tsx.snap b/src/components/tour/__snapshots__/tour_step.test.tsx.snap
index 35d28fd1c90..bc44412a541 100644
--- a/src/components/tour/__snapshots__/tour_step.test.tsx.snap
+++ b/src/components/tour/__snapshots__/tour_step.test.tsx.snap
@@ -90,7 +90,7 @@ exports[`EuiTourStep can change the minWidth and maxWidth 1`] = `
class="euiFlexItem euiFlexItem--flexGrowZero"
>
{
});
});
+describe('logicalCSSWithFallback ', () => {
+ it('returns both the original property and the logical property', () => {
+ expect(
+ testCustomHook(() => logicalCSSWithFallback('overflow-x', 'auto')).return
+ ).toMatchSnapshot();
+ });
+});
+
describe('logicalStyle mixin returns an object property', () => {
describe('for each directional property:', () => {
LOGICAL_PROPERTIES.forEach((prop) => {
diff --git a/src/global_styling/functions/logicals.ts b/src/global_styling/functions/logicals.ts
index 711fc440ca6..b1d5bc0c400 100644
--- a/src/global_styling/functions/logicals.ts
+++ b/src/global_styling/functions/logicals.ts
@@ -65,8 +65,8 @@ const logicalSize = {
};
const logicalOverflow = {
- 'overflow-x': 'overflow-block',
- 'overflow-y': 'overflow-inline',
+ 'overflow-x': 'overflow-inline',
+ 'overflow-y': 'overflow-block',
};
const logicalBorders = {
@@ -122,6 +122,24 @@ export const logicalCSS = (property: LogicalProperties, value?: any) => {
return `${logicals[property]}: ${value};`;
};
+/**
+ * Some logical properties are not yet fully supported by all browsers.
+ * For those cases, we should use the old property as a fallback for
+ * browsers missing support, while allowing supporting browsers to use
+ * the logical properties.
+ *
+ * Examples:
+ * https://caniuse.com/?search=overflow-block
+ * https://caniuse.com/mdn-css_properties_float_flow_relative_values
+ */
+export const logicalCSSWithFallback = (
+ property: LogicalProperties,
+ value?: any
+) => `
+ ${property}: ${value};
+ ${logicalCSS(property, value)}
+`;
+
/**
*
* @param property A string that is a valid CSS logical property
diff --git a/src/global_styling/mixins/__snapshots__/_typography.test.ts.snap b/src/global_styling/mixins/__snapshots__/_typography.test.ts.snap
index 064d2dc3298..5d3de5e0af1 100644
--- a/src/global_styling/mixins/__snapshots__/_typography.test.ts.snap
+++ b/src/global_styling/mixins/__snapshots__/_typography.test.ts.snap
@@ -205,7 +205,7 @@ exports[`euiTextBreakWord returns a string of CSS text 1`] = `
exports[`euiTextTruncate allows customizing max-width 1`] = `
"
- max-width: 150px; // Ensure that the node has a maximum width after which truncation can occur
+ max-inline-size: 150px;
overflow: hidden !important;
text-overflow: ellipsis !important;
white-space: nowrap !important;
@@ -214,7 +214,7 @@ exports[`euiTextTruncate allows customizing max-width 1`] = `
exports[`euiTextTruncate returns a string of CSS text 1`] = `
"
- max-width: 100%; // Ensure that the node has a maximum width after which truncation can occur
+ max-inline-size: 100%;
overflow: hidden !important;
text-overflow: ellipsis !important;
white-space: nowrap !important;
diff --git a/src/global_styling/mixins/_button.scss b/src/global_styling/mixins/_button.scss
index 8937d2cf581..47c87b6e742 100644
--- a/src/global_styling/mixins/_button.scss
+++ b/src/global_styling/mixins/_button.scss
@@ -15,9 +15,9 @@
// Adds the focus (and hover) animation for translating up 1px
@mixin euiButtonFocus {
@include euiCanAnimate {
- transition: transform $euiAnimSpeedNormal ease-in-out, background $euiAnimSpeedNormal ease-in-out;
+ transition: transform $euiAnimSpeedNormal ease-in-out, background-color $euiAnimSpeedNormal ease-in-out;
- &:hover:not([class*='isDisabled']) {
+ &:hover:not(:disabled) {
transform: translateY(-1px);
}
@@ -25,7 +25,7 @@
animation: euiButtonActive $euiAnimSpeedNormal $euiAnimSlightBounce;
}
- &:active:not([class*='isDisabled']) {
+ &:active:not(:disabled) {
transform: translateY(1px);
}
}
@@ -37,15 +37,13 @@
@include euiButtonBase;
@include euiFont;
@include euiFontSize;
+ @include euiButtonFocus;
+ font-weight: $euiButtonFontWeight;
text-decoration: none;
- border: solid 1px transparent;
-
- // sass-lint:disable mixins-before-declarations
- // focus states should come after all default styles
- @include euiButtonFocus;
+ outline-offset: -1px;
- &:hover:not([class*='isDisabled']),
+ &:hover:not(:disabled),
&:focus {
text-decoration: underline;
}
@@ -92,8 +90,10 @@
pointer-events: auto;
cursor: not-allowed;
- .euiButtonContent__icon {
- fill: currentColor;
+ &:hover,
+ &:focus,
+ &:focus-within {
+ text-decoration: none;
}
.euiButtonContent__spinner {
@@ -101,5 +101,49 @@
}
}
+/*
+ * Creates the Amsterdam style of button with a transparent background
+ */
+@mixin euiButtonDefaultStyle($color: 'primary', $includeStates: true, $transparency: $euiButtonDefaultTransparency) {
+ $backgroundColor: $color;
+
+ @if (map-has-key($euiButtonTypes, $color)) {
+ $backgroundColor: map-get($euiButtonTypes, $color);
+ }
+
+ $percentConversion: $transparency * 100%;
+ // This variable simulates the possibly darkest background the button could be on
+ // Simulates the 20% opaque color on top of the page background color
+ $backgroundColorSimulated: mix($euiPageBackgroundColor, $backgroundColor, $percentConversion);
+ // Then we can calculate the darkest text color needed
+ color: makeHighContrastColor($backgroundColor, $backgroundColorSimulated);
+ // But still use transparency
+ background-color: transparentize($backgroundColor, $transparency);
+
+ @if ($includeStates) {
+ &:not([class*='isDisabled']) {
+ &:hover,
+ &:focus {
+ // Duplicated from inert state simply to override default theme
+ background-color: transparentize($backgroundColor, $transparency);
+ }
+ }
+ }
+}
+
+/*
+ * Creates the Amsterdam style of fill button
+ */
+@mixin euiButtonFillStyle($color: 'primary') {
+ $backgroundColor: $color;
+
+ @if (map-has-key($euiButtonTypes, $color)) {
+ $backgroundColor: map-get($euiButtonTypes, $color);
+ }
+
+ background-color: $backgroundColor;
+ color: chooseLightOrDarkText($backgroundColor);
+}
+
// Keyframe animation declarations can be found in
// utility/animations.scss
diff --git a/src/global_styling/mixins/_color.ts b/src/global_styling/mixins/_color.ts
index 01513913106..832cea6626f 100644
--- a/src/global_styling/mixins/_color.ts
+++ b/src/global_styling/mixins/_color.ts
@@ -46,7 +46,9 @@ export const euiBackgroundColor = (
if (color === 'plain') {
return transparentize(euiTheme.colors.ghost, 0.2);
} else if (color === 'subdued') {
- return transparentize(euiTheme.colors.lightShade, 0.2);
+ return colorMode === 'DARK'
+ ? transparentize(euiTheme.colors.lightShade, 0.4)
+ : transparentize(euiTheme.colors.lightShade, 0.2);
} else {
return transparentize(euiTheme.colors[color], 0.1);
}
diff --git a/src/global_styling/mixins/_helpers.scss b/src/global_styling/mixins/_helpers.scss
index 5d937d609e1..db1c6fbd935 100644
--- a/src/global_styling/mixins/_helpers.scss
+++ b/src/global_styling/mixins/_helpers.scss
@@ -82,6 +82,15 @@
@include euiOverflowShadow('x');
}
+/**
+ * For quickly applying a full-height element whether using flex or not
+ */
+@mixin euiFullHeight {
+ height: 100%;
+ flex: 1 1 auto;
+ overflow: hidden;
+}
+
// Hiding elements offscreen to only be read by screen reader
// See https://github.com/elastic/eui/pull/5130 and https://github.com/elastic/eui/pull/5152 for more info
@mixin euiScreenReaderOnly {
diff --git a/src/global_styling/mixins/_helpers.ts b/src/global_styling/mixins/_helpers.ts
index cafae90b1e6..46c460ff05f 100644
--- a/src/global_styling/mixins/_helpers.ts
+++ b/src/global_styling/mixins/_helpers.ts
@@ -9,6 +9,7 @@
import { CSSProperties } from 'react';
import { useEuiTheme, UseEuiTheme } from '../../services/theme';
import { transparentize } from '../../services/color';
+import { logicalCSS, logicalCSSWithFallback } from '../functions';
/**
* Set scroll bar appearance on Chrome (and firefox).
@@ -54,8 +55,8 @@ export const euiScrollBarStyles = (
return `scrollbar-width: ${width};
&::-webkit-scrollbar {
- width: ${scrollBarSize};
- height: ${scrollBarSize};
+ ${logicalCSS('width', scrollBarSize)}
+ ${logicalCSS('height', scrollBarSize)}
}
&::-webkit-scrollbar-thumb {
@@ -127,15 +128,14 @@ const euiOverflowShadowStyles = (
interface _EuiYScroll {
height?: CSSProperties['height'];
}
-// TODO: How do we use Emotion to output the CSS class utilities instead?
export const euiYScroll = (
euiTheme: UseEuiTheme,
{ height }: _EuiYScroll = {}
) => `
${euiScrollBarStyles(euiTheme)}
- height: ${height || '100%'};
- overflow-y: auto;
- overflow-x: hidden;
+ ${logicalCSS('height', height || '100%')}
+ ${logicalCSSWithFallback('overflow-y', 'auto')}
+ ${logicalCSSWithFallback('overflow-x', 'hidden')}
&:focus {
outline: none; /* 1 */
}
@@ -159,7 +159,7 @@ export const useEuiYScrollWithShadows = ({ height }: _EuiYScroll = {}) => {
export const euiXScroll = (euiTheme: UseEuiTheme) => `
${euiScrollBarStyles(euiTheme)}
- overflow-x: auto;
+ ${logicalCSSWithFallback('overflow-x', 'auto')}
&:focus {
outline: none; /* 1 */
}
@@ -206,3 +206,12 @@ export const useEuiOverflowScroll = (
const euiTheme = useEuiTheme();
return euiOverflowScroll(euiTheme, { direction, mask });
};
+
+/**
+ * For quickly applying a full-height element whether using flex or not
+ */
+export const euiFullHeight = () => `
+ ${logicalCSS('height', '100%')}
+ flex: 1 1 auto;
+ overflow: hidden;
+`;
diff --git a/src/global_styling/mixins/_states.ts b/src/global_styling/mixins/_states.ts
index 744eab0796a..09741801086 100644
--- a/src/global_styling/mixins/_states.ts
+++ b/src/global_styling/mixins/_states.ts
@@ -24,7 +24,7 @@ export type _EuiFocusRingOffset =
* @param color Accepts any CSS color, **Note: only works in -webkit-**
*/
export const euiFocusRing = (
- euiTheme: UseEuiTheme['euiTheme'],
+ { euiTheme }: UseEuiTheme,
offset: _EuiFocusRingOffset = 'center',
options?: { color?: CSSProperties['outlineColor'] }
) => {
@@ -66,6 +66,6 @@ export const useEuiFocusRing = (
offset?: _EuiFocusRingOffset,
color?: CSSProperties['outlineColor']
) => {
- const { euiTheme } = useEuiTheme();
+ const euiTheme = useEuiTheme();
return euiFocusRing(euiTheme, offset, { color });
};
diff --git a/src/global_styling/mixins/_typography.ts b/src/global_styling/mixins/_typography.ts
index 372b0fdb46a..db62a90a287 100644
--- a/src/global_styling/mixins/_typography.ts
+++ b/src/global_styling/mixins/_typography.ts
@@ -14,6 +14,7 @@ import {
} from '../functions/typography';
import { useEuiTheme, UseEuiTheme } from '../../services/theme/hooks';
import { _EuiThemeFontScale } from '../variables/typography';
+import { logicalCSS } from '../functions';
export type EuiThemeFontSize = {
fontSize: CSSProperties['fontSize'];
@@ -57,7 +58,9 @@ export const euiTextBreakWord = () => `
export const euiTextTruncate = (
maxWidth: CSSProperties['maxWidth'] = '100%'
) => `
- max-width: ${maxWidth}; // Ensure that the node has a maximum width after which truncation can occur
+ ${
+ logicalCSS('max-width', maxWidth) // Ensure that the node has a maximum width after which truncation can occur
+ }
overflow: hidden !important;
text-overflow: ellipsis !important;
white-space: nowrap !important;
diff --git a/src/global_styling/reset/global_styles.tsx b/src/global_styling/reset/global_styles.tsx
index dbff38e5743..8574ac45ca5 100644
--- a/src/global_styling/reset/global_styles.tsx
+++ b/src/global_styling/reset/global_styles.tsx
@@ -85,7 +85,7 @@ export const EuiGlobalStyles = ({}: EuiGlobalStylesProps) => {
}
*:focus {
- ${euiFocusRing(euiTheme)}
+ ${euiFocusRing(euiThemeContext)}
}
// Dark mode's highlighted doesn't work well so lets just set it the same as our focus background
diff --git a/src/global_styling/utility/__snapshots__/utility.test.tsx.snap b/src/global_styling/utility/__snapshots__/utility.test.tsx.snap
new file mode 100644
index 00000000000..a233f829e4e
--- /dev/null
+++ b/src/global_styling/utility/__snapshots__/utility.test.tsx.snap
@@ -0,0 +1,350 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`global utility styles generates static global styles 1`] = `
+".euiScreenReaderOnly{
+ // Take the element out of the layout
+ position: absolute;
+ // Keep it vertically inline
+ top: auto;
+ // Chrome requires a left value, and Selenium (used by Kibana's FTR) requires an off-screen position for its .getVisibleText() to not register SR-only text
+ left: -10000px;
+ // The element must have a size (for some screen readers)
+ width: 1px;
+ height: 1px;
+ // But reduce the visible size to nothing
+ clip: rect(0 0 0 0);
+ clip-path: inset(50%);
+ // And ensure no overflows occur
+ overflow: hidden;
+ // Chrome requires the negative margin to not cause overflows of parent containers
+ margin: -1px;
+;}
+.eui-alignBaseline{vertical-align:baseline!important;}
+.eui-alignBottom{vertical-align:bottom!important;}
+.eui-alignMiddle{vertical-align:middle!important;}
+.eui-alignTop{vertical-align:top!important;}
+.eui-displayBlock{display:block!important;}
+.eui-displayInline{display:inline!important;}
+.eui-displayInlineBlock{display:inline-block!important;}
+.eui-fullWidth{display:block!important;inline-size: 100% !important;;}
+.eui-fullHeight{
+ block-size: 100%;
+ flex: 1 1 auto;
+ overflow: hidden;
+;}
+.eui-textCenter{text-align:center!important;}
+.eui-textLeft{text-align:start!important;}
+.eui-textRight{text-align:end!important;}
+.eui-textNoWrap{white-space:nowrap!important;}
+.eui-textInheritColor{color:inherit!important;}
+.eui-textBreakWord{
+ overflow-wrap: break-word !important; // makes sure the long string will wrap and not bust out of the container
+ word-wrap: break-word !important; // spec says, they are literally just alternate names for each other but some browsers support one and not the other
+ word-break: break-word; // IE doesn't understand but that's ok
+;}
+.eui-textBreakAll{overflow-wrap:break-word!important;word-break:break-all!important;}
+.eui-textBreakNormal{overflow-wrap:normal!important;word-wrap:normal!important;word-break:normal!important;}
+.eui-textTruncate{
+ max-inline-size: 100%;
+ overflow: hidden !important;
+ text-overflow: ellipsis !important;
+ white-space: nowrap !important;
+;}
+.eui-textNumber{
+ font-feature-settings: 'calt' 1, 'kern' 1, 'liga' 1, 'tnum' 1;
+;}
+.eui-scrollBar{scrollbar-width: thin;
+
+ &::-webkit-scrollbar {
+ inline-size: 16px;
+ block-size: 16px;
+ }
+
+ &::-webkit-scrollbar-thumb {
+ background-color: rgba(105,112,125,0.5);
+ background-clip: content-box;
+ border-radius: 16px;
+ border: calc(8px * 0.75) solid transparent;
+ }
+
+ &::-webkit-scrollbar-corner,
+ &::-webkit-scrollbar-track {
+ background-color: transparent;
+ }
+
+ scrollbar-color: rgba(105,112,125,0.5) transparent;
+ ;}
+.eui-yScroll{
+ scrollbar-width: thin;
+
+ &::-webkit-scrollbar {
+ inline-size: 16px;
+ block-size: 16px;
+ }
+
+ &::-webkit-scrollbar-thumb {
+ background-color: rgba(105,112,125,0.5);
+ background-clip: content-box;
+ border-radius: 16px;
+ border: calc(8px * 0.75) solid transparent;
+ }
+
+ &::-webkit-scrollbar-corner,
+ &::-webkit-scrollbar-track {
+ background-color: transparent;
+ }
+
+ scrollbar-color: rgba(105,112,125,0.5) transparent;
+
+ block-size: 100%;
+
+ overflow-y: auto;
+ overflow-block: auto;
+
+
+ overflow-x: hidden;
+ overflow-inline: hidden;
+
+ &:focus {
+ outline: none; /* 1 */
+ }
+;}
+.eui-xScroll{
+ scrollbar-width: thin;
+
+ &::-webkit-scrollbar {
+ inline-size: 16px;
+ block-size: 16px;
+ }
+
+ &::-webkit-scrollbar-thumb {
+ background-color: rgba(105,112,125,0.5);
+ background-clip: content-box;
+ border-radius: 16px;
+ border: calc(8px * 0.75) solid transparent;
+ }
+
+ &::-webkit-scrollbar-corner,
+ &::-webkit-scrollbar-track {
+ background-color: transparent;
+ }
+
+ scrollbar-color: rgba(105,112,125,0.5) transparent;
+
+
+ overflow-x: auto;
+ overflow-inline: auto;
+
+ &:focus {
+ outline: none; /* 1 */
+ }
+;}
+.eui-yScrollWithShadows{
+
+ scrollbar-width: thin;
+
+ &::-webkit-scrollbar {
+ inline-size: 16px;
+ block-size: 16px;
+ }
+
+ &::-webkit-scrollbar-thumb {
+ background-color: rgba(105,112,125,0.5);
+ background-clip: content-box;
+ border-radius: 16px;
+ border: calc(8px * 0.75) solid transparent;
+ }
+
+ &::-webkit-scrollbar-corner,
+ &::-webkit-scrollbar-track {
+ background-color: transparent;
+ }
+
+ scrollbar-color: rgba(105,112,125,0.5) transparent;
+
+ block-size: 100%;
+
+ overflow-y: auto;
+ overflow-block: auto;
+
+
+ overflow-x: hidden;
+ overflow-inline: hidden;
+
+ &:focus {
+ outline: none; /* 1 */
+ }
+
+ mask-image: linear-gradient(to bottom,
+ rgba(255,0,0,0.1) 0%,
+ rgb(255,0,0) calc(16px * 0.75 * 1.25)
+ ,
+ rgb(255,0,0) calc(100% - calc(16px * 0.75 * 1.25)),
+ rgba(255,0,0,0.1) 100%
+ );
+;}
+.eui-xScrollWithShadows{
+
+ scrollbar-width: thin;
+
+ &::-webkit-scrollbar {
+ inline-size: 16px;
+ block-size: 16px;
+ }
+
+ &::-webkit-scrollbar-thumb {
+ background-color: rgba(105,112,125,0.5);
+ background-clip: content-box;
+ border-radius: 16px;
+ border: calc(8px * 0.75) solid transparent;
+ }
+
+ &::-webkit-scrollbar-corner,
+ &::-webkit-scrollbar-track {
+ background-color: transparent;
+ }
+
+ scrollbar-color: rgba(105,112,125,0.5) transparent;
+
+
+ overflow-x: auto;
+ overflow-inline: auto;
+
+ &:focus {
+ outline: none; /* 1 */
+ }
+
+ mask-image: linear-gradient(to right,
+ rgba(255,0,0,0.1) 0%,
+ rgb(255,0,0) calc(16px * 0.75 * 1.25)
+ ,
+ rgb(255,0,0) calc(100% - calc(16px * 0.75 * 1.25)),
+ rgba(255,0,0,0.1) 100%
+ );
+;}[class*='eui-showFor']{display:none!important;}
+ .eui-hideFor--xl {
+ @media only screen and (min-width: 1200px) {
+ display: none !important;
+ }
+ }
+ .eui-showFor--xl {
+ @media only screen and (min-width: 1200px) {
+ display: inline !important;
+ }
+ }
+ .eui-showFor--xl--block {
+ @media only screen and (min-width: 1200px) {
+ display: block !important;
+ }
+ }
+ .eui-showFor--xl--inlineBlock {
+ @media only screen and (min-width: 1200px) {
+ display: inline-block !important;
+ }
+ }
+ .eui-showFor--xl--flex {
+ @media only screen and (min-width: 1200px) {
+ display: flex !important;
+ }
+ };
+ .eui-hideFor--l {
+ @media only screen and (min-width: 992px) and (max-width: 1199px) {
+ display: none !important;
+ }
+ }
+ .eui-showFor--l {
+ @media only screen and (min-width: 992px) and (max-width: 1199px) {
+ display: inline !important;
+ }
+ }
+ .eui-showFor--l--block {
+ @media only screen and (min-width: 992px) and (max-width: 1199px) {
+ display: block !important;
+ }
+ }
+ .eui-showFor--l--inlineBlock {
+ @media only screen and (min-width: 992px) and (max-width: 1199px) {
+ display: inline-block !important;
+ }
+ }
+ .eui-showFor--l--flex {
+ @media only screen and (min-width: 992px) and (max-width: 1199px) {
+ display: flex !important;
+ }
+ };
+ .eui-hideFor--m {
+ @media only screen and (min-width: 768px) and (max-width: 991px) {
+ display: none !important;
+ }
+ }
+ .eui-showFor--m {
+ @media only screen and (min-width: 768px) and (max-width: 991px) {
+ display: inline !important;
+ }
+ }
+ .eui-showFor--m--block {
+ @media only screen and (min-width: 768px) and (max-width: 991px) {
+ display: block !important;
+ }
+ }
+ .eui-showFor--m--inlineBlock {
+ @media only screen and (min-width: 768px) and (max-width: 991px) {
+ display: inline-block !important;
+ }
+ }
+ .eui-showFor--m--flex {
+ @media only screen and (min-width: 768px) and (max-width: 991px) {
+ display: flex !important;
+ }
+ };
+ .eui-hideFor--s {
+ @media only screen and (min-width: 575px) and (max-width: 767px) {
+ display: none !important;
+ }
+ }
+ .eui-showFor--s {
+ @media only screen and (min-width: 575px) and (max-width: 767px) {
+ display: inline !important;
+ }
+ }
+ .eui-showFor--s--block {
+ @media only screen and (min-width: 575px) and (max-width: 767px) {
+ display: block !important;
+ }
+ }
+ .eui-showFor--s--inlineBlock {
+ @media only screen and (min-width: 575px) and (max-width: 767px) {
+ display: inline-block !important;
+ }
+ }
+ .eui-showFor--s--flex {
+ @media only screen and (min-width: 575px) and (max-width: 767px) {
+ display: flex !important;
+ }
+ };
+ .eui-hideFor--xs {
+ @media only screen and (max-width: 574px) {
+ display: none !important;
+ }
+ }
+ .eui-showFor--xs {
+ @media only screen and (max-width: 574px) {
+ display: inline !important;
+ }
+ }
+ .eui-showFor--xs--block {
+ @media only screen and (max-width: 574px) {
+ display: block !important;
+ }
+ }
+ .eui-showFor--xs--inlineBlock {
+ @media only screen and (max-width: 574px) {
+ display: inline-block !important;
+ }
+ }
+ .eui-showFor--xs--flex {
+ @media only screen and (max-width: 574px) {
+ display: flex !important;
+ }
+ };;;label:globalStyles;"
+`;
diff --git a/src/global_styling/utility/_utility.scss b/src/global_styling/utility/_utility.scss
index 26c4d8b44e0..b7cae579552 100644
--- a/src/global_styling/utility/_utility.scss
+++ b/src/global_styling/utility/_utility.scss
@@ -1,84 +1,6 @@
// This file utilizes !importants on purpose
// sass-lint:disable no-important
-// Vertical alignment
-.eui-alignBaseline { vertical-align: baseline !important; }
-.eui-alignBottom { vertical-align: bottom !important; }
-.eui-alignMiddle { vertical-align: middle !important; }
-.eui-alignTop { vertical-align: top !important; }
-
-// Display
-.eui-displayBlock {display: block !important;}
-.eui-displayInline {display: inline !important;}
-.eui-displayInlineBlock {display: inline-block !important;}
-
-.eui-fullWidth {
- display: block !important;
- width: 100% !important;
-}
-
-// Text
-.eui-textCenter {text-align: center !important;}
-.eui-textLeft {text-align: left !important;}
-.eui-textRight {text-align: right !important;}
-.eui-textNoWrap {white-space: nowrap !important;}
-.eui-textInheritColor {color: inherit !important;}
-
-.eui-textBreakWord {
- @include euiTextBreakWord;
-}
-
-.eui-textBreakAll {
- overflow-wrap: break-word !important; // Fixes FF when dashes are involved #2288
- word-break: break-all !important;
-}
-
-.eui-textBreakNormal {
- overflow-wrap: normal !important;
- word-wrap: normal !important;
- word-break: normal !important;
-}
-
-.eui-textTruncate {
- @include euiTextTruncate;
-}
-
-.eui-textNumber {
- @include euiNumberFormat;
-}
-
-/**
- * Responsive
- *
- * 1. Be sure to hide the element initially
- */
-
-[class*='eui-showFor'] {
- display: none !important; /* 1 */
-}
-
-@each $size in $euiBreakpointKeys {
- .eui-hideFor--#{$size} {
- @include euiBreakpoint($size) { display: none !important; }
- }
-
- .eui-showFor--#{$size} {
- @include euiBreakpoint($size) { display: inline !important; }
- }
-
- .eui-showFor--#{$size}--block {
- @include euiBreakpoint($size) { display: block !important; }
- }
-
- .eui-showFor--#{$size}--inlineBlock {
- @include euiBreakpoint($size) { display: inline-block !important; }
- }
-
- .eui-showFor--#{$size}--flex {
- @include euiBreakpoint($size) { display: flex !important; }
- }
-}
-
/**
* IE doesn't properly wrap groups if it is within a flex-item of a flex-group.
* Adding the following styles to the flex-item that contains the wrapping group, will fix IE.
@@ -91,52 +13,3 @@
flex-basis: 0%;
}
}
-
-/**
- * Scroll bar only
- */
-.eui-scrollBar {
- @include euiScrollBar;
-}
-
-/**
- * Overflow scrolling
- */
-.eui-yScroll {
- @include euiYScroll;
-}
-
-.eui-xScroll {
- @include euiXScroll;
-}
-
-/**
- * Overflow scrolling with shadows
- */
-.eui-yScrollWithShadows {
- @include euiYScrollWithShadows;
-}
-
-.eui-xScrollWithShadows {
- @include euiXScrollWithShadows;
-}
-
-/**
- * Forcing focus ring on non-EUI elements
- */
-.eui-isFocusable:focus {
- @include euiFocusRing('large');
-}
-
-/**
- * For quickly applying a full-height element whether using flex or not
- */
-@mixin euiFullHeight {
- height: 100%;
- flex: 1 1 auto;
- overflow: hidden;
-}
-
-.eui-fullHeight {
- @include euiFullHeight;
-}
diff --git a/src/global_styling/utility/utility.test.tsx b/src/global_styling/utility/utility.test.tsx
new file mode 100644
index 00000000000..7a5a1725dce
--- /dev/null
+++ b/src/global_styling/utility/utility.test.tsx
@@ -0,0 +1,25 @@
+/*
+ * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
+ * or more contributor license agreements. Licensed under the Elastic License
+ * 2.0 and the Server Side Public License, v 1; you may not use this file except
+ * in compliance with, at your election, the Elastic License 2.0 or the Server
+ * Side Public License, v 1.
+ */
+
+import { testCustomHook } from '../../test/internal';
+import { useEuiTheme } from '../../services';
+import { globalStyles } from './utility';
+
+describe('global utility styles', () => {
+ const useTestHook = () => {
+ const euiTheme = useEuiTheme();
+ return globalStyles(euiTheme);
+ };
+
+ it('generates static global styles', () => {
+ const rawStyles = (testCustomHook(useTestHook) as any).return.styles;
+ // Make Emotion's minification a little less annoying to read
+ const globalStyles = rawStyles.replace(/}\.eui-/g, '}\n.eui-');
+ expect(globalStyles).toMatchSnapshot();
+ });
+});
diff --git a/src/global_styling/utility/utility.tsx b/src/global_styling/utility/utility.tsx
index 72d7bf31a7d..b0ba9ce4543 100644
--- a/src/global_styling/utility/utility.tsx
+++ b/src/global_styling/utility/utility.tsx
@@ -9,11 +9,149 @@
import React from 'react';
import { Global, css } from '@emotion/react';
+import { useEuiTheme, UseEuiTheme } from '../../services/theme/hooks';
import { euiScreenReaderOnly } from '../../components/accessibility/screen_reader_only/screen_reader_only.styles';
+import {
+ euiFullHeight,
+ euiTextBreakWord,
+ euiTextTruncate,
+ euiNumberFormat,
+ euiScrollBarStyles,
+ euiYScroll,
+ euiXScroll,
+ euiYScrollWithShadows,
+ euiXScrollWithShadows,
+ euiBreakpoint,
+} from '../mixins';
+import { logicalCSS } from '../functions';
-const globalStyles = css`
- .euiScreenReaderOnly {
- ${euiScreenReaderOnly()}
- }
-`;
-export const EuiUtilityClasses = () => ;
+export const globalStyles = (euiThemeContext: UseEuiTheme) => {
+ return css`
+ // Accessibility
+ .euiScreenReaderOnly {
+ ${euiScreenReaderOnly()}
+ }
+
+ // Vertical alignment
+ .eui-alignBaseline {
+ vertical-align: baseline !important;
+ }
+ .eui-alignBottom {
+ vertical-align: bottom !important;
+ }
+ .eui-alignMiddle {
+ vertical-align: middle !important;
+ }
+ .eui-alignTop {
+ vertical-align: top !important;
+ }
+
+ // Display
+ .eui-displayBlock {
+ display: block !important;
+ }
+ .eui-displayInline {
+ display: inline !important;
+ }
+ .eui-displayInlineBlock {
+ display: inline-block !important;
+ }
+
+ .eui-fullWidth {
+ display: block !important;
+ ${logicalCSS('width', '100% !important')}
+ }
+ .eui-fullHeight {
+ ${euiFullHeight()}
+ }
+
+ // Text
+ .eui-textCenter {
+ text-align: center !important;
+ }
+ .eui-textLeft {
+ text-align: start !important;
+ }
+ .eui-textRight {
+ text-align: end !important;
+ }
+ .eui-textNoWrap {
+ white-space: nowrap !important;
+ }
+ .eui-textInheritColor {
+ color: inherit !important;
+ }
+ .eui-textBreakWord {
+ ${euiTextBreakWord()}
+ }
+ .eui-textBreakAll {
+ overflow-wrap: break-word !important; // Fixes FF when dashes are involved #2288
+ word-break: break-all !important;
+ }
+ .eui-textBreakNormal {
+ overflow-wrap: normal !important;
+ word-wrap: normal !important;
+ word-break: normal !important;
+ }
+ .eui-textTruncate {
+ ${euiTextTruncate()}
+ }
+ .eui-textNumber {
+ ${euiNumberFormat(euiThemeContext)}
+ }
+
+ // Scroll
+ .eui-scrollBar {
+ ${euiScrollBarStyles(euiThemeContext)}
+ }
+ .eui-yScroll {
+ ${euiYScroll(euiThemeContext)}
+ }
+ .eui-xScroll {
+ ${euiXScroll(euiThemeContext)}
+ }
+ .eui-yScrollWithShadows {
+ ${euiYScrollWithShadows(euiThemeContext)}
+ }
+ .eui-xScrollWithShadows {
+ ${euiXScrollWithShadows(euiThemeContext)}
+ }
+
+ // Responsive
+ [class*='eui-showFor'] {
+ display: none !important; // Be sure to hide the element initially
+ }
+ ${Object.keys(euiThemeContext.euiTheme.breakpoint).map(
+ (size) => `
+ .eui-hideFor--${size} {
+ ${euiBreakpoint(euiThemeContext, [size])} {
+ display: none !important;
+ }
+ }
+ .eui-showFor--${size} {
+ ${euiBreakpoint(euiThemeContext, [size])} {
+ display: inline !important;
+ }
+ }
+ .eui-showFor--${size}--block {
+ ${euiBreakpoint(euiThemeContext, [size])} {
+ display: block !important;
+ }
+ }
+ .eui-showFor--${size}--inlineBlock {
+ ${euiBreakpoint(euiThemeContext, [size])} {
+ display: inline-block !important;
+ }
+ }
+ .eui-showFor--${size}--flex {
+ ${euiBreakpoint(euiThemeContext, [size])} {
+ display: flex !important;
+ }
+ }`
+ )}
+ `;
+};
+export const EuiUtilityClasses = () => {
+ const euiTheme = useEuiTheme();
+ return ;
+};
diff --git a/src/themes/amsterdam/global_styling/mixins/_button.scss b/src/themes/amsterdam/global_styling/mixins/_button.scss
deleted file mode 100644
index fd24f97ef85..00000000000
--- a/src/themes/amsterdam/global_styling/mixins/_button.scss
+++ /dev/null
@@ -1,60 +0,0 @@
-@mixin euiButton {
- @include euiButtonBase;
- @include euiFont;
- @include euiFontSize;
- @include euiButtonFocus;
-
- font-weight: $euiButtonFontWeight;
- text-decoration: none;
- transition: background-color $euiAnimSpeedNormal ease-in-out, border-color $euiAnimSpeedNormal ease-in-out;
- outline-offset: -1px;
-
- &:hover:not([class*='isDisabled']),
- &:focus {
- text-decoration: underline;
- }
-}
-
-/*
- * Creates the Amsterdam style of button with a transparent background
- */
-@mixin euiButtonDefaultStyle($color: 'primary', $includeStates: true, $transparency: $euiButtonDefaultTransparency) {
- $backgroundColor: $color;
-
- @if (map-has-key($euiButtonTypes, $color)) {
- $backgroundColor: map-get($euiButtonTypes, $color);
- }
-
- $percentConversion: $transparency * 100%;
- // This variable simulates the possibly darkest background the button could be on
- // Simulates the 20% opaque color on top of the page background color
- $backgroundColorSimulated: mix($euiPageBackgroundColor, $backgroundColor, $percentConversion);
- // Then we can calculate the darkest text color needed
- color: makeHighContrastColor($backgroundColor, $backgroundColorSimulated);
- // But still use transparency
- background-color: transparentize($backgroundColor, $transparency);
-
- @if ($includeStates) {
- &:not([class*='isDisabled']) {
- &:hover,
- &:focus {
- // Duplicated from inert state simply to override default theme
- background-color: transparentize($backgroundColor, $transparency);
- }
- }
- }
-}
-
-/*
- * Creates the Amsterdam style of fill button
- */
-@mixin euiButtonFillStyle($color: 'primary') {
- $backgroundColor: $color;
-
- @if (map-has-key($euiButtonTypes, $color)) {
- $backgroundColor: map-get($euiButtonTypes, $color);
- }
-
- background-color: $backgroundColor;
- color: chooseLightOrDarkText($backgroundColor);
-}
diff --git a/src/themes/amsterdam/global_styling/mixins/_index.scss b/src/themes/amsterdam/global_styling/mixins/_index.scss
index ffc04e1b428..b2f0f5dd7b1 100644
--- a/src/themes/amsterdam/global_styling/mixins/_index.scss
+++ b/src/themes/amsterdam/global_styling/mixins/_index.scss
@@ -10,7 +10,6 @@
@import '../../../../global_styling/mixins/beta_badge';
@import '../../../../global_styling/mixins/button';
-@import 'button';
@import '../../../../global_styling/mixins/form';
@import 'form';
@import '../../../../global_styling/mixins/header';
diff --git a/src/themes/amsterdam/global_styling/mixins/button.ts b/src/themes/amsterdam/global_styling/mixins/button.ts
index 7d95abb1758..b4e058c18df 100644
--- a/src/themes/amsterdam/global_styling/mixins/button.ts
+++ b/src/themes/amsterdam/global_styling/mixins/button.ts
@@ -7,7 +7,11 @@
*/
import { css } from '@emotion/react';
+import { euiBackgroundColor, euiCanAnimate } from '../../../../global_styling';
import {
+ hexToRgb,
+ isColorDark,
+ makeHighContrastColor,
shade,
tint,
transparentize,
@@ -22,55 +26,226 @@ export const BUTTON_COLORS = [
'success',
'warning',
'danger',
- 'disabled',
] as const;
export type _EuiButtonColor = typeof BUTTON_COLORS[number];
+export type _EuiButtonDisplay = 'base' | 'fill' | 'empty';
+export interface _EuiButtonOptions {
+ display?: _EuiButtonDisplay;
+}
+
+/**
+ * Creates the `base` version of button styles with proper text contrast.
+ * @param euiThemeContext
+ * @param color One of the named button colors or 'disabled'
+ * @returns Style object `{ backgroundColor, color }`
+ */
export const euiButtonColor = (
- color: _EuiButtonColor,
- { euiTheme, colorMode }: UseEuiTheme
+ euiThemeContext: UseEuiTheme,
+ color: _EuiButtonColor | 'disabled'
) => {
+ const { euiTheme, colorMode } = euiThemeContext;
function tintOrShade(color: string) {
return colorMode === 'DARK' ? shade(color, 0.7) : tint(color, 0.8);
}
+ let foreground;
+ let background;
+
switch (color) {
case 'disabled':
- return transparentize(euiTheme.colors.lightShade, 0.15);
+ return {
+ color: euiTheme.colors.disabledText,
+ backgroundColor: transparentize(euiTheme.colors.lightShade, 0.15),
+ };
case 'text':
- return colorMode === 'DARK'
- ? shade(euiTheme.colors.lightShade, 0.2)
- : tint(euiTheme.colors.lightShade, 0.5);
+ foreground = euiTheme.colors[color];
+ background =
+ colorMode === 'DARK'
+ ? shade(euiTheme.colors.lightShade, 0.2)
+ : tint(euiTheme.colors.lightShade, 0.5);
+ break;
default:
- return tintOrShade(euiTheme.colors[color]);
+ foreground = euiTheme.colors[`${color}Text`];
+ background = tintOrShade(euiTheme.colors[color]);
+ break;
}
+
+ return {
+ color: makeHighContrastColor(foreground)(background),
+ backgroundColor: background,
+ };
};
-export const useEuiButtonColorCSS = () => {
- const euiTheme = useEuiTheme();
+/**
+ * Creates the `fill` version of buttons styles with proper text contrast.
+ * @param euiThemeContext
+ * @param color One of the named button colors or 'disabled'
+ * @returns Style object `{ backgroundColor, color }`
+ */
+export const euiButtonFillColor = (
+ euiThemeContext: UseEuiTheme,
+ color: _EuiButtonColor | 'disabled'
+) => {
+ const { euiTheme, colorMode } = euiThemeContext;
+
+ let background;
+ let foreground;
+
+ switch (color) {
+ case 'disabled':
+ background = euiButtonColor(euiThemeContext, color).backgroundColor;
+ foreground = euiButtonColor(euiThemeContext, color).color;
+ break;
+ case 'text':
+ background =
+ colorMode === 'DARK' ? euiTheme.colors.text : euiTheme.colors.darkShade;
+ foreground = isColorDark(...hexToRgb(background))
+ ? euiTheme.colors.ghost
+ : euiTheme.colors.ink;
+ break;
+ default:
+ background = euiTheme.colors[color];
+ foreground = isColorDark(...hexToRgb(euiTheme.colors[color]))
+ ? euiTheme.colors.ghost
+ : euiTheme.colors.ink;
+ break;
+ }
return {
- text: css`
- background-color: ${euiButtonColor('text', euiTheme)};
- `,
- accent: css`
- background-color: ${euiButtonColor('accent', euiTheme)};
- `,
- primary: css`
- background-color: ${euiButtonColor('primary', euiTheme)};
- `,
- success: css`
- background-color: ${euiButtonColor('success', euiTheme)};
- `,
- warning: css`
- background-color: ${euiButtonColor('warning', euiTheme)};
+ color: foreground,
+ backgroundColor: background,
+ };
+};
+
+/**
+ * Creates the `empty` version of button styles using the text-variant and adding interactive styles.
+ * @param euiThemeContext
+ * @param color One of the named button colors or 'disabled'
+ * @returns Style object `{ backgroundColor, color }` where `background` is typically used for interactive states
+ */
+export const euiButtonEmptyColor = (
+ euiThemeContext: UseEuiTheme,
+ color: _EuiButtonColor | 'disabled'
+) => {
+ let foreground;
+ let background;
+
+ switch (color) {
+ case 'disabled':
+ foreground = euiButtonColor(euiThemeContext, color).color;
+ background = 'transparent';
+ break;
+ case 'text':
+ foreground = euiButtonColor(euiThemeContext, color).color;
+ background = euiBackgroundColor(euiThemeContext, 'subdued', {
+ method: 'transparent',
+ });
+ break;
+ default:
+ foreground = euiButtonColor(euiThemeContext, color).color;
+ background = euiBackgroundColor(euiThemeContext, color, {
+ method: 'transparent',
+ });
+ break;
+ }
+
+ return {
+ color: foreground,
+ backgroundColor: background,
+ };
+};
+
+/**
+ * Given the button display type, returns the Emotion based color keys.
+ * @param options Button display type
+ * @returns An object of `_EuiButtonColor` keys including `disabled`
+ */
+export const useEuiButtonColorCSS = (options: _EuiButtonOptions = {}) => {
+ const euiThemeContext = useEuiTheme();
+
+ function stylesByDisplay(color: _EuiButtonColor | 'disabled') {
+ return {
+ base: css`
+ ${euiButtonColor(euiThemeContext, color)}
+ `,
+ fill: css`
+ ${euiButtonFillColor(euiThemeContext, color)}
+
+ // Use full shade for outline-color except for dark mode text buttons which need to stay currentColor
+ outline-color: ${euiThemeContext.colorMode === 'DARK' &&
+ color === 'text'
+ ? 'currentColor'
+ : euiThemeContext.euiTheme.colors.fullShade};
+ `,
+ empty: css`
+ color: ${euiButtonEmptyColor(euiThemeContext, color).color};
+
+ &:focus,
+ &:active {
+ background-color: ${euiButtonEmptyColor(euiThemeContext, color)
+ .backgroundColor};
+ }
+ `,
+ };
+ }
+
+ return {
+ text: css(stylesByDisplay('text')[options.display || 'base']),
+ accent: css(stylesByDisplay('accent')[options.display || 'base']),
+ primary: css(stylesByDisplay('primary')[options.display || 'base']),
+ success: css(stylesByDisplay('success')[options.display || 'base']),
+ warning: css(stylesByDisplay('warning')[options.display || 'base']),
+ danger: css(stylesByDisplay('danger')[options.display || 'base']),
+ disabled: css(stylesByDisplay('disabled')[options.display || 'base']),
+ };
+};
+
+/**
+ * Based on the button size, creates the style properties.
+ * @returns An object of button size keys with Emption styles for `border-radius`
+ */
+export const useEuiButtonRadiusCSS = () => {
+ const { euiTheme } = useEuiTheme();
+
+ return {
+ xs: css`
+ border-radius: ${euiTheme.border.radius.small};
`,
- danger: css`
- background-color: ${euiButtonColor('danger', euiTheme)};
+ s: css`
+ border-radius: ${euiTheme.border.radius.small};
`,
- disabled: css`
- background-color: ${euiButtonColor('disabled', euiTheme)};
+ m: css`
+ border-radius: ${euiTheme.border.radius.medium};
`,
};
};
+
+/**
+ * Creates the translate animation when button is in focus.
+ * @returns string
+ */
+export const useEuiButtonFocusCSS = () => {
+ const { euiTheme } = useEuiTheme();
+
+ return `
+ ${euiCanAnimate} {
+ transition: transform ${euiTheme.animation.normal} ease-in-out,
+ background-color ${euiTheme.animation.normal} ease-in-out;
+
+ &:hover:not(:disabled) {
+ transform: translateY(-1px);
+ }
+
+ &:focus {
+ animation: euiButtonActive ${euiTheme.animation.normal}
+ ${euiTheme.animation.bounce};
+ }
+
+ &:active:not(:disabled) {
+ transform: translateY(1px);
+ }
+ }
+ `;
+};
diff --git a/src/themes/amsterdam/overrides/_button.scss b/src/themes/amsterdam/overrides/_button.scss
deleted file mode 100644
index 6334c839c06..00000000000
--- a/src/themes/amsterdam/overrides/_button.scss
+++ /dev/null
@@ -1,119 +0,0 @@
-// This file has lots of modifiers and is somewhat nesty by nature
-//sass-lint:disable nesting-depth
-
-.euiButton,
-.euiButtonIcon {
- // sass-lint:disable no-important
- // remove for all states
- box-shadow: none !important;
-}
-
-.euiButton.euiButton-isDisabled:not(.euiButton--ghost),
-.euiButtonIcon.euiButtonIcon-isDisabled:not(.euiButtonIcon--ghost) {
- &,
- &:hover {
- $backgroundColorSimulated: mix($euiPageBackgroundColor, $euiButtonColorDisabled, 90%);
- background-color: transparentize($euiButtonColorDisabled, .9);
- color: makeDisabledContrastColor($euiButtonColorDisabled, $backgroundColorSimulated);
- }
-}
-
-.euiButtonIcon--empty.euiButtonIcon-isDisabled:not(.euiButtonIcon--ghost) {
- &,
- &:hover {
- background-color: transparent;
- color: makeDisabledContrastColor($euiButtonColorDisabled, $euiPageBackgroundColor);
- }
-}
-
-.euiButton--small,
-.euiButtonIcon--small,
-.euiButtonIcon--xSmall {
- // Use a moderately smaller radius on small buttons
- // so that they don't appear completely rounded
- border-radius: $euiBorderRadius * (2 / 3);
-}
-
-// Change the hollow (bordered) buttons to have a transparent background
-// and no border
-@each $name, $color in $euiButtonTypes {
- .euiButton--#{$name} {
- @include euiButtonDefaultStyle($color);
-
- @if ($name == 'ghost') {
- // Ghost is unique and ALWAYS sits against a dark background.
- $backgroundColorSimulated: mix($euiColorInk, $color, 70%);
- color: makeHighContrastColor($color, $backgroundColorSimulated);
- } @else if ($name == 'text') {
- // The default color is lighter than the normal text color, make it the text color
- color: $euiTextColor;
- } @else {
- &.euiButton--fill:focus {
- outline-color: lightOrDarkTheme($euiColorInk, $euiColorGhost);
- }
- }
-
- &.euiButton--fill:not([class*='isDisabled']) {
- color: chooseLightOrDarkText($color, $euiColorGhost, $euiColorInk);
-
- &,
- &:hover,
- &:focus {
- background-color: $color;
- }
- }
- }
-}
-
-// Fix ghost/disabled look specifically
-.euiButton.euiButton-isDisabled.euiButton--ghost,
-// adding fill type to override default theme
-.euiButton.euiButton-isDisabled.euiButton--ghost.euiButton--fill {
- &,
- &:focus {
- color: $euiButtonColorGhostDisabled;
- background-color: transparentize($euiButtonColorGhostDisabled, .9);
- }
-}
-
-
-// Duplicating the above for EuiButtonIcon
-@each $name, $color in $euiButtonTypes {
- .euiButtonIcon--#{$name}:not(.euiButtonIcon--empty) {
- @include euiButtonDefaultStyle($color);
-
- @if ($name == 'ghost') {
- // Ghost is unique and ALWAYS sits against a dark background.
- $backgroundColorSimulated: mix($euiColorInk, $color, 70%);
- color: makeHighContrastColor($color, $backgroundColorSimulated);
- } @else if ($name == 'text') {
- // The default color is lighter than the normal text color, make it the text color
- color: $euiTextColor;
- } @else {
- &.euiButtonIcon--fill:focus {
- outline-color: lightOrDarkTheme($euiColorInk, $euiColorGhost);
- }
- }
-
- &.euiButtonIcon--fill:not([class*='isDisabled']) {
- color: chooseLightOrDarkText($color, $euiColorGhost, $euiColorInk);
-
- &,
- &:hover,
- &:focus {
- background-color: $color;
- }
- }
- }
-}
-
-// Fix ghost/disabled look specifically
-.euiButtonIcon:not(.euiButtonIcon--empty).euiButtonIcon-isDisabled.euiButtonIcon--ghost,
-// adding fill type to override default theme
-.euiButtonIcon.euiButtonIcon-isDisabled.euiButtonIcon--ghost.euiButtonIcon--fill {
- &,
- &:focus {
- color: $euiButtonColorGhostDisabled;
- background-color: transparentize($euiButtonColorGhostDisabled, .9);
- }
-}
diff --git a/src/themes/amsterdam/overrides/_button_empty.scss b/src/themes/amsterdam/overrides/_button_empty.scss
deleted file mode 100644
index acdec07f7f4..00000000000
--- a/src/themes/amsterdam/overrides/_button_empty.scss
+++ /dev/null
@@ -1,20 +0,0 @@
-.euiButtonEmpty {
- border-radius: $euiBorderRadius;
-
- &.euiButtonEmpty--small,
- &.euiButtonEmpty--xSmall {
- // Use a moderately smaller radius on small buttons
- // so that they don't appear completely rounded
- border-radius: $euiBorderRadius * .667;
- }
-
- &.euiButtonEmpty--xSmall {
- font-size: $euiFontSizeXS;
- }
-}
-
-@each $name, $color in $euiButtonTypes {
- .euiButtonEmpty--#{$name}:enabled:focus {
- @include euiFocusBackground($color);
- }
-}
diff --git a/src/themes/amsterdam/overrides/_button_group.scss b/src/themes/amsterdam/overrides/_button_group.scss
deleted file mode 100644
index cb1d3856379..00000000000
--- a/src/themes/amsterdam/overrides/_button_group.scss
+++ /dev/null
@@ -1,91 +0,0 @@
-// This file has lots of modifiers and is somewhat nesty by nature
-// sass-lint:disable nesting-depth
-
-.euiButtonGroup__buttons {
- box-shadow: none !important; // sass-lint:disable-line no-important
-}
-
-.euiButtonGroup--medium,
-.euiButtonGroup--small {
- .euiButtonGroupButton {
- border: none !important; // sass-lint:disable-line no-important
- border-radius: 0 !important; // sass-lint:disable-line no-important
- font-weight: $euiButtonFontWeight;
-
- // Complicated set of focus states depending on whether it's a button and can receive :focus,
- // or an input and uses focus-within, and browser support for :focus-visible
- &:focus,
- &:focus-within {
- outline-style: solid;
- outline-color: lightOrDarkTheme($euiColorInk, $euiColorGhost);
- outline-offset: -2px;
-
- &:focus-visible {
- outline-style: auto; // For chrome only
- }
- }
-
- &:focus:not(:focus-visible) {
- outline: none;
- }
- }
-
- .euiButtonGroupButton-isDisabled:not(.euiButtonGroupButton--ghost):not(.euiButtonGroupButton-isSelected) {
- $backgroundColorSimulated: mix($euiPageBackgroundColor, $euiButtonColorDisabled, 70%);
- background-color: transparentize($euiButtonColorDisabled, .7);
- color: makeHighContrastColor($euiButtonColorDisabled, $backgroundColorSimulated, 2);
- }
-
- // Change the hollow (bordered) buttons to have a transparent background
- // and no border
- @each $name, $color in $euiButtonTypes {
- .euiButtonGroupButton--#{$name} {
- @include euiButtonDefaultStyle($color);
-
- @if ($name == 'ghost') {
- // Ghost is unique and ALWAYS sits against a dark background.
- $backgroundColorSimulated: mix($euiColorInk, $color, 70%);
- color: makeHighContrastColor($color, $backgroundColorSimulated);
- }
- }
- }
-
- .euiButtonGroupButton-isDisabled.euiButtonGroupButton--ghost:not(.euiButtonGroupButton-isSelected) {
- &,
- &:hover,
- &:focus {
- background-color: transparentize($euiButtonColorGhostDisabled, .7);
- }
- }
-}
-
-.euiButtonGroup--small .euiButtonGroup__buttons {
- // Use a moderately smaller radius on small buttons
- // so that they don't appear completely rounded
- border-radius: $euiBorderRadius * (2 / 3);
-}
-
-.euiButtonGroup--compressed .euiButtonGroupButton {
- // Add 1 to the border radius to account for the background-clip
- border-radius: $euiFormControlCompressedBorderRadius + 1;
-
- @each $name, $color in $euiButtonTypes {
- &--#{$name} {
- // Complicated set of focus states depending on whether it's a button and can receive :focus,
- // or an input and uses focus-within, and browser support for :focus-visible,
- // and override nature of default theme
- &:not([class*='isDisabled']):focus,
- &:not([class*='isDisabled']):focus-within {
- outline-color: $color;
-
- &:focus-visible {
- outline-style: auto; // For chrome only
- }
- }
-
- &:not([class*='isDisabled']):focus:not(:focus-visible) {
- outline: none;
- }
- }
- }
-}
diff --git a/src/themes/amsterdam/overrides/_header.scss b/src/themes/amsterdam/overrides/_header.scss
index 36529798494..1ac82010b02 100644
--- a/src/themes/amsterdam/overrides/_header.scss
+++ b/src/themes/amsterdam/overrides/_header.scss
@@ -1,5 +1,3 @@
-@import '../global_styling/mixins/button';
-
.euiHeader {
height: $euiHeaderHeight;
padding-left: $euiSizeS;
diff --git a/src/themes/amsterdam/overrides/_index.scss b/src/themes/amsterdam/overrides/_index.scss
index 37642e4d7db..c8fafc568b8 100644
--- a/src/themes/amsterdam/overrides/_index.scss
+++ b/src/themes/amsterdam/overrides/_index.scss
@@ -1,3 +1,4 @@
+@import 'breadcrumbs';
@import 'button';
@import 'button_empty';
@import 'button_group';
diff --git a/upcoming_changelogs/5989.md b/upcoming_changelogs/5989.md
new file mode 100644
index 00000000000..15491681885
--- /dev/null
+++ b/upcoming_changelogs/5989.md
@@ -0,0 +1,16 @@
+- Updated button `ghost` colors to be `colorMode = 'dark'` themed `text` buttons
+- Renamed `ButtonColor` and `ButtonSize` types to prefixed versions `EuiButtonColor` and `EuiButtonSize`
+
+**Deprecations**
+
+- Deprecated `ghost` color for `EuiButton`, `EuiButtonIcon`, `EuiButtonEmpty`
+
+**Breaking changes**
+
+- Removed `EuiButtonIconColor` and `EuiButtonEmptyColor` types, use `EuiButtonIconProps['color']` and `EuiButtonEmptyProps['color']` instead
+- Removed support for `ghost` color from `EuiButtonGroup`
+
+**CSS-in-JS**
+
+- Converted `EuiButton` to Emotion
+- Converted color styles of `EuiButtonIcon`, `EuiButtonEmpty`, `EuiButtonGroup`
diff --git a/upcoming_changelogs/6124.md b/upcoming_changelogs/6124.md
new file mode 100644
index 00000000000..9b8923e5181
--- /dev/null
+++ b/upcoming_changelogs/6124.md
@@ -0,0 +1,5 @@
+**CSS-in-JS conversions**
+
+- Added `logicalCSSWithFallback()` utility for logical properties without full browser support
+- Converted `euiFullHeight()` Sass mixin to Emotion
+- Converted all global CSS utility classes to Emotion