@effect-tui/react 0.1.0-alpha.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 (277) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +138 -0
  3. package/dist/jsx-dev-runtime.d.ts +3 -0
  4. package/dist/jsx-dev-runtime.d.ts.map +1 -0
  5. package/dist/jsx-dev-runtime.js +3 -0
  6. package/dist/jsx-dev-runtime.js.map +1 -0
  7. package/dist/jsx-runtime.d.ts +47 -0
  8. package/dist/jsx-runtime.d.ts.map +1 -0
  9. package/dist/jsx-runtime.js +6 -0
  10. package/dist/jsx-runtime.js.map +1 -0
  11. package/dist/src/codeblock.d.ts +9 -0
  12. package/dist/src/codeblock.d.ts.map +1 -0
  13. package/dist/src/codeblock.js +24 -0
  14. package/dist/src/codeblock.js.map +1 -0
  15. package/dist/src/constants.d.ts +3 -0
  16. package/dist/src/constants.d.ts.map +1 -0
  17. package/dist/src/constants.js +3 -0
  18. package/dist/src/constants.js.map +1 -0
  19. package/dist/src/debug/DiagnosticsPanel.d.ts +7 -0
  20. package/dist/src/debug/DiagnosticsPanel.d.ts.map +1 -0
  21. package/dist/src/debug/DiagnosticsPanel.js +13 -0
  22. package/dist/src/debug/DiagnosticsPanel.js.map +1 -0
  23. package/dist/src/highlight.d.ts +20 -0
  24. package/dist/src/highlight.d.ts.map +1 -0
  25. package/dist/src/highlight.js +51 -0
  26. package/dist/src/highlight.js.map +1 -0
  27. package/dist/src/hooks/index.d.ts +4 -0
  28. package/dist/src/hooks/index.d.ts.map +1 -0
  29. package/dist/src/hooks/index.js +3 -0
  30. package/dist/src/hooks/index.js.map +1 -0
  31. package/dist/src/hooks/use-keyboard.d.ts +18 -0
  32. package/dist/src/hooks/use-keyboard.d.ts.map +1 -0
  33. package/dist/src/hooks/use-keyboard.js +26 -0
  34. package/dist/src/hooks/use-keyboard.js.map +1 -0
  35. package/dist/src/hooks/use-paste.d.ts +5 -0
  36. package/dist/src/hooks/use-paste.d.ts.map +1 -0
  37. package/dist/src/hooks/use-paste.js +14 -0
  38. package/dist/src/hooks/use-paste.js.map +1 -0
  39. package/dist/src/hooks/useFrameStats.d.ts +7 -0
  40. package/dist/src/hooks/useFrameStats.d.ts.map +1 -0
  41. package/dist/src/hooks/useFrameStats.js +28 -0
  42. package/dist/src/hooks/useFrameStats.js.map +1 -0
  43. package/dist/src/hosts/base.d.ts +22 -0
  44. package/dist/src/hosts/base.d.ts.map +1 -0
  45. package/dist/src/hosts/base.js +53 -0
  46. package/dist/src/hosts/base.js.map +1 -0
  47. package/dist/src/hosts/box.d.ts +26 -0
  48. package/dist/src/hosts/box.d.ts.map +1 -0
  49. package/dist/src/hosts/box.js +84 -0
  50. package/dist/src/hosts/box.js.map +1 -0
  51. package/dist/src/hosts/canvas.d.ts +48 -0
  52. package/dist/src/hosts/canvas.d.ts.map +1 -0
  53. package/dist/src/hosts/canvas.js +109 -0
  54. package/dist/src/hosts/canvas.js.map +1 -0
  55. package/dist/src/hosts/codeblock.d.ts +32 -0
  56. package/dist/src/hosts/codeblock.d.ts.map +1 -0
  57. package/dist/src/hosts/codeblock.js +118 -0
  58. package/dist/src/hosts/codeblock.js.map +1 -0
  59. package/dist/src/hosts/hstack.d.ts +18 -0
  60. package/dist/src/hosts/hstack.d.ts.map +1 -0
  61. package/dist/src/hosts/hstack.js +45 -0
  62. package/dist/src/hosts/hstack.js.map +1 -0
  63. package/dist/src/hosts/index.d.ts +16 -0
  64. package/dist/src/hosts/index.d.ts.map +1 -0
  65. package/dist/src/hosts/index.js +40 -0
  66. package/dist/src/hosts/index.js.map +1 -0
  67. package/dist/src/hosts/spacer.d.ts +19 -0
  68. package/dist/src/hosts/spacer.d.ts.map +1 -0
  69. package/dist/src/hosts/spacer.js +28 -0
  70. package/dist/src/hosts/spacer.js.map +1 -0
  71. package/dist/src/hosts/text.d.ts +43 -0
  72. package/dist/src/hosts/text.d.ts.map +1 -0
  73. package/dist/src/hosts/text.js +148 -0
  74. package/dist/src/hosts/text.js.map +1 -0
  75. package/dist/src/hosts/vstack.d.ts +18 -0
  76. package/dist/src/hosts/vstack.d.ts.map +1 -0
  77. package/dist/src/hosts/vstack.js +45 -0
  78. package/dist/src/hosts/vstack.js.map +1 -0
  79. package/dist/src/hosts/zstack.d.ts +20 -0
  80. package/dist/src/hosts/zstack.d.ts.map +1 -0
  81. package/dist/src/hosts/zstack.js +65 -0
  82. package/dist/src/hosts/zstack.js.map +1 -0
  83. package/dist/src/index.d.ts +20 -0
  84. package/dist/src/index.d.ts.map +1 -0
  85. package/dist/src/index.js +20 -0
  86. package/dist/src/index.js.map +1 -0
  87. package/dist/src/inline/index.d.ts +32 -0
  88. package/dist/src/inline/index.d.ts.map +1 -0
  89. package/dist/src/inline/index.js +111 -0
  90. package/dist/src/inline/index.js.map +1 -0
  91. package/dist/src/jsx.d.ts +2 -0
  92. package/dist/src/jsx.d.ts.map +1 -0
  93. package/dist/src/jsx.js +4 -0
  94. package/dist/src/jsx.js.map +1 -0
  95. package/dist/src/motion/color-motion-value.d.ts +32 -0
  96. package/dist/src/motion/color-motion-value.d.ts.map +1 -0
  97. package/dist/src/motion/color-motion-value.js +80 -0
  98. package/dist/src/motion/color-motion-value.js.map +1 -0
  99. package/dist/src/motion/color.d.ts +30 -0
  100. package/dist/src/motion/color.d.ts.map +1 -0
  101. package/dist/src/motion/color.js +172 -0
  102. package/dist/src/motion/color.js.map +1 -0
  103. package/dist/src/motion/color.test.d.ts +2 -0
  104. package/dist/src/motion/color.test.d.ts.map +1 -0
  105. package/dist/src/motion/color.test.js +97 -0
  106. package/dist/src/motion/color.test.js.map +1 -0
  107. package/dist/src/motion/event-emitter.d.ts +18 -0
  108. package/dist/src/motion/event-emitter.d.ts.map +1 -0
  109. package/dist/src/motion/event-emitter.js +30 -0
  110. package/dist/src/motion/event-emitter.js.map +1 -0
  111. package/dist/src/motion/frame.d.ts +9 -0
  112. package/dist/src/motion/frame.d.ts.map +1 -0
  113. package/dist/src/motion/frame.js +51 -0
  114. package/dist/src/motion/frame.js.map +1 -0
  115. package/dist/src/motion/hooks.d.ts +75 -0
  116. package/dist/src/motion/hooks.d.ts.map +1 -0
  117. package/dist/src/motion/hooks.js +190 -0
  118. package/dist/src/motion/hooks.js.map +1 -0
  119. package/dist/src/motion/index.d.ts +4 -0
  120. package/dist/src/motion/index.d.ts.map +1 -0
  121. package/dist/src/motion/index.js +7 -0
  122. package/dist/src/motion/index.js.map +1 -0
  123. package/dist/src/motion/motion-value.d.ts +40 -0
  124. package/dist/src/motion/motion-value.d.ts.map +1 -0
  125. package/dist/src/motion/motion-value.js +109 -0
  126. package/dist/src/motion/motion-value.js.map +1 -0
  127. package/dist/src/motion/motion-value.test.d.ts +2 -0
  128. package/dist/src/motion/motion-value.test.d.ts.map +1 -0
  129. package/dist/src/motion/motion-value.test.js +177 -0
  130. package/dist/src/motion/motion-value.test.js.map +1 -0
  131. package/dist/src/motion/spring-math.d.ts +28 -0
  132. package/dist/src/motion/spring-math.d.ts.map +1 -0
  133. package/dist/src/motion/spring-math.js +81 -0
  134. package/dist/src/motion/spring-math.js.map +1 -0
  135. package/dist/src/motion/types.d.ts +25 -0
  136. package/dist/src/motion/types.d.ts.map +1 -0
  137. package/dist/src/motion/types.js +13 -0
  138. package/dist/src/motion/types.js.map +1 -0
  139. package/dist/src/output.d.ts +47 -0
  140. package/dist/src/output.d.ts.map +1 -0
  141. package/dist/src/output.js +125 -0
  142. package/dist/src/output.js.map +1 -0
  143. package/dist/src/profiler.d.ts +6 -0
  144. package/dist/src/profiler.d.ts.map +1 -0
  145. package/dist/src/profiler.js +73 -0
  146. package/dist/src/profiler.js.map +1 -0
  147. package/dist/src/reconciler/host-config.d.ts +16 -0
  148. package/dist/src/reconciler/host-config.d.ts.map +1 -0
  149. package/dist/src/reconciler/host-config.js +174 -0
  150. package/dist/src/reconciler/host-config.js.map +1 -0
  151. package/dist/src/reconciler/types.d.ts +52 -0
  152. package/dist/src/reconciler/types.d.ts.map +1 -0
  153. package/dist/src/reconciler/types.js +2 -0
  154. package/dist/src/reconciler/types.js.map +1 -0
  155. package/dist/src/renderer.d.ts +101 -0
  156. package/dist/src/renderer.d.ts.map +1 -0
  157. package/dist/src/renderer.js +509 -0
  158. package/dist/src/renderer.js.map +1 -0
  159. package/dist/src/terminal.d.ts +37 -0
  160. package/dist/src/terminal.d.ts.map +1 -0
  161. package/dist/src/terminal.js +65 -0
  162. package/dist/src/terminal.js.map +1 -0
  163. package/dist/src/test/index.d.ts +3 -0
  164. package/dist/src/test/index.d.ts.map +1 -0
  165. package/dist/src/test/index.js +3 -0
  166. package/dist/src/test/index.js.map +1 -0
  167. package/dist/src/test/mock-streams.d.ts +44 -0
  168. package/dist/src/test/mock-streams.d.ts.map +1 -0
  169. package/dist/src/test/mock-streams.js +136 -0
  170. package/dist/src/test/mock-streams.js.map +1 -0
  171. package/dist/src/test/render-tui.d.ts +47 -0
  172. package/dist/src/test/render-tui.d.ts.map +1 -0
  173. package/dist/src/test/render-tui.js +76 -0
  174. package/dist/src/test/render-tui.js.map +1 -0
  175. package/dist/src/trace/SpanTree.d.ts +10 -0
  176. package/dist/src/trace/SpanTree.d.ts.map +1 -0
  177. package/dist/src/trace/SpanTree.js +104 -0
  178. package/dist/src/trace/SpanTree.js.map +1 -0
  179. package/dist/src/trace/index.d.ts +30 -0
  180. package/dist/src/trace/index.d.ts.map +1 -0
  181. package/dist/src/trace/index.js +142 -0
  182. package/dist/src/trace/index.js.map +1 -0
  183. package/dist/src/trace/location.d.ts +9 -0
  184. package/dist/src/trace/location.d.ts.map +1 -0
  185. package/dist/src/trace/location.js +88 -0
  186. package/dist/src/trace/location.js.map +1 -0
  187. package/dist/src/trace/span-processor.d.ts +16 -0
  188. package/dist/src/trace/span-processor.d.ts.map +1 -0
  189. package/dist/src/trace/span-processor.js +54 -0
  190. package/dist/src/trace/span-processor.js.map +1 -0
  191. package/dist/src/trace/span-state.d.ts +79 -0
  192. package/dist/src/trace/span-state.d.ts.map +1 -0
  193. package/dist/src/trace/span-state.js +229 -0
  194. package/dist/src/trace/span-state.js.map +1 -0
  195. package/dist/src/trace/tui-logger.d.ts +8 -0
  196. package/dist/src/trace/tui-logger.d.ts.map +1 -0
  197. package/dist/src/trace/tui-logger.js +70 -0
  198. package/dist/src/trace/tui-logger.js.map +1 -0
  199. package/dist/src/utils/border.d.ts +31 -0
  200. package/dist/src/utils/border.d.ts.map +1 -0
  201. package/dist/src/utils/border.js +81 -0
  202. package/dist/src/utils/border.js.map +1 -0
  203. package/dist/src/utils/flex-layout.d.ts +20 -0
  204. package/dist/src/utils/flex-layout.d.ts.map +1 -0
  205. package/dist/src/utils/flex-layout.js +85 -0
  206. package/dist/src/utils/flex-layout.js.map +1 -0
  207. package/dist/src/utils/index.d.ts +5 -0
  208. package/dist/src/utils/index.d.ts.map +1 -0
  209. package/dist/src/utils/index.js +5 -0
  210. package/dist/src/utils/index.js.map +1 -0
  211. package/dist/src/utils/padding.d.ts +26 -0
  212. package/dist/src/utils/padding.d.ts.map +1 -0
  213. package/dist/src/utils/padding.js +34 -0
  214. package/dist/src/utils/padding.js.map +1 -0
  215. package/dist/src/utils/styles.d.ts +13 -0
  216. package/dist/src/utils/styles.d.ts.map +1 -0
  217. package/dist/src/utils/styles.js +5 -0
  218. package/dist/src/utils/styles.js.map +1 -0
  219. package/dist/src/visualize/index.d.ts +50 -0
  220. package/dist/src/visualize/index.d.ts.map +1 -0
  221. package/dist/src/visualize/index.js +194 -0
  222. package/dist/src/visualize/index.js.map +1 -0
  223. package/dist/tsconfig.tsbuildinfo +1 -0
  224. package/package.json +94 -0
  225. package/src/codeblock.tsx +47 -0
  226. package/src/constants.ts +2 -0
  227. package/src/debug/DiagnosticsPanel.tsx +38 -0
  228. package/src/highlight.ts +76 -0
  229. package/src/hooks/index.ts +3 -0
  230. package/src/hooks/use-keyboard.ts +37 -0
  231. package/src/hooks/use-paste.ts +14 -0
  232. package/src/hooks/useFrameStats.ts +32 -0
  233. package/src/hosts/base.ts +65 -0
  234. package/src/hosts/box.ts +105 -0
  235. package/src/hosts/canvas.ts +155 -0
  236. package/src/hosts/codeblock.ts +145 -0
  237. package/src/hosts/hstack.ts +64 -0
  238. package/src/hosts/index.ts +45 -0
  239. package/src/hosts/spacer.ts +40 -0
  240. package/src/hosts/text.ts +175 -0
  241. package/src/hosts/vstack.ts +64 -0
  242. package/src/hosts/zstack.ts +77 -0
  243. package/src/index.ts +62 -0
  244. package/src/inline/index.tsx +181 -0
  245. package/src/jsx.ts +3 -0
  246. package/src/motion/color-motion-value.ts +90 -0
  247. package/src/motion/color.test.ts +115 -0
  248. package/src/motion/color.ts +191 -0
  249. package/src/motion/event-emitter.ts +35 -0
  250. package/src/motion/frame.ts +59 -0
  251. package/src/motion/hooks.ts +237 -0
  252. package/src/motion/index.ts +17 -0
  253. package/src/motion/motion-value.test.ts +222 -0
  254. package/src/motion/motion-value.ts +140 -0
  255. package/src/motion/spring-math.ts +114 -0
  256. package/src/motion/types.ts +34 -0
  257. package/src/output.ts +156 -0
  258. package/src/profiler.ts +88 -0
  259. package/src/reconciler/host-config.ts +277 -0
  260. package/src/reconciler/types.ts +66 -0
  261. package/src/renderer.ts +661 -0
  262. package/src/terminal.ts +67 -0
  263. package/src/test/index.ts +8 -0
  264. package/src/test/mock-streams.ts +149 -0
  265. package/src/test/render-tui.ts +118 -0
  266. package/src/trace/SpanTree.tsx +195 -0
  267. package/src/trace/index.tsx +205 -0
  268. package/src/trace/location.ts +90 -0
  269. package/src/trace/span-processor.ts +65 -0
  270. package/src/trace/span-state.ts +286 -0
  271. package/src/trace/tui-logger.ts +72 -0
  272. package/src/utils/border.ts +108 -0
  273. package/src/utils/flex-layout.ts +125 -0
  274. package/src/utils/index.ts +4 -0
  275. package/src/utils/padding.ts +45 -0
  276. package/src/utils/styles.ts +14 -0
  277. package/src/visualize/index.tsx +305 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-emitter.js","sourceRoot":"","sources":["../../../src/motion/event-emitter.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH;;GAEG;AACH,MAAM,OAAgB,YAAY;IACtB,WAAW,GAAG,IAAI,GAAG,EAAmC,CAAA;IAElE,0BAA0B;IAC1B,EAAE,CAAsB,KAAQ,EAAE,QAAmD;QACnF,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YACjC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,GAAG,EAAE,CAAC,CAAA;QACxC,CAAC;QACD,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAA;QAC1C,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAA;IAC5D,CAAC;IAED,yCAAyC;IAC/B,MAAM,CAAC,KAAgB,EAAE,KAAe;QAChD,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;QACxC,IAAI,IAAI,EAAE,CAAC;YACT,KAAK,MAAM,EAAE,IAAI,IAAI;gBAAE,EAAE,CAAC,KAAK,CAAC,CAAA;QAClC,CAAC;IACH,CAAC;IAED,8BAA8B;IACpB,gBAAgB;QACxB,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAA;IAC1B,CAAC;CACF"}
