@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
@@ -1457,6 +1457,117 @@
1457
1457
  },
1458
1458
  "macro": null
1459
1459
  },
1460
+ {
1461
+ "name": "ZoomableImage",
1462
+ "kind": "native",
1463
+ "group": "media",
1464
+ "lite": false,
1465
+ "specimenId": "exponential-ui-zoomable-image",
1466
+ "description": "A picture that zooms (pinch, ⌘-wheel, double-tap) and pans.",
1467
+ "children": "none",
1468
+ "slots": [],
1469
+ "events": [
1470
+ "zoom",
1471
+ "tap"
1472
+ ],
1473
+ "basic": [],
1474
+ "props": [
1475
+ {
1476
+ "name": "src",
1477
+ "type": "url",
1478
+ "required": true,
1479
+ "bindable": true,
1480
+ "responsive": false,
1481
+ "description": "The image URL."
1482
+ },
1483
+ {
1484
+ "name": "alt",
1485
+ "type": "string",
1486
+ "required": true,
1487
+ "bindable": true,
1488
+ "responsive": false,
1489
+ "description": "The accessibility description."
1490
+ },
1491
+ {
1492
+ "name": "naturalWidth",
1493
+ "type": "number",
1494
+ "required": false,
1495
+ "bindable": false,
1496
+ "responsive": false,
1497
+ "description": "Pixel width."
1498
+ },
1499
+ {
1500
+ "name": "naturalHeight",
1501
+ "type": "number",
1502
+ "required": false,
1503
+ "bindable": false,
1504
+ "responsive": false,
1505
+ "description": "Pixel height."
1506
+ },
1507
+ {
1508
+ "name": "initial",
1509
+ "type": "auto | fit | fitWidth | actual",
1510
+ "required": false,
1511
+ "bindable": false,
1512
+ "responsive": false,
1513
+ "default": "auto",
1514
+ "description": "auto = fitWidth when tall."
1515
+ },
1516
+ {
1517
+ "name": "maxScale",
1518
+ "type": "number",
1519
+ "required": false,
1520
+ "bindable": false,
1521
+ "responsive": false,
1522
+ "default": 8,
1523
+ "description": "Largest zoom."
1524
+ },
1525
+ {
1526
+ "name": "controls",
1527
+ "type": "auto | always | none",
1528
+ "required": false,
1529
+ "bindable": false,
1530
+ "responsive": false,
1531
+ "default": "auto",
1532
+ "description": "The zoom pill."
1533
+ },
1534
+ {
1535
+ "name": "scale",
1536
+ "type": "number",
1537
+ "required": false,
1538
+ "bindable": true,
1539
+ "responsive": false,
1540
+ "description": "1 = 100%."
1541
+ },
1542
+ {
1543
+ "name": "style",
1544
+ "type": "style",
1545
+ "required": false,
1546
+ "bindable": false,
1547
+ "responsive": false,
1548
+ "description": "Extra Box styles for the viewport."
1549
+ }
1550
+ ],
1551
+ "accessibility": {
1552
+ "role": "img",
1553
+ "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`)",
1554
+ "keys": [
1555
+ "+ / =: zoom in a step",
1556
+ "-: zoom out a step",
1557
+ "0: back to the opening zoom",
1558
+ "1: 100%"
1559
+ ]
1560
+ },
1561
+ "example": {
1562
+ "id": "example",
1563
+ "component": "ZoomableImage",
1564
+ "src": "https://example.com/screenshot.png",
1565
+ "alt": "Screenshot",
1566
+ "naturalWidth": 1440,
1567
+ "naturalHeight": 900
1568
+ },
1569
+ "macro": null
1570
+ },
1460
1571
  {
1461
1572
  "name": "Icon",
1462
1573
  "kind": "native",
@@ -1813,11 +1924,28 @@
1813
1924
  "responsive": false,
1814
1925
  "default": true,
1815
1926
  "description": "Shows the page dots."
1927
+ },
1928
+ {
1929
+ "name": "counter",
1930
+ "type": "boolean",
1931
+ "required": false,
1932
+ "bindable": false,
1933
+ "responsive": false,
1934
+ "default": false,
1935
+ "description": "Shows `i / n`."
1936
+ },
1937
+ {
1938
+ "name": "thumbnails",
1939
+ "type": "[url]",
1940
+ "required": false,
1941
+ "bindable": false,
1942
+ "responsive": false,
1943
+ "description": "A thumbnail URL per page."
1816
1944
  }
