From 091874ee59758967e93086c90d2b69201f7e7470 Mon Sep 17 00:00:00 2001 From: Kalinin Danila Date: Sun, 21 Jun 2026 00:20:09 +0300 Subject: [PATCH 1/2] feat(classname): add BlockClassNameFormatter and ElementClassNameFormatter types --- packages/classname/classname.ts | 30 +++++++++++++++++++++++------- 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/packages/classname/classname.ts b/packages/classname/classname.ts index 7c460b03..4fd33f9e 100644 --- a/packages/classname/classname.ts +++ b/packages/classname/classname.ts @@ -11,18 +11,30 @@ export type ClassNameList = string | Array export type NoStrictEntityMods = Record /** - * 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 } /** @@ -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, @@ -126,6 +140,8 @@ export function withNaming(preset: Preset): ClassNameInitilizer { return stringify(b, e, elemOrMods, elemModsOrBlockMix as ClassNameList) } } + + return cnGenerator } /** From f92d8faa716e0a30ffc48bdf5c9e8ef3c3f7db13 Mon Sep 17 00:00:00 2001 From: Kalinin Danila Date: Sun, 21 Jun 2026 00:36:13 +0300 Subject: [PATCH 2/2] fix: change imported type --- packages/core/core.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/core/core.ts b/packages/core/core.ts index be0b4ece..4cf40e3e 100644 --- a/packages/core/core.ts +++ b/packages/core/core.ts @@ -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) { @@ -61,7 +61,7 @@ export function withBemMod( mod: NoStrictEntityMods, enhance?: Enhance | withBemModOptions, ) { - let entity: ClassNameFormatter + let entity: BlockClassNameFormatter let entityClassName: string let modNames: string[]