@unrulysystems/native-motion-core 0.1.0-alpha.0

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 (326) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/LICENSE +21 -0
  3. package/README.md +48 -0
  4. package/dist/clock.cjs +71 -0
  5. package/dist/clock.d.cts +23 -0
  6. package/dist/clock.d.ts +23 -0
  7. package/dist/clock.js +66 -0
  8. package/dist/collect-reads.cjs +68 -0
  9. package/dist/collect-reads.d.cts +23 -0
  10. package/dist/collect-reads.d.ts +23 -0
  11. package/dist/collect-reads.js +62 -0
  12. package/dist/component/boundedArray.cjs +74 -0
  13. package/dist/component/boundedArray.d.cts +25 -0
  14. package/dist/component/boundedArray.d.ts +25 -0
  15. package/dist/component/boundedArray.js +68 -0
  16. package/dist/component/index.cjs +57 -0
  17. package/dist/component/index.d.cts +12 -0
  18. package/dist/component/index.d.ts +12 -0
  19. package/dist/component/index.js +22 -0
  20. package/dist/component/orchestration.cjs +129 -0
  21. package/dist/component/orchestration.d.cts +66 -0
  22. package/dist/component/orchestration.d.ts +66 -0
  23. package/dist/component/orchestration.js +124 -0
  24. package/dist/component/resolve.cjs +104 -0
  25. package/dist/component/resolve.d.cts +11 -0
  26. package/dist/component/resolve.d.ts +11 -0
  27. package/dist/component/resolve.js +97 -0
  28. package/dist/component/transition.cjs +352 -0
  29. package/dist/component/transition.d.cts +33 -0
  30. package/dist/component/transition.d.ts +33 -0
  31. package/dist/component/transition.js +339 -0
  32. package/dist/component/types.cjs +114 -0
  33. package/dist/component/types.d.cts +60 -0
  34. package/dist/component/types.d.ts +60 -0
  35. package/dist/component/types.js +111 -0
  36. package/dist/component/validate.cjs +1015 -0
  37. package/dist/component/validate.d.cts +37 -0
  38. package/dist/component/validate.d.ts +37 -0
  39. package/dist/component/validate.js +1002 -0
  40. package/dist/component/variants.cjs +333 -0
  41. package/dist/component/variants.d.cts +106 -0
  42. package/dist/component/variants.d.ts +106 -0
  43. package/dist/component/variants.js +321 -0
  44. package/dist/config/constants.cjs +41 -0
  45. package/dist/config/constants.d.cts +29 -0
  46. package/dist/config/constants.d.ts +29 -0
  47. package/dist/config/constants.js +38 -0
  48. package/dist/delay.cjs +72 -0
  49. package/dist/delay.d.cts +26 -0
  50. package/dist/delay.d.ts +26 -0
  51. package/dist/delay.js +70 -0
  52. package/dist/derived.cjs +143 -0
  53. package/dist/derived.d.cts +41 -0
  54. package/dist/derived.d.ts +41 -0
  55. package/dist/derived.js +139 -0
  56. package/dist/driver/index.cjs +22 -0
  57. package/dist/driver/index.d.cts +7 -0
  58. package/dist/driver/index.d.ts +7 -0
  59. package/dist/driver/index.js +14 -0
  60. package/dist/driver/keyframeTiming.cjs +130 -0
  61. package/dist/driver/keyframeTiming.d.cts +18 -0
  62. package/dist/driver/keyframeTiming.d.ts +18 -0
  63. package/dist/driver/keyframeTiming.js +124 -0
  64. package/dist/driver/keyframeTimingConfig.cjs +24 -0
  65. package/dist/driver/keyframeTimingConfig.d.cts +5 -0
  66. package/dist/driver/keyframeTimingConfig.d.ts +5 -0
  67. package/dist/driver/keyframeTimingConfig.js +22 -0
  68. package/dist/driver/prepare.cjs +459 -0
  69. package/dist/driver/prepare.d.cts +4 -0
  70. package/dist/driver/prepare.d.ts +4 -0
  71. package/dist/driver/prepare.js +454 -0
  72. package/dist/driver/reference.cjs +762 -0
  73. package/dist/driver/reference.d.cts +53 -0
  74. package/dist/driver/reference.d.ts +53 -0
  75. package/dist/driver/reference.js +757 -0
  76. package/dist/driver/step.cjs +55 -0
  77. package/dist/driver/step.d.cts +9 -0
  78. package/dist/driver/step.d.ts +9 -0
  79. package/dist/driver/step.js +52 -0
  80. package/dist/driver/tiers.cjs +40 -0
  81. package/dist/driver/tiers.d.cts +2 -0
  82. package/dist/driver/tiers.d.ts +2 -0
  83. package/dist/driver/tiers.js +37 -0
  84. package/dist/driver/types.cjs +9 -0
  85. package/dist/driver/types.d.cts +68 -0
  86. package/dist/driver/types.d.ts +68 -0
  87. package/dist/driver/types.js +8 -0
  88. package/dist/external-animation-ledger.cjs +1250 -0
  89. package/dist/external-animation-ledger.d.cts +416 -0
  90. package/dist/external-animation-ledger.d.ts +416 -0
  91. package/dist/external-animation-ledger.js +1243 -0
  92. package/dist/gesture/directionLock.cjs +25 -0
  93. package/dist/gesture/directionLock.d.cts +8 -0
  94. package/dist/gesture/directionLock.d.ts +8 -0
  95. package/dist/gesture/directionLock.js +21 -0
  96. package/dist/gesture/dragConfig.cjs +634 -0
  97. package/dist/gesture/dragConfig.d.cts +298 -0
  98. package/dist/gesture/dragConfig.d.ts +298 -0
  99. package/dist/gesture/dragConfig.js +624 -0
  100. package/dist/gesture/elastic.cjs +44 -0
  101. package/dist/gesture/elastic.d.cts +4 -0
  102. package/dist/gesture/elastic.d.ts +4 -0
  103. package/dist/gesture/elastic.js +39 -0
  104. package/dist/gesture/handoffSession.cjs +161 -0
  105. package/dist/gesture/handoffSession.d.cts +35 -0
  106. package/dist/gesture/handoffSession.d.ts +35 -0
  107. package/dist/gesture/handoffSession.js +158 -0
  108. package/dist/gesture/index.cjs +37 -0
  109. package/dist/gesture/index.d.cts +12 -0
  110. package/dist/gesture/index.d.ts +12 -0
  111. package/dist/gesture/index.js +11 -0
  112. package/dist/gesture/projection.cjs +95 -0
  113. package/dist/gesture/projection.d.cts +7 -0
  114. package/dist/gesture/projection.d.ts +7 -0
  115. package/dist/gesture/projection.js +87 -0
  116. package/dist/gesture/session.cjs +162 -0
  117. package/dist/gesture/session.d.cts +29 -0
  118. package/dist/gesture/session.d.ts +29 -0
  119. package/dist/gesture/session.js +158 -0
  120. package/dist/gesture/types.cjs +5 -0
  121. package/dist/gesture/types.d.cts +13 -0
  122. package/dist/gesture/types.d.ts +13 -0
  123. package/dist/gesture/types.js +4 -0
  124. package/dist/gesture/viewportConstraints.cjs +38 -0
  125. package/dist/gesture/viewportConstraints.d.cts +6 -0
  126. package/dist/gesture/viewportConstraints.d.ts +6 -0
  127. package/dist/gesture/viewportConstraints.js +34 -0
  128. package/dist/graph.cjs +226 -0
  129. package/dist/graph.d.cts +2 -0
  130. package/dist/graph.d.ts +2 -0
  131. package/dist/graph.js +223 -0
  132. package/dist/index.cjs +140 -0
  133. package/dist/index.d.cts +33 -0
  134. package/dist/index.d.ts +33 -0
  135. package/dist/index.js +70 -0
  136. package/dist/inertia.cjs +214 -0
  137. package/dist/inertia.d.cts +53 -0
  138. package/dist/inertia.d.ts +53 -0
  139. package/dist/inertia.js +212 -0
  140. package/dist/instant.cjs +66 -0
  141. package/dist/instant.d.cts +16 -0
  142. package/dist/instant.d.ts +16 -0
  143. package/dist/instant.js +63 -0
  144. package/dist/internal-driver.cjs +81 -0
  145. package/dist/internal-driver.d.cts +19 -0
  146. package/dist/internal-driver.d.ts +19 -0
  147. package/dist/internal-driver.js +35 -0
  148. package/dist/keyframes.cjs +191 -0
  149. package/dist/keyframes.d.cts +13 -0
  150. package/dist/keyframes.d.ts +13 -0
  151. package/dist/keyframes.js +188 -0
  152. package/dist/layout/commitDetector.cjs +67 -0
  153. package/dist/layout/commitDetector.d.cts +21 -0
  154. package/dist/layout/commitDetector.d.ts +21 -0
  155. package/dist/layout/commitDetector.js +64 -0
  156. package/dist/layout/compose.cjs +67 -0
  157. package/dist/layout/compose.d.cts +30 -0
  158. package/dist/layout/compose.d.ts +30 -0
  159. package/dist/layout/compose.js +65 -0
  160. package/dist/layout/constants.cjs +13 -0
  161. package/dist/layout/constants.d.cts +6 -0
  162. package/dist/layout/constants.d.ts +6 -0
  163. package/dist/layout/constants.js +10 -0
  164. package/dist/layout/identity.cjs +700 -0
  165. package/dist/layout/identity.d.cts +67 -0
  166. package/dist/layout/identity.d.ts +67 -0
  167. package/dist/layout/identity.js +698 -0
  168. package/dist/layout/index.cjs +36 -0
  169. package/dist/layout/index.d.cts +18 -0
  170. package/dist/layout/index.d.ts +18 -0
  171. package/dist/layout/index.js +13 -0
  172. package/dist/layout/measure.cjs +81 -0
  173. package/dist/layout/measure.d.cts +43 -0
  174. package/dist/layout/measure.d.ts +43 -0
  175. package/dist/layout/measure.js +78 -0
  176. package/dist/layout/projection.cjs +99 -0
  177. package/dist/layout/projection.d.cts +23 -0
  178. package/dist/layout/projection.d.ts +23 -0
  179. package/dist/layout/projection.js +97 -0
  180. package/dist/layout/scroll.cjs +27 -0
  181. package/dist/layout/scroll.d.cts +13 -0
  182. package/dist/layout/scroll.d.ts +13 -0
  183. package/dist/layout/scroll.js +24 -0
  184. package/dist/layout/session.cjs +207 -0
  185. package/dist/layout/session.d.cts +73 -0
  186. package/dist/layout/session.d.ts +73 -0
  187. package/dist/layout/session.js +205 -0
  188. package/dist/layout/tree.cjs +826 -0
  189. package/dist/layout/tree.d.cts +70 -0
  190. package/dist/layout/tree.d.ts +70 -0
  191. package/dist/layout/tree.js +823 -0
  192. package/dist/layout/types.cjs +36 -0
  193. package/dist/layout/types.d.cts +31 -0
  194. package/dist/layout/types.d.ts +31 -0
  195. package/dist/layout/types.js +35 -0
  196. package/dist/motion-arc.cjs +184 -0
  197. package/dist/motion-arc.d.cts +78 -0
  198. package/dist/motion-arc.d.ts +78 -0
  199. package/dist/motion-arc.js +183 -0
  200. package/dist/motion-mix.cjs +205 -0
  201. package/dist/motion-mix.d.cts +3 -0
  202. package/dist/motion-mix.d.ts +3 -0
  203. package/dist/motion-mix.js +202 -0
  204. package/dist/motion-value-driver-port.cjs +636 -0
  205. package/dist/motion-value-driver-port.d.cts +406 -0
  206. package/dist/motion-value-driver-port.d.ts +406 -0
  207. package/dist/motion-value-driver-port.js +627 -0
  208. package/dist/motion-value.cjs +189 -0
  209. package/dist/motion-value.d.cts +51 -0
  210. package/dist/motion-value.d.ts +51 -0
  211. package/dist/motion-value.js +185 -0
  212. package/dist/presence/controller.cjs +657 -0
  213. package/dist/presence/controller.d.cts +6 -0
  214. package/dist/presence/controller.d.ts +6 -0
  215. package/dist/presence/controller.js +652 -0
  216. package/dist/presence/index.cjs +19 -0
  217. package/dist/presence/index.d.cts +4 -0
  218. package/dist/presence/index.d.ts +4 -0
  219. package/dist/presence/index.js +12 -0
  220. package/dist/presence/machine.cjs +50 -0
  221. package/dist/presence/machine.d.cts +10 -0
  222. package/dist/presence/machine.d.ts +10 -0
  223. package/dist/presence/machine.js +46 -0
  224. package/dist/presence/types.cjs +6 -0
  225. package/dist/presence/types.d.cts +32 -0
  226. package/dist/presence/types.d.ts +32 -0
  227. package/dist/presence/types.js +5 -0
  228. package/dist/repeat.cjs +311 -0
  229. package/dist/repeat.d.cts +174 -0
  230. package/dist/repeat.d.ts +174 -0
  231. package/dist/repeat.js +300 -0
  232. package/dist/spring.cjs +128 -0
  233. package/dist/spring.d.cts +18 -0
  234. package/dist/spring.d.ts +18 -0
  235. package/dist/spring.js +125 -0
  236. package/dist/subscriptions.cjs +74 -0
  237. package/dist/subscriptions.d.cts +19 -0
  238. package/dist/subscriptions.d.ts +19 -0
  239. package/dist/subscriptions.js +69 -0
  240. package/dist/subset/index.cjs +23 -0
  241. package/dist/subset/index.d.cts +6 -0
  242. package/dist/subset/index.d.ts +6 -0
  243. package/dist/subset/index.js +13 -0
  244. package/dist/subset/normalize.cjs +90 -0
  245. package/dist/subset/normalize.d.cts +10 -0
  246. package/dist/subset/normalize.d.ts +10 -0
  247. package/dist/subset/normalize.js +85 -0
  248. package/dist/subset/registry.cjs +259 -0
  249. package/dist/subset/registry.d.cts +25 -0
  250. package/dist/subset/registry.d.ts +25 -0
  251. package/dist/subset/registry.js +256 -0
  252. package/dist/subset/resolve.cjs +98 -0
  253. package/dist/subset/resolve.d.cts +24 -0
  254. package/dist/subset/resolve.d.ts +24 -0
  255. package/dist/subset/resolve.js +90 -0
  256. package/dist/timing.cjs +206 -0
  257. package/dist/timing.d.cts +17 -0
  258. package/dist/timing.d.ts +17 -0
  259. package/dist/timing.js +201 -0
  260. package/dist/transformTemplate.cjs +219 -0
  261. package/dist/transformTemplate.d.cts +29 -0
  262. package/dist/transformTemplate.d.ts +29 -0
  263. package/dist/transformTemplate.js +215 -0
  264. package/dist/transition.cjs +231 -0
  265. package/dist/transition.d.cts +89 -0
  266. package/dist/transition.d.ts +89 -0
  267. package/dist/transition.js +223 -0
  268. package/dist/types.cjs +4 -0
  269. package/dist/types.d.cts +175 -0
  270. package/dist/types.d.ts +175 -0
  271. package/dist/types.js +3 -0
  272. package/dist/value-types/color.cjs +220 -0
  273. package/dist/value-types/color.d.cts +19 -0
  274. package/dist/value-types/color.d.ts +19 -0
  275. package/dist/value-types/color.js +218 -0
  276. package/dist/value-types/complex.cjs +160 -0
  277. package/dist/value-types/complex.d.cts +19 -0
  278. package/dist/value-types/complex.d.ts +19 -0
  279. package/dist/value-types/complex.js +155 -0
  280. package/dist/value-types/constants.cjs +15 -0
  281. package/dist/value-types/constants.d.cts +6 -0
  282. package/dist/value-types/constants.d.ts +6 -0
  283. package/dist/value-types/constants.js +12 -0
  284. package/dist/value-types/discrete.cjs +62 -0
  285. package/dist/value-types/discrete.d.cts +4 -0
  286. package/dist/value-types/discrete.d.ts +4 -0
  287. package/dist/value-types/discrete.js +56 -0
  288. package/dist/value-types/index.cjs +59 -0
  289. package/dist/value-types/index.d.cts +14 -0
  290. package/dist/value-types/index.d.ts +14 -0
  291. package/dist/value-types/index.js +24 -0
  292. package/dist/value-types/measure-resolve.cjs +325 -0
  293. package/dist/value-types/measure-resolve.d.cts +91 -0
  294. package/dist/value-types/measure-resolve.d.ts +91 -0
  295. package/dist/value-types/measure-resolve.js +313 -0
  296. package/dist/value-types/mix.cjs +90 -0
  297. package/dist/value-types/mix.d.cts +27 -0
  298. package/dist/value-types/mix.d.ts +27 -0
  299. package/dist/value-types/mix.js +85 -0
  300. package/dist/value-types/named-colors.cjs +61 -0
  301. package/dist/value-types/named-colors.d.cts +2 -0
  302. package/dist/value-types/named-colors.d.ts +2 -0
  303. package/dist/value-types/named-colors.js +58 -0
  304. package/dist/value-types/numeric.cjs +86 -0
  305. package/dist/value-types/numeric.d.cts +16 -0
  306. package/dist/value-types/numeric.d.ts +16 -0
  307. package/dist/value-types/numeric.js +79 -0
  308. package/dist/worklet-layout/config/constants.js +39 -0
  309. package/dist/worklet-layout/layout/constants.js +11 -0
  310. package/dist/worklet-layout/layout/identity.js +699 -0
  311. package/dist/worklet-layout/layout/projection.js +98 -0
  312. package/dist/worklet-layout/layout/session.js +206 -0
  313. package/dist/worklet-layout/layout/tree.js +824 -0
  314. package/dist/worklet-layout/layout/types.js +36 -0
  315. package/dist/worklet-layout/spring.js +125 -0
  316. package/dist/worklet-layout/timing.js +201 -0
  317. package/dist/worklet-layout/transition.js +223 -0
  318. package/dist/worklet-layout.cjs +47 -0
  319. package/dist/worklet-layout.d.cts +15 -0
  320. package/dist/worklet-layout.d.ts +15 -0
  321. package/dist/worklet-layout.js +28 -0
  322. package/dist/wrap.cjs +7 -0
  323. package/dist/wrap.d.cts +1 -0
  324. package/dist/wrap.d.ts +1 -0
  325. package/dist/wrap.js +4 -0
  326. package/package.json +45 -0