1817
1945
  ],
1818
1946
  "accessibility": {
1819
1947
  "role": "region",
1820
- "notes": "region, roledescription carousel; each page a group `page i of n`",
1948
+ "notes": "region, roledescription carousel; each page a group `page i of n`; the counter `$string.pageCounter` is hidden (each page already says page i of n); each thumbnail a button `page i of n`, aria-current on the current one",
1821
1949
  "keys": [
1822
1950
  "ArrowLeft/ArrowRight: previous/next page while focus is inside",
1823
1951
  "Home/End: first/last page"
@@ -1831,6 +1959,68 @@
1831
1959
  },
1832
1960
  "macro": null
1833
1961
  },
1962
+ {
1963
+ "name": "Mosaic",
1964
+ "kind": "macro",
1965
+ "group": "media",
1966
+ "lite": false,
1967
+ "specimenId": "exponential-ui-mosaic",
1968
+ "description": "Pictures: halves, or one large + two small with `+N`; press fires `select {index}`.",
1969
+ "children": "none",
1970
+ "slots": [],
1971
+ "events": [
1972
+ "select"
1973
+ ],
1974
+ "basic": [],
1975
+ "props": [
1976
+ {
1977
+ "name": "pictures",
1978
+ "type": "[picture]",
1979
+ "required": true,
1980
+ "bindable": false,
1981
+ "responsive": false,
1982
+ "description": "The pictures in order."
1983
+ },
1984
+ {
1985
+ "name": "label",
1986
+ "type": "string",
1987
+ "required": false,
1988
+ "bindable": false,
1989
+ "responsive": false,
1990
+ "description": "The a11y label."
1991
+ }
1992
+ ],
1993
+ "accessibility": {
1994
+ "role": "group",
1995
+ "notes": "group labelled `label`; each tile a button named its picture's `alt`; the `+N` tile reads `alt` then `+N` ($string.morePictures).",
1996
+ "keys": [
1997
+ "Tab through the tiles; Enter, Space: select"
1998
+ ]
1999
+ },
2000
+ "example": {
2001
+ "id": "example",
2002
+ "component": "Mosaic",
2003
+ "pictures": [
2004
+ {
2005
+ "src": "https://example.com/editor.png",
2006
+ "alt": "Editor"
2007
+ },
2008
+ {
2009
+ "src": "https://example.com/preview.png",
2010
+ "alt": "Preview"
2011
+ },
2012
+ {
2013
+ "src": "https://example.com/data.png",
2014
+ "alt": "Data"
2015
+ },
2016
+ {
2017
+ "src": "https://example.com/versions.png",
2018
+ "alt": "Versions"
2019
+ }
2020
+ ]
2021
+ },
2022
+ "macro": "Expands to natives (see catalog/macros.json); the theme styles its parts by recipe Mosaic/<part>."
2023
+ },
1834
2024
  {
1835
2025
  "name": "Tabs",
1836
2026
  "kind": "native",
@@ -1913,8 +2103,8 @@
1913
2103
  "value": "issue"
1914
2104
  },
1915
2105
  {
1916
- "label": "Run",
1917
- "value": "run"
2106
+ "label": "Session",
2107
+ "value": "session"
1918
2108
  }
1919
2109
  ],
1920
2110
  "value": "issue"
@@ -2481,6 +2671,76 @@
2481
2671
  },
2482
2672
  "macro": "Expands to natives (see catalog/macros.json); the theme styles its parts by recipe Breadcrumb/<part>."
2483
2673
  },
