@exponential_app/eui 0.3.0 → 0.4.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 (442) hide show
  1. package/catalog/a11y.json +10 -0
  2. package/catalog/core.catalog.json +284 -6
  3. package/catalog/core.schema.json +437 -4
  4. package/catalog/layout.json +3 -2
  5. package/catalog/limits.json +10 -1
  6. package/catalog/macros.json +1 -0
  7. package/catalog/recipes.json +3 -1
  8. package/catalog/strings.json +9 -2
  9. package/catalog/style.json +21 -0
  10. package/catalog/theme.schema.json +4435 -3676
  11. package/conformance/manifest.json +2 -2
  12. package/conformance/motion/build-corpus.ts +232 -0
  13. package/conformance/motion/corpus/SOURCES.md +117 -0
  14. package/conformance/motion/corpus/images/footage_0.json +1 -0
  15. package/conformance/motion/corpus/images/img_0.jpg +0 -0
  16. package/conformance/motion/corpus/images/img_1.jpg +0 -0
  17. package/conformance/motion/corpus/images/triangle.png +0 -0
  18. package/conformance/motion/corpus/skottie-3d-parenting-nocamera.json +367 -0
  19. package/conformance/motion/corpus/skottie-auto-orient-2.json +292 -0
  20. package/conformance/motion/corpus/skottie-auto-orient.json +717 -0
  21. package/conformance/motion/corpus/skottie-bezier-extranormal.json +199 -0
  22. package/conformance/motion/corpus/skottie-blendmode-hardmix.json +558 -0
  23. package/conformance/motion/corpus/skottie-chained-mattes.json +259 -0
  24. package/conformance/motion/corpus/skottie-dropshadow-ramp.json +852 -0
  25. package/conformance/motion/corpus/skottie-dropshadow-style.json +278 -0
  26. package/conformance/motion/corpus/skottie-effects-transform.json +385 -0
  27. package/conformance/motion/corpus/skottie-fill-effect.json +358 -0
  28. package/conformance/motion/corpus/skottie-fill-rule.json +457 -0
  29. package/conformance/motion/corpus/skottie-gaussian-blur.json +670 -0
  30. package/conformance/motion/corpus/skottie-gradient-opacity.json +451 -0
  31. package/conformance/motion/corpus/skottie-gradient-radial-highlight.json +581 -0
  32. package/conformance/motion/corpus/skottie-hidden-shapes-layers.json +381 -0
  33. package/conformance/motion/corpus/skottie-huesaturation-effect.json +1117 -0
  34. package/conformance/motion/corpus/skottie-invert-effect.json +665 -0
  35. package/conformance/motion/corpus/skottie-luma-matte.json +239 -0
  36. package/conformance/motion/corpus/skottie-mask-feather.json +892 -0
  37. package/conformance/motion/corpus/skottie-masking-opaque.json +2376 -0
  38. package/conformance/motion/corpus/skottie-masking-translucent.json +2376 -0
  39. package/conformance/motion/corpus/skottie-matte-blendmode.json +196 -0
  40. package/conformance/motion/corpus/skottie-matte-nonsequential.json +722 -0
  41. package/conformance/motion/corpus/skottie-matte-visible.json +666 -0
  42. package/conformance/motion/corpus/skottie-mergepaths-effect.json +722 -0
  43. package/conformance/motion/corpus/skottie-motion-blur-mask.json +120 -0
  44. package/conformance/motion/corpus/skottie-nested-animation.json +253 -0
  45. package/conformance/motion/corpus/skottie-offsetpaths-effect.json +525 -0
  46. package/conformance/motion/corpus/skottie-phonehub-connecting.json +947 -0
  47. package/conformance/motion/corpus/skottie-puckerbloat-effect.json +339 -0
  48. package/conformance/motion/corpus/skottie-repeater.json +234 -0
  49. package/conformance/motion/corpus/skottie-sample-1.json +168 -0
  50. package/conformance/motion/corpus/skottie-sample-search.json +329 -0
  51. package/conformance/motion/corpus/skottie-spatial-supernormal.json +898 -0
  52. package/conformance/motion/corpus/skottie-text-animator-1.json +1286 -0
  53. package/conformance/motion/corpus/skottie-text-fill-over-stroke.json +1014 -0
  54. package/conformance/motion/corpus/skottie-text-tracking.json +950 -0
  55. package/conformance/motion/corpus/skottie-text-valign.json +484 -0
  56. package/conformance/motion/corpus/skottie-time-reverse.json +297 -0
  57. package/conformance/motion/corpus/skottie-transform-skew.json +290 -0
  58. package/conformance/motion/corpus/skottie-trimpath-fill.json +933 -0
  59. package/conformance/motion/corpus/skottie-trimpath-modes.json +266 -0
  60. package/conformance/motion/corpus/skottie-tritone-effect.json +379 -0
  61. package/conformance/motion/corpus/spec-blend-mode.json +531 -0
  62. package/conformance/motion/corpus/spec-ellipse.json +142 -0
  63. package/conformance/motion/corpus/spec-fill.json +193 -0
  64. package/conformance/motion/corpus/spec-gradient-stroke.json +1263 -0
  65. package/conformance/motion/corpus/spec-gradient.json +1255 -0
  66. package/conformance/motion/corpus/spec-mask.json +773 -0
  67. package/conformance/motion/corpus/spec-masks.json +676 -0
  68. package/conformance/motion/corpus/spec-matte.json +390 -0
  69. package/conformance/motion/corpus/spec-metadata.json +1 -0
  70. package/conformance/motion/corpus/spec-path.json +177 -0
  71. package/conformance/motion/corpus/spec-pucker-bloat.json +179 -0
  72. package/conformance/motion/corpus/spec-rectangle.json +145 -0
  73. package/conformance/motion/corpus/spec-rounded-corners.json +187 -0
  74. package/conformance/motion/corpus/spec-slots.json +325 -0
  75. package/conformance/motion/corpus/spec-star.json +159 -0
  76. package/conformance/motion/corpus/spec-stroke.json +156 -0
  77. package/conformance/motion/corpus/spec-test-ellipse-xy-pos.json +141 -0
  78. package/conformance/motion/corpus/spec-test-gradient-fill.json +1 -0
  79. package/conformance/motion/corpus/spec-test-gradient-stroke.json +229 -0
  80. package/conformance/motion/corpus/spec-test-unknown-shape.json +63 -0
  81. package/conformance/motion/corpus/spec-time-remap.json +1090 -0
  82. package/conformance/motion/corpus/spec-time-stretch.json +594 -0
  83. package/conformance/motion/corpus/spec-transform.json +273 -0
  84. package/conformance/motion/corpus/spec-trim-path.json +209 -0
  85. package/conformance/motion/corpus/web-adrock.json +1 -0
  86. package/conformance/motion/corpus/web-bacon.json +1 -0
  87. package/conformance/motion/corpus/web-banner.json +1 -0
  88. package/conformance/motion/corpus/web-bodymovin.json +1 -0
  89. package/conformance/motion/corpus/web-dalek.json +1 -0
  90. package/conformance/motion/corpus/web-footage-data.json +1 -0
  91. package/conformance/motion/corpus/web-lights.json +1 -0
  92. package/conformance/motion/corpus/web-ripple.json +1 -0
  93. package/conformance/motion/corpus/web-starfish.json +1 -0
  94. package/conformance/motion/known-gaps.json +35 -0
  95. package/conformance/motion/parity/group-transforms-parenting@0.png +0 -0
  96. package/conformance/motion/parity/group-transforms-parenting@10.png +0 -0
  97. package/conformance/motion/parity/hidden-unknown-inactive@0.png +0 -0
  98. package/conformance/motion/parity/keyframes-transform@0.png +0 -0
  99. package/conformance/motion/parity/keyframes-transform@10.png +0 -0
  100. package/conformance/motion/parity/keyframes-transform@15.png +0 -0
  101. package/conformance/motion/parity/keyframes-transform@5.png +0 -0
  102. package/conformance/motion/parity/layer-opacity-blend@0.png +0 -0
  103. package/conformance/motion/parity/linear-gradient@0.png +0 -0
  104. package/conformance/motion/parity/masks-modes@0.png +0 -0
  105. package/conformance/motion/parity/matte-alpha@0.png +0 -0
  106. package/conformance/motion/parity/matte-luma@0.png +0 -0
  107. package/conformance/motion/parity/matte-parent-tp@0.png +0 -0
  108. package/conformance/motion/parity/path-evenodd@0.png +0 -0
  109. package/conformance/motion/parity/precomp-clip-offset@0.png +0 -0
  110. package/conformance/motion/parity/precomp-clip-offset@15.png +0 -0
  111. package/conformance/motion/parity/precomp-clip-offset@5.png +0 -0
  112. package/conformance/motion/parity/radial-gradient-highlight@0.png +0 -0
  113. package/conformance/motion/parity/rect-solid-fill@0.png +0 -0
  114. package/conformance/motion/parity/repeater@0.png +0 -0
  115. package/conformance/motion/parity/rounded-rect-ellipse@0.png +0 -0
  116. package/conformance/motion/parity/solid-and-image@0.png +0 -0
  117. package/conformance/motion/parity/split-position-skew@0.png +0 -0
  118. package/conformance/motion/parity/split-position-skew@10.png +0 -0
  119. package/conformance/motion/parity/star-polygon@0.png +0 -0
  120. package/conformance/motion/parity/stroke-caps-joins@0.png +0 -0
  121. package/conformance/motion/parity/stroke-dashes@0.png +0 -0
  122. package/conformance/motion/parity/stroke-dashes@10.png +0 -0
  123. package/conformance/motion/parity/time-remap@0.png +0 -0
  124. package/conformance/motion/parity/time-remap@10.png +0 -0
  125. package/conformance/motion/parity/time-remap@19.png +0 -0
  126. package/conformance/motion/parity/time-stretch@0.png +0 -0
  127. package/conformance/motion/parity/time-stretch@10.png +0 -0
  128. package/conformance/motion/parity/trim-individually@0.png +0 -0
  129. package/conformance/motion/parity/trim-path@0.png +0 -0
  130. package/conformance/motion/parity/trim-path@10.png +0 -0
  131. package/conformance/motion/refs/index.json +688 -0
  132. package/conformance/motion/refs/skottie-3d-parenting-nocamera@0.png +0 -0
  133. package/conformance/motion/refs/skottie-3d-parenting-nocamera@150.png +0 -0
  134. package/conformance/motion/refs/skottie-3d-parenting-nocamera@270.png +0 -0
  135. package/conformance/motion/refs/skottie-auto-orient-2@0.png +0 -0
  136. package/conformance/motion/refs/skottie-auto-orient-2@210.png +0 -0
  137. package/conformance/motion/refs/skottie-auto-orient-2@378.png +0 -0
  138. package/conformance/motion/refs/skottie-auto-orient@0.png +0 -0
  139. package/conformance/motion/refs/skottie-auto-orient@300.png +0 -0
  140. package/conformance/motion/refs/skottie-auto-orient@540.png +0 -0
  141. package/conformance/motion/refs/skottie-bezier-extranormal@0.png +0 -0
  142. package/conformance/motion/refs/skottie-bezier-extranormal@150.png +0 -0
  143. package/conformance/motion/refs/skottie-bezier-extranormal@270.png +0 -0
  144. package/conformance/motion/refs/skottie-blendmode-hardmix@0.png +0 -0
  145. package/conformance/motion/refs/skottie-blendmode-hardmix@150.png +0 -0
  146. package/conformance/motion/refs/skottie-blendmode-hardmix@270.png +0 -0
  147. package/conformance/motion/refs/skottie-chained-mattes@0.png +0 -0
  148. package/conformance/motion/refs/skottie-chained-mattes@300.png +0 -0
  149. package/conformance/motion/refs/skottie-chained-mattes@540.png +0 -0
  150. package/conformance/motion/refs/skottie-dropshadow-ramp@0.png +0 -0
  151. package/conformance/motion/refs/skottie-dropshadow-ramp@135.png +0 -0
  152. package/conformance/motion/refs/skottie-dropshadow-ramp@75.png +0 -0
  153. package/conformance/motion/refs/skottie-dropshadow-style@0.png +0 -0
  154. package/conformance/motion/refs/skottie-dropshadow-style@300.png +0 -0
  155. package/conformance/motion/refs/skottie-dropshadow-style@540.png +0 -0
  156. package/conformance/motion/refs/skottie-effects-transform@0.png +0 -0
  157. package/conformance/motion/refs/skottie-effects-transform@450.png +0 -0
  158. package/conformance/motion/refs/skottie-effects-transform@810.png +0 -0
  159. package/conformance/motion/refs/skottie-fill-effect@0.png +0 -0
  160. package/conformance/motion/refs/skottie-fill-effect@300.png +0 -0
  161. package/conformance/motion/refs/skottie-fill-effect@540.png +0 -0
  162. package/conformance/motion/refs/skottie-fill-rule@0.png +0 -0
  163. package/conformance/motion/refs/skottie-fill-rule@150.png +0 -0
  164. package/conformance/motion/refs/skottie-fill-rule@270.png +0 -0
  165. package/conformance/motion/refs/skottie-gaussian-blur@0.png +0 -0
  166. package/conformance/motion/refs/skottie-gaussian-blur@150.png +0 -0
  167. package/conformance/motion/refs/skottie-gaussian-blur@270.png +0 -0
  168. package/conformance/motion/refs/skottie-gradient-opacity@0.png +0 -0
  169. package/conformance/motion/refs/skottie-gradient-opacity@150.png +0 -0
  170. package/conformance/motion/refs/skottie-gradient-opacity@270.png +0 -0
  171. package/conformance/motion/refs/skottie-gradient-radial-highlight@0.png +0 -0
  172. package/conformance/motion/refs/skottie-gradient-radial-highlight@135.png +0 -0
  173. package/conformance/motion/refs/skottie-gradient-radial-highlight@75.png +0 -0
  174. package/conformance/motion/refs/skottie-hidden-shapes-layers@0.png +0 -0
  175. package/conformance/motion/refs/skottie-hidden-shapes-layers@150.png +0 -0
  176. package/conformance/motion/refs/skottie-hidden-shapes-layers@270.png +0 -0
  177. package/conformance/motion/refs/skottie-huesaturation-effect@0.png +0 -0
  178. package/conformance/motion/refs/skottie-huesaturation-effect@30.png +0 -0
  179. package/conformance/motion/refs/skottie-huesaturation-effect@54.png +0 -0
  180. package/conformance/motion/refs/skottie-invert-effect@0.png +0 -0
  181. package/conformance/motion/refs/skottie-invert-effect@300.png +0 -0
  182. package/conformance/motion/refs/skottie-invert-effect@540.png +0 -0
  183. package/conformance/motion/refs/skottie-luma-matte@0.png +0 -0
  184. package/conformance/motion/refs/skottie-luma-matte@150.png +0 -0
  185. package/conformance/motion/refs/skottie-luma-matte@270.png +0 -0
  186. package/conformance/motion/refs/skottie-mask-feather@0.png +0 -0
  187. package/conformance/motion/refs/skottie-mask-feather@150.png +0 -0
  188. package/conformance/motion/refs/skottie-mask-feather@270.png +0 -0
  189. package/conformance/motion/refs/skottie-masking-opaque@0.png +0 -0
  190. package/conformance/motion/refs/skottie-masking-opaque@135.png +0 -0
  191. package/conformance/motion/refs/skottie-masking-opaque@75.png +0 -0
  192. package/conformance/motion/refs/skottie-masking-translucent@0.png +0 -0
  193. package/conformance/motion/refs/skottie-masking-translucent@135.png +0 -0
  194. package/conformance/motion/refs/skottie-masking-translucent@75.png +0 -0
  195. package/conformance/motion/refs/skottie-matte-blendmode@0.png +0 -0
  196. package/conformance/motion/refs/skottie-matte-blendmode@150.png +0 -0
  197. package/conformance/motion/refs/skottie-matte-blendmode@270.png +0 -0
  198. package/conformance/motion/refs/skottie-matte-nonsequential@0.png +0 -0
  199. package/conformance/motion/refs/skottie-matte-nonsequential@150.png +0 -0
  200. package/conformance/motion/refs/skottie-matte-nonsequential@270.png +0 -0
  201. package/conformance/motion/refs/skottie-matte-visible@0.png +0 -0
  202. package/conformance/motion/refs/skottie-matte-visible@150.png +0 -0
  203. package/conformance/motion/refs/skottie-matte-visible@270.png +0 -0
  204. package/conformance/motion/refs/skottie-mergepaths-effect@0.png +0 -0
  205. package/conformance/motion/refs/skottie-mergepaths-effect@210.png +0 -0
  206. package/conformance/motion/refs/skottie-mergepaths-effect@378.png +0 -0
  207. package/conformance/motion/refs/skottie-motion-blur-mask@0.png +0 -0
  208. package/conformance/motion/refs/skottie-motion-blur-mask@150.png +0 -0
  209. package/conformance/motion/refs/skottie-motion-blur-mask@270.png +0 -0
  210. package/conformance/motion/refs/skottie-nested-animation@0.png +0 -0
  211. package/conformance/motion/refs/skottie-nested-animation@300.png +0 -0
  212. package/conformance/motion/refs/skottie-nested-animation@540.png +0 -0
  213. package/conformance/motion/refs/skottie-offsetpaths-effect@0.png +0 -0
  214. package/conformance/motion/refs/skottie-offsetpaths-effect@150.png +0 -0
  215. package/conformance/motion/refs/skottie-offsetpaths-effect@270.png +0 -0
  216. package/conformance/motion/refs/skottie-phonehub-connecting@0.png +0 -0
  217. package/conformance/motion/refs/skottie-puckerbloat-effect@0.png +0 -0
  218. package/conformance/motion/refs/skottie-puckerbloat-effect@210.png +0 -0
  219. package/conformance/motion/refs/skottie-puckerbloat-effect@378.png +0 -0
  220. package/conformance/motion/refs/skottie-repeater@0.png +0 -0
  221. package/conformance/motion/refs/skottie-repeater@300.png +0 -0
  222. package/conformance/motion/refs/skottie-repeater@540.png +0 -0
  223. package/conformance/motion/refs/skottie-sample-1@0.png +0 -0
  224. package/conformance/motion/refs/skottie-sample-1@100.png +0 -0
  225. package/conformance/motion/refs/skottie-sample-1@180.png +0 -0
  226. package/conformance/motion/refs/skottie-sample-search@0.png +0 -0
  227. package/conformance/motion/refs/skottie-sample-search@27.png +0 -0
  228. package/conformance/motion/refs/skottie-sample-search@48.png +0 -0
  229. package/conformance/motion/refs/skottie-spatial-supernormal@0.png +0 -0
  230. package/conformance/motion/refs/skottie-spatial-supernormal@200.png +0 -0
  231. package/conformance/motion/refs/skottie-spatial-supernormal@360.png +0 -0
  232. package/conformance/motion/refs/skottie-text-animator-1@0.png +0 -0
  233. package/conformance/motion/refs/skottie-text-animator-1@150.png +0 -0
  234. package/conformance/motion/refs/skottie-text-animator-1@270.png +0 -0
  235. package/conformance/motion/refs/skottie-text-fill-over-stroke@0.png +0 -0
  236. package/conformance/motion/refs/skottie-text-fill-over-stroke@210.png +0 -0
  237. package/conformance/motion/refs/skottie-text-fill-over-stroke@378.png +0 -0
  238. package/conformance/motion/refs/skottie-text-tracking@0.png +0 -0
  239. package/conformance/motion/refs/skottie-text-tracking@108.png +0 -0
  240. package/conformance/motion/refs/skottie-text-tracking@60.png +0 -0
  241. package/conformance/motion/refs/skottie-text-valign@0.png +0 -0
  242. package/conformance/motion/refs/skottie-text-valign@150.png +0 -0
  243. package/conformance/motion/refs/skottie-text-valign@270.png +0 -0
  244. package/conformance/motion/refs/skottie-time-reverse@0.png +0 -0
  245. package/conformance/motion/refs/skottie-time-reverse@300.png +0 -0
  246. package/conformance/motion/refs/skottie-time-reverse@540.png +0 -0
  247. package/conformance/motion/refs/skottie-transform-skew@0.png +0 -0
  248. package/conformance/motion/refs/skottie-transform-skew@300.png +0 -0
  249. package/conformance/motion/refs/skottie-transform-skew@540.png +0 -0
  250. package/conformance/motion/refs/skottie-trimpath-fill@0.png +0 -0
  251. package/conformance/motion/refs/skottie-trimpath-fill@300.png +0 -0
  252. package/conformance/motion/refs/skottie-trimpath-fill@540.png +0 -0
  253. package/conformance/motion/refs/skottie-trimpath-modes@0.png +0 -0
  254. package/conformance/motion/refs/skottie-trimpath-modes@300.png +0 -0
  255. package/conformance/motion/refs/skottie-trimpath-modes@540.png +0 -0
  256. package/conformance/motion/refs/skottie-tritone-effect@0.png +0 -0
  257. package/conformance/motion/refs/skottie-tritone-effect@300.png +0 -0
  258. package/conformance/motion/refs/skottie-tritone-effect@540.png +0 -0
  259. package/conformance/motion/refs/spec-blend-mode@0.png +0 -0
  260. package/conformance/motion/refs/spec-blend-mode@162.png +0 -0
  261. package/conformance/motion/refs/spec-blend-mode@90.png +0 -0
  262. package/conformance/motion/refs/spec-ellipse@0.png +0 -0
  263. package/conformance/motion/refs/spec-ellipse@162.png +0 -0
  264. package/conformance/motion/refs/spec-ellipse@90.png +0 -0
  265. package/conformance/motion/refs/spec-fill@0.png +0 -0
  266. package/conformance/motion/refs/spec-fill@162.png +0 -0
  267. package/conformance/motion/refs/spec-fill@90.png +0 -0
  268. package/conformance/motion/refs/spec-gradient-stroke@0.png +0 -0
  269. package/conformance/motion/refs/spec-gradient-stroke@162.png +0 -0
  270. package/conformance/motion/refs/spec-gradient-stroke@90.png +0 -0
  271. package/conformance/motion/refs/spec-gradient@0.png +0 -0
  272. package/conformance/motion/refs/spec-gradient@162.png +0 -0
  273. package/conformance/motion/refs/spec-gradient@90.png +0 -0
  274. package/conformance/motion/refs/spec-mask@0.png +0 -0
  275. package/conformance/motion/refs/spec-mask@300.png +0 -0
  276. package/conformance/motion/refs/spec-mask@540.png +0 -0
  277. package/conformance/motion/refs/spec-masks@0.png +0 -0
  278. package/conformance/motion/refs/spec-masks@135.png +0 -0
  279. package/conformance/motion/refs/spec-masks@75.png +0 -0
  280. package/conformance/motion/refs/spec-matte@0.png +0 -0
  281. package/conformance/motion/refs/spec-matte@162.png +0 -0
  282. package/conformance/motion/refs/spec-matte@90.png +0 -0
  283. package/conformance/motion/refs/spec-metadata@0.png +0 -0
  284. package/conformance/motion/refs/spec-metadata@162.png +0 -0
  285. package/conformance/motion/refs/spec-metadata@90.png +0 -0
  286. package/conformance/motion/refs/spec-path@0.png +0 -0
  287. package/conformance/motion/refs/spec-path@162.png +0 -0
  288. package/conformance/motion/refs/spec-path@90.png +0 -0
  289. package/conformance/motion/refs/spec-pucker-bloat@0.png +0 -0
  290. package/conformance/motion/refs/spec-pucker-bloat@162.png +0 -0
  291. package/conformance/motion/refs/spec-pucker-bloat@90.png +0 -0
  292. package/conformance/motion/refs/spec-rectangle@0.png +0 -0
  293. package/conformance/motion/refs/spec-rectangle@162.png +0 -0
  294. package/conformance/motion/refs/spec-rectangle@90.png +0 -0
  295. package/conformance/motion/refs/spec-rounded-corners@0.png +0 -0
  296. package/conformance/motion/refs/spec-rounded-corners@162.png +0 -0
  297. package/conformance/motion/refs/spec-rounded-corners@90.png +0 -0
  298. package/conformance/motion/refs/spec-slots@0.png +0 -0
  299. package/conformance/motion/refs/spec-slots@450.png +0 -0
  300. package/conformance/motion/refs/spec-slots@810.png +0 -0
  301. package/conformance/motion/refs/spec-star@0.png +0 -0
  302. package/conformance/motion/refs/spec-star@162.png +0 -0
  303. package/conformance/motion/refs/spec-star@90.png +0 -0
  304. package/conformance/motion/refs/spec-stroke@0.png +0 -0
  305. package/conformance/motion/refs/spec-stroke@162.png +0 -0
  306. package/conformance/motion/refs/spec-stroke@90.png +0 -0
  307. package/conformance/motion/refs/spec-test-ellipse-xy-pos@0.png +0 -0
  308. package/conformance/motion/refs/spec-test-ellipse-xy-pos@162.png +0 -0
  309. package/conformance/motion/refs/spec-test-ellipse-xy-pos@90.png +0 -0
  310. package/conformance/motion/refs/spec-test-gradient-fill@0.png +0 -0
  311. package/conformance/motion/refs/spec-test-gradient-fill@30.png +0 -0
  312. package/conformance/motion/refs/spec-test-gradient-fill@54.png +0 -0
  313. package/conformance/motion/refs/spec-test-gradient-stroke@0.png +0 -0
  314. package/conformance/motion/refs/spec-test-gradient-stroke@30.png +0 -0
  315. package/conformance/motion/refs/spec-test-gradient-stroke@54.png +0 -0
  316. package/conformance/motion/refs/spec-test-unknown-shape@0.png +0 -0
  317. package/conformance/motion/refs/spec-test-unknown-shape@162.png +0 -0
  318. package/conformance/motion/refs/spec-test-unknown-shape@90.png +0 -0
  319. package/conformance/motion/refs/spec-time-remap@0.png +0 -0
  320. package/conformance/motion/refs/spec-time-remap@300.png +0 -0
  321. package/conformance/motion/refs/spec-time-remap@540.png +0 -0
  322. package/conformance/motion/refs/spec-time-stretch@0.png +0 -0
  323. package/conformance/motion/refs/spec-time-stretch@300.png +0 -0
  324. package/conformance/motion/refs/spec-time-stretch@540.png +0 -0
  325. package/conformance/motion/refs/spec-transform@0.png +0 -0
  326. package/conformance/motion/refs/spec-transform@162.png +0 -0
  327. package/conformance/motion/refs/spec-transform@90.png +0 -0
  328. package/conformance/motion/refs/spec-trim-path@0.png +0 -0
  329. package/conformance/motion/refs/spec-trim-path@162.png +0 -0
  330. package/conformance/motion/refs/spec-trim-path@90.png +0 -0
  331. package/conformance/motion/refs/web-adrock@0.png +0 -0
  332. package/conformance/motion/refs/web-adrock@10.png +0 -0
  333. package/conformance/motion/refs/web-adrock@18.png +0 -0
  334. package/conformance/motion/refs/web-bacon@0.png +0 -0
  335. package/conformance/motion/refs/web-bacon@126.png +0 -0
  336. package/conformance/motion/refs/web-bacon@70.png +0 -0
  337. package/conformance/motion/refs/web-banner@0.png +0 -0
  338. package/conformance/motion/refs/web-banner@301.png +0 -0
  339. package/conformance/motion/refs/web-banner@542.png +0 -0
  340. package/conformance/motion/refs/web-bodymovin@0.png +0 -0
  341. package/conformance/motion/refs/web-bodymovin@51.png +0 -0
  342. package/conformance/motion/refs/web-bodymovin@92.png +0 -0
  343. package/conformance/motion/refs/web-dalek@0.png +0 -0
  344. package/conformance/motion/refs/web-dalek@145.png +0 -0
  345. package/conformance/motion/refs/web-dalek@261.png +0 -0
  346. package/conformance/motion/refs/web-footage-data@0.png +0 -0
  347. package/conformance/motion/refs/web-footage-data@180.png +0 -0
  348. package/conformance/motion/refs/web-footage-data@324.png +0 -0
  349. package/conformance/motion/refs/web-lights@0.png +0 -0
  350. package/conformance/motion/refs/web-lights@150.png +0 -0
  351. package/conformance/motion/refs/web-lights@270.png +0 -0
  352. package/conformance/motion/refs/web-ripple@0.png +0 -0
  353. package/conformance/motion/refs/web-ripple@180.png +0 -0
  354. package/conformance/motion/refs/web-ripple@324.png +0 -0
  355. package/conformance/motion/refs/web-starfish@0.png +0 -0
  356. package/conformance/motion/refs/web-starfish@150.png +0 -0
  357. package/conformance/motion/refs/web-starfish@270.png +0 -0
  358. package/conformance/motion/render-refs.ts +126 -0
  359. package/conformance/motion/report.json +1367 -0
  360. package/conformance/motion/web-parity-gaps.json +12 -0
  361. package/conformance/motion-parity-entry.ts +3 -0
  362. package/conformance/motion-parity.ts +101 -0
  363. package/dist/chunks/{index-4z7f2bp1.js → index-4xczxey5.js} +35 -15
  364. package/dist/chunks/{index-4z7f2bp1.js.map → index-4xczxey5.js.map} +4 -4
  365. package/dist/chunks/{index-dx45asrf.js → index-5sjj5p84.js} +174 -8
  366. package/dist/chunks/{index-dx45asrf.js.map → index-5sjj5p84.js.map} +2 -2
  367. package/dist/chunks/{index-fy7y2nz8.js → index-cvf7bbs5.js} +23 -2
  368. package/dist/chunks/{index-fy7y2nz8.js.map → index-cvf7bbs5.js.map} +1 -1
  369. package/dist/chunks/index-dgkf6yw5.js +48 -0
  370. package/dist/chunks/index-dgkf6yw5.js.map +10 -0
  371. package/dist/chunks/{index-abcjanhc.js → index-f9wkb6aq.js} +192 -3
  372. package/dist/chunks/{index-abcjanhc.js.map → index-f9wkb6aq.js.map} +2 -2
  373. package/dist/chunks/index-t2mwfbb6.js +1515 -0
  374. package/dist/chunks/index-t2mwfbb6.js.map +15 -0
  375. package/dist/chunks/{index-h3zgfghf.js → index-vkn82srs.js} +179 -8
  376. package/dist/chunks/{index-h3zgfghf.js.map → index-vkn82srs.js.map} +2 -2
  377. package/dist/chunks/wasm-ctcc3cma.js +424 -0
  378. package/dist/chunks/wasm-ctcc3cma.js.map +11 -0
  379. package/dist/conformance.js +3154 -63
  380. package/dist/conformance.js.map +2 -2
  381. package/dist/entries/prompt.js +2 -2
  382. package/dist/entries/schema.js +3 -3
  383. package/dist/host/index.js +3 -3
  384. package/dist/index.js +333 -98
  385. package/dist/index.js.map +4 -4
  386. package/dist/types/src/catalog.generated.d.ts +50 -4
  387. package/dist/types/src/index.d.ts +2 -0
  388. package/dist/types/src/layout.d.ts +2 -0
  389. package/dist/types/src/limits.d.ts +1 -0
  390. package/dist/types/src/motion/index.d.ts +1 -0
  391. package/dist/types/src/motion/server.d.ts +9 -0
  392. package/dist/types/src/motion/wasm.d.ts +11 -0
  393. package/dist/types/src/web/coerce.d.ts +3 -0
  394. package/dist/types/src/web/focus.d.ts +8 -0
  395. package/dist/types/src/web/index.d.ts +5 -2
  396. package/dist/types/src/web/primitives/carousel.d.ts +1 -1
  397. package/dist/types/src/web/primitives/dock.d.ts +5 -2
  398. package/dist/types/src/web/primitives/index.d.ts +2 -0
  399. package/dist/types/src/web/primitives/motion-paint.d.ts +36 -0
  400. package/dist/types/src/web/primitives/motion.d.ts +162 -0
  401. package/dist/types/src/web/primitives/zoomable-image.d.ts +158 -0
  402. package/dist/types/src/web/table.d.ts +8 -0
  403. package/dist/types/src/zoom.d.ts +128 -0
  404. package/dist/types/wasm/motion/bytes.d.ts +1 -0
  405. package/dist/web/index.js +165 -230
  406. package/dist/web/index.js.map +8 -9
  407. package/dist/web/primitives/index.js +584 -7
  408. package/dist/web/primitives/index.js.map +7 -6
  409. package/docs/components.generated.json +392 -4
  410. package/docs/round-6-contract.md +5 -3
  411. package/docs/themes.generated.json +27 -0
  412. package/fixtures/bind-time.json +4 -0
  413. package/fixtures/catalog-components.json +930 -16
  414. package/fixtures/catalog-macros.json +11 -0
  415. package/fixtures/conformance-baseline.json +33020 -32952
  416. package/fixtures/conformance-known.json +64 -70
  417. package/fixtures/kitchen-sink.expanded.json +72 -0
  418. package/fixtures/kitchen-sink.json +33 -0
  419. package/fixtures/layout-geometry-round1.json +42 -42
  420. package/fixtures/motion-frames.json +2618 -0
  421. package/fixtures/motion-playback.json +528 -0
  422. package/fixtures/motion-state.json +722 -0
  423. package/fixtures/motion-validate.json +138 -0
  424. package/fixtures/primitive-specimens.json +1 -0
  425. package/fixtures/prompt-budget.json +16 -16
  426. package/fixtures/specimens.json +717 -21
  427. package/fixtures/theme-recipes.json +1518 -32
  428. package/fixtures/theme-resolved.json +732 -56
  429. package/fixtures/zoom.json +1382 -0
  430. package/generated/ExponentialUICatalog.generated.kt +20 -20
  431. package/generated/ExponentialUICatalog.generated.swift +20 -20
  432. package/generated/ExponentialUIThemes.generated.kt +7 -7
  433. package/generated/ExponentialUIThemes.generated.swift +7 -7
  434. package/generated/catalog.descriptions.generated.rs +1 -1
  435. package/generated/catalog.generated.rs +29 -29
  436. package/generated/catalog.themes.generated.rs +8 -8
  437. package/generated/core.descriptions.json +171 -5
  438. package/generated/core.runtime.json +189 -1
  439. package/package.json +1 -1
  440. package/themes/neutral.theme.json +172 -3
  441. package/dist/chunks/index-t6qz1770.js +0 -95
  442. package/dist/chunks/index-t6qz1770.js.map +0 -11
