@colorye/react-native-css 0.3.0 → 0.3.2

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.
Files changed (39) hide show
  1. package/crates/transformer/index.js +1 -0
  2. package/crates/transformer/transformer.darwin-arm64.node +0 -0
  3. package/crates/transformer/transformer.darwin-x64.node +0 -0
  4. package/crates/transformer/transformer.linux-x64-gnu.node +0 -0
  5. package/crates/transformer/transformer.node +0 -0
  6. package/crates/transformer/transformer.win32-x64-msvc.node +0 -0
  7. package/dist/babel.js +68 -159
  8. package/dist/index.d.ts +22 -8
  9. package/dist/interop.js +17 -5
  10. package/dist/metro.js +55 -0
  11. package/dist/transformer-runtime.js +170 -18
  12. package/dist/transformer.js +73 -20
  13. package/package.json +10 -1
  14. package/src/babel.js +71 -224
  15. package/src/index.d.ts +22 -8
  16. package/src/interop.js +13 -1
  17. package/src/metro.js +42 -0
  18. package/src/transformer-runtime.js +169 -15
  19. package/src/transformer.js +75 -15
  20. package/dist/exported-stylesheet.json +0 -1
  21. package/dist/features/build-transform.js +0 -575
  22. package/dist/features/css-calc.js +0 -539
  23. package/dist/features/css-media.js +0 -77
  24. package/dist/features/css-transform.js +0 -426
  25. package/dist/features/css-vars.js +0 -153
  26. package/dist/features/stylesheet.js +0 -45
  27. package/dist/utils/babel.js +0 -363
  28. package/dist/utils/css.js +0 -263
  29. package/dist/utils/helper.js +0 -11
  30. package/src/exported-stylesheet.json +0 -1
  31. package/src/features/build-transform.js +0 -536
  32. package/src/features/css-calc.js +0 -490
  33. package/src/features/css-media.js +0 -78
  34. package/src/features/css-transform.js +0 -446
  35. package/src/features/css-vars.js +0 -138
  36. package/src/features/stylesheet.js +0 -29
  37. package/src/utils/babel.js +0 -425
  38. package/src/utils/css.js +0 -221
  39. package/src/utils/helper.js +0 -3
