@@ -4,17 +4,61 @@ import type {
44 Strip ,
55 PartDeep ,
66 Extends ,
7- // PartDeep
7+ Ever0
88} from "./ts-swiss.types"
99import type { ClassNamed } from "./main.types"
1010import type { ReactClassNaming } from "."
1111
1212export type ClassBeming <
1313 ClassNames extends CssModule ,
1414> =
15+ /**
16+ * Makes `string`-className from conditioned BEM query based on supplied CSS classes.
17+ * Destructed to singleton `{className: string}`, stringifyable object
18+ * @returns
19+ * ```typescript
20+ * // ""
21+ * {block: false}
22+ * {block: {el: false}}
23+ * // "block"
24+ * {block: true}
25+ * {block: {$: boolean | {} | {[mod]: false} }}
26+ * // "block__el"
27+ * {block: {el: true | {} | {[mod]: false} }}
28+ * // "block block--mod"
29+ * {block: "mod"}
30+ * {block: {$: "mod" | {mod: true} }}
31+ * // "block__el block__el--mod"
32+ * {block: {el: "mod" | {mod: true} }}
33+ * // "block block--mod--val"
34+ * {block: {$: {mod: "val"}}}
35+ * // "block__el block__el--mod--val"
36+ * {block: {el: {mod: "val"}}}
37+ * ```
38+ * @example
39+ * ```typescript
40+ * bem(true) // `${props.className}`
41+ * bem({button: true}) // "button"
42+ * bem({button: {icon: true}}) // "button__icon"
43+ * bem({button: "disabled"}) // "button button--disabled"
44+ * bem({button: {icon: {size: "big"}}}) // "button__icon button__icon--size--big"
45+ * bem(true, {
46+ * form: {item: true},
47+ * button: {
48+ * $: {status: "danger"},
49+ * icon: "hover"
50+ * }
51+ * }) // `${props.className} form__item button button--status--danger button__icon button__icon--hover`
52+ * ```
53+ * @example
54+ * ```typescript
55+ * <div {...bem(...)} />;
56+ * <div data-block={`${bem(...)}` } />
57+ * ```
58+ */
1559<
1660 Q1 extends undefined | boolean | BemQuery < keyof ClassNames > ,
17- // Q2 extends BemQuery<keyof ClassNames>,
61+ // Q2 extends BemQuery<keyof ClassNames> will be needed for #31
1862> (
1963 arg0 ?: Q1 extends undefined | boolean ? Q1 : Subest < BemQuery < keyof ClassNames > , Q1 > ,
2064 arg1 ?: Q1 extends undefined | boolean ? BemQuery < keyof ClassNames > : never
@@ -31,7 +75,7 @@ export type BemQuery<
3175 bModKey extends string = "blockModKey" extends keyof ReactClassNaming . BemOptions
3276 ? ReactClassNaming . BemOptions [ "blockModKey" ]
3377 : ReactClassNaming . BemOptions [ "$default" ] [ "blockModKey" ] ,
34- > = string extends classes ? BemAbsraction : PartDeep < {
78+ > = string extends classes ? BemInGeneral : PartDeep < {
3579 [ b in Strip < Strip < classes , delM > , delE > ] : boolean
3680 | Exclude < MVs < classes , b , bModKey > , `${string } ${delM } ${string } `>
3781 | (
@@ -41,11 +85,15 @@ export type BemQuery<
4185 | Exclude < MVs < classes , b , e > , `${string } ${delM } ${string } `>
4286 | (
4387 { [ m in Strip < MVs < classes , b , e > , delM > ] :
44- classes extends `${b } ${
45- e extends bModKey ? "" : `${delE } ${e } `
46- } ${delM } ${m } ${delM } ${infer V } `
47- ? false | V
48- : boolean
88+ false | (
89+ Ever0 <
90+ classes extends `${b } ${
91+ e extends bModKey ? "" : `${delE } ${e } `
92+ } ${delM } ${m } ${delM } ${infer V } `
93+ ? V : never ,
94+ true
95+ >
96+ )
4997 }
5098 )
5199 }
@@ -88,7 +136,7 @@ type MVs<
88136 e extends bModKey ? "" : `${delE } ${e } `
89137} ${delM } ${infer MV } ` ? MV : never
90138
91- export type BemAbsraction = {
139+ export type BemInGeneral = {
92140 [ block : string ] : undefined | boolean | string | {
93141 [ el : string ] : undefined | boolean | string | {
94142 [ mod : string ] : undefined | boolean | string
0 commit comments