-
Notifications
You must be signed in to change notification settings - Fork 8.3k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Browse files
Browse the repository at this point in the history
- Loading branch information
1 parent
a0c9880
commit 0ffa2cb
Showing
34 changed files
with
439 additions
and
197 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 supplement the Elastic-Charts `baseTheme`. However, every instance of a Chart would need to pass down the correct 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`. | ||
|
||
> 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` TS type in `@elastic/charts` without having to update the `@elastic/eui` themes for every `<Chart />`. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.