@exponential_app/eui 0.2.1 → 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 (452) hide show
  1. package/catalog/a11y.json +25 -1
  2. package/catalog/core.catalog.json +426 -6
  3. package/catalog/core.schema.json +634 -4
  4. package/catalog/host.json +10 -0
  5. package/catalog/layout.json +3 -2
  6. package/catalog/limits.json +10 -1
  7. package/catalog/macros.json +542 -1
  8. package/catalog/recipes.json +4 -2
  9. package/catalog/strings.json +14 -2
  10. package/catalog/style.json +21 -0
  11. package/catalog/theme.schema.json +3950 -1337
  12. package/conformance/manifest.json +5 -5
  13. package/conformance/motion/build-corpus.ts +232 -0
  14. package/conformance/motion/corpus/SOURCES.md +117 -0
  15. package/conformance/motion/corpus/images/footage_0.json +1 -0
  16. package/conformance/motion/corpus/images/img_0.jpg +0 -0
  17. package/conformance/motion/corpus/images/img_1.jpg +0 -0
  18. package/conformance/motion/corpus/images/triangle.png +0 -0
  19. package/conformance/motion/corpus/skottie-3d-parenting-nocamera.json +367 -0
  20. package/conformance/motion/corpus/skottie-auto-orient-2.json +292 -0
  21. package/conformance/motion/corpus/skottie-auto-orient.json +717 -0
  22. package/conformance/motion/corpus/skottie-bezier-extranormal.json +199 -0
  23. package/conformance/motion/corpus/skottie-blendmode-hardmix.json +558 -0
  24. package/conformance/motion/corpus/skottie-chained-mattes.json +259 -0
  25. package/conformance/motion/corpus/skottie-dropshadow-ramp.json +852 -0
  26. package/conformance/motion/corpus/skottie-dropshadow-style.json +278 -0
  27. package/conformance/motion/corpus/skottie-effects-transform.json +385 -0
  28. package/conformance/motion/corpus/skottie-fill-effect.json +358 -0
  29. package/conformance/motion/corpus/skottie-fill-rule.json +457 -0
  30. package/conformance/motion/corpus/skottie-gaussian-blur.json +670 -0
  31. package/conformance/motion/corpus/skottie-gradient-opacity.json +451 -0
  32. package/conformance/motion/corpus/skottie-gradient-radial-highlight.json +581 -0
  33. package/conformance/motion/corpus/skottie-hidden-shapes-layers.json +381 -0
  34. package/conformance/motion/corpus/skottie-huesaturation-effect.json +1117 -0
  35. package/conformance/motion/corpus/skottie-invert-effect.json +665 -0
  36. package/conformance/motion/corpus/skottie-luma-matte.json +239 -0
  37. package/conformance/motion/corpus/skottie-mask-feather.json +892 -0
  38. package/conformance/motion/corpus/skottie-masking-opaque.json +2376 -0
  39. package/conformance/motion/corpus/skottie-masking-translucent.json +2376 -0
  40. package/conformance/motion/corpus/skottie-matte-blendmode.json +196 -0
  41. package/conformance/motion/corpus/skottie-matte-nonsequential.json +722 -0
  42. package/conformance/motion/corpus/skottie-matte-visible.json +666 -0
  43. package/conformance/motion/corpus/skottie-mergepaths-effect.json +722 -0
  44. package/conformance/motion/corpus/skottie-motion-blur-mask.json +120 -0
  45. package/conformance/motion/corpus/skottie-nested-animation.json +253 -0
  46. package/conformance/motion/corpus/skottie-offsetpaths-effect.json +525 -0
  47. package/conformance/motion/corpus/skottie-phonehub-connecting.json +947 -0
  48. package/conformance/motion/corpus/skottie-puckerbloat-effect.json +339 -0
  49. package/conformance/motion/corpus/skottie-repeater.json +234 -0
  50. package/conformance/motion/corpus/skottie-sample-1.json +168 -0
  51. package/conformance/motion/corpus/skottie-sample-search.json +329 -0
  52. package/conformance/motion/corpus/skottie-spatial-supernormal.json +898 -0
  53. package/conformance/motion/corpus/skottie-text-animator-1.json +1286 -0
  54. package/conformance/motion/corpus/skottie-text-fill-over-stroke.json +1014 -0
  55. package/conformance/motion/corpus/skottie-text-tracking.json +950 -0
  56. package/conformance/motion/corpus/skottie-text-valign.json +484 -0
  57. package/conformance/motion/corpus/skottie-time-reverse.json +297 -0
  58. package/conformance/motion/corpus/skottie-transform-skew.json +290 -0
  59. package/conformance/motion/corpus/skottie-trimpath-fill.json +933 -0
  60. package/conformance/motion/corpus/skottie-trimpath-modes.json +266 -0
  61. package/conformance/motion/corpus/skottie-tritone-effect.json +379 -0
  62. package/conformance/motion/corpus/spec-blend-mode.json +531 -0
  63. package/conformance/motion/corpus/spec-ellipse.json +142 -0
  64. package/conformance/motion/corpus/spec-fill.json +193 -0
  65. package/conformance/motion/corpus/spec-gradient-stroke.json +1263 -0
  66. package/conformance/motion/corpus/spec-gradient.json +1255 -0
  67. package/conformance/motion/corpus/spec-mask.json +773 -0
  68. package/conformance/motion/corpus/spec-masks.json +676 -0
  69. package/conformance/motion/corpus/spec-matte.json +390 -0
  70. package/conformance/motion/corpus/spec-metadata.json +1 -0
  71. package/conformance/motion/corpus/spec-path.json +177 -0
  72. package/conformance/motion/corpus/spec-pucker-bloat.json +179 -0
  73. package/conformance/motion/corpus/spec-rectangle.json +145 -0
  74. package/conformance/motion/corpus/spec-rounded-corners.json +187 -0
  75. package/conformance/motion/corpus/spec-slots.json +325 -0
  76. package/conformance/motion/corpus/spec-star.json +159 -0
  77. package/conformance/motion/corpus/spec-stroke.json +156 -0
  78. package/conformance/motion/corpus/spec-test-ellipse-xy-pos.json +141 -0
  79. package/conformance/motion/corpus/spec-test-gradient-fill.json +1 -0
  80. package/conformance/motion/corpus/spec-test-gradient-stroke.json +229 -0
  81. package/conformance/motion/corpus/spec-test-unknown-shape.json +63 -0
  82. package/conformance/motion/corpus/spec-time-remap.json +1090 -0
  83. package/conformance/motion/corpus/spec-time-stretch.json +594 -0
  84. package/conformance/motion/corpus/spec-transform.json +273 -0
  85. package/conformance/motion/corpus/spec-trim-path.json +209 -0
  86. package/conformance/motion/corpus/web-adrock.json +1 -0
  87. package/conformance/motion/corpus/web-bacon.json +1 -0
  88. package/conformance/motion/corpus/web-banner.json +1 -0
  89. package/conformance/motion/corpus/web-bodymovin.json +1 -0
  90. package/conformance/motion/corpus/web-dalek.json +1 -0
  91. package/conformance/motion/corpus/web-footage-data.json +1 -0
  92. package/conformance/motion/corpus/web-lights.json +1 -0
  93. package/conformance/motion/corpus/web-ripple.json +1 -0
  94. package/conformance/motion/corpus/web-starfish.json +1 -0
  95. package/conformance/motion/known-gaps.json +35 -0
  96. package/conformance/motion/parity/group-transforms-parenting@0.png +0 -0
  97. package/conformance/motion/parity/group-transforms-parenting@10.png +0 -0
  98. package/conformance/motion/parity/hidden-unknown-inactive@0.png +0 -0
  99. package/conformance/motion/parity/keyframes-transform@0.png +0 -0
  100. package/conformance/motion/parity/keyframes-transform@10.png +0 -0
  101. package/conformance/motion/parity/keyframes-transform@15.png +0 -0
  102. package/conformance/motion/parity/keyframes-transform@5.png +0 -0
  103. package/conformance/motion/parity/layer-opacity-blend@0.png +0 -0
  104. package/conformance/motion/parity/linear-gradient@0.png +0 -0
  105. package/conformance/motion/parity/masks-modes@0.png +0 -0
  106. package/conformance/motion/parity/matte-alpha@0.png +0 -0
  107. package/conformance/motion/parity/matte-luma@0.png +0 -0
  108. package/conformance/motion/parity/matte-parent-tp@0.png +0 -0
  109. package/conformance/motion/parity/path-evenodd@0.png +0 -0
  110. package/conformance/motion/parity/precomp-clip-offset@0.png +0 -0
  111. package/conformance/motion/parity/precomp-clip-offset@15.png +0 -0
  112. package/conformance/motion/parity/precomp-clip-offset@5.png +0 -0
  113. package/conformance/motion/parity/radial-gradient-highlight@0.png +0 -0
  114. package/conformance/motion/parity/rect-solid-fill@0.png +0 -0
  115. package/conformance/motion/parity/repeater@0.png +0 -0
  116. package/conformance/motion/parity/rounded-rect-ellipse@0.png +0 -0
  117. package/conformance/motion/parity/solid-and-image@0.png +0 -0
  118. package/conformance/motion/parity/split-position-skew@0.png +0 -0
  119. package/conformance/motion/parity/split-position-skew@10.png +0 -0
  120. package/conformance/motion/parity/star-polygon@0.png +0 -0
  121. package/conformance/motion/parity/stroke-caps-joins@0.png +0 -0
  122. package/conformance/motion/parity/stroke-dashes@0.png +0 -0
  123. package/conformance/motion/parity/stroke-dashes@10.png +0 -0
  124. package/conformance/motion/parity/time-remap@0.png +0 -0
  125. package/conformance/motion/parity/time-remap@10.png +0 -0
  126. package/conformance/motion/parity/time-remap@19.png +0 -0
  127. package/conformance/motion/parity/time-stretch@0.png +0 -0
  128. package/conformance/motion/parity/time-stretch@10.png +0 -0
  129. package/conformance/motion/parity/trim-individually@0.png +0 -0
  130. package/conformance/motion/parity/trim-path@0.png +0 -0
  131. package/conformance/motion/parity/trim-path@10.png +0 -0
  132. package/conformance/motion/refs/index.json +688 -0
  133. package/conformance/motion/refs/skottie-3d-parenting-nocamera@0.png +0 -0
  134. package/conformance/motion/refs/skottie-3d-parenting-nocamera@150.png +0 -0
  135. package/conformance/motion/refs/skottie-3d-parenting-nocamera@270.png +0 -0
  136. package/conformance/motion/refs/skottie-auto-orient-2@0.png +0 -0
  137. package/conformance/motion/refs/skottie-auto-orient-2@210.png +0 -0
  138. package/conformance/motion/refs/skottie-auto-orient-2@378.png +0 -0
  139. package/conformance/motion/refs/skottie-auto-orient@0.png +0 -0
  140. package/conformance/motion/refs/skottie-auto-orient@300.png +0 -0
  141. package/conformance/motion/refs/skottie-auto-orient@540.png +0 -0
  142. package/conformance/motion/refs/skottie-bezier-extranormal@0.png +0 -0
  143. package/conformance/motion/refs/skottie-bezier-extranormal@150.png +0 -0
  144. package/conformance/motion/refs/skottie-bezier-extranormal@270.png +0 -0
  145. package/conformance/motion/refs/skottie-blendmode-hardmix@0.png +0 -0
  146. package/conformance/motion/refs/skottie-blendmode-hardmix@150.png +0 -0
  147. package/conformance/motion/refs/skottie-blendmode-hardmix@270.png +0 -0
  148. package/conformance/motion/refs/skottie-chained-mattes@0.png +0 -0
  149. package/conformance/motion/refs/skottie-chained-mattes@300.png +0 -0
  150. package/conformance/motion/refs/skottie-chained-mattes@540.png +0 -0
  151. package/conformance/motion/refs/skottie-dropshadow-ramp@0.png +0 -0
  152. package/conformance/motion/refs/skottie-dropshadow-ramp@135.png +0 -0
  153. package/conformance/motion/refs/skottie-dropshadow-ramp@75.png +0 -0
  154. package/conformance/motion/refs/skottie-dropshadow-style@0.png +0 -0
  155. package/conformance/motion/refs/skottie-dropshadow-style@300.png +0 -0
  156. package/conformance/motion/refs/skottie-dropshadow-style@540.png +0 -0
  157. package/conformance/motion/refs/skottie-effects-transform@0.png +0 -0
  158. package/conformance/motion/refs/skottie-effects-transform@450.png +0 -0
  159. package/conformance/motion/refs/skottie-effects-transform@810.png +0 -0
  160. package/conformance/motion/refs/skottie-fill-effect@0.png +0 -0
  161. package/conformance/motion/refs/skottie-fill-effect@300.png +0 -0
  162. package/conformance/motion/refs/skottie-fill-effect@540.png +0 -0
  163. package/conformance/motion/refs/skottie-fill-rule@0.png +0 -0
  164. package/conformance/motion/refs/skottie-fill-rule@150.png +0 -0
  165. package/conformance/motion/refs/skottie-fill-rule@270.png +0 -0
  166. package/conformance/motion/refs/skottie-gaussian-blur@0.png +0 -0
  167. package/conformance/motion/refs/skottie-gaussian-blur@150.png +0 -0
  168. package/conformance/motion/refs/skottie-gaussian-blur@270.png +0 -0
  169. package/conformance/motion/refs/skottie-gradient-opacity@0.png +0 -0
  170. package/conformance/motion/refs/skottie-gradient-opacity@150.png +0 -0
  171. package/conformance/motion/refs/skottie-gradient-opacity@270.png +0 -0
  172. package/conformance/motion/refs/skottie-gradient-radial-highlight@0.png +0 -0
  173. package/conformance/motion/refs/skottie-gradient-radial-highlight@135.png +0 -0
  174. package/conformance/motion/refs/skottie-gradient-radial-highlight@75.png +0 -0
  175. package/conformance/motion/refs/skottie-hidden-shapes-layers@0.png +0 -0
  176. package/conformance/motion/refs/skottie-hidden-shapes-layers@150.png +0 -0
  177. package/conformance/motion/refs/skottie-hidden-shapes-layers@270.png +0 -0
  178. package/conformance/motion/refs/skottie-huesaturation-effect@0.png +0 -0
  179. package/conformance/motion/refs/skottie-huesaturation-effect@30.png +0 -0
  180. package/conformance/motion/refs/skottie-huesaturation-effect@54.png +0 -0
  181. package/conformance/motion/refs/skottie-invert-effect@0.png +0 -0
  182. package/conformance/motion/refs/skottie-invert-effect@300.png +0 -0
  183. package/conformance/motion/refs/skottie-invert-effect@540.png +0 -0
  184. package/conformance/motion/refs/skottie-luma-matte@0.png +0 -0
  185. package/conformance/motion/refs/skottie-luma-matte@150.png +0 -0
  186. package/conformance/motion/refs/skottie-luma-matte@270.png +0 -0
  187. package/conformance/motion/refs/skottie-mask-feather@0.png +0 -0
  188. package/conformance/motion/refs/skottie-mask-feather@150.png +0 -0
  189. package/conformance/motion/refs/skottie-mask-feather@270.png +0 -0
  190. package/conformance/motion/refs/skottie-masking-opaque@0.png +0 -0
  191. package/conformance/motion/refs/skottie-masking-opaque@135.png +0 -0
  192. package/conformance/motion/refs/skottie-masking-opaque@75.png +0 -0
  193. package/conformance/motion/refs/skottie-masking-translucent@0.png +0 -0
  194. package/conformance/motion/refs/skottie-masking-translucent@135.png +0 -0
  195. package/conformance/motion/refs/skottie-masking-translucent@75.png +0 -0
  196. package/conformance/motion/refs/skottie-matte-blendmode@0.png +0 -0
  197. package/conformance/motion/refs/skottie-matte-blendmode@150.png +0 -0
  198. package/conformance/motion/refs/skottie-matte-blendmode@270.png +0 -0
  199. package/conformance/motion/refs/skottie-matte-nonsequential@0.png +0 -0
  200. package/conformance/motion/refs/skottie-matte-nonsequential@150.png +0 -0
  201. package/conformance/motion/refs/skottie-matte-nonsequential@270.png +0 -0
  202. package/conformance/motion/refs/skottie-matte-visible@0.png +0 -0
  203. package/conformance/motion/refs/skottie-matte-visible@150.png +0 -0
  204. package/conformance/motion/refs/skottie-matte-visible@270.png +0 -0
  205. package/conformance/motion/refs/skottie-mergepaths-effect@0.png +0 -0
  206. package/conformance/motion/refs/skottie-mergepaths-effect@210.png +0 -0
  207. package/conformance/motion/refs/skottie-mergepaths-effect@378.png +0 -0
  208. package/conformance/motion/refs/skottie-motion-blur-mask@0.png +0 -0
  209. package/conformance/motion/refs/skottie-motion-blur-mask@150.png +0 -0
  210. package/conformance/motion/refs/skottie-motion-blur-mask@270.png +0 -0
  211. package/conformance/motion/refs/skottie-nested-animation@0.png +0 -0
  212. package/conformance/motion/refs/skottie-nested-animation@300.png +0 -0
  213. package/conformance/motion/refs/skottie-nested-animation@540.png +0 -0
  214. package/conformance/motion/refs/skottie-offsetpaths-effect@0.png +0 -0
  215. package/conformance/motion/refs/skottie-offsetpaths-effect@150.png +0 -0
  216. package/conformance/motion/refs/skottie-offsetpaths-effect@270.png +0 -0
  217. package/conformance/motion/refs/skottie-phonehub-connecting@0.png +0 -0
  218. package/conformance/motion/refs/skottie-puckerbloat-effect@0.png +0 -0
  219. package/conformance/motion/refs/skottie-puckerbloat-effect@210.png +0 -0
  220. package/conformance/motion/refs/skottie-puckerbloat-effect@378.png +0 -0
  221. package/conformance/motion/refs/skottie-repeater@0.png +0 -0
  222. package/conformance/motion/refs/skottie-repeater@300.png +0 -0
  223. package/conformance/motion/refs/skottie-repeater@540.png +0 -0
  224. package/conformance/motion/refs/skottie-sample-1@0.png +0 -0
  225. package/conformance/motion/refs/skottie-sample-1@100.png +0 -0
  226. package/conformance/motion/refs/skottie-sample-1@180.png +0 -0
  227. package/conformance/motion/refs/skottie-sample-search@0.png +0 -0
  228. package/conformance/motion/refs/skottie-sample-search@27.png +0 -0
  229. package/conformance/motion/refs/skottie-sample-search@48.png +0 -0
  230. package/conformance/motion/refs/skottie-spatial-supernormal@0.png +0 -0
  231. package/conformance/motion/refs/skottie-spatial-supernormal@200.png +0 -0
  232. package/conformance/motion/refs/skottie-spatial-supernormal@360.png +0 -0
  233. package/conformance/motion/refs/skottie-text-animator-1@0.png +0 -0
  234. package/conformance/motion/refs/skottie-text-animator-1@150.png +0 -0
  235. package/conformance/motion/refs/skottie-text-animator-1@270.png +0 -0
  236. package/conformance/motion/refs/skottie-text-fill-over-stroke@0.png +0 -0
  237. package/conformance/motion/refs/skottie-text-fill-over-stroke@210.png +0 -0
  238. package/conformance/motion/refs/skottie-text-fill-over-stroke@378.png +0 -0
  239. package/conformance/motion/refs/skottie-text-tracking@0.png +0 -0
  240. package/conformance/motion/refs/skottie-text-tracking@108.png +0 -0
  241. package/conformance/motion/refs/skottie-text-tracking@60.png +0 -0
  242. package/conformance/motion/refs/skottie-text-valign@0.png +0 -0
  243. package/conformance/motion/refs/skottie-text-valign@150.png +0 -0
  244. package/conformance/motion/refs/skottie-text-valign@270.png +0 -0
  245. package/conformance/motion/refs/skottie-time-reverse@0.png +0 -0
  246. package/conformance/motion/refs/skottie-time-reverse@300.png +0 -0
  247. package/conformance/motion/refs/skottie-time-reverse@540.png +0 -0
  248. package/conformance/motion/refs/skottie-transform-skew@0.png +0 -0
  249. package/conformance/motion/refs/skottie-transform-skew@300.png +0 -0
  250. package/conformance/motion/refs/skottie-transform-skew@540.png +0 -0
  251. package/conformance/motion/refs/skottie-trimpath-fill@0.png +0 -0
  252. package/conformance/motion/refs/skottie-trimpath-fill@300.png +0 -0
  253. package/conformance/motion/refs/skottie-trimpath-fill@540.png +0 -0
  254. package/conformance/motion/refs/skottie-trimpath-modes@0.png +0 -0
  255. package/conformance/motion/refs/skottie-trimpath-modes@300.png +0 -0
  256. package/conformance/motion/refs/skottie-trimpath-modes@540.png +0 -0
  257. package/conformance/motion/refs/skottie-tritone-effect@0.png +0 -0
  258. package/conformance/motion/refs/skottie-tritone-effect@300.png +0 -0
  259. package/conformance/motion/refs/skottie-tritone-effect@540.png +0 -0
  260. package/conformance/motion/refs/spec-blend-mode@0.png +0 -0
  261. package/conformance/motion/refs/spec-blend-mode@162.png +0 -0
  262. package/conformance/motion/refs/spec-blend-mode@90.png +0 -0
  263. package/conformance/motion/refs/spec-ellipse@0.png +0 -0
  264. package/conformance/motion/refs/spec-ellipse@162.png +0 -0
  265. package/conformance/motion/refs/spec-ellipse@90.png +0 -0
  266. package/conformance/motion/refs/spec-fill@0.png +0 -0
  267. package/conformance/motion/refs/spec-fill@162.png +0 -0
  268. package/conformance/motion/refs/spec-fill@90.png +0 -0
  269. package/conformance/motion/refs/spec-gradient-stroke@0.png +0 -0
  270. package/conformance/motion/refs/spec-gradient-stroke@162.png +0 -0
  271. package/conformance/motion/refs/spec-gradient-stroke@90.png +0 -0
  272. package/conformance/motion/refs/spec-gradient@0.png +0 -0
  273. package/conformance/motion/refs/spec-gradient@162.png +0 -0
  274. package/conformance/motion/refs/spec-gradient@90.png +0 -0
  275. package/conformance/motion/refs/spec-mask@0.png +0 -0
  276. package/conformance/motion/refs/spec-mask@300.png +0 -0
  277. package/conformance/motion/refs/spec-mask@540.png +0 -0
  278. package/conformance/motion/refs/spec-masks@0.png +0 -0
  279. package/conformance/motion/refs/spec-masks@135.png +0 -0
  280. package/conformance/motion/refs/spec-masks@75.png +0 -0
  281. package/conformance/motion/refs/spec-matte@0.png +0 -0
  282. package/conformance/motion/refs/spec-matte@162.png +0 -0
  283. package/conformance/motion/refs/spec-matte@90.png +0 -0
  284. package/conformance/motion/refs/spec-metadata@0.png +0 -0
  285. package/conformance/motion/refs/spec-metadata@162.png +0 -0
  286. package/conformance/motion/refs/spec-metadata@90.png +0 -0
  287. package/conformance/motion/refs/spec-path@0.png +0 -0
  288. package/conformance/motion/refs/spec-path@162.png +0 -0
  289. package/conformance/motion/refs/spec-path@90.png +0 -0
  290. package/conformance/motion/refs/spec-pucker-bloat@0.png +0 -0
  291. package/conformance/motion/refs/spec-pucker-bloat@162.png +0 -0
  292. package/conformance/motion/refs/spec-pucker-bloat@90.png +0 -0
  293. package/conformance/motion/refs/spec-rectangle@0.png +0 -0
  294. package/conformance/motion/refs/spec-rectangle@162.png +0 -0
  295. package/conformance/motion/refs/spec-rectangle@90.png +0 -0
  296. package/conformance/motion/refs/spec-rounded-corners@0.png +0 -0
  297. package/conformance/motion/refs/spec-rounded-corners@162.png +0 -0
  298. package/conformance/motion/refs/spec-rounded-corners@90.png +0 -0
  299. package/conformance/motion/refs/spec-slots@0.png +0 -0
  300. package/conformance/motion/refs/spec-slots@450.png +0 -0
  301. package/conformance/motion/refs/spec-slots@810.png +0 -0
  302. package/conformance/motion/refs/spec-star@0.png +0 -0
  303. package/conformance/motion/refs/spec-star@162.png +0 -0
  304. package/conformance/motion/refs/spec-star@90.png +0 -0
  305. package/conformance/motion/refs/spec-stroke@0.png +0 -0
  306. package/conformance/motion/refs/spec-stroke@162.png +0 -0
  307. package/conformance/motion/refs/spec-stroke@90.png +0 -0
  308. package/conformance/motion/refs/spec-test-ellipse-xy-pos@0.png +0 -0
  309. package/conformance/motion/refs/spec-test-ellipse-xy-pos@162.png +0 -0
  310. package/conformance/motion/refs/spec-test-ellipse-xy-pos@90.png +0 -0
  311. package/conformance/motion/refs/spec-test-gradient-fill@0.png +0 -0
  312. package/conformance/motion/refs/spec-test-gradient-fill@30.png +0 -0
  313. package/conformance/motion/refs/spec-test-gradient-fill@54.png +0 -0
  314. package/conformance/motion/refs/spec-test-gradient-stroke@0.png +0 -0
  315. package/conformance/motion/refs/spec-test-gradient-stroke@30.png +0 -0
  316. package/conformance/motion/refs/spec-test-gradient-stroke@54.png +0 -0
  317. package/conformance/motion/refs/spec-test-unknown-shape@0.png +0 -0
  318. package/conformance/motion/refs/spec-test-unknown-shape@162.png +0 -0
  319. package/conformance/motion/refs/spec-test-unknown-shape@90.png +0 -0
  320. package/conformance/motion/refs/spec-time-remap@0.png +0 -0
  321. package/conformance/motion/refs/spec-time-remap@300.png +0 -0
  322. package/conformance/motion/refs/spec-time-remap@540.png +0 -0
  323. package/conformance/motion/refs/spec-time-stretch@0.png +0 -0
  324. package/conformance/motion/refs/spec-time-stretch@300.png +0 -0
  325. package/conformance/motion/refs/spec-time-stretch@540.png +0 -0
  326. package/conformance/motion/refs/spec-transform@0.png +0 -0
  327. package/conformance/motion/refs/spec-transform@162.png +0 -0
  328. package/conformance/motion/refs/spec-transform@90.png +0 -0
  329. package/conformance/motion/refs/spec-trim-path@0.png +0 -0
  330. package/conformance/motion/refs/spec-trim-path@162.png +0 -0
  331. package/conformance/motion/refs/spec-trim-path@90.png +0 -0
  332. package/conformance/motion/refs/web-adrock@0.png +0 -0
  333. package/conformance/motion/refs/web-adrock@10.png +0 -0
  334. package/conformance/motion/refs/web-adrock@18.png +0 -0
  335. package/conformance/motion/refs/web-bacon@0.png +0 -0
  336. package/conformance/motion/refs/web-bacon@126.png +0 -0
  337. package/conformance/motion/refs/web-bacon@70.png +0 -0
  338. package/conformance/motion/refs/web-banner@0.png +0 -0
  339. package/conformance/motion/refs/web-banner@301.png +0 -0
  340. package/conformance/motion/refs/web-banner@542.png +0 -0
  341. package/conformance/motion/refs/web-bodymovin@0.png +0 -0
  342. package/conformance/motion/refs/web-bodymovin@51.png +0 -0
  343. package/conformance/motion/refs/web-bodymovin@92.png +0 -0
  344. package/conformance/motion/refs/web-dalek@0.png +0 -0
  345. package/conformance/motion/refs/web-dalek@145.png +0 -0
  346. package/conformance/motion/refs/web-dalek@261.png +0 -0
  347. package/conformance/motion/refs/web-footage-data@0.png +0 -0
  348. package/conformance/motion/refs/web-footage-data@180.png +0 -0
  349. package/conformance/motion/refs/web-footage-data@324.png +0 -0
  350. package/conformance/motion/refs/web-lights@0.png +0 -0
  351. package/conformance/motion/refs/web-lights@150.png +0 -0
  352. package/conformance/motion/refs/web-lights@270.png +0 -0
  353. package/conformance/motion/refs/web-ripple@0.png +0 -0
  354. package/conformance/motion/refs/web-ripple@180.png +0 -0
  355. package/conformance/motion/refs/web-ripple@324.png +0 -0
  356. package/conformance/motion/refs/web-starfish@0.png +0 -0
  357. package/conformance/motion/refs/web-starfish@150.png +0 -0
  358. package/conformance/motion/refs/web-starfish@270.png +0 -0
  359. package/conformance/motion/render-refs.ts +126 -0
  360. package/conformance/motion/report.json +1367 -0
  361. package/conformance/motion/web-parity-gaps.json +12 -0
  362. package/conformance/motion-parity-entry.ts +3 -0
  363. package/conformance/motion-parity.ts +101 -0
  364. package/dist/chunks/{index-gtk2gwsb.js → index-4xczxey5.js} +187 -40
  365. package/dist/chunks/{index-gtk2gwsb.js.map → index-4xczxey5.js.map} +7 -6
  366. package/dist/chunks/{index-62yzr94z.js → index-5sjj5p84.js} +270 -8
  367. package/dist/chunks/{index-62yzr94z.js.map → index-5sjj5p84.js.map} +2 -2
  368. package/dist/chunks/{index-fy7y2nz8.js → index-cvf7bbs5.js} +23 -2
  369. package/dist/chunks/{index-fy7y2nz8.js.map → index-cvf7bbs5.js.map} +1 -1
  370. package/dist/chunks/index-dgkf6yw5.js +48 -0
  371. package/dist/chunks/index-dgkf6yw5.js.map +10 -0
  372. package/dist/chunks/{index-5fmaa0xq.js → index-f9wkb6aq.js} +851 -36
  373. package/dist/chunks/{index-5fmaa0xq.js.map → index-f9wkb6aq.js.map} +2 -2
  374. package/dist/chunks/index-t2mwfbb6.js +1515 -0
  375. package/dist/chunks/index-t2mwfbb6.js.map +15 -0
  376. package/dist/chunks/{index-bg2jsgjq.js → index-vkn82srs.js} +479 -10
  377. package/dist/chunks/{index-bg2jsgjq.js.map → index-vkn82srs.js.map} +2 -2
  378. package/dist/chunks/wasm-ctcc3cma.js +424 -0
  379. package/dist/chunks/wasm-ctcc3cma.js.map +11 -0
  380. package/dist/conformance.js +10941 -563
  381. package/dist/conformance.js.map +2 -2
  382. package/dist/entries/prompt.js +2 -2
  383. package/dist/entries/schema.js +3 -3
  384. package/dist/host/index.js +20 -4
  385. package/dist/host/index.js.map +1 -1
  386. package/dist/index.js +364 -99
  387. package/dist/index.js.map +4 -4
  388. package/dist/types/src/catalog.generated.d.ts +71 -5
  389. package/dist/types/src/host/contract.d.ts +17 -0
  390. package/dist/types/src/host/exposes.d.ts +68 -0
  391. package/dist/types/src/host/index.d.ts +1 -0
  392. package/dist/types/src/host/package.d.ts +8 -0
  393. package/dist/types/src/index.d.ts +2 -0
  394. package/dist/types/src/layout.d.ts +2 -0
  395. package/dist/types/src/limits.d.ts +1 -0
  396. package/dist/types/src/motion/index.d.ts +1 -0
  397. package/dist/types/src/motion/server.d.ts +9 -0
  398. package/dist/types/src/motion/wasm.d.ts +11 -0
  399. package/dist/types/src/web/coerce.d.ts +3 -0
  400. package/dist/types/src/web/focus.d.ts +8 -0
  401. package/dist/types/src/web/index.d.ts +5 -2
  402. package/dist/types/src/web/primitives/carousel.d.ts +17 -0
  403. package/dist/types/src/web/primitives/dock.d.ts +5 -2
  404. package/dist/types/src/web/primitives/index.d.ts +5 -0
  405. package/dist/types/src/web/primitives/mosaic.d.ts +30 -0
  406. package/dist/types/src/web/primitives/motion-paint.d.ts +36 -0
  407. package/dist/types/src/web/primitives/motion.d.ts +162 -0
  408. package/dist/types/src/web/primitives/outline.d.ts +22 -0
  409. package/dist/types/src/web/primitives/zoomable-image.d.ts +158 -0
  410. package/dist/types/src/web/table.d.ts +8 -0
  411. package/dist/types/src/zoom.d.ts +128 -0
  412. package/dist/types/wasm/motion/bytes.d.ts +1 -0
  413. package/dist/web/index.js +171 -230
  414. package/dist/web/index.js.map +9 -10
  415. package/dist/web/primitives/index.js +641 -6
  416. package/dist/web/primitives/index.js.map +9 -5
  417. package/docs/components.generated.json +542 -5
  418. package/docs/package-format.md +56 -1
  419. package/docs/round-6-contract.md +110 -0
  420. package/docs/themes.generated.json +66 -2
  421. package/fixtures/bind-time.json +1468 -0
  422. package/fixtures/catalog-components.json +1026 -16
  423. package/fixtures/catalog-macros.json +1279 -157
  424. package/fixtures/conformance-baseline.json +48893 -47200
  425. package/fixtures/conformance-known.json +140 -134
  426. package/fixtures/host-router.json +539 -1
  427. package/fixtures/kitchen-sink.expanded.json +686 -1
  428. package/fixtures/kitchen-sink.json +102 -1
  429. package/fixtures/layout-geometry-round1.json +42 -42
  430. package/fixtures/motion-frames.json +2618 -0
  431. package/fixtures/motion-playback.json +528 -0
  432. package/fixtures/motion-state.json +722 -0
  433. package/fixtures/motion-validate.json +138 -0
  434. package/fixtures/primitive-specimens.json +4 -0
  435. package/fixtures/prompt-budget.json +16 -16
  436. package/fixtures/specimens.json +839 -21
  437. package/fixtures/theme-recipes.json +32808 -28396
  438. package/fixtures/theme-resolved.json +2114 -286
  439. package/fixtures/zoom.json +1382 -0
  440. package/generated/ExponentialUICatalog.generated.kt +21 -21
  441. package/generated/ExponentialUICatalog.generated.swift +21 -21
  442. package/generated/ExponentialUIThemes.generated.kt +7 -7
  443. package/generated/ExponentialUIThemes.generated.swift +7 -7
  444. package/generated/catalog.descriptions.generated.rs +1 -1
  445. package/generated/catalog.generated.rs +30 -30
  446. package/generated/catalog.themes.generated.rs +8 -8
  447. package/generated/core.descriptions.json +267 -5
  448. package/generated/core.runtime.json +275 -1
  449. package/package.json +1 -1
  450. package/themes/neutral.theme.json +460 -3
  451. package/dist/chunks/index-t6qz1770.js +0 -95
  452. package/dist/chunks/index-t6qz1770.js.map +0 -11
