Skip to content

Commit db01607

Browse files
[Console] Migrate SCSS to Emotion (#236377)
Addresses #205027 • Migrate Console + Embeddable UI to emotion ### Screenshots (Before | After) <img width="3201" height="1401" alt="image" src="https://github.com/user-attachments/assets/e48681f0-e356-4953-8884-6481bd59695e" /> <img width="3196" height="1398" alt="image" src="https://github.com/user-attachments/assets/846d90bd-ca38-4f1f-8a80-bf7e6c082d7a" /> <img width="3199" height="1385" alt="image" src="https://github.com/user-attachments/assets/b3a16f27-9dd5-4597-a913-6f285a0494da" /> <img width="3195" height="1398" alt="image" src="https://github.com/user-attachments/assets/86fe78c9-aba2-4c70-ad4e-e5e5d4fe7f92" /> <img width="3203" height="1405" alt="image" src="https://github.com/user-attachments/assets/ee2eb974-0809-467b-82f2-5d9b45c497d9" /> <img width="3204" height="1393" alt="image" src="https://github.com/user-attachments/assets/45b38019-6288-4170-a7b3-7b9fae41327f" /> <img width="3205" height="1397" alt="image" src="https://github.com/user-attachments/assets/e0af4f9e-46ae-4689-928a-85b50658fbfe" /> <img width="3199" height="1395" alt="image" src="https://github.com/user-attachments/assets/4a3cdb9b-3649-4637-ac57-e50e763d6dd8" /> --------- Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com>
1 parent 51b8f12 commit db01607

35 files changed

+797
-616
lines changed

src/platform/plugins/shared/console/public/application/components/editor_content_spinner.tsx

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,23 @@
99

1010
import type { FunctionComponent } from 'react';
1111
import React from 'react';
12-
import { EuiLoadingSpinner, EuiPageSection } from '@elastic/eui';
12+
import { EuiLoadingSpinner, EuiPageSection, useEuiTheme } from '@elastic/eui';
13+
import { css } from '@emotion/react';
14+
15+
const useStyles = () => {
16+
const { euiTheme } = useEuiTheme();
17+
return {
18+
editorSpinner: css`
19+
width: 100%;
20+
background-color: ${euiTheme.colors.backgroundBaseSubdued};
21+
`,
22+
};
23+
};
1324

1425
export const EditorContentSpinner: FunctionComponent = () => {
26+
const styles = useStyles();
1527
return (
16-
<EuiPageSection alignment="center" grow={true} className="conApp__editor__spinner">
28+
<EuiPageSection alignment="center" grow={true} css={styles.editorSpinner}>
1729
<EuiLoadingSpinner size="xxl" />
1830
</EuiPageSection>
1931
);

src/platform/plugins/shared/console/public/application/components/help_popover.tsx

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,10 @@ const styles = {
3434
background: transparent;
3535
}
3636
`,
37+
38+
fixedWidthText: css`
39+
width: 300px;
40+
`,
3741
};
3842

3943
export const HelpPopover = ({ button, isOpen, closePopover, resetTour }: HelpPopoverProps) => {
@@ -117,7 +121,7 @@ export const HelpPopover = ({ button, isOpen, closePopover, resetTour }: HelpPop
117121

118122
<EuiSpacer size="s" />
119123

120-
<EuiText css={{ width: 300 }} color="subdued" size="s">
124+
<EuiText css={styles.fixedWidthText} color="subdued" size="s">
121125
<p>
122126
{i18n.translate('console.helpPopover.description', {
123127
defaultMessage:

src/platform/plugins/shared/console/public/application/components/settings/settings_editor.tsx

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,19 @@ import {
2121
EuiSpacer,
2222
EuiText,
2323
} from '@elastic/eui';
24+
import { css } from '@emotion/react';
2425

2526
import { SettingsGroup } from './settings_group';
2627
import { SettingsFormRow } from './settings_form_row';
2728
import type { DevToolsSettings } from '../../../services';
2829
import type { EsHostService } from '../../lib';
2930

31+
const styles = {
32+
minWidthControl: css`
33+
min-width: 220px;
34+
`,
35+
};
36+
3037
const DEBOUNCE_DELAY = 500;
3138
const ON_LABEL = i18n.translate('console.settingsPage.onLabel', { defaultMessage: 'On' });
3239
const OFF_LABEL = i18n.translate('console.settingsPage.offLabel', { defaultMessage: 'Off' });
@@ -268,7 +275,7 @@ export const SettingsEditor = (props: Props) => {
268275
})}
269276
>
270277
<EuiSuperSelect
271-
css={{ minWidth: '220px' }}
278+
css={styles.minWidthControl}
272279
compressed
273280
disabled={availableHosts.length < 2}
274281
options={availableHosts.map((host) => ({
@@ -292,7 +299,7 @@ export const SettingsEditor = (props: Props) => {
292299
})}
293300
>
294301
<EuiFieldNumber
295-
css={{ minWidth: '220px' }}
302+
css={styles.minWidthControl}
296303
compressed
297304
data-test-subj="setting-font-size-input"
298305
value={fontSize}
@@ -370,7 +377,7 @@ export const SettingsEditor = (props: Props) => {
370377
})}
371378
>
372379
<EuiSuperSelect
373-
css={{ minWidth: '220px' }}
380+
css={styles.minWidthControl}
374381
compressed
375382
options={intervalOptions}
376383
valueOfSelected={pollInterval.toString()}

src/platform/plugins/shared/console/public/application/components/variables/variables_editor.tsx

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import {
2525
EuiToolTip,
2626
type EuiBasicTableColumn,
2727
} from '@elastic/eui';
28+
import { css } from '@emotion/react';
2829

2930
import type { NotificationsStart } from '@kbn/core/public';
3031
import { useServicesContext } from '../../contexts';
@@ -63,6 +64,14 @@ const copyToClipboard = async (text: string, notifications: Pick<NotificationsSt
6364
}
6465
};
6566

67+
const styles = {
68+
conVariablesTable: css`
69+
.euiTableRow-isExpandedRow .euiTableCellContent {
70+
padding: 0;
71+
}
72+
`,
73+
};
74+
6675
export const VariablesEditor = (props: Props) => {
6776
const isMounted = useRef(false);
6877
const [isAddingVariable, setIsAddingVariable] = useState(false);
@@ -256,7 +265,7 @@ export const VariablesEditor = (props: Props) => {
256265
columns={columns}
257266
itemId="id"
258267
responsiveBreakpoint={false}
259-
className="conVariablesTable"
268+
css={styles.conVariablesTable}
260269
data-test-subj="variablesTable"
261270
itemIdToExpandedRowMap={itemIdToExpandedRowMap}
262271
noItemsMessage={i18n.translate('console.variablesPage.table.noItemsMessage', {

src/platform/plugins/shared/console/public/application/components/variables/variables_editor_form.tsx

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,13 +21,20 @@ import {
2121
EuiPanel,
2222
EuiButtonEmpty,
2323
} from '@elastic/eui';
24+
import { css } from '@emotion/react';
2425

2526
import type { FieldConfig, FormConfig, ValidationFuncArg } from '../../../shared_imports';
2627
import { useForm, Form, UseField, TextField, fieldValidators } from '../../../shared_imports';
2728

2829
import { type DevToolsVariable } from './types';
2930
import { isValidVariableName } from './utils';
3031

32+
const styles = {
33+
fullWidthPanel: css`
34+
width: 100%;
35+
`,
36+
};
37+
3138
export interface VariableEditorFormProps {
3239
onSubmit: (data: DevToolsVariable) => void;
3340
onCancel: () => void;
@@ -98,7 +105,7 @@ export const VariableEditorForm = (props: VariableEditorFormProps) => {
98105
hasShadow={false}
99106
borderRadius="none"
100107
grow={false}
101-
css={{ width: '100%' }}
108+
css={styles.fullWidthPanel}
102109
>
103110
<EuiTitle size="xs">
104111
<h2>

src/platform/plugins/shared/console/public/application/containers/config/config.tsx

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,17 @@ import {
1515
EuiSpacer,
1616
useIsWithinBreakpoints,
1717
} from '@elastic/eui';
18+
import { css } from '@emotion/react';
1819

1920
import { Settings } from './settings';
2021
import { Variables } from './variables';
2122

23+
const styles = {
24+
fullHeightPanel: css`
25+
height: 100%;
26+
`,
27+
};
28+
2229
export function Config() {
2330
const isVerticalLayout = useIsWithinBreakpoints(['xs', 's', 'm']);
2431

@@ -28,7 +35,7 @@ export function Config() {
2835
paddingSize="l"
2936
hasShadow={false}
3037
borderRadius="none"
31-
css={{ height: '100%' }}
38+
css={styles.fullHeightPanel}
3239
data-test-subj="consoleConfigPanel"
3340
>
3441
<EuiFlexGroup

src/platform/plugins/shared/console/public/application/containers/editor/components/context_menu/context_menu.tsx

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,9 @@ const styles = {
5252
button: css`
5353
&:hover {
5454
text-decoration: none !important;
55-
.languageSelector {
55+
56+
/* Target the language selector when the button is hovered */
57+
.consoleEditorContextMenu__languageSelector {
5658
text-decoration: underline;
5759
}
5860
}
@@ -251,7 +253,12 @@ export const ContextMenu = ({
251253
>
252254
<EuiFlexGroup alignItems="center">
253255
<EuiFlexItem>
254-
<EuiFlexGroup gutterSize="xs" alignItems="center" className="languageSelector">
256+
<EuiFlexGroup
257+
gutterSize="xs"
258+
alignItems="center"
259+
className="consoleEditorContextMenu__languageSelector"
260+
data-test-subj="language-selector"
261+
>
255262
<EuiFlexItem grow={false}>
256263
<FormattedMessage
257264
tagName="span"

src/platform/plugins/shared/console/public/application/containers/editor/components/context_menu/language_selector_modal.tsx

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,17 @@ import {
2222
EuiLink,
2323
EuiTextColor,
2424
} from '@elastic/eui';
25+
import { css } from '@emotion/react';
2526
import { i18n } from '@kbn/i18n';
2627
import { FormattedMessage } from '@kbn/i18n-react';
2728
import { AVAILABLE_LANGUAGES } from '../../../../../../common/constants';
2829

30+
const styles = {
31+
constrainedSelectable: css`
32+
max-width: 550px;
33+
`,
34+
};
35+
2936
interface Props {
3037
closeModal: () => void;
3138
onSubmit: (language: string) => void;
@@ -113,7 +120,7 @@ export const LanguageSelectorModal = ({
113120

114121
<EuiModalBody>
115122
<EuiSelectable
116-
css={{ maxWidth: 550 }}
123+
css={styles.constrainedSelectable}
117124
options={optionsList as EuiSelectableOption[]}
118125
onChange={(changedOptions) => setOptions(changedOptions)}
119126
singleSelection="always"

src/platform/plugins/shared/console/public/application/containers/editor/editor.tsx

Lines changed: 51 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
*/
99

1010
import React, { useCallback, memo, useEffect, useState } from 'react';
11+
import { css } from '@emotion/react';
1112
import { debounce } from 'lodash';
1213
import {
1314
EuiProgress,
@@ -39,11 +40,47 @@ import {
3940
import { MonacoEditor } from './monaco_editor';
4041
import { MonacoEditorOutput } from './monaco_editor_output';
4142
import { getResponseWithMostSevereStatusCode } from '../../../lib/utils';
43+
import { consoleEditorPanelStyles, useResizerButtonStyles } from '../styles';
4244

4345
const INITIAL_PANEL_SIZE = 50;
4446
const PANEL_MIN_SIZE = '20%';
4547
const DEBOUNCE_DELAY = 500;
4648

49+
const useStyles = () => {
50+
const { euiTheme } = useEuiTheme();
51+
52+
return {
53+
consoleEditorPanel: consoleEditorPanelStyles,
54+
55+
requestProgressBarContainer: css`
56+
position: relative;
57+
z-index: ${euiTheme.levels.menu};
58+
`,
59+
60+
resizerButton: useResizerButtonStyles(),
61+
62+
// Consolidated styles for editor panels with positioning
63+
editorPanelPositioned: css`
64+
top: 0;
65+
height: calc(100% - 40px);
66+
`,
67+
68+
outputPanelCentered: css`
69+
align-content: center;
70+
top: 0;
71+
height: calc(100% - 40px);
72+
`,
73+
74+
actionsPanelWithBackground: css`
75+
background-color: ${euiTheme.colors.backgroundBasePlain};
76+
`,
77+
78+
fullHeightPanel: css`
79+
height: 100%;
80+
`,
81+
};
82+
};
83+
4784
interface Props {
4885
loading: boolean;
4986
inputEditorValue: string;
@@ -54,7 +91,7 @@ export const Editor = memo(({ loading, inputEditorValue, setInputEditorValue }:
5491
const {
5592
services: { storage, objectStorageClient },
5693
} = useServicesContext();
57-
const { euiTheme } = useEuiTheme();
94+
const styles = useStyles();
5895

5996
const { currentTextObject } = useEditorReadContext();
6097

@@ -131,12 +168,12 @@ export const Editor = memo(({ loading, inputEditorValue, setInputEditorValue }:
131168
return (
132169
<>
133170
{fetchingAutocompleteEntities ? (
134-
<div className="conApp__requestProgressBarContainer">
171+
<div css={styles.requestProgressBarContainer}>
135172
<EuiProgress size="xs" color="accent" position="absolute" />
136173
</div>
137174
) : null}
138175
<EuiResizableContainer
139-
css={{ height: '100%' }}
176+
css={styles.fullHeightPanel}
140177
direction={isVerticalLayout ? 'vertical' : 'horizontal'}
141178
onPanelWidthChange={(sizes) => onPanelSizeChange(sizes)}
142179
data-test-subj="consoleEditorContainer"
@@ -153,13 +190,12 @@ export const Editor = memo(({ loading, inputEditorValue, setInputEditorValue }:
153190
grow={true}
154191
borderRadius="none"
155192
hasShadow={false}
156-
css={{ height: '100%' }}
193+
css={styles.fullHeightPanel}
157194
>
158195
<EuiSplitPanel.Inner
159196
paddingSize="none"
160197
grow={true}
161-
className="consoleEditorPanel"
162-
css={{ top: 0, height: 'calc(100% - 40px)' }}
198+
css={[styles.consoleEditorPanel, styles.editorPanelPositioned]}
163199
>
164200
{loading ? (
165201
<EditorContentSpinner />
@@ -177,7 +213,7 @@ export const Editor = memo(({ loading, inputEditorValue, setInputEditorValue }:
177213
grow={false}
178214
paddingSize="s"
179215
color="subdued"
180-
className="consoleEditorPanel"
216+
css={styles.consoleEditorPanel}
181217
>
182218
<EuiButtonEmpty
183219
size="xs"
@@ -197,7 +233,7 @@ export const Editor = memo(({ loading, inputEditorValue, setInputEditorValue }:
197233
</EuiResizablePanel>
198234

199235
<EuiResizableButton
200-
className="conApp__resizerButton"
236+
css={styles.resizerButton}
201237
aria-label={i18n.translate('console.editor.adjustPanelSizeAriaLabel', {
202238
defaultMessage: "Press left/right to adjust panels' sizes",
203239
})}
@@ -209,11 +245,14 @@ export const Editor = memo(({ loading, inputEditorValue, setInputEditorValue }:
209245
tabIndex={0}
210246
paddingSize="none"
211247
>
212-
<EuiSplitPanel.Outer borderRadius="none" hasShadow={false} css={{ height: '100%' }}>
248+
<EuiSplitPanel.Outer
249+
borderRadius="none"
250+
hasShadow={false}
251+
css={styles.fullHeightPanel}
252+
>
213253
<EuiSplitPanel.Inner
214254
paddingSize="none"
215-
css={{ alignContent: 'center', top: 0, height: 'calc(100% - 40px)' }}
216-
className="consoleEditorPanel"
255+
css={[styles.consoleEditorPanel, styles.outputPanelCentered]}
217256
>
218257
{data ? (
219258
<MonacoEditorOutput />
@@ -228,10 +267,7 @@ export const Editor = memo(({ loading, inputEditorValue, setInputEditorValue }:
228267
<EuiSplitPanel.Inner
229268
grow={false}
230269
paddingSize="s"
231-
css={{
232-
backgroundColor: euiTheme.colors.backgroundBasePlain,
233-
}}
234-
className="consoleEditorPanel"
270+
css={[styles.consoleEditorPanel, styles.actionsPanelWithBackground]}
235271
>
236272
<EuiFlexGroup gutterSize="none" responsive={false}>
237273
<EuiFlexItem grow={false}>

0 commit comments

Comments
 (0)