documentation-site/components/overrides.jsx (100 lines of code) (raw):

/* Copyright (c) Uber Technologies, Inc. This source code is licensed under the MIT license found in the LICENSE file in the root directory of this source tree. */ import * as React from "react"; import { Block } from "baseui/block"; import { Radio, RadioGroup } from "baseui/radio"; import { DocLink } from "./markdown-elements"; import { trackEvent } from "../helpers/ga"; const isStyledExport = (exportName) => exportName.startsWith("Styled"); const getOverrideName = (exportName) => exportName.replace("Styled", ""); const getOverrides = (component, blacklisted, whitelisted) => { if (whitelisted) return whitelisted.sort(); return component ? Object.keys(component) .filter(isStyledExport) .map(getOverrideName) .filter((key) => !blacklisted.includes(key)) .sort() : []; }; class Overrides extends React.Component { constructor(props) { super(props); this.state = { // select the first export by default highlighted: getOverrides( props.component, props.blacklisted, props.whitelisted, )[0], }; } render() { const { component, renderExample, name } = this.props; const overrides = getOverrides( component, this.props.blacklisted, this.props.whitelisted, ); return ( <React.Fragment> <Block as="p" font="font300"> Additionally, you can{" "} <DocLink href="/guides/theming">fully customize</DocLink> any part of the <strong>{name}</strong> through the <strong>overrides</strong>{" "} prop. The {name} consists of multiple subcomponents that are listed below and you can override each one of them. To help you identify the names of these subcomponents,{" "} <strong>you can highlight them through this selector:</strong> </Block> <RadioGroup name="highlight an override" value={this.state.highlighted} onChange={(e) => { this.setState({ highlighted: e.target.value }); trackEvent("overrides_inspector", `${name}:${e.target.value}`); }} > {overrides.map((override) => ( <Radio key={override} value={override}> {override} </Radio> ))} </RadioGroup> <Block marginTop="scale900"> {renderExample({ overrides: { [this.state.highlighted]: { style: ({ $theme }) => $theme.name.startsWith("dark") ? { outline: `2px solid ${$theme.colors.warning600}`, backgroundColor: $theme.colors.warning600, } : { outline: `2px solid ${$theme.colors.warning200}`, backgroundColor: $theme.colors.warning200, }, }, }, })} </Block> <Block as="p" font="font300" marginTop="scale900"> <b>Note:</b> You should always use longhand CSS properties. Mixing shorthands and longhands will lead into{" "} <DocLink href="https://www.styletron.org/concepts/#shorthand-and-longhand-properties"> strange behaviors </DocLink> ! </Block> </React.Fragment> ); } } Overrides.defaultProps = { blacklisted: [], }; export default Overrides;