@@ -0,0 +1,9 @@
1
+ type FrameCallback = (time: number, delta: number) => void;
2
+ export declare function subscribeFrame(callback: FrameCallback): () => void;
3
+ /**
4
+ * Hook that calls callback on every animation frame.
5
+ * Similar to Motion's useAnimationFrame.
6
+ */
7
+ export declare function useAnimationFrame(callback: FrameCallback): void;
8
+ export {};
9
+ //# sourceMappingURL=frame.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frame.d.ts","sourceRoot":"","sources":["../../../src/motion/frame.ts"],"names":[],"mappings":"AAKA,KAAK,aAAa,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;AAwB1D,wBAAgB,cAAc,CAAC,QAAQ,EAAE,aAAa,GAAG,MAAM,IAAI,CAclE;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,aAAa,QASxD"}
@@ -0,0 +1,51 @@
1
+ // setTimeout-based frame loop for Node/TUI (no requestAnimationFrame)
2
+ import { useEffect, useRef } from "react";
3
+ import { DEFAULT_FPS } from "../constants.js";
4
+ const subscribers = new Set();
5
+ let timer = null;
6
+ let lastTime = 0;
7
+ const FRAME_MS = 1000 / DEFAULT_FPS;
8
+ function tick() {
9
+ const now = Date.now();
10
+ const delta = lastTime ? now - lastTime : FRAME_MS;
11
+ lastTime = now;
12
+ for (const cb of subscribers) {
13
+ cb(now, delta);
14
+ }
15
+ if (subscribers.size > 0) {
16
+ timer = setTimeout(tick, FRAME_MS);
17
+ }
18
+ else {
19
+ timer = null;
20
+ lastTime = 0;
21
+ }
22
+ }
23
+ export function subscribeFrame(callback) {
24
+ subscribers.add(callback);
25
+ if (!timer) {
26
+ lastTime = Date.now();
27
+ timer = setTimeout(tick, FRAME_MS);
28
+ }
29
+ return () => {
30
+ subscribers.delete(callback);
31
+ if (subscribers.size === 0 && timer) {
32
+ clearTimeout(timer);
33
+ timer = null;
34
+ lastTime = 0;
35
+ }
36
+ };
37
+ }
38
+ /**
39
+ * Hook that calls callback on every animation frame.
40
+ * Similar to Motion's useAnimationFrame.
41
+ */
42
+ export function useAnimationFrame(callback) {
43
+ const callbackRef = useRef(callback);
44
+ callbackRef.current = callback;
45
+ useEffect(() => {
46
+ return subscribeFrame((time, delta) => {
47
+ callbackRef.current(time, delta);
48
+ });
49
+ }, []);
50
+ }
51
+ //# sourceMappingURL=frame.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frame.js","sourceRoot":"","sources":["../../../src/motion/frame.ts"],"names":[],"mappings":"AAAA,sEAAsE;AAEtE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,OAAO,CAAA;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAI7C,MAAM,WAAW,GAAG,IAAI,GAAG,EAAiB,CAAA;AAC5C,IAAI,KAAK,GAAyC,IAAI,CAAA;AACtD,IAAI,QAAQ,GAAG,CAAC,CAAA;AAChB,MAAM,QAAQ,GAAG,IAAI,GAAG,WAAW,CAAA;AAEnC,SAAS,IAAI;IACX,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;IACtB,MAAM,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,GAAG,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAA;IAClD,QAAQ,GAAG,GAAG,CAAA;IAEd,KAAK,MAAM,EAAE,IAAI,WAAW,EAAE,CAAC;QAC7B,EAAE,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;IAChB,CAAC;IAED,IAAI,WAAW,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;QACzB,KAAK,GAAG,UAAU,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;IACpC,CAAC;SAAM,CAAC;QACN,KAAK,GAAG,IAAI,CAAA;QACZ,QAAQ,GAAG,CAAC,CAAA;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,QAAuB;IACpD,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;IACzB,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;QACrB,KAAK,GAAG,UAAU,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;IACpC,CAAC;IACD,OAAO,GAAG,EAAE;QACV,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;QAC5B,IAAI,WAAW,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,EAAE,CAAC;YACpC,YAAY,CAAC,KAAK,CAAC,CAAA;YACnB,KAAK,GAAG,IAAI,CAAA;YACZ,QAAQ,GAAG,CAAC,CAAA;QACd,CAAC;IACH,CAAC,CAAA;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,QAAuB;IACvD,MAAM,WAAW,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAA;IACpC,WAAW,CAAC,OAAO,GAAG,QAAQ,CAAA;IAE9B,SAAS,CAAC,GAAG,EAAE;QACb,OAAO,cAAc,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;YACpC,WAAW,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;QAClC,CAAC,CAAC,CAAA;IACJ,CAAC,EAAE,EAAE,CAAC,CAAA;AACR,CAAC"}
@@ -0,0 +1,75 @@
1
+ /**
2
+ * React hooks for spring animations.
3
+ */
4
+ import { MotionValue } from "./motion-value.js";
5
+ import { ColorMotionValue } from "./color-motion-value.js";
6
+ import type { SpringOptions } from "./types.js";
7
+ import type { EventName } from "./event-emitter.js";
8
+ import type { ColorInput } from "./color.js";
9
+ /**
10
+ * Create a MotionValue. Similar to Motion's useMotionValue.
11
+ */
12
+ export declare function useMotionValue<T>(initial: T): MotionValue<T>;
13
+ /**
14
+ * Call this once in your app to connect springs to the renderer.
15
+ * If no renderer is passed, it will use the nearest RendererContext (useRenderer()).
16
+ */
17
+ export declare function useSpringRenderer(renderer?: {
18
+ requestRender: () => void;
19
+ }): void;
20
+ /**
21
+ * Create a spring-animated value. When you call set(), it springs to the new value.
22
+ * Similar to Motion's useSpring.
23
+ *
24
+ * OPTIMIZED: Does NOT use React state during animation. Instead:
25
+ * - Returns MotionValue which you read via mv.get() in draw functions
26
+ * - Calls renderer.requestRender() directly on each frame
27
+ * - Bypasses React reconciliation entirely during animation
28
+ *
29
+ * @example
30
+ * const [xMv, setX] = useSpring(0, { visualDuration: 0.5 })
31
+ * // In canvas draw: const x = xMv.get()
32
+ * // To animate: setX(100)
33
+ */
34
+ export declare function useSpring(initial: number, options?: SpringOptions): [MotionValue<number>, (value: number) => void];
35
+ /**
36
+ * Create multiple spring-animated values. Similar to framer-motion's useSprings.
37
+ *
38
+ * @param count - Number of springs to create
39
+ * @param options - Spring configuration (shared by all springs)
40
+ * @returns [mvs, setAll] - Array of MotionValues and a setter function
41
+ *
42
+ * @example
43
+ * const [dotMvs, setDots] = useSprings(9, { visualDuration: 0.3, bounce: 0 })
44
+ *
45
+ * // Update all with a mapper function
46
+ * setDots((i) => i === focusedIndex ? 1 : 0)
47
+ *
48
+ * // Or update with an array
49
+ * setDots([0, 0, 1, 0, 0, 0, 0, 0, 0])
50
+ *
51
+ * // In draw callback
52
+ * const brightness = dotMvs[idx].get()
53
+ */
54
+ export declare function useSprings(count: number, options?: SpringOptions): [MotionValue<number>[], (values: number[] | ((index: number) => number)) => void];
55
+ /**
56
+ * Subscribe to MotionValue events. Similar to Motion's useMotionValueEvent.
57
+ */
58
+ export declare function useMotionValueEvent<T, E extends EventName>(mv: MotionValue<T>, event: E, callback: E extends "change" ? (value: T) => void : () => void): void;
59
+ /**
60
+ * Create a ColorMotionValue hook.
61
+ */
62
+ export declare function useColorMotionValue(initial: ColorInput): ColorMotionValue;
63
+ /**
64
+ * Create a spring-animated color. Accepts hex, rgb(), hsl(), or {r,g,b} object.
65
+ *
66
+ * @example
67
+ * const [colorMv, setColor] = useColorSpring("#ff0000", { visualDuration: 0.5 })
68
+ * setColor("#00ff00") // Spring to green
69
+ * setColor("hsl(240, 100%, 50%)") // Spring to blue
70
+ *
71
+ * // In draw callback
72
+ * const { r, g, b } = colorMv.get()
73
+ */
74
+ export declare function useColorSpring(initial: ColorInput, options?: SpringOptions): [ColorMotionValue, (color: ColorInput) => void];
75
+ //# sourceMappingURL=hooks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../../src/motion/hooks.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAA;AAC1D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAC/C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AACnD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAK5C;;GAEG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAW5D;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,CAAC,EAAE;IAAE,aAAa,EAAE,MAAM,IAAI,CAAA;CAAE,QAYzE;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC,CAoBlH;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,UAAU,CACxB,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,aAAa,GACtB,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC,KAAK,IAAI,CAAC,CA6DnF;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,CAAC,SAAS,SAAS,EACxD,EAAE,EAAE,WAAW,CAAC,CAAC,CAAC,EAClB,KAAK,EAAE,CAAC,EACR,QAAQ,EAAE,CAAC,SAAS,QAAQ,GAAG,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,GAAG,MAAM,IAAI,QAQ/D;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,UAAU,GAAG,gBAAgB,CAWzE;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,UAAU,EACnB,OAAO,CAAC,EAAE,aAAa,GACtB,CAAC,gBAAgB,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC,CAoBjD"}
@@ -0,0 +1,190 @@
1
+ /**
2
+ * React hooks for spring animations.
3
+ */
4
+ import { useCallback, useEffect, useRef } from "react";
5
+ import { useRenderer } from "../renderer.js";
6
+ import { MotionValue } from "./motion-value.js";
7
+ import { ColorMotionValue } from "./color-motion-value.js";
8
+ // Global requestRender callback - set by useSpringRenderer hook
9
+ let globalRequestRender = null;
10
+ /**
11
+ * Create a MotionValue. Similar to Motion's useMotionValue.
12
+ */
13
+ export function useMotionValue(initial) {
14
+ const ref = useRef(null);
15
+ if (!ref.current) {
16
+ ref.current = new MotionValue(initial);
17
+ }
18
+ useEffect(() => {
19
+ return () => ref.current?.destroy();
20
+ }, []);
21
+ return ref.current;
22
+ }
23
+ /**
24
+ * Call this once in your app to connect springs to the renderer.
25
+ * If no renderer is passed, it will use the nearest RendererContext (useRenderer()).
26
+ */
27
+ export function useSpringRenderer(renderer) {
28
+ // Prefer explicit renderer; otherwise pull from context
29
+ const inferred = renderer ?? useRenderer();
30
+ useEffect(() => {
31
+ if (!inferred)
32
+ return;
33
+ globalRequestRender = inferred.requestRender.bind(inferred);
34
+ return () => {
35
+ if (globalRequestRender === inferred.requestRender) {
36
+ globalRequestRender = null;
37
+ }
38
+ };
39
+ }, [inferred]);
40
+ }
41
+ /**
42
+ * Create a spring-animated value. When you call set(), it springs to the new value.
43
+ * Similar to Motion's useSpring.
44
+ *
45
+ * OPTIMIZED: Does NOT use React state during animation. Instead:
46
+ * - Returns MotionValue which you read via mv.get() in draw functions
47
+ * - Calls renderer.requestRender() directly on each frame
48
+ * - Bypasses React reconciliation entirely during animation
49
+ *
50
+ * @example
51
+ * const [xMv, setX] = useSpring(0, { visualDuration: 0.5 })
52
+ * // In canvas draw: const x = xMv.get()
53
+ * // To animate: setX(100)
54
+ */
55
+ export function useSpring(initial, options) {
56
+ const mv = useMotionValue(initial);
57
+ const optionsRef = useRef(options);
58
+ optionsRef.current = options;
59
+ // Subscribe to changes and request render directly (no setState!)
60
+ useEffect(() => {
61
+ return mv.on("change", () => {
62
+ globalRequestRender?.();
63
+ });
64
+ }, [mv]);
65
+ const set = useCallback((target) => {
66
+ mv.set(target, optionsRef.current);
67
+ }, [mv]);
68
+ return [mv, set];
69
+ }
70
+ /**
71
+ * Create multiple spring-animated values. Similar to framer-motion's useSprings.
72
+ *
73
+ * @param count - Number of springs to create
74
+ * @param options - Spring configuration (shared by all springs)
75
+ * @returns [mvs, setAll] - Array of MotionValues and a setter function
76
+ *
77
+ * @example
78
+ * const [dotMvs, setDots] = useSprings(9, { visualDuration: 0.3, bounce: 0 })
79
+ *
80
+ * // Update all with a mapper function
81
+ * setDots((i) => i === focusedIndex ? 1 : 0)
82
+ *
83
+ * // Or update with an array
84
+ * setDots([0, 0, 1, 0, 0, 0, 0, 0, 0])
85
+ *
86
+ * // In draw callback
87
+ * const brightness = dotMvs[idx].get()
88
+ */
89
+ export function useSprings(count, options) {
90
+ const mvsRef = useRef(null);
91
+ const optionsRef = useRef(options);
92
+ optionsRef.current = options;
93
+ // Create MotionValues on first render
94
+ if (!mvsRef.current) {
95
+ mvsRef.current = Array.from({ length: count }, () => new MotionValue(0));
96
+ }
97
+ // Handle count changes (recreate if count changes)
98
+ if (mvsRef.current.length !== count) {
99
+ // Destroy old ones
100
+ for (const mv of mvsRef.current) {
101
+ mv.destroy();
102
+ }
103
+ mvsRef.current = Array.from({ length: count }, () => new MotionValue(0));
104
+ }
105
+ const mvs = mvsRef.current;
106
+ // Subscribe all to requestRender
107
+ useEffect(() => {
108
+ const unsubs = mvs.map((mv) => mv.on("change", () => {
109
+ globalRequestRender?.();
110
+ }));
111
+ return () => {
112
+ for (const unsub of unsubs)
113
+ unsub();
114
+ };
115
+ }, [mvs]);
116
+ // Cleanup on unmount
117
+ useEffect(() => {
118
+ return () => {
119
+ if (mvsRef.current) {
120
+ for (const mv of mvsRef.current) {
121
+ mv.destroy();
122
+ }
123
+ }
124
+ };
125
+ }, []);
126
+ const setAll = useCallback((values) => {
127
+ const opts = optionsRef.current;
128
+ if (typeof values === "function") {
129
+ for (let i = 0; i < mvs.length; i++) {
130
+ mvs[i].set(values(i), opts);
131
+ }
132
+ }
133
+ else {
134
+ for (let i = 0; i < Math.min(mvs.length, values.length); i++) {
135
+ mvs[i].set(values[i], opts);
136
+ }
137
+ }
138
+ }, [mvs]);
139
+ return [mvs, setAll];
140
+ }
141
+ /**
142
+ * Subscribe to MotionValue events. Similar to Motion's useMotionValueEvent.
143
+ */
144
+ export function useMotionValueEvent(mv, event, callback) {
145
+ const callbackRef = useRef(callback);
146
+ callbackRef.current = callback;
147
+ useEffect(() => {
148
+ return mv.on(event, (v) => callbackRef.current(v));
149
+ }, [mv, event]);
150
+ }
151
+ /**
152
+ * Create a ColorMotionValue hook.
153
+ */
154
+ export function useColorMotionValue(initial) {
155
+ const ref = useRef(null);
156
+ if (!ref.current) {
157
+ ref.current = new ColorMotionValue(initial);
158
+ }
159
+ useEffect(() => {
160
+ return () => ref.current?.destroy();
161
+ }, []);
162
+ return ref.current;
163
+ }
164
+ /**
165
+ * Create a spring-animated color. Accepts hex, rgb(), hsl(), or {r,g,b} object.
166
+ *
167
+ * @example
168
+ * const [colorMv, setColor] = useColorSpring("#ff0000", { visualDuration: 0.5 })
169
+ * setColor("#00ff00") // Spring to green
170
+ * setColor("hsl(240, 100%, 50%)") // Spring to blue
171
+ *
172
+ * // In draw callback
173
+ * const { r, g, b } = colorMv.get()
174
+ */
175
+ export function useColorSpring(initial, options) {
176
+ const mv = useColorMotionValue(initial);
177
+ const optionsRef = useRef(options);
178
+ optionsRef.current = options;
179
+ // Subscribe to changes and request render
180
+ useEffect(() => {
181
+ return mv._subscribeChannels(() => {
182
+ globalRequestRender?.();
183
+ });
184
+ }, [mv]);
185
+ const set = useCallback((color) => {
186
+ mv.set(color, optionsRef.current);
187
+ }, [mv]);
188
+ return [mv, set];
189
+ }
190
+ //# sourceMappingURL=hooks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../../src/motion/hooks.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,OAAO,CAAA;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAA;AAK1D,gEAAgE;AAChE,IAAI,mBAAmB,GAAwB,IAAI,CAAA;AAEnD;;GAEG;AACH,MAAM,UAAU,cAAc,CAAI,OAAU;IAC1C,MAAM,GAAG,GAAG,MAAM,CAAwB,IAAI,CAAC,CAAA;IAC/C,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QACjB,GAAG,CAAC,OAAO,GAAG,IAAI,WAAW,CAAC,OAAO,CAAC,CAAA;IACxC,CAAC;IAED,SAAS,CAAC,GAAG,EAAE;QACb,OAAO,GAAG,EAAE,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,CAAA;IACrC,CAAC,EAAE,EAAE,CAAC,CAAA;IAEN,OAAO,GAAG,CAAC,OAAO,CAAA;AACpB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,QAAwC;IACxE,wDAAwD;IACxD,MAAM,QAAQ,GAAG,QAAQ,IAAI,WAAW,EAAE,CAAA;IAC1C,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,QAAQ;YAAE,OAAM;QACrB,mBAAmB,GAAG,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QAC3D,OAAO,GAAG,EAAE;YACV,IAAI,mBAAmB,KAAK,QAAQ,CAAC,aAAa,EAAE,CAAC;gBACnD,mBAAmB,GAAG,IAAI,CAAA;YAC5B,CAAC;QACH,CAAC,CAAA;IACH,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAA;AAChB,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,SAAS,CAAC,OAAe,EAAE,OAAuB;IAChE,MAAM,EAAE,GAAG,cAAc,CAAC,OAAO,CAAC,CAAA;IAClC,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,CAAA;IAClC,UAAU,CAAC,OAAO,GAAG,OAAO,CAAA;IAE5B,kEAAkE;IAClE,SAAS,CAAC,GAAG,EAAE;QACb,OAAO,EAAE,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;YAC1B,mBAAmB,EAAE,EAAE,CAAA;QACzB,CAAC,CAAC,CAAA;IACJ,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;IAER,MAAM,GAAG,GAAG,WAAW,CACrB,CAAC,MAAc,EAAE,EAAE;QACjB,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,OAAO,CAAC,CAAA;IACpC,CAAC,EACD,CAAC,EAAE,CAAC,CACL,CAAA;IAED,OAAO,CAAC,EAAE,EAAE,GAAG,CAAC,CAAA;AAClB,CAAC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,UAAU,CACxB,KAAa,EACb,OAAuB;IAEvB,MAAM,MAAM,GAAG,MAAM,CAA+B,IAAI,CAAC,CAAA;IACzD,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,CAAA;IAClC,UAAU,CAAC,OAAO,GAAG,OAAO,CAAA;IAE5B,sCAAsC;IACtC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,CAAC,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,CAAC,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC,CAAA;IAC1E,CAAC;IAED,mDAAmD;IACnD,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;QACpC,mBAAmB;QACnB,KAAK,MAAM,EAAE,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YAChC,EAAE,CAAC,OAAO,EAAE,CAAA;QACd,CAAC;QACD,MAAM,CAAC,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,CAAC,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC,CAAA;IAC1E,CAAC;IAED,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAA;IAE1B,iCAAiC;IACjC,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,MAAM,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAC5B,EAAE,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;YACnB,mBAAmB,EAAE,EAAE,CAAA;QACzB,CAAC,CAAC,CACH,CAAA;QACD,OAAO,GAAG,EAAE;YACV,KAAK,MAAM,KAAK,IAAI,MAAM;gBAAE,KAAK,EAAE,CAAA;QACrC,CAAC,CAAA;IACH,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAA;IAET,qBAAqB;IACrB,SAAS,CAAC,GAAG,EAAE;QACb,OAAO,GAAG,EAAE;YACV,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBACnB,KAAK,MAAM,EAAE,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;oBAChC,EAAE,CAAC,OAAO,EAAE,CAAA;gBACd,CAAC;YACH,CAAC;QACH,CAAC,CAAA;IACH,CAAC,EAAE,EAAE,CAAC,CAAA;IAEN,MAAM,MAAM,GAAG,WAAW,CACxB,CAAC,MAA8C,EAAE,EAAE;QACjD,MAAM,IAAI,GAAG,UAAU,CAAC,OAAO,CAAA;QAC/B,IAAI,OAAO,MAAM,KAAK,UAAU,EAAE,CAAC;YACjC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACpC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAA;YAC7B,CAAC;QACH,CAAC;aAAM,CAAC;YACN,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC7D,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAA;YAC7B,CAAC;QACH,CAAC;IACH,CAAC,EACD,CAAC,GAAG,CAAC,CACN,CAAA;IAED,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,CAAA;AACtB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CACjC,EAAkB,EAClB,KAAQ,EACR,QAA8D;IAE9D,MAAM,WAAW,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAA;IACpC,WAAW,CAAC,OAAO,GAAG,QAAQ,CAAA;IAE9B,SAAS,CAAC,GAAG,EAAE;QACb,OAAO,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,CAAM,EAAE,EAAE,CAAE,WAAW,CAAC,OAAe,CAAC,CAAC,CAAC,CAAC,CAAA;IAClE,CAAC,EAAE,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC,CAAA;AACjB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,OAAmB;IACrD,MAAM,GAAG,GAAG,MAAM,CAA0B,IAAI,CAAC,CAAA;IACjD,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QACjB,GAAG,CAAC,OAAO,GAAG,IAAI,gBAAgB,CAAC,OAAO,CAAC,CAAA;IAC7C,CAAC;IAED,SAAS,CAAC,GAAG,EAAE;QACb,OAAO,GAAG,EAAE,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,CAAA;IACrC,CAAC,EAAE,EAAE,CAAC,CAAA;IAEN,OAAO,GAAG,CAAC,OAAO,CAAA;AACpB,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,cAAc,CAC5B,OAAmB,EACnB,OAAuB;IAEvB,MAAM,EAAE,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAA;IACvC,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,CAAA;IAClC,UAAU,CAAC,OAAO,GAAG,OAAO,CAAA;IAE5B,0CAA0C;IAC1C,SAAS,CAAC,GAAG,EAAE;QACb,OAAO,EAAE,CAAC,kBAAkB,CAAC,GAAG,EAAE;YAChC,mBAAmB,EAAE,EAAE,CAAA;QACzB,CAAC,CAAC,CAAA;IACJ,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;IAER,MAAM,GAAG,GAAG,WAAW,CACrB,CAAC,KAAiB,EAAE,EAAE;QACpB,EAAE,CAAC,GAAG,CAAC,KAAK,EAAE,UAAU,CAAC,OAAO,CAAC,CAAA;IACnC,CAAC,EACD,CAAC,EAAE,CAAC,CACL,CAAA;IAED,OAAO,CAAC,EAAE,EAAE,GAAG,CAAC,CAAA;AAClB,CAAC"}
@@ -0,0 +1,4 @@
1
+ export type { SpringOptions, MotionValue, RGBA, ColorInput } from "./motion-value.js";
2
+ export { motionValue, useMotionValue, useSpring, useSprings, useSpringRenderer, useMotionValueEvent, ColorMotionValue, useColorMotionValue, useColorSpring, } from "./motion-value.js";
3
+ export { useAnimationFrame } from "./frame.js";
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/motion/index.ts"],"names":[],"mappings":"AAGA,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AACrF,OAAO,EACL,WAAW,EACX,cAAc,EACd,SAAS,EACT,UAAU,EACV,iBAAiB,EACjB,mBAAmB,EAEnB,gBAAgB,EAChB,mBAAmB,EACnB,cAAc,GACf,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA"}
@@ -0,0 +1,7 @@
1
+ // Motion-inspired animation system for TUI
2
+ // Analytical spring physics (not Euler integration) + setTimeout-based frame loop
3
+ export { motionValue, useMotionValue, useSpring, useSprings, useSpringRenderer, useMotionValueEvent,
4
+ // Color springs
5
+ ColorMotionValue, useColorMotionValue, useColorSpring, } from "./motion-value.js";
6
+ export { useAnimationFrame } from "./frame.js";
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/motion/index.ts"],"names":[],"mappings":"AAAA,2CAA2C;AAC3C,kFAAkF;AAGlF,OAAO,EACL,WAAW,EACX,cAAc,EACd,SAAS,EACT,UAAU,EACV,iBAAiB,EACjB,mBAAmB;AACnB,gBAAgB;AAChB,gBAAgB,EAChB,mBAAmB,EACnB,cAAc,GACf,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * MotionValue - tracks animated values with spring physics.
3
+ * Inspired by framer-motion's MotionValue.
4
+ */
5
+ import { EventEmitter } from "./event-emitter.js";
6
+ import { type SpringOptions } from "./types.js";
7
+ /** Create a MotionValue. Factory function like Motion's motionValue(). */
8
+ export declare function motionValue<T>(initial: T): MotionValue<T>;
9
+ /**
10
+ * MotionValue tracks a value and its velocity, supporting spring animations.
11
+ */
12
+ export declare class MotionValue<T = number> extends EventEmitter<T> {
13
+ private current;
14
+ private target;
15
+ private velocity;
16
+ private animation;
17
+ constructor(initial: T);
18
+ /** Get the current value */
19
+ get(): T;
20
+ /** Set value immediately (no animation) */
21
+ jump(value: T): void;
22
+ /** Set target and animate with spring */
23
+ set(value: T, options?: SpringOptions): void;
24
+ /** Get current velocity */
25
+ getVelocity(): number;
26
+ /** Check if currently animating */
27
+ isAnimating(): boolean;
28
+ /** Stop any active animation */
29
+ stop(): void;
30
+ /** Destroy and clean up */
31
+ destroy(): void;
32
+ private animateSpring;
33
+ }
34
+ export { type SpringOptions, DEFAULT_SPRING_OPTIONS } from "./types.js";
35
+ export type { EventName, Subscriber } from "./event-emitter.js";
36
+ export { createSpringResolver, springFromVisualDuration, isSpringSettled } from "./spring-math.js";
37
+ export { ColorMotionValue } from "./color-motion-value.js";
38
+ export { useMotionValue, useSpring, useSprings, useSpringRenderer, useMotionValueEvent, useColorMotionValue, useColorSpring, } from "./hooks.js";
39
+ export type { RGBA, ColorInput } from "./color.js";
40
+ //# sourceMappingURL=motion-value.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"motion-value.d.ts","sourceRoot":"","sources":["../../../src/motion/motion-value.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAEjD,OAAO,EAAE,KAAK,aAAa,EAA0B,MAAM,YAAY,CAAA;AAEvE,0EAA0E;AAC1E,wBAAgB,WAAW,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAEzD;AAED;;GAEG;AACH,qBAAa,WAAW,CAAC,CAAC,GAAG,MAAM,CAAE,SAAQ,YAAY,CAAC,CAAC,CAAC;IAC1D,OAAO,CAAC,OAAO,CAAG;IAClB,OAAO,CAAC,MAAM,CAAG;IACjB,OAAO,CAAC,QAAQ,CAAI;IACpB,OAAO,CAAC,SAAS,CAAoC;gBAEzC,OAAO,EAAE,CAAC;IAMtB,4BAA4B;IAC5B,GAAG,IAAI,CAAC;IAIR,2CAA2C;IAC3C,IAAI,CAAC,KAAK,EAAE,CAAC;IAQb,yCAAyC;IACzC,GAAG,CAAC,KAAK,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,aAAa;IAUrC,2BAA2B;IAC3B,WAAW,IAAI,MAAM;IAIrB,mCAAmC;IACnC,WAAW,IAAI,OAAO;IAItB,gCAAgC;IAChC,IAAI;IAOJ,2BAA2B;IAC3B,OAAO;IAKP,OAAO,CAAC,aAAa;CA4CtB;AAGD,OAAO,EAAE,KAAK,aAAa,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAA;AACvE,YAAY,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAC/D,OAAO,EAAE,oBAAoB,EAAE,wBAAwB,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAClG,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAA;AAC1D,OAAO,EACL,cAAc,EACd,SAAS,EACT,UAAU,EACV,iBAAiB,EACjB,mBAAmB,EACnB,mBAAmB,EACnB,cAAc,GACf,MAAM,YAAY,CAAA;AACnB,YAAY,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA"}
@@ -0,0 +1,109 @@
1
+ /**
2
+ * MotionValue - tracks animated values with spring physics.
3
+ * Inspired by framer-motion's MotionValue.
4
+ */
5
+ import { subscribeFrame } from "./frame.js";
6
+ import { EventEmitter } from "./event-emitter.js";
7
+ import { createSpringResolver, springFromVisualDuration } from "./spring-math.js";
8
+ import { DEFAULT_SPRING_OPTIONS } from "./types.js";
9
+ /** Create a MotionValue. Factory function like Motion's motionValue(). */
10
+ export function motionValue(initial) {
11
+ return new MotionValue(initial);
12
+ }
13
+ /**
14
+ * MotionValue tracks a value and its velocity, supporting spring animations.
15
+ */
16
+ export class MotionValue extends EventEmitter {
17
+ current;
18
+ target;
19
+ velocity = 0;
20
+ animation = null;
21
+ constructor(initial) {
22
+ super();
23
+ this.current = initial;
24
+ this.target = initial;
25
+ }
26
+ /** Get the current value */
27
+ get() {
28
+ return this.current;
29
+ }
30
+ /** Set value immediately (no animation) */
31
+ jump(value) {
32
+ this.stop();
33
+ this.current = value;
34
+ this.target = value;
35
+ this.velocity = 0;
36
+ this.notify("change", value);
37
+ }
38
+ /** Set target and animate with spring */
39
+ set(value, options) {
40
+ if (typeof value !== "number" || typeof this.current !== "number") {
41
+ // Non-numeric: jump immediately
42
+ this.jump(value);
43
+ return;
44
+ }
45
+ this.target = value;
46
+ this.animateSpring(options);
47
+ }
48
+ /** Get current velocity */
49
+ getVelocity() {
50
+ return this.velocity;
51
+ }
52
+ /** Check if currently animating */
53
+ isAnimating() {
54
+ return this.animation !== null;
55
+ }
56
+ /** Stop any active animation */
57
+ stop() {
58
+ if (this.animation) {
59
+ this.animation.stop();
60
+ this.animation = null;
61
+ }
62
+ }
63
+ /** Destroy and clean up */
64
+ destroy() {
65
+ this.stop();
66
+ this.clearSubscribers();
67
+ }
68
+ animateSpring(options) {
69
+ this.stop();
70
+ const opts = { ...DEFAULT_SPRING_OPTIONS, ...options };
71
+ const from = this.current;
72
+ const to = this.target;
73
+ if (from === to)
74
+ return;
75
+ // Derive stiffness/damping from visualDuration/bounce if provided
76
+ let { stiffness, damping, mass } = opts;
77
+ if (opts.visualDuration && opts.visualDuration > 0) {
78
+ const derived = springFromVisualDuration(opts.visualDuration, opts.bounce);
79
+ stiffness = derived.stiffness;
80
+ damping = derived.damping;
81
+ }
82
+ // Create spring resolver (analytical solution)
83
+ const resolver = createSpringResolver(from, to, this.velocity, stiffness, damping, mass);
84
+ this.notify("animationStart", undefined);
85
+ const startTime = Date.now();
86
+ const unsubscribe = subscribeFrame(() => {
87
+ const elapsed = (Date.now() - startTime) / 1000; // seconds
88
+ const state = resolver(elapsed);
89
+ this.current = state.value;
90
+ this.velocity = state.velocity;
91
+ this.notify("change", this.current);
92
+ if (state.done) {
93
+ this.current = to;
94
+ this.velocity = 0;
95
+ this.animation = null;
96
+ this.notify("change", this.current);
97
+ this.notify("animationComplete", undefined);
98
+ unsubscribe();
99
+ }
100
+ });
101
+ this.animation = { stop: unsubscribe };
102
+ }
103
+ }
104
+ // Re-export everything for backwards compatibility
105
+ export { DEFAULT_SPRING_OPTIONS } from "./types.js";
106
+ export { createSpringResolver, springFromVisualDuration, isSpringSettled } from "./spring-math.js";
107
+ export { ColorMotionValue } from "./color-motion-value.js";
108
+ export { useMotionValue, useSpring, useSprings, useSpringRenderer, useMotionValueEvent, useColorMotionValue, useColorSpring, } from "./hooks.js";
109
+ //# sourceMappingURL=motion-value.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"motion-value.js","sourceRoot":"","sources":["../../../src/motion/motion-value.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=motion-value.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"motion-value.test.d.ts","sourceRoot":"","sources":["../../../src/motion/motion-value.test.ts"],"names":[],"mappings":""}