@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,325 @@
1
+ "use strict";
2
+ // REQ-VALUETYPE-013/014 — positional length measure-resolve (R13 value-breadth).
3
+ // Pure recognition + arithmetic against a host-supplied layout context. No DOM, no RN.
4
+ // Pin: motion-dom DOMKeyframesResolver measure path; catalog Animation-between-value-types,
5
+ // height-auto*, Shared-layout-continuity* calc(100vw - 100px).
6
+ //
7
+ // Law: calc is first-class — never silent complex tokenization of interior numbers.
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.parseNumeric = exports.MeasureResolveContextError = exports.POSITIONAL_LENGTH_AXES = void 0;
10
+ exports.isPositionalLengthAxis = isPositionalLengthAxis;
11
+ exports.executableLengthValueRefusal = executableLengthValueRefusal;
12
+ exports.isAuto = isAuto;
13
+ exports.isCalc = isCalc;
14
+ exports.parseLengthTargetVerdict = parseLengthTargetVerdict;
15
+ exports.parseLengthTarget = parseLengthTarget;
16
+ exports.isLengthTarget = isLengthTarget;
17
+ exports.resolveLengthToPx = resolveLengthToPx;
18
+ exports.needsLengthMeasureResolve = needsLengthMeasureResolve;
19
+ const numeric_1 = require("./numeric.cjs");
20
+ Object.defineProperty(exports, "parseNumeric", { enumerable: true, get: function () { return numeric_1.parseNumeric; } });
21
+ const POSITIONAL_LENGTH_AXIS_SET = new Set([
22
+ 'width',
23
+ 'height',
24
+ 'top',
25
+ 'right',
26
+ 'bottom',
27
+ 'left',
28
+ 'x',
29
+ 'y',
30
+ ]);
31
+ /** The positional keys whose length STRINGS any engine may measure-resolve (REQ-VALUETYPE-013). */
32
+ exports.POSITIONAL_LENGTH_AXES = Object.freeze([
33
+ 'width',
34
+ 'height',
35
+ 'top',
36
+ 'right',
37
+ 'bottom',
38
+ 'left',
39
+ 'x',
40
+ 'y',
41
+ ]);
42
+ /** Runtime membership of the positional length axis set (cross-engine, one authority). */
43
+ function isPositionalLengthAxis(key) {
44
+ return POSITIONAL_LENGTH_AXIS_SET.has(key);
45
+ }
46
+ /**
47
+ * The ONE key-aware executable value matrix (review fe5d455ffde7 / 91d41675d511): a
48
+ * measure-resolved length string (scalar, or any keyframe element — a null FIRST element is the
49
+ * legal from-current marker) executes only on the positional keys, and `auto` only for
50
+ * width/height (the intrinsic content measure; the positional-auto remainder stays loud).
51
+ * Returns the named refusal, or null when the value rides another lane (number, non-string) or
52
+ * is executable. Used by every supplying boundary: core target validation (web + native), the
53
+ * variants dictionary gate, the gesture-state gate, and the style-base gate.
54
+ */
55
+ function executableLengthValueRefusal(key, value) {
56
+ if (typeof value === 'number')
57
+ return null;
58
+ if (Array.isArray(value)) {
59
+ for (let index = 0; index < value.length; index++) {
60
+ const element = value[index];
61
+ if (element === null && index === 0)
62
+ continue;
63
+ const refusal = executableLengthValueRefusal(key, element);
64
+ if (refusal !== null)
65
+ return refusal;
66
+ }
67
+ return null;
68
+ }
69
+ if (typeof value !== 'string')
70
+ return null;
71
+ if (!isLengthTarget(value))
72
+ return null; // not a length string — the value-type lane owns it
73
+ if (!isPositionalLengthAxis(key)) {
74
+ return (`measure-resolved length strings (%/auto/simple calc/px) execute only on the positional ` +
75
+ `keys (${exports.POSITIONAL_LENGTH_AXES.join(', ')}); '${key}' drives explicit numbers ` +
76
+ `(REQ-VALUETYPE-013)`);
77
+ }
78
+ if (isAuto(value) && key !== 'width' && key !== 'height') {
79
+ return (`not yet supported — positional 'auto' on '${key}' cannot measure-resolve ` +
80
+ '(REQ-VALUETYPE-013; auto resolves for width/height only, the intrinsic content measure)');
81
+ }
82
+ return null;
83
+ }
84
+ const CALC_OUTER_RE = /^calc\(\s*(.+)\s*\)$/i;
85
+ // Pin-exercised simple binary forms only: term (op) term, each term a number/unit or nested not allowed.
86
+ const SIMPLE_CALC_BODY_RE = /^([+-]?(?:\d+\.?\d*|\.\d+)(?:e[+-]?\d+)?(?:px|%|vw|vh)?)\s*([+-])\s*([+-]?(?:\d+\.?\d*|\.\d+)(?:e[+-]?\d+)?(?:px|%|vw|vh)?)$/i;
87
+ function isAuto(raw) {
88
+ return raw.trim().toLowerCase() === 'auto';
89
+ }
90
+ /**
91
+ * Calc prefix detection (REQ-VALUETYPE-013): match `calc(` regardless of trailing `)`.
92
+ * Malformed/unclosed calc must NOT fall through to complex partial tokenization — parse
93
+ * routes it to a named refusal.
94
+ */
95
+ function isCalc(raw) {
96
+ return /^calc\s*\(/i.test(raw.trim());
97
+ }
98
+ class MeasureResolveContextError extends Error {
99
+ reason;
100
+ axis;
101
+ constructor(message, reason, axis) {
102
+ super(message);
103
+ this.name = 'MeasureResolveContextError';
104
+ this.reason = reason;
105
+ this.axis = axis;
106
+ }
107
+ }
108
+ exports.MeasureResolveContextError = MeasureResolveContextError;
109
+ /** Layout/inset axes: % of parent. Transform x/y: % of the element box (pin unit-conversion). */
110
+ function percentReferenceSize(axis, ctx) {
111
+ if (axis === 'x')
112
+ return { size: ctx.autoWidth, label: 'element width (transform %)' };
113
+ if (axis === 'y')
114
+ return { size: ctx.autoHeight, label: 'element height (transform %)' };
115
+ if (axis === 'width' || axis === 'left' || axis === 'right') {
116
+ return { size: ctx.parentWidth, label: 'parent width' };
117
+ }
118
+ return { size: ctx.parentHeight, label: 'parent height' };
119
+ }
120
+ // The supported auto matrix is DIMENSIONS only (review e2b1b9c7013b): width/height auto is the
121
+ // intrinsic content measure (the shipped height-auto capability). Positional auto
122
+ // (left/right/top/bottom/x/y) is NOT Motion-faithful as an element-box size — motion-dom reads
123
+ // computed left/top, bounding-box right/bottom, and the current transform translation — so it
124
+ // stays loud with the named "not yet supported" format, never a silently unrelated endpoint.
125
+ // The reason is typed ('unsupported-axis-auto'): it must never read as a deferrable
126
+ // missing-element-measure (hosts would park the key behind onLayout instead of refusing it).
127
+ function autoRefusal(axis) {
128
+ if (axis === 'width' || axis === 'height')
129
+ return null;
130
+ return new MeasureResolveContextError(`not yet supported — positional 'auto' on '${axis}' cannot measure-resolve ` +
131
+ '(REQ-VALUETYPE-013; auto resolves for width/height only, the intrinsic content measure; ' +
132
+ 'positional left/right/top/bottom/x/y auto is the unsupported remainder)', 'unsupported-axis-auto', axis);
133
+ }
134
+ function autoSize(axis, ctx) {
135
+ return axis === 'width' ? ctx.autoWidth : ctx.autoHeight;
136
+ }
137
+ // Inputs and context components are validated finite, but the ARITHMETIC can still overflow
138
+ // (review 46e1c8fd339a): calc(1e308px + 1e308px), 1e308% of a large parent, or a cancellation
139
+ // to NaN (Infinity − Infinity) would otherwise reach driver invariants as a raw Infinity/NaN.
140
+ // The resolved result is boundary-checked through the same typed channel — never deferred.
141
+ function assertFiniteResolved(value, axis) {
142
+ if (!Number.isFinite(value)) {
143
+ throw new MeasureResolveContextError(`measure-resolve on '${axis}' produced a non-finite result (${value}); finite inputs ` +
144
+ 'overflowed the driver lane, which requires finite px (REQ-VALUETYPE-013)', 'non-finite-result', axis);
145
+ }
146
+ return value;
147
+ }
148
+ function parseLengthTargetVerdict(raw) {
149
+ if (typeof raw === 'number') {
150
+ if (!Number.isFinite(raw)) {
151
+ return { parsed: null, refusal: `Cannot parse non-finite length target: ${raw}` };
152
+ }
153
+ return { parsed: { kind: 'px', value: raw }, refusal: null };
154
+ }
155
+ const s = raw.trim();
156
+ if (s.length === 0)
157
+ return { parsed: null, refusal: `Cannot parse empty length target` };
158
+ if (isAuto(s))
159
+ return { parsed: { kind: 'auto' }, refusal: null };
160
+ if (isCalc(s))
161
+ return parseSimpleCalcVerdict(s);
162
+ const verdict = (0, numeric_1.parseNumericVerdict)(s);
163
+ if (verdict.refusal !== null) {
164
+ return { parsed: null, refusal: verdict.refusal };
165
+ }
166
+ const { value, unit } = verdict.parsed;
167
+ if (unit === '' || unit === 'px')
168
+ return { parsed: { kind: 'px', value }, refusal: null };
169
+ if (unit === '%')
170
+ return { parsed: { kind: 'percent', value }, refusal: null };
171
+ if (unit === 'vw')
172
+ return { parsed: { kind: 'vw', value }, refusal: null };
173
+ if (unit === 'vh')
174
+ return { parsed: { kind: 'vh', value }, refusal: null };
175
+ return {
176
+ parsed: null,
177
+ refusal: `not yet supported — length unit "${unit}" in ${JSON.stringify(raw)} cannot measure-resolve ` +
178
+ `(REQ-VALUETYPE-013; supported: number/px/%/vw/vh/auto/simple calc)`,
179
+ };
180
+ }
181
+ /** Parse a single length term used inside simple calc or as a standalone target. */
182
+ function parseLengthTarget(raw) {
183
+ const verdict = parseLengthTargetVerdict(raw);
184
+ if (verdict.refusal !== null)
185
+ throw new Error(verdict.refusal);
186
+ return verdict.parsed;
187
+ }
188
+ /**
189
+ * Total predicate: whether `raw` is a measure-resolved length form (no throw).
190
+ * Drivers use this at recognition boundaries — never bare try/catch over parseLengthTarget
191
+ * (unexpected faults must not be classified as “not a length”).
192
+ */
193
+ function isLengthTarget(raw) {
194
+ return parseLengthTargetVerdict(raw).refusal === null;
195
+ }
196
+ /** Verdict-shaped simple calc — no catch: unexpected faults from RegExp/String propagate. */
197
+ function parseSimpleCalcVerdict(raw) {
198
+ const s = raw.trim();
199
+ const outer = CALC_OUTER_RE.exec(s);
200
+ if (outer === null) {
201
+ return {
202
+ parsed: null,
203
+ refusal: `not yet supported — malformed calc ${JSON.stringify(raw)} (REQ-VALUETYPE-013)`,
204
+ };
205
+ }
206
+ const body = outer[1].trim();
207
+ // Nested parens / var() / multi-ops → loud incomplete (never partial complex).
208
+ if (body.includes('(') || /var\s*\(/i.test(body) || body.includes('*') || body.includes('/')) {
209
+ return {
210
+ parsed: null,
211
+ refusal: `not yet supported — calc form ${JSON.stringify(raw)} is outside the pin simple binary set ` +
212
+ `(REQ-VALUETYPE-013(d))`,
213
+ };
214
+ }
215
+ const m = SIMPLE_CALC_BODY_RE.exec(body);
216
+ if (m === null) {
217
+ return {
218
+ parsed: null,
219
+ refusal: `not yet supported — calc form ${JSON.stringify(raw)} is outside the pin simple binary set ` +
220
+ `(REQ-VALUETYPE-013(d))`,
221
+ };
222
+ }
223
+ const leftVerdict = parseLengthTargetVerdict(m[1]);
224
+ if (leftVerdict.refusal !== null)
225
+ return leftVerdict;
226
+ const rightVerdict = parseLengthTargetVerdict(m[3]);
227
+ if (rightVerdict.refusal !== null)
228
+ return rightVerdict;
229
+ const left = leftVerdict.parsed;
230
+ const right = rightVerdict.parsed;
231
+ const op = m[2];
232
+ if (left.kind === 'calc' ||
233
+ right.kind === 'calc' ||
234
+ left.kind === 'auto' ||
235
+ right.kind === 'auto') {
236
+ return {
237
+ parsed: null,
238
+ refusal: `not yet supported — nested/auto inside calc ${JSON.stringify(raw)} (REQ-VALUETYPE-013(d))`,
239
+ };
240
+ }
241
+ return { parsed: { kind: 'calc', raw: s, left, op, right }, refusal: null };
242
+ }
243
+ function resolveParsed(parsed, axis, ctx) {
244
+ switch (parsed.kind) {
245
+ case 'px':
246
+ return parsed.value;
247
+ case 'percent': {
248
+ const { size, label } = percentReferenceSize(axis, ctx);
249
+ if (size === undefined || !Number.isFinite(size)) {
250
+ const reason = axis === 'x' || axis === 'y' ? 'missing-element-measure' : 'missing-parent';
251
+ throw new MeasureResolveContextError(`Cannot measure-resolve percent length on ${axis}: ${label} missing from layout context ` +
252
+ `(REQ-VALUETYPE-013)`, reason, axis);
253
+ }
254
+ return assertFiniteResolved((parsed.value / 100) * size, axis);
255
+ }
256
+ case 'vw': {
257
+ if (ctx.viewportWidth === undefined || !Number.isFinite(ctx.viewportWidth)) {
258
+ throw new MeasureResolveContextError(`Cannot measure-resolve vw length: viewportWidth missing from layout context (REQ-VALUETYPE-013)`, 'missing-viewport', axis);
259
+ }
260
+ return assertFiniteResolved((parsed.value / 100) * ctx.viewportWidth, axis);
261
+ }
262
+ case 'vh': {
263
+ if (ctx.viewportHeight === undefined || !Number.isFinite(ctx.viewportHeight)) {
264
+ throw new MeasureResolveContextError(`Cannot measure-resolve vh length: viewportHeight missing from layout context (REQ-VALUETYPE-013)`, 'missing-viewport', axis);
265
+ }
266
+ return assertFiniteResolved((parsed.value / 100) * ctx.viewportHeight, axis);
267
+ }
268
+ case 'auto': {
269
+ const refusal = autoRefusal(axis);
270
+ if (refusal !== null)
271
+ throw refusal;
272
+ const size = autoSize(axis, ctx);
273
+ if (size === undefined || !Number.isFinite(size)) {
274
+ throw new MeasureResolveContextError(`Cannot measure-resolve auto on ${axis}: auto measure missing from layout context (REQ-VALUETYPE-013)`, 'missing-element-measure', axis);
275
+ }
276
+ return size;
277
+ }
278
+ case 'calc': {
279
+ const l = resolveParsed(parsed.left, axis, ctx);
280
+ const r = resolveParsed(parsed.right, axis, ctx);
281
+ return assertFiniteResolved(parsed.op === '+' ? l + r : l - r, axis);
282
+ }
283
+ }
284
+ }
285
+ /**
286
+ * Resolve a length target to px using host layout context (Motion measure-then-mix law).
287
+ * Pure: all geometry arrives in `ctx`.
288
+ */
289
+ function resolveLengthToPx(raw, axis, ctx) {
290
+ return resolveParsed(parseLengthTarget(raw), axis, ctx);
291
+ }
292
+ function familyOf(parsed) {
293
+ if (parsed.kind === 'px')
294
+ return 'px';
295
+ if (parsed.kind === 'calc')
296
+ return 'calc';
297
+ return parsed.kind;
298
+ }
299
+ /**
300
+ * Motion needsMeasurement — the pin's family decision (review ae0a42832d85): the SAME relative
301
+ * unit family returns WITHOUT a measure (%→%, vw→vw, vh→vh interpolate on the unit lane — on
302
+ * native, measured-endpoint animation per the recorded divergence, never a unit-string
303
+ * generator). auto and calc always measure; mixed families measure.
304
+ */
305
+ function needsLengthMeasureResolve(from, to) {
306
+ const a = parseLengthTarget(from);
307
+ const b = parseLengthTarget(to);
308
+ if (a.kind === 'auto' || b.kind === 'auto')
309
+ return true;
310
+ if (a.kind === 'calc' || b.kind === 'calc')
311
+ return true;
312
+ // Same relative unit family → the pin returns immediately (no measure).
313
+ if (a.kind === 'percent' && b.kind === 'percent')
314
+ return false;
315
+ if (a.kind === 'vw' && b.kind === 'vw')
316
+ return false;
317
+ if (a.kind === 'vh' && b.kind === 'vh')
318
+ return false;
319
+ if (a.kind === 'percent' || b.kind === 'percent')
320
+ return true;
321
+ if (a.kind === 'vw' || b.kind === 'vw' || a.kind === 'vh' || b.kind === 'vh')
322
+ return true;
323
+ // both px-family
324
+ return familyOf(a) !== familyOf(b);
325
+ }
@@ -0,0 +1,91 @@
1
+ import { parseNumeric } from "./numeric.cjs";
2
+ /** Host-measured geometry the pure resolver needs. Drivers fill this from onLayout / viewport. */
3
+ export interface LengthLayoutContext {
4
+ readonly parentWidth?: number;
5
+ readonly parentHeight?: number;
6
+ readonly viewportWidth?: number;
7
+ readonly viewportHeight?: number;
8
+ /** Content-box size when the element is laid out at height/width:auto. */
9
+ readonly autoWidth?: number;
10
+ readonly autoHeight?: number;
11
+ }
12
+ export type PositionalLengthAxis = 'width' | 'height' | 'top' | 'right' | 'bottom' | 'left' | 'x' | 'y';
13
+ /** The positional keys whose length STRINGS any engine may measure-resolve (REQ-VALUETYPE-013). */
14
+ export declare const POSITIONAL_LENGTH_AXES: readonly PositionalLengthAxis[];
15
+ /** Runtime membership of the positional length axis set (cross-engine, one authority). */
16
+ export declare function isPositionalLengthAxis(key: string): key is PositionalLengthAxis;
17
+ /**
18
+ * The ONE key-aware executable value matrix (review fe5d455ffde7 / 91d41675d511): a
19
+ * measure-resolved length string (scalar, or any keyframe element — a null FIRST element is the
20
+ * legal from-current marker) executes only on the positional keys, and `auto` only for
21
+ * width/height (the intrinsic content measure; the positional-auto remainder stays loud).
22
+ * Returns the named refusal, or null when the value rides another lane (number, non-string) or
23
+ * is executable. Used by every supplying boundary: core target validation (web + native), the
24
+ * variants dictionary gate, the gesture-state gate, and the style-base gate.
25
+ */
26
+ export declare function executableLengthValueRefusal(key: string, value: unknown): string | null;
27
+ export type ParsedLengthTarget = {
28
+ readonly kind: 'px';
29
+ readonly value: number;
30
+ } | {
31
+ readonly kind: 'percent';
32
+ readonly value: number;
33
+ } | {
34
+ readonly kind: 'vw';
35
+ readonly value: number;
36
+ } | {
37
+ readonly kind: 'vh';
38
+ readonly value: number;
39
+ } | {
40
+ readonly kind: 'auto';
41
+ } | {
42
+ readonly kind: 'calc';
43
+ readonly raw: string;
44
+ readonly left: ParsedLengthTarget;
45
+ readonly op: '+' | '-';
46
+ readonly right: ParsedLengthTarget;
47
+ };
48
+ export declare function isAuto(raw: string): boolean;
49
+ /**
50
+ * Calc prefix detection (REQ-VALUETYPE-013): match `calc(` regardless of trailing `)`.
51
+ * Malformed/unclosed calc must NOT fall through to complex partial tokenization — parse
52
+ * routes it to a named refusal.
53
+ */
54
+ export declare function isCalc(raw: string): boolean;
55
+ /** Missing layout-geometry failures — typed so host severity can branch without message regex. */
56
+ export type MeasureResolveContextReason = 'missing-element-measure' | 'missing-parent' | 'missing-viewport' | 'unsupported-axis-auto' | 'non-finite-result';
57
+ export declare class MeasureResolveContextError extends Error {
58
+ readonly reason: MeasureResolveContextReason;
59
+ readonly axis: PositionalLengthAxis;
60
+ constructor(message: string, reason: MeasureResolveContextReason, axis: PositionalLengthAxis);
61
+ }
62
+ /** Verdict-shaped parse (no throw) for the validateTarget boundary (return-shaped refusals). */
63
+ export type LengthTargetParseVerdict = {
64
+ readonly parsed: ParsedLengthTarget;
65
+ readonly refusal: null;
66
+ } | {
67
+ readonly parsed: null;
68
+ readonly refusal: string;
69
+ };
70
+ export declare function parseLengthTargetVerdict(raw: string | number): LengthTargetParseVerdict;
71
+ /** Parse a single length term used inside simple calc or as a standalone target. */
72
+ export declare function parseLengthTarget(raw: string | number): ParsedLengthTarget;
73
+ /**
74
+ * Total predicate: whether `raw` is a measure-resolved length form (no throw).
75
+ * Drivers use this at recognition boundaries — never bare try/catch over parseLengthTarget
76
+ * (unexpected faults must not be classified as “not a length”).
77
+ */
78
+ export declare function isLengthTarget(raw: string | number): boolean;
79
+ /**
80
+ * Resolve a length target to px using host layout context (Motion measure-then-mix law).
81
+ * Pure: all geometry arrives in `ctx`.
82
+ */
83
+ export declare function resolveLengthToPx(raw: string | number, axis: PositionalLengthAxis, ctx: LengthLayoutContext): number;
84
+ /**
85
+ * Motion needsMeasurement — the pin's family decision (review ae0a42832d85): the SAME relative
86
+ * unit family returns WITHOUT a measure (%→%, vw→vw, vh→vh interpolate on the unit lane — on
87
+ * native, measured-endpoint animation per the recorded divergence, never a unit-string
88
+ * generator). auto and calc always measure; mixed families measure.
89
+ */
90
+ export declare function needsLengthMeasureResolve(from: string | number, to: string | number): boolean;
91
+ export { parseNumeric };
@@ -0,0 +1,91 @@
1
+ import { parseNumeric } from "./numeric.js";
2
+ /** Host-measured geometry the pure resolver needs. Drivers fill this from onLayout / viewport. */
3
+ export interface LengthLayoutContext {
4
+ readonly parentWidth?: number;
5
+ readonly parentHeight?: number;
6
+ readonly viewportWidth?: number;
7
+ readonly viewportHeight?: number;
8
+ /** Content-box size when the element is laid out at height/width:auto. */
9
+ readonly autoWidth?: number;
10
+ readonly autoHeight?: number;
11
+ }
12
+ export type PositionalLengthAxis = 'width' | 'height' | 'top' | 'right' | 'bottom' | 'left' | 'x' | 'y';
13
+ /** The positional keys whose length STRINGS any engine may measure-resolve (REQ-VALUETYPE-013). */
14
+ export declare const POSITIONAL_LENGTH_AXES: readonly PositionalLengthAxis[];
15
+ /** Runtime membership of the positional length axis set (cross-engine, one authority). */
16
+ export declare function isPositionalLengthAxis(key: string): key is PositionalLengthAxis;
17
+ /**
18
+ * The ONE key-aware executable value matrix (review fe5d455ffde7 / 91d41675d511): a
19
+ * measure-resolved length string (scalar, or any keyframe element — a null FIRST element is the
20
+ * legal from-current marker) executes only on the positional keys, and `auto` only for
21
+ * width/height (the intrinsic content measure; the positional-auto remainder stays loud).
22
+ * Returns the named refusal, or null when the value rides another lane (number, non-string) or
23
+ * is executable. Used by every supplying boundary: core target validation (web + native), the
24
+ * variants dictionary gate, the gesture-state gate, and the style-base gate.
25
+ */
26
+ export declare function executableLengthValueRefusal(key: string, value: unknown): string | null;
27
+ export type ParsedLengthTarget = {
28
+ readonly kind: 'px';
29
+ readonly value: number;
30
+ } | {
31
+ readonly kind: 'percent';
32
+ readonly value: number;
33
+ } | {
34
+ readonly kind: 'vw';
35
+ readonly value: number;
36
+ } | {
37
+ readonly kind: 'vh';
38
+ readonly value: number;
39
+ } | {
40
+ readonly kind: 'auto';
41
+ } | {
42
+ readonly kind: 'calc';
43
+ readonly raw: string;
44
+ readonly left: ParsedLengthTarget;
45
+ readonly op: '+' | '-';
46
+ readonly right: ParsedLengthTarget;
47
+ };
48
+ export declare function isAuto(raw: string): boolean;
49
+ /**
50
+ * Calc prefix detection (REQ-VALUETYPE-013): match `calc(` regardless of trailing `)`.
51
+ * Malformed/unclosed calc must NOT fall through to complex partial tokenization — parse
52
+ * routes it to a named refusal.
53
+ */
54
+ export declare function isCalc(raw: string): boolean;
55
+ /** Missing layout-geometry failures — typed so host severity can branch without message regex. */
56
+ export type MeasureResolveContextReason = 'missing-element-measure' | 'missing-parent' | 'missing-viewport' | 'unsupported-axis-auto' | 'non-finite-result';
57
+ export declare class MeasureResolveContextError extends Error {
58
+ readonly reason: MeasureResolveContextReason;
59
+ readonly axis: PositionalLengthAxis;
60
+ constructor(message: string, reason: MeasureResolveContextReason, axis: PositionalLengthAxis);
61
+ }
62
+ /** Verdict-shaped parse (no throw) for the validateTarget boundary (return-shaped refusals). */
63
+ export type LengthTargetParseVerdict = {
64
+ readonly parsed: ParsedLengthTarget;
65
+ readonly refusal: null;
66
+ } | {
67
+ readonly parsed: null;
68
+ readonly refusal: string;
69
+ };
70
+ export declare function parseLengthTargetVerdict(raw: string | number): LengthTargetParseVerdict;
71
+ /** Parse a single length term used inside simple calc or as a standalone target. */
72
+ export declare function parseLengthTarget(raw: string | number): ParsedLengthTarget;
73
+ /**
74
+ * Total predicate: whether `raw` is a measure-resolved length form (no throw).
75
+ * Drivers use this at recognition boundaries — never bare try/catch over parseLengthTarget
76
+ * (unexpected faults must not be classified as “not a length”).
77
+ */
78
+ export declare function isLengthTarget(raw: string | number): boolean;
79
+ /**
80
+ * Resolve a length target to px using host layout context (Motion measure-then-mix law).
81
+ * Pure: all geometry arrives in `ctx`.
82
+ */
83
+ export declare function resolveLengthToPx(raw: string | number, axis: PositionalLengthAxis, ctx: LengthLayoutContext): number;
84
+ /**
85
+ * Motion needsMeasurement — the pin's family decision (review ae0a42832d85): the SAME relative
86
+ * unit family returns WITHOUT a measure (%→%, vw→vw, vh→vh interpolate on the unit lane — on
87
+ * native, measured-endpoint animation per the recorded divergence, never a unit-string
88
+ * generator). auto and calc always measure; mixed families measure.
89
+ */
90
+ export declare function needsLengthMeasureResolve(from: string | number, to: string | number): boolean;
91
+ export { parseNumeric };