Skip to content

Commit cbced3f

Browse files
committed
feat: add a className for each element
1 parent 23384a5 commit cbced3f

File tree

3 files changed

+84
-36
lines changed

3 files changed

+84
-36
lines changed

playground/src/Resume.tsx

Lines changed: 68 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -6,58 +6,89 @@ import remarkGfm from 'remark-gfm'
66
import clsx from 'clsx'
77
import rehypeRaw from 'rehype-raw'
88
import readme from '../../README.md?raw'
9-
import { card, container, description, header, meta } from './plugins'
9+
import { card, className, container, description, header, meta } from './plugins'
1010

1111
function Resume() {
1212
return (
1313
<ReactMarkdown
1414
components={{
15-
'container': ({ ...props }) => <div className="font-sans text-base bg-gray-100" {...props} />,
16-
'content': ({ ...props }) => <div className="bg-white md:w-768px xs:w-full mx-auto p-y-5 sm:p-x-10 p-x-4" {...props} />,
17-
'h1': ({ ...props }) => <h1 className="text-2xl font-semibold" {...props}></h1>,
18-
'h2': ({ ...props }) => {
19-
return <div className="text-xl font-semibold p-y-1 b-b">
20-
<h2 {...props}></h2>
21-
</div>
15+
'container': ({ className, ...props }) => <div className={
16+
clsx(
17+
'font-sans text-base bg-gray-100',
18+
className,
19+
)
20+
} {...props} />,
21+
'content': ({ className, ...props }) => <div className={
22+
clsx(
23+
'bg-white md:w-768px xs:w-full mx-auto p-y-5 sm:p-x-10 p-x-4',
24+
className,
25+
)
26+
} {...props} />,
27+
'h1': ({ className, ...props }) => <h1 className={
28+
clsx(
29+
'text-2xl font-semibold',
30+
className,
31+
)
32+
} {...props}></h1>,
33+
'h2': ({ className, ...props }) => {
34+
return <h2 className={clsx('text-xl font-semibold p-y-1 b-b', className)} {...props}></h2>
2235
},
23-
'h3': ({ ...props }) => <h3 className="p-y-1 text-lg font-semibold" {...props}></h3>,
24-
'ul': ({ ...props }) => <ul className="text-0.95rem p-l-5 list-disc p-y-1" {...props}></ul>,
25-
'ol': ({ ...props }) => <ol className="text-0.95rem p-l-5 list-decimal p-y-1" {...props}></ol>,
26-
'a': ({ ...props }) => <a className="text-blue underline" {...props}></a>,
27-
'p': ({ ...props }) => <p className="font-medium p-y-1" {...props}></p>,
28-
'strong': ({ ...props }) => <strong className="font-semibold" {...props}></strong>,
29-
'card': ({ ...props }) => {
30-
return <div className="p-y-0.5 grid grid-cols-2 gap-y-0.5" {...props} />
36+
'h3': ({ className, ...props }) => <h3 className={
37+
clsx('p-y-1 text-lg font-semibold', className)
38+
} {...props}></h3>,
39+
'ul': ({ className, ...props }) => <ul className={
40+
clsx('text-0.95rem p-l-5 list-disc p-y-1', className)
41+
} {...props}></ul>,
42+
'ol': ({ className, ...props }) => <ol className={
43+
clsx('text-0.95rem p-l-5 list-decimal p-y-1', className)
44+
} {...props}></ol>,
45+
'a': ({ className, ...props }) => <a className={
46+
clsx('text-blue underline', className)
47+
} {...props}></a>,
48+
'p': ({ className, ...props }) => <p className={
49+
clsx('font-medium p-y-1', className)
50+
} {...props}></p>,
51+
'strong': ({ className, ...props }) => <strong className={
52+
clsx('font-semibold', className)
53+
} {...props} />,
54+
'card': ({ className, ...props }) => {
55+
return <div className={
56+
clsx('p-y-0.5 grid grid-cols-2 gap-y-0.5', className)
57+
} {...props} />
3158
},
32-
'card-item': ({ index, ...props }) => {
33-
return <div {...props} className={clsx('text-sm', { 'justify-self-end': index % 2 === 1 })} />
59+
'card-item': ({ className, index, ...props }) => {
60+
return <div {...props} className={clsx('text-sm', { 'justify-self-end': index % 2 === 1 }, className)} />
3461
},
35-
'card-item-label': ({ ...props }) => {
36-
return <span {...props} className="text-sm font-medium" />
62+
'card-item-label': ({ className, ...props }) => {
63+
return <span {...props} className={
64+
clsx('text-sm font-medium', className)
65+
} />
3766
},
38-
'card-item-value': ({ ...props }) => {
39-
return <span className="text-blue-gray-600" {...props} />
67+
'card-item-value': ({ className, ...props }) => {
68+
return <span className={
69+
clsx('text-blue-gray-600', className)
70+
} {...props} />
4071
},
41-
'description': ({ ...props }) => {
42-
return <p {...props} className="text-sm indent" />
72+
'description': ({ className, ...props }) => {
73+
return <p {...props} className={clsx('text-sm indent', className)} />
4374
},
44-
'header': ({ node: _, ...props }) => {
45-
return <header {...props} className="flex flex-col items-center p-4" />
75+
'header': ({ className, ...props }) => {
76+
return <header {...props} className={clsx('flex flex-col items-center p-4', className)} />
4677
},
47-
'header-content': ({ node: _, ...props }) => {
48-
return <div {...props} className="flex flex-col items-center" />
78+
'header-content': ({ className, ...props }) => {
79+
return <div {...props} className={clsx('flex flex-col items-center', className)} />
4980
},
50-
'header-name': ({ node: _, ...props }) => {
51-
return <h1 {...props} className="font-bold text-2xl" />
81+
'header-name': ({ className, ...props }) => {
82+
return <h1 {...props} className={clsx('font-bold text-2xl', className)} />
5283
},
53-
'header-avatar': ({ node: _, ...props }) => {
54-
return <img {...props} className="w-40 font-bold text-2xl" />
84+
'header-avatar': ({ className, ...props }) => {
85+
return <img {...props} className={clsx('w-40 font-bold text-2xl', className)} />
5586
},
56-
'header-row': ({ ...props }) => {
57-
return <ul {...props} className="list-none flex flex-wrap" />
87+
'header-row': ({ className, ...props }) => {
88+
return <ul {...props} className={clsx('list-none flex flex-wrap', className)} />
5889
},
59-
'header-col': ({ ...props }) => {
60-
return <li className="sibling:before:content-| sibling:before:p-x-2 sibling:before:text-gray-400" {...props} />
90+
'header-col': ({ className, ...props }) => {
91+
return <li className={clsx('sibling:before:content-| sibling:before:p-x-2 sibling:before:text-gray-400', className)} {...props} />
6192
},
6293
}}
6394
remarkPlugins={[
@@ -71,6 +102,7 @@ function Resume() {
71102
header,
72103
description,
73104
container,
105+
className,
74106
]}
75107
remarkRehypeOptions={{
76108
allowDangerousHtml: true,

playground/src/plugins/className.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import type { Plugin } from 'unified'
2+
import { visit } from 'unist-util-visit'
3+
import type { Element } from 'hast'
4+
import clsx from 'clsx'
5+
6+
export const className: Plugin<[], Element> = function () {
7+
return (root) => {
8+
visit(root, { type: 'element' }, (element) => {
9+
const className = (element as Element).properties?.className;
10+
(element as Element).properties = Object.assign({}, (element as Element).properties, {
11+
className: clsx(`r-${(element as Element).tagName}`, className),
12+
})
13+
})
14+
}
15+
}

playground/src/plugins/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,4 @@ export * from './card'
33
export * from './description'
44
export * from './header'
55
export * from './container'
6+
export * from './className'

0 commit comments

Comments
 (0)