@@ -0,0 +1,58 @@
1
+ // CSS Color Module Level 4 named colors → canonical RGBA (REQ-VALUETYPE-005). Authored from the CSS
2
+ // spec, NOT motion-dom (which has no named-color table — `color.parse("red")` returns garbage; on web it
3
+ // delegates named colors to the DOM) and NOT the DOM/react-native, so the SAME raw string resolves to the
4
+ // SAME RGBA on both engines with no host in the loop. `transparent` is the CSS keyword for rgba(0,0,0,0).
5
+ // This is a curated common subset (the 16 CSS Level-2 keywords + `transparent` + frequent extended
6
+ // keywords); full-L4 completeness is the vetoable open decision (SPEC-VALUE-TYPES §8). Keys are lowercase;
7
+ // the lookup lowercases its input.
8
+ const opaque = (red, green, blue) => ({ red, green, blue, alpha: 1 });
9
+ export const NAMED_COLORS = {
10
+ transparent: { red: 0, green: 0, blue: 0, alpha: 0 },
11
+ // CSS Level 2 (basic) keywords
12
+ black: opaque(0, 0, 0),
13
+ silver: opaque(192, 192, 192),
14
+ gray: opaque(128, 128, 128),
15
+ white: opaque(255, 255, 255),
16
+ maroon: opaque(128, 0, 0),
17
+ red: opaque(255, 0, 0),
18
+ purple: opaque(128, 0, 128),
19
+ fuchsia: opaque(255, 0, 255),
20
+ green: opaque(0, 128, 0),
21
+ lime: opaque(0, 255, 0),
22
+ olive: opaque(128, 128, 0),
23
+ yellow: opaque(255, 255, 0),
24
+ navy: opaque(0, 0, 128),
25
+ blue: opaque(0, 0, 255),
26
+ teal: opaque(0, 128, 128),
27
+ aqua: opaque(0, 255, 255),
28
+ // Frequent extended keywords + spelling aliases
29
+ cyan: opaque(0, 255, 255), // alias of aqua
30
+ magenta: opaque(255, 0, 255), // alias of fuchsia
31
+ grey: opaque(128, 128, 128), // alias of gray
32
+ orange: opaque(255, 165, 0),
33
+ pink: opaque(255, 192, 203),
34
+ brown: opaque(165, 42, 42),
35
+ gold: opaque(255, 215, 0),
36
+ indigo: opaque(75, 0, 130),
37
+ violet: opaque(238, 130, 238),
38
+ darkgray: opaque(169, 169, 169),
39
+ darkgrey: opaque(169, 169, 169),
40
+ lightgray: opaque(211, 211, 211),
41
+ lightgrey: opaque(211, 211, 211),
42
+ dimgray: opaque(105, 105, 105),
43
+ slategray: opaque(112, 128, 144),
44
+ whitesmoke: opaque(245, 245, 245),
45
+ lightblue: opaque(173, 216, 230),
46
+ darkblue: opaque(0, 0, 139),
47
+ lightgreen: opaque(144, 238, 144),
48
+ darkgreen: opaque(0, 100, 0),
49
+ coral: opaque(255, 127, 80),
50
+ salmon: opaque(250, 128, 114),
51
+ tomato: opaque(255, 99, 71),
52
+ crimson: opaque(220, 20, 60),
53
+ skyblue: opaque(135, 206, 235),
54
+ steelblue: opaque(70, 130, 180),
55
+ turquoise: opaque(64, 224, 208),
56
+ beige: opaque(245, 245, 220),
57
+ ivory: opaque(255, 255, 240),
58
+ };
@@ -0,0 +1,86 @@
1
+ "use strict";
2
+ // Numeric + unit value types (SPEC-VALUE-TYPES §3, REQ-VALUETYPE-001/002/003/004). Pure parse/transform/
3
+ // mix over plain numbers and single-unit-suffixed numbers. Host-agnostic (REQ-VALUETYPE-011): no DOM, no
4
+ // react-native, no locale formatting. motion-dom carries no unit in its typed value and applies NO
5
+ // unit-identity check; this subsystem CARRIES the unit and fails loud on a mismatch — the INTENTIONAL,
6
+ // scenario-backed divergence (REQ-VALUETYPE-004).
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.parseNumericVerdict = parseNumericVerdict;
9
+ exports.parseNumeric = parseNumeric;
10
+ exports.isNumeric = isNumeric;
11
+ exports.transformNumeric = transformNumeric;
12
+ exports.mixNumeric = mixNumeric;
13
+ const constants_1 = require("./constants.cjs");
14
+ // A strict numeric token: optional sign, integer/fraction (or bare fraction), optional exponent.
15
+ // `parseFloat` is lenient (`"10abc" -> 10`); this gate rejects trailing garbage so a malformed value is a
16
+ // loud failure (REQ-VALUETYPE-008), never a silent truncation.
17
+ const NUMBER_RE = /^[+-]?(?:\d+\.?\d*|\.\d+)(?:e[+-]?\d+)?$/i;
18
+ function parseNumericVerdict(raw) {
19
+ if (typeof raw === 'number') {
20
+ if (!Number.isFinite(raw)) {
21
+ return { parsed: null, refusal: `Cannot parse non-finite numeric value: ${raw}` };
22
+ }
23
+ return { parsed: { value: raw, unit: '' }, refusal: null };
24
+ }
25
+ const s = raw.trim();
26
+ // REQ-VALUETYPE-002: a single value has no interior whitespace (splits on whitespace to length 1).
27
+ if (s.length === 0 || /\s/.test(s)) {
28
+ return {
29
+ parsed: null,
30
+ refusal: `Cannot parse ${JSON.stringify(raw)} as a single numeric/unit value (empty or interior whitespace)`,
31
+ };
32
+ }
33
+ for (const unit of constants_1.KNOWN_UNITS) {
34
+ if (s.length > unit.length && s.endsWith(unit)) {
35
+ const prefix = s.slice(0, s.length - unit.length);
36
+ if (NUMBER_RE.test(prefix)) {
37
+ return { parsed: { value: Number.parseFloat(prefix), unit }, refusal: null };
38
+ }
39
+ return {
40
+ parsed: null,
41
+ refusal: `Cannot parse ${JSON.stringify(raw)}: ${JSON.stringify(prefix)} is not a valid number before unit "${unit}"`,
42
+ };
43
+ }
44
+ }
45
+ if (NUMBER_RE.test(s))
46
+ return { parsed: { value: Number.parseFloat(s), unit: '' }, refusal: null };
47
+ return { parsed: null, refusal: `Cannot parse ${JSON.stringify(raw)} as a numeric or unit value` };
48
+ }
49
+ // Parse a raw string (or number) into a decomposed {value, unit}. Throws on unparseable input, interior
50
+ // whitespace, or a malformed numeric prefix (REQ-VALUETYPE-008) — no silent coercion.
51
+ function parseNumeric(raw) {
52
+ const verdict = parseNumericVerdict(raw);
53
+ if (verdict.refusal !== null)
54
+ throw new Error(verdict.refusal);
55
+ return verdict.parsed;
56
+ }
57
+ // Family predicate for the dispatcher (mix.ts): does the whole raw string decompose as a single
58
+ // number/unit value? Mirrors parseNumeric's acceptance without throwing — no interior whitespace, an
59
+ // optional trailing KNOWN unit, a strict numeric prefix.
60
+ function isNumeric(raw) {
61
+ const s = raw.trim();
62
+ if (s.length === 0 || /\s/.test(s))
63
+ return false;
64
+ for (const unit of constants_1.KNOWN_UNITS) {
65
+ if (s.length > unit.length && s.endsWith(unit)) {
66
+ return NUMBER_RE.test(s.slice(0, s.length - unit.length));
67
+ }
68
+ }
69
+ return NUMBER_RE.test(s);
70
+ }
71
+ // Project a typed value back to its committed form: a plain number transforms as the IDENTITY (returns
72
+ // the number, not a string, REQ-VALUETYPE-001); a unit value re-appends its suffix.
73
+ function transformNumeric(v) {
74
+ if (v.unit === '')
75
+ return v.value;
76
+ return `${v.value}${v.unit}`;
77
+ }
78
+ // Interpolate `origin + (target − origin)·progress` (REQ-VALUETYPE-003, motion's mixNumber), but only
79
+ // when the units are identical — a mismatch throws naming both raw values + units (REQ-VALUETYPE-004).
80
+ function mixNumeric(from, to, progress) {
81
+ if (from.unit !== to.unit) {
82
+ throw new Error(`Cannot interpolate mismatched units: "${transformNumeric(from)}" (unit "${from.unit || 'none'}") ` +
83
+ `against "${transformNumeric(to)}" (unit "${to.unit || 'none'}")`);
84
+ }
85
+ return { value: from.value + (to.value - from.value) * progress, unit: from.unit };
86
+ }
@@ -0,0 +1,16 @@
1
+ export interface NumericValue {
2
+ readonly value: number;
3
+ readonly unit: string;
4
+ }
5
+ export type NumericParseVerdict = {
6
+ readonly parsed: NumericValue;
7
+ readonly refusal: null;
8
+ } | {
9
+ readonly parsed: null;
10
+ readonly refusal: string;
11
+ };
12
+ export declare function parseNumericVerdict(raw: string | number): NumericParseVerdict;
13
+ export declare function parseNumeric(raw: string | number): NumericValue;
14
+ export declare function isNumeric(raw: string): boolean;
15
+ export declare function transformNumeric(v: NumericValue): string | number;
16
+ export declare function mixNumeric(from: NumericValue, to: NumericValue, progress: number): NumericValue;
@@ -0,0 +1,16 @@
1
+ export interface NumericValue {
2
+ readonly value: number;
3
+ readonly unit: string;
4
+ }
5
+ export type NumericParseVerdict = {
6
+ readonly parsed: NumericValue;
7
+ readonly refusal: null;
8
+ } | {
9
+ readonly parsed: null;
10
+ readonly refusal: string;
11
+ };
12
+ export declare function parseNumericVerdict(raw: string | number): NumericParseVerdict;
13
+ export declare function parseNumeric(raw: string | number): NumericValue;
14
+ export declare function isNumeric(raw: string): boolean;
15
+ export declare function transformNumeric(v: NumericValue): string | number;
16
+ export declare function mixNumeric(from: NumericValue, to: NumericValue, progress: number): NumericValue;
@@ -0,0 +1,79 @@
1
+ // Numeric + unit value types (SPEC-VALUE-TYPES §3, REQ-VALUETYPE-001/002/003/004). Pure parse/transform/
2
+ // mix over plain numbers and single-unit-suffixed numbers. Host-agnostic (REQ-VALUETYPE-011): no DOM, no
3
+ // react-native, no locale formatting. motion-dom carries no unit in its typed value and applies NO
4
+ // unit-identity check; this subsystem CARRIES the unit and fails loud on a mismatch — the INTENTIONAL,
5
+ // scenario-backed divergence (REQ-VALUETYPE-004).
6
+ import { KNOWN_UNITS } from "./constants.js";
7
+ // A strict numeric token: optional sign, integer/fraction (or bare fraction), optional exponent.
8
+ // `parseFloat` is lenient (`"10abc" -> 10`); this gate rejects trailing garbage so a malformed value is a
9
+ // loud failure (REQ-VALUETYPE-008), never a silent truncation.
10
+ const NUMBER_RE = /^[+-]?(?:\d+\.?\d*|\.\d+)(?:e[+-]?\d+)?$/i;
11
+ export function parseNumericVerdict(raw) {
12
+ if (typeof raw === 'number') {
13
+ if (!Number.isFinite(raw)) {
14
+ return { parsed: null, refusal: `Cannot parse non-finite numeric value: ${raw}` };
15
+ }
16
+ return { parsed: { value: raw, unit: '' }, refusal: null };
17
+ }
18
+ const s = raw.trim();
19
+ // REQ-VALUETYPE-002: a single value has no interior whitespace (splits on whitespace to length 1).
20
+ if (s.length === 0 || /\s/.test(s)) {
21
+ return {
22
+ parsed: null,
23
+ refusal: `Cannot parse ${JSON.stringify(raw)} as a single numeric/unit value (empty or interior whitespace)`,
24
+ };
25
+ }
26
+ for (const unit of KNOWN_UNITS) {
27
+ if (s.length > unit.length && s.endsWith(unit)) {
28
+ const prefix = s.slice(0, s.length - unit.length);
29
+ if (NUMBER_RE.test(prefix)) {
30
+ return { parsed: { value: Number.parseFloat(prefix), unit }, refusal: null };
31
+ }
32
+ return {
33
+ parsed: null,
34
+ refusal: `Cannot parse ${JSON.stringify(raw)}: ${JSON.stringify(prefix)} is not a valid number before unit "${unit}"`,
35
+ };
36
+ }
37
+ }
38
+ if (NUMBER_RE.test(s))
39
+ return { parsed: { value: Number.parseFloat(s), unit: '' }, refusal: null };
40
+ return { parsed: null, refusal: `Cannot parse ${JSON.stringify(raw)} as a numeric or unit value` };
41
+ }
42
+ // Parse a raw string (or number) into a decomposed {value, unit}. Throws on unparseable input, interior
43
+ // whitespace, or a malformed numeric prefix (REQ-VALUETYPE-008) — no silent coercion.
44
+ export function parseNumeric(raw) {
45
+ const verdict = parseNumericVerdict(raw);
46
+ if (verdict.refusal !== null)
47
+ throw new Error(verdict.refusal);
48
+ return verdict.parsed;
49
+ }
50
+ // Family predicate for the dispatcher (mix.ts): does the whole raw string decompose as a single
51
+ // number/unit value? Mirrors parseNumeric's acceptance without throwing — no interior whitespace, an
52
+ // optional trailing KNOWN unit, a strict numeric prefix.
53
+ export function isNumeric(raw) {
54
+ const s = raw.trim();
55
+ if (s.length === 0 || /\s/.test(s))
56
+ return false;
57
+ for (const unit of KNOWN_UNITS) {
58
+ if (s.length > unit.length && s.endsWith(unit)) {
59
+ return NUMBER_RE.test(s.slice(0, s.length - unit.length));
60
+ }
61
+ }
62
+ return NUMBER_RE.test(s);
63
+ }
64
+ // Project a typed value back to its committed form: a plain number transforms as the IDENTITY (returns
65
+ // the number, not a string, REQ-VALUETYPE-001); a unit value re-appends its suffix.
66
+ export function transformNumeric(v) {
67
+ if (v.unit === '')
68
+ return v.value;
69
+ return `${v.value}${v.unit}`;
70
+ }
71
+ // Interpolate `origin + (target − origin)·progress` (REQ-VALUETYPE-003, motion's mixNumber), but only
72
+ // when the units are identical — a mismatch throws naming both raw values + units (REQ-VALUETYPE-004).
73
+ export function mixNumeric(from, to, progress) {
74
+ if (from.unit !== to.unit) {
75
+ throw new Error(`Cannot interpolate mismatched units: "${transformNumeric(from)}" (unit "${from.unit || 'none'}") ` +
76
+ `against "${transformNumeric(to)}" (unit "${to.unit || 'none'}")`);
77
+ }
78
+ return { value: from.value + (to.value - from.value) * progress, unit: from.unit };
79
+ }
@@ -0,0 +1,39 @@
1
+ 'worklet';
2
+ // @frame-path — executes inside the UI-runtime frame step; allocation-gated (REQ-DRIVER-021).
3
+ // Pinned motion-graph constants. Adopted from `motion@12.42.2` (see
4
+ // `specs/OPEN-DECISIONS.md` §D resolutions log) and PROVEN equal to that pinned oracle by the M1b
5
+ // conformance suite — these literals are a starting seed, not hand-authored ground truth. Never
6
+ // widen an epsilon here to make a test pass (test-integrity); fix the code or ratify the constant.
7
+ /**
8
+ * CORE-only velocity staleness window (ms). Governs `MotionValue.getVelocity` and the animation
9
+ * cold-start velocity seed. It does NOT govern the gesture path — that consumes platform release
10
+ * velocity (§D/§G). A value sample older than this reads velocity `0`.
11
+ */
12
+ export const MAX_VELOCITY_DELTA_MS = 30;
13
+ /**
14
+ * Per-frame elapsed-time ceiling (ms). Guards the graph against a large jump after backgrounding
15
+ * (REQ-CLOCK-003). Flagged for human confirmation. ~2.4 frames at 60Hz.
16
+ */
17
+ export const DT_CLAMP_MS = 40;
18
+ // Rest thresholds — adopted from Motion; the exact numerics and their conformance pin are owned by
19
+ // SPEC-SPRING. Present here only so CORE has one source; SPRING tightens them.
20
+ export const REST_DELTA = 0.01;
21
+ export const REST_SPEED = 2;
22
+ /** Granular rest-threshold discontinuity at `|target − origin| < 5` (Motion). */
23
+ export const GRANULAR_THRESHOLD = 5;
24
+ // Named epsilons — config, not literals in assertions. Nominal seeds from SPEC-CORE §5; final
25
+ // values ratified with SPEC-SPRING and tightened against the pinned oracle in M1b.
26
+ /** Velocity equality tolerance (units/sec). */
27
+ export const EPS_VELOCITY = 1;
28
+ /** Trajectory / dt-robustness tolerance (value units). */
29
+ export const EPS_TRAJ = 0.5;
30
+ /** Settle is exact to the frame. */
31
+ export const EPS_SETTLE_FRAME = 0;
32
+ /**
33
+ * The settle law's shared horizon (r12 4f6e2d1b8a70 / r13 minor 1d6f4b8a2e90 — ONE
34
+ * authority): validateTransition requires every accepted trajectory to be DONE by this
35
+ * instant (~285 millennia), and stepProp's precision-freeze termination samples the settled
36
+ * state at max(elapsed, this horizon). The pairing is what guarantees an accepted config
37
+ * reaches its settled value on every stepping cadence; the two consumers must never diverge.
38
+ */
39
+ export const SETTLE_HORIZON_MS = 2 ** 53;
@@ -0,0 +1,11 @@
1
+ 'worklet';
2
+ // @frame-path — executes inside the UI-runtime frame step; allocation-gated (REQ-DRIVER-021).
3
+ // SPEC-LAYOUT §4a pinned tolerances. Stated once, shared across the projection math, composition, and the
4
+ // session. Position/scale epsilons gate identity-at-settle + counter-scale; the velocity epsilon gates
5
+ // retarget C1 continuity (M4). These are invariant tolerances, not feel parameters — they do not widen.
6
+ /** Position/edge coincidence tolerance (px): ends-at-host-layout, parent-relative coherence, C0 seam. */
7
+ export const EPSILON_POS = 0.5;
8
+ /** Child-size tolerance (fraction): a counter-scaled child stays within 1% of its intrinsic size. */
9
+ export const EPSILON_SCALE = 0.01;
10
+ /** Retarget velocity-continuity tolerance (px/s): the C1 seam when a layout change arrives mid-projection. */
11
+ export const EPSILON_VEL = 1;