rnwind 0.0.1 → 0.0.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 (330) hide show
  1. package/lib/cjs/core/parser/animation.cjs +427 -0
  2. package/lib/cjs/core/parser/animation.cjs.map +1 -0
  3. package/lib/cjs/core/parser/animation.d.ts +126 -0
  4. package/lib/cjs/core/parser/border-dispatcher.cjs +180 -0
  5. package/lib/cjs/core/parser/border-dispatcher.cjs.map +1 -0
  6. package/lib/cjs/core/parser/border-dispatcher.d.ts +15 -0
  7. package/lib/cjs/core/parser/case-convert.cjs +15 -0
  8. package/lib/cjs/core/parser/case-convert.cjs.map +1 -0
  9. package/lib/cjs/core/parser/case-convert.d.ts +6 -0
  10. package/lib/cjs/core/parser/color-properties-dispatcher.cjs +84 -0
  11. package/lib/cjs/core/parser/color-properties-dispatcher.cjs.map +1 -0
  12. package/lib/cjs/core/parser/color-properties-dispatcher.d.ts +19 -0
  13. package/lib/cjs/core/parser/color.cjs +164 -0
  14. package/lib/cjs/core/parser/color.cjs.map +1 -0
  15. package/lib/cjs/core/parser/color.d.ts +12 -0
  16. package/lib/cjs/core/parser/constants.cjs +21 -0
  17. package/lib/cjs/core/parser/constants.cjs.map +1 -0
  18. package/lib/cjs/core/parser/constants.d.ts +8 -0
  19. package/lib/cjs/core/parser/declaration.cjs +347 -0
  20. package/lib/cjs/core/parser/declaration.cjs.map +1 -0
  21. package/lib/cjs/core/parser/declaration.d.ts +15 -0
  22. package/lib/cjs/core/parser/gradient.cjs +132 -0
  23. package/lib/cjs/core/parser/gradient.cjs.map +1 -0
  24. package/lib/cjs/core/parser/gradient.d.ts +59 -0
  25. package/lib/cjs/core/parser/haptics.cjs +73 -0
  26. package/lib/cjs/core/parser/haptics.cjs.map +1 -0
  27. package/lib/cjs/core/parser/haptics.d.ts +47 -0
  28. package/lib/cjs/core/parser/index.d.ts +8 -0
  29. package/lib/cjs/core/parser/keyframes.cjs +95 -0
  30. package/lib/cjs/core/parser/keyframes.cjs.map +1 -0
  31. package/lib/cjs/core/parser/keyframes.d.ts +26 -0
  32. package/lib/cjs/core/parser/layout-dispatcher.cjs +100 -0
  33. package/lib/cjs/core/parser/layout-dispatcher.cjs.map +1 -0
  34. package/lib/cjs/core/parser/layout-dispatcher.d.ts +14 -0
  35. package/lib/cjs/core/parser/length.cjs +96 -0
  36. package/lib/cjs/core/parser/length.cjs.map +1 -0
  37. package/lib/cjs/core/parser/length.d.ts +48 -0
  38. package/lib/cjs/core/parser/motion-dispatcher.cjs +77 -0
  39. package/lib/cjs/core/parser/motion-dispatcher.cjs.map +1 -0
  40. package/lib/cjs/core/parser/motion-dispatcher.d.ts +11 -0
  41. package/lib/cjs/core/parser/property.cjs +22 -0
  42. package/lib/cjs/core/parser/property.cjs.map +1 -0
  43. package/lib/cjs/core/parser/property.d.ts +8 -0
  44. package/lib/cjs/core/parser/safe-area.cjs +404 -0
  45. package/lib/cjs/core/parser/safe-area.cjs.map +1 -0
  46. package/lib/cjs/core/parser/safe-area.d.ts +39 -0
  47. package/lib/cjs/core/parser/selector.cjs +22 -0
  48. package/lib/cjs/core/parser/selector.cjs.map +1 -0
  49. package/lib/cjs/core/parser/selector.d.ts +11 -0
  50. package/lib/cjs/core/parser/shorthand.cjs +156 -0
  51. package/lib/cjs/core/parser/shorthand.cjs.map +1 -0
  52. package/lib/cjs/core/parser/shorthand.d.ts +61 -0
  53. package/lib/cjs/core/parser/text-truncate.cjs +78 -0
  54. package/lib/cjs/core/parser/text-truncate.cjs.map +1 -0
  55. package/lib/cjs/core/parser/text-truncate.d.ts +44 -0
  56. package/lib/cjs/core/parser/theme-vars.cjs +414 -0
  57. package/lib/cjs/core/parser/theme-vars.cjs.map +1 -0
  58. package/lib/cjs/core/parser/theme-vars.d.ts +61 -0
  59. package/lib/cjs/core/parser/tokens.cjs +304 -0
  60. package/lib/cjs/core/parser/tokens.cjs.map +1 -0
  61. package/lib/cjs/core/parser/tokens.d.ts +45 -0
  62. package/lib/cjs/core/parser/transform.cjs +198 -0
  63. package/lib/cjs/core/parser/transform.cjs.map +1 -0
  64. package/lib/cjs/core/parser/transform.d.ts +36 -0
  65. package/lib/cjs/core/parser/tw-parser.cjs +1567 -0
  66. package/lib/cjs/core/parser/tw-parser.cjs.map +1 -0
  67. package/lib/cjs/core/parser/tw-parser.d.ts +194 -0
  68. package/lib/cjs/core/parser/types.d.ts +37 -0
  69. package/lib/cjs/core/parser/typography-dispatcher.cjs +93 -0
  70. package/lib/cjs/core/parser/typography-dispatcher.cjs.map +1 -0
  71. package/lib/cjs/core/parser/typography-dispatcher.d.ts +11 -0
  72. package/lib/cjs/core/parser/typography.cjs +97 -0
  73. package/lib/cjs/core/parser/typography.cjs.map +1 -0
  74. package/lib/cjs/core/parser/typography.d.ts +43 -0
  75. package/lib/cjs/core/style-builder/build-style.cjs +397 -0
  76. package/lib/cjs/core/style-builder/build-style.cjs.map +1 -0
  77. package/lib/cjs/core/style-builder/build-style.d.ts +54 -0
  78. package/lib/cjs/core/style-builder/index.d.ts +3 -0
  79. package/lib/cjs/core/style-builder/union-builder.cjs +326 -0
  80. package/lib/cjs/core/style-builder/union-builder.cjs.map +1 -0
  81. package/lib/cjs/core/style-builder/union-builder.d.ts +128 -0
  82. package/lib/cjs/core/types.d.ts +14 -0
  83. package/lib/cjs/metro/dts.cjs +127 -0
  84. package/lib/cjs/metro/dts.cjs.map +1 -0
  85. package/lib/cjs/metro/dts.d.ts +16 -0
  86. package/lib/cjs/metro/index.cjs +19 -0
  87. package/lib/cjs/metro/index.cjs.map +1 -0
  88. package/lib/cjs/metro/index.d.ts +9 -0
  89. package/lib/cjs/metro/resolver.cjs +47 -0
  90. package/lib/cjs/metro/resolver.cjs.map +1 -0
  91. package/lib/cjs/metro/resolver.d.ts +22 -0
  92. package/lib/cjs/metro/state.cjs +251 -0
  93. package/lib/cjs/metro/state.cjs.map +1 -0
  94. package/lib/cjs/metro/state.d.ts +72 -0
  95. package/lib/cjs/metro/transform-ast.cjs +1255 -0
  96. package/lib/cjs/metro/transform-ast.cjs.map +1 -0
  97. package/lib/cjs/metro/transform-ast.d.ts +73 -0
  98. package/lib/cjs/metro/transformer.cjs +345 -0
  99. package/lib/cjs/metro/transformer.cjs.map +1 -0
  100. package/lib/cjs/metro/transformer.d.ts +47 -0
  101. package/lib/cjs/metro/warn-unknown-classes.cjs +86 -0
  102. package/lib/cjs/metro/warn-unknown-classes.cjs.map +1 -0
  103. package/lib/cjs/metro/warn-unknown-classes.d.ts +21 -0
  104. package/lib/cjs/metro/with-config.cjs +196 -0
  105. package/lib/cjs/metro/with-config.cjs.map +1 -0
  106. package/lib/cjs/metro/with-config.d.ts +57 -0
  107. package/lib/cjs/runtime/chain-handlers.cjs +37 -0
  108. package/lib/cjs/runtime/chain-handlers.cjs.map +1 -0
  109. package/lib/cjs/runtime/chain-handlers.d.ts +33 -0
  110. package/lib/cjs/runtime/components/rnwind-provider.cjs +98 -0
  111. package/lib/cjs/runtime/components/rnwind-provider.cjs.map +1 -0
  112. package/lib/cjs/runtime/components/rnwind-provider.d.ts +84 -0
  113. package/lib/cjs/runtime/gradient-types.d.ts +58 -0
  114. package/lib/cjs/runtime/haptics.cjs +113 -0
  115. package/lib/cjs/runtime/haptics.cjs.map +1 -0
  116. package/lib/cjs/runtime/haptics.d.ts +48 -0
  117. package/lib/cjs/runtime/hooks/use-css.cjs +21 -0
  118. package/lib/cjs/runtime/hooks/use-css.cjs.map +1 -0
  119. package/lib/cjs/runtime/hooks/use-css.d.ts +11 -0
  120. package/lib/cjs/runtime/hooks/use-interact.cjs +46 -0
  121. package/lib/cjs/runtime/hooks/use-interact.cjs.map +1 -0
  122. package/lib/cjs/runtime/hooks/use-interact.d.ts +42 -0
  123. package/lib/cjs/runtime/hooks/use-scheme.cjs +68 -0
  124. package/lib/cjs/runtime/hooks/use-scheme.cjs.map +1 -0
  125. package/lib/cjs/runtime/hooks/use-scheme.d.ts +34 -0
  126. package/lib/cjs/runtime/index.cjs +45 -0
  127. package/lib/cjs/runtime/index.cjs.map +1 -0
  128. package/lib/cjs/runtime/index.d.ts +27 -0
  129. package/lib/cjs/runtime/interactive-box.cjs +35 -0
  130. package/lib/cjs/runtime/interactive-box.cjs.map +1 -0
  131. package/lib/cjs/runtime/interactive-box.d.ts +40 -0
  132. package/lib/cjs/runtime/lookup-css.cjs +542 -0
  133. package/lib/cjs/runtime/lookup-css.cjs.map +1 -0
  134. package/lib/cjs/runtime/lookup-css.d.ts +164 -0
  135. package/lib/cjs/runtime/types.d.ts +29 -0
  136. package/lib/cjs/testing/index.cjs +367 -0
  137. package/lib/cjs/testing/index.cjs.map +1 -0
  138. package/lib/cjs/testing/index.d.ts +145 -0
  139. package/lib/esm/core/parser/animation.d.ts +126 -0
  140. package/lib/esm/core/parser/animation.mjs +408 -0
  141. package/lib/esm/core/parser/animation.mjs.map +1 -0
  142. package/lib/esm/core/parser/border-dispatcher.d.ts +15 -0
  143. package/lib/esm/core/parser/border-dispatcher.mjs +178 -0
  144. package/lib/esm/core/parser/border-dispatcher.mjs.map +1 -0
  145. package/lib/esm/core/parser/case-convert.d.ts +6 -0
  146. package/lib/esm/core/parser/case-convert.mjs +13 -0
  147. package/lib/esm/core/parser/case-convert.mjs.map +1 -0
  148. package/lib/esm/core/parser/color-properties-dispatcher.d.ts +19 -0
  149. package/lib/esm/core/parser/color-properties-dispatcher.mjs +82 -0
  150. package/lib/esm/core/parser/color-properties-dispatcher.mjs.map +1 -0
  151. package/lib/esm/core/parser/color.d.ts +12 -0
  152. package/lib/esm/core/parser/color.mjs +162 -0
  153. package/lib/esm/core/parser/color.mjs.map +1 -0
  154. package/lib/esm/core/parser/constants.d.ts +8 -0
  155. package/lib/esm/core/parser/constants.mjs +13 -0
  156. package/lib/esm/core/parser/constants.mjs.map +1 -0
  157. package/lib/esm/core/parser/declaration.d.ts +15 -0
  158. package/lib/esm/core/parser/declaration.mjs +345 -0
  159. package/lib/esm/core/parser/declaration.mjs.map +1 -0
  160. package/lib/esm/core/parser/gradient.d.ts +59 -0
  161. package/lib/esm/core/parser/gradient.mjs +130 -0
  162. package/lib/esm/core/parser/gradient.mjs.map +1 -0
  163. package/lib/esm/core/parser/haptics.d.ts +47 -0
  164. package/lib/esm/core/parser/haptics.mjs +71 -0
  165. package/lib/esm/core/parser/haptics.mjs.map +1 -0
  166. package/lib/esm/core/parser/index.d.ts +8 -0
  167. package/lib/esm/core/parser/keyframes.d.ts +26 -0
  168. package/lib/esm/core/parser/keyframes.mjs +91 -0
  169. package/lib/esm/core/parser/keyframes.mjs.map +1 -0
  170. package/lib/esm/core/parser/layout-dispatcher.d.ts +14 -0
  171. package/lib/esm/core/parser/layout-dispatcher.mjs +98 -0
  172. package/lib/esm/core/parser/layout-dispatcher.mjs.map +1 -0
  173. package/lib/esm/core/parser/length.d.ts +48 -0
  174. package/lib/esm/core/parser/length.mjs +90 -0
  175. package/lib/esm/core/parser/length.mjs.map +1 -0
  176. package/lib/esm/core/parser/motion-dispatcher.d.ts +11 -0
  177. package/lib/esm/core/parser/motion-dispatcher.mjs +75 -0
  178. package/lib/esm/core/parser/motion-dispatcher.mjs.map +1 -0
  179. package/lib/esm/core/parser/property.d.ts +8 -0
  180. package/lib/esm/core/parser/property.mjs +20 -0
  181. package/lib/esm/core/parser/property.mjs.map +1 -0
  182. package/lib/esm/core/parser/safe-area.d.ts +39 -0
  183. package/lib/esm/core/parser/safe-area.mjs +402 -0
  184. package/lib/esm/core/parser/safe-area.mjs.map +1 -0
  185. package/lib/esm/core/parser/selector.d.ts +11 -0
  186. package/lib/esm/core/parser/selector.mjs +20 -0
  187. package/lib/esm/core/parser/selector.mjs.map +1 -0
  188. package/lib/esm/core/parser/shorthand.d.ts +61 -0
  189. package/lib/esm/core/parser/shorthand.mjs +148 -0
  190. package/lib/esm/core/parser/shorthand.mjs.map +1 -0
  191. package/lib/esm/core/parser/text-truncate.d.ts +44 -0
  192. package/lib/esm/core/parser/text-truncate.mjs +75 -0
  193. package/lib/esm/core/parser/text-truncate.mjs.map +1 -0
  194. package/lib/esm/core/parser/theme-vars.d.ts +61 -0
  195. package/lib/esm/core/parser/theme-vars.mjs +409 -0
  196. package/lib/esm/core/parser/theme-vars.mjs.map +1 -0
  197. package/lib/esm/core/parser/tokens.d.ts +45 -0
  198. package/lib/esm/core/parser/tokens.mjs +298 -0
  199. package/lib/esm/core/parser/tokens.mjs.map +1 -0
  200. package/lib/esm/core/parser/transform.d.ts +36 -0
  201. package/lib/esm/core/parser/transform.mjs +193 -0
  202. package/lib/esm/core/parser/transform.mjs.map +1 -0
  203. package/lib/esm/core/parser/tw-parser.d.ts +194 -0
  204. package/lib/esm/core/parser/tw-parser.mjs +1565 -0
  205. package/lib/esm/core/parser/tw-parser.mjs.map +1 -0
  206. package/lib/esm/core/parser/types.d.ts +37 -0
  207. package/lib/esm/core/parser/typography-dispatcher.d.ts +11 -0
  208. package/lib/esm/core/parser/typography-dispatcher.mjs +91 -0
  209. package/lib/esm/core/parser/typography-dispatcher.mjs.map +1 -0
  210. package/lib/esm/core/parser/typography.d.ts +43 -0
  211. package/lib/esm/core/parser/typography.mjs +91 -0
  212. package/lib/esm/core/parser/typography.mjs.map +1 -0
  213. package/lib/esm/core/style-builder/build-style.d.ts +54 -0
  214. package/lib/esm/core/style-builder/build-style.mjs +395 -0
  215. package/lib/esm/core/style-builder/build-style.mjs.map +1 -0
  216. package/lib/esm/core/style-builder/index.d.ts +3 -0
  217. package/lib/esm/core/style-builder/union-builder.d.ts +128 -0
  218. package/lib/esm/core/style-builder/union-builder.mjs +324 -0
  219. package/lib/esm/core/style-builder/union-builder.mjs.map +1 -0
  220. package/lib/esm/core/types.d.ts +14 -0
  221. package/lib/esm/metro/dts.d.ts +16 -0
  222. package/lib/esm/metro/dts.mjs +125 -0
  223. package/lib/esm/metro/dts.mjs.map +1 -0
  224. package/lib/esm/metro/index.d.ts +9 -0
  225. package/lib/esm/metro/index.mjs +6 -0
  226. package/lib/esm/metro/index.mjs.map +1 -0
  227. package/lib/esm/metro/resolver.d.ts +22 -0
  228. package/lib/esm/metro/resolver.mjs +43 -0
  229. package/lib/esm/metro/resolver.mjs.map +1 -0
  230. package/lib/esm/metro/state.d.ts +72 -0
  231. package/lib/esm/metro/state.mjs +243 -0
  232. package/lib/esm/metro/state.mjs.map +1 -0
  233. package/lib/esm/metro/transform-ast.d.ts +73 -0
  234. package/lib/esm/metro/transform-ast.mjs +1234 -0
  235. package/lib/esm/metro/transform-ast.mjs.map +1 -0
  236. package/lib/esm/metro/transformer.d.ts +47 -0
  237. package/lib/esm/metro/transformer.mjs +322 -0
  238. package/lib/esm/metro/transformer.mjs.map +1 -0
  239. package/lib/esm/metro/warn-unknown-classes.d.ts +21 -0
  240. package/lib/esm/metro/warn-unknown-classes.mjs +84 -0
  241. package/lib/esm/metro/warn-unknown-classes.mjs.map +1 -0
  242. package/lib/esm/metro/with-config.d.ts +57 -0
  243. package/lib/esm/metro/with-config.mjs +194 -0
  244. package/lib/esm/metro/with-config.mjs.map +1 -0
  245. package/lib/esm/runtime/chain-handlers.d.ts +33 -0
  246. package/lib/esm/runtime/chain-handlers.mjs +34 -0
  247. package/lib/esm/runtime/chain-handlers.mjs.map +1 -0
  248. package/lib/esm/runtime/components/rnwind-provider.d.ts +84 -0
  249. package/lib/esm/runtime/components/rnwind-provider.mjs +94 -0
  250. package/lib/esm/runtime/components/rnwind-provider.mjs.map +1 -0
  251. package/lib/esm/runtime/gradient-types.d.ts +58 -0
  252. package/lib/esm/runtime/haptics.d.ts +48 -0
  253. package/lib/esm/runtime/haptics.mjs +110 -0
  254. package/lib/esm/runtime/haptics.mjs.map +1 -0
  255. package/lib/esm/runtime/hooks/use-css.d.ts +11 -0
  256. package/lib/esm/runtime/hooks/use-css.mjs +19 -0
  257. package/lib/esm/runtime/hooks/use-css.mjs.map +1 -0
  258. package/lib/esm/runtime/hooks/use-interact.d.ts +42 -0
  259. package/lib/esm/runtime/hooks/use-interact.mjs +44 -0
  260. package/lib/esm/runtime/hooks/use-interact.mjs.map +1 -0
  261. package/lib/esm/runtime/hooks/use-scheme.d.ts +34 -0
  262. package/lib/esm/runtime/hooks/use-scheme.mjs +63 -0
  263. package/lib/esm/runtime/hooks/use-scheme.mjs.map +1 -0
  264. package/lib/esm/runtime/index.d.ts +27 -0
  265. package/lib/esm/runtime/index.mjs +18 -0
  266. package/lib/esm/runtime/index.mjs.map +1 -0
  267. package/lib/esm/runtime/interactive-box.d.ts +40 -0
  268. package/lib/esm/runtime/interactive-box.mjs +33 -0
  269. package/lib/esm/runtime/interactive-box.mjs.map +1 -0
  270. package/lib/esm/runtime/lookup-css.d.ts +164 -0
  271. package/lib/esm/runtime/lookup-css.mjs +531 -0
  272. package/lib/esm/runtime/lookup-css.mjs.map +1 -0
  273. package/lib/esm/runtime/types.d.ts +29 -0
  274. package/lib/esm/testing/index.d.ts +145 -0
  275. package/lib/esm/testing/index.mjs +344 -0
  276. package/lib/esm/testing/index.mjs.map +1 -0
  277. package/package.json +79 -13
  278. package/preset.css +1171 -0
  279. package/src/core/parser/animation.ts +404 -0
  280. package/src/core/parser/border-dispatcher.ts +176 -0
  281. package/src/core/parser/case-convert.ts +10 -0
  282. package/src/core/parser/color-properties-dispatcher.ts +78 -0
  283. package/src/core/parser/color.ts +157 -0
  284. package/src/core/parser/constants.ts +11 -0
  285. package/src/core/parser/declaration.ts +340 -0
  286. package/src/core/parser/gradient.ts +148 -0
  287. package/src/core/parser/haptics.ts +88 -0
  288. package/src/core/parser/index.ts +8 -0
  289. package/src/core/parser/keyframes.ts +84 -0
  290. package/src/core/parser/layout-dispatcher.ts +92 -0
  291. package/src/core/parser/length.ts +100 -0
  292. package/src/core/parser/motion-dispatcher.ts +89 -0
  293. package/src/core/parser/property.ts +15 -0
  294. package/src/core/parser/safe-area.ts +404 -0
  295. package/src/core/parser/selector.ts +17 -0
  296. package/src/core/parser/shorthand.ts +152 -0
  297. package/src/core/parser/text-truncate.ts +79 -0
  298. package/src/core/parser/theme-vars.ts +412 -0
  299. package/src/core/parser/tokens.ts +286 -0
  300. package/src/core/parser/transform.ts +195 -0
  301. package/src/core/parser/tw-parser.ts +1709 -0
  302. package/src/core/parser/types.ts +45 -0
  303. package/src/core/parser/typography-dispatcher.ts +83 -0
  304. package/src/core/parser/typography.ts +83 -0
  305. package/src/core/style-builder/build-style.ts +442 -0
  306. package/src/core/style-builder/index.ts +3 -0
  307. package/src/core/style-builder/union-builder.ts +328 -0
  308. package/src/core/types.ts +15 -0
  309. package/src/metro/dts.ts +128 -0
  310. package/src/metro/index.ts +9 -0
  311. package/src/metro/resolver.ts +42 -0
  312. package/src/metro/state.ts +257 -0
  313. package/src/metro/transform-ast.ts +1498 -0
  314. package/src/metro/transformer.ts +347 -0
  315. package/src/metro/warn-unknown-classes.ts +79 -0
  316. package/src/metro/with-config.ts +229 -0
  317. package/src/runtime/chain-handlers.ts +47 -0
  318. package/src/runtime/components/rnwind-provider.tsx +144 -0
  319. package/src/runtime/gradient-types.ts +60 -0
  320. package/src/runtime/haptics.ts +120 -0
  321. package/src/runtime/hooks/use-css.ts +16 -0
  322. package/src/runtime/hooks/use-interact.ts +65 -0
  323. package/src/runtime/hooks/use-scheme.ts +63 -0
  324. package/src/runtime/index.ts +54 -0
  325. package/src/runtime/interactive-box.tsx +57 -0
  326. package/src/runtime/lookup-css.ts +628 -0
  327. package/src/runtime/types.ts +32 -0
  328. package/src/testing/index.ts +507 -0
  329. package/src/types/tailwindcss-node.d.ts +33 -0
  330. package/src/index.ts +0 -1
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Tiny helpers that compose rnwind's press / focus handlers with any
3
+ * user-provided ones the JSX site already has. The transformer uses
4
+ * these when it rewrites a `<Pressable onPressIn={user}>` into
5
+ * `<Pressable onPressIn={chainPress(user, _i.onPressIn)}>` so the user's
6
+ * callback keeps firing.
7
+ *
8
+ * Both helpers bail out when the user's handler is `null` / `undefined`,
9
+ * returning rnwind's handler directly — that gives the transformer a
10
+ * cheap uniform rewrite ("always chain") without allocating a new
11
+ * function per render when the user didn't opt in to the handler.
12
+ */
13
+ import type { GestureResponderEvent, NativeSyntheticEvent, TargetedEvent } from 'react-native'
14
+
15
+ type PressHandler = (event: GestureResponderEvent) => void
16
+ type FocusHandler = (event: NativeSyntheticEvent<TargetedEvent>) => void
17
+
18
+ /**
19
+ * Compose a user-supplied press handler with rnwind's internal one.
20
+ * User fires first (its return / side-effects happen pre-gate flip); the
21
+ * rnwind handler then updates the active flag.
22
+ * @param user User-supplied handler from the original JSX (optional).
23
+ * @param ours rnwind's internal active-toggling handler.
24
+ * @returns Combined handler, or `ours` directly when the user didn't provide one.
25
+ */
26
+ export function chainPress(user: PressHandler | null | undefined, ours: PressHandler): PressHandler {
27
+ if (user == null) return ours
28
+ return (event: GestureResponderEvent): void => {
29
+ user(event)
30
+ ours(event)
31
+ }
32
+ }
33
+
34
+ /**
35
+ * Compose a user-supplied focus/blur handler with rnwind's internal one.
36
+ * Same ordering rule as {@link chainPress}: user first, rnwind second.
37
+ * @param user User-supplied handler (optional).
38
+ * @param ours rnwind's internal focus-toggling handler.
39
+ * @returns Combined handler, or `ours` directly when the user didn't provide one.
40
+ */
41
+ export function chainFocus(user: FocusHandler | null | undefined, ours: FocusHandler): FocusHandler {
42
+ if (user == null) return ours
43
+ return (event: NativeSyntheticEvent<TargetedEvent>): void => {
44
+ user(event)
45
+ ours(event)
46
+ }
47
+ }
@@ -0,0 +1,144 @@
1
+ import { createContext, useContext, useMemo, type ReactNode } from 'react'
2
+ import { useWindowDimensions } from 'react-native'
3
+ import type { ThemeTables } from '../../core/types'
4
+ import type { Scheme } from '../types'
5
+ import type { OnHaptics } from '../../core/parser/haptics'
6
+ import { activeBreakpointFor, BASE_BREAKPOINT, loadScheme } from '../lookup-css'
7
+
8
+ /**
9
+ * Per-render safe-area insets snapshot. Bridge from any source
10
+ * (`useSafeAreaInsets()`, expo-router insets, a manually computed
11
+ * value) into the {@link RnwindProvider} — rnwind stays
12
+ * library-agnostic.
13
+ */
14
+ export type Insets = Readonly<{
15
+ top: number
16
+ right: number
17
+ bottom: number
18
+ left: number
19
+ }>
20
+
21
+ /**
22
+ * Single value carried by the rnwind context. Every piece of runtime
23
+ * state rnwind needs — scheme, theme tables, insets, font scale,
24
+ * window width, active responsive breakpoint, optional haptic
25
+ * dispatcher — lives on this one bag. Consumers read it via
26
+ * {@link useRnwind} and either destructure or forward straight to
27
+ * `lookupCss` / `useCss`.
28
+ *
29
+ * `activeBreakpoint` is the highest-threshold registered breakpoint
30
+ * whose min-width is `<= windowWidth`, or `'base'` when below the
31
+ * smallest one (mobile-first tier) or when no breakpoints are
32
+ * registered yet (tests, bundles without rnwind-transformed sources).
33
+ * Always a string — never null. Reactive: it updates with
34
+ * `useWindowDimensions().width`, so consumers can branch on it
35
+ * without a separate hook.
36
+ */
37
+ export type RnwindState = Readonly<{
38
+ scheme: Scheme
39
+ tables: ThemeTables
40
+ insets: Insets
41
+ onHaptics: OnHaptics | undefined
42
+ fontScale: number
43
+ windowWidth: number
44
+ activeBreakpoint: string
45
+ }>
46
+
47
+ /** Props accepted by {@link RnwindProvider}. */
48
+ export type RnwindProviderProps = Readonly<{
49
+ scheme: Scheme
50
+ tables?: ThemeTables
51
+ insets?: Partial<Insets>
52
+ onHaptics?: OnHaptics
53
+ children?: ReactNode
54
+ }>
55
+
56
+ const EMPTY_TABLES: ThemeTables = {}
57
+ const ZERO_INSETS: Insets = { top: 0, right: 0, bottom: 0, left: 0 }
58
+ const DEFAULT_STATE: RnwindState = {
59
+ scheme: 'light' as Scheme,
60
+ tables: EMPTY_TABLES,
61
+ insets: ZERO_INSETS,
62
+ onHaptics: undefined,
63
+ fontScale: 1,
64
+ windowWidth: 0,
65
+ activeBreakpoint: BASE_BREAKPOINT,
66
+ }
67
+
68
+ /**
69
+ * Normalise a `Partial<Insets>` into a complete {@link Insets}, returning
70
+ * the shared {@link ZERO_INSETS} reference when nothing is supplied so
71
+ * downstream memoisation stays stable.
72
+ * @param partial Caller-supplied insets (or undefined).
73
+ * @returns Complete insets record.
74
+ */
75
+ function normaliseInsets(partial: Partial<Insets> | undefined): Insets {
76
+ if (!partial) return ZERO_INSETS
77
+ const top = partial.top ?? 0
78
+ const right = partial.right ?? 0
79
+ const bottom = partial.bottom ?? 0
80
+ const left = partial.left ?? 0
81
+ if (top === 0 && right === 0 && bottom === 0 && left === 0) return ZERO_INSETS
82
+ return { top, right, bottom, left }
83
+ }
84
+
85
+ /** Single internal context the runtime reads from. */
86
+ const RnwindContext = createContext<RnwindState>(DEFAULT_STATE)
87
+
88
+ /**
89
+ * Read rnwind's full runtime state — scheme, theme tables, insets,
90
+ * fontScale, windowWidth, onHaptics — in one go. Pass the returned
91
+ * value straight to `lookupCss` / `useCss`, or destructure what you
92
+ * need.
93
+ * @returns Active rnwind state under the nearest {@link RnwindProvider}.
94
+ */
95
+ export function useRnwind(): RnwindState {
96
+ return useContext(RnwindContext)
97
+ }
98
+
99
+ /**
100
+ * Internal context hook the babel transformer injects at the top of
101
+ * every rewritten component as `const _t = useR_()`. Same body as the
102
+ * public {@link useRnwind} — exposed under a `use*`-prefixed name so
103
+ * react-refresh's babel plugin (which only tracks call-sites whose
104
+ * identifier matches `^use[A-Z]`) folds it into each component's
105
+ * fast-refresh signature. Without that prefix the signature stayed
106
+ * stable across transformer changes; HMR then preserved fiber state
107
+ * while the rendered hook list shifted, surfacing as "change in the
108
+ * order of Hooks" runtime errors. Trailing underscore keeps it
109
+ * visually distinct from the user-facing `useRnwind`.
110
+ * @returns Active rnwind state.
111
+ */
112
+ export function useR_(): RnwindState {
113
+ return useContext(RnwindContext)
114
+ }
115
+
116
+ /**
117
+ * Provider for rnwind's full runtime state. fontScale + windowWidth
118
+ * come from `useWindowDimensions()` so they react to OS-level
119
+ * orientation / accessibility-text-size changes automatically.
120
+ * @param props Provider props.
121
+ * @param props.scheme Active scheme name.
122
+ * @param props.tables Optional pre-resolved token tables.
123
+ * @param props.insets Optional safe-area insets.
124
+ * @param props.onHaptics Optional haptic dispatcher.
125
+ * @param props.children React subtree.
126
+ * @returns Provider element.
127
+ */
128
+ export function RnwindProvider({ scheme, tables, insets, onHaptics, children }: RnwindProviderProps): ReactNode {
129
+ const normalized = normaliseInsets(insets)
130
+ const { fontScale, width } = useWindowDimensions()
131
+ const value = useMemo<RnwindState>(() => {
132
+ loadScheme(scheme)
133
+ return {
134
+ scheme,
135
+ tables: tables ?? EMPTY_TABLES,
136
+ insets: normalized,
137
+ onHaptics,
138
+ fontScale,
139
+ windowWidth: width,
140
+ activeBreakpoint: activeBreakpointFor(width),
141
+ }
142
+ }, [scheme, tables, normalized, onHaptics, fontScale, width])
143
+ return <RnwindContext.Provider value={value}>{children}</RnwindContext.Provider>
144
+ }
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Typed contract for the component rnwind's transformer calls with a
3
+ * gradient-class `className`. Matches `expo-linear-gradient` verbatim
4
+ * so users can plug any gradient library that mirrors that API.
5
+ *
6
+ * A typical wiring:
7
+ *
8
+ * ```tsx
9
+ * import { LinearGradient } from 'expo-linear-gradient'
10
+ * import type { AsLinearGradientProps } from 'rnwind'
11
+ *
12
+ * // Assert at the type level — CI catches mismatches before runtime.
13
+ * const _typeCheck: AsLinearGradientProps = {} as Parameters<typeof LinearGradient>[0]
14
+ *
15
+ * // Then use it in real JSX. rnwind fills in colors / start / end.
16
+ * <LinearGradient className="bg-gradient-to-r from-red-500 to-blue-500" />
17
+ * ```
18
+ *
19
+ * The rnwind transformer emits `colors` as a frozen `readonly string[]`,
20
+ * and `start` / `end` as frozen `{x: number, y: number}` records.
21
+ * Users pass the component; rnwind fills the props. Unused props
22
+ * (`locations`, `dither`, …) are forwarded verbatim from the JSX site.
23
+ */
24
+
25
+ /** A unit-square point. Matches the `LinearGradientPoint` object form. */
26
+ export interface LinearGradientPoint {
27
+ /** Horizontal component, 0..1. */
28
+ readonly x: number
29
+ /** Vertical component, 0..1. */
30
+ readonly y: number
31
+ }
32
+
33
+ /**
34
+ * The exact prop shape rnwind fills onto a gradient component at
35
+ * build time. A user-supplied `<LinearGradient>` (or any other
36
+ * component) must accept these props — no wrapper, no adapter.
37
+ */
38
+ export interface AsLinearGradientProps {
39
+ /**
40
+ * Gradient colour stops in source order. rnwind emits a frozen
41
+ * `readonly string[]` with 2+ entries (at least `from` + `to`).
42
+ * Compatible with expo-linear-gradient's `colors: readonly [ColorValue, ColorValue, ...ColorValue[]]`.
43
+ */
44
+ readonly colors: readonly string[]
45
+ /**
46
+ * Start point, in the unit square (0,0)=top-left → (1,1)=bottom-right.
47
+ * rnwind emits a frozen `{x, y}` record matching the Tailwind
48
+ * direction utility (`to-r` → `{x: 0, y: 0.5}`).
49
+ */
50
+ readonly start: LinearGradientPoint
51
+ /** End point — same unit-square coordinates as `start`. */
52
+ readonly end: LinearGradientPoint
53
+ /**
54
+ * Optional colour-stop positions matching `colors` length. rnwind
55
+ * doesn't emit this today (Tailwind v4's stop-position atoms aren't
56
+ * wired yet); listed here so the prop surface still matches
57
+ * expo-linear-gradient when a consumer passes their own.
58
+ */
59
+ readonly locations?: readonly number[] | null
60
+ }
@@ -0,0 +1,120 @@
1
+ /**
2
+ * Runtime helpers the transformer injects for haptic utilities.
3
+ *
4
+ * Two entry points:
5
+ *
6
+ * useMountHaptic(requests) — fires each request on mount via
7
+ * `useEffect(() => { ... }, [])`. Used by the transformer for bare
8
+ * `haptic-*` atoms (no variant prefix).
9
+ *
10
+ * triggerHaptic(onHaptics, request, trigger) — thin forwarding
11
+ * helper for event-driven variants (`active:haptic-*`, `focus:...`,
12
+ * `hover:...`). The transformer emits an inline arrow that calls
13
+ * this from `onPressIn` / `onFocus` / etc.
14
+ *
15
+ * Both emit a one-shot dev-mode warning when `onHaptics` is missing —
16
+ * so developers get a clear "you forgot to wire <SchemeProvider
17
+ * onHaptics=...>" signal instead of silently dropping the haptic.
18
+ */
19
+
20
+ import { useEffect } from 'react'
21
+ import type { HapticRequest, HapticTrigger, OnHaptics } from '../core/parser/haptics'
22
+ import { useRnwind } from './components/rnwind-provider'
23
+
24
+ /**
25
+ * Module-scope set tracking haptic trigger strings we've already
26
+ * warned about. Prevents the "missing onHaptics" warning from
27
+ * spamming the console when the same class appears on many elements.
28
+ */
29
+ const WARNED_MISSING_HAPTICS = new Set<string>()
30
+
31
+ /**
32
+ * Render a `HapticRequest` as a short descriptive tag for log lines.
33
+ * @param request Haptic request.
34
+ * @returns `impact/Light`, `notification/Success`, or `selection`.
35
+ */
36
+ function hapticTag(request: HapticRequest): string {
37
+ if (request.kind === 'impact') return `impact/${request.style}`
38
+ if (request.kind === 'notification') return `notification/${request.type}`
39
+ return 'selection'
40
+ }
41
+
42
+ /**
43
+ * Warn once per haptic trigger kind when a `haptic-*` atom tries to
44
+ * dispatch without an `onHaptics` provider. Dev-mode only — `__DEV__`
45
+ * is a Metro / Expo / RN global that compiles to `false` in release
46
+ * bundles, so no warn code ships to production.
47
+ * @param request The haptic request that had no provider.
48
+ * @param trigger The lifecycle trigger that tried to fire.
49
+ */
50
+ function warnMissingOnHaptics(request: HapticRequest, trigger: HapticTrigger): void {
51
+ // `__DEV__` is a RN / Metro global — `false` in release, strips the
52
+ // branch entirely. Guarded in case we're evaluated outside of Metro
53
+ // (tests, node scripts) where the global isn't defined.
54
+ const isDevelopment = typeof __DEV__ === 'undefined' || __DEV__
55
+ if (!isDevelopment) return
56
+ const tag = hapticTag(request)
57
+ const key = `${tag}@${trigger}`
58
+ if (WARNED_MISSING_HAPTICS.has(key)) return
59
+ WARNED_MISSING_HAPTICS.add(key)
60
+ // eslint-disable-next-line no-console
61
+ console.warn(
62
+ `rnwind: a haptic utility fired (${tag}, trigger=${trigger}) but no onHaptics callback is wired on <SchemeProvider>. ` +
63
+ `Pass \`onHaptics\` on the provider to forward this to expo-haptics (or any library of your choice).`,
64
+ )
65
+ }
66
+
67
+ /**
68
+ * Test-only hook — clears the warned-haptics set so successive test
69
+ * runs don't silently swallow their own warnings.
70
+ */
71
+ function __resetHapticWarnings(): void {
72
+ WARNED_MISSING_HAPTICS.clear()
73
+ }
74
+
75
+ /**
76
+ * Invoke every request in `requests` on mount (once per component
77
+ * mount), using the `onHaptics` dispatcher from the nearest
78
+ * `<SchemeProvider>`. Missing-provider dev warnings fire via
79
+ * {@link warnMissingOnHaptics}.
80
+ *
81
+ * Uses `useEffect(..., [])` — the requests array is identity-stable
82
+ * (hoisted at module scope by the transformer), so re-firing on
83
+ * re-renders isn't a concern.
84
+ * @param requests Hoisted request list for this component.
85
+ */
86
+ function useMountHaptic(requests: readonly HapticRequest[]): void {
87
+ const { onHaptics } = useRnwind()
88
+
89
+ useEffect(() => {
90
+ for (const request of requests) {
91
+ if (onHaptics) onHaptics(request, 'mount')
92
+ else warnMissingOnHaptics(request, 'mount')
93
+ }
94
+ // requests is a hoisted stable reference — depending on onHaptics
95
+ // identity keeps the effect fresh if the provider remounts with a
96
+ // different dispatcher, while the hoisted const prevents a remount
97
+ // from an inline `onHaptics={(r) => ...}`.
98
+ // eslint-disable-next-line react-hooks/exhaustive-deps
99
+ }, [onHaptics])
100
+ }
101
+
102
+ /**
103
+ * Fire one haptic request through the provider dispatcher. Emits the
104
+ * missing-provider dev warning when no dispatcher is wired. Designed
105
+ * for the inline arrows the transformer synthesises:
106
+ *
107
+ * onPressIn={(e) => { triggerHaptic(_h, _HR_xxx, 'pressIn'); user?.(e) }}
108
+ * @param onHaptics Provider dispatcher (may be undefined).
109
+ * @param request Pre-hoisted request object.
110
+ * @param trigger Lifecycle trigger.
111
+ */
112
+ function triggerHaptic(onHaptics: OnHaptics | undefined, request: HapticRequest, trigger: HapticTrigger): void {
113
+ if (onHaptics) {
114
+ onHaptics(request, trigger)
115
+ return
116
+ }
117
+ warnMissingOnHaptics(request, trigger)
118
+ }
119
+
120
+ export { useMountHaptic, triggerHaptic, __resetHapticWarnings }
@@ -0,0 +1,16 @@
1
+ import { useRnwind } from '../components/rnwind-provider'
2
+ import { lookupCss } from '../lookup-css'
3
+
4
+ /**
5
+ * Convenience hook: `useRnwind()` + `lookupCss()` rolled into one. Use
6
+ * inside any component that wants the resolved style array without
7
+ * threading the rnwind context manually. JSX-heavy components should
8
+ * still call `useRnwind()` once and pass it to `lookupCss(...)` per
9
+ * element so React only does a single context read per render.
10
+ * @param className Raw className string or transformer-hoisted atom-name array.
11
+ * @param userStyle Optional caller-supplied style appended last.
12
+ * @returns Frozen style array for React Native's `style` prop.
13
+ */
14
+ export function useCss(className?: string | readonly string[] | null, userStyle?: unknown): readonly unknown[] {
15
+ return lookupCss(className, useRnwind(), userStyle)
16
+ }
@@ -0,0 +1,65 @@
1
+ import { useCallback, useMemo, useState } from 'react'
2
+ import type { GestureResponderEvent, NativeSyntheticEvent, TargetedEvent } from 'react-native'
3
+ import type { InteractState } from '../lookup-css'
4
+
5
+ /**
6
+ * Idle state reference reused across every non-interactive render —
7
+ * when neither `active` nor `focus` is true, every call site returns
8
+ * the exact same object. That's the ~99 % path for a typical list row,
9
+ * so sharing the ref is a legitimate allocation elimination.
10
+ */
11
+ const IDLE_STATE: InteractState = { active: false, focus: false }
12
+
13
+ /**
14
+ * Live interact-state snapshot plus the press/focus handlers the
15
+ * transformer wires onto the JSX opening element. The state object is
16
+ * referentially stable across renders when the underlying `active` /
17
+ * `focus` flags don't change, which keeps `lookupCss` cache hits
18
+ * aligned with React's render cadence (same state ref → same
19
+ * resolved-array cache key → same reference back, no React diff
20
+ * triggered).
21
+ */
22
+ export interface UseInteractResult {
23
+ /** Current interact flags — forwarded as the 4th arg to `lookupCss`. */
24
+ state: InteractState
25
+ /** Wired by the transformer onto `<Pressable onPressIn={…}>` etc. */
26
+ onPressIn: (event: GestureResponderEvent) => void
27
+ /** Wired by the transformer onto `<Pressable onPressOut={…}>` etc. */
28
+ onPressOut: (event: GestureResponderEvent) => void
29
+ /** Wired by the transformer onto `<TextInput onFocus={…}>` etc. */
30
+ onFocus: (event: NativeSyntheticEvent<TargetedEvent>) => void
31
+ /** Wired by the transformer onto `<TextInput onBlur={…}>` etc. */
32
+ onBlur: (event: NativeSyntheticEvent<TargetedEvent>) => void
33
+ }
34
+
35
+ /**
36
+ * React hook driving `active:` / `focus:` variants at runtime. The
37
+ * transformer injects exactly one call per JSX element that uses an
38
+ * interactive classname, caching the hook's result into a component-
39
+ * local `_i` binding so every `lookupCss(…, _i.state)` site shares the
40
+ * same snapshot per render.
41
+ *
42
+ * React Native's `Pressable` fires `onPressIn` / `onPressOut` on touch
43
+ * down / release — the touch-device analogue of CSS `:active`. Text
44
+ * fields use `onFocus` / `onBlur`. Both pairs drive `useState` Booleans;
45
+ * unused handlers on elements that don't emit the corresponding event
46
+ * are harmless no-ops.
47
+ *
48
+ * Result stability: both `state` and the returned wrapper object stay
49
+ * reference-equal across renders unless `active` / `focus` actually
50
+ * flip. Downstream `React.memo` + `lookupCss` caches hit on equal refs.
51
+ * @returns Stable state + handler bundle.
52
+ */
53
+ export function useInteract(): UseInteractResult {
54
+ const [active, setActive] = useState(false)
55
+ const [focus, setFocus] = useState(false)
56
+ const onPressIn = useCallback(() => setActive(true), [])
57
+ const onPressOut = useCallback(() => setActive(false), [])
58
+ const onFocus = useCallback(() => setFocus(true), [])
59
+ const onBlur = useCallback(() => setFocus(false), [])
60
+ const state = useMemo<InteractState>(() => {
61
+ if (!active && !focus) return IDLE_STATE
62
+ return { active, focus }
63
+ }, [active, focus])
64
+ return useMemo(() => ({ state, onPressIn, onPressOut, onFocus, onBlur }), [state, onPressIn, onPressOut, onFocus, onBlur])
65
+ }
@@ -0,0 +1,63 @@
1
+ import type { ThemeTable } from '../../core/types'
2
+ import { useRnwind } from '../components/rnwind-provider'
3
+
4
+ /**
5
+ * Synthetic scheme name applied when tokens aren't declared under any
6
+ * `@variant` block — the "no active variant" fallback every theme table
7
+ * inherits from.
8
+ */
9
+ const BASE_SCHEME = 'base'
10
+
11
+ /**
12
+ * Access the resolved theme table for the active scheme.
13
+ *
14
+ * Tokens declared outside any `@variant` block live in the `base` table and
15
+ * should apply everywhere — just like the CSS cascade treats `:root` as a
16
+ * default for every ancestor-scoped override. We merge `base` under the
17
+ * active scheme so a scheme that doesn't declare a token still sees the
18
+ * base default, while the scheme's own entries win on overlap.
19
+ * @returns Token table for the active scheme.
20
+ */
21
+ export function useTheme(): ThemeTable {
22
+ const { scheme, tables } = useRnwind()
23
+ const base = tables[BASE_SCHEME] ?? {}
24
+ const schemeTable = tables[scheme]
25
+ if (!schemeTable) return base
26
+ // Fast path: nothing to merge when the scheme table is empty.
27
+ if (Object.keys(schemeTable).length === 0) return base
28
+ return { ...base, ...schemeTable }
29
+ }
30
+
31
+ /**
32
+ * Read a raw CSS custom property's value for the active scheme. Accepts
33
+ * either `--foo` or the bare `foo` form for convenience.
34
+ * @param cssVariable CSS custom property name (with or without the leading `--`).
35
+ * @returns The resolved value, or undefined when the token is missing.
36
+ */
37
+ export function useToken(cssVariable: string): string | number | undefined {
38
+ const table = useTheme()
39
+ const name = cssVariable.startsWith('--') ? cssVariable : `--${cssVariable}`
40
+ return table[name]
41
+ }
42
+
43
+ /**
44
+ * Read a color token by shorthand name — `useColor('primary')` resolves
45
+ * `--color-primary` for the active scheme.
46
+ * @param name Token suffix after `--color-`.
47
+ * @returns Resolved color string, or undefined when the token is missing
48
+ * or its value isn't a string.
49
+ */
50
+ export function useColor(name: string): string | undefined {
51
+ const value = useToken(`--color-${name}`)
52
+ return typeof value === 'string' ? value : undefined
53
+ }
54
+
55
+ /**
56
+ * Read a spacing token by shorthand name — `useSize('4')` resolves
57
+ * `--spacing-4` for the active scheme.
58
+ * @param name Token suffix after `--spacing-`.
59
+ * @returns Resolved spacing value, or undefined when the token is missing.
60
+ */
61
+ export function useSize(name: string): number | string | undefined {
62
+ return useToken(`--spacing-${name}`)
63
+ }
@@ -0,0 +1,54 @@
1
+
2
+
3
+
4
+
5
+ export {
6
+ lookupCss,
7
+ registerAtoms,
8
+ registerBreakpoints,
9
+ registerSchemeLoader,
10
+ setWindowHeightProvider,
11
+ getBreakpoints,
12
+ activeBreakpointFor,
13
+ lookupCss as _l,
14
+ } from './lookup-css'
15
+ export { useR_ } from './components/rnwind-provider'
16
+ export type { HoistedClassName, InteractState, LookupInsets, SafeMarkerSpec } from './lookup-css'
17
+ export { useCss } from './hooks/use-css'
18
+ export { useInteract } from './hooks/use-interact'
19
+ export type { UseInteractResult } from './hooks/use-interact'
20
+ export { chainPress, chainFocus } from './chain-handlers'
21
+ export { InteractiveBox, InteractiveBox as _ib } from './interactive-box'
22
+ export type { InteractiveBoxProps, InteractiveSpec } from './interactive-box'
23
+ export { RnwindProvider, useRnwind } from './components/rnwind-provider'
24
+ export type { RnwindProviderProps, RnwindState, Insets } from './components/rnwind-provider'
25
+ export { useMountHaptic, triggerHaptic, triggerHaptic as _ht, useMountHaptic as _hm } from './haptics'
26
+
27
+ // ──────────────────────────────────────────────────────────────────────
28
+ // Internal aliases the babel transformer uses. Underscore-prefixed so
29
+ // user code (which imports the public names above) can never collide
30
+ // with what we inject at JSX sites — even if the user shadows
31
+ // `lookupCss` / `useHaptics` / `InteractiveBox` with a local symbol,
32
+ // the transformer's emitted code still references the private alias.
33
+ // Don't import these in app code.
34
+ // ──────────────────────────────────────────────────────────────────────
35
+ /** @internal */
36
+
37
+ /** @internal */
38
+
39
+ /** @internal */
40
+
41
+ /** @internal */
42
+
43
+ export type { HapticRequest, HapticTrigger, OnHaptics } from '../core/parser/haptics'
44
+ export type { AsLinearGradientProps, LinearGradientPoint } from './gradient-types'
45
+ export type { ThemeTable, ThemeTables } from '../core/types'
46
+ export { useTheme, useToken, useColor, useSize } from './hooks/use-scheme'
47
+ export type { Scheme, RnwindConfig } from './types'
48
+
49
+ /**
50
+ * Installed rnwind version, inlined at publish time. Compare against a pinned
51
+ * string when integrating with build tooling that may see multiple rnwind
52
+ * copies (e.g. workspace overrides).
53
+ */
54
+ export const VERSION = '0.0.1' as const
@@ -0,0 +1,57 @@
1
+ import { createElement, type ComponentType, type ElementType, type ReactElement } from 'react'
2
+ import { chainFocus, chainPress } from './chain-handlers'
3
+ import { useInteract } from './hooks/use-interact'
4
+ import { lookupCss, type HoistedClassName } from './lookup-css'
5
+ import type { RnwindState } from './components/rnwind-provider'
6
+
7
+ /**
8
+ * Per-element "interactive" spec the transformer packs into the `_rw`
9
+ * prop on every JSX site it rewrites for active/focus support. Carrying
10
+ * it as one object prop (rather than four sibling props) keeps the
11
+ * rewritten JSX legible and avoids colliding with any host component's
12
+ * own naming.
13
+ */
14
+ export interface InteractiveSpec {
15
+ /** The original JSX tag (`Pressable`, `TextInput`, `Animated.View`, …). */
16
+ readonly as: ElementType
17
+ /** Hoisted atom-name array (or a dynamic classname string). */
18
+ readonly cn: HoistedClassName | string | null | undefined
19
+ /** Full rnwind context — `_t = useRnwind___()` from the call site. */
20
+ readonly t: RnwindState
21
+ /** Optional caller-supplied style forwarded as `lookupCss`'s 3rd arg. */
22
+ readonly us?: unknown
23
+ }
24
+
25
+ /** Props InteractiveBox accepts — `_rw` plus anything to forward. */
26
+ export interface InteractiveBoxProps {
27
+ /** Compile-time spec packed by the transformer. */
28
+ readonly _rw: InteractiveSpec
29
+ /** Every other prop passes through to the inner component. */
30
+ readonly [key: string]: unknown
31
+ }
32
+
33
+ /**
34
+ * Per-instance wrapper that drives `active:` / `focus:` variants. One
35
+ * `useInteract()` hook per mounted `InteractiveBox` means each element
36
+ * owns its own state — siblings never share `active` / `focus` flags.
37
+ *
38
+ * The transformer replaces
39
+ * `<Pressable className="active:bg-sky-700" onPress={x} />`
40
+ * with
41
+ * `<InteractiveBox _rw={{as: Pressable, cn: _c0, t: _t}} onPress={x} />`.
42
+ * @param props `_rw` spec + any props to forward to the inner component.
43
+ * @returns Rendered element of the inner component with interact wiring.
44
+ */
45
+ export function InteractiveBox(props: InteractiveBoxProps): ReactElement {
46
+ const { _rw, onPressIn, onPressOut, onFocus, onBlur, ...rest } = props
47
+ const interact = useInteract()
48
+ const merged: Record<string, unknown> = {
49
+ ...rest,
50
+ style: lookupCss(_rw.cn, _rw.t, _rw.us, interact.state),
51
+ onPressIn: chainPress(onPressIn as Parameters<typeof chainPress>[0], interact.onPressIn),
52
+ onPressOut: chainPress(onPressOut as Parameters<typeof chainPress>[0], interact.onPressOut),
53
+ onFocus: chainFocus(onFocus as Parameters<typeof chainFocus>[0], interact.onFocus),
54
+ onBlur: chainFocus(onBlur as Parameters<typeof chainFocus>[0], interact.onBlur),
55
+ }
56
+ return createElement(_rw.as as ComponentType<Record<string, unknown>>, merged)
57
+ }