Skip to content

Commit 23f2f37

Browse files
author
Andrii Kirmas
committed
Update readme with versus
1 parent a48fc82 commit 23f2f37

File tree

5 files changed

+82
-11
lines changed

5 files changed

+82
-11
lines changed

README.md

Lines changed: 49 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# react-classnaming
22

3-
Easy applied function to use with [CSS modules](https://github.com/css-modules/css-modules) and do not get lost in CSS classes
3+
Easy applied function to use optionally with [CSS modules](https://github.com/css-modules/css-modules) and do not get lost in CSS classes
44

55
![keywords](https://img.shields.io/github/package-json/keywords/askirmas/react-classnaming) ![test@ci](https://github.com/askirmas/react-classnaming/workflows/CI/badge.svg?branch=main) ![coverage](https://img.shields.io/codecov/c/github/askirmas/react-classnaming) ![version](https://img.shields.io/npm/v/react-classnaming) ![license](https://img.shields.io/npm/l/react-classnaming)
66

@@ -48,3 +48,51 @@ import classNames from "./modules.scss"
4848

4949
ReactDOM.render( <Root classNames={names(classNames))}/> )
5050
```
51+
52+
## vs [classnames](https://github.com/JedWatson/classnames#readme)
53+
54+
See [src/versus-classnames.test.ts](./src/versus-classnames.test.ts)
55+
56+
### No css-modules, just simulation
57+
58+
```tsx
59+
import classnames from "classnames"
60+
<div className={classnames("class1", "class2")} />
61+
<div id={classnames("class1", "class2")} />
62+
63+
/** VERSUS */
64+
65+
import css from "./some.css"
66+
import {classNamesCheck, classNamingBasic} from "react-classnaming"
67+
import type {ClassNames} from "react-classnaming"
68+
69+
const { class1,
70+
//@expect-ts-error
71+
whatever
72+
} = classNamesCheck<"class1"|"class2">(css)
73+
74+
const props: ClassNames<"class2"> = {"classNames": css}
75+
76+
const {class2} = props.classNames
77+
78+
<div {...classNamingBasic({class1, class2})} />
79+
<div id={classNamingBasic<string>({class1, class2})} />
80+
```
81+
82+
### CSS module
83+
84+
```tsx
85+
import module_css from "./some.module.css" // {"class1": "hash1", "class2": "hash2"}
86+
87+
import classnames_bind from "classnames/bind"
88+
const cx = classnames_bind.bind(module_css)
89+
// No error on redundant CSS-class
90+
<div className={cx("class1", "class3")} />
91+
92+
/** VERSUS */
93+
94+
import {classNamingCtx} from "react-classnaming"
95+
const classNaming = classNamingCtx({classNames: module_css})
96+
//@ts-expect-error Argument of type '"class3"' is not assignable to parameter
97+
<div {...classNaming("class1", "class3")} />
98+
```

__recipes__/cra/package-lock.json

Lines changed: 4 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

global.d.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
declare module "*.css" {
2+
const css: Record<string, string|undefined>
3+
export = css
4+
}

src/some.css

Whitespace-only changes.

src/versus-classnames.test.ts

Lines changed: 25 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,50 @@
1-
import {classNamesCheck, classNamingBasic, classNamingCtx} from "."
1+
/// <reference path="../global.d.ts" />
2+
3+
import css from "./some.css"
4+
import type {ClassNames} from "."
5+
import {
6+
classNamesCheck,
7+
classNamingBasic,
8+
classNamingCtx
9+
} from "."
210

311
import classnames_default from "classnames"
412
import classnames_bind from "classnames/bind"
513

6-
const cssModule = {
14+
const module_css = {
715
"class1": "hash1",
816
"class2": "hash2"
917
}
10-
, importRawCss = {}
11-
1218

1319
it("usage interface", () => {
14-
const {class1} = classNamesCheck(importRawCss)
20+
const { class1,
21+
//@ts-expect-error Property 'class3' does not exist
22+
whatever
23+
} = classNamesCheck<"class1"|"class2">(css)
24+
25+
const props: ClassNames<"class2"> = {"classNames": css}
26+
27+
const {classNames: {class2}} = props
1528

1629
expect(
17-
classNamingBasic({class1})
30+
classNamingBasic({class1, class2})
1831
).toStrictEqual({
1932
//@ts-expect-error `classnames` has no possibility for type hints
20-
className: classnames_default<"class2">("class1")
33+
className: classnames_default<"whatever">("class1", "class2")
2134
})
35+
36+
expect(class2 ?? whatever).toBe(undefined)
2237
})
2338

2439
it("css module", () => expect({
25-
className: classnames_bind.bind(cssModule)(
40+
className: classnames_bind.bind(module_css)(
2641
// No error on redundant CSS-class
2742
"class1", "class3"
2843
)
2944
}).toStrictEqual(
30-
classNamingCtx({classNames: cssModule})(
45+
classNamingCtx({classNames: module_css})(
3146
"class1",
32-
//@ts-expect-error
47+
//@ts-expect-error Argument of type '"class3"' is not assignable to parameter
3348
"class3"
3449
)
3550
))

0 commit comments

Comments
 (0)