Skip to content

Commit 2915040

Browse files
committed
refactor: separate the dynamic presets code into dynamic.ts
1 parent 1798782 commit 2915040

2 files changed

Lines changed: 74 additions & 72 deletions

File tree

src/dynamic.ts

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
export type CSSProperties = Record<string, string | number>;
2+
3+
export type DynamicResolverResult =
4+
| string
5+
| { className?: string; style?: CSSProperties };
6+
7+
export type DynamicResolver<T = any> = (value: T) => DynamicResolverResult;
8+
9+
type PxProp =
10+
| "width"
11+
| "height"
12+
| "minWidth"
13+
| "maxWidth"
14+
| "minHeight"
15+
| "maxHeight"
16+
| "top"
17+
| "right"
18+
| "bottom"
19+
| "left";
20+
21+
type NumProp = "zIndex" | "flexGrow" | "flexShrink" | "order";
22+
23+
type VarUnit = "px" | "%" | "deg" | "ms";
24+
25+
function px(prop: PxProp): DynamicResolver<number | string> {
26+
return (value: number | string): DynamicResolverResult => {
27+
if (typeof value === "number") {
28+
return { style: { [prop]: `${value}px` } };
29+
}
30+
return value;
31+
};
32+
}
33+
34+
function num(prop: NumProp): DynamicResolver<number | string> {
35+
return (value: number | string): DynamicResolverResult => {
36+
if (typeof value === "number") {
37+
return { style: { [prop]: value } };
38+
}
39+
return value;
40+
};
41+
}
42+
43+
function opacity(): DynamicResolver<number | string> {
44+
return (value: number | string): DynamicResolverResult => {
45+
if (typeof value === "number") {
46+
return { style: { opacity: value } };
47+
}
48+
return value;
49+
};
50+
}
51+
52+
function cssVar(
53+
name: `--${string}`,
54+
options?: { unit?: VarUnit },
55+
): DynamicResolver<number | string> {
56+
return (value: number | string): DynamicResolverResult => {
57+
if (typeof value === "number") {
58+
if (options?.unit) {
59+
return { style: { [name]: `${value}${options.unit}` } };
60+
}
61+
return { style: { [name]: String(value) } };
62+
}
63+
return { style: { [name]: value } };
64+
};
65+
}
66+
67+
export const dynamic = {
68+
px,
69+
num,
70+
opacity,
71+
var: cssVar,
72+
};

src/index.ts

Lines changed: 2 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -1,78 +1,8 @@
11
import { clsx, type ClassValue } from "clsx";
22
import { twMerge } from "tailwind-merge";
3+
import type { CSSProperties, DynamicResolver } from "./dynamic";
34

4-
type CSSProperties = Record<string, string | number>;
5-
6-
type DynamicResolverResult =
7-
| string
8-
| { className?: string; style?: CSSProperties };
9-
10-
type DynamicResolver<T = any> = (value: T) => DynamicResolverResult;
11-
12-
type PxProp =
13-
| "width"
14-
| "height"
15-
| "minWidth"
16-
| "maxWidth"
17-
| "minHeight"
18-
| "maxHeight"
19-
| "top"
20-
| "right"
21-
| "bottom"
22-
| "left";
23-
24-
type NumProp = "zIndex" | "flexGrow" | "flexShrink" | "order";
25-
26-
type VarUnit = "px" | "%" | "deg" | "ms";
27-
28-
function px(prop: PxProp): DynamicResolver<number | string> {
29-
return (value: number | string): DynamicResolverResult => {
30-
if (typeof value === "number") {
31-
return { style: { [prop]: `${value}px` } };
32-
}
33-
return value;
34-
};
35-
}
36-
37-
function num(prop: NumProp): DynamicResolver<number | string> {
38-
return (value: number | string): DynamicResolverResult => {
39-
if (typeof value === "number") {
40-
return { style: { [prop]: value } };
41-
}
42-
return value;
43-
};
44-
}
45-
46-
function opacity(): DynamicResolver<number | string> {
47-
return (value: number | string): DynamicResolverResult => {
48-
if (typeof value === "number") {
49-
return { style: { opacity: value } };
50-
}
51-
return value;
52-
};
53-
}
54-
55-
function cssVar(
56-
name: `--${string}`,
57-
options?: { unit?: VarUnit },
58-
): DynamicResolver<number | string> {
59-
return (value: number | string): DynamicResolverResult => {
60-
if (typeof value === "number") {
61-
if (options?.unit) {
62-
return { style: { [name]: `${value}${options.unit}` } };
63-
}
64-
return { style: { [name]: String(value) } };
65-
}
66-
return { style: { [name]: value } };
67-
};
68-
}
69-
70-
export const dynamic = {
71-
px,
72-
num,
73-
opacity,
74-
var: cssVar,
75-
};
5+
export { dynamic, type CSSProperties, type DynamicResolver } from "./dynamic";
766

777
type SlotAwareObject = {
788
root?: ClassValue;

0 commit comments

Comments
 (0)