-
Notifications
You must be signed in to change notification settings - Fork 8.3k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Fix discover, tsvb and Lens chart theming issues #69695
Changes from 2 commits
2102674
18771dc
aff4e8a
189843c
6207f94
d82c6b8
614bc5f
730c2e9
2c9cd0b
cb726f3
fb35a49
135b43a
faece28
fd7046f
21953cc
f5fcbf3
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change | ||||
---|---|---|---|---|---|---|
@@ -0,0 +1,92 @@ | ||||||
# Theme Service | ||||||
|
||||||
The `theme` service offers utilities to interact with the kibana theme. EUI provides a light and dark theme object to suplement the Elastic-Charts `baseTheme`. However, every instance of a Chart would need to pass down this the correctly EUI theme depending on Kibana's light or dark mode. There are several ways you can use the `theme` service to get the correct shared `theme` and `baseTheme`. | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Gracias 189843c |
||||||
|
||||||
> The current theme (light or dark) of Kibana is typically taken into account for the functions below. | ||||||
|
||||||
## `chartsDefaultBaseTheme` | ||||||
|
||||||
Default `baseTheme` from `@elastic/charts` (i.e. light). | ||||||
|
||||||
## `chartsDefaultTheme` | ||||||
|
||||||
Default `theme` from `@elastic/eui` (i.e. light). | ||||||
|
||||||
## `useChartsTheme` and `useChartsBaseTheme` | ||||||
|
||||||
A **React hook** for simple fetching of the correct EUI `theme` and `baseTheme`. | ||||||
|
||||||
```js | ||||||
import { npStart } from 'ui/new_platform'; | ||||||
import { Chart, Settings } from '@elastic/charts'; | ||||||
|
||||||
export const YourComponent = () => ( | ||||||
<Chart> | ||||||
<Settings | ||||||
theme={npStart.plugins.charts.theme.useChartsTheme()} | ||||||
baseTheme={npStart.plugins.charts.theme.useChartsBaseTheme()} | ||||||
/> | ||||||
{/* ... */} | ||||||
</Chart> | ||||||
); | ||||||
``` | ||||||
|
||||||
## `chartsTheme$` and `chartsBaseTheme$` | ||||||
|
||||||
An **`Observable`** of the current charts `theme` and `baseTheme`. Use this implementation for more flexible updates to the chart theme without full page refreshes. | ||||||
|
||||||
```tsx | ||||||
import { npStart } from 'ui/new_platform'; | ||||||
import { EuiChartThemeType } from '@elastic/eui/src/themes/charts/themes'; | ||||||
import { Subscription, combineLatest } from 'rxjs'; | ||||||
import { Chart, Settings, Theme } from '@elastic/charts'; | ||||||
|
||||||
interface YourComponentProps {}; | ||||||
|
||||||
interface YourComponentState { | ||||||
chartsTheme: EuiChartThemeType['theme']; | ||||||
chartsBaseTheme: Theme; | ||||||
} | ||||||
|
||||||
export class YourComponent extends Component<YourComponentProps, YourComponentState> { | ||||||
private subscriptions: Subscription[] = []; | ||||||
|
||||||
public state = { | ||||||
chartsTheme: npStart.plugins.charts.theme.chartsDefaultTheme, | ||||||
chartsBaseTheme: npStart.plugins.charts.theme.chartsDefaultBaseTheme, | ||||||
}; | ||||||
|
||||||
componentDidMount() { | ||||||
this.subscription = combineLatest( | ||||||
npStart.plugins.charts.theme.chartsTheme$, | ||||||
npStart.plugins.charts.theme.chartsBaseTheme$ | ||||||
).subscribe(([chartsTheme, chartsBaseTheme]) => | ||||||
this.setState({ chartsTheme, chartsBaseTheme }) | ||||||
); | ||||||
} | ||||||
|
||||||
componentWillUnmount() { | ||||||
if (this.subscription) { | ||||||
this.subscription.unsubscribe(); | ||||||
} | ||||||
} | ||||||
|
||||||
public render() { | ||||||
const { chartsBaseTheme, chartsTheme } = this.state; | ||||||
|
||||||
return ( | ||||||
<Chart> | ||||||
<Settings | ||||||
theme={chartsTheme} | ||||||
baseTheme={chartsBaseTheme} | ||||||
/> | ||||||
{/* ... */} | ||||||
</Chart> | ||||||
); | ||||||
} | ||||||
} | ||||||
``` | ||||||
|
||||||
## Why have `theme` and `baseTheme`? | ||||||
|
||||||
The `theme` prop is a recursive partial `Theme` that overrides properties from the `baseTheme`. This allows changes to the `Theme` type in `@elastic/charts` without having to update the `@elastic/eui` themes or every `<Chart />`. | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Does this mean that every There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. It's not a must. But since we added the background color to the theme for the contrast ratio logic, the background color defaults to a non- I'm not sure if But on a more general note, I think it's helpful to have a I raised the question in an EC issue, to see how we could do this better (see elastic/elastic-charts#718). As of now, I think a HOC to handle this logic and allow overrides would be the most practicable option. Something like... const MyComponent = () => (
<Chart>
<ThemedSettings theme={EuiThemeOverrides} {...otherSettingsProps} />
{/* more goodness */}
</Chart>
) There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Fixed spelling errors here 189843c |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It's irrelevant with this PR but I saw on L21 that there is a typo Funciton instead of Function and retrive instead of retrieve. Do you want to also correct it in this PR ?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Fixed in d82c6b8