This library provides Styled Components and css helper found in popular JS in CSS libraries. This library uses goober a 1kb style library with a wrapper to work with Solid's API. The wrapper also adds a Theming solution.
@param {String} tagName
The name of the dom element you'd like the styled to be applied to@returns {Function}
Returns the tag template function.
import { styled } from "solid-styled-components";
const Btn = styled("button")`
border-radius: 4px;
`;
import { styled } from "solid-styled-components";
const Btn = styled("button")`
border-radius: ${props => props.size}px;
`;
<Btn size={20} />;
import { styled } from "solid-styled-components";
const Btn = styled("button")(
props => `
border-radius: ${props.size}px;
`
);
<Btn size={20} />;
import { styled } from "solid-styled-components";
const Icon = styled("span")`
display: flex;
flex: 1;
color: red;
`;
const Button = styled("button")`
background: dodgerblue;
color: white;
border: ${Math.random()}px solid white;
&:focus,
&:hover {
padding: 1em;
}
.otherClass {
margin: 0;
}
${Icon.class} {
color: black;
}
`;
import { styled } from "solid-styled-components";
const Btn = styled("button")(props => ({
borderRadius: props.size + "px"
}));
<Btn size={20} />;
@returns {String}
Returns the class.
To create a class, you need to call css
with your style rules in a tagged template:
import { css } from "solid-styled-components";
const BtnClass = css`
border-radius: 4px;
`;
const App => <button class={BtnClass}>click</button>
Or an object:
import { css } from "solid-styled-components";
const BtnClass = css({ borderRadius: "4px" })
const App => <button class={BtnClass}>click</button>
import { css } from "solid-styled-components";
// JSX
const CustomButton = props => (
<button
class={css`
border-radius: ${props.size}px;
`}
>
click
</button>
);
@returns {String}
Returns the <style>
tag that is rendered in a target and clears the style sheet. Defaults to <head>
. Used to grab the styles for SSR.
const { extractCss } = require("goober");
// After your app has rendered, just call it:
const styleTag = `<style id="_goober">${extractCss()}</style>`;
// Note: To be able to `hydrate` the styles you should use the proper `id` so `goober` can pick it up and use it as the target from now on
@returns {String}
Add keyframe animations to a style component.
const rotate = keyframes`
100% {
transform:rotate(360deg);
}
`
const LoadingIcon = styled.img`
animation: ${ rotate } 1s linear infinite;
`
For a global style component, you call createGlobalStyles
with your global tagged template.
import { createGlobalStyles } from "solid-styled-components";
const GlobalStyles = () => {
const Styles = createGlobalStyles`
html,
body {
background: light;
}
* {
box-sizing: border-box;
}
`;
return <Styles />;
};
You can set a Theme Provider (remember to use state or signals if you want it to be reactive).
import { styled, ThemeProvider } from "solid-styled-components";
const theme = {
colors: {
primary: "hotpink"
}
};
const SomeText = styled("div")`
color: ${props => props.theme.colors.primary};
`;
render(
() => (
<ThemeProvider theme={theme}>
<SomeText>some text</SomeText>
</ThemeProvider>
),
document.getElementById("app")
);
The library provides a useTheme
hook if you wish to use it elsewhere like in you css
functions.
Use setup
to set up a custom prefixer.
setup(
prefixer: null | ((key: string, value: any) => string)
shouldForwardProp?: null | ((props: string[]) => string[])
)
To prevent unwanted props attaching to the generated HTML, you can use the shouldForwardProp
helper:
import { shouldForwardProp } from "solid-styled-components";
setup(null, shouldForwardProp(prop => {
return prop !== "foo";
}));
This will prevent the foo
prop from appearing as an HTML attribute.
Note: Be careful not to filter out props such as children
or onClick
this way; these are already handled internally.
Before you can effectively start to use the ThemeProvider in TypeScript you will have to do a little bit of configuration.
TypeScript definitions for solid-styled-components can be extended by using declaration merging.
The first step is to create a declarations file. For example, let's name it styled.d.ts
:
// import original module declarations
import "solid-styled-components";
// and extend them!
declare module "solid-styled-components" {
export interface DefaultTheme {
colors: {
primary: string;
};
}
}
DefaultTheme
is being used as an interface of props.theme
out of the box. By default the interface DefaultTheme
is empty so that's why we need to extend it.
Now we can create a theme just by using the DefaultTheme declared at the step above.
import { styled, ThemeProvider, DefaultTheme } from "solid-styled-components";
const theme: DefaultTheme = {
colors: {
primary: "hotpink"
}
};
const SomeText = styled("div")`
color: ${props => props.theme.colors.primary};
`;
render(
() => (
<ThemeProvider theme={theme}>
<SomeText>some text</SomeText>
</ThemeProvider>
),
document.getElementById("app")
);