@tamagui/style-grammar 0.0.0-bootstrap.0 → 3.0.0-beta.643.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.
Files changed (458) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +33 -1
  3. package/dist/cjs/backgroundFamily.cjs +176 -0
  4. package/dist/cjs/backgroundFamily.native.cjs +195 -0
  5. package/dist/cjs/backgroundFamily.native.js +197 -0
  6. package/dist/cjs/backgroundFamily.native.js.map +1 -0
  7. package/dist/cjs/borderFamily.cjs +169 -0
  8. package/dist/cjs/borderFamily.native.cjs +247 -0
  9. package/dist/cjs/borderFamily.native.js +249 -0
  10. package/dist/cjs/borderFamily.native.js.map +1 -0
  11. package/dist/cjs/candidate.cjs +608 -0
  12. package/dist/cjs/candidate.native.cjs +821 -0
  13. package/dist/cjs/candidate.native.js +823 -0
  14. package/dist/cjs/candidate.native.js.map +1 -0
  15. package/dist/cjs/candidateTarget.cjs +50 -0
  16. package/dist/cjs/candidateTarget.native.cjs +88 -0
  17. package/dist/cjs/candidateTarget.native.js +90 -0
  18. package/dist/cjs/candidateTarget.native.js.map +1 -0
  19. package/dist/cjs/clauseCapability.cjs +130 -0
  20. package/dist/cjs/clauseCapability.native.cjs +152 -0
  21. package/dist/cjs/clauseCapability.native.js +154 -0
  22. package/dist/cjs/clauseCapability.native.js.map +1 -0
  23. package/dist/cjs/clausePrecedence.cjs +153 -0
  24. package/dist/cjs/clausePrecedence.native.cjs +204 -0
  25. package/dist/cjs/clausePrecedence.native.js +206 -0
  26. package/dist/cjs/clausePrecedence.native.js.map +1 -0
  27. package/dist/cjs/clauseSources.cjs +47 -0
  28. package/dist/cjs/clauseSources.native.cjs +49 -0
  29. package/dist/cjs/clauseSources.native.js +51 -0
  30. package/dist/cjs/clauseSources.native.js.map +1 -0
  31. package/dist/cjs/config.cjs +130 -0
  32. package/dist/cjs/config.native.cjs +185 -0
  33. package/dist/cjs/config.native.js +187 -0
  34. package/dist/cjs/config.native.js.map +1 -0
  35. package/dist/cjs/evaluateProgram.cjs +65 -0
  36. package/dist/cjs/evaluateProgram.native.cjs +70 -0
  37. package/dist/cjs/evaluateProgram.native.js +72 -0
  38. package/dist/cjs/evaluateProgram.native.js.map +1 -0
  39. package/dist/cjs/fontShorthand.cjs +207 -0
  40. package/dist/cjs/fontShorthand.native.cjs +260 -0
  41. package/dist/cjs/fontShorthand.native.js +262 -0
  42. package/dist/cjs/fontShorthand.native.js.map +1 -0
  43. package/dist/cjs/geometricShorthand.cjs +122 -0
  44. package/dist/cjs/geometricShorthand.native.cjs +128 -0
  45. package/dist/cjs/geometricShorthand.native.js +130 -0
  46. package/dist/cjs/geometricShorthand.native.js.map +1 -0
  47. package/dist/cjs/index.cjs +19 -0
  48. package/dist/cjs/index.native.cjs +21 -0
  49. package/dist/cjs/index.native.js +23 -0
  50. package/dist/cjs/index.native.js.map +1 -0
  51. package/dist/cjs/lowerProgram.cjs +205 -0
  52. package/dist/cjs/lowerProgram.native.cjs +257 -0
  53. package/dist/cjs/lowerProgram.native.js +259 -0
  54. package/dist/cjs/lowerProgram.native.js.map +1 -0
  55. package/dist/cjs/mergeFlatValues.cjs +50 -0
  56. package/dist/cjs/mergeFlatValues.native.cjs +71 -0
  57. package/dist/cjs/mergeFlatValues.native.js +73 -0
  58. package/dist/cjs/mergeFlatValues.native.js.map +1 -0
  59. package/dist/cjs/modifierRegistry.cjs +246 -0
  60. package/dist/cjs/modifierRegistry.native.cjs +426 -0
  61. package/dist/cjs/modifierRegistry.native.js +428 -0
  62. package/dist/cjs/modifierRegistry.native.js.map +1 -0
  63. package/dist/cjs/payloadShape.cjs +69 -0
  64. package/dist/cjs/payloadShape.native.cjs +71 -0
  65. package/dist/cjs/payloadShape.native.js +73 -0
  66. package/dist/cjs/payloadShape.native.js.map +1 -0
  67. package/dist/cjs/programEligibility.cjs +46 -0
  68. package/dist/cjs/programEligibility.native.cjs +48 -0
  69. package/dist/cjs/programEligibility.native.js +50 -0
  70. package/dist/cjs/programEligibility.native.js.map +1 -0
  71. package/dist/cjs/programHash.cjs +86 -0
  72. package/dist/cjs/programHash.native.cjs +106 -0
  73. package/dist/cjs/programHash.native.js +108 -0
  74. package/dist/cjs/programHash.native.js.map +1 -0
  75. package/dist/cjs/programs.cjs +128 -0
  76. package/dist/cjs/programs.native.cjs +220 -0
  77. package/dist/cjs/programs.native.js +222 -0
  78. package/dist/cjs/programs.native.js.map +1 -0
  79. package/dist/cjs/registry.cjs +629 -0
  80. package/dist/cjs/registry.native.cjs +635 -0
  81. package/dist/cjs/registry.native.js +637 -0
  82. package/dist/cjs/registry.native.js.map +1 -0
  83. package/dist/cjs/resolvePayload.cjs +296 -0
  84. package/dist/cjs/resolvePayload.native.cjs +302 -0
  85. package/dist/cjs/resolvePayload.native.js +304 -0
  86. package/dist/cjs/resolvePayload.native.js.map +1 -0
  87. package/dist/cjs/runtime.cjs +50 -0
  88. package/dist/cjs/runtime.native.cjs +52 -0
  89. package/dist/cjs/runtime.native.js +54 -0
  90. package/dist/cjs/runtime.native.js.map +1 -0
  91. package/dist/cjs/safeAreaVariables.cjs +42 -0
  92. package/dist/cjs/safeAreaVariables.native.cjs +44 -0
  93. package/dist/cjs/safeAreaVariables.native.js +46 -0
  94. package/dist/cjs/safeAreaVariables.native.js.map +1 -0
  95. package/dist/cjs/scanFlatValue.cjs +181 -0
  96. package/dist/cjs/scanFlatValue.native.cjs +183 -0
  97. package/dist/cjs/scanFlatValue.native.js +185 -0
  98. package/dist/cjs/scanFlatValue.native.js.map +1 -0
  99. package/dist/cjs/serializePayload.cjs +149 -0
  100. package/dist/cjs/serializePayload.native.cjs +187 -0
  101. package/dist/cjs/serializePayload.native.js +189 -0
  102. package/dist/cjs/serializePayload.native.js.map +1 -0
  103. package/dist/cjs/stateModifiers.cjs +43 -0
  104. package/dist/cjs/stateModifiers.native.cjs +45 -0
  105. package/dist/cjs/stateModifiers.native.js +47 -0
  106. package/dist/cjs/stateModifiers.native.js.map +1 -0
  107. package/dist/cjs/states.cjs +97 -0
  108. package/dist/cjs/states.native.cjs +131 -0
  109. package/dist/cjs/states.native.js +133 -0
  110. package/dist/cjs/states.native.js.map +1 -0
  111. package/dist/cjs/table.cjs +54 -0
  112. package/dist/cjs/table.native.cjs +135 -0
  113. package/dist/cjs/table.native.js +137 -0
  114. package/dist/cjs/table.native.js.map +1 -0
  115. package/dist/cjs/textDecorationFamily.cjs +129 -0
  116. package/dist/cjs/textDecorationFamily.native.cjs +199 -0
  117. package/dist/cjs/textDecorationFamily.native.js +201 -0
  118. package/dist/cjs/textDecorationFamily.native.js.map +1 -0
  119. package/dist/cjs/tooling.cjs +26 -0
  120. package/dist/cjs/tooling.native.cjs +28 -0
  121. package/dist/cjs/tooling.native.js +30 -0
  122. package/dist/cjs/tooling.native.js.map +1 -0
  123. package/dist/cjs/toolingAnnotations.cjs +105 -0
  124. package/dist/cjs/toolingAnnotations.native.cjs +133 -0
  125. package/dist/cjs/toolingAnnotations.native.js +135 -0
  126. package/dist/cjs/toolingAnnotations.native.js.map +1 -0
  127. package/dist/cjs/toolingDiagnostics.cjs +459 -0
  128. package/dist/cjs/toolingDiagnostics.native.cjs +788 -0
  129. package/dist/cjs/toolingDiagnostics.native.js +790 -0
  130. package/dist/cjs/toolingDiagnostics.native.js.map +1 -0
  131. package/dist/cjs/toolingRegistry.cjs +159 -0
  132. package/dist/cjs/toolingRegistry.native.cjs +164 -0
  133. package/dist/cjs/toolingRegistry.native.js +166 -0
  134. package/dist/cjs/toolingRegistry.native.js.map +1 -0
  135. package/dist/cjs/transformFamily.cjs +425 -0
  136. package/dist/cjs/transformFamily.native.cjs +517 -0
  137. package/dist/cjs/transformFamily.native.js +519 -0
  138. package/dist/cjs/transformFamily.native.js.map +1 -0
  139. package/dist/cjs/transition.cjs +459 -0
  140. package/dist/cjs/transition.native.cjs +499 -0
  141. package/dist/cjs/transition.native.js +501 -0
  142. package/dist/cjs/transition.native.js.map +1 -0
  143. package/dist/cjs/transitionAlign.cjs +115 -0
  144. package/dist/cjs/transitionAlign.native.cjs +154 -0
  145. package/dist/cjs/transitionAlign.native.js +156 -0
  146. package/dist/cjs/transitionAlign.native.js.map +1 -0
  147. package/dist/cjs/transitionLegacy.cjs +217 -0
  148. package/dist/cjs/transitionLegacy.native.cjs +260 -0
  149. package/dist/cjs/transitionLegacy.native.js +262 -0
  150. package/dist/cjs/transitionLegacy.native.js.map +1 -0
  151. package/dist/cjs/transitionNative.cjs +281 -0
  152. package/dist/cjs/transitionNative.native.cjs +285 -0
  153. package/dist/cjs/transitionNative.native.js +287 -0
  154. package/dist/cjs/transitionNative.native.js.map +1 -0
  155. package/dist/cjs/unitlessNumbers.cjs +86 -0
  156. package/dist/cjs/unitlessNumbers.native.cjs +106 -0
  157. package/dist/cjs/unitlessNumbers.native.js +108 -0
  158. package/dist/cjs/unitlessNumbers.native.js.map +1 -0
  159. package/dist/cjs/v6ThemeNames.cjs +47 -0
  160. package/dist/cjs/v6ThemeNames.native.cjs +53 -0
  161. package/dist/cjs/v6ThemeNames.native.js +55 -0
  162. package/dist/cjs/v6ThemeNames.native.js.map +1 -0
  163. package/dist/cjs/valueParser.cjs +148 -0
  164. package/dist/cjs/valueParser.native.cjs +150 -0
  165. package/dist/cjs/valueParser.native.js +152 -0
  166. package/dist/cjs/valueParser.native.js.map +1 -0
  167. package/dist/cjs/valueTypes.cjs +38 -0
  168. package/dist/cjs/valueTypes.native.cjs +40 -0
  169. package/dist/cjs/valueTypes.native.js +42 -0
  170. package/dist/cjs/valueTypes.native.js.map +1 -0
  171. package/dist/esm/backgroundFamily.mjs +150 -0
  172. package/dist/esm/backgroundFamily.mjs.map +1 -0
  173. package/dist/esm/backgroundFamily.native.js +167 -0
  174. package/dist/esm/backgroundFamily.native.js.map +1 -0
  175. package/dist/esm/borderFamily.mjs +146 -0
  176. package/dist/esm/borderFamily.mjs.map +1 -0
  177. package/dist/esm/borderFamily.native.js +222 -0
  178. package/dist/esm/borderFamily.native.js.map +1 -0
  179. package/dist/esm/candidate.mjs +581 -0
  180. package/dist/esm/candidate.mjs.map +1 -0
  181. package/dist/esm/candidate.native.js +792 -0
  182. package/dist/esm/candidate.native.js.map +1 -0
  183. package/dist/esm/candidateTarget.mjs +29 -0
  184. package/dist/esm/candidateTarget.mjs.map +1 -0
  185. package/dist/esm/candidateTarget.native.js +65 -0
  186. package/dist/esm/candidateTarget.native.js.map +1 -0
  187. package/dist/esm/clauseCapability.mjs +107 -0
  188. package/dist/esm/clauseCapability.mjs.map +1 -0
  189. package/dist/esm/clauseCapability.native.js +127 -0
  190. package/dist/esm/clauseCapability.native.js.map +1 -0
  191. package/dist/esm/clausePrecedence.mjs +121 -0
  192. package/dist/esm/clausePrecedence.mjs.map +1 -0
  193. package/dist/esm/clausePrecedence.native.js +170 -0
  194. package/dist/esm/clausePrecedence.native.js.map +1 -0
  195. package/dist/esm/clauseSources.mjs +23 -0
  196. package/dist/esm/clauseSources.mjs.map +1 -0
  197. package/dist/esm/clauseSources.native.js +23 -0
  198. package/dist/esm/clauseSources.native.js.map +1 -0
  199. package/dist/esm/config.mjs +103 -0
  200. package/dist/esm/config.mjs.map +1 -0
  201. package/dist/esm/config.native.js +156 -0
  202. package/dist/esm/config.native.js.map +1 -0
  203. package/dist/esm/evaluateProgram.mjs +45 -0
  204. package/dist/esm/evaluateProgram.mjs.map +1 -0
  205. package/dist/esm/evaluateProgram.native.js +48 -0
  206. package/dist/esm/evaluateProgram.native.js.map +1 -0
  207. package/dist/esm/fontShorthand.mjs +184 -0
  208. package/dist/esm/fontShorthand.mjs.map +1 -0
  209. package/dist/esm/fontShorthand.native.js +235 -0
  210. package/dist/esm/fontShorthand.native.js.map +1 -0
  211. package/dist/esm/geometricShorthand.mjs +102 -0
  212. package/dist/esm/geometricShorthand.mjs.map +1 -0
  213. package/dist/esm/geometricShorthand.native.js +106 -0
  214. package/dist/esm/geometricShorthand.native.js.map +1 -0
  215. package/dist/esm/index.mjs +1 -0
  216. package/dist/esm/index.native.js +1 -0
  217. package/dist/esm/lowerProgram.mjs +182 -0
  218. package/dist/esm/lowerProgram.mjs.map +1 -0
  219. package/dist/esm/lowerProgram.native.js +232 -0
  220. package/dist/esm/lowerProgram.native.js.map +1 -0
  221. package/dist/esm/mergeFlatValues.mjs +27 -0
  222. package/dist/esm/mergeFlatValues.mjs.map +1 -0
  223. package/dist/esm/mergeFlatValues.native.js +46 -0
  224. package/dist/esm/mergeFlatValues.native.js.map +1 -0
  225. package/dist/esm/modifierRegistry.mjs +219 -0
  226. package/dist/esm/modifierRegistry.mjs.map +1 -0
  227. package/dist/esm/modifierRegistry.native.js +397 -0
  228. package/dist/esm/modifierRegistry.native.js.map +1 -0
  229. package/dist/esm/payloadShape.mjs +49 -0
  230. package/dist/esm/payloadShape.mjs.map +1 -0
  231. package/dist/esm/payloadShape.native.js +49 -0
  232. package/dist/esm/payloadShape.native.js.map +1 -0
  233. package/dist/esm/programEligibility.mjs +22 -0
  234. package/dist/esm/programEligibility.mjs.map +1 -0
  235. package/dist/esm/programEligibility.native.js +22 -0
  236. package/dist/esm/programEligibility.native.js.map +1 -0
  237. package/dist/esm/programHash.mjs +62 -0
  238. package/dist/esm/programHash.mjs.map +1 -0
  239. package/dist/esm/programHash.native.js +80 -0
  240. package/dist/esm/programHash.native.js.map +1 -0
  241. package/dist/esm/programs.mjs +103 -0
  242. package/dist/esm/programs.mjs.map +1 -0
  243. package/dist/esm/programs.native.js +193 -0
  244. package/dist/esm/programs.native.js.map +1 -0
  245. package/dist/esm/registry.mjs +595 -0
  246. package/dist/esm/registry.mjs.map +1 -0
  247. package/dist/esm/registry.native.js +599 -0
  248. package/dist/esm/registry.native.js.map +1 -0
  249. package/dist/esm/resolvePayload.mjs +273 -0
  250. package/dist/esm/resolvePayload.mjs.map +1 -0
  251. package/dist/esm/resolvePayload.native.js +277 -0
  252. package/dist/esm/resolvePayload.native.js.map +1 -0
  253. package/dist/esm/runtime.mjs +63 -0
  254. package/dist/esm/runtime.native.js +63 -0
  255. package/dist/esm/safeAreaVariables.mjs +18 -0
  256. package/dist/esm/safeAreaVariables.mjs.map +1 -0
  257. package/dist/esm/safeAreaVariables.native.js +18 -0
  258. package/dist/esm/safeAreaVariables.native.js.map +1 -0
  259. package/dist/esm/scanFlatValue.mjs +160 -0
  260. package/dist/esm/scanFlatValue.mjs.map +1 -0
  261. package/dist/esm/scanFlatValue.native.js +160 -0
  262. package/dist/esm/scanFlatValue.native.js.map +1 -0
  263. package/dist/esm/serializePayload.mjs +125 -0
  264. package/dist/esm/serializePayload.mjs.map +1 -0
  265. package/dist/esm/serializePayload.native.js +161 -0
  266. package/dist/esm/serializePayload.native.js.map +1 -0
  267. package/dist/esm/stateModifiers.mjs +19 -0
  268. package/dist/esm/stateModifiers.mjs.map +1 -0
  269. package/dist/esm/stateModifiers.native.js +19 -0
  270. package/dist/esm/stateModifiers.native.js.map +1 -0
  271. package/dist/esm/states.mjs +69 -0
  272. package/dist/esm/states.mjs.map +1 -0
  273. package/dist/esm/states.native.js +101 -0
  274. package/dist/esm/states.native.js.map +1 -0
  275. package/dist/esm/table.mjs +31 -0
  276. package/dist/esm/table.mjs.map +1 -0
  277. package/dist/esm/table.native.js +110 -0
  278. package/dist/esm/table.native.js.map +1 -0
  279. package/dist/esm/textDecorationFamily.mjs +106 -0
  280. package/dist/esm/textDecorationFamily.mjs.map +1 -0
  281. package/dist/esm/textDecorationFamily.native.js +174 -0
  282. package/dist/esm/textDecorationFamily.native.js.map +1 -0
  283. package/dist/esm/tooling.mjs +15 -0
  284. package/dist/esm/tooling.native.js +15 -0
  285. package/dist/esm/toolingAnnotations.mjs +85 -0
  286. package/dist/esm/toolingAnnotations.mjs.map +1 -0
  287. package/dist/esm/toolingAnnotations.native.js +111 -0
  288. package/dist/esm/toolingAnnotations.native.js.map +1 -0
  289. package/dist/esm/toolingDiagnostics.mjs +428 -0
  290. package/dist/esm/toolingDiagnostics.mjs.map +1 -0
  291. package/dist/esm/toolingDiagnostics.native.js +755 -0
  292. package/dist/esm/toolingDiagnostics.native.js.map +1 -0
  293. package/dist/esm/toolingRegistry.mjs +135 -0
  294. package/dist/esm/toolingRegistry.mjs.map +1 -0
  295. package/dist/esm/toolingRegistry.native.js +138 -0
  296. package/dist/esm/toolingRegistry.native.js.map +1 -0
  297. package/dist/esm/transformFamily.mjs +392 -0
  298. package/dist/esm/transformFamily.mjs.map +1 -0
  299. package/dist/esm/transformFamily.native.js +482 -0
  300. package/dist/esm/transformFamily.native.js.map +1 -0
  301. package/dist/esm/transition.mjs +434 -0
  302. package/dist/esm/transition.mjs.map +1 -0
  303. package/dist/esm/transition.native.js +472 -0
  304. package/dist/esm/transition.native.js.map +1 -0
  305. package/dist/esm/transitionAlign.mjs +95 -0
  306. package/dist/esm/transitionAlign.mjs.map +1 -0
  307. package/dist/esm/transitionAlign.native.js +132 -0
  308. package/dist/esm/transitionAlign.native.js.map +1 -0
  309. package/dist/esm/transitionLegacy.mjs +197 -0
  310. package/dist/esm/transitionLegacy.mjs.map +1 -0
  311. package/dist/esm/transitionLegacy.native.js +238 -0
  312. package/dist/esm/transitionLegacy.native.js.map +1 -0
  313. package/dist/esm/transitionNative.mjs +257 -0
  314. package/dist/esm/transitionNative.mjs.map +1 -0
  315. package/dist/esm/transitionNative.native.js +259 -0
  316. package/dist/esm/transitionNative.native.js.map +1 -0
  317. package/dist/esm/unitlessNumbers.mjs +65 -0
  318. package/dist/esm/unitlessNumbers.mjs.map +1 -0
  319. package/dist/esm/unitlessNumbers.native.js +83 -0
  320. package/dist/esm/unitlessNumbers.native.js.map +1 -0
  321. package/dist/esm/v6ThemeNames.mjs +23 -0
  322. package/dist/esm/v6ThemeNames.mjs.map +1 -0
  323. package/dist/esm/v6ThemeNames.native.js +27 -0
  324. package/dist/esm/v6ThemeNames.native.js.map +1 -0
  325. package/dist/esm/valueParser.mjs +125 -0
  326. package/dist/esm/valueParser.mjs.map +1 -0
  327. package/dist/esm/valueParser.native.js +125 -0
  328. package/dist/esm/valueParser.native.js.map +1 -0
  329. package/dist/esm/valueTypes.mjs +14 -0
  330. package/dist/esm/valueTypes.mjs.map +1 -0
  331. package/dist/esm/valueTypes.native.js +14 -0
  332. package/dist/esm/valueTypes.native.js.map +1 -0
  333. package/package.json +98 -4
  334. package/src/backgroundFamily.ts +182 -0
  335. package/src/borderFamily.ts +172 -0
  336. package/src/candidate.ts +691 -0
  337. package/src/candidateTarget.ts +67 -0
  338. package/src/clauseCapability.ts +209 -0
  339. package/src/clausePrecedence.ts +198 -0
  340. package/src/clauseSources.ts +29 -0
  341. package/src/config.ts +169 -0
  342. package/src/evaluateProgram.ts +91 -0
  343. package/src/fontShorthand.ts +177 -0
  344. package/src/geometricShorthand.ts +105 -0
  345. package/src/index.ts +1 -0
  346. package/src/lowerProgram.ts +398 -0
  347. package/src/modifierRegistry.ts +340 -0
  348. package/src/payloadShape.ts +92 -0
  349. package/src/programEligibility.ts +46 -0
  350. package/src/programHash.ts +128 -0
  351. package/src/programs.ts +95 -0
  352. package/src/registry.ts +367 -0
  353. package/src/resolvePayload.ts +480 -0
  354. package/src/runtime.ts +32 -0
  355. package/src/safeAreaVariables.ts +19 -0
  356. package/src/scanFlatValue.ts +327 -0
  357. package/src/serializePayload.ts +199 -0
  358. package/src/stateModifiers.ts +36 -0
  359. package/src/states.ts +128 -0
  360. package/src/table.ts +47 -0
  361. package/src/textDecorationFamily.ts +119 -0
  362. package/src/tooling.ts +8 -0
  363. package/src/toolingAnnotations.ts +151 -0
  364. package/src/toolingDiagnostics.ts +735 -0
  365. package/src/toolingRegistry.ts +130 -0
  366. package/src/transformFamily.ts +590 -0
  367. package/src/transition.ts +553 -0
  368. package/src/transitionAlign.ts +165 -0
  369. package/src/transitionLegacy.ts +237 -0
  370. package/src/transitionNative.ts +357 -0
  371. package/src/unitlessNumbers.ts +61 -0
  372. package/src/v6ThemeNames.ts +40 -0
  373. package/src/valueParser.ts +193 -0
  374. package/src/valueTypes.ts +136 -0
  375. package/types/backgroundFamily.d.ts +17 -0
  376. package/types/backgroundFamily.d.ts.map +11 -0
  377. package/types/borderFamily.d.ts +23 -0
  378. package/types/borderFamily.d.ts.map +11 -0
  379. package/types/candidate.d.ts +52 -0
  380. package/types/candidate.d.ts.map +11 -0
  381. package/types/candidateTarget.d.ts +32 -0
  382. package/types/candidateTarget.d.ts.map +11 -0
  383. package/types/clauseCapability.d.ts +69 -0
  384. package/types/clauseCapability.d.ts.map +11 -0
  385. package/types/clausePrecedence.d.ts +30 -0
  386. package/types/clausePrecedence.d.ts.map +11 -0
  387. package/types/clauseSources.d.ts +12 -0
  388. package/types/clauseSources.d.ts.map +11 -0
  389. package/types/config.d.ts +44 -0
  390. package/types/config.d.ts.map +11 -0
  391. package/types/evaluateProgram.d.ts +27 -0
  392. package/types/evaluateProgram.d.ts.map +11 -0
  393. package/types/fontShorthand.d.ts +25 -0
  394. package/types/fontShorthand.d.ts.map +11 -0
  395. package/types/geometricShorthand.d.ts +21 -0
  396. package/types/geometricShorthand.d.ts.map +11 -0
  397. package/types/index.d.ts +3 -0
  398. package/types/index.d.ts.map +11 -0
  399. package/types/lowerProgram.d.ts +73 -0
  400. package/types/lowerProgram.d.ts.map +11 -0
  401. package/types/mergeFlatValues.d.ts +14 -0
  402. package/types/mergeFlatValues.d.ts.map +11 -0
  403. package/types/modifierRegistry.d.ts +70 -0
  404. package/types/modifierRegistry.d.ts.map +11 -0
  405. package/types/payloadShape.d.ts +15 -0
  406. package/types/payloadShape.d.ts.map +11 -0
  407. package/types/programEligibility.d.ts +23 -0
  408. package/types/programEligibility.d.ts.map +11 -0
  409. package/types/programHash.d.ts +20 -0
  410. package/types/programHash.d.ts.map +11 -0
  411. package/types/programs.d.ts +18 -0
  412. package/types/programs.d.ts.map +11 -0
  413. package/types/registry.d.ts +24 -0
  414. package/types/registry.d.ts.map +11 -0
  415. package/types/resolvePayload.d.ts +75 -0
  416. package/types/resolvePayload.d.ts.map +11 -0
  417. package/types/runtime.d.ts +34 -0
  418. package/types/runtime.d.ts.map +11 -0
  419. package/types/safeAreaVariables.d.ts +5 -0
  420. package/types/safeAreaVariables.d.ts.map +11 -0
  421. package/types/scanFlatValue.d.ts +29 -0
  422. package/types/scanFlatValue.d.ts.map +11 -0
  423. package/types/serializePayload.d.ts +13 -0
  424. package/types/serializePayload.d.ts.map +11 -0
  425. package/types/stateModifiers.d.ts +14 -0
  426. package/types/stateModifiers.d.ts.map +11 -0
  427. package/types/states.d.ts +22 -0
  428. package/types/states.d.ts.map +11 -0
  429. package/types/table.d.ts +4 -0
  430. package/types/table.d.ts.map +11 -0
  431. package/types/textDecorationFamily.d.ts +23 -0
  432. package/types/textDecorationFamily.d.ts.map +11 -0
  433. package/types/tooling.d.ts +10 -0
  434. package/types/tooling.d.ts.map +11 -0
  435. package/types/toolingAnnotations.d.ts +29 -0
  436. package/types/toolingAnnotations.d.ts.map +11 -0
  437. package/types/toolingDiagnostics.d.ts +114 -0
  438. package/types/toolingDiagnostics.d.ts.map +11 -0
  439. package/types/toolingRegistry.d.ts +10 -0
  440. package/types/toolingRegistry.d.ts.map +11 -0
  441. package/types/transformFamily.d.ts +83 -0
  442. package/types/transformFamily.d.ts.map +11 -0
  443. package/types/transition.d.ts +65 -0
  444. package/types/transition.d.ts.map +11 -0
  445. package/types/transitionAlign.d.ts +15 -0
  446. package/types/transitionAlign.d.ts.map +11 -0
  447. package/types/transitionLegacy.d.ts +9 -0
  448. package/types/transitionLegacy.d.ts.map +11 -0
  449. package/types/transitionNative.d.ts +41 -0
  450. package/types/transitionNative.d.ts.map +11 -0
  451. package/types/unitlessNumbers.d.ts +3 -0
  452. package/types/unitlessNumbers.d.ts.map +11 -0
  453. package/types/v6ThemeNames.d.ts +7 -0
  454. package/types/v6ThemeNames.d.ts.map +11 -0
  455. package/types/valueParser.d.ts +36 -0
  456. package/types/valueParser.d.ts.map +11 -0
  457. package/types/valueTypes.d.ts +66 -0
  458. package/types/valueTypes.d.ts.map +11 -0