2674
+ {
2675
+ "name": "Outline",
2676
+ "kind": "macro",
2677
+ "group": "navigation",
2678
+ "lite": true,
2679
+ "specimenId": "exponential-ui-outline",
2680
+ "description": "Anchor rows under a caption, one active; press fires `select {id}`.",
2681
+ "children": "none",
2682
+ "slots": [],
2683
+ "events": [
2684
+ "select"
2685
+ ],
2686
+ "basic": [],
2687
+ "props": [
2688
+ {
2689
+ "name": "items",
2690
+ "type": "[outlineItem]",
2691
+ "required": true,
2692
+ "bindable": false,
2693
+ "responsive": false,
2694
+ "description": "The rows in order."
2695
+ },
2696
+ {
2697
+ "name": "value",
2698
+ "type": "string",
2699
+ "required": false,
2700
+ "bindable": true,
2701
+ "responsive": false,
2702
+ "description": "The active row id."
2703
+ },
2704
+ {
2705
+ "name": "caption",
2706
+ "type": "string",
2707
+ "required": false,
2708
+ "bindable": false,
2709
+ "responsive": false,
2710
+ "description": "The heading."
2711
+ }
2712
+ ],
2713
+ "accessibility": {
2714
+ "role": "navigation",
2715
+ "notes": "navigation labelled by `caption`; each row a link (aria-current=location on the active row) named `title` then the count; press fires `select {id}`.",
2716
+ "keys": [
2717
+ "Tab through the rows; Enter, Space: select"
2718
+ ]
2719
+ },
2720
+ "example": {
2721
+ "id": "example",
2722
+ "component": "Outline",
2723
+ "caption": "Outline",
2724
+ "value": "part-a",
2725
+ "items": [
2726
+ {
2727
+ "id": "current",
2728
+ "title": "Current state"
2729
+ },
2730
+ {
2731
+ "id": "part-a",
2732
+ "title": "Part A: editor-first creation",
2733
+ "count": 5
2734
+ },
2735
+ {
2736
+ "id": "part-b",
2737
+ "title": "Part B: MCP for eApps",
2738
+ "count": 2
2739
+ }
2740
+ ]
2741
+ },
2742
+ "macro": "Expands to natives (see catalog/macros.json); the theme styles its parts by recipe Outline/<part>."
2743
+ },
2484
2744
  {
2485
2745
  "name": "Stepper",
2486
2746
  "kind": "macro",
@@ -3980,7 +4240,7 @@
3980
4240
  "group": "data",
3981
4241
  "lite": false,
3982
4242
  "specimenId": "exponential-ui-table",
3983
- "description": "A data table of typed columns: sorting, selection, widths, alignment, windowed; `slot` columns render components.",
4243
+ "description": "A table of typed columns: sorting, selection, widths, alignment, windowed; `slot` columns render components.",
3984
4244
  "children": "none",
3985
4245
  "slots": [
3986
4246
  "*"
@@ -4084,7 +4344,7 @@
4084
4344
  "bindable": false,
4085
4345
  "responsive": false,
4086
4346
  "default": false,
4087
- "description": "Keeps the header visible while the rows scroll."
4347
+ "description": "Pins the header while rows scroll."
4088
4348
  }
4089
4349
  ],
4090
4350
  "accessibility": {
@@ -6778,6 +7038,283 @@
6778
7038
  "status": "read"
6779
7039
  },
6780
7040
  "macro": "Expands to natives (see catalog/macros.json); the theme styles its parts by recipe MessageBubble/<part>."