@@ -4,10 +4,10 @@ import {
4
4
  CORE_LITE_CATALOG_ID2,
5
5
  catalogView2,
6
6
  isOffered2
7
- } from "../chunks/index-abcjanhc.js";
7
+ } from "../chunks/index-f9wkb6aq.js";
8
8
  import {
9
9
  describeCatalog2
10
- } from "../chunks/index-dx45asrf.js";
10
+ } from "../chunks/index-5sjj5p84.js";
11
11
 
12
12
  // packages/exponential-ui/src/prompt.ts
13
13
  var PROMPT_SECTIONS = [`rules`, `components`, `index`, `shapes`, `functions`, `style`, `extensions`];
@@ -2,13 +2,13 @@ import {
2
2
  coreCatalog2,
3
3
  TOKEN_GROUPS2,
4
4
  catalogView2
5
- } from "../chunks/index-abcjanhc.js";
5
+ } from "../chunks/index-f9wkb6aq.js";
6
6
  import {
7
7
  describeCatalog2
8
- } from "../chunks/index-dx45asrf.js";
8
+ } from "../chunks/index-5sjj5p84.js";
9
9
  import {
10
10
  style_default
11
- } from "../chunks/index-fy7y2nz8.js";
11
+ } from "../chunks/index-cvf7bbs5.js";
12
12
  // packages/exponential-ui/vendor/a2ui/v0_9/basic_catalog.json
