Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 23 additions & 7 deletions packages/classname/classname.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,18 +11,30 @@ export type ClassNameList = string | Array<string | undefined>
export type NoStrictEntityMods = Record<string, string | boolean | number | undefined>

/**
* BEM Entity className initializer.
* BEM Entity className formatter for block-bound formatters (created with one argument).
*/
export type ClassNameInitilizer = (blockName: string, elemName?: string) => ClassNameFormatter
export interface BlockClassNameFormatter {
(): string
(mods?: NoStrictEntityMods | null, mix?: ClassNameList): string
(elemName: string, elemMix?: ClassNameList): string
(elemName: string, elemMods?: NoStrictEntityMods | null, elemMix?: ClassNameList): string
}

/**
* BEM Entity className formatter.
* BEM Entity className formatter for element-bound formatters (created with two arguments).
* Passing an element name is not allowed since the element is already fixed.
*/
export interface ClassNameFormatter {
export interface ElementClassNameFormatter {
(): string
(mods?: NoStrictEntityMods | null, mix?: ClassNameList): string
(elemName: string, elemMix?: ClassNameList): string
(elemName: string, elemMods?: NoStrictEntityMods | null, elemMix?: ClassNameList): string
}

/**
* BEM Entity className initializer.
*/
export interface ClassNameInitilizer {
(blockName: string): BlockClassNameFormatter
(blockName: string, elemName: string): ElementClassNameFormatter
}

/**
Expand Down Expand Up @@ -111,7 +123,9 @@ export function withNaming(preset: Preset): ClassNameInitilizer {
return className
}

return function cnGenerator(b: string, e?: string): ClassNameFormatter {
function cnGenerator(b: string): BlockClassNameFormatter
function cnGenerator(b: string, e: string): ElementClassNameFormatter
function cnGenerator(b: string, e?: string): BlockClassNameFormatter | ElementClassNameFormatter {
return (
elemOrMods?: NoStrictEntityMods | string | null,
elemModsOrBlockMix?: NoStrictEntityMods | ClassNameList | null,
Expand All @@ -126,6 +140,8 @@ export function withNaming(preset: Preset): ClassNameInitilizer {
return stringify(b, e, elemOrMods, elemModsOrBlockMix as ClassNameList)
}
}

return cnGenerator
}

/**
Expand Down
4 changes: 2 additions & 2 deletions packages/core/core.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { ComponentType, FC, JSX } from 'react'
import { jsx } from 'react/jsx-runtime'
import { cn, NoStrictEntityMods, ClassNameFormatter } from '@bem-react/classname'
import { cn, NoStrictEntityMods, BlockClassNameFormatter } from '@bem-react/classname'
import { classnames } from '@bem-react/classnames'

function getDisplayName(Component: ComponentType | string) {
Expand Down Expand Up @@ -61,7 +61,7 @@ export function withBemMod<T, U extends IClassNameProps = {}>(
mod: NoStrictEntityMods,
enhance?: Enhance<T & U> | withBemModOptions,
) {
let entity: ClassNameFormatter
let entity: BlockClassNameFormatter
let entityClassName: string
let modNames: string[]

Expand Down