7041
+ },
7042
+ {
7043
+ "name": "Motion",
7044
+ "kind": "native",
7045
+ "group": "media",
7046
+ "lite": true,
7047
+ "specimenId": "exponential-ui-motion",
7048
+ "description": "A vector animation (Lottie-compatible) drawn identically everywhere: loaders, success states, illustrated empty states, small explainers.",
7049
+ "children": "none",
7050
+ "slots": [],
7051
+ "events": [
7052
+ "press",
7053
+ "hover",
7054
+ "visible",
7055
+ "complete",
7056
+ "state"
7057
+ ],
7058
+ "basic": [],
7059
+ "props": [
7060
+ {
7061
+ "name": "layers",
7062
+ "type": "[object]",
7063
+ "required": false,
7064
+ "bindable": false,
7065
+ "responsive": false,
7066
+ "description": "The animation, top layer first, in the composition's px (origin top-left). Layer: {type: shape|solid|null|precomp|text, id?, parent?: id, in?/out? ms, transform?: {anchor, position [x,y], scale [100,100] %, rotation deg clockwise, opacity 0–100}, shapes: […], matte?: {source: id, mode: alpha|luma}, masks?: [{path, mode: add|subtract|intersect}]}. Shapes draw top first; a style paints every shape before it in its group: rect {position (centre), size, radius}, ellipse {position, size}, star|polygon {points, outerRadius, innerRadius}, path {d: SVG path data}; fill {color}, stroke {color, width, cap, join, dash: [len, gap]}, gradient-fill {kind: linear|radial, start, end, stops: [[0, colour], [1, colour]]}; trim {start, end, offset} (percent, draw-on lines), repeater {copies, transform}, round-corners {radius}; group {shapes, transform}. Colours: $color.* tokens (follow light/dark), #hex, or {light, dark}. Animate any value: {keys: [{t: ms, v: value, ease: linear|ease-in|ease-out|ease-in-out|hold|[x1,y1,x2,y2]}, …]}; tokens cannot animate. Keep it small; loops end on their first pose. No expressions."
7067
+ },
7068
+ {
7069
+ "name": "size",
7070
+ "type": "[number]",
7071
+ "required": false,
7072
+ "bindable": false,
7073
+ "responsive": false,
7074
+ "description": "The composition [width, height] px (with layers)."
7075
+ },
7076
+ {
7077
+ "name": "duration",
7078
+ "type": "number",
7079
+ "required": false,
7080
+ "bindable": false,
7081
+ "responsive": false,
7082
+ "description": "Length in ms (with layers)."
7083
+ },
7084
+ {
7085
+ "name": "fps",
7086
+ "type": "number",
7087
+ "required": false,
7088
+ "bindable": false,
7089
+ "responsive": false,
7090
+ "default": 60,
7091
+ "description": "Frames per second."
7092
+ },
7093
+ {
7094
+ "name": "assets",
7095
+ "type": "object",
7096
+ "required": false,
7097
+ "bindable": false,
7098
+ "responsive": false,
7099
+ "description": "Precomps {id: {layers}}."
7100
+ },
7101
+ {
7102
+ "name": "markers",
7103
+ "type": "[object]",
7104
+ "required": false,
7105
+ "bindable": false,
7106
+ "responsive": false,
7107
+ "description": "Named segments [{name, time, duration}] ms."
7108
+ },
7109
+ {
7110
+ "name": "lottie",
7111
+ "type": "object",
7112
+ "required": false,
7113
+ "bindable": false,
7114
+ "responsive": false,
7115
+ "description": "Lottie JSON instead of layers (no expressions)."
7116
+ },
7117
+ {
7118
+ "name": "src",
7119
+ "type": "url",
7120
+ "required": false,
7121
+ "bindable": false,
7122
+ "responsive": false,
7123
+ "description": "An attached .json or .lottie instead of layers."
7124
+ },
7125
+ {
7126
+ "name": "autoplay",
7127
+ "type": "boolean",
7128
+ "required": false,
7129
+ "bindable": false,
7130
+ "responsive": false,
7131
+ "default": true,
7132
+ "description": "Plays when visible; false shows the poster."
7133
+ },
7134
+ {
7135
+ "name": "loop",
7136
+ "type": "boolean",
7137
+ "required": false,
7138
+ "bindable": false,
7139
+ "responsive": false,
7140
+ "default": true,
7141
+ "description": "Repeats; false plays once and holds."
7142
+ },
7143
+ {
7144
+ "name": "plays",
7145
+ "type": "number",
7146
+ "required": false,
7147
+ "bindable": false,
7148
+ "responsive": false,
7149
+ "description": "Plays this many times (overrides loop)."
7150
+ },
7151
+ {
7152
+ "name": "direction",
7153
+ "type": "forward | reverse | alternate",
7154
+ "required": false,
7155
+ "bindable": false,
7156
+ "responsive": false,
7157
+ "default": "forward",
7158
+ "description": "Forward, reverse, or back and forth."
7159
+ },
7160
+ {
7161
+ "name": "speed",
7162
+ "type": "number",
7163
+ "required": false,
7164
+ "bindable": false,
7165
+ "responsive": false,
7166
+ "default": 1,
7167
+ "description": "Speed multiplier."
7168
+ },
7169
+ {
7170
+ "name": "segment",
7171
+ "type": "[number]",
7172
+ "required": false,
7173
+ "bindable": false,
7174
+ "responsive": false,
7175
+ "description": "Plays only [from, to] ms."
7176
+ },
7177
+ {
7178
+ "name": "marker",
7179
+ "type": "string",
7180
+ "required": false,
7181
+ "bindable": false,
7182
+ "responsive": false,
7183
+ "description": "Plays only this marker."
7184
+ },
7185
+ {
7186
+ "name": "progress",
7187
+ "type": "number",
7188
+ "required": false,
7189
+ "bindable": true,
7190
+ "responsive": false,
7191
+ "description": "Scrubs (0–1) instead of playing."
7192
+ },
7193
+ {
7194
+ "name": "play",
7195
+ "type": "boolean",
7196
+ "required": false,
7197
+ "bindable": true,
7198
+ "responsive": false,
7199
+ "default": true,
7200
+ "description": "Pauses while false."
7201
+ },
7202
+ {
7203
+ "name": "poster",
7204
+ "type": "number",
7205
+ "required": false,
7206
+ "bindable": false,
7207
+ "responsive": false,
7208
+ "description": "The still frame (ms) for reduced motion and before play."
7209
+ },
7210
+ {
7211
+ "name": "fit",
7212
+ "type": "contain | cover | fill",
7213
+ "required": false,
7214
+ "bindable": false,
7215
+ "responsive": false,
7216
+ "default": "contain",
7217
+ "description": "How it fills the box."
7218
+ },
7219
+ {
7220
+ "name": "slots",
7221
+ "type": "object",
7222
+ "required": false,
7223
+ "bindable": false,
7224
+ "responsive": false,
7225
+ "description": "Lottie slot overrides {slotId: value}."
7226
+ },
7227
+ {
7228
+ "name": "stateMachine",
7229
+ "type": "object",
7230
+ "required": false,
7231
+ "bindable": false,
7232
+ "responsive": false,
7233
+ "description": "A dotLottie state machine driving playback (a .lottie src brings its own)."
7234
+ },
7235
+ {
7236
+ "name": "inputs",
7237
+ "type": "object",
7238
+ "required": false,
7239
+ "bindable": true,
7240
+ "responsive": false,
7241
+ "description": "State-machine inputs {name: value}; bind to drive states from data."
7242
+ },
7243
+ {
7244
+ "name": "label",
7245
+ "type": "string",
7246
+ "required": false,
7247
+ "bindable": false,
7248
+ "responsive": false,
7249
+ "description": "What it shows, for screen readers."
7250
+ },
7251
+ {
7252
+ "name": "style",
7253
+ "type": "style",
7254
+ "required": false,
7255
+ "bindable": false,
7256
+ "responsive": false,
7257
+ "description": "Extra Box styles for the box."
7258
+ }
7259
+ ],
7260
+ "accessibility": {
7261
+ "role": "img",
7262
+ "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",
7263
+ "keys": [
7264
+ "Enter/Space: press (with on.press)"
7265
+ ]
7266
+ },
7267
+ "example": {
7268
+ "id": "example",
7269
+ "component": "Motion",
7270
+ "size": [
7271
+ 48,
7272
+ 48
7273
+ ],
7274
+ "duration": 1000,
7275
+ "layers": [
7276
+ {
7277
+ "type": "shape",
7278
+ "transform": {
7279
+ "position": [
7280
+ 24,
7281
+ 24
7282
+ ],
7283
+ "rotation": {
7284
+ "keys": [
7285
+ {
7286
+ "t": 0,
7287
+ "v": 0
7288
+ },
7289
+ {
7290
+ "t": 1000,
7291
+ "v": 360
7292
+ }
7293
+ ]
7294
+ }
7295
+ },
7296
+ "shapes": [
7297
+ {
7298
+ "type": "ellipse",
7299
+ "size": [
7300
+ 36,
7301
+ 36
7302
+ ]
7303
+ },
7304
+ {
7305
+ "type": "trim",
7306
+ "end": 70
7307
+ },
7308
+ {
7309
+ "type": "stroke",
7310
+ "color": "$color.primary",
7311
+ "width": 4
7312
+ }
7313
+ ]
7314
+ }
7315
+ ]
7316
+ },
7317
+ "macro": null
6781
7318
  }