13
13
  var basic_catalog_default = {
14
14
  $schema: "https://json-schema.org/draft/2020-12/schema",
@@ -80,7 +80,7 @@ import {
80
80
  SseTransport2,
81
81
  WebSocketTransport2,
82
82
  McpTransport2
83
- } from "../chunks/index-4z7f2bp1.js";
83
+ } from "../chunks/index-4xczxey5.js";
84
84
  import {
85
85
  HOST_CONTRACT2,
86
86
  HOST_CONTRACT_VERSION2,
@@ -101,8 +101,8 @@ import {
101
101
  SURFACE_COMMANDS2,
102
102
  errorMessage2,
103
103
  actionMessage2
104
- } from "../chunks/index-h3zgfghf.js";
105
- import"../chunks/index-abcjanhc.js";
104
+ } from "../chunks/index-vkn82srs.js";
105
+ import"../chunks/index-f9wkb6aq.js";
106
106
  export {
107
107
  A2UI_MESSAGE_KINDS2 as A2UI_MESSAGE_KINDS,
108
108
  AUTHOR_KEY_PREFIX2 as AUTHOR_KEY_PREFIX,
package/dist/index.js CHANGED
@@ -16,7 +16,7 @@ import {
16
16
  isOffered2,
17
17
  componentNames2,
18
18
  coreLite2
19
- } from "./chunks/index-abcjanhc.js";
19
+ } from "./chunks/index-f9wkb6aq.js";
20
20
  import {
21
21
  STYLE_KEYS2,
22
22
  STYLE_LAYOUT_KEYS2,
@@ -93,7 +93,7 @@ import {
93
93
  SURFACE_COMMANDS2,
94
94
  errorMessage2,
95
95
  actionMessage2
96
- } from "./chunks/index-h3zgfghf.js";
96
+ } from "./chunks/index-vkn82srs.js";
97
97
  import {
98
98
  CATALOG_ID2,
99
99
  LITE_CATALOG_ID2,
@@ -288,52 +288,30 @@ import {
288
288
  SseTransport2,
289
289
  WebSocketTransport2,
290
290
  McpTransport2
291
- } from "./chunks/index-4z7f2bp1.js";
291
+ } from "./chunks/index-4xczxey5.js";
292
+ import {
293
+ LAYOUT_CONSTANTS2,
294
+ WINDOW_THRESHOLD2,
295
+ WINDOW_OVERSCAN2,
296
+ RESIZE_STEP2,
297
+ PANEL_MIN2,
298
+ RESIZE_HANDLE_HIT2,
299
+ FIELD_INTRINSIC_WIDTH2,
300
+ MEDIA_INTRINSIC_WIDTH2,
301
+ MEDIA_ASPECT_RATIO2,
302
+ TREE_GUIDE_COLUMN2,
303
+ TREE_GUIDE_RADIUS2,
304
+ TREE_GUIDE_BRIDGE2,
305
+ PENDING_DELAY_MS2,
306
+ SKELETON_PULSE_MS2,
307
+ SKELETON_OPACITY_LOW2,
308
+ SKELETON_OPACITY_HIGH2,
309
+ SKELETON_REDUCED_OPACITY2,
310
+ SEARCH_LIST_FADE2
311
+ } from "./chunks/index-dgkf6yw5.js";
292
312
  import {
293
313
  style_default
294
- } from "./chunks/index-fy7y2nz8.js";
295
- // packages/exponential-ui/catalog/layout.json
296
- var layout_default = {
297
- $comment: "Round 2 (docs/round-2-contract.md §7): the layout NUMBERS every painter shares where no theme token decides (px unless noted). `windowThreshold` = items past which List and Table window; `windowOverscan` = items rendered beyond each viewport edge; `resizeStep` = percentage points per arrow key on a Resizable handle; `panelMin` = a panel's min (percent) when unset; `resizeHandleHit` = a handle's hit area across its hairline; `fieldIntrinsicWidth` = the max-content width of a text field (Input, Textarea, NumberField, ChipInput: never the browser's `size` default) — picker triggers (Select, DatePicker, DateRangePicker, TimePicker) size to their content; `mediaIntrinsicWidth` = the max-content width of an Image/Video without a width (its min-content is 0); `mediaAspectRatio` = width/height of an Image without `aspectRatio` or a height (Video: its `aspectRatio` default); `treeGuideColumn` = one TreeGuides gutter column (the recipe's `line` width is the STROKE; round 3: 14, the ×4 app indent, the elbow lands on the parent's lead glyph); `treeGuideRadius` = the elbow's corner radius; `treeGuideBridge` = how far the guide verticals overshoot the row's TOP edge (paint only) so a Section's hairline divider never breaks the line. EXP-1259 (packages/domain-contract/fixtures/feedback-states.json + search-list.json): `pendingDelayMs` = how long a `loading` Button waits before it shows the spinner and its `pendingLabel` (a fast action never flashes; presses are refused at once); `skeletonPulseMs` / `skeletonOpacityLow` / `skeletonOpacityHigh` = the placeholder's ONE opacity pulse (low → high → low, ease-in-out), `skeletonReducedOpacity` = its static opacity under reduce motion; `searchListFade` = the bottom fade over a SearchList (or a searchable submenu) while more rows sit below. Generated into every target; src/layout.ts reads it.",
298
- windowThreshold: 50,
299
- windowOverscan: 5,
300
- resizeStep: 10,
301
- panelMin: 10,
302
- resizeHandleHit: 8,
303
- fieldIntrinsicWidth: 160,
304
- mediaIntrinsicWidth: 320,
305
- mediaAspectRatio: 1.7777778,
306
- treeGuideColumn: 14,
307
- treeGuideRadius: 3,
308
- treeGuideBridge: 1,
309
- pendingDelayMs: 150,
310
- skeletonPulseMs: 1600,
311
- skeletonOpacityLow: 0.45,
312
- skeletonOpacityHigh: 0.9,
313
- skeletonReducedOpacity: 0.6,
314
- searchListFade: 24
315
- };
316
-
317
- // packages/exponential-ui/src/layout.ts
318
- var LAYOUT_CONSTANTS = Object.fromEntries(Object.entries(layout_default).filter(([k]) => !k.startsWith(`$`)));
319
- var WINDOW_THRESHOLD = layout_default.windowThreshold;
320
- var WINDOW_OVERSCAN = layout_default.windowOverscan;
321
- var RESIZE_STEP = layout_default.resizeStep;
322
- var PANEL_MIN = layout_default.panelMin;
323
- var RESIZE_HANDLE_HIT = layout_default.resizeHandleHit;
324
- var FIELD_INTRINSIC_WIDTH = layout_default.fieldIntrinsicWidth;
325
- var MEDIA_INTRINSIC_WIDTH = layout_default.mediaIntrinsicWidth;
326
- var MEDIA_ASPECT_RATIO = layout_default.mediaAspectRatio;
327
- var TREE_GUIDE_COLUMN = layout_default.treeGuideColumn;
328
- var TREE_GUIDE_RADIUS = layout_default.treeGuideRadius;
329
- var TREE_GUIDE_BRIDGE = layout_default.treeGuideBridge;
330
- var PENDING_DELAY_MS = layout_default.pendingDelayMs;
331
- var SKELETON_PULSE_MS = layout_default.skeletonPulseMs;
332
- var SKELETON_OPACITY_LOW = layout_default.skeletonOpacityLow;
333
- var SKELETON_OPACITY_HIGH = layout_default.skeletonOpacityHigh;
334
- var SKELETON_REDUCED_OPACITY = layout_default.skeletonReducedOpacity;
335
- var SEARCH_LIST_FADE = layout_default.searchListFade;
336
-
314
+ } from "./chunks/index-cvf7bbs5.js";
337
315
  // packages/exponential-ui/src/list.ts
