Theming
Configure the appearance of Pluto components.
Pluto comes with a theming system that allows you to change the appearance of components.
Overriding the Default Theme
We’ve put together a default dark and light theme that we think looks pretty good, and you can override certain properties to suit your needs.
To customize the default themes, pass arguments to the theming
prop of the
Pluto.Provider
component.
import { Pluto } from "@synnaxlabs/pluto";
const App = () => (
// Set the primary color to a nice lavender
<Pluto.Provider theming={{ theme: { colors: { primary: "#b57edc" } }}}>
<Pluto.Button>Click me</Pluto.Button>
</Pluto.Provider>
);
Theme Specification
Here is the structure of the theming.theme
prop:
// Colors can be hexadecimal strings, RGB arrays, or RGBA arrays
type Color = string | [number, number, number] | [number, number, number, number];
// Specification for a particular typography element e.g. h1, h2, etc.
type TypographySpec = {
// Size in rem
size?: number;
// Font weight
weight?: number;
// Line height in rem
lineHeight?: number;
// Optional text transforms to apply
textTransform?: string;
}
// A color scale where m2 has the lowest contrast with the background
// and p2 has the highest contrast.
type Scale = {
// Lowest contrast
m2: Color;
// Low contrast
m1: Color;
// Base
z: Color;
// High contrast
p1: Color;
// Highest contrast
p2: Color;
}
interface Theme {
// Sets the color palette.
colors?: {
// Border color to use on tabs, buttons, etc.
border?: Color;
// Primary accent color. If one color is provided,
// the scale will get generated automatically.
primary?: Color | Scale;
// Secondary accent color. If one color is provided,
// the scale will get generated automatically.
secondary?: Color | Scale;
// Error color. If one color is provided, the scale
// will get generated automatically.
error?: Color | Scale;
// White color, regardless of theme
white?: Color;
// Black color, regardless of theme
black?: Color;
// Text color
text?: Color;
// Inverted text color to use on dark elements.
textInverted?: Color;
// Text color to use on top of primary elements. If not provided,
// it will be automatically chosen from the highest contrast of text and
// textInverted.
textOnPrimary?: Color;
},
// Sets sizing parameters
sizes: {
// Defines the rem base size. Defaults to 6px. Increase this value to
// increase the size of all components.
base?: number,
border: {
// Border radius in px for (almost) all components
radius?: number;
// Border width in px for (almost) all components
width?: number;
}
},
// Sets typography parameters
typography: {
// The font family to use.
family?: string;
// H1 typography
h1: TypographySpec;
// H2 typography
h2: TypographySpec;
// H3 typography
h3: TypographySpec;
// H4 typography
h4: TypographySpec;
// H5 typography
h5: TypographySpec;
}
}