@@ -0,0 +1,162 @@
1
+ import { type ModeName, type ResolvedTheme } from "@exponential_app/eui";
2
+ import type { HostPlugin } from "../host-types.js";
3
+ import { type MotionFit } from "./motion-paint.js";
4
+ export { paintMotionFrame, motionFitMatrix, motionConcat, motionFrameSize, MotionCanvasPool } from "./motion-paint.js";
5
+ export type { MotionFit, MotionMatrix } from "./motion-paint.js";
6
+ /** At most this many Motions animate per surface (tree order). */
7
+ export declare const MOTION_MAX_PLAYING = 8;
8
+ /** At most this many frames per second. */
9
+ export declare const MOTION_MAX_FPS = 60;
10
+ export interface MotionEnv {
11
+ theme: ResolvedTheme;
12
+ mode: ModeName;
13
+ reducedMotion: boolean;
14
+ host: HostPlugin;
15
+ /** A load failure (the box stays empty): the wrapper reports it as a paint error. */
16
+ onError?: (message: string) => void;
17
+ /** The node's `on` events (the wrapper's A2UI action plumbing). */
18
+ emit?: MotionEmit;
19
+ /** `on.press` is set: the Motion is a button (Enter / Space press it). */
20
+ pressable?: boolean;
21
+ }
22
+ /** The events a Motion fires (its `on`); `state` carries `{state}`. */
23
+ export type MotionEvent = `press` | `hover` | `visible` | `complete` | `state`;
24
+ export type MotionEmit = (event: MotionEvent, payload?: Record<string, unknown>) => void;
25
+ type Props = Record<string, unknown>;
26
+ /** The composition size a node declares without loading anything (the
27
+ * dialect's `size`, an inline Lottie's `w`/`h`); null for `src`. */
28
+ export declare function motionDeclaredSize(props: Props): [number, number] | null;
29
+ /** Contract §4 (shared with eui-core's layout): an unstyled box is the
30
+ * composition's px width, shrinking to the available width, aspect kept;
31
+ * a style width or height wins (the aspect still fills the other edge). */
32
+ export declare function motionBoxStyle(size: [number, number] | null, nodeStyle: unknown): Record<string, string>;
33
+ /** The fit prop, defaulted. */
34
+ export declare function motionFit(value: unknown): MotionFit;
35
+ /** Contract §6: role img named by `label`; hidden (decorative) without one.
36
+ * M4 §4: with `on.press` (`pressable`) a focusable button named by `label`. */
37
+ export declare function motionA11y(label: unknown, pressable?: boolean): {
38
+ role?: `img` | `button`;
39
+ tabIndex?: number;
40
+ "aria-label"?: string;
41
+ "aria-hidden"?: `true`;
42
+ };
43
+ /** The theme's slot overrides for `slotIds` (contract §2). */
44
+ export declare function motionThemeSlots(slotIds: readonly string[], theme: ResolvedTheme, mode: ModeName, own: unknown): Record<string, unknown>;
45
+ /** Whether this environment paints Motions at all. */
46
+ export declare function motionCanPaint(): boolean;
47
+ /** A .lottie archive's first animation as Lottie JSON, its images inlined. */
48
+ export declare function motionFromDotLottie(bytes: Uint8Array): Promise<string>;
49
+ /** A .lottie archive's first animation (Lottie JSON, images inlined) and its
50
+ * first state machine (dotLottie 2 `s/<id>.json`, v1 `states/`), or null. */
51
+ export declare function motionDotLottie(bytes: Uint8Array): Promise<{
52
+ lottie: string;
53
+ stateMachine: Record<string, unknown> | null;
54
+ }>;
55
+ /** The engine's state-machine API (the WASM `MotionPlayer`). */
56
+ export interface MotionMachinePlayer {
57
+ setStateMachine(json: string): boolean;
58
+ smPost(kind: string, layer: string): boolean;
59
+ smSetInputs(json: string): boolean;
60
+ smStatus(): string;
61
+ }
62
+ /** A Motion's state machine half (README › Interactivity §1–4). The engine
63
+ * interprets the machine; this posts interactions and inputs to it, restarts
64
+ * the clock when the state changes and turns its status into events:
65
+ * `state` for every entered state (`{state}`), `complete` once per state
66
+ * when its play finished or it is final. Without a machine it still reports
67
+ * `complete` for a finished finite play. */
68
+ export declare class MotionStateDriver {
69
+ private readonly player;
70
+ private readonly emit;
71
+ /** The state changed: restart the clock at 0. */
72
+ private readonly restart;
73
+ private machineKey;
74
+ private inputsKey;
75
+ private completeSent;
76
+ running: boolean;
77
+ constructor(player: MotionMachinePlayer, emit: MotionEmit,
78
+ /** The state changed: restart the clock at 0. */
79
+ restart: () => void);
80
+ /** Start (or restart, when its JSON changed) the machine; null = none.
81
+ * Returns whether one runs (its state's playback replaces the props'). */
82
+ setMachine(machine: unknown): boolean;
83
+ /** The node's `inputs` (literal or bound): written on every change. */
84
+ setInputs(inputs: unknown): void;
85
+ /** An interaction (`click`, `pointerDown`, `pointerUp`, `pointerEnter`, `pointerExit`). */
86
+ post(kind: string, layer?: string): void;
87
+ /** The clock reported `done` for the current play. */
88
+ done(): void;
89
+ /** A new play without a machine (the playback props changed). */
90
+ replay(): void;
91
+ private changed;
92
+ private drain;
93
+ }
94
+ /** One Motion on the page: load, clock, paint. `update` on every prop or
95
+ * environment change; `destroy` on unmount. */
96
+ export declare class MotionView {
97
+ readonly root: HTMLElement;
98
+ readonly canvas: HTMLCanvasElement;
99
+ private props;
100
+ private nodeStyle;
101
+ private env;
102
+ private sourceKey;
103
+ private slotsKey;
104
+ private playbackKey;
105
+ private generation;
106
+ private lottie;
107
+ /** A `.lottie` src's first state machine. */
108
+ private fileMachine;
109
+ private driver;
110
+ private halfSeen;
111
+ private visibleSent;
112
+ private slotIds;
113
+ private player;
114
+ private images;
115
+ private pool;
116
+ private io;
117
+ private ro;
118
+ private visible;
119
+ private surface;
120
+ private raf;
121
+ private last;
122
+ private lastPaint;
123
+ private elapsed;
124
+ private finished;
125
+ private restarts;
126
+ private inTick;
127
+ private painted;
128
+ private destroyed;
129
+ constructor(root: HTMLElement, canvas: HTMLCanvasElement);
130
+ /** `nodeStyle` = the node's own `style` (a style width/height wins over the composition size). */
131
+ update(props: Props, env: MotionEnv, nodeStyle?: unknown): void;
132
+ private emit;
133
+ /** `on.visible` once, as soon as there is an env to emit through. */
134
+ private flushVisible;
135
+ private onClick;
136
+ private onKey;
137
+ private onPointer;
138
+ /** The machine (the prop, else the file's) and its inputs → the engine. */
139
+ private applyMachine;
140
+ /** The state changed: the clock restarts at 0. */
141
+ private restartClock;
142
+ destroy(): void;
143
+ private fail;
144
+ private load;
145
+ private free;
146
+ /** (Re)build the player from the loaded Lottie with the current slots. */
147
+ private instantiate;
148
+ private loadImages;
149
+ private applyPlayback;
150
+ private wantsToAnimate;
151
+ private leaveSurface;
152
+ /** Start or stop the clock to match the state; paint the still frame when stopped. */
153
+ schedule(): void;
154
+ private stop;
155
+ private tick;
156
+ /** The frame shown while the clock is stopped. */
157
+ private stillFrame;
158
+ private repaint;
159
+ private paint;
160
+ }
161
+ /** Test seam: forget the per-theme ids (a fresh module state). */
162
+ export declare function resetMotionThemeIds(): void;
@@ -0,0 +1,22 @@
1
+ export declare const OUTLINE_GEOMETRY: {
2
+ readonly rowHeight: 32;
3
+ readonly activeBar: 2;
4
+ };
5
+ export interface OutlineItem {
6
+ id: string;
7
+ title: string;
8
+ /** A muted `· n` after the title; 0 or unset = none. */
9
+ count?: number | null;
10
+ }
11
+ export declare const OUTLINE_CLASSES: {
12
+ readonly root: "flex min-w-0 flex-col gap-[2px]";
13
+ readonly caption: "px-2 py-1 text-[11px] leading-4 font-medium tracking-[0.5px] text-muted-foreground uppercase";
14
+ /** One row: a button, the active one `data-active=true`. */
15
+ readonly row: "relative flex h-[32px] w-full min-w-0 cursor-pointer items-center gap-1 overflow-hidden rounded-md px-2 text-start text-sm text-muted-foreground outline-none transition-colors duration-fast hover:bg-accent focus-visible:ring-[3px] focus-visible:ring-ring/50 data-[active=true]:bg-accent data-[active=true]:font-medium data-[active=true]:text-foreground";
16
+ /** The leading-edge bar of the active row. */
17
+ readonly bar: "pointer-events-none absolute inset-y-0 start-0 w-[2px] bg-foreground";
18
+ readonly title: "min-w-0 flex-1 truncate";
19
+ readonly count: "shrink-0 text-xs text-muted-foreground tabular-nums";
20
+ };
21
+ /** The trailing count text (`· n`), or null when there is none. */
22
+ export declare function outlineCountText(count: number | null | undefined): string | null;
@@ -0,0 +1,158 @@
1
+ import type * as Zoom from "../../zoom.js";
2
+ import type { ZoomFrame, ZoomInitial, ZoomSize, ZoomView } from "../../zoom.js";
3
+ type Core = typeof Zoom;
4
+ /** The core functions the controller drives (`@exponential_app/eui`). */
5
+ export type ZoomMath = Pick<Core, `ZOOM` | `zoomIsTall` | `zoomRestView` | `zoomClamp` | `zoomAtRest` | `zoomTo` | `zoomCentre` | `zoomWheel` | `zoomScroll` | `zoomStep` | `zoomDoubleTap` | `zoomKey` | `zoomDrag` | `zoomPinch` | `zoomMomentum` | `zoomMomentumActive` | `zoomPanRoom` | `zoomResize` | `zoomPercent` | `zoomMenu` | `zoomBounds`>;
6
+ export declare const ZOOM_CONTROLS: readonly ["auto", "always", "none"];
7
+ export type ZoomControls = (typeof ZOOM_CONTROLS)[number];
8
+ /** What the pill draws (changes only when one of these does). */
9
+ export interface ZoomPillState {
10
+ percent: string;
11
+ atMin: boolean;
12
+ atMax: boolean;
13
+ atRest: boolean;
14
+ }
15
+ /** Two taps / clicks closer than this (ms, px) are a double tap. */
16
+ export declare const ZOOM_DOUBLE_TAP_MS = 300;
17
+ export declare const ZOOM_DOUBLE_TAP_SLOP = 24;
18
+ /** A press that moves less than this (px) is a tap, not a drag. */
19
+ export declare const ZOOM_TAP_SLOP = 4;
20
+ /** A ⌘/ctrl-wheel run settles (fires `zoom`) after this idle (ms). */
21
+ export declare const ZOOM_WHEEL_SETTLE_MS = 150;
22
+ /** The box's CSS aspect ratio (w/h): the picture's own, capped at the width
23
+ * for a TALL picture (a square window onto its top), else 16:9; none when
24
+ * the style sets a height. */
25
+ export declare function zoomBoxAspect(math: Pick<ZoomMath, `zoomIsTall`>, natural: ZoomSize | null, styledHeight: boolean): number | null;
26
+ /** The natural size the props declare (both positive), else null. */
27
+ export declare function zoomDeclaredSize(width: unknown, height: unknown): ZoomSize | null;
28
+ /** The menu's items (Fit, then the presets inside the limits) for the
29
+ * current view, before the controller measured (the rest view's). */
30
+ export declare function zoomPillOf(math: ZoomMath, view: ZoomView, frame: ZoomFrame): ZoomPillState;
31
+ export interface ZoomControllerOptions {
32
+ math: ZoomMath;
33
+ /** The viewport: focusable, takes every gesture. */
34
+ root: HTMLElement;
35
+ /** The picture, transformed (`transform-origin: 0 0`). */
36
+ image: HTMLElement;
37
+ /** The zoom pill (its hover / focus keep it shown); null = none. */
38
+ pill: () => HTMLElement | null;
39
+ /** The picture's pixel size, null while unknown. */
40
+ natural: () => ZoomSize | null;
41
+ initial: () => ZoomInitial;
42
+ maxScale: () => number | undefined;
43
+ /** The scale the host binds (`scale`), undefined = the rest view. */
44
+ boundScale: () => number | undefined;
45
+ /** The CSS `transition` of an animated change (the theme's standard
46
+ * motion); null = snap (reduced motion). */
47
+ transition: () => string | null;
48
+ /** `controls: auto` (the pill hides on its own). */
49
+ autoHide: () => boolean;
50
+ onPill: (pill: ZoomPillState) => void;
51
+ onPillVisible: (visible: boolean) => void;
52
+ /** A settled zoom change. */
53
+ onZoom: (scale: number, atFit: boolean) => void;
54
+ /** A single tap / click at rest. */
55
+ onTap: () => void;
56
+ }
57
+ export interface ZoomController {
58
+ view: () => ZoomView;
59
+ frame: () => ZoomFrame | null;
60
+ /** The pill's − / +. */
61
+ step: (direction: 1 | -1) => void;
62
+ /** Back to the rest view (the fit button, the menu's Fit). */
63
+ rest: () => void;
64
+ /** To `scale` about the viewport centre (the menu's presets). */
65
+ zoomScale: (scale: number) => void;
66
+ /** The bound `scale` changed from outside: apply it, no event. */
67
+ syncScale: () => void;
68
+ /** A new picture / natural size / initial / max: the rest view, at once. */
69
+ reset: () => void;
70
+ /** Keep the pill shown (its menu is open). */
71
+ holdPill: (hold: boolean) => void;
72
+ destroy: () => void;
73
+ }
74
+ /** Binds the gestures to `root` and paints `image`; the pill's state and
75
+ * visibility go out through the callbacks. Every number comes from the
76
+ * core's functions. */
77
+ export declare function createZoomController(o: ZoomControllerOptions): ZoomController;
78
+ /** The native's LAYOUT (inline: the theme recipe styles every part, these
79
+ * only place them; React style objects, Solid passes them through `css`).
80
+ * `pill` = style.json `zoomableImage.pill`. `flexShrink` comes last: jsdom
81
+ * re-appends it when Solid re-applies a style, so React's order holds. */
82
+ export declare function zoomableImageLayout(pill: {
83
+ inset: number;
84
+ percentMinWidth: number;
85
+ }): {
86
+ readonly root: {
87
+ readonly overflow: "clip";
88
+ readonly userSelect: "none";
89
+ };
90
+ readonly image: {
91
+ readonly position: "absolute";
92
+ readonly left: 0;
93
+ readonly top: 0;
94
+ readonly display: "block";
95
+ readonly maxWidth: "none";
96
+ readonly maxHeight: "none";
97
+ readonly transformOrigin: "0 0";
98
+ readonly pointerEvents: "none";
99
+ readonly userSelect: "none";
100
+ };
101
+ readonly pill: {
102
+ readonly position: "absolute";
103
+ readonly left: "50%";
104
+ readonly bottom: number;
105
+ readonly transform: "translateX(-50%)";
106
+ readonly zIndex: 1;
107
+ readonly display: "flex";
108
+ readonly flexDirection: "row";
109
+ readonly alignItems: "center";
110
+ readonly whiteSpace: "nowrap";
111
+ readonly cursor: "default";
112
+ readonly transition: "opacity var(--xui-motion-standard) var(--xui-ease-standard,ease)";
113
+ };
114
+ readonly pillHidden: {
115
+ readonly opacity: 0;
116
+ readonly pointerEvents: "none";
117
+ };
118
+ readonly button: {
119
+ readonly display: "inline-flex";
120
+ readonly alignItems: "center";
121
+ readonly justifyContent: "center";
122
+ readonly cursor: "pointer";
123
+ readonly flexShrink: 0;
124
+ };
125
+ readonly percent: {
126
+ readonly display: "inline-flex";
127
+ readonly alignItems: "center";
128
+ readonly justifyContent: "center";
129
+ readonly cursor: "pointer";
130
+ readonly minWidth: number;
131
+ readonly fontVariantNumeric: "tabular-nums";
132
+ readonly flexShrink: 0;
133
+ };
134
+ readonly divider: {
135
+ readonly alignSelf: "center";
136
+ readonly flexShrink: 0;
137
+ };
138
+ };
139
+ /** The settle spring of the native (the theme's standard motion). */
140
+ export declare const ZOOMABLE_IMAGE_NATIVE_TRANSITION = "transform var(--xui-motion-standard) var(--xui-ease-standard,ease)";
141
+ /** The primitive's (the app's motion tokens). */
142
+ export declare const ZOOMABLE_IMAGE_TRANSITION = "transform var(--motion-duration-standard,var(--xui-duration-standard,180ms)) var(--motion-ease-standard,cubic-bezier(0.2,0,0,1))";
143
+ /** The primitive's picture style before the controller paints it. */
144
+ export declare function zoomImageStyle(natural: ZoomSize | null): Record<string, string | number>;
145
+ export declare const ZOOMABLE_IMAGE_CLASSES: {
146
+ /** The viewport: as wide as its parent, the picture clipped to it. */
147
+ readonly root: "relative w-full min-w-0 overflow-hidden rounded-md select-none outline-none focus-visible:ring-[3px] focus-visible:ring-ring/50";
148
+ readonly image: "pointer-events-none absolute top-0 left-0 block max-h-none max-w-none origin-top-left select-none";
149
+ /** THE pill: one glass capsule bottom-centre, `pill.inset` above the edge. */
150
+ readonly pill: "absolute bottom-4 left-1/2 z-10 flex -translate-x-1/2 flex-row items-center gap-0.5 rounded-full border border-glass-stroke-card bg-popover p-1 whitespace-nowrap shadow-lg backdrop-blur-lg transition-opacity duration-standard ease-standard";
151
+ readonly pillHidden: "pointer-events-none opacity-0";
152
+ /** − / + / fit: ghost icon buttons, 28 px circles (no border or fill of
153
+ * their own where the host has no preflight). */
154
+ readonly button: "size-7 rounded-full border-0 bg-transparent";
155
+ readonly percent: "h-7 min-w-14 rounded-full border-0 bg-transparent px-2 tabular-nums";
156
+ readonly divider: "mx-0.5 h-4 w-px shrink-0 bg-border";
157
+ };
158
+ export {};
@@ -11,7 +11,15 @@ export interface TableColumn {
11
11
  width?: number;
12
12
  align?: `start` | `center` | `end`;
13
13
  sortable?: boolean;
14
+ /** EXP-1548: one line with an ellipsis; cells wrap otherwise. */
15
+ truncate?: boolean;
14
16
  }
