Security News
pnpm 10.0.0 Blocks Lifecycle Scripts by Default
pnpm 10 blocks lifecycle scripts by default to improve security, addressing supply chain attack risks but sparking debate over compatibility and workflow changes.
@henit/bem-class
Advanced tools
Build HTML class names with BEM syntax without repeating yourself
A small, simple tool (without dependencies) for writing class names in BEM-syntax for DOM elements, with a simplified syntax that avoids large amounts of repetition.
npm install --save @henit/bem-class
The examples use React, but bem-class can be used with any library or framework
function Button({ className, icon, variant, size, disabled, label }) {
return (
<button className={`button button--variant-${variant} button--size-${size} ${disabled ? 'button--disabled' : ''} ${className}`}>
<i className={`button__icon button__icon--large iconlib-${type}`} />
<span className="button__label">
{label}
</span>
</button>
)
}
import classLib from 'class-library';
function Button({ className, icon, variant, size, disabled, label }) {
const classNames = classLib(
'button',
`button--variant-${variant}`,
`button--size-${size}`,
{ 'button--disabled': disabled },
className,
};
return (
<button className={classNames}>
<i className={classLib('button__icon', 'button__icon--' + size, 'iconlib-' + type} />
<span className="button__label">
{label}
</span>
</button>
)
}
import bemClass from '@henit/bem-class';
const cn = bemClass('button');
function Button({ className, icon, variant, size, disabled, label }) {
return (
<button className={cn({ variant, size, disabled }, [className])>
<i className={cn('icon', { large }, [`iconlib-${type}`]} />
<span className={cn('label')}>
{label}
</span>
</button>
)
}
The default export from bem-class is a factory function that takes the block name as argument, and returns a classname-creator function for that block:
import bemClass from '@henit/bem-class';
const cn = bemClass('button');
The block function returns a class name string ready for use in the DOM.
Three types of arguments can be sent to the created block function (i.e. cn
):
When called without an element (string argument), the block function return the block (with any given modifiers/mixes).
cn() // 'button'
cn({ color: 'blue', outlined: true, disabled: false }) // 'button button--color-blue button--outlined'
cn(['save-button']) // 'button save-button'
cn({ color: 'blue' }, ['form-control', 'save-button']) // 'button button--color-blue form-control save-button'
cn('label') // 'button__label'
cn('label', { color: 'blue', outlined: true, disabled: false }) // 'button__label button__label--color-blue button__label--outlined'
cn('label', ['form-label']) // 'button__label form-label'
cn('label', { variant: 'large' }, ['form-label']) // 'button__label button__label--variant-large form-label'
And that's it!
FAQs
Build HTML class names with BEM syntax without repeating yourself
The npm package @henit/bem-class receives a total of 77 weekly downloads. As such, @henit/bem-class popularity was classified as not popular.
We found that @henit/bem-class demonstrated a not healthy version release cadence and project activity because the last version was released a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Security News
pnpm 10 blocks lifecycle scripts by default to improve security, addressing supply chain attack risks but sparking debate over compatibility and workflow changes.
Product
Socket now supports uv.lock files to ensure consistent, secure dependency resolution for Python projects and enhance supply chain security.
Research
Security News
Socket researchers have discovered multiple malicious npm packages targeting Solana private keys, abusing Gmail to exfiltrate the data and drain Solana wallets.