@@ -0,0 +1,590 @@
1
+ // The transform family.
2
+ //
3
+ // See plans/dom-tailwind-flat-values.md — "The transform family" — and the
4
+ // Transforms section of plans/react-native-style-capabilities.md for the RN
5
+ // facts every choice here cites.
6
+ //
7
+ // `x`, `y`, `scale`, and `rotate` stay first-class props, each its own program
8
+ // with independent clause replacement, which is what makes `scale="1 enter:0.9"`
9
+ // an independently replaceable lifecycle program.
10
+ //
11
+ // Web: uniform `scale` and `rotate` lower to the CSS individual properties
12
+ // directly. Where two programs share one CSS property — `x` and `y` both feed
13
+ // `translate`, `scaleX`/`scaleY` both feed `scale` — each program owns a per-axis
14
+ // custom property and one static rule composes them. Transitions survive that
15
+ // indirection because changing a custom property triggers transitions on the
16
+ // property consuming it (browser-verified 2026-07-29).
17
+ //
18
+ // Native: RN has no individual transform properties through 0.86, so the caller
19
+ // composes ONE array in CSS individual-property order — translate, rotate, scale,
20
+ // then the raw `transform` entries. That order is semantic: array entries are
21
+ // matrix-multiplied in authored order, so it is never sorted and never derived
22
+ // from object iteration.
23
+
24
+ export interface TransformComposition {
25
+ /** the CSS property the axis variables compose into */
26
+ property: string
27
+ /** local axis defaults that prevent inherited parent transforms from leaking in */
28
+ defaults: Readonly<Record<string, string>>
29
+ /** the composing declaration value, with per-axis fallbacks */
30
+ value: string
31
+ }
32
+
33
+ export type TransformTargetKind =
34
+ /** the program writes the CSS individual property directly */
35
+ | 'property'
36
+ /** the program writes a per-axis custom property that a static rule composes */
37
+ | 'axis-variable'
38
+
39
+ export interface TransformTarget {
40
+ prop: string
41
+ kind: TransformTargetKind
42
+ /** the declaration this program writes, and the property it hashes under */
43
+ declaration: string
44
+ /** the CSS property that ultimately changes; two targets sharing this and
45
+ * differing in `kind` would fight for one declaration */
46
+ effectiveProperty: string
47
+ /** present for `axis-variable` targets */
48
+ composition?: TransformComposition
49
+ }
50
+
51
+ // `0px` rather than `0` so the fallback is unambiguous in both slots
52
+ const translateComposition: TransformComposition = Object.freeze({
53
+ property: 'translate',
54
+ defaults: Object.freeze({ '--t-x': '0px', '--t-y': '0px' }),
55
+ value: 'var(--t-x, 0px) var(--t-y, 0px)',
56
+ })
57
+
58
+ const scaleComposition: TransformComposition = Object.freeze({
59
+ property: 'scale',
60
+ defaults: Object.freeze({ '--t-scale-x': '1', '--t-scale-y': '1' }),
61
+ value: 'var(--t-scale-x, 1) var(--t-scale-y, 1)',
62
+ })
63
+
64
+ /**
65
+ * One entry per program TARGET. Uniform `scale` is absent on purpose: it expands
66
+ * to both axis targets the way `padding` expands to four sides, so no two
67
+ * mechanisms ever write the CSS `scale` property and a later `scaleX` replaces
68
+ * just its axis through the ordinary forward merge.
69
+ */
70
+ export const transformFamilyTargets: Readonly<Record<string, TransformTarget>> =
71
+ Object.freeze({
72
+ x: {
73
+ prop: 'x',
74
+ kind: 'axis-variable',
75
+ declaration: '--t-x',
76
+ effectiveProperty: 'translate',
77
+ composition: translateComposition,
78
+ },
79
+ y: {
80
+ prop: 'y',
81
+ kind: 'axis-variable',
82
+ declaration: '--t-y',
83
+ effectiveProperty: 'translate',
84
+ composition: translateComposition,
85
+ },
86
+ scaleX: {
87
+ prop: 'scaleX',
88
+ kind: 'axis-variable',
89
+ declaration: '--t-scale-x',
90
+ effectiveProperty: 'scale',
91
+ composition: scaleComposition,
92
+ },
93
+ scaleY: {
94
+ prop: 'scaleY',
95
+ kind: 'axis-variable',
96
+ declaration: '--t-scale-y',
97
+ effectiveProperty: 'scale',
98
+ composition: scaleComposition,
99
+ },
100
+ rotate: {
101
+ prop: 'rotate',
102
+ kind: 'property',
103
+ declaration: 'rotate',
104
+ effectiveProperty: 'rotate',
105
+ },
106
+ })
107
+
108
+ /** authored prop -> the targets it contributes, uniform `scale` expanding to both axes */
109
+ const transformPropTargets: Readonly<Record<string, readonly TransformTarget[]>> =
110
+ Object.freeze({
111
+ x: [transformFamilyTargets.x],
112
+ y: [transformFamilyTargets.y],
113
+ rotate: [transformFamilyTargets.rotate],
114
+ scaleX: [transformFamilyTargets.scaleX],
115
+ scaleY: [transformFamilyTargets.scaleY],
116
+ scale: [transformFamilyTargets.scaleX, transformFamilyTargets.scaleY],
117
+ })
118
+
119
+ /** the authored props that lower through the transform family */
120
+ export const transformFamilyProps: ReadonlySet<string> = new Set(
121
+ Object.keys(transformPropTargets)
122
+ )
123
+
124
+ const noTargets: readonly TransformTarget[] = Object.freeze([])
125
+
126
+ /** the targets an authored transform prop contributes; empty when not in the family */
127
+ export function getTransformTargets(prop: string): readonly TransformTarget[] {
128
+ return transformPropTargets[prop] ?? noTargets
129
+ }
130
+
131
+ /** the declarations an authored transform prop owns; empty when not in the family */
132
+ export function transformDeclarationsFor(prop: string): readonly string[] {
133
+ return transformDeclarations[prop] ?? noDeclarations
134
+ }
135
+
136
+ const noDeclarations: readonly string[] = Object.freeze([])
137
+
138
+ const transformDeclarations: Readonly<Record<string, readonly string[]>> = Object.freeze({
139
+ x: ['--t-x'],
140
+ y: ['--t-y'],
141
+ rotate: ['rotate'],
142
+ scaleX: ['--t-scale-x'],
143
+ scaleY: ['--t-scale-y'],
144
+ scale: ['--t-scale-x', '--t-scale-y'],
145
+ })
146
+
147
+ /**
148
+ * Declaration -> the authored prop it evaluates as on native, so the evaluator
149
+ * can turn program results back into `composeTransformArray` input.
150
+ */
151
+ export const transformPropForDeclaration: Readonly<Record<string, string>> =
152
+ Object.freeze({
153
+ '--t-x': 'x',
154
+ '--t-y': 'y',
155
+ '--t-scale-x': 'scaleX',
156
+ '--t-scale-y': 'scaleY',
157
+ rotate: 'rotate',
158
+ })
159
+
160
+ /**
161
+ * The unit a bare legacy number carries for each declaration, so a displaced
162
+ * plain value lifts into a program base with the right spelling: lengths take
163
+ * px, scale is unitless, rotate takes deg.
164
+ */
165
+ export const transformDeclarationUnit: Readonly<Record<string, 'px' | 'none' | 'deg'>> =
166
+ Object.freeze({
167
+ '--t-x': 'px',
168
+ '--t-y': 'px',
169
+ '--t-scale-x': 'none',
170
+ '--t-scale-y': 'none',
171
+ rotate: 'deg',
172
+ })
173
+
174
+ /** legacy flat transform keys that write a declaration, uniform parent last */
175
+ export const legacyTransformKeysFor: Readonly<Record<string, readonly string[]>> =
176
+ Object.freeze({
177
+ '--t-x': ['x'],
178
+ '--t-y': ['y'],
179
+ '--t-scale-x': ['scaleX', 'scale'],
180
+ '--t-scale-y': ['scaleY', 'scale'],
181
+ rotate: ['rotate'],
182
+ })
183
+
184
+ /** the sibling axis a uniform legacy `scale` also covers */
185
+ export const uniformLegacySiblings: Readonly<Record<string, string>> = Object.freeze({
186
+ '--t-scale-x': 'scaleY',
187
+ '--t-scale-y': 'scaleX',
188
+ })
189
+
190
+ /**
191
+ * Custom property -> the rule composing its axis group, so the web lowering can
192
+ * emit the composing rule alongside an axis program without knowing the family.
193
+ */
194
+ export const transformAxisCompositions: Readonly<Record<string, TransformComposition>> =
195
+ Object.freeze({
196
+ '--t-x': translateComposition,
197
+ '--t-y': translateComposition,
198
+ '--t-scale-x': scaleComposition,
199
+ '--t-scale-y': scaleComposition,
200
+ })
201
+
202
+ // ---------------------------------------------------------------------------
203
+ // native composition
204
+ // ---------------------------------------------------------------------------
205
+
206
+ /** one React Native transform array entry */
207
+ export type TransformEntry = Readonly<Record<string, string | number | readonly number[]>>
208
+
209
+ export type TransformDiagnosticCode =
210
+ /** a CSS transform function RN cannot represent faithfully */
211
+ | 'unsupported-transform-function'
212
+ /** a unit RN's array form cannot carry (turn, em, rem, physical units) */
213
+ | 'unsupported-transform-unit'
214
+ /** matrix() with a length RN rejects (it requires 9 or 16 numbers) */
215
+ | 'unsupported-matrix-length'
216
+ /** a value that is invalid CSS without a unit, so web would drop it too */
217
+ | 'unitless-transform-value'
218
+ /** the raw transform string could not be tokenized */
219
+ | 'malformed-transform'
220
+
221
+ export interface TransformDiagnostic {
222
+ code: TransformDiagnosticCode
223
+ /** the offending function, prop, or fragment */
224
+ source: string
225
+ message: string
226
+ }
227
+
228
+ /** evaluated program values, keyed by the authored transform prop */
229
+ export type TransformProgramResults = Readonly<
230
+ Record<string, string | number | undefined | null>
231
+ >
232
+
233
+ export interface ComposedTransform {
234
+ transform: TransformEntry[]
235
+ errors: TransformDiagnostic[]
236
+ }
237
+
238
+ /**
239
+ * Builds one RN transform array in CSS individual-property order: translate
240
+ * (x then y), rotate, scale, then the raw `transform` entries. Nothing is
241
+ * sorted, and an unrepresentable value is a diagnostic rather than a lossy
242
+ * forward to RN's permissive string parser.
243
+ */
244
+ export function composeTransformArray(
245
+ results: TransformProgramResults,
246
+ rawTransform?: string | readonly TransformEntry[] | null
247
+ ): ComposedTransform {
248
+ const transform: TransformEntry[] = []
249
+ const errors: TransformDiagnostic[] = []
250
+
251
+ // 1. translate
252
+ for (const [prop, key] of [
253
+ ['x', 'translateX'],
254
+ ['y', 'translateY'],
255
+ ] as const) {
256
+ const value = results[prop]
257
+ if (value == null) continue
258
+ const length = readLength(value, prop, errors)
259
+ if (length !== null) transform.push({ [key]: length })
260
+ }
261
+
262
+ // 2. rotate
263
+ if (results.rotate != null) {
264
+ const angle = readAngle(results.rotate, 'rotate', errors)
265
+ if (angle !== null) transform.push({ rotate: angle })
266
+ }
267
+
268
+ // 3. scale — always per-axis, because uniform `scale` expanded to both axes at
269
+ // contribution. Equal axes collapse back to one `scale` entry so the common
270
+ // uniform case matches the v1 array byte for byte
271
+ const scaleX =
272
+ results.scaleX == null ? null : readNumber(results.scaleX, 'scaleX', errors)
273
+ const scaleY =
274
+ results.scaleY == null ? null : readNumber(results.scaleY, 'scaleY', errors)
275
+ if (scaleX !== null && scaleX === scaleY) {
276
+ transform.push({ scale: scaleX })
277
+ } else {
278
+ if (scaleX !== null) transform.push({ scaleX })
279
+ if (scaleY !== null) transform.push({ scaleY })
280
+ }
281
+
282
+ // 4. the raw transform property, last
283
+ if (rawTransform != null) {
284
+ if (typeof rawTransform === 'string') {
285
+ const parsed = parseTransformString(rawTransform)
286
+ for (const error of parsed.errors) errors.push(error)
287
+ for (const entry of parsed.transform) transform.push(entry)
288
+ } else {
289
+ for (const entry of rawTransform) transform.push(entry)
290
+ }
291
+ }
292
+
293
+ return { transform, errors }
294
+ }
295
+
296
+ /**
297
+ * Parses a CSS transform string into RN array entries. Arrays are the only form
298
+ * Animated and Reanimated can animate, so the string is parsed exactly once here
299
+ * rather than handed to RN per frame.
300
+ */
301
+ export function parseTransformString(input: string): ComposedTransform {
302
+ const transform: TransformEntry[] = []
303
+ const errors: TransformDiagnostic[] = []
304
+
305
+ let index = 0
306
+ const length = input.length
307
+
308
+ while (index < length) {
309
+ const code = input.charCodeAt(index)
310
+ // whitespace and commas separate functions
311
+ if (
312
+ code === 32 ||
313
+ code === 9 ||
314
+ code === 10 ||
315
+ code === 13 ||
316
+ code === 12 ||
317
+ code === 44
318
+ ) {
319
+ index++
320
+ continue
321
+ }
322
+
323
+ const nameStart = index
324
+ while (index < length && input.charCodeAt(index) !== 40 /* ( */) {
325
+ const inner = input.charCodeAt(index)
326
+ if (inner === 32 || inner === 44) break
327
+ index++
328
+ }
329
+ const name = input.slice(nameStart, index).trim()
330
+
331
+ if (input.charCodeAt(index) !== 40) {
332
+ errors.push({
333
+ code: 'malformed-transform',
334
+ source: name || input.slice(nameStart),
335
+ message: `transform: expected "(" after "${name || input.slice(nameStart)}"`,
336
+ })
337
+ return { transform, errors }
338
+ }
339
+
340
+ // arguments up to the matching paren
341
+ index++
342
+ const argsStart = index
343
+ let depth = 1
344
+ while (index < length && depth > 0) {
345
+ const inner = input.charCodeAt(index)
346
+ if (inner === 40) depth++
347
+ else if (inner === 41) depth--
348
+ if (depth > 0) index++
349
+ }
350
+ if (depth !== 0) {
351
+ errors.push({
352
+ code: 'malformed-transform',
353
+ source: name,
354
+ message: `transform: "${name}(" is never closed`,
355
+ })
356
+ return { transform, errors }
357
+ }
358
+ const args = input
359
+ .slice(argsStart, index)
360
+ .split(',')
361
+ .map((arg) => arg.trim())
362
+ .filter((arg) => arg.length > 0)
363
+ index++
364
+
365
+ readFunction(name, args, transform, errors)
366
+ }
367
+
368
+ return { transform, errors }
369
+ }
370
+
371
+ function readFunction(
372
+ name: string,
373
+ args: readonly string[],
374
+ transform: TransformEntry[],
375
+ errors: TransformDiagnostic[]
376
+ ): void {
377
+ switch (name) {
378
+ case 'translate': {
379
+ const x = readLength(args[0] ?? '0', 'translate', errors)
380
+ if (x !== null) transform.push({ translateX: x })
381
+ if (args.length > 1) {
382
+ const y = readLength(args[1], 'translate', errors)
383
+ if (y !== null) transform.push({ translateY: y })
384
+ }
385
+ return
386
+ }
387
+ case 'translateX':
388
+ case 'translateY': {
389
+ const value = readLength(args[0] ?? '0', name, errors)
390
+ if (value !== null) transform.push({ [name]: value })
391
+ return
392
+ }
393
+ case 'translate3d': {
394
+ // the JS parser accepts translate3d but Fabric's reader takes two entries,
395
+ // so decompose it and require a zero Z
396
+ const z = args[2] ?? '0'
397
+ if (readLength(z, name, []) !== 0) {
398
+ errors.push({
399
+ code: 'unsupported-transform-function',
400
+ source: name,
401
+ message: `transform: "${name}" with a non-zero Z is not supported on native; RN has no translateZ`,
402
+ })
403
+ return
404
+ }
405
+ const x = readLength(args[0] ?? '0', name, errors)
406
+ if (x !== null) transform.push({ translateX: x })
407
+ const y = readLength(args[1] ?? '0', name, errors)
408
+ if (y !== null) transform.push({ translateY: y })
409
+ return
410
+ }
411
+ case 'scale': {
412
+ const first = readNumber(args[0] ?? '1', name, errors)
413
+ if (first === null) return
414
+ if (args.length < 2) {
415
+ transform.push({ scale: first })
416
+ return
417
+ }
418
+ const second = readNumber(args[1], name, errors)
419
+ if (second === null) return
420
+ if (first === second) {
421
+ transform.push({ scale: first })
422
+ return
423
+ }
424
+ transform.push({ scaleX: first })
425
+ transform.push({ scaleY: second })
426
+ return
427
+ }
428
+ case 'scaleX':
429
+ case 'scaleY': {
430
+ const value = readNumber(args[0] ?? '1', name, errors)
431
+ if (value !== null) transform.push({ [name]: value })
432
+ return
433
+ }
434
+ case 'rotate':
435
+ case 'rotateX':
436
+ case 'rotateY':
437
+ case 'rotateZ':
438
+ case 'skewX':
439
+ case 'skewY': {
440
+ const value = readAngle(args[0] ?? '0', name, errors)
441
+ if (value !== null) transform.push({ [name]: value })
442
+ return
443
+ }
444
+ case 'perspective': {
445
+ const value = readLength(args[0] ?? '0', name, errors)
446
+ if (typeof value === 'number') transform.push({ perspective: value })
447
+ else if (value !== null) {
448
+ errors.push({
449
+ code: 'unsupported-transform-unit',
450
+ source: name,
451
+ message: `transform: "${name}" needs an absolute length, not "${args[0]}"`,
452
+ })
453
+ }
454
+ return
455
+ }
456
+ case 'matrix': {
457
+ // RN's parser requires 9 or 16 numbers; the standard six-number CSS
458
+ // matrix() is rejected rather than silently reinterpreted
459
+ const numbers: number[] = []
460
+ for (const arg of args) {
461
+ const value = readNumber(arg, name, errors)
462
+ if (value === null) return
463
+ numbers.push(value)
464
+ }
465
+ if (numbers.length !== 9 && numbers.length !== 16) {
466
+ errors.push({
467
+ code: 'unsupported-matrix-length',
468
+ source: name,
469
+ message: `transform: "matrix()" needs 9 or 16 numbers on native, got ${numbers.length}. The six-number CSS form has no faithful native lowering.`,
470
+ })
471
+ return
472
+ }
473
+ transform.push({ matrix: numbers })
474
+ return
475
+ }
476
+ default: {
477
+ errors.push({
478
+ code: 'unsupported-transform-function',
479
+ source: name,
480
+ message: `transform: "${name}" has no faithful native lowering`,
481
+ })
482
+ }
483
+ }
484
+ }
485
+
486
+ /** a length RN can carry: points as a number, or a percentage string */
487
+ function readLength(
488
+ value: string | number,
489
+ source: string,
490
+ errors: TransformDiagnostic[]
491
+ ): number | string | null {
492
+ if (typeof value === 'number') return value
493
+ const text = value.trim()
494
+ if (text.endsWith('%')) {
495
+ // array entries keep percentages: RN >= 0.75 resolves them against the
496
+ // view's own size, and we never emit them inside a string
497
+ return Number.isNaN(Number.parseFloat(text)) ? fail() : text
498
+ }
499
+ if (text.endsWith('px')) {
500
+ const number = Number(text.slice(0, -2))
501
+ return Number.isFinite(number) ? number : fail()
502
+ }
503
+ const bare = Number(text)
504
+ if (Number.isFinite(bare)) {
505
+ // `0` is valid CSS without a unit; any other bare number is not, and RN's
506
+ // string parser would silently treat it as points
507
+ if (bare === 0) return 0
508
+ errors.push({
509
+ code: 'unitless-transform-value',
510
+ source,
511
+ message: `transform: "${text}" needs a unit (px or %) in "${source}"; a bare number is invalid CSS`,
512
+ })
513
+ return null
514
+ }
515
+ return fail()
516
+
517
+ function fail(): null {
518
+ errors.push({
519
+ code: 'unsupported-transform-unit',
520
+ source,
521
+ message: `transform: "${text}" is not a length native can carry in "${source}"; use px or %`,
522
+ })
523
+ return null
524
+ }
525
+ }
526
+
527
+ /** an angle RN can carry: deg or rad, as a string */
528
+ function readAngle(
529
+ value: string | number,
530
+ source: string,
531
+ errors: TransformDiagnostic[]
532
+ ): string | null {
533
+ if (typeof value === 'number') {
534
+ if (value === 0) return '0deg'
535
+ errors.push({
536
+ code: 'unitless-transform-value',
537
+ source,
538
+ message: `transform: "${source}" needs deg or rad, got the bare number ${value}`,
539
+ })
540
+ return null
541
+ }
542
+ const text = value.trim()
543
+ if (text.endsWith('deg') || text.endsWith('rad')) {
544
+ return Number.isFinite(Number.parseFloat(text)) ? text : angleFail()
545
+ }
546
+ if (Number(text) === 0) return '0deg'
547
+ if (text.endsWith('turn') || text.endsWith('grad')) {
548
+ errors.push({
549
+ code: 'unsupported-transform-unit',
550
+ source,
551
+ message: `transform: "${text}" — RN supports only deg and rad, not ${text.endsWith('turn') ? 'turn' : 'grad'}`,
552
+ })
553
+ return null
554
+ }
555
+ if (Number.isFinite(Number(text))) {
556
+ errors.push({
557
+ code: 'unitless-transform-value',
558
+ source,
559
+ message: `transform: "${source}" needs deg or rad, got "${text}"`,
560
+ })
561
+ return null
562
+ }
563
+ return angleFail()
564
+
565
+ function angleFail(): null {
566
+ errors.push({
567
+ code: 'unsupported-transform-unit',
568
+ source,
569
+ message: `transform: "${text}" is not an angle native can carry in "${source}"`,
570
+ })
571
+ return null
572
+ }
573
+ }
574
+
575
+ function readNumber(
576
+ value: string | number,
577
+ source: string,
578
+ errors: TransformDiagnostic[]
579
+ ): number | null {
580
+ if (typeof value === 'number') return value
581
+ const text = value.trim()
582
+ const number = Number(text)
583
+ if (Number.isFinite(number) && text !== '') return number
584
+ errors.push({
585
+ code: 'unsupported-transform-unit',
586
+ source,
587
+ message: `transform: "${text}" is not a plain number in "${source}"; scale is unitless on native`,
588
+ })
589
+ return null
590
+ }