338
316
  function templateItemKeys(items, keyPointer) {
339
317
  const seen = new Set;
@@ -419,7 +397,7 @@ function templateBudget(root, data, templateNode) {
419
397
  if (template && tpl) {
420
398
  const path = absolutePath2(template.path, { base: scope });
421
399
  const list = readPointer2(data, path);
422
- const windowed = Array.isArray(list) && node.component === `List` && node.children.length + list.length > WINDOW_THRESHOLD;
400
+ const windowed = Array.isArray(list) && node.component === `List` && node.children.length + list.length > WINDOW_THRESHOLD2;
423
401
  if (Array.isArray(list) && !windowed) {
424
402
  const site = templateSiteKey(node.id, scope);
425
403
  allowed.set(site, 0);
@@ -463,7 +441,7 @@ function firstWhere(lo, hi, test) {
463
441
  }
464
442
  return lo;
465
443
  }
466
- function virtualWindow(extents, gap, scroll, viewport, overscan = WINDOW_OVERSCAN, offsets) {
444
+ function virtualWindow(extents, gap, scroll, viewport, overscan = WINDOW_OVERSCAN2, offsets) {
467
445
  const count = extents.length;
468
446
  const off = offsets ?? itemOffsets(extents, gap);
469
447
  const total = off[count];
@@ -540,18 +518,236 @@ function stickyHeader(rowOffsets, rowExtents, headerRows, scroll) {
540
518
  const offset = next === undefined ? scroll : Math.min(scroll, rowOffsets[next] - extent);
541
519
  return { row, offset };
542
520
  }
543
- // packages/exponential-ui/src/resizable.ts
544
- var EPS = 0.000000001;
545
- var clampN = (v, lo, hi) => Math.max(lo, Math.min(hi, v));
521
+ // packages/exponential-ui/src/zoom.ts
522
+ var ZOOM = style_default.zoomableImage;
523
+ var EPS = 0.000001;
546
524
  var tidy = (v) => {
547
525
  const r = Math.round(v * 1e6) / 1e6;
548
526
  return Object.is(r, -0) ? 0 : r;
549
527
  };
528
+ var tidyView = (v) => ({ scale: tidy(v.scale), x: tidy(v.x), y: tidy(v.y) });
529
+ var clampN = (v, lo, hi) => Math.max(lo, Math.min(hi, v));
530
+ var positive = (v) => typeof v === `number` && Number.isFinite(v) && v > 0 ? v : 0;
531
+ function sizes(frame) {
532
+ return {
533
+ iw: positive(frame.natural.width),
534
+ ih: positive(frame.natural.height),
535
+ vw: positive(frame.viewport.width),
536
+ vh: positive(frame.viewport.height)
537
+ };
538
+ }
539
+ function zoomIsTall(natural) {
540
+ const w = positive(natural.width);
541
+ const h = positive(natural.height);
542
+ return w > 0 && h > 0 && w / h < ZOOM.tallAspect;
543
+ }
544
+ function zoomFitScale(frame) {
545
+ return tidy(fitRaw(frame));
546
+ }
547
+ function fitRaw(frame) {
548
+ const { iw, ih, vw, vh } = sizes(frame);
549
+ if (iw === 0 || ih === 0 || vw === 0 || vh === 0)
550
+ return 1;
551
+ return Math.min(1, vw / iw, vh / ih);
552
+ }
553
+ function limitsRaw(frame) {
554
+ const min = fitRaw(frame);
555
+ const wanted = positive(frame.maxScale) || ZOOM.maxScale;
556
+ return { min, max: Math.max(min, wanted) };
557
+ }
558
+ function zoomLimits(frame) {
559
+ const { min, max } = limitsRaw(frame);
560
+ return { min: tidy(min), max: tidy(max) };
561
+ }
562
+ function restRaw(frame) {
563
+ const { iw, vw } = sizes(frame);
564
+ const { min, max } = limitsRaw(frame);
565
+ const initial = frame.initial ?? `auto`;
566
+ const mode = initial === `auto` ? zoomIsTall(frame.natural) ? `fitWidth` : `fit` : initial;
567
+ let scale = min;
568
+ if (mode === `fitWidth`)
569
+ scale = iw > 0 && vw > 0 ? Math.min(1, vw / iw) : 1;
570
+ else if (mode === `actual`)
571
+ scale = 1;
572
+ return clampN(scale, min, max);
573
+ }
574
+ function zoomRestScale(frame) {
575
+ return tidy(restRaw(frame));
576
+ }
577
+ function clampAxis(offset, scaled, extent) {
578
+ if (scaled <= extent + EPS)
579
+ return (extent - scaled) / 2;
580
+ return clampN(offset, extent - scaled, 0);
581
+ }
582
+ function zoomClamp(view, frame) {
583
+ const { iw, ih, vw, vh } = sizes(frame);
584
+ const { min, max } = limitsRaw(frame);
585
+ const scale = clampN(view.scale, min, max);
586
+ return tidyView({ scale, x: clampAxis(view.x, iw * scale, vw), y: clampAxis(view.y, ih * scale, vh) });
587
+ }
588
+ function zoomRestView(frame) {
589
+ const { iw, vw } = sizes(frame);
590
+ const scale = restRaw(frame);
591
+ return zoomClamp({ scale, x: (vw - iw * scale) / 2, y: 0 }, frame);
592
+ }
593
+ function zoomAtRest(view, frame) {
594
+ return Math.abs(view.scale - restRaw(frame)) < 0.0001;
595
+ }
596
+ function zoomTo(view, scale, anchor, frame) {
597
+ const { min, max } = limitsRaw(frame);
598
+ const next = clampN(scale, min, max);
599
+ const ratio = view.scale > 0 ? next / view.scale : 1;
600
+ return zoomClamp({ scale: next, x: anchor.x - (anchor.x - view.x) * ratio, y: anchor.y - (anchor.y - view.y) * ratio }, frame);
601
+ }
602
+ function zoomCentre(frame) {
603
+ const { vw, vh } = sizes(frame);
604
+ return { x: vw / 2, y: vh / 2 };
605
+ }
606
+ function zoomWheelFactor(deltaY, mode = `pixel`) {
607
+ const px = mode === `line` ? deltaY * ZOOM.wheelLinePx : deltaY;
608
+ return Math.exp(-px * ZOOM.wheelRate);
609
+ }
610
+ function zoomWheel(view, deltaY, mode, anchor, frame) {
611
+ return zoomTo(view, view.scale * zoomWheelFactor(deltaY, mode), anchor, frame);
612
+ }
613
+ function zoomScroll(view, deltaX, deltaY, frame) {
614
+ return zoomClamp({ scale: view.scale, x: view.x - deltaX, y: view.y - deltaY }, frame);
615
+ }
616
+ function zoomLadder(frame) {
617
+ const { min, max } = limitsRaw(frame);
618
+ const rest = restRaw(frame);
619
+ const all = [...ZOOM.presets, min, rest, max].filter((s) => s >= min - EPS && s <= max + EPS);
620
+ const out = [];
621
+ for (const s of all.sort((a, b) => a - b))
622
+ if (out.length === 0 || s - out[out.length - 1] > 0.0001)
623
+ out.push(tidy(s));
624
+ return out;
625
+ }
626
+ function zoomStepScale(scale, direction, frame) {
627
+ const ladder = zoomLadder(frame);
628
+ if (direction > 0)
629
+ return ladder.find((s) => s > scale + 0.0001) ?? ladder[ladder.length - 1];
630
+ for (let i = ladder.length - 1;i >= 0; i--)
631
+ if (ladder[i] < scale - 0.0001)
632
+ return ladder[i];
633
+ return ladder[0];
634
+ }
635
+ function zoomStep(view, direction, frame) {
636
+ return zoomTo(view, zoomStepScale(view.scale, direction, frame), zoomCentre(frame), frame);
637
+ }
638
+ function zoomDoubleTapScale(frame) {
639
+ const { max } = limitsRaw(frame);
640
+ return tidy(Math.min(max, Math.max(1, ZOOM.doubleTapFactor * restRaw(frame))));
641
+ }
642
+ function zoomDoubleTap(view, point, frame) {
643
+ if (zoomAtRest(view, frame))
644
+ return zoomTo(view, zoomDoubleTapScale(frame), point, frame);
645
+ return zoomRestView(frame);
646
+ }
647
+ function zoomKey(view, key, frame) {
648
+ if (key === `+` || key === `=`)
649
+ return zoomStep(view, 1, frame);
650
+ if (key === `-` || key === `−` || key === `_`)
651
+ return zoomStep(view, -1, frame);
652
+ if (key === `0`)
653
+ return zoomRestView(frame);
654
+ if (key === `1`)
655
+ return zoomTo(view, 1, zoomCentre(frame), frame);
656
+ return null;
657
+ }
658
+ function zoomRubberBand(overshoot, extent) {
659
+ if (extent <= 0 || overshoot === 0)
660
+ return 0;
661
+ const sign = overshoot < 0 ? -1 : 1;
662
+ const o = Math.abs(overshoot);
663
+ return tidy(sign * (1 - 1 / (o * ZOOM.rubber / extent + 1)) * extent);
664
+ }
665
+ function rubberAxis(offset, scaled, extent) {
666
+ const lo = scaled <= extent + EPS ? (extent - scaled) / 2 : extent - scaled;
667
+ const hi = scaled <= extent + EPS ? (extent - scaled) / 2 : 0;
668
+ if (offset > hi)
669
+ return hi + zoomRubberBand(offset - hi, extent);
670
+ if (offset < lo)
671
+ return lo + zoomRubberBand(offset - lo, extent);
672
+ return offset;
673
+ }
674
+ function zoomDrag(start, dx, dy, frame) {
675
+ const { iw, ih, vw, vh } = sizes(frame);
676
+ return tidyView({
677
+ scale: start.scale,
678
+ x: rubberAxis(start.x + dx, iw * start.scale, vw),
679
+ y: rubberAxis(start.y + dy, ih * start.scale, vh)
680
+ });
681
+ }
682
+ function zoomPinch(start, factor, anchor, frame) {
683
+ const { iw, ih, vw, vh } = sizes(frame);
684
+ const { min, max } = limitsRaw(frame);
685
+ const raw = start.scale * factor;
686
+ let scale = raw;
687
+ if (raw > max)
688
+ scale = max + zoomRubberBand(raw - max, max);
689
+ else if (raw < min)
690
+ scale = min + zoomRubberBand(raw - min, min);
691
+ const ratio = start.scale > 0 ? scale / start.scale : 1;
692
+ return tidyView({
693
+ scale,
694
+ x: rubberAxis(anchor.x - (anchor.x - start.x) * ratio, iw * scale, vw),
695
+ y: rubberAxis(anchor.y - (anchor.y - start.y) * ratio, ih * scale, vh)
696
+ });
697
+ }
698
+ function zoomMomentum(view, vx, vy, t, frame) {
699
+ const tau = ZOOM.momentumTauMs;
700
+ const travel = tau * (1 - Math.exp(-Math.max(0, t) / tau));
701
+ return zoomClamp({ scale: view.scale, x: view.x + vx * travel, y: view.y + vy * travel }, frame);
702
+ }
703
+ function zoomMomentumActive(vx, vy, t) {
704
+ const decay = Math.exp(-Math.max(0, t) / ZOOM.momentumTauMs);
705
+ return Math.hypot(vx, vy) * decay > 0.01;
706
+ }
707
+ function zoomPanRoom(view, frame) {
708
+ const { iw, ih, vw, vh } = sizes(frame);
709
+ return { x: iw * view.scale > vw + EPS, y: ih * view.scale > vh + EPS };
710
+ }
711
+ function zoomResize(view, from, frame) {
712
+ const before = { ...frame, viewport: from };
713
+ if (zoomAtRest(view, before))
714
+ return zoomRestView(frame);
715
+ const { vw, vh } = sizes(frame);
716
+ const cx = positive(from.width) / 2;
717
+ const cy = positive(from.height) / 2;
718
+ return zoomClamp({ scale: view.scale, x: vw / 2 - (cx - view.x), y: vh / 2 - (cy - view.y) }, frame);
719
+ }
720
+ function zoomPercent(scale) {
721
+ return `${Math.round(scale * 100)}%`;
722
+ }
723
+ function zoomMenu(view, frame, fitLabel) {
724
+ const { min, max } = limitsRaw(frame);
725
+ const atRest = zoomAtRest(view, frame);
726
+ const items = [];
727
+ for (const s of ZOOM.menuPresets) {
728
+ if (s === 0)
729
+ items.push({ scale: null, label: fitLabel, checked: atRest });
730
+ else if (s >= min - EPS && s <= max + EPS)
731
+ items.push({ scale: s, label: zoomPercent(s), checked: !atRest && Math.abs(view.scale - s) < 0.0001 });
732
+ }
733
+ return items;
734
+ }
735
+ function zoomBounds(view, frame) {
736
+ const { min, max } = limitsRaw(frame);
737
+ return { atMin: view.scale <= min + 0.0001, atMax: view.scale >= max - 0.0001 };
738
+ }
739
+ // packages/exponential-ui/src/resizable.ts
740
+ var EPS2 = 0.000000001;
741
+ var clampN2 = (v, lo, hi) => Math.max(lo, Math.min(hi, v));
742
+ var tidy2 = (v) => {
743
+ const r = Math.round(v * 1e6) / 1e6;
744
+ return Object.is(r, -0) ? 0 : r;
745
+ };
550
746
  function limitsOf(limits, i, count) {
551
747
  const l = limits?.[i] ?? {};
552
748
  const cap = 100 / Math.max(1, count);
553
- const min = clampN(typeof l.min === `number` && Number.isFinite(l.min) ? l.min : PANEL_MIN, 0, cap);
554
- const max = clampN(typeof l.max === `number` && Number.isFinite(l.max) ? l.max : 100, min, 100);
749
+ const min = clampN2(typeof l.min === `number` && Number.isFinite(l.min) ? l.min : PANEL_MIN2, 0, cap);
750
+ const max = clampN2(typeof l.max === `number` && Number.isFinite(l.max) ? l.max : 100, min, 100);
555
751
  return { min, max, collapsible: l.collapsible === true };
556
752
  }
557
753
  function normalizeSizes(sizes, count, limits) {
@@ -571,11 +767,11 @@ function normalizeSizes(sizes, count, limits) {
571
767
  out = given.map((v) => v ?? rest / missing);
572
768
  }
573
769
  const total = out.reduce((s, v) => s + v, 0);
574
- out = total > EPS ? out.map((v) => v * 100 / total) : out.map(() => 100 / count);
770
+ out = total > EPS2 ? out.map((v) => v * 100 / total) : out.map(() => 100 / count);
575
771
  const lim = out.map((_, i) => limitsOf(limits, i, count));
576
- out = out.map((v, i) => lim[i].collapsible && v <= EPS ? 0 : clampN(v, lim[i].min, lim[i].max));
772
+ out = out.map((v, i) => lim[i].collapsible && v <= EPS2 ? 0 : clampN2(v, lim[i].min, lim[i].max));
577
773
  let diff = 100 - out.reduce((s, v) => s + v, 0);
578
- for (let i = 0;i < count && Math.abs(diff) > EPS; i++) {
774
+ for (let i = 0;i < count && Math.abs(diff) > EPS2; i++) {
579
775
  if (lim[i].collapsible && out[i] === 0)
580
776
  continue;
581
777
  const room = diff > 0 ? lim[i].max - out[i] : lim[i].min - out[i];
@@ -583,49 +779,49 @@ function normalizeSizes(sizes, count, limits) {
583
779
  out[i] += take;
584
780
  diff -= take;
585
781
  }
586
- return out.map(tidy);
782
+ return out.map(tidy2);
587
783
  }
588
784
  function resizePanels(sizes, handle, delta, limits) {
589
785
  const out = [...sizes];
590
786
  const a = handle;
591
787
  const b = handle + 1;
592
788
  if (a < 0 || b >= sizes.length || !Number.isFinite(delta))
593
- return out.map(tidy);
789
+ return out.map(tidy2);
594
790
  const la = limitsOf(limits, a, sizes.length);
595
791
  const lb = limitsOf(limits, b, sizes.length);
596
792
  const lo = Math.max(la.min - sizes[a], sizes[b] - lb.max);
597
793
  const hi = Math.min(la.max - sizes[a], sizes[b] - lb.min);
598
- let d = clampN(delta, Math.min(lo, 0), Math.max(hi, 0));
599
- if (la.collapsible && delta < 0 && sizes[a] > 0 && sizes[a] + delta < la.min / 2 && sizes[b] + sizes[a] <= lb.max + EPS)
794
+ let d = clampN2(delta, Math.min(lo, 0), Math.max(hi, 0));
795
+ if (la.collapsible && delta < 0 && sizes[a] > 0 && sizes[a] + delta < la.min / 2 && sizes[b] + sizes[a] <= lb.max + EPS2)
600
796
  d = -sizes[a];
601
- else if (lb.collapsible && delta > 0 && sizes[b] > 0 && sizes[b] - delta < lb.min / 2 && sizes[a] + sizes[b] <= la.max + EPS)
797
+ else if (lb.collapsible && delta > 0 && sizes[b] > 0 && sizes[b] - delta < lb.min / 2 && sizes[a] + sizes[b] <= la.max + EPS2)
602
798
  d = sizes[b];
603
799
  else if (la.collapsible && sizes[a] === 0)
604
- d = delta >= la.min / 2 && hi >= la.min - EPS ? clampN(delta, la.min, hi) : 0;
800
+ d = delta >= la.min / 2 && hi >= la.min - EPS2 ? clampN2(delta, la.min, hi) : 0;
605
801
  else if (lb.collapsible && sizes[b] === 0)
606
- d = -delta >= lb.min / 2 && -lo >= lb.min - EPS ? -clampN(-delta, lb.min, -lo) : 0;
802
+ d = -delta >= lb.min / 2 && -lo >= lb.min - EPS2 ? -clampN2(-delta, lb.min, -lo) : 0;
607
803
  out[a] = sizes[a] + d;
608
804
  out[b] = sizes[b] - d;
609
- return out.map(tidy);
805
+ return out.map(tidy2);
610
806
  }
611
807
  function keyboardResize(sizes, handle, key, orientation, direction = `ltr`, limits) {
612
808
  const a = handle;
613
809
  const b = handle + 1;
614
810
  if (a < 0 || b >= sizes.length)
615
- return sizes.map(tidy);
811
+ return sizes.map(tidy2);
616
812
  const la = limitsOf(limits, a, sizes.length);
617
813
  const lb = limitsOf(limits, b, sizes.length);
618
814
  const flip = orientation === `horizontal` && direction === `rtl` ? -1 : 1;
619
- const step = (sign) => resizePanels(sizes, handle, sign * RESIZE_STEP, limits);
815
+ const step = (sign) => resizePanels(sizes, handle, sign * RESIZE_STEP2, limits);
620
816
  switch (key) {
621
817
  case `ArrowRight`:
622
- return orientation === `horizontal` ? step(flip) : sizes.map(tidy);
818
+ return orientation === `horizontal` ? step(flip) : sizes.map(tidy2);
623
819
  case `ArrowLeft`:
624
- return orientation === `horizontal` ? step(-flip) : sizes.map(tidy);
820
+ return orientation === `horizontal` ? step(-flip) : sizes.map(tidy2);
625
821
  case `ArrowDown`:
626
- return orientation === `vertical` ? step(1) : sizes.map(tidy);
822
+ return orientation === `vertical` ? step(1) : sizes.map(tidy2);
627
823
  case `ArrowUp`:
628
- return orientation === `vertical` ? step(-1) : sizes.map(tidy);
824
+ return orientation === `vertical` ? step(-1) : sizes.map(tidy2);
629
825
  case `Home`:
630
826
  return resizePanels(sizes, handle, la.min - sizes[a], limits);
631
827
  case `End`:
@@ -634,31 +830,31 @@ function keyboardResize(sizes, handle, key, orientation, direction = `ltr`, limi
634
830
  const out = [...sizes];
635
831
  if (la.collapsible) {
636
832
  const d = sizes[a] > 0 ? -sizes[a] : Math.min(la.min, sizes[b] - lb.min);
637
- if (sizes[b] - d > lb.max + EPS || d === 0)
638
- return sizes.map(tidy);
833
+ if (sizes[b] - d > lb.max + EPS2 || d === 0)
834
+ return sizes.map(tidy2);
639
835
  out[a] += d;
640
836
  out[b] -= d;
641
837
  } else if (lb.collapsible) {
642
838
  const d = sizes[b] > 0 ? sizes[b] : -Math.min(lb.min, sizes[a] - la.min);
643
- if (sizes[a] + d > la.max + EPS || d === 0)
644
- return sizes.map(tidy);
839
+ if (sizes[a] + d > la.max + EPS2 || d === 0)
840
+ return sizes.map(tidy2);
645
841
  out[a] += d;
646
842
  out[b] -= d;
647
843
  }
648
- return out.map(tidy);
844
+ return out.map(tidy2);
649
845
  }
650
846
  default:
651
- return sizes.map(tidy);
847
+ return sizes.map(tidy2);
652
848
  }
653
849
  }
654
850
  function panelExtents(sizes, container, handleExtent = 1) {
655
851
  const avail = Math.max(0, container - Math.max(0, sizes.length - 1) * handleExtent);
656
- return sizes.map((s) => tidy(avail * s / 100));
852
+ return sizes.map((s) => tidy2(avail * s / 100));
657
853
  }
658
854
  function dragDelta(px, container, panelCount, orientation, direction = `ltr`, handleExtent = 1) {
659
855
  const avail = Math.max(1, container - Math.max(0, panelCount - 1) * handleExtent);
660
856
  const flip = orientation === `horizontal` && direction === `rtl` ? -1 : 1;
661
- return tidy(px * 100 / avail * flip);
857
+ return tidy2(px * 100 / avail * flip);
662
858
  }
663
859
  // packages/exponential-ui/src/direction.ts
664
860
  function ownDirection(node, ctx) {
@@ -2027,11 +2223,21 @@ var a11y_default = {
2027
2223
  "Tab reaches the copy button; Enter, Space: copy and announce `copied`"
2028
2224
  ]
2029
2225
  },
2226
+ Motion: {
2227
+ role: "img",
2228
+ notes: "img named by label; decorative (hidden) without one; with on.press it is a button (focusable, named by label) and its state machine gets the click",
2229
+ keys: ["Enter/Space: press (with on.press)"]
2230
+ },
2030
2231
  Image: {
2031
2232
  role: "img",
2032
2233
  notes: "img (alt = name; decorative when alt is empty)",
2033
2234
  keys: []
2034
2235
  },
2236
+ ZoomableImage: {
2237
+ role: "img",
2238
+ notes: "img (alt = name), focusable; the zoom pill's buttons are named `$string.zoomOut`, `$string.zoomIn`, `$string.zoomToFit` (pressed while at rest) and the percent button `$string.zoomLevel` (its value = the percent, opening a menu whose first row is `$string.zoomFit`)",
2239
+ keys: ["+ / =: zoom in a step", "-: zoom out a step", "0: back to the opening zoom", "1: 100%"]
2240
+ },
2035
2241
  Icon: {
2036
2242
  role: "img",
2037
2243
  notes: "img when labelled, hidden otherwise",
@@ -3513,7 +3719,7 @@ export {
3513
3719
  EXTENSION_MESSAGE_KINDS2 as EXTENSION_MESSAGE_KINDS,
3514
3720
  ExponentialConnector,
3515
3721
  ExponentialHost2 as ExponentialHost,
3516
- FIELD_INTRINSIC_WIDTH,
3722
+ FIELD_INTRINSIC_WIDTH2 as FIELD_INTRINSIC_WIDTH,
3517
3723
  FORMATTER_METHODS2 as FORMATTER_METHODS,
3518
3724
  FORMAT_FUNCTION_NAMES2 as FORMAT_FUNCTION_NAMES,
3519
3725
  FUNCTION_NAMES2 as FUNCTION_NAMES,
@@ -3525,7 +3731,7 @@ export {
3525
3731
  ICON_NAMES2 as ICON_NAMES,
3526
3732
  JsonlDecoder2 as JsonlDecoder,
3527
3733
  JsonlStreamTransport2 as JsonlStreamTransport,
3528
- LAYOUT_CONSTANTS,
3734
+ LAYOUT_CONSTANTS2 as LAYOUT_CONSTANTS,
3529
3735
  LIMITS2 as LIMITS,
3530
3736
  LIMIT_ISSUES2 as LIMIT_ISSUES,
3531
3737
  LITE_CATALOG_ID2 as LITE_CATALOG_ID,
@@ -3539,8 +3745,8 @@ export {
3539
3745
  MAX_TEMPLATE_ITEMS2 as MAX_TEMPLATE_ITEMS,
3540
3746
  MCP_ACTION_TOOL2 as MCP_ACTION_TOOL,
3541
3747
  MCP_MIME_TYPES2 as MCP_MIME_TYPES,
3542
- MEDIA_ASPECT_RATIO,
3543
- MEDIA_INTRINSIC_WIDTH,
3748
+ MEDIA_ASPECT_RATIO2 as MEDIA_ASPECT_RATIO,
3749
+ MEDIA_INTRINSIC_WIDTH2 as MEDIA_INTRINSIC_WIDTH,
3544
3750
  MEDIA_LIMITS2 as MEDIA_LIMITS,
3545
3751
  MESSAGE_KINDS2 as MESSAGE_KINDS,
3546
3752
  MODES2 as MODES,
@@ -3554,8 +3760,8 @@ export {
3554
3760
  PACKAGE_FILE_SIGNATURE_CONTEXT2 as PACKAGE_FILE_SIGNATURE_CONTEXT,
3555
3761
  PACKAGE_FORMAT_VERSION2 as PACKAGE_FORMAT_VERSION,
3556
3762
  PAINT_ERROR_HOOK2 as PAINT_ERROR_HOOK,
3557
- PANEL_MIN,
3558
- PENDING_DELAY_MS,
3763
+ PANEL_MIN2 as PANEL_MIN,
3764
+ PENDING_DELAY_MS2 as PENDING_DELAY_MS,
3559
3765
  POINTER_ISSUES2 as POINTER_ISSUES,
3560
3766
  PackageError2 as PackageError,
3561
3767
  QR_CODE,
@@ -3573,15 +3779,15 @@ export {
3573
3779
  RECORD_RESERVED_KEYS2 as RECORD_RESERVED_KEYS,
3574
3780
  RENDER_FAILED2 as RENDER_FAILED,
3575
3781
  RESERVED_KEYS2 as RESERVED_KEYS,
3576
- RESIZE_HANDLE_HIT,
3577
- RESIZE_STEP,
3782
+ RESIZE_HANDLE_HIT2 as RESIZE_HANDLE_HIT,
3783
+ RESIZE_STEP2 as RESIZE_STEP,
3578
3784
  RTL_MIRRORED_ICONS,
3579
- SEARCH_LIST_FADE,
3785
+ SEARCH_LIST_FADE2 as SEARCH_LIST_FADE,
3580
3786
  SHADCN_COLOR_VARS,
3581
- SKELETON_OPACITY_HIGH,
3582
- SKELETON_OPACITY_LOW,
3583
- SKELETON_PULSE_MS,
3584
- SKELETON_REDUCED_OPACITY,
3787
+ SKELETON_OPACITY_HIGH2 as SKELETON_OPACITY_HIGH,
3788
+ SKELETON_OPACITY_LOW2 as SKELETON_OPACITY_LOW,
3789
+ SKELETON_PULSE_MS2 as SKELETON_PULSE_MS,
3790
+ SKELETON_REDUCED_OPACITY2 as SKELETON_REDUCED_OPACITY,
3585
3791
  SPECIMEN_IDS2 as SPECIMEN_IDS,
3586
3792
  SSE_EVENTS2 as SSE_EVENTS,
3587
3793
  STRING_IDS2 as STRING_IDS,
@@ -3606,9 +3812,9 @@ export {
3606
3812
  TOKEN_NAMES2 as TOKEN_NAMES,
3607
3813
  TOOL_ID_PATTERN2 as TOOL_ID_PATTERN,
3608
3814
  TOOL_KINDS2 as TOOL_KINDS,
3609
- TREE_GUIDE_BRIDGE,
3610
- TREE_GUIDE_COLUMN,
3611
- TREE_GUIDE_RADIUS,
3815
+ TREE_GUIDE_BRIDGE2 as TREE_GUIDE_BRIDGE,
3816
+ TREE_GUIDE_COLUMN2 as TREE_GUIDE_COLUMN,
3817
+ TREE_GUIDE_RADIUS2 as TREE_GUIDE_RADIUS,
3612
3818
  ThemeError2 as ThemeError,
3613
3819
  UNKNOWN_COMPONENT2 as UNKNOWN_COMPONENT,
3614
3820
  UNKNOWN_COMPONENT_NAME2 as UNKNOWN_COMPONENT_NAME,
@@ -3618,9 +3824,10 @@ export {
3618
3824
  VOICE_WAVE_RINGS,
3619
3825
  VOICE_WAVE_SIZES,
3620
3826
  VOICE_WAVE_VARIANTS,
3621
- WINDOW_OVERSCAN,
3622
- WINDOW_THRESHOLD,
3827
+ WINDOW_OVERSCAN2 as WINDOW_OVERSCAN,
3828
+ WINDOW_THRESHOLD2 as WINDOW_THRESHOLD,
3623
3829
  WebSocketTransport2 as WebSocketTransport,
3830
+ ZOOM,
3624
3831
  absolutePath2 as absolutePath,
3625
3832
  actionMessage2 as actionMessage,
3626
3833
  activeBreakpoint2 as activeBreakpoint,
@@ -3874,8 +4081,36 @@ export {
3874
4081
  weekStart,
3875
4082
  withOwnWrites2 as withOwnWrites,
3876
4083
  writePointer2 as writePointer,
3877
- writeTokens2 as writeTokens
4084
+ writeTokens2 as writeTokens,
4085
+ zoomAtRest,
4086
+ zoomBounds,
4087
+ zoomCentre,
4088
+ zoomClamp,
4089
+ zoomDoubleTap,
4090
+ zoomDoubleTapScale,
4091
+ zoomDrag,
4092
+ zoomFitScale,
4093
+ zoomIsTall,
4094
+ zoomKey,
4095
+ zoomLadder,
4096
+ zoomLimits,
4097
+ zoomMenu,
4098
+ zoomMomentum,
4099
+ zoomMomentumActive,
4100
+ zoomPanRoom,
4101
+ zoomPercent,
4102
+ zoomPinch,
4103
+ zoomResize,
4104
+ zoomRestScale,
4105
+ zoomRestView,
4106
+ zoomRubberBand,
4107
+ zoomScroll,
4108
+ zoomStep,
4109
+ zoomStepScale,
4110
+ zoomTo,
4111
+ zoomWheel,
4112
+ zoomWheelFactor
3878
4113
  };
3879
4114
 
3880
- //# debugId=7F458AE4739CE68F64756E2164756E21
4115
+ //# debugId=D54551619D5F8EAE64756E2164756E21
3881
4116
  //# sourceMappingURL=index.js.map