Licence
MIT
Version
1.3.0
Deps
1
Size
87 kB
Vulns
0
Weekly
0
powerstyl
A way to style elements in vanilla JavaScript.
Installation
npm install powerstyl
Getting Started
import { styled, updateStyle } from "powerstyl";
const Button = styled("button", { type: "global" })`
font-size: 1em;
padding: 0.2em 0.5em;
border-radius: 0.2em;
color: black;
border: none;
cursor: pointer;
background-color: ${(e) => (e.count % 2 ? "rgb(10 240 220)" : "rgb(150, 240, 20)")};
&:hover {
background-color: ${(e) => (e.count % 2 ? "rgb(10 230 200)" : "rgb(150, 230, 0)")};
}
`;
const ButtonLg = styled(Button, { type: "global" })`
font-size: 1.2em;
`;
const button = ButtonLg();
button.count = 0;
button.append("Click me");
button.addEventListener("click", () => {
button.count++;
updateStyle(button);
});
document.body.appendChild(button);
Result
First updated:
<head>
<style>
[data-ps="4606c706"] {
font-size: 1em;
padding: 0.2em 0.5em;
border-radius: 0.2em;
color: black;
border: none;
cursor: pointer;
background-color: rgb(150, 240, 20);
font-size: 1.2em;
}
[data-ps="4606c706"]:hover {
background-color: rgb(150, 230, 0);
}
</style>
</head>
<body>
<button data-ps="4606c706">Click me</button>
</body>
After clicked:
<head>
<style>
[data-ps="4606c706"] {
font-size: 1em;
padding: 0.2em 0.5em;
border-radius: 0.2em;
color: black;
border: none;
cursor: pointer;
background-color: rgb(150, 240, 20);
font-size: 1.2em;
}
[data-ps="4606c706"]:hover {
background-color: rgb(150, 230, 0);
}
[data-ps="f99b399b"] {
font-size: 1em;
padding: 0.2em 0.5em;
border-radius: 0.2em;
color: black;
border: none;
cursor: pointer;
background-color: rgb(10 240 220);
font-size: 1.2em;
}
[data-ps="f99b399b"]:hover {
background-color: rgb(10 230 200);
}
</style>
</head>
<body>
<button data-ps="f99b399b">Click me</button>
</body>
API Reference
styled
Create a function to create styled elements.
styled(tag, { type, manager });
Parameters
tag: An element tag name, custom element constructor, or function returns a element instance.optionstype: Style application type ('global','scoped','adopted'or'inline').manager: Style manager, used to update DOM and application styles.
updateStyle
Updates the style of an element created by styled.
If there are no functions in the template literals, calling updateStyle is a no-op.
It should be placed where the state is updated.
updateStyle(element);
mixin
Combines multiple style definitions into a single component, enabling composable styles.
It is useful for creating reusable atomic styles.
mixin(styler0, ...stylers);
Parameters
styler0: The first style definition.stylers: The rest of the style definitions.
Parameters
element: The element whose style needs to be updated which created bystyledfunction
Style Application
Global
Styles applied globally.
const MyComponent = styled("div", {
type: "global",
})`
/* root styles */
&:hover {
/* hover styles */
}
`;
MyComponent();
<head>
<style>
[data-ps="11201b20"] {
/* root styles */
}
[data-ps="11201b20"]:hover {
/* hover styles */
}
</style>
</head>
<body>
<div data-ps="11201b20"></div>
</body>
Scoped
Styles applied within a scope.
const MyComponent = styled("div", { type: "scoped" })`
/* root styles */
&:hover {
/* hover styles */
}
`;
MyComponent();
<div>
<style>
@scope {
:scope {
/* root styles */
}
:scope:hover {
/* hover styles */
}
}
</style>
</div>
Adopted
Styles applied within a opened shadow root.
const MyComponent = styled("element-with-shadow-root", { type: "adopted" })`
/* host styles */
&:hover {
/* hover styles */
}
`;
MyComponent();
:host {
/* host styles */
}
:host(:hover) {
/* hover styles */
}
Inline
Styles applied directly as inline styles to the element.
const MyComponent = styled("div", { type: "inline" })`
/* inline styles */
`;
MyComponent();
<div style="/* inline styles */"></div>
Style Mixins
import { styled, mixin } from "powerstyl";
const Radius = styled()`
border-radius: 0.2em;
`;
const Outline = styled()`
outline: 1.5px solid black;
border: none;
`;
const PrimaryButton = styled(
mixin(
styled("button")`
font-size: 1.2em;
cursor: pointer;
`,
Radius,
Outline,
),
)`
background-color: rgb(150, 240, 20);
`;
const button = PrimaryButton();
font-size: 1.2em;
cursor: pointer;
border-radius: 0.2em;
outline: 1.5px solid black;
border: none;
background-color: rgb(150, 240, 20);