@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.
@@ -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
- // Tailwind color palette
8
- export const COLORS: Record<string, string> = {
9
- // Gray
10
- "gray-50": "#F9FAFB",
11
- "gray-100": "#F3F4F6",
12
- "gray-200": "#E5E7EB",
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
- // Pink
82
- "pink-50": "#FDF2F8",
83
- "pink-100": "#FCE7F3",
84
- "pink-200": "#FBCFE8",
85
- "pink-300": "#F9A8D4",
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
- // Orange
94
- "orange-50": "#FFF7ED",
95
- "orange-100": "#FFEDD5",
96
- "orange-200": "#FED7AA",
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
- // Indigo
106
- "indigo-50": "#EEF2FF",
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
- // Basic colors
118
- white: "#FFFFFF",
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();
@@ -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
@@ -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] ??