From 41295447389531f79069510fbb7e7d893f4418fc Mon Sep 17 00:00:00 2001 From: Akos Kitta Date: Thu, 5 Dec 2019 09:28:45 +0100 Subject: [PATCH] generalized the `react-select` component so tha we can reuse it all over the application. Signed-off-by: Akos Kitta --- .../src/browser/components/arduino-select.tsx | 66 +++++++++++++++ .../{style => icons}/library-tab-icon.svg | 0 .../src/browser/monitor/monitor-widget.tsx | 82 ++----------------- .../src/browser/style/arduino-select.css | 46 +++++++++++ .../src/browser/style/index.css | 3 +- .../src/browser/style/list-widget.css | 4 +- .../src/browser/style/monitor.css | 48 ----------- 7 files changed, 125 insertions(+), 124 deletions(-) create mode 100644 arduino-ide-extension/src/browser/components/arduino-select.tsx rename arduino-ide-extension/src/browser/{style => icons}/library-tab-icon.svg (100%) create mode 100644 arduino-ide-extension/src/browser/style/arduino-select.css diff --git a/arduino-ide-extension/src/browser/components/arduino-select.tsx b/arduino-ide-extension/src/browser/components/arduino-select.tsx new file mode 100644 index 00000000..83b8ced2 --- /dev/null +++ b/arduino-ide-extension/src/browser/components/arduino-select.tsx @@ -0,0 +1,66 @@ +import * as React from 'react'; +import Select from 'react-select'; +import { Styles } from 'react-select/src/styles'; +import { Props } from 'react-select/src/components'; +import { ThemeConfig } from 'react-select/src/theme'; + +export class ArduinoSelect extends Select { + + constructor(props: Readonly>) { + super(props); + } + + render(): React.ReactNode { + const { defaultValue, onChange, options, className } = this.props; + const height = 25; + const styles: Styles = { + control: styles => ({ + ...styles, + width: 200, + color: 'var(--theia-ui-font-color1)' + }), + dropdownIndicator: styles => ({ + ...styles, + padding: 0 + }), + indicatorSeparator: () => ({ + display: 'none' + }), + indicatorsContainer: () => ({ + padding: '0px 5px' + }), + menu: styles => ({ + ...styles, + marginTop: 0 + }) + }; + const theme: ThemeConfig = theme => ({ + ...theme, + borderRadius: 0, + spacing: { + controlHeight: height, + baseUnit: 2, + menuGutter: 4 + }, colors: { + ...theme.colors, + // `primary50`??? it's crazy but apparently, without this, we would get a light-blueish + // color when selecting an option in the select by clicking and then not releasing the button. + // https://react-select.com/styles#overriding-the-theme + primary50: 'var(--theia-accent-color4)', + } + }); + const DropdownIndicator = () => ; + return - } } - export namespace SerialMonitorSendField { export interface Props { readonly onSend: (text: string) => void @@ -248,14 +182,12 @@ export class SerialMonitorSendField extends React.Component this.inputField = ref} - type='text' id='serial-monitor-send' + id='serial-monitor-send' + type='text' autoComplete='off' value={this.state.value} onChange={this.handleChange} /> - {/* -
-
*/} } @@ -268,6 +200,7 @@ export class SerialMonitorSendField extends React.Component { + /** + * Do not touch it. It is used to be able to "follow" the serial monitor log. + */ protected anchor: HTMLElement | null; render() { diff --git a/arduino-ide-extension/src/browser/style/arduino-select.css b/arduino-ide-extension/src/browser/style/arduino-select.css new file mode 100644 index 00000000..b456c933 --- /dev/null +++ b/arduino-ide-extension/src/browser/style/arduino-select.css @@ -0,0 +1,46 @@ +.arduino-select__control { + border: var(--theia-layout-color2) var(--theia-border-width) solid !important; + background: var(--theia-layout-color2) !important; +} + +.arduino-select__control:hover { + border: var(--theia-layout-color2) var(--theia-border-width) solid !important; +} + +.arduino-select__control--is-focused { + border-color: var(--theia-accent-color3) !important; + box-shadow: none !important; +} + +.arduino-select__option--is-selected { + background-color: var(--theia-accent-color3) !important; + color: var(--theia-content-font-color0) !important; + border-color: var(--theia-accent-color3) !important; +} + +.arduino-select__option--is-focused { + background-color: var(--theia-accent-color4) !important; + border-color: var(--theia-accent-color3) !important; +} + +.arduino-select__menu { + background-color: var(--theia-layout-color2) !important; + border: 1px solid var(--theia-accent-color3) !important; + top: auto !important; /* to align the top of the menu with the bottom of the control */ + box-shadow: none !important; +} + +.arduino-select__control.arduino-select__control--menu-is-open { + border: 1px solid !important; + border-color: var(--theia-accent-color3) !important; + border-bottom-color: var(--theia-layout-color2) !important; /* if the bottom border color has the same color as the background of the control, we make the border "invisible" */ +} + +.arduino-select__value-container .arduino-select__single-value { + color: var(--theia-ui-font-color1) !important; +} + +.arduino-select__menu-list { + padding-top: 0 !important; + padding-bottom: 0 !important; +} diff --git a/arduino-ide-extension/src/browser/style/index.css b/arduino-ide-extension/src/browser/style/index.css index e2dacd5a..31436023 100644 --- a/arduino-ide-extension/src/browser/style/index.css +++ b/arduino-ide-extension/src/browser/style/index.css @@ -2,4 +2,5 @@ @import './board-select-dialog.css'; @import './main.css'; @import './editor.css'; -@import './monitor.css'; \ No newline at end of file +@import './monitor.css'; +@import './arduino-select.css'; diff --git a/arduino-ide-extension/src/browser/style/list-widget.css b/arduino-ide-extension/src/browser/style/list-widget.css index b36ac409..1a887171 100644 --- a/arduino-ide-extension/src/browser/style/list-widget.css +++ b/arduino-ide-extension/src/browser/style/list-widget.css @@ -1,6 +1,6 @@ .library-tab-icon { - -webkit-mask: url('library-tab-icon.svg'); - mask: url('library-tab-icon.svg'); + -webkit-mask: url('../icons/library-tab-icon.svg'); + mask: url('../icons/library-tab-icon.svg'); } .arduino-list-widget { diff --git a/arduino-ide-extension/src/browser/style/monitor.css b/arduino-ide-extension/src/browser/style/monitor.css index 0b32103b..3a6bdd93 100644 --- a/arduino-ide-extension/src/browser/style/monitor.css +++ b/arduino-ide-extension/src/browser/style/monitor.css @@ -78,51 +78,3 @@ .p-TabBar-toolbar .item .clear-all { background: var(--theia-icon-clear) no-repeat; } - -/* React Select Styles */ -.serial-monitor-select .sms__control { - border: var(--theia-layout-color2) var(--theia-border-width) solid; - background: var(--theia-layout-color2); -} - -.serial-monitor-select .sms__control:hover { - border: var(--theia-layout-color2) var(--theia-border-width) solid !important; -} - -.serial-monitor-select .sms__control--is-focused { - border-color: var(--theia-accent-color3) !important; - box-shadow: none !important; -} - -.serial-monitor-select .sms__option--is-selected { - background-color: var(--theia-accent-color3); - color: var(--theia-content-font-color0); - border-color: var(--theia-accent-color3); -} - -.serial-monitor-select .sms__option--is-focused { - background-color: var(--theia-accent-color4); - border-color: var(--theia-accent-color3); -} - -.serial-monitor-select .sms__menu { - background-color: var(--theia-layout-color2); - border: 1px solid var(--theia-accent-color3); - top: auto !important; /* to align the top of the menu with the bottom of the control */ - box-shadow: none; -} - -.serial-monitor-select .sms__control.sms__control--menu-is-open { - border: 1px solid; - border-color: var(--theia-accent-color3) !important; - border-bottom-color: var(--theia-layout-color2) !important; /* if the bottom border color has the same color as the background of the control, we make the border "invisible" */ -} - -.serial-monitor-select .sms__value-container .sms__single-value { - color: var(--theia-ui-font-color1); -} - -.sms__menu-list { - padding-top: 0 !important; - padding-bottom: 0 !important; -}