6782
7319
  ]
6783
7320
  }
@@ -7,7 +7,7 @@ store, tool runners, extensions), never how (Exponential serves records from
7
7
  its synced store, spezl from a p2p store over eNet). `catalog/host.json`
8
8
  `package` is the machine-readable contract; this page is the prose spec other
9
9
  docs link to (spezl `docs/spec/blocks.md`). The TS reference is `src/host/`
10
- (`package.ts`, `records.ts`, `record-store.ts`, `tools.ts`, `signature.ts`);
10
+ (`package.ts`, `records.ts`, `record-store.ts`, `tools.ts`, `exposes.ts`, `signature.ts`);
11
11
  the Rust core (`apps/desktop/crates/eui-core/src/host/`) mirrors every
12
12
  pure rule. Fixtures: `fixtures/host-router.json` (package validation, replayed
13
13
  by every renderer through the core) and `fixtures/host-package.json` (records
@@ -37,6 +37,7 @@ renders against keeps its own version in its id (`catalogId`,
37
37
  "sources": ["records:*"], // allowlist for bindings, unset = any
38
38
  "records": { "entry": { "title": "Entry", "schema": { "type": "object", "properties": { "date": { "type": "string", "format": "date" } } } } },
39
39
  "tools": { "weather": { "kind": "mcp", "title": "Weather", "url": "https://mcp.example.com/weather" } },
40
+ "upstreams": ["m5"], "exposes": [/* MCP tools a host's broker runs: "Exposes" below */],
40
41
  "extensions": [{ "id": "https://acme.example/catalogs/charts/v1", "version": "1.4.0", "components": ["Gantt"] }],
41
42
  "theme": "exponential", "icon": { "glyph": "clock" }, "description": "…"
42
43
  }
@@ -126,6 +127,60 @@ Exponential's app hosts run no package tools: its server refuses a package
126
127
  with `tools` (an app reaches tools through `exponential.<noun>.<op>` and
127
128
  `harness.mcp`).
128
129
 
130
+ ## Exposes
131
+
132
+ `exposes: [Expose]` lists MCP TOOLS the package offers to a host's MCP broker
133
+ (Exponential: `/api/mcp/apps`). They are declarative bindings, never code:
134
+ the broker lists them as `<app>__<name>` and runs them as the CALLING person,
135
+ so no device has to be online and nothing is hosted. `upstreams: [name]`
136
+ names the MCP servers the package's upstream bindings call; the host provides
137
+ them (Exponential: the team's MCP servers, Settings › MCP).
138
+
139
+ ```jsonc
140
+ "upstreams": ["m5"],
141
+ "exposes": [
142
+ { "name": "list_entries", "title": "List entries", "description": "The time entries of a day.",
143
+ "input": { "type": "object", "properties": { "day": { "type": "string" } } },
144
+ "access": "read",
145
+ "run": { "records": { "op": "list", "kind": "entry", "where": { "date": "${input.day}" } } } },
146
+ { "name": "log_comment", "title": "Log a comment", "description": "Comment the logged hours on an issue.",
147
+ "input": { "type": "object", "properties": { "issue": { "type": "string" }, "hours": { "type": "number" } }, "required": ["issue", "hours"] },
148
+ "access": "write",
149
+ "run": { "action": "exponential.comments.create", "args": { "issueId": "${input.issue}", "body": "Logged ${input.hours} h" } } },
150
+ { "name": "find_customer", "title": "Find a customer", "description": "Search m5 customers.",
151
+ "input": { "type": "object", "properties": { "q": { "type": "string" } } },
152
+ "access": "read",
153
+ "run": { "upstream": "m5", "tool": "search_customers", "args": { "query": "${input.q}" } } }
154
+ ]
155
+ ```
156
+
157
+ | key | rule |
158
+ | --- | --- |
159
+ | `name` | `^[a-z][a-z0-9_]*$`, at most 40, never `__`, unique |
160
+ | `title` / `description` | non-blank, at most 80 / 1024 characters |
161
+ | `input` | a JSON Schema `{type: "object", properties?}`: the tool's `inputSchema` |
162
+ | `access` | `read` or `write`: who may see it (a read-only connection never lists a write tool) |
163
+ | `run` | EXACTLY ONE of `records` / `action` / `upstream` |
164
+
165
+ - `records: {op: list | get | upsert, kind, id?, where?, data?, limit?}` reads
166
+ or writes the package's OWN records of a declared kind. A delete is
167
+ destructive and never exposed.
168
+ - `action` (+ `args`) calls a host function (`exponential.<noun>.<op>`). It
169
+ reads when the last word of its name is list, get, show, catalog,
170
+ activity or files; anything else writes.
171
+ - `upstream` (+ `tool`, `args`) calls a tool of one of the package's
172
+ `upstreams` with the person's own credential. Its level is the tool's live
173
+ annotations: it reads only with `readOnlyHint: true`.
174
+
175
+ Every string in `run` may hold `${input.<path>}` (dotted keys into the
176
+ call's input; the first key must be a declared input property). A string
177
+ that is exactly one template keeps the value's type; inside text the value
178
+ is printed. Destructive is never exposed: a name holding delete, merge, close,
179
+ end, remove or trash is refused, and a `read` binding whose run writes is
180
+ refused. At most 32 tools. `exposeIssues` returns every issue with its eMCP
181
+ error code; the host adds its own rules on top (Exponential: only grantable,
182
+ non-destructive actions; upstreams the team has).
183
+
129
184
  ## Extensions
130
185
 
131
186
  `extensions: [{id, version, components?}]` declares the custom component