@@ -1 +0,0 @@
1
- {":root":{"--font-sans":"-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\",\n \"Noto Sans\", Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\",\n \"Segoe UI Symbol\", \"Noto Color Emoji\"","--font-mono":"ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\",\n \"Courier New\", monospace","--spacing":".25rem","--font-weight-semibold":"600","--font-weight-bold":"700","--tracking-wider":".05em","--default-transition-duration":".15s","--default-transition-timing-function":"cubic-bezier(.4, 0, .2, 1)","--default-font-family":"var(--font-sans)","--default-mono-font-family":"var(--font-mono)","--color-yellow-500":"lab(77.1036% 13.6926 83.561)","--color-green-200":"lab(95.239% -10.8266 9.24107)","--color-green-500":"lab(57.4893% -40.5347 37.516)","--color-orange-500":"lab(66.2947% 49.6344 117.647)","--color-red-500":"lab(45.0394% 75.4726 71.4577)","--color-blue-200":"lab(88.4823% -12.6735 -16.6484)","--color-blue-500":"lab(43.2001% 15.8505 -66.7688)","--color-magenta-500":"lab(34.1384% 59.3948 -45.5364)","--color-black":"lab(0% 0 0)","--color-white":"lab(100% 0 0)","--color-navy-100":"lab(95.2175% -1.96895 -3.05733)","--color-navy-200":"lab(88.3954% -1.94326 -3.07581)","--color-navy-300":"lab(76.7078% -5.64724 -9.13405)","--color-navy-400":"lab(58.179% -8.91814 -15.0204)","--color-navy-500":"lab(39.6076% -11.2321 -20.6616)","--color-navy-600":"lab(20.9196% -10.7469 -25.9701)","--color-navy-700":"lab(3.17211% 1.80869 -28.6588)","--color-primary":"var(--color-blue-500)","--color-success":"var(--color-green-500)","--text-2xs":"10px","--text-2xs--line-height":"12px","--text-xs":"12px","--text-xs--line-height":"16px","--text-sm":"14px","--text-sm--line-height":"20px","--text-md":"18px","--text-md--line-height":"24px","--text-2xl":"32px","--text-2xl--line-height":"36px","--radius-lg":"16px","--radius-xl":"20px","--radius-full":"50%"},"static":{"position":"static"},"container":{"_static":{"width":"100%"},"_dynamic":{"@media (min-width: 580px)":{"_static":{"maxWidth":580},"_dynamic":{}},"@media (min-width: 768px)":{"_static":{"maxWidth":768},"_dynamic":{}},"@media (min-width: 980px)":{"_static":{"maxWidth":980},"_dynamic":{}},"@media (min-width: 1200px)":{"_static":{"maxWidth":1200},"_dynamic":{}}}},"mt-0.5":{"_static":{},"_dynamic":{"marginTop":"calc(var(--spacing) * .5)"}},"mt-1":{"_static":{},"_dynamic":{"marginTop":"var(--spacing)"}},"mt-4":{"_static":{},"_dynamic":{"marginTop":"calc(var(--spacing) * 4)"}},"mb-1":{"_static":{},"_dynamic":{"marginBottom":"var(--spacing)"}},"mb-2":{"_static":{},"_dynamic":{"marginBottom":"calc(var(--spacing) * 2)"}},"mb-3":{"_static":{},"_dynamic":{"marginBottom":"calc(var(--spacing) * 3)"}},"mb-4":{"_static":{},"_dynamic":{"marginBottom":"calc(var(--spacing) * 4)"}},"mb-5":{"_static":{},"_dynamic":{"marginBottom":"calc(var(--spacing) * 5)"}},"h-20":{"_static":{},"_dynamic":{"height":"calc(var(--spacing) * 20)"}},"w-20":{"_static":{},"_dynamic":{"width":"calc(var(--spacing) * 20)"}},"w-[48%]":{"width":"48%"},"flex-1":{"flex":1},"transform":{"_static":{},"_dynamic":{"transform":"var(--tw-rotate-x, ) var(--tw-rotate-y, ) var(--tw-rotate-z, ) var(--tw-skew-x, ) var(--tw-skew-y, )"}},"flex-row":{"flexDirection":"row"},"flex-wrap":{"flexWrap":"wrap"},"items-center":{"alignItems":"center"},"justify-between":{"justifyContent":"space-between"},"justify-center":{"justifyContent":"center"},"gap-1":{"_static":{},"_dynamic":{"gap":"var(--spacing)"}},"gap-2":{"_static":{},"_dynamic":{"gap":"calc(var(--spacing) * 2)"}},"gap-y-2.5":{"_static":{},"_dynamic":{"rowGap":"calc(var(--spacing) * 2.5)"}},"rounded-full":{"_static":{},"_dynamic":{"borderRadius":"var(--radius-full)"}},"rounded-lg":{"_static":{},"_dynamic":{"borderRadius":"var(--radius-lg)"}},"rounded-xl":{"_static":{},"_dynamic":{"borderRadius":"var(--radius-xl)"}},"border":{"_static":{"borderWidth":1},"_dynamic":{"borderStyle":"var(--tw-border-style)"}},"border-s-4":{"_static":{"borderInlineStartWidth":4},"_dynamic":{"borderInlineStartStyle":"var(--tw-border-style)"}},"border-blue-500":{"_static":{},"_dynamic":{"borderColor":"var(--color-blue-500)"}},"border-blue-500/30":{"_static":{},"_dynamic":{"borderColor":"color-mix(in oklab, var(--color-blue-500) 30%, transparent)"}},"border-green-500":{"_static":{},"_dynamic":{"borderColor":"var(--color-green-500)"}},"border-green-500/30":{"_static":{},"_dynamic":{"borderColor":"color-mix(in oklab, var(--color-green-500) 30%, transparent)"}},"border-navy-300":{"_static":{},"_dynamic":{"borderColor":"var(--color-navy-300)"}},"border-navy-500":{"_static":{},"_dynamic":{"borderColor":"var(--color-navy-500)"}},"border-orange-500":{"_static":{},"_dynamic":{"borderColor":"var(--color-orange-500)"}},"border-primary":{"_static":{},"_dynamic":{"borderColor":"var(--color-primary)"}},"bg-blue-500":{"_static":{},"_dynamic":{"backgroundColor":"var(--color-blue-500)"}},"bg-blue-500/10":{"_static":{},"_dynamic":{"backgroundColor":"color-mix(in oklab, var(--color-blue-500) 10%, transparent)"}},"bg-blue-500/20":{"_static":{},"_dynamic":{"backgroundColor":"color-mix(in oklab, var(--color-blue-500) 20%, transparent)"}},"bg-green-500":{"_static":{},"_dynamic":{"backgroundColor":"var(--color-green-500)"}},"bg-green-500/10":{"_static":{},"_dynamic":{"backgroundColor":"color-mix(in oklab, var(--color-green-500) 10%, transparent)"}},"bg-green-500/20":{"_static":{},"_dynamic":{"backgroundColor":"color-mix(in oklab, var(--color-green-500) 20%, transparent)"}},"bg-magenta-500":{"_static":{},"_dynamic":{"backgroundColor":"var(--color-magenta-500)"}},"bg-navy-100":{"_static":{},"_dynamic":{"backgroundColor":"var(--color-navy-100)"}},"bg-navy-600":{"_static":{},"_dynamic":{"backgroundColor":"var(--color-navy-600)"}},"bg-navy-700":{"_static":{},"_dynamic":{"backgroundColor":"var(--color-navy-700)"}},"bg-orange-500":{"_static":{},"_dynamic":{"backgroundColor":"var(--color-orange-500)"}},"bg-orange-500/10":{"_static":{},"_dynamic":{"backgroundColor":"color-mix(in oklab, var(--color-orange-500) 10%, transparent)"}},"bg-primary":{"_static":{},"_dynamic":{"backgroundColor":"var(--color-primary)"}},"bg-primary/20":{"_static":{},"_dynamic":{"backgroundColor":"color-mix(in oklab, var(--color-primary) 20%, transparent)"}},"bg-primary/40":{"_static":{},"_dynamic":{"backgroundColor":"color-mix(in oklab, var(--color-primary) 40%, transparent)"}},"bg-primary/60":{"_static":{},"_dynamic":{"backgroundColor":"color-mix(in oklab, var(--color-primary) 60%, transparent)"}},"bg-primary/80":{"_static":{},"_dynamic":{"backgroundColor":"color-mix(in oklab, var(--color-primary) 80%, transparent)"}},"bg-red-500":{"_static":{},"_dynamic":{"backgroundColor":"var(--color-red-500)"}},"bg-success":{"_static":{},"_dynamic":{"backgroundColor":"var(--color-success)"}},"bg-transparent":{"backgroundColor":"#0000"},"bg-yellow-500":{"_static":{},"_dynamic":{"backgroundColor":"var(--color-yellow-500)"}},"bg-gradient-to-tr":{"_static":{"--tw-gradient-position":"to top right in oklab"},"_dynamic":{"backgroundImage":"linear-gradient(var(--tw-gradient-stops))"}},"p-1":{"_static":{},"_dynamic":{"paddingTop":"var(--spacing)","paddingRight":"var(--spacing)","paddingBottom":"var(--spacing)","paddingLeft":"var(--spacing)"}},"p-3":{"_static":{},"_dynamic":{"paddingTop":"calc(var(--spacing) * 3)","paddingRight":"calc(var(--spacing) * 3)","paddingBottom":"calc(var(--spacing) * 3)","paddingLeft":"calc(var(--spacing) * 3)"}},"p-3.5":{"_static":{},"_dynamic":{"paddingTop":"calc(var(--spacing) * 3.5)","paddingRight":"calc(var(--spacing) * 3.5)","paddingBottom":"calc(var(--spacing) * 3.5)","paddingLeft":"calc(var(--spacing) * 3.5)"}},"p-4":{"_static":{},"_dynamic":{"paddingTop":"calc(var(--spacing) * 4)","paddingRight":"calc(var(--spacing) * 4)","paddingBottom":"calc(var(--spacing) * 4)","paddingLeft":"calc(var(--spacing) * 4)"}},"p-5":{"_static":{},"_dynamic":{"paddingTop":"calc(var(--spacing) * 5)","paddingRight":"calc(var(--spacing) * 5)","paddingBottom":"calc(var(--spacing) * 5)","paddingLeft":"calc(var(--spacing) * 5)"}},"p-6":{"_static":{},"_dynamic":{"paddingTop":"calc(var(--spacing) * 6)","paddingRight":"calc(var(--spacing) * 6)","paddingBottom":"calc(var(--spacing) * 6)","paddingLeft":"calc(var(--spacing) * 6)"}},"px-3":{"_static":{},"_dynamic":{"paddingHorizontal":"calc(var(--spacing) * 3)"}},"px-3.5":{"_static":{},"_dynamic":{"paddingHorizontal":"calc(var(--spacing) * 3.5)"}},"px-4":{"_static":{},"_dynamic":{"paddingHorizontal":"calc(var(--spacing) * 4)"}},"px-5":{"_static":{},"_dynamic":{"paddingHorizontal":"calc(var(--spacing) * 5)"}},"py-1":{"_static":{},"_dynamic":{"paddingVertical":"var(--spacing)"}},"py-2":{"_static":{},"_dynamic":{"paddingVertical":"calc(var(--spacing) * 2)"}},"py-2.5":{"_static":{},"_dynamic":{"paddingVertical":"calc(var(--spacing) * 2.5)"}},"py-3.5":{"_static":{},"_dynamic":{"paddingVertical":"calc(var(--spacing) * 3.5)"}},"py-4":{"_static":{},"_dynamic":{"paddingVertical":"calc(var(--spacing) * 4)"}},"pr-3":{"_static":{},"_dynamic":{"paddingRight":"calc(var(--spacing) * 3)"}},"pb-20":{"_static":{},"_dynamic":{"paddingBottom":"calc(var(--spacing) * 20)"}},"text-2xl":{"_static":{},"_dynamic":{"fontSize":"var(--text-2xl)","lineHeight":"var(--tw-leading, var(--text-2xl--line-height))"}},"text-2xs":{"_static":{},"_dynamic":{"fontSize":"var(--text-2xs)","lineHeight":"var(--tw-leading, var(--text-2xs--line-height))"}},"text-md":{"_static":{},"_dynamic":{"fontSize":"var(--text-md)","lineHeight":"var(--tw-leading, var(--text-md--line-height))"}},"text-sm":{"_static":{},"_dynamic":{"fontSize":"var(--text-sm)","lineHeight":"var(--tw-leading, var(--text-sm--line-height))"}},"text-xs":{"_static":{},"_dynamic":{"fontSize":"var(--text-xs)","lineHeight":"var(--tw-leading, var(--text-xs--line-height))"}},"font-bold":{"_static":{"--tw-font-weight":"var(--font-weight-bold)"},"_dynamic":{"fontWeight":"var(--font-weight-bold)"}},"font-semibold":{"_static":{"--tw-font-weight":"var(--font-weight-semibold)"},"_dynamic":{"fontWeight":"var(--font-weight-semibold)"}},"tracking-wider":{"_static":{"--tw-tracking":"var(--tracking-wider)"},"_dynamic":{"letterSpacing":"var(--tracking-wider)"}},"text-blue-200":{"_static":{},"_dynamic":{"color":"var(--color-blue-200)"}},"text-green-200":{"_static":{},"_dynamic":{"color":"var(--color-green-200)"}},"text-green-500":{"_static":{},"_dynamic":{"color":"var(--color-green-500)"}},"text-navy-200":{"_static":{},"_dynamic":{"color":"var(--color-navy-200)"}},"text-navy-300":{"_static":{},"_dynamic":{"color":"var(--color-navy-300)"}},"text-navy-600":{"_static":{},"_dynamic":{"color":"var(--color-navy-600)"}},"text-navy-700":{"_static":{},"_dynamic":{"color":"var(--color-navy-700)"}},"text-white":{"_static":{},"_dynamic":{"color":"var(--color-white)"}},"text-yellow-500":{"_static":{},"_dynamic":{"color":"var(--color-yellow-500)"}},"capitalize":{"textTransform":"capitalize"},"uppercase":{"textTransform":"uppercase"},"shadow-base":{"_static":{"--tw-shadow":"0px 0px 4px var(--tw-shadow-color, lab(0% 0 0 / .1))"},"_dynamic":{"boxShadow":"var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)"}},"transition":{"_static":{"transitionProperty":"color, background-color, border-color, outline-color, text-decoration-color, fill, stroke, --tw-gradient-from, --tw-gradient-via, --tw-gradient-to, opacity, box-shadow, transform, translate, scale, rotate, filter, -webkit-backdrop-filter, backdrop-filter, display, content-visibility, overlay, pointer-events"},"_dynamic":{"transitionTimingFunction":"var(--tw-ease, var(--default-transition-timing-function))","transitionDuration":"var(--tw-duration, var(--default-transition-duration))"}},"transition-all":{"_static":{"transitionProperty":"all"},"_dynamic":{"transitionTimingFunction":"var(--tw-ease, var(--default-transition-timing-function))","transitionDuration":"var(--tw-duration, var(--default-transition-duration))"}},"group-active:scale-105":{"_static":{"--tw-scale-x":"105%","--tw-scale-y":"105%","--tw-scale-z":"105%"},"_dynamic":{"scale":"var(--tw-scale-x) var(--tw-scale-y)"}},"group-active:bg-yellow-500":{"_static":{},"_dynamic":{"backgroundColor":"var(--color-yellow-500)"}},"group-active:text-black":{"_static":{},"_dynamic":{"color":"var(--color-black)"}},"group-active:text-yellow-500":{"_static":{},"_dynamic":{"color":"var(--color-yellow-500)"}},"active:scale-95":{"_static":{"--tw-scale-x":"95%","--tw-scale-y":"95%","--tw-scale-z":"95%"},"_dynamic":{"scale":"var(--tw-scale-x) var(--tw-scale-y)"}},"scale-95":{"_static":{"--tw-scale-x":"95%","--tw-scale-y":"95%","--tw-scale-z":"95%"},"_dynamic":{"scale":"var(--tw-scale-x) var(--tw-scale-y)"}},"active:border-primary":{"_static":{},"_dynamic":{"borderColor":"var(--color-primary)"}},"active:bg-navy-600":{"_static":{},"_dynamic":{"backgroundColor":"var(--color-navy-600)"}},"active:opacity-75":{"opacity":0.75},"opacity-75":{"opacity":0.75},"active:opacity-80":{"opacity":0.8},"opacity-80":{"opacity":0.8},"disabled:bg-navy-400":{"_static":{},"_dynamic":{"backgroundColor":"var(--color-navy-400)"}},"bg-navy-400":{"_static":{},"_dynamic":{"backgroundColor":"var(--color-navy-400)"}},"disabled:opacity-40":{"opacity":0.4},"opacity-40":{"opacity":0.4}}
@@ -1,536 +0,0 @@
1
- /**
2
- * Build-time CSS transformations
3
- * Pre-computes static values during Metro transform to reduce runtime work.
4
- */
5
-
6
- // ============================================================================
7
- // Regex patterns (compiled once)
8
- // ============================================================================
9
- const remOrEmUnitRe = /([\d.]+)(rem|em)/g;
10
- const pxUnitRe = /^([\d.]+)px$/;
11
- const viewportUnitRe = /([\d.]+)(vh|vw|vmin|vmax)/;
12
- const cssVarRe = /var\(/;
13
- const calcRe = /calc\(/;
14
- const colorRe1 = /rgba?\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(?:,\s*([\d.]+)\s*)?\)/g;
15
- const colorRe2 = /rgba?\(\s*(\d+)\s+(\d+)\s+(\d+)\s*\/\s*([\d.]+)\s*\)/g;
16
- const borderRe = /^(\S+)\s+(solid|dashed|dotted)\s+(\S+)$/;
17
- const borderSimpleRe = /^(\S+)\s+(solid|dashed|dotted)$/;
18
- const spacingRe = /^\s*(\S+)(?:\s+(\S+)(?:\s+(\S+)(?:\s+(\S+))?)?)?\s*$/;
19
- const fontWeightRe = /^(normal|bold|[1-9]00)$/;
20
- const transformFnRe =
21
- /(perspective|rotate[XYZ]?|scale[XY]?|translate[XY]?|skew[XY]?)\s*\(\s*([^,)]+)(?:,\s*([^)]+))?\)/g;
22
-
23
- const UNSUPPORTED_PROPERTIES = ["outline"];
24
-
25
- // ============================================================================
26
- // Helpers
27
- // ============================================================================
28
- const itohex = (component) => {
29
- const hex = Number(component).toString(16);
30
- return hex.length === 1 ? `0${hex}` : hex;
31
- };
32
-
33
- const toNumber = (value) => {
34
- if (typeof value === "number") return value;
35
- if (typeof value !== "string") return value;
36
- const trimmed = value.trim();
37
- if (trimmed === "") return value;
38
- // If it's a known string-only property like borderStyle or pure word, don't convert to number
39
- if (/^(solid|dashed|dotted|none|hidden|double|groove|ridge|inset|outset)$/i.test(trimmed)) {
40
- return trimmed;
41
- }
42
- const num = Number(trimmed);
43
- return !isNaN(num) ? num : value;
44
- };
45
-
46
- // ============================================================================
47
- // Check if value needs runtime processing
48
- // ============================================================================
49
- export function isDynamicValue(value) {
50
- if (typeof value !== "string") return false;
51
- return viewportUnitRe.test(value) || cssVarRe.test(value);
52
- }
53
-
54
- export function hasMediaQuery(declaration) {
55
- if (!declaration || typeof declaration !== "object") return false;
56
- return Object.keys(declaration).some((key) => key.startsWith("@media"));
57
- }
58
-
59
- // ============================================================================
60
- // Static transformations (can be done at build time)
61
- // ============================================================================
62
-
63
- /** Remove !important */
64
- export function removeImportant(value) {
65
- if (typeof value !== "string") return value;
66
- return value.replace(/\s*!important\s*/g, "").trim();
67
- }
68
-
69
- /** Convert rem/em to px (1rem = 16px) */
70
- export function transformRemEm(value) {
71
- if (typeof value !== "string") return value;
72
- return value.replace(remOrEmUnitRe, (_, num) => `${parseFloat(num) * 16}px`);
73
- }
74
-
75
- /** Remove px unit and convert to number */
76
- export function removePxUnit(value) {
77
- if (typeof value !== "string") return value;
78
- const match = pxUnitRe.exec(value);
79
- if (match) return parseFloat(match[1]);
80
- return value;
81
- }
82
-
83
- /** Transform rgba/rgb to hex */
84
- export function transformColor(value) {
85
- if (typeof value !== "string") return value;
86
-
87
- // Reset lastIndex for global regexes
88
- colorRe1.lastIndex = 0;
89
- colorRe2.lastIndex = 0;
90
-
91
- value = value.replace(colorRe1, (_, r, g, b, a) => {
92
- const alpha = parseFloat(a);
93
- if (isNaN(alpha) || alpha >= 1) return `#${itohex(r)}${itohex(g)}${itohex(b)}`;
94
- return `#${itohex(r)}${itohex(g)}${itohex(b)}${itohex(Math.round(alpha * 255))}`;
95
- });
96
-
97
- value = value.replace(colorRe2, (_, r, g, b, a) => {
98
- const alpha = parseFloat(a);
99
- if (isNaN(alpha) || alpha >= 1) return `#${itohex(r)}${itohex(g)}${itohex(b)}`;
100
- return `#${itohex(r)}${itohex(g)}${itohex(b)}${itohex(Math.round(alpha * 255))}`;
101
- });
102
-
103
- return value;
104
- }
105
-
106
- /** Transform position: fixed → absolute */
107
- export function transformPosition(property, value) {
108
- if (property === "position" && value === "fixed") return "absolute";
109
- return value;
110
- }
111
-
112
- /** Transform border-radius with % → 9999 */
113
- export function transformBorderRadius(property, value) {
114
- if (property.toLowerCase().endsWith("radius") && typeof value === "string" && value.includes("%")) {
115
- return 9999;
116
- }
117
- return value;
118
- }
119
-
120
- /** Transform opacity with % → decimal */
121
- export function transformOpacity(property, value) {
122
- if (property === "opacity" && typeof value === "string" && value.endsWith("%")) {
123
- const num = parseFloat(value);
124
- if (!isNaN(num)) {
125
- return num / 100;
126
- }
127
- }
128
- return value;
129
- }
130
-
131
- /** Get aliased property name */
132
- export function getAliasedProperty(property) {
133
- if (property === "background") return "backgroundColor";
134
- return property;
135
- }
136
-
137
- /** Check if property is supported */
138
- export function isPropertySupported(property, value) {
139
- if (UNSUPPORTED_PROPERTIES.includes(property)) return false;
140
- if (value === undefined || value === null) return false;
141
- if (typeof value === "object") return false; // Skip nested objects (media queries)
142
- return true;
143
- }
144
-
145
- // ============================================================================
146
- // Shorthand expansion
147
- // ============================================================================
148
-
149
- /** Expand border shorthand */
150
- export function expandBorder(property, value) {
151
- if (!["border", "borderTop", "borderBottom", "borderLeft", "borderRight"].includes(property)) {
152
- return null;
153
- }
154
-
155
- if (value === "none" || value === "0") {
156
- return { [`${property}Width`]: 0 };
157
- }
158
-
159
- const match = borderRe.exec(String(value));
160
- if (match) {
161
- const [, width, style, color] = match;
162
- return {
163
- [`${property}Width`]: toNumber(width),
164
- borderStyle: ["solid", "dotted", "dashed"].includes(style) ? style : "solid",
165
- [`${property}Color`]: color,
166
- };
167
- }
168
-
169
- // Try "width style" format
170
- const simpleMatch = borderSimpleRe.exec(String(value));
171
- if (simpleMatch) {
172
- const [, width, style] = simpleMatch;
173
- return {
174
- [`${property}Width`]: toNumber(width),
175
- borderStyle: ["solid", "dotted", "dashed"].includes(style) ? style : "solid",
176
- };
177
- }
178
-
179
- // Single value (width only)
180
- return { [`${property}Width`]: toNumber(value) };
181
- }
182
-
183
- function splitSpacingValues(str) {
184
- const parts = [];
185
- let current = "";
186
- let depth = 0;
187
- for (let i = 0; i < str.length; i++) {
188
- const char = str[i];
189
- if (char === "(") {
190
- depth++;
191
- current += char;
192
- } else if (char === ")") {
193
- depth--;
194
- current += char;
195
- } else if (char === " " && depth === 0) {
196
- if (current) {
197
- parts.push(current);
198
- current = "";
199
- }
200
- } else {
201
- current += char;
202
- }
203
- }
204
- if (current) {
205
- parts.push(current);
206
- }
207
- return parts.filter(Boolean);
208
- }
209
-
210
- /** Expand margin/padding shorthand */
211
- export function expandSpacing(property, value) {
212
- if (!["padding", "margin"].includes(property)) return null;
213
-
214
- const parts = splitSpacingValues(String(value));
215
- if (parts.length === 0) return null;
216
-
217
- const top = parts[0];
218
- const right = parts[1] !== undefined ? parts[1] : top;
219
- const bottom = parts[2] !== undefined ? parts[2] : top;
220
- const left = parts[3] !== undefined ? parts[3] : right;
221
-
222
- return {
223
- [`${property}Top`]: toNumber(top),
224
- [`${property}Right`]: toNumber(right),
225
- [`${property}Bottom`]: toNumber(bottom),
226
- [`${property}Left`]: toNumber(left),
227
- };
228
- }
229
-
230
- /** Expand fontWeight */
231
- export function expandFontWeight(property, value) {
232
- if (property !== "fontWeight") return null;
233
- if (!fontWeightRe.test(String(value))) return null;
234
- return { fontWeight: String(value) };
235
- }
236
-
237
- /** Expand flex */
238
- export function expandFlex(property, value) {
239
- if (property !== "flex") return null;
240
- return { flex: parseInt(value, 10) };
241
- }
242
-
243
- /** Expand transform property */
244
- export function expandTransform(property, value) {
245
- if (property !== "transform") return null;
246
- if (typeof value !== "string") return null;
247
-
248
- // If contains dynamic values, skip
249
- if (isDynamicValue(value)) return null;
250
-
251
- const transforms = [];
252
- let match;
253
- const re = new RegExp(transformFnRe.source, "g");
254
-
255
- while ((match = re.exec(value)) !== null) {
256
- const [, fn, val1, val2] = match;
257
-
258
- if (fn === "translate" || fn === "skew") {
259
- transforms.push({ [`${fn}X`]: toNumber(val1) });
260
- if (val2 !== undefined) {
261
- transforms.push({ [`${fn}Y`]: toNumber(val2) });
262
- }
263
- } else {
264
- transforms.push({ [fn]: toNumber(val1) });
265
- }
266
- }
267
-
268
- return transforms.length > 0 ? { transform: transforms } : null;
269
- }
270
-
271
- /** Expand logical properties like paddingInline, marginInline, paddingBlock, marginBlock */
272
- export function expandLogicalProperty(property, value) {
273
- if (
274
- ![
275
- "paddingInline",
276
- "marginInline",
277
- "paddingBlock",
278
- "marginBlock",
279
- "paddingInlineStart",
280
- "paddingInlineEnd",
281
- "marginInlineStart",
282
- "marginInlineEnd",
283
- "insetInline",
284
- "insetInlineStart",
285
- "insetInlineEnd",
286
- "insetBlock",
287
- "insetBlockStart",
288
- "insetBlockEnd",
289
- ].includes(property)
290
- ) {
291
- return null;
292
- }
293
-
294
- const strValue = String(value).trim();
295
- const parts = [];
296
- let current = "";
297
- let depth = 0;
298
- for (let i = 0; i < strValue.length; i++) {
299
- const char = strValue[i];
300
- if (char === "(") {
301
- depth++;
302
- current += char;
303
- } else if (char === ")") {
304
- depth--;
305
- current += char;
306
- } else if (char === " " && depth === 0) {
307
- if (current) {
308
- parts.push(current);
309
- current = "";
310
- }
311
- } else {
312
- current += char;
313
- }
314
- }
315
- if (current) {
316
- parts.push(current);
317
- }
318
-
319
- const cleanedParts = parts.filter(Boolean);
320
-
321
- if (property === "paddingInlineStart") return { paddingStart: toNumber(value) };
322
- if (property === "paddingInlineEnd") return { paddingEnd: toNumber(value) };
323
- if (property === "marginInlineStart") return { marginStart: toNumber(value) };
324
- if (property === "marginInlineEnd") return { marginEnd: toNumber(value) };
325
- if (property === "insetInlineStart") return { start: toNumber(value) };
326
- if (property === "insetInlineEnd") return { end: toNumber(value) };
327
- if (property === "insetBlockStart") return { top: toNumber(value) };
328
- if (property === "insetBlockEnd") return { bottom: toNumber(value) };
329
-
330
- if (property === "paddingInline") {
331
- if (cleanedParts.length === 1) {
332
- return { paddingHorizontal: toNumber(cleanedParts[0]) };
333
- }
334
- if (cleanedParts.length >= 2) {
335
- return {
336
- paddingStart: toNumber(cleanedParts[0]),
337
- paddingEnd: toNumber(cleanedParts[1]),
338
- };
339
- }
340
- }
341
-
342
- if (property === "marginInline") {
343
- if (cleanedParts.length === 1) {
344
- return { marginHorizontal: toNumber(cleanedParts[0]) };
345
- }
346
- if (cleanedParts.length >= 2) {
347
- return {
348
- marginStart: toNumber(cleanedParts[0]),
349
- marginEnd: toNumber(cleanedParts[1]),
350
- };
351
- }
352
- }
353
-
354
- if (property === "paddingBlock") {
355
- if (cleanedParts.length === 1) {
356
- return { paddingVertical: toNumber(cleanedParts[0]) };
357
- }
358
- if (cleanedParts.length >= 2) {
359
- return {
360
- paddingTop: toNumber(cleanedParts[0]),
361
- paddingBottom: toNumber(cleanedParts[1]),
362
- };
363
- }
364
- }
365
-
366
- if (property === "marginBlock") {
367
- if (cleanedParts.length === 1) {
368
- return { marginVertical: toNumber(cleanedParts[0]) };
369
- }
370
- if (cleanedParts.length >= 2) {
371
- return {
372
- marginTop: toNumber(cleanedParts[0]),
373
- marginBottom: toNumber(cleanedParts[1]),
374
- };
375
- }
376
- }
377
-
378
- if (property === "insetInline") {
379
- if (cleanedParts.length === 1) {
380
- return {
381
- left: toNumber(cleanedParts[0]),
382
- right: toNumber(cleanedParts[0]),
383
- };
384
- }
385
- if (cleanedParts.length >= 2) {
386
- return {
387
- start: toNumber(cleanedParts[0]),
388
- end: toNumber(cleanedParts[1]),
389
- };
390
- }
391
- }
392
-
393
- if (property === "insetBlock") {
394
- if (cleanedParts.length === 1) {
395
- return {
396
- top: toNumber(cleanedParts[0]),
397
- bottom: toNumber(cleanedParts[0]),
398
- };
399
- }
400
- if (cleanedParts.length >= 2) {
401
- return {
402
- top: toNumber(cleanedParts[0]),
403
- bottom: toNumber(cleanedParts[1]),
404
- };
405
- }
406
- }
407
-
408
- return null;
409
- }
410
-
411
- // ============================================================================
412
- // Main pre-computation function
413
- // ============================================================================
414
-
415
- /**
416
- * Pre-compute a single property value
417
- * Returns { property, value, isDynamic }
418
- */
419
- export function precomputeValue(property, value) {
420
- // Handle non-string values
421
- if (typeof value !== "string") {
422
- return { property, value, isDynamic: false };
423
- }
424
-
425
- // Check if dynamic (needs runtime)
426
- const isDynamic = isDynamicValue(value) || calcRe.test(value);
427
-
428
- // Apply static transformations (even for dynamic values, some parts can be pre-processed)
429
- let processed = value;
430
- processed = removeImportant(processed);
431
- processed = transformRemEm(processed);
432
- processed = transformColor(processed);
433
- processed = transformPosition(property, processed);
434
- processed = transformBorderRadius(property, processed);
435
- processed = transformOpacity(property, processed);
436
-
437
- // Get aliased property
438
- const aliasedProp = getAliasedProperty(property);
439
-
440
- // For static values, remove px and convert to number (unless it's borderStyle, fontWeight, etc.)
441
- if (!isDynamic) {
442
- if (aliasedProp.endsWith("Style") || aliasedProp.endsWith("borderStyle") || aliasedProp === "borderStyle") {
443
- processed = String(processed).trim() || "solid";
444
- } else {
445
- processed = removePxUnit(processed);
446
- if (typeof processed === "string") {
447
- processed = toNumber(processed);
448
- }
449
- }
450
- }
451
-
452
- // React Native does not support directional borderStyle properties (e.g. borderBottomStyle)
453
- if (["borderBottomStyle", "borderTopStyle", "borderLeftStyle", "borderRightStyle"].includes(aliasedProp)) {
454
- return { property: "borderStyle", value: processed === "dotted" || processed === "dashed" ? processed : "solid", isDynamic };
455
- }
456
-
457
- return { property: aliasedProp, value: processed, isDynamic };
458
- }
459
-
460
- /**
461
- * Pre-compute an entire declaration object
462
- * Returns { _static: {...}, _dynamic: {...}, _hasDynamic: boolean }
463
- */
464
- export function precomputeDeclaration(declaration) {
465
- if (!declaration || typeof declaration !== "object") {
466
- return { _static: {}, _dynamic: {}, _hasDynamic: false };
467
- }
468
-
469
- const staticProps = {};
470
- const dynamicProps = {};
471
- let hasDynamic = false;
472
-
473
- for (const [property, value] of Object.entries(declaration)) {
474
- // Handle media queries - always dynamic (needs runtime evaluation)
475
- if (property.startsWith("@media")) {
476
- // Recursively pre-compute media query content
477
- const mediaResult = precomputeDeclaration(value);
478
- dynamicProps[property] = {
479
- _static: mediaResult._static,
480
- _dynamic: mediaResult._dynamic,
481
- };
482
- hasDynamic = true;
483
- continue;
484
- }
485
-
486
- // Keep CSS variables as-is
487
- if (property.startsWith("--")) {
488
- staticProps[property] = value;
489
- continue;
490
- }
491
-
492
- // Skip unsupported
493
- if (!isPropertySupported(property, value)) continue;
494
-
495
- // Pre-compute the value
496
- const { property: prop, value: val, isDynamic } = precomputeValue(property, value);
497
-
498
- // Try to expand shorthand
499
- const expanded =
500
- expandBorder(prop, val) ||
501
- expandSpacing(prop, val) ||
502
- expandFontWeight(prop, val) ||
503
- expandFlex(prop, val) ||
504
- expandTransform(prop, val) ||
505
- expandLogicalProperty(prop, val);
506
-
507
- if (expanded) {
508
- // Add expanded properties
509
- for (const [expProp, expVal] of Object.entries(expanded)) {
510
- if (isDynamic) {
511
- dynamicProps[expProp] = expVal;
512
- hasDynamic = true;
513
- } else {
514
- staticProps[expProp] = expVal;
515
- }
516
- }
517
- } else {
518
- // Single property
519
- if (isDynamic) {
520
- dynamicProps[prop] = val;
521
- hasDynamic = true;
522
- } else {
523
- staticProps[prop] = val;
524
- }
525
- }
526
- }
527
-
528
- return { _static: staticProps, _dynamic: dynamicProps, _hasDynamic: hasDynamic };
529
- }
530
-
531
- export default {
532
- isDynamicValue,
533
- hasMediaQuery,
534
- precomputeValue,
535
- precomputeDeclaration,
536
- };