@mgcrea/react-native-tailwind 0.6.0 → 0.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +33 -10
- package/dist/babel/index.cjs +336 -110
- package/dist/components/Pressable.d.ts +2 -0
- package/dist/components/TextInput.d.ts +2 -0
- package/dist/config/palettes.d.ts +302 -0
- package/dist/config/palettes.js +1 -0
- package/dist/parser/colors.js +1 -1
- package/dist/parser/colors.test.js +1 -1
- package/dist/parser/layout.js +1 -1
- package/dist/parser/layout.test.js +1 -1
- package/dist/parser/typography.js +1 -1
- package/dist/parser/typography.test.js +1 -1
- package/package.json +1 -1
- package/src/components/Pressable.tsx +1 -0
- package/src/components/TextInput.tsx +1 -0
- package/src/config/palettes.ts +304 -0
- package/src/parser/colors.test.ts +47 -31
- package/src/parser/colors.ts +20 -111
- package/src/parser/layout.test.ts +35 -0
- package/src/parser/layout.ts +26 -0
- package/src/parser/typography.test.ts +10 -0
- package/src/parser/typography.ts +8 -0
package/src/parser/colors.ts
CHANGED
|
@@ -2,123 +2,32 @@
|
|
|
2
2
|
* Color utilities (background, text, border colors)
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
|
+
import { TAILWIND_PALETTES } from "../config/palettes";
|
|
5
6
|
import type { StyleObject } from "../types";
|
|
6
7
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
"gray-300": "#D1D5DB",
|
|
14
|
-
"gray-400": "#9CA3AF",
|
|
15
|
-
"gray-500": "#6B7280",
|
|
16
|
-
"gray-600": "#4B5563",
|
|
17
|
-
"gray-700": "#374151",
|
|
18
|
-
"gray-800": "#1F2937",
|
|
19
|
-
"gray-900": "#111827",
|
|
20
|
-
|
|
21
|
-
// Red
|
|
22
|
-
"red-50": "#FEF2F2",
|
|
23
|
-
"red-100": "#FEE2E2",
|
|
24
|
-
"red-200": "#FECACA",
|
|
25
|
-
"red-300": "#FCA5A5",
|
|
26
|
-
"red-400": "#F87171",
|
|
27
|
-
"red-500": "#EF4444",
|
|
28
|
-
"red-600": "#DC2626",
|
|
29
|
-
"red-700": "#B91C1C",
|
|
30
|
-
"red-800": "#991B1B",
|
|
31
|
-
"red-900": "#7F1D1D",
|
|
32
|
-
|
|
33
|
-
// Blue
|
|
34
|
-
"blue-50": "#EFF6FF",
|
|
35
|
-
"blue-100": "#DBEAFE",
|
|
36
|
-
"blue-200": "#BFDBFE",
|
|
37
|
-
"blue-300": "#93C5FD",
|
|
38
|
-
"blue-400": "#60A5FA",
|
|
39
|
-
"blue-500": "#3B82F6",
|
|
40
|
-
"blue-600": "#2563EB",
|
|
41
|
-
"blue-700": "#1D4ED8",
|
|
42
|
-
"blue-800": "#1E40AF",
|
|
43
|
-
"blue-900": "#1E3A8A",
|
|
44
|
-
|
|
45
|
-
// Green
|
|
46
|
-
"green-50": "#F0FDF4",
|
|
47
|
-
"green-100": "#DCFCE7",
|
|
48
|
-
"green-200": "#BBF7D0",
|
|
49
|
-
"green-300": "#86EFAC",
|
|
50
|
-
"green-400": "#4ADE80",
|
|
51
|
-
"green-500": "#22C55E",
|
|
52
|
-
"green-600": "#16A34A",
|
|
53
|
-
"green-700": "#15803D",
|
|
54
|
-
"green-800": "#166534",
|
|
55
|
-
"green-900": "#14532D",
|
|
56
|
-
|
|
57
|
-
// Yellow
|
|
58
|
-
"yellow-50": "#FEFCE8",
|
|
59
|
-
"yellow-100": "#FEF9C3",
|
|
60
|
-
"yellow-200": "#FEF08A",
|
|
61
|
-
"yellow-300": "#FDE047",
|
|
62
|
-
"yellow-400": "#FACC15",
|
|
63
|
-
"yellow-500": "#EAB308",
|
|
64
|
-
"yellow-600": "#CA8A04",
|
|
65
|
-
"yellow-700": "#A16207",
|
|
66
|
-
"yellow-800": "#854D0E",
|
|
67
|
-
"yellow-900": "#713F12",
|
|
68
|
-
|
|
69
|
-
// Purple
|
|
70
|
-
"purple-50": "#FAF5FF",
|
|
71
|
-
"purple-100": "#F3E8FF",
|
|
72
|
-
"purple-200": "#E9D5FF",
|
|
73
|
-
"purple-300": "#D8B4FE",
|
|
74
|
-
"purple-400": "#C084FC",
|
|
75
|
-
"purple-500": "#A855F7",
|
|
76
|
-
"purple-600": "#9333EA",
|
|
77
|
-
"purple-700": "#7E22CE",
|
|
78
|
-
"purple-800": "#6B21A8",
|
|
79
|
-
"purple-900": "#581C87",
|
|
8
|
+
/**
|
|
9
|
+
* Flatten TAILWIND_PALETTES nested structure into flat color map
|
|
10
|
+
* Converts { red: { "50": "#fff", "100": "#eee" } } to { "red-50": "#fff", "red-100": "#eee" }
|
|
11
|
+
*/
|
|
12
|
+
function flattenColors(): Record<string, string> {
|
|
13
|
+
const flat: Record<string, string> = {};
|
|
80
14
|
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
"pink-400": "#F472B6",
|
|
87
|
-
"pink-500": "#EC4899",
|
|
88
|
-
"pink-600": "#DB2777",
|
|
89
|
-
"pink-700": "#BE185D",
|
|
90
|
-
"pink-800": "#9D174D",
|
|
91
|
-
"pink-900": "#831843",
|
|
15
|
+
for (const [colorName, shades] of Object.entries(TAILWIND_PALETTES)) {
|
|
16
|
+
for (const [shade, hex] of Object.entries(shades)) {
|
|
17
|
+
flat[`${colorName}-${shade}`] = hex;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
92
20
|
|
|
93
|
-
//
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
"orange-300": "#FDBA74",
|
|
98
|
-
"orange-400": "#FB923C",
|
|
99
|
-
"orange-500": "#F97316",
|
|
100
|
-
"orange-600": "#EA580C",
|
|
101
|
-
"orange-700": "#C2410C",
|
|
102
|
-
"orange-800": "#9A3412",
|
|
103
|
-
"orange-900": "#7C2D12",
|
|
21
|
+
// Add basic colors
|
|
22
|
+
flat.white = "#FFFFFF";
|
|
23
|
+
flat.black = "#000000";
|
|
24
|
+
flat.transparent = "transparent";
|
|
104
25
|
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
"indigo-100": "#E0E7FF",
|
|
108
|
-
"indigo-200": "#C7D2FE",
|
|
109
|
-
"indigo-300": "#A5B4FC",
|
|
110
|
-
"indigo-400": "#818CF8",
|
|
111
|
-
"indigo-500": "#6366F1",
|
|
112
|
-
"indigo-600": "#4F46E5",
|
|
113
|
-
"indigo-700": "#4338CA",
|
|
114
|
-
"indigo-800": "#3730A3",
|
|
115
|
-
"indigo-900": "#312E81",
|
|
26
|
+
return flat;
|
|
27
|
+
}
|
|
116
28
|
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
black: "#000000",
|
|
120
|
-
transparent: "transparent",
|
|
121
|
-
};
|
|
29
|
+
// Tailwind color palette (flattened from config)
|
|
30
|
+
export const COLORS: Record<string, string> = flattenColors();
|
|
122
31
|
|
|
123
32
|
/**
|
|
124
33
|
* Apply opacity to hex color by appending alpha channel
|
|
@@ -199,6 +199,41 @@ describe("parseLayout - overflow utilities", () => {
|
|
|
199
199
|
});
|
|
200
200
|
});
|
|
201
201
|
|
|
202
|
+
describe("parseLayout - opacity utilities", () => {
|
|
203
|
+
it("should parse opacity-0 (fully transparent)", () => {
|
|
204
|
+
expect(parseLayout("opacity-0")).toEqual({ opacity: 0 });
|
|
205
|
+
});
|
|
206
|
+
|
|
207
|
+
it("should parse opacity-50 (half transparent)", () => {
|
|
208
|
+
expect(parseLayout("opacity-50")).toEqual({ opacity: 0.5 });
|
|
209
|
+
});
|
|
210
|
+
|
|
211
|
+
it("should parse opacity-100 (fully opaque)", () => {
|
|
212
|
+
expect(parseLayout("opacity-100")).toEqual({ opacity: 1 });
|
|
213
|
+
});
|
|
214
|
+
|
|
215
|
+
it("should parse all opacity values", () => {
|
|
216
|
+
expect(parseLayout("opacity-5")).toEqual({ opacity: 0.05 });
|
|
217
|
+
expect(parseLayout("opacity-10")).toEqual({ opacity: 0.1 });
|
|
218
|
+
expect(parseLayout("opacity-15")).toEqual({ opacity: 0.15 });
|
|
219
|
+
expect(parseLayout("opacity-20")).toEqual({ opacity: 0.2 });
|
|
220
|
+
expect(parseLayout("opacity-25")).toEqual({ opacity: 0.25 });
|
|
221
|
+
expect(parseLayout("opacity-30")).toEqual({ opacity: 0.3 });
|
|
222
|
+
expect(parseLayout("opacity-35")).toEqual({ opacity: 0.35 });
|
|
223
|
+
expect(parseLayout("opacity-40")).toEqual({ opacity: 0.4 });
|
|
224
|
+
expect(parseLayout("opacity-45")).toEqual({ opacity: 0.45 });
|
|
225
|
+
expect(parseLayout("opacity-55")).toEqual({ opacity: 0.55 });
|
|
226
|
+
expect(parseLayout("opacity-60")).toEqual({ opacity: 0.6 });
|
|
227
|
+
expect(parseLayout("opacity-65")).toEqual({ opacity: 0.65 });
|
|
228
|
+
expect(parseLayout("opacity-70")).toEqual({ opacity: 0.7 });
|
|
229
|
+
expect(parseLayout("opacity-75")).toEqual({ opacity: 0.75 });
|
|
230
|
+
expect(parseLayout("opacity-80")).toEqual({ opacity: 0.8 });
|
|
231
|
+
expect(parseLayout("opacity-85")).toEqual({ opacity: 0.85 });
|
|
232
|
+
expect(parseLayout("opacity-90")).toEqual({ opacity: 0.9 });
|
|
233
|
+
expect(parseLayout("opacity-95")).toEqual({ opacity: 0.95 });
|
|
234
|
+
});
|
|
235
|
+
});
|
|
236
|
+
|
|
202
237
|
describe("parseLayout - edge cases", () => {
|
|
203
238
|
it("should return null for invalid classes", () => {
|
|
204
239
|
expect(parseLayout("invalid")).toBeNull();
|
package/src/parser/layout.ts
CHANGED
|
@@ -146,6 +146,31 @@ const OVERFLOW_MAP: Record<string, StyleObject> = {
|
|
|
146
146
|
"overflow-scroll": { overflow: "scroll" },
|
|
147
147
|
};
|
|
148
148
|
|
|
149
|
+
// Opacity utilities
|
|
150
|
+
const OPACITY_MAP: Record<string, StyleObject> = {
|
|
151
|
+
"opacity-0": { opacity: 0 },
|
|
152
|
+
"opacity-5": { opacity: 0.05 },
|
|
153
|
+
"opacity-10": { opacity: 0.1 },
|
|
154
|
+
"opacity-15": { opacity: 0.15 },
|
|
155
|
+
"opacity-20": { opacity: 0.2 },
|
|
156
|
+
"opacity-25": { opacity: 0.25 },
|
|
157
|
+
"opacity-30": { opacity: 0.3 },
|
|
158
|
+
"opacity-35": { opacity: 0.35 },
|
|
159
|
+
"opacity-40": { opacity: 0.4 },
|
|
160
|
+
"opacity-45": { opacity: 0.45 },
|
|
161
|
+
"opacity-50": { opacity: 0.5 },
|
|
162
|
+
"opacity-55": { opacity: 0.55 },
|
|
163
|
+
"opacity-60": { opacity: 0.6 },
|
|
164
|
+
"opacity-65": { opacity: 0.65 },
|
|
165
|
+
"opacity-70": { opacity: 0.7 },
|
|
166
|
+
"opacity-75": { opacity: 0.75 },
|
|
167
|
+
"opacity-80": { opacity: 0.8 },
|
|
168
|
+
"opacity-85": { opacity: 0.85 },
|
|
169
|
+
"opacity-90": { opacity: 0.9 },
|
|
170
|
+
"opacity-95": { opacity: 0.95 },
|
|
171
|
+
"opacity-100": { opacity: 1 },
|
|
172
|
+
};
|
|
173
|
+
|
|
149
174
|
// Z-index scale
|
|
150
175
|
export const Z_INDEX_SCALE: Record<string, number> = {
|
|
151
176
|
0: 0,
|
|
@@ -343,6 +368,7 @@ export function parseLayout(cls: string): StyleObject | null {
|
|
|
343
368
|
ALIGN_CONTENT_MAP[cls] ??
|
|
344
369
|
POSITION_MAP[cls] ??
|
|
345
370
|
OVERFLOW_MAP[cls] ??
|
|
371
|
+
OPACITY_MAP[cls] ??
|
|
346
372
|
null
|
|
347
373
|
);
|
|
348
374
|
}
|
|
@@ -41,6 +41,14 @@ describe("parseTypography - font size", () => {
|
|
|
41
41
|
});
|
|
42
42
|
});
|
|
43
43
|
|
|
44
|
+
describe("parseTypography - font family", () => {
|
|
45
|
+
it("should parse font family values", () => {
|
|
46
|
+
expect(parseTypography("font-sans")).toEqual({ fontFamily: "System" });
|
|
47
|
+
expect(parseTypography("font-serif")).toEqual({ fontFamily: "serif" });
|
|
48
|
+
expect(parseTypography("font-mono")).toEqual({ fontFamily: "Courier" });
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
|
|
44
52
|
describe("parseTypography - font weight", () => {
|
|
45
53
|
it("should parse font weight values", () => {
|
|
46
54
|
expect(parseTypography("font-thin")).toEqual({ fontWeight: "100" });
|
|
@@ -177,6 +185,8 @@ describe("parseTypography - comprehensive coverage", () => {
|
|
|
177
185
|
it("should handle all typography categories independently", () => {
|
|
178
186
|
// Font size
|
|
179
187
|
expect(parseTypography("text-base")).toEqual({ fontSize: 16 });
|
|
188
|
+
// Font family
|
|
189
|
+
expect(parseTypography("font-mono")).toEqual({ fontFamily: "Courier" });
|
|
180
190
|
// Font weight
|
|
181
191
|
expect(parseTypography("font-bold")).toEqual({ fontWeight: "700" });
|
|
182
192
|
// Font style
|
package/src/parser/typography.ts
CHANGED
|
@@ -31,6 +31,13 @@ export const LETTER_SPACING_SCALE: Record<string, number> = {
|
|
|
31
31
|
widest: 1.6,
|
|
32
32
|
};
|
|
33
33
|
|
|
34
|
+
// Font family utilities
|
|
35
|
+
const FONT_FAMILY_MAP: Record<string, StyleObject> = {
|
|
36
|
+
"font-sans": { fontFamily: "System" },
|
|
37
|
+
"font-serif": { fontFamily: "serif" },
|
|
38
|
+
"font-mono": { fontFamily: "Courier" },
|
|
39
|
+
};
|
|
40
|
+
|
|
34
41
|
// Font weight utilities
|
|
35
42
|
const FONT_WEIGHT_MAP: Record<string, StyleObject> = {
|
|
36
43
|
"font-thin": { fontWeight: "100" },
|
|
@@ -175,6 +182,7 @@ export function parseTypography(cls: string): StyleObject | null {
|
|
|
175
182
|
|
|
176
183
|
// Try each lookup table in order
|
|
177
184
|
return (
|
|
185
|
+
FONT_FAMILY_MAP[cls] ??
|
|
178
186
|
FONT_WEIGHT_MAP[cls] ??
|
|
179
187
|
FONT_STYLE_MAP[cls] ??
|
|
180
188
|
TEXT_ALIGN_MAP[cls] ??
|