17
+ /** Every row's grid columns (round 2 §7): a fixed `width` keeps its px, the
18
+ * rest share the width, EXP-1548: never under `tableColumnMin`. */
19
+ export declare function tableTemplate(columns: readonly TableColumn[], multiple: boolean): string;
20
+ /** EXP-1548: the narrowest the columns fit in: header and body are at least
21
+ * this wide, so a narrower table scrolls (its root is the scroller). */
22
+ export declare function tableMinWidth(columns: readonly TableColumn[], multiple: boolean): string;
15
23
  export interface TableSort {
16
24
  key: string;
17
25
  direction: `asc` | `desc`;
@@ -0,0 +1,128 @@
1
+ export declare const ZOOM: {
2
+ $comment: string;
3
+ tallAspect: number;
4
+ maxScale: number;
5
+ presets: number[];
6
+ menuPresets: number[];
7
+ doubleTapFactor: number;
8
+ wheelRate: number;
9
+ wheelLinePx: number;
10
+ rubber: number;
11
+ momentumTauMs: number;
12
+ autoHideMs: number;
13
+ pill: {
14
+ height: number;
15
+ inset: number;
16
+ padding: number;
17
+ gap: number;
18
+ percentMinWidth: number;
19
+ dividerHeight: number;
20
+ };
21
+ };
22
+ export type ZoomInitial = `auto` | `fit` | `fitWidth` | `actual`;
23
+ export interface ZoomSize {
24
+ width: number;
25
+ height: number;
26
+ }
27
+ export interface ZoomPoint {
28
+ x: number;
29
+ y: number;
30
+ }
31
+ /** scale = displayed px per image px (1 = 100%); x/y = the picture's
32
+ * top-left in the viewport. */
33
+ export interface ZoomView {
34
+ scale: number;
35
+ x: number;
36
+ y: number;
37
+ }
38
+ /** What every function needs to know about the picture and its box. */
39
+ export interface ZoomFrame {
40
+ natural: ZoomSize;
41
+ viewport: ZoomSize;
42
+ initial?: ZoomInitial;
43
+ maxScale?: number;
44
+ }
45
+ /** A picture taller than 1 / tallAspect times its width. */
46
+ export declare function zoomIsTall(natural: ZoomSize): boolean;
47
+ /** The whole picture inside the viewport, never upscaled: the minimum. */
48
+ export declare function zoomFitScale(frame: ZoomFrame): number;
49
+ /** The scale range: [fit, max(fit, maxScale)]. */
50
+ export declare function zoomLimits(frame: ZoomFrame): {
51
+ min: number;
52
+ max: number;
53
+ };
54
+ /** The scale the picture opens at (and a double tap / `0` / the fit button
55
+ * returns to), inside the limits. */
56
+ export declare function zoomRestScale(frame: ZoomFrame): number;
57
+ /** The view inside its bounds (scale within the limits, no letterbox). */
58
+ export declare function zoomClamp(view: ZoomView, frame: ZoomFrame): ZoomView;
59
+ /** The opening view: the rest scale, centred; a taller-than-the-viewport
60
+ * picture starts at its top. */
61
+ export declare function zoomRestView(frame: ZoomFrame): ZoomView;
62
+ /** Whether the view sits at its rest scale. */
63
+ export declare function zoomAtRest(view: ZoomView, frame: ZoomFrame): boolean;
64
+ /** Zoom to `scale` (clamped) keeping the image point under `anchor` fixed. */
65
+ export declare function zoomTo(view: ZoomView, scale: number, anchor: ZoomPoint, frame: ZoomFrame): ZoomView;
66
+ /** The viewport's centre, the anchor of keys and the pill. */
67
+ export declare function zoomCentre(frame: ZoomFrame): ZoomPoint;
68
+ export type WheelDeltaMode = `pixel` | `line`;
69
+ /** ⌘/ctrl + wheel (or a trackpad pinch delivered as a wheel): the scale
70
+ * factor of one wheel event. */
71
+ export declare function zoomWheelFactor(deltaY: number, mode?: WheelDeltaMode): number;
72
+ /** One ⌘/ctrl-wheel event about the cursor. */
73
+ export declare function zoomWheel(view: ZoomView, deltaY: number, mode: WheelDeltaMode, anchor: ZoomPoint, frame: ZoomFrame): ZoomView;
74
+ /** A plain wheel / two-finger scroll: pans by the deltas, clamped. */
75
+ export declare function zoomScroll(view: ZoomView, deltaX: number, deltaY: number, frame: ZoomFrame): ZoomView;
76
+ /** The ladder steps walk: the presets plus the rest scale, inside the
77
+ * limits, ascending. */
78
+ export declare function zoomLadder(frame: ZoomFrame): number[];
79
+ /** The next ladder scale strictly above (`1`) or below (`-1`) the current
80
+ * one, or the current one at the end. */
81
+ export declare function zoomStepScale(scale: number, direction: 1 | -1, frame: ZoomFrame): number;
82
+ /** + / − (keys and the pill) about the viewport centre. */
83
+ export declare function zoomStep(view: ZoomView, direction: 1 | -1, frame: ZoomFrame): ZoomView;
84
+ /** The scale a double tap at rest jumps to. */
85
+ export declare function zoomDoubleTapScale(frame: ZoomFrame): number;
86
+ /** Double click / tap: at rest → zoom in about the point; else → rest. */
87
+ export declare function zoomDoubleTap(view: ZoomView, point: ZoomPoint, frame: ZoomFrame): ZoomView;
88
+ export type ZoomKey = `+` | `=` | `-` | `−` | `0` | `1`;
89
+ /** A key while the picture has focus; null = not a zoom key. */
90
+ export declare function zoomKey(view: ZoomView, key: string, frame: ZoomFrame): ZoomView | null;
91
+ /** The overshoot past an edge, damped: (1 − 1 / (o·c/d + 1))·d. */
92
+ export declare function zoomRubberBand(overshoot: number, extent: number): number;
93
+ /** A drag from `start` by (dx, dy) while held: past an edge the overshoot
94
+ * rubber-bands. The release is `zoomClamp` of the last view. */
95
+ export declare function zoomDrag(start: ZoomView, dx: number, dy: number, frame: ZoomFrame): ZoomView;
96
+ /** A pinch from `start` by the raw factor about `anchor` while held: past
97
+ * the min/max the scale rubber-bands (d = the limit). The release is
98
+ * `zoomClamp` of the last view. */
99
+ export declare function zoomPinch(start: ZoomView, factor: number, anchor: ZoomPoint, frame: ZoomFrame): ZoomView;
100
+ /** Mouse-drag momentum `t` ms after a release at velocity (px/ms),
101
+ * exponential decay, stopping at the edges. */
102
+ export declare function zoomMomentum(view: ZoomView, vx: number, vy: number, t: number, frame: ZoomFrame): ZoomView;
103
+ /** Whether momentum `t` ms after a release is still moving (above 0.01 px/ms). */
104
+ export declare function zoomMomentumActive(vx: number, vy: number, t: number): boolean;
105
+ /** The axes the picture can pan on: an axis without room hands a swipe to
106
+ * the host (paging). */
107
+ export declare function zoomPanRoom(view: ZoomView, frame: ZoomFrame): {
108
+ x: boolean;
109
+ y: boolean;
110
+ };
111
+ /** A new viewport: at rest = the new rest view; zoomed = the same scale
112
+ * about the viewport centre, clamped. */
113
+ export declare function zoomResize(view: ZoomView, from: ZoomSize, frame: ZoomFrame): ZoomView;
114
+ /** The pill's label: round(scale × 100) + `%`. */
115
+ export declare function zoomPercent(scale: number): string;
116
+ export interface ZoomMenuItem {
117
+ /** null = Fit (the rest view). */
118
+ scale: number | null;
119
+ label: string;
120
+ checked: boolean;
121
+ }
122
+ /** The % button's Menu: Fit, then the menu presets inside the limits. */
123
+ export declare function zoomMenu(view: ZoomView, frame: ZoomFrame, fitLabel: string): ZoomMenuItem[];
124
+ /** The pill's disabled ends. */
125
+ export declare function zoomBounds(view: ZoomView, frame: ZoomFrame): {
126
+ atMin: boolean;
127
+ atMax: boolean;
128
+ };