@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.
- package/catalog/a11y.json +25 -1
- package/catalog/core.catalog.json +426 -6
- package/catalog/core.schema.json +634 -4
- package/catalog/host.json +10 -0
- package/catalog/layout.json +3 -2
- package/catalog/limits.json +10 -1
- package/catalog/macros.json +542 -1
- package/catalog/recipes.json +4 -2
- package/catalog/strings.json +14 -2
- package/catalog/style.json +21 -0
- package/catalog/theme.schema.json +3950 -1337
- package/conformance/manifest.json +5 -5
- package/conformance/motion/build-corpus.ts +232 -0
- package/conformance/motion/corpus/SOURCES.md +117 -0
- package/conformance/motion/corpus/images/footage_0.json +1 -0
- package/conformance/motion/corpus/images/img_0.jpg +0 -0
- package/conformance/motion/corpus/images/img_1.jpg +0 -0
- package/conformance/motion/corpus/images/triangle.png +0 -0
- package/conformance/motion/corpus/skottie-3d-parenting-nocamera.json +367 -0
- package/conformance/motion/corpus/skottie-auto-orient-2.json +292 -0
- package/conformance/motion/corpus/skottie-auto-orient.json +717 -0
- package/conformance/motion/corpus/skottie-bezier-extranormal.json +199 -0
- package/conformance/motion/corpus/skottie-blendmode-hardmix.json +558 -0
- package/conformance/motion/corpus/skottie-chained-mattes.json +259 -0
- package/conformance/motion/corpus/skottie-dropshadow-ramp.json +852 -0
- package/conformance/motion/corpus/skottie-dropshadow-style.json +278 -0
- package/conformance/motion/corpus/skottie-effects-transform.json +385 -0
- package/conformance/motion/corpus/skottie-fill-effect.json +358 -0
- package/conformance/motion/corpus/skottie-fill-rule.json +457 -0
- package/conformance/motion/corpus/skottie-gaussian-blur.json +670 -0
- package/conformance/motion/corpus/skottie-gradient-opacity.json +451 -0
- package/conformance/motion/corpus/skottie-gradient-radial-highlight.json +581 -0
- package/conformance/motion/corpus/skottie-hidden-shapes-layers.json +381 -0
- package/conformance/motion/corpus/skottie-huesaturation-effect.json +1117 -0
- package/conformance/motion/corpus/skottie-invert-effect.json +665 -0
- package/conformance/motion/corpus/skottie-luma-matte.json +239 -0
- package/conformance/motion/corpus/skottie-mask-feather.json +892 -0
- package/conformance/motion/corpus/skottie-masking-opaque.json +2376 -0
- package/conformance/motion/corpus/skottie-masking-translucent.json +2376 -0
- package/conformance/motion/corpus/skottie-matte-blendmode.json +196 -0
- package/conformance/motion/corpus/skottie-matte-nonsequential.json +722 -0
- package/conformance/motion/corpus/skottie-matte-visible.json +666 -0
- package/conformance/motion/corpus/skottie-mergepaths-effect.json +722 -0
- package/conformance/motion/corpus/skottie-motion-blur-mask.json +120 -0
- package/conformance/motion/corpus/skottie-nested-animation.json +253 -0
- package/conformance/motion/corpus/skottie-offsetpaths-effect.json +525 -0
- package/conformance/motion/corpus/skottie-phonehub-connecting.json +947 -0
- package/conformance/motion/corpus/skottie-puckerbloat-effect.json +339 -0
- package/conformance/motion/corpus/skottie-repeater.json +234 -0
- package/conformance/motion/corpus/skottie-sample-1.json +168 -0
- package/conformance/motion/corpus/skottie-sample-search.json +329 -0
- package/conformance/motion/corpus/skottie-spatial-supernormal.json +898 -0
- package/conformance/motion/corpus/skottie-text-animator-1.json +1286 -0
- package/conformance/motion/corpus/skottie-text-fill-over-stroke.json +1014 -0
- package/conformance/motion/corpus/skottie-text-tracking.json +950 -0
- package/conformance/motion/corpus/skottie-text-valign.json +484 -0
- package/conformance/motion/corpus/skottie-time-reverse.json +297 -0
- package/conformance/motion/corpus/skottie-transform-skew.json +290 -0
- package/conformance/motion/corpus/skottie-trimpath-fill.json +933 -0
- package/conformance/motion/corpus/skottie-trimpath-modes.json +266 -0
- package/conformance/motion/corpus/skottie-tritone-effect.json +379 -0
- package/conformance/motion/corpus/spec-blend-mode.json +531 -0
- package/conformance/motion/corpus/spec-ellipse.json +142 -0
- package/conformance/motion/corpus/spec-fill.json +193 -0
- package/conformance/motion/corpus/spec-gradient-stroke.json +1263 -0
- package/conformance/motion/corpus/spec-gradient.json +1255 -0
- package/conformance/motion/corpus/spec-mask.json +773 -0
- package/conformance/motion/corpus/spec-masks.json +676 -0
- package/conformance/motion/corpus/spec-matte.json +390 -0
- package/conformance/motion/corpus/spec-metadata.json +1 -0
- package/conformance/motion/corpus/spec-path.json +177 -0
- package/conformance/motion/corpus/spec-pucker-bloat.json +179 -0
- package/conformance/motion/corpus/spec-rectangle.json +145 -0
- package/conformance/motion/corpus/spec-rounded-corners.json +187 -0
- package/conformance/motion/corpus/spec-slots.json +325 -0
- package/conformance/motion/corpus/spec-star.json +159 -0
- package/conformance/motion/corpus/spec-stroke.json +156 -0
- package/conformance/motion/corpus/spec-test-ellipse-xy-pos.json +141 -0
- package/conformance/motion/corpus/spec-test-gradient-fill.json +1 -0
- package/conformance/motion/corpus/spec-test-gradient-stroke.json +229 -0
- package/conformance/motion/corpus/spec-test-unknown-shape.json +63 -0
- package/conformance/motion/corpus/spec-time-remap.json +1090 -0
- package/conformance/motion/corpus/spec-time-stretch.json +594 -0
- package/conformance/motion/corpus/spec-transform.json +273 -0
- package/conformance/motion/corpus/spec-trim-path.json +209 -0
- package/conformance/motion/corpus/web-adrock.json +1 -0
- package/conformance/motion/corpus/web-bacon.json +1 -0
- package/conformance/motion/corpus/web-banner.json +1 -0
- package/conformance/motion/corpus/web-bodymovin.json +1 -0
- package/conformance/motion/corpus/web-dalek.json +1 -0
- package/conformance/motion/corpus/web-footage-data.json +1 -0
- package/conformance/motion/corpus/web-lights.json +1 -0
- package/conformance/motion/corpus/web-ripple.json +1 -0
- package/conformance/motion/corpus/web-starfish.json +1 -0
- package/conformance/motion/known-gaps.json +35 -0
- package/conformance/motion/parity/group-transforms-parenting@0.png +0 -0
- package/conformance/motion/parity/group-transforms-parenting@10.png +0 -0
- package/conformance/motion/parity/hidden-unknown-inactive@0.png +0 -0
- package/conformance/motion/parity/keyframes-transform@0.png +0 -0
- package/conformance/motion/parity/keyframes-transform@10.png +0 -0
- package/conformance/motion/parity/keyframes-transform@15.png +0 -0
- package/conformance/motion/parity/keyframes-transform@5.png +0 -0
- package/conformance/motion/parity/layer-opacity-blend@0.png +0 -0
- package/conformance/motion/parity/linear-gradient@0.png +0 -0
- package/conformance/motion/parity/masks-modes@0.png +0 -0
- package/conformance/motion/parity/matte-alpha@0.png +0 -0
- package/conformance/motion/parity/matte-luma@0.png +0 -0
- package/conformance/motion/parity/matte-parent-tp@0.png +0 -0
- package/conformance/motion/parity/path-evenodd@0.png +0 -0
- package/conformance/motion/parity/precomp-clip-offset@0.png +0 -0
- package/conformance/motion/parity/precomp-clip-offset@15.png +0 -0
- package/conformance/motion/parity/precomp-clip-offset@5.png +0 -0
- package/conformance/motion/parity/radial-gradient-highlight@0.png +0 -0
- package/conformance/motion/parity/rect-solid-fill@0.png +0 -0
- package/conformance/motion/parity/repeater@0.png +0 -0
- package/conformance/motion/parity/rounded-rect-ellipse@0.png +0 -0
- package/conformance/motion/parity/solid-and-image@0.png +0 -0
- package/conformance/motion/parity/split-position-skew@0.png +0 -0
- package/conformance/motion/parity/split-position-skew@10.png +0 -0
- package/conformance/motion/parity/star-polygon@0.png +0 -0
- package/conformance/motion/parity/stroke-caps-joins@0.png +0 -0
- package/conformance/motion/parity/stroke-dashes@0.png +0 -0
- package/conformance/motion/parity/stroke-dashes@10.png +0 -0
- package/conformance/motion/parity/time-remap@0.png +0 -0
- package/conformance/motion/parity/time-remap@10.png +0 -0
- package/conformance/motion/parity/time-remap@19.png +0 -0
- package/conformance/motion/parity/time-stretch@0.png +0 -0
- package/conformance/motion/parity/time-stretch@10.png +0 -0
- package/conformance/motion/parity/trim-individually@0.png +0 -0
- package/conformance/motion/parity/trim-path@0.png +0 -0
- package/conformance/motion/parity/trim-path@10.png +0 -0
- package/conformance/motion/refs/index.json +688 -0
- package/conformance/motion/refs/skottie-3d-parenting-nocamera@0.png +0 -0
- package/conformance/motion/refs/skottie-3d-parenting-nocamera@150.png +0 -0
- package/conformance/motion/refs/skottie-3d-parenting-nocamera@270.png +0 -0
- package/conformance/motion/refs/skottie-auto-orient-2@0.png +0 -0
- package/conformance/motion/refs/skottie-auto-orient-2@210.png +0 -0
- package/conformance/motion/refs/skottie-auto-orient-2@378.png +0 -0
- package/conformance/motion/refs/skottie-auto-orient@0.png +0 -0
- package/conformance/motion/refs/skottie-auto-orient@300.png +0 -0
- package/conformance/motion/refs/skottie-auto-orient@540.png +0 -0
- package/conformance/motion/refs/skottie-bezier-extranormal@0.png +0 -0
- package/conformance/motion/refs/skottie-bezier-extranormal@150.png +0 -0
- package/conformance/motion/refs/skottie-bezier-extranormal@270.png +0 -0
- package/conformance/motion/refs/skottie-blendmode-hardmix@0.png +0 -0
- package/conformance/motion/refs/skottie-blendmode-hardmix@150.png +0 -0
- package/conformance/motion/refs/skottie-blendmode-hardmix@270.png +0 -0
- package/conformance/motion/refs/skottie-chained-mattes@0.png +0 -0
- package/conformance/motion/refs/skottie-chained-mattes@300.png +0 -0
- package/conformance/motion/refs/skottie-chained-mattes@540.png +0 -0
- package/conformance/motion/refs/skottie-dropshadow-ramp@0.png +0 -0
- package/conformance/motion/refs/skottie-dropshadow-ramp@135.png +0 -0
- package/conformance/motion/refs/skottie-dropshadow-ramp@75.png +0 -0
- package/conformance/motion/refs/skottie-dropshadow-style@0.png +0 -0
- package/conformance/motion/refs/skottie-dropshadow-style@300.png +0 -0
- package/conformance/motion/refs/skottie-dropshadow-style@540.png +0 -0
- package/conformance/motion/refs/skottie-effects-transform@0.png +0 -0
- package/conformance/motion/refs/skottie-effects-transform@450.png +0 -0
- package/conformance/motion/refs/skottie-effects-transform@810.png +0 -0
- package/conformance/motion/refs/skottie-fill-effect@0.png +0 -0
- package/conformance/motion/refs/skottie-fill-effect@300.png +0 -0
- package/conformance/motion/refs/skottie-fill-effect@540.png +0 -0
- package/conformance/motion/refs/skottie-fill-rule@0.png +0 -0
- package/conformance/motion/refs/skottie-fill-rule@150.png +0 -0
- package/conformance/motion/refs/skottie-fill-rule@270.png +0 -0
- package/conformance/motion/refs/skottie-gaussian-blur@0.png +0 -0
- package/conformance/motion/refs/skottie-gaussian-blur@150.png +0 -0
- package/conformance/motion/refs/skottie-gaussian-blur@270.png +0 -0
- package/conformance/motion/refs/skottie-gradient-opacity@0.png +0 -0
- package/conformance/motion/refs/skottie-gradient-opacity@150.png +0 -0
- package/conformance/motion/refs/skottie-gradient-opacity@270.png +0 -0
- package/conformance/motion/refs/skottie-gradient-radial-highlight@0.png +0 -0
- package/conformance/motion/refs/skottie-gradient-radial-highlight@135.png +0 -0
- package/conformance/motion/refs/skottie-gradient-radial-highlight@75.png +0 -0
- package/conformance/motion/refs/skottie-hidden-shapes-layers@0.png +0 -0
- package/conformance/motion/refs/skottie-hidden-shapes-layers@150.png +0 -0
- package/conformance/motion/refs/skottie-hidden-shapes-layers@270.png +0 -0
- package/conformance/motion/refs/skottie-huesaturation-effect@0.png +0 -0
- package/conformance/motion/refs/skottie-huesaturation-effect@30.png +0 -0
- package/conformance/motion/refs/skottie-huesaturation-effect@54.png +0 -0
- package/conformance/motion/refs/skottie-invert-effect@0.png +0 -0
- package/conformance/motion/refs/skottie-invert-effect@300.png +0 -0
- package/conformance/motion/refs/skottie-invert-effect@540.png +0 -0
- package/conformance/motion/refs/skottie-luma-matte@0.png +0 -0
- package/conformance/motion/refs/skottie-luma-matte@150.png +0 -0
- package/conformance/motion/refs/skottie-luma-matte@270.png +0 -0
- package/conformance/motion/refs/skottie-mask-feather@0.png +0 -0
- package/conformance/motion/refs/skottie-mask-feather@150.png +0 -0
- package/conformance/motion/refs/skottie-mask-feather@270.png +0 -0
- package/conformance/motion/refs/skottie-masking-opaque@0.png +0 -0
- package/conformance/motion/refs/skottie-masking-opaque@135.png +0 -0
- package/conformance/motion/refs/skottie-masking-opaque@75.png +0 -0
- package/conformance/motion/refs/skottie-masking-translucent@0.png +0 -0
- package/conformance/motion/refs/skottie-masking-translucent@135.png +0 -0
- package/conformance/motion/refs/skottie-masking-translucent@75.png +0 -0
- package/conformance/motion/refs/skottie-matte-blendmode@0.png +0 -0
- package/conformance/motion/refs/skottie-matte-blendmode@150.png +0 -0
- package/conformance/motion/refs/skottie-matte-blendmode@270.png +0 -0
- package/conformance/motion/refs/skottie-matte-nonsequential@0.png +0 -0
- package/conformance/motion/refs/skottie-matte-nonsequential@150.png +0 -0
- package/conformance/motion/refs/skottie-matte-nonsequential@270.png +0 -0
- package/conformance/motion/refs/skottie-matte-visible@0.png +0 -0
- package/conformance/motion/refs/skottie-matte-visible@150.png +0 -0
- package/conformance/motion/refs/skottie-matte-visible@270.png +0 -0
- package/conformance/motion/refs/skottie-mergepaths-effect@0.png +0 -0
- package/conformance/motion/refs/skottie-mergepaths-effect@210.png +0 -0
- package/conformance/motion/refs/skottie-mergepaths-effect@378.png +0 -0
- package/conformance/motion/refs/skottie-motion-blur-mask@0.png +0 -0
- package/conformance/motion/refs/skottie-motion-blur-mask@150.png +0 -0
- package/conformance/motion/refs/skottie-motion-blur-mask@270.png +0 -0
- package/conformance/motion/refs/skottie-nested-animation@0.png +0 -0
- package/conformance/motion/refs/skottie-nested-animation@300.png +0 -0
- package/conformance/motion/refs/skottie-nested-animation@540.png +0 -0
- package/conformance/motion/refs/skottie-offsetpaths-effect@0.png +0 -0
- package/conformance/motion/refs/skottie-offsetpaths-effect@150.png +0 -0
- package/conformance/motion/refs/skottie-offsetpaths-effect@270.png +0 -0
- package/conformance/motion/refs/skottie-phonehub-connecting@0.png +0 -0
- package/conformance/motion/refs/skottie-puckerbloat-effect@0.png +0 -0
- package/conformance/motion/refs/skottie-puckerbloat-effect@210.png +0 -0
- package/conformance/motion/refs/skottie-puckerbloat-effect@378.png +0 -0
- package/conformance/motion/refs/skottie-repeater@0.png +0 -0
- package/conformance/motion/refs/skottie-repeater@300.png +0 -0
- package/conformance/motion/refs/skottie-repeater@540.png +0 -0
- package/conformance/motion/refs/skottie-sample-1@0.png +0 -0
- package/conformance/motion/refs/skottie-sample-1@100.png +0 -0
- package/conformance/motion/refs/skottie-sample-1@180.png +0 -0
- package/conformance/motion/refs/skottie-sample-search@0.png +0 -0
- package/conformance/motion/refs/skottie-sample-search@27.png +0 -0
- package/conformance/motion/refs/skottie-sample-search@48.png +0 -0
- package/conformance/motion/refs/skottie-spatial-supernormal@0.png +0 -0
- package/conformance/motion/refs/skottie-spatial-supernormal@200.png +0 -0
- package/conformance/motion/refs/skottie-spatial-supernormal@360.png +0 -0
- package/conformance/motion/refs/skottie-text-animator-1@0.png +0 -0
- package/conformance/motion/refs/skottie-text-animator-1@150.png +0 -0
- package/conformance/motion/refs/skottie-text-animator-1@270.png +0 -0
- package/conformance/motion/refs/skottie-text-fill-over-stroke@0.png +0 -0
- package/conformance/motion/refs/skottie-text-fill-over-stroke@210.png +0 -0
- package/conformance/motion/refs/skottie-text-fill-over-stroke@378.png +0 -0
- package/conformance/motion/refs/skottie-text-tracking@0.png +0 -0
- package/conformance/motion/refs/skottie-text-tracking@108.png +0 -0
- package/conformance/motion/refs/skottie-text-tracking@60.png +0 -0
- package/conformance/motion/refs/skottie-text-valign@0.png +0 -0
- package/conformance/motion/refs/skottie-text-valign@150.png +0 -0
- package/conformance/motion/refs/skottie-text-valign@270.png +0 -0
- package/conformance/motion/refs/skottie-time-reverse@0.png +0 -0
- package/conformance/motion/refs/skottie-time-reverse@300.png +0 -0
- package/conformance/motion/refs/skottie-time-reverse@540.png +0 -0
- package/conformance/motion/refs/skottie-transform-skew@0.png +0 -0
- package/conformance/motion/refs/skottie-transform-skew@300.png +0 -0
- package/conformance/motion/refs/skottie-transform-skew@540.png +0 -0
- package/conformance/motion/refs/skottie-trimpath-fill@0.png +0 -0
- package/conformance/motion/refs/skottie-trimpath-fill@300.png +0 -0
- package/conformance/motion/refs/skottie-trimpath-fill@540.png +0 -0
- package/conformance/motion/refs/skottie-trimpath-modes@0.png +0 -0
- package/conformance/motion/refs/skottie-trimpath-modes@300.png +0 -0
- package/conformance/motion/refs/skottie-trimpath-modes@540.png +0 -0
- package/conformance/motion/refs/skottie-tritone-effect@0.png +0 -0
- package/conformance/motion/refs/skottie-tritone-effect@300.png +0 -0
- package/conformance/motion/refs/skottie-tritone-effect@540.png +0 -0
- package/conformance/motion/refs/spec-blend-mode@0.png +0 -0
- package/conformance/motion/refs/spec-blend-mode@162.png +0 -0
- package/conformance/motion/refs/spec-blend-mode@90.png +0 -0
- package/conformance/motion/refs/spec-ellipse@0.png +0 -0
- package/conformance/motion/refs/spec-ellipse@162.png +0 -0
- package/conformance/motion/refs/spec-ellipse@90.png +0 -0
- package/conformance/motion/refs/spec-fill@0.png +0 -0
- package/conformance/motion/refs/spec-fill@162.png +0 -0
- package/conformance/motion/refs/spec-fill@90.png +0 -0
- package/conformance/motion/refs/spec-gradient-stroke@0.png +0 -0
- package/conformance/motion/refs/spec-gradient-stroke@162.png +0 -0
- package/conformance/motion/refs/spec-gradient-stroke@90.png +0 -0
- package/conformance/motion/refs/spec-gradient@0.png +0 -0
- package/conformance/motion/refs/spec-gradient@162.png +0 -0
- package/conformance/motion/refs/spec-gradient@90.png +0 -0
- package/conformance/motion/refs/spec-mask@0.png +0 -0
- package/conformance/motion/refs/spec-mask@300.png +0 -0
- package/conformance/motion/refs/spec-mask@540.png +0 -0
- package/conformance/motion/refs/spec-masks@0.png +0 -0
- package/conformance/motion/refs/spec-masks@135.png +0 -0
- package/conformance/motion/refs/spec-masks@75.png +0 -0
- package/conformance/motion/refs/spec-matte@0.png +0 -0
- package/conformance/motion/refs/spec-matte@162.png +0 -0
- package/conformance/motion/refs/spec-matte@90.png +0 -0
- package/conformance/motion/refs/spec-metadata@0.png +0 -0
- package/conformance/motion/refs/spec-metadata@162.png +0 -0
- package/conformance/motion/refs/spec-metadata@90.png +0 -0
- package/conformance/motion/refs/spec-path@0.png +0 -0
- package/conformance/motion/refs/spec-path@162.png +0 -0
- package/conformance/motion/refs/spec-path@90.png +0 -0
- package/conformance/motion/refs/spec-pucker-bloat@0.png +0 -0
- package/conformance/motion/refs/spec-pucker-bloat@162.png +0 -0
- package/conformance/motion/refs/spec-pucker-bloat@90.png +0 -0
- package/conformance/motion/refs/spec-rectangle@0.png +0 -0
- package/conformance/motion/refs/spec-rectangle@162.png +0 -0
- package/conformance/motion/refs/spec-rectangle@90.png +0 -0
- package/conformance/motion/refs/spec-rounded-corners@0.png +0 -0
- package/conformance/motion/refs/spec-rounded-corners@162.png +0 -0
- package/conformance/motion/refs/spec-rounded-corners@90.png +0 -0
- package/conformance/motion/refs/spec-slots@0.png +0 -0
- package/conformance/motion/refs/spec-slots@450.png +0 -0
- package/conformance/motion/refs/spec-slots@810.png +0 -0
- package/conformance/motion/refs/spec-star@0.png +0 -0
- package/conformance/motion/refs/spec-star@162.png +0 -0
- package/conformance/motion/refs/spec-star@90.png +0 -0
- package/conformance/motion/refs/spec-stroke@0.png +0 -0
- package/conformance/motion/refs/spec-stroke@162.png +0 -0
- package/conformance/motion/refs/spec-stroke@90.png +0 -0
- package/conformance/motion/refs/spec-test-ellipse-xy-pos@0.png +0 -0
- package/conformance/motion/refs/spec-test-ellipse-xy-pos@162.png +0 -0
- package/conformance/motion/refs/spec-test-ellipse-xy-pos@90.png +0 -0
- package/conformance/motion/refs/spec-test-gradient-fill@0.png +0 -0
- package/conformance/motion/refs/spec-test-gradient-fill@30.png +0 -0
- package/conformance/motion/refs/spec-test-gradient-fill@54.png +0 -0
- package/conformance/motion/refs/spec-test-gradient-stroke@0.png +0 -0
- package/conformance/motion/refs/spec-test-gradient-stroke@30.png +0 -0
- package/conformance/motion/refs/spec-test-gradient-stroke@54.png +0 -0
- package/conformance/motion/refs/spec-test-unknown-shape@0.png +0 -0
- package/conformance/motion/refs/spec-test-unknown-shape@162.png +0 -0
- package/conformance/motion/refs/spec-test-unknown-shape@90.png +0 -0
- package/conformance/motion/refs/spec-time-remap@0.png +0 -0
- package/conformance/motion/refs/spec-time-remap@300.png +0 -0
- package/conformance/motion/refs/spec-time-remap@540.png +0 -0
- package/conformance/motion/refs/spec-time-stretch@0.png +0 -0
- package/conformance/motion/refs/spec-time-stretch@300.png +0 -0
- package/conformance/motion/refs/spec-time-stretch@540.png +0 -0
- package/conformance/motion/refs/spec-transform@0.png +0 -0
- package/conformance/motion/refs/spec-transform@162.png +0 -0
- package/conformance/motion/refs/spec-transform@90.png +0 -0
- package/conformance/motion/refs/spec-trim-path@0.png +0 -0
- package/conformance/motion/refs/spec-trim-path@162.png +0 -0
- package/conformance/motion/refs/spec-trim-path@90.png +0 -0
- package/conformance/motion/refs/web-adrock@0.png +0 -0
- package/conformance/motion/refs/web-adrock@10.png +0 -0
- package/conformance/motion/refs/web-adrock@18.png +0 -0
- package/conformance/motion/refs/web-bacon@0.png +0 -0
- package/conformance/motion/refs/web-bacon@126.png +0 -0
- package/conformance/motion/refs/web-bacon@70.png +0 -0
- package/conformance/motion/refs/web-banner@0.png +0 -0
- package/conformance/motion/refs/web-banner@301.png +0 -0
- package/conformance/motion/refs/web-banner@542.png +0 -0
- package/conformance/motion/refs/web-bodymovin@0.png +0 -0
- package/conformance/motion/refs/web-bodymovin@51.png +0 -0
- package/conformance/motion/refs/web-bodymovin@92.png +0 -0
- package/conformance/motion/refs/web-dalek@0.png +0 -0
- package/conformance/motion/refs/web-dalek@145.png +0 -0
- package/conformance/motion/refs/web-dalek@261.png +0 -0
- package/conformance/motion/refs/web-footage-data@0.png +0 -0
- package/conformance/motion/refs/web-footage-data@180.png +0 -0
- package/conformance/motion/refs/web-footage-data@324.png +0 -0
- package/conformance/motion/refs/web-lights@0.png +0 -0
- package/conformance/motion/refs/web-lights@150.png +0 -0
- package/conformance/motion/refs/web-lights@270.png +0 -0
- package/conformance/motion/refs/web-ripple@0.png +0 -0
- package/conformance/motion/refs/web-ripple@180.png +0 -0
- package/conformance/motion/refs/web-ripple@324.png +0 -0
- package/conformance/motion/refs/web-starfish@0.png +0 -0
- package/conformance/motion/refs/web-starfish@150.png +0 -0
- package/conformance/motion/refs/web-starfish@270.png +0 -0
- package/conformance/motion/render-refs.ts +126 -0
- package/conformance/motion/report.json +1367 -0
- package/conformance/motion/web-parity-gaps.json +12 -0
- package/conformance/motion-parity-entry.ts +3 -0
- package/conformance/motion-parity.ts +101 -0
- package/dist/chunks/{index-gtk2gwsb.js → index-4xczxey5.js} +187 -40
- package/dist/chunks/{index-gtk2gwsb.js.map → index-4xczxey5.js.map} +7 -6
- package/dist/chunks/{index-62yzr94z.js → index-5sjj5p84.js} +270 -8
- package/dist/chunks/{index-62yzr94z.js.map → index-5sjj5p84.js.map} +2 -2
- package/dist/chunks/{index-fy7y2nz8.js → index-cvf7bbs5.js} +23 -2
- package/dist/chunks/{index-fy7y2nz8.js.map → index-cvf7bbs5.js.map} +1 -1
- package/dist/chunks/index-dgkf6yw5.js +48 -0
- package/dist/chunks/index-dgkf6yw5.js.map +10 -0
- package/dist/chunks/{index-5fmaa0xq.js → index-f9wkb6aq.js} +851 -36
- package/dist/chunks/{index-5fmaa0xq.js.map → index-f9wkb6aq.js.map} +2 -2
- package/dist/chunks/index-t2mwfbb6.js +1515 -0
- package/dist/chunks/index-t2mwfbb6.js.map +15 -0
- package/dist/chunks/{index-bg2jsgjq.js → index-vkn82srs.js} +479 -10
- package/dist/chunks/{index-bg2jsgjq.js.map → index-vkn82srs.js.map} +2 -2
- package/dist/chunks/wasm-ctcc3cma.js +424 -0
- package/dist/chunks/wasm-ctcc3cma.js.map +11 -0
- package/dist/conformance.js +10941 -563
- package/dist/conformance.js.map +2 -2
- package/dist/entries/prompt.js +2 -2
- package/dist/entries/schema.js +3 -3
- package/dist/host/index.js +20 -4
- package/dist/host/index.js.map +1 -1
- package/dist/index.js +364 -99
- package/dist/index.js.map +4 -4
- package/dist/types/src/catalog.generated.d.ts +71 -5
- package/dist/types/src/host/contract.d.ts +17 -0
- package/dist/types/src/host/exposes.d.ts +68 -0
- package/dist/types/src/host/index.d.ts +1 -0
- package/dist/types/src/host/package.d.ts +8 -0
- package/dist/types/src/index.d.ts +2 -0
- package/dist/types/src/layout.d.ts +2 -0
- package/dist/types/src/limits.d.ts +1 -0
- package/dist/types/src/motion/index.d.ts +1 -0
- package/dist/types/src/motion/server.d.ts +9 -0
- package/dist/types/src/motion/wasm.d.ts +11 -0
- package/dist/types/src/web/coerce.d.ts +3 -0
- package/dist/types/src/web/focus.d.ts +8 -0
- package/dist/types/src/web/index.d.ts +5 -2
- package/dist/types/src/web/primitives/carousel.d.ts +17 -0
- package/dist/types/src/web/primitives/dock.d.ts +5 -2
- package/dist/types/src/web/primitives/index.d.ts +5 -0
- package/dist/types/src/web/primitives/mosaic.d.ts +30 -0
- package/dist/types/src/web/primitives/motion-paint.d.ts +36 -0
- package/dist/types/src/web/primitives/motion.d.ts +162 -0
- package/dist/types/src/web/primitives/outline.d.ts +22 -0
- package/dist/types/src/web/primitives/zoomable-image.d.ts +158 -0
- package/dist/types/src/web/table.d.ts +8 -0
- package/dist/types/src/zoom.d.ts +128 -0
- package/dist/types/wasm/motion/bytes.d.ts +1 -0
- package/dist/web/index.js +171 -230
- package/dist/web/index.js.map +9 -10
- package/dist/web/primitives/index.js +641 -6
- package/dist/web/primitives/index.js.map +9 -5
- package/docs/components.generated.json +542 -5
- package/docs/package-format.md +56 -1
- package/docs/round-6-contract.md +110 -0
- package/docs/themes.generated.json +66 -2
- package/fixtures/bind-time.json +1468 -0
- package/fixtures/catalog-components.json +1026 -16
- package/fixtures/catalog-macros.json +1279 -157
- package/fixtures/conformance-baseline.json +48893 -47200
- package/fixtures/conformance-known.json +140 -134
- package/fixtures/host-router.json +539 -1
- package/fixtures/kitchen-sink.expanded.json +686 -1
- package/fixtures/kitchen-sink.json +102 -1
- package/fixtures/layout-geometry-round1.json +42 -42
- package/fixtures/motion-frames.json +2618 -0
- package/fixtures/motion-playback.json +528 -0
- package/fixtures/motion-state.json +722 -0
- package/fixtures/motion-validate.json +138 -0
- package/fixtures/primitive-specimens.json +4 -0
- package/fixtures/prompt-budget.json +16 -16
- package/fixtures/specimens.json +839 -21
- package/fixtures/theme-recipes.json +32808 -28396
- package/fixtures/theme-resolved.json +2114 -286
- package/fixtures/zoom.json +1382 -0
- package/generated/ExponentialUICatalog.generated.kt +21 -21
- package/generated/ExponentialUICatalog.generated.swift +21 -21
- package/generated/ExponentialUIThemes.generated.kt +7 -7
- package/generated/ExponentialUIThemes.generated.swift +7 -7
- package/generated/catalog.descriptions.generated.rs +1 -1
- package/generated/catalog.generated.rs +30 -30
- package/generated/catalog.themes.generated.rs +8 -8
- package/generated/core.descriptions.json +267 -5
- package/generated/core.runtime.json +275 -1
- package/package.json +1 -1
- package/themes/neutral.theme.json +460 -3
- package/dist/chunks/index-t6qz1770.js +0 -95
- package/dist/chunks/index-t6qz1770.js.map +0 -11
package/catalog/host.json
CHANGED
|
@@ -68,6 +68,16 @@
|
|
|
68
68
|
"transports": ["http", "stdio", "script"],
|
|
69
69
|
"functionPrefix": "tools."
|
|
70
70
|
},
|
|
71
|
+
"exposes": {
|
|
72
|
+
"$comment": "VAPP-180 (the format half of the eMCP contract, packages/emcp fixtures/exposes.json in the Exponential repo): `exposes: [{name, title, description, input, access, run}]` = MCP tools a host's broker lists (as `<app>__<name>`) and runs as the CALLING person, data never code. `name` matches `limits.namePattern`, at most `limits.nameMax`, never holds `limits.separator`, unique; `title` (at most titleMax) and `description` (at most descriptionMax) non-blank; `input` = a JSON Schema `{type: \"object\", properties?}`; `access` read | write; at most `limits.maxTools` tools. `run` holds EXACTLY ONE of `runKinds`: `records: {op, kind, id?, where?, data?, limit?}` over the package's OWN kinds (op in `recordOps`; `readRecordOps` read, upsert writes; a delete is destructive and refused); `action` (+ `args`) = a host function name matching `actionPattern` (it reads when the last word of its name is a `readOpWords` word, else it writes); `upstream` (+ `tool`, `args`) = one of the package's `upstreams` (the MCP server names the HOST provides: Exponential = the team's MCP servers). Every string of `run` may hold `${input.<dotted path>}` templates whose first key is a declared input property. Destructive is never exposed: an action or upstream tool whose name holds a `destructiveWords` word (words = the lowercase letter runs) is refused. A binding declared read whose run writes is refused; an upstream tool's level is its live annotations', checked by the host at call. Issues come in binding order with the eMCP error code (`exposeIssues`). What a run may reach on a given host (which actions exist and are grantable, destructive arguments, which upstreams the team has) is the host's own check on top.",
|
|
73
|
+
"limits": { "namePattern": "^[a-z][a-z0-9_]*$", "nameMax": 40, "titleMax": 80, "descriptionMax": 1024, "maxTools": 32, "separator": "__" },
|
|
74
|
+
"runKinds": ["records", "action", "upstream"],
|
|
75
|
+
"recordOps": ["list", "get", "upsert"],
|
|
76
|
+
"readRecordOps": ["list", "get"],
|
|
77
|
+
"readOpWords": ["list", "get", "show", "catalog", "activity", "files"],
|
|
78
|
+
"destructiveWords": ["delete", "merge", "close", "end", "remove", "trash"],
|
|
79
|
+
"actionPattern": "^[a-z][a-z0-9_]*(\\.[a-z][a-z0-9_]*)+$"
|
|
80
|
+
},
|
|
71
81
|
"extensions": {
|
|
72
82
|
"$comment": "VAPP-161: `extensions: [{id, version, components?}]`: an extension catalog id the package needs beyond its catalogId, the minimum MAJOR.MINOR.PATCH (caret: the host's has the same major and is not lower; an unversioned registration satisfies any) and the components it uses. Install issues: an id not registered on the host (`extension <id> is not available on this host`), a version that does not satisfy (`extension <id> <have> does not satisfy ^<want>`), a component the registered extension does not define (`extension <id> has no component <name>`), a duplicate id. A host registers an extension's version as ExtensionDef.version.",
|
|
73
83
|
"versionPattern": "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)$"
|
package/catalog/layout.json
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"$comment": "Round 2 (docs/round-2-contract.md §7): the layout NUMBERS every painter shares where no theme token decides (px unless noted). `windowThreshold` = items past which List and Table window; `windowOverscan` = items rendered beyond each viewport edge; `resizeStep` = percentage points per arrow key on a Resizable handle; `panelMin` = a panel's min (percent) when unset; `resizeHandleHit` = a handle's hit area across its hairline; `fieldIntrinsicWidth` = the max-content width of a text field (Input, Textarea, NumberField, ChipInput: never the browser's `size` default) — picker triggers (Select, DatePicker, DateRangePicker, TimePicker) size to their content; `mediaIntrinsicWidth` = the max-content width of an Image/Video without a width (its min-content is 0); `mediaAspectRatio` = width/height of an Image without `aspectRatio` or a height (Video: its `aspectRatio` default); `treeGuideColumn` = one TreeGuides gutter column (the recipe's `line` width is the STROKE; round 3: 14, the ×4 app indent, the elbow lands on the parent's lead glyph); `treeGuideRadius` = the elbow's corner radius; `treeGuideBridge` = how far the guide verticals overshoot the row's TOP edge (paint only) so a Section's hairline divider never breaks the line. EXP-1259 (packages/domain-contract/fixtures/feedback-states.json + search-list.json): `pendingDelayMs` = how long a `loading` Button waits before it shows the spinner and its `pendingLabel` (a fast action never flashes; presses are refused at once); `skeletonPulseMs` / `skeletonOpacityLow` / `skeletonOpacityHigh` = the placeholder's ONE opacity pulse (low → high → low, ease-in-out), `skeletonReducedOpacity` = its static opacity under reduce motion; `searchListFade` = the bottom fade over a SearchList (or a searchable submenu) while more rows sit below. Generated into every target; src/layout.ts reads it.",
|
|
2
|
+
"$comment": "Round 2 (docs/round-2-contract.md §7): the layout NUMBERS every painter shares where no theme token decides (px unless noted). `windowThreshold` = items past which List and Table window; `windowOverscan` = items rendered beyond each viewport edge; `resizeStep` = percentage points per arrow key on a Resizable handle; `panelMin` = a panel's min (percent) when unset; `resizeHandleHit` = a handle's hit area across its hairline; `fieldIntrinsicWidth` = the max-content width of a text field (Input, Textarea, NumberField, ChipInput: never the browser's `size` default) — picker triggers (Select, DatePicker, DateRangePicker, TimePicker) size to their content; `mediaIntrinsicWidth` = the max-content width of an Image/Video without a width (its min-content is 0); `mediaAspectRatio` = width/height of an Image without `aspectRatio` or a height (Video: its `aspectRatio` default); `treeGuideColumn` = one TreeGuides gutter column (the recipe's `line` width is the STROKE; round 3: 14, the ×4 app indent, the elbow lands on the parent's lead glyph); `treeGuideRadius` = the elbow's corner radius; `treeGuideBridge` = how far the guide verticals overshoot the row's TOP edge (paint only) so a Section's hairline divider never breaks the line. EXP-1259 (packages/domain-contract/fixtures/feedback-states.json + search-list.json): `pendingDelayMs` = how long a `loading` Button waits before it shows the spinner and its `pendingLabel` (a fast action never flashes; presses are refused at once); `skeletonPulseMs` / `skeletonOpacityLow` / `skeletonOpacityHigh` = the placeholder's ONE opacity pulse (low → high → low, ease-in-out), `skeletonReducedOpacity` = its static opacity under reduce motion; `searchListFade` = the bottom fade over a SearchList (or a searchable submenu) while more rows sit below. EXP-1548: `tableColumnMin` = the narrowest a Table column without a `width` gets; a table whose columns need more than its box scrolls horizontally. Generated into every target; src/layout.ts reads it.",
|
|
3
3
|
"windowThreshold": 50,
|
|
4
4
|
"windowOverscan": 5,
|
|
5
5
|
"resizeStep": 10,
|
|
@@ -16,5 +16,6 @@
|
|
|
16
16
|
"skeletonOpacityLow": 0.45,
|
|
17
17
|
"skeletonOpacityHigh": 0.9,
|
|
18
18
|
"skeletonReducedOpacity": 0.6,
|
|
19
|
-
"searchListFade": 24
|
|
19
|
+
"searchListFade": 24,
|
|
20
|
+
"tableColumnMin": 120
|
|
20
21
|
}
|
package/catalog/limits.json
CHANGED
|
@@ -5,5 +5,14 @@
|
|
|
5
5
|
"maxMessageBytes": 4194304,
|
|
6
6
|
"maxTemplateItems": 10000,
|
|
7
7
|
"maxPointerBytes": 1024,
|
|
8
|
-
"maxPointerSegments": 64
|
|
8
|
+
"maxPointerSegments": 64,
|
|
9
|
+
"motion": {
|
|
10
|
+
"$comment": "EXP-1584/1602: the eUI Motion (Lottie) limits, enforced by the one engine (apps/desktop/crates/eui-motion, src/validate.rs Limits) on every renderer through its WASM and uniffi builds. A source past maxBytes (UTF-8 JSON), maxShapes (shape items: objects with a string `ty` inside a layer's `shapes` or a group's `it`) or maxSeconds ((op − ip) / fr) is refused with an issue (`limit-bytes`, `limit-shapes`, `limit-duration`; expressions are refused too: `expression`); maxVertices = path vertices in one sampled frame (checked per frame by the player, not by the validator); maxFps = the highest frame rate a player samples at; maxPlayingPerSurface = Motion components one surface animates at once. Cases: fixtures/motion-validate.json.",
|
|
11
|
+
"maxBytes": 2097152,
|
|
12
|
+
"maxShapes": 5000,
|
|
13
|
+
"maxVertices": 100000,
|
|
14
|
+
"maxSeconds": 120,
|
|
15
|
+
"maxFps": 60,
|
|
16
|
+
"maxPlayingPerSurface": 8
|
|
17
|
+
}
|
|
9
18
|
}
|
package/catalog/macros.json
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"$comment": "VAPP-85: the ONE declarative macro table. A macro component (core.catalog.json `kind: macro`) expands into this template before painting; the TS reference expander (src/macros.ts) and the Rust core apply the same table and fixtures/catalog-macros.json locks the output. Template node = { part, component, props?, style?, children?, slots?, $if?, $any?, $each?, $as?, $on?, $context?, $set?, $recipe?, $a11y? }. Values: `\"{props.x}\"` alone = the raw prop (a data BINDING passes through untouched, so two-way binding survives); `\"{props.x|fallback}\"` = with a default; `{…}` inside a longer string interpolates; `{id}` = the macro node's id; `{len(props.rows)}` = an array length; `{range(props.max|5)}` = the indexes 0..n-1 (for `$each`); `{index}` = the current $each index; `{!path}` negates. Value objects: $map {from, cases, default}, $cond [condition, then, else], $eq [a, b] (a number equals a string spelling it), $lt [a, b], $add [a, b], $sub [a, b], $clamp [value, min, max] (a missing bound does not clamp), $percent [value, max] (→ \"N%\"), $coalesce [a, b, …], $text value (→ the value as a string, absent when missing), $not condition, $fill [template, {name: value}] (ALWAYS emits the core `fill` call: the template is usually a `$string.<id>` sentence with `{name}` placeholders the surface's string table resolves at bind time). Object KEYS interpolate too (`\"@media (max-width: $breakpoint.{props.collapseBelow|md})\"`). `$if` = a condition or an array of conditions (all must hold); `$any` = an array where one must hold. `$each` repeats a part per item of an array (`$as` names the item, default `item`). Children: `\"$children\"` splices the author's children, `\"$slot:name\"` splices an author slot in place; `slots: {\"trigger\": \"$slot:trigger\"}` copies an author slot, `slots: {\"footer\": {template node}}` builds one as a part. `$on: {\"press\": \"change\"}` routes the author's `on.change` handler to this part's `press` (merging `$context` into an event action's context); without `$on` the author's `on` map stays on the root. `$set: {\"press\": {\"prop\": \"open\", \"value\": \"{!props.open}\"}}` = TWO-WAY BINDING (round 1): when the author's `props.open` is a data binding `{path}`, this part's `press` action also carries `functionCall: {call: \"set\", args: {path, value}}` (the value evaluated like any template value, so usually a call), key order `event` then `functionCall`; a literal prop adds nothing (the host owns the state through the routed event); when the author's routed handler is itself a FUNCTION (an Action carries one), it wins, no `set` is added and the reducer reports an issue. `$a11y: {role, label, description, level, expanded, current, selected, pressed, checked, valueNow, valueMin, valueMax, hidden, autoFocus}` = the part's ACCESSIBILITY (docs/round-1-contract.md §6): evaluated like props (a bound input emits a call) into the expanded node's `accessibility`; `role` is one of catalog/a11y.json `roles`; on the root the author's `accessibility` label/description win. Ids: the root keeps the author's id, parts get `<id>.<part>` and `<id>.<part>.<index>` under `$each`. Every expanded node carries `recipe: {macro, part, props}` where props = `recipeProps` evaluated from the author's props (+ a part's `$recipe`); the THEME (VAPP-92) keys its visual recipes on that, so nothing here states a colour, a border or a font — only structure and token-named spacing, radius and control heights. VAPP-163: the expansion ROOT's recipe also carries `authored` = the top-level keys of the style written ON the macro node (condition blocks count as one key), SORTED, omitted when none; painters apply native recipe < node style < part recipe < those authored keys, so an author's colour or size on a Heading/Badge beats the theme's part recipe while the template's own structure does not (only the author's keys count: a macro node an outer template drew passes on just its root's `authored`, never template style). Macros may use other macros (Row → TreeGuides); expansion recurses until every node is native (innermost recipe wins). ROUND 1 (docs/round-1-contract.md §1, BOUND INPUTS): when an expression input is a data binding `{path}` or a function call, the expander does NOT evaluate — it EMITS an A2UI function call the renderer evaluates at bind time, over the core functions: interpolation → concat, `|fallback` → fallback (as an operand; a whole-string MEMBER of props/style/context passes the binding itself through, so two-way binding survives), `!` → not, len → len, $map → map, $cond → cond, $eq → eq, $lt → lt, $add → add, $sub → sub, $percent → percent, $text → text, $coalesce → coalesce, $not → not; a `$if`/`$any` whose conditions are bound emits the part WITH `visible` = the bound condition (`and{values}` over several bound `$if`s, `or{values}` over several bound `$any`s; literal conditions still decide at expansion); `$each` over a bound array emits nothing (use List with a template); a `$recipe` value may therefore be a call too (renderers resolve recipe props like props). RESPONSIVE PROPS: an author prop `{base, sm?, md?, lg?, xl?}` on a `responsive` prop is evaluated per breakpoint: a part's style is computed with the `base` values, then once per breakpoint named (ascending sm<md<lg<xl, each key inheriting the last smaller one) and every key that changed lands in a `\"@media (min-width: $breakpoint.<bp>)\"` block of that part; props and conditions see the `base` value. Strings of the form `$string.<id>` (catalog/strings.json) are built-in UI copy the renderer shows in the surface locale. Round 3 (VAPP-102): AFTER the table is applied the core runs ONE post-expansion pass, src/tree-guides.ts applyTreeGuides (Rust: tree_guides::apply): over every node's children in order, each Row root (`recipe.macro` Row, part root) contributes its numeric `recipe.props.depth` (anything else counts as depth 0 and ends every subtree), the ×4 treeGuides rule (elbow at depth-1, tee while a later sibling follows, pass-through for every ancestor level that continues) fills the Row's `guides` part (a TreeGuides) with `elbowAt`/`tee`/`passThrough`; fixtures/tree-guides.json locks the rule, catalog-macros.json the filled trees.",
|
|
2
|
+
"$comment": "VAPP-85: the ONE declarative macro table. A macro component (core.catalog.json `kind: macro`) expands into this template before painting; the TS reference expander (src/macros.ts) and the Rust core apply the same table and fixtures/catalog-macros.json locks the output. Template node = { part, component, props?, style?, children?, slots?, $if?, $any?, $each?, $as?, $on?, $context?, $set?, $recipe?, $a11y? }. Values: `\"{props.x}\"` alone = the raw prop (a data BINDING passes through untouched, so two-way binding survives); `\"{props.x|fallback}\"` = with a default; `{…}` inside a longer string interpolates; `{id}` = the macro node's id; `{len(props.rows)}` = an array length; `{range(props.max|5)}` = the indexes 0..n-1 (for `$each`); `{index}` = the current $each index; `{!path}` negates. Value objects: $map {from, cases, default}, $cond [condition, then, else], $eq [a, b] (a number equals a string spelling it), $lt [a, b], $add [a, b], $sub [a, b], $clamp [value, min, max] (a missing bound does not clamp), $percent [value, max] (→ \"N%\"), $coalesce [a, b, …], $text value (→ the value as a string, absent when missing), $not condition, $fill [template, {name: value}] (ALWAYS emits the core `fill` call: the template is usually a `$string.<id>` sentence with `{name}` placeholders the surface's string table resolves at bind time). Object KEYS interpolate too (`\"@media (max-width: $breakpoint.{props.collapseBelow|md})\"`). `$if` = a condition or an array of conditions (all must hold); `$any` = an array where one must hold. `$each` repeats a part per item of an array (`$as` names the item, default `item`). Children: `\"$children\"` splices the author's children, `\"$slot:name\"` splices an author slot in place; `slots: {\"trigger\": \"$slot:trigger\"}` copies an author slot, `slots: {\"footer\": {template node}}` builds one as a part. `$on: {\"press\": \"change\"}` routes the author's `on.change` handler to this part's `press` (merging `$context` into an event action's context); without `$on` the author's `on` map stays on the root. `$set: {\"press\": {\"prop\": \"open\", \"value\": \"{!props.open}\"}}` = TWO-WAY BINDING (round 1): when the author's `props.open` is a data binding `{path}`, this part's `press` action also carries `functionCall: {call: \"set\", args: {path, value}}` (the value evaluated like any template value, so usually a call), key order `event` then `functionCall`; a literal prop adds nothing (the host owns the state through the routed event); when the author's routed handler is itself a FUNCTION (an Action carries one), it wins, no `set` is added and the reducer reports an issue. `$a11y: {role, label, description, level, expanded, current, selected, pressed, checked, valueNow, valueMin, valueMax, hidden, autoFocus}` = the part's ACCESSIBILITY (docs/round-1-contract.md §6): evaluated like props (a bound input emits a call) into the expanded node's `accessibility`; `role` is one of catalog/a11y.json `roles`; on the root the author's `accessibility` label/description win. Ids: the root keeps the author's id, parts get `<id>.<part>` and `<id>.<part>.<index>` under `$each`. Every expanded node carries `recipe: {macro, part, props}` where props = `recipeProps` evaluated from the author's props (+ a part's `$recipe`); the THEME (VAPP-92) keys its visual recipes on that, so nothing here states a colour, a border or a font — only structure and token-named spacing, radius and control heights. VAPP-163: the expansion ROOT's recipe also carries `authored` = the top-level keys of the style written ON the macro node (condition blocks count as one key), SORTED, omitted when none; painters apply native recipe < node style < part recipe < those authored keys, so an author's colour or size on a Heading/Badge beats the theme's part recipe while the template's own structure does not (only the author's keys count: a macro node an outer template drew passes on just its root's `authored`, never template style). Macros may use other macros (Row → TreeGuides); expansion recurses until every node is native (innermost recipe wins). ROUND 1 (docs/round-1-contract.md §1, BOUND INPUTS): when an expression input is a data binding `{path}` or a function call, the expander does NOT evaluate — it EMITS an A2UI function call the renderer evaluates at bind time, over the core functions: interpolation → concat, `|fallback` → fallback (as an operand; a whole-string MEMBER of props/style/context passes the binding itself through, so two-way binding survives), `!` → not, len → len, $map → map, $cond → cond, $eq → eq, $lt → lt, $add → add, $sub → sub, $percent → percent, $text → text, $coalesce → coalesce, $not → not; a `$if`/`$any` whose conditions are bound emits the part WITH `visible` = the bound condition (`and{values}` over several bound `$if`s, `or{values}` over several bound `$any`s; literal conditions still decide at expansion); `$each` over a bound array emits nothing (use List with a template); a `$recipe` value may therefore be a call too (renderers resolve recipe props like props). RESPONSIVE PROPS: an author prop `{base, sm?, md?, lg?, xl?}` on a `responsive` prop is evaluated per breakpoint: a part's style is computed with the `base` values, then once per breakpoint named (ascending sm<md<lg<xl, each key inheriting the last smaller one) and every key that changed lands in a `\"@media (min-width: $breakpoint.<bp>)\"` block of that part; props and conditions see the `base` value. Strings of the form `$string.<id>` (catalog/strings.json) are built-in UI copy the renderer shows in the surface locale. Round 3 (VAPP-102): AFTER the table is applied the core runs ONE post-expansion pass, src/tree-guides.ts applyTreeGuides (Rust: tree_guides::apply): over every node's children in order, each Row root (`recipe.macro` Row, part root) contributes its numeric `recipe.props.depth` (anything else counts as depth 0 and ends every subtree), the ×4 treeGuides rule (elbow at depth-1, tee while a later sibling follows, pass-through for every ancestor level that continues) fills the Row's `guides` part (a TreeGuides) with `elbowAt`/`tee`/`passThrough`; fixtures/tree-guides.json locks the rule, catalog-macros.json the filled trees. EXP-1495 (docs/round-6-contract.md): Outline (the anchor list) and Mosaic (the wide picture group) are macros over Box/Text/Image.",
|
|
3
3
|
"macros": {
|
|
4
4
|
"Stack": {
|
|
5
5
|
"recipeProps": [],
|
|
@@ -2025,6 +2025,7 @@
|
|
|
2025
2025
|
}
|
|
2026
2026
|
},
|
|
2027
2027
|
"alignItems": "stretch",
|
|
2028
|
+
"gap": "$spacing.lg",
|
|
2028
2029
|
"width": "100%",
|
|
2029
2030
|
"minHeight": 0
|
|
2030
2031
|
},
|
|
@@ -2333,6 +2334,169 @@
|
|
|
2333
2334
|
]
|
|
2334
2335
|
}
|
|
2335
2336
|
},
|
|
2337
|
+
"Outline": {
|
|
2338
|
+
"recipeProps": [],
|
|
2339
|
+
"root": {
|
|
2340
|
+
"part": "root",
|
|
2341
|
+
"component": "Box",
|
|
2342
|
+
"$a11y": {
|
|
2343
|
+
"role": "navigation",
|
|
2344
|
+
"label": "{props.caption|$string.outline}"
|
|
2345
|
+
},
|
|
2346
|
+
"style": {
|
|
2347
|
+
"display": "flex",
|
|
2348
|
+
"flexDirection": "column",
|
|
2349
|
+
"gap": "$spacing.xxs",
|
|
2350
|
+
"minWidth": 0
|
|
2351
|
+
},
|
|
2352
|
+
"children": [
|
|
2353
|
+
{
|
|
2354
|
+
"part": "caption",
|
|
2355
|
+
"component": "Text",
|
|
2356
|
+
"$if": "props.caption",
|
|
2357
|
+
"props": {
|
|
2358
|
+
"text": "{props.caption}",
|
|
2359
|
+
"variant": "caption",
|
|
2360
|
+
"lines": 1
|
|
2361
|
+
},
|
|
2362
|
+
"$a11y": {
|
|
2363
|
+
"hidden": true
|
|
2364
|
+
}
|
|
2365
|
+
},
|
|
2366
|
+
{
|
|
2367
|
+
"part": "row",
|
|
2368
|
+
"component": "Box",
|
|
2369
|
+
"$each": "props.items",
|
|
2370
|
+
"$as": "item",
|
|
2371
|
+
"props": {
|
|
2372
|
+
"pressable": true
|
|
2373
|
+
},
|
|
2374
|
+
"style": {
|
|
2375
|
+
"display": "flex",
|
|
2376
|
+
"flexDirection": "row",
|
|
2377
|
+
"alignItems": "center",
|
|
2378
|
+
"gap": "$spacing.xs",
|
|
2379
|
+
"position": "relative",
|
|
2380
|
+
"height": "$control.rowCompact",
|
|
2381
|
+
"paddingHorizontal": "$spacing.sm",
|
|
2382
|
+
"minWidth": 0,
|
|
2383
|
+
"overflow": "hidden",
|
|
2384
|
+
"cursor": "pointer"
|
|
2385
|
+
},
|
|
2386
|
+
"$recipe": {
|
|
2387
|
+
"active": {
|
|
2388
|
+
"$eq": [
|
|
2389
|
+
"{item.id}",
|
|
2390
|
+
"{props.value}"
|
|
2391
|
+
]
|
|
2392
|
+
}
|
|
2393
|
+
},
|
|
2394
|
+
"$a11y": {
|
|
2395
|
+
"role": "link",
|
|
2396
|
+
"label": {
|
|
2397
|
+
"$cond": [
|
|
2398
|
+
"item.count",
|
|
2399
|
+
{
|
|
2400
|
+
"$fill": [
|
|
2401
|
+
"$string.outlineRow",
|
|
2402
|
+
{
|
|
2403
|
+
"title": "{item.title}",
|
|
2404
|
+
"count": "{item.count}"
|
|
2405
|
+
}
|
|
2406
|
+
]
|
|
2407
|
+
},
|
|
2408
|
+
"{item.title}"
|
|
2409
|
+
]
|
|
2410
|
+
},
|
|
2411
|
+
"current": {
|
|
2412
|
+
"$cond": [
|
|
2413
|
+
{
|
|
2414
|
+
"$eq": [
|
|
2415
|
+
"{item.id}",
|
|
2416
|
+
"{props.value}"
|
|
2417
|
+
]
|
|
2418
|
+
},
|
|
2419
|
+
"location",
|
|
2420
|
+
false
|
|
2421
|
+
]
|
|
2422
|
+
}
|
|
2423
|
+
},
|
|
2424
|
+
"$on": {
|
|
2425
|
+
"press": "select"
|
|
2426
|
+
},
|
|
2427
|
+
"$context": {
|
|
2428
|
+
"id": "{item.id}"
|
|
2429
|
+
},
|
|
2430
|
+
"$set": {
|
|
2431
|
+
"press": {
|
|
2432
|
+
"prop": "value",
|
|
2433
|
+
"value": "{item.id}"
|
|
2434
|
+
}
|
|
2435
|
+
},
|
|
2436
|
+
"children": [
|
|
2437
|
+
{
|
|
2438
|
+
"part": "bar",
|
|
2439
|
+
"component": "Box",
|
|
2440
|
+
"$if": {
|
|
2441
|
+
"$eq": [
|
|
2442
|
+
"{item.id}",
|
|
2443
|
+
"{props.value}"
|
|
2444
|
+
]
|
|
2445
|
+
},
|
|
2446
|
+
"$a11y": {
|
|
2447
|
+
"hidden": true
|
|
2448
|
+
},
|
|
2449
|
+
"style": {
|
|
2450
|
+
"position": "absolute",
|
|
2451
|
+
"insetInlineStart": 0,
|
|
2452
|
+
"top": 0,
|
|
2453
|
+
"bottom": 0,
|
|
2454
|
+
"width": 2
|
|
2455
|
+
}
|
|
2456
|
+
},
|
|
2457
|
+
{
|
|
2458
|
+
"part": "title",
|
|
2459
|
+
"component": "Text",
|
|
2460
|
+
"props": {
|
|
2461
|
+
"text": "{item.title}",
|
|
2462
|
+
"lines": 1
|
|
2463
|
+
},
|
|
2464
|
+
"$recipe": {
|
|
2465
|
+
"active": {
|
|
2466
|
+
"$eq": [
|
|
2467
|
+
"{item.id}",
|
|
2468
|
+
"{props.value}"
|
|
2469
|
+
]
|
|
2470
|
+
}
|
|
2471
|
+
},
|
|
2472
|
+
"style": {
|
|
2473
|
+
"flexGrow": 1,
|
|
2474
|
+
"flexShrink": 1,
|
|
2475
|
+
"flexBasis": 0,
|
|
2476
|
+
"minWidth": 0
|
|
2477
|
+
}
|
|
2478
|
+
},
|
|
2479
|
+
{
|
|
2480
|
+
"part": "count",
|
|
2481
|
+
"component": "Text",
|
|
2482
|
+
"$if": "item.count",
|
|
2483
|
+
"props": {
|
|
2484
|
+
"text": "· {item.count}",
|
|
2485
|
+
"variant": "caption",
|
|
2486
|
+
"lines": 1
|
|
2487
|
+
},
|
|
2488
|
+
"$a11y": {
|
|
2489
|
+
"hidden": true
|
|
2490
|
+
},
|
|
2491
|
+
"style": {
|
|
2492
|
+
"flexShrink": 0
|
|
2493
|
+
}
|
|
2494
|
+
}
|
|
2495
|
+
]
|
|
2496
|
+
}
|
|
2497
|
+
]
|
|
2498
|
+
}
|
|
2499
|
+
},
|
|
2336
2500
|
"Stepper": {
|
|
2337
2501
|
"recipeProps": [
|
|
2338
2502
|
"orientation"
|
|
@@ -4147,6 +4311,383 @@
|
|
|
4147
4311
|
}
|
|
4148
4312
|
]
|
|
4149
4313
|
}
|
|
4314
|
+
},
|
|
4315
|
+
"Mosaic": {
|
|
4316
|
+
"recipeProps": [],
|
|
4317
|
+
"root": {
|
|
4318
|
+
"part": "root",
|
|
4319
|
+
"component": "Box",
|
|
4320
|
+
"$a11y": {
|
|
4321
|
+
"role": "group",
|
|
4322
|
+
"label": "{props.label}"
|
|
4323
|
+
},
|
|
4324
|
+
"style": {
|
|
4325
|
+
"display": "flex",
|
|
4326
|
+
"flexDirection": "row",
|
|
4327
|
+
"width": "100%",
|
|
4328
|
+
"aspectRatio": 1.6,
|
|
4329
|
+
"minWidth": 0
|
|
4330
|
+
},
|
|
4331
|
+
"children": [
|
|
4332
|
+
{
|
|
4333
|
+
"part": "lead",
|
|
4334
|
+
"component": "Box",
|
|
4335
|
+
"$if": "props.pictures.0",
|
|
4336
|
+
"props": {
|
|
4337
|
+
"pressable": true
|
|
4338
|
+
},
|
|
4339
|
+
"style": {
|
|
4340
|
+
"position": "relative",
|
|
4341
|
+
"overflow": "hidden",
|
|
4342
|
+
"minWidth": 0,
|
|
4343
|
+
"minHeight": 0,
|
|
4344
|
+
"cursor": "pointer",
|
|
4345
|
+
"flexGrow": {
|
|
4346
|
+
"$cond": [
|
|
4347
|
+
{
|
|
4348
|
+
"$lt": [
|
|
4349
|
+
2,
|
|
4350
|
+
"{len(props.pictures)}"
|
|
4351
|
+
]
|
|
4352
|
+
},
|
|
4353
|
+
0,
|
|
4354
|
+
1
|
|
4355
|
+
]
|
|
4356
|
+
},
|
|
4357
|
+
"flexShrink": {
|
|
4358
|
+
"$cond": [
|
|
4359
|
+
{
|
|
4360
|
+
"$lt": [
|
|
4361
|
+
2,
|
|
4362
|
+
"{len(props.pictures)}"
|
|
4363
|
+
]
|
|
4364
|
+
},
|
|
4365
|
+
0,
|
|
4366
|
+
1
|
|
4367
|
+
]
|
|
4368
|
+
},
|
|
4369
|
+
"flexBasis": {
|
|
4370
|
+
"$cond": [
|
|
4371
|
+
{
|
|
4372
|
+
"$lt": [
|
|
4373
|
+
2,
|
|
4374
|
+
"{len(props.pictures)}"
|
|
4375
|
+
]
|
|
4376
|
+
},
|
|
4377
|
+
"60%",
|
|
4378
|
+
0
|
|
4379
|
+
]
|
|
4380
|
+
},
|
|
4381
|
+
"height": "100%"
|
|
4382
|
+
},
|
|
4383
|
+
"$recipe": {
|
|
4384
|
+
"size": {
|
|
4385
|
+
"$cond": [
|
|
4386
|
+
{
|
|
4387
|
+
"$lt": [
|
|
4388
|
+
2,
|
|
4389
|
+
"{len(props.pictures)}"
|
|
4390
|
+
]
|
|
4391
|
+
},
|
|
4392
|
+
"large",
|
|
4393
|
+
{
|
|
4394
|
+
"$cond": [
|
|
4395
|
+
{
|
|
4396
|
+
"$lt": [
|
|
4397
|
+
1,
|
|
4398
|
+
"{len(props.pictures)}"
|
|
4399
|
+
]
|
|
4400
|
+
},
|
|
4401
|
+
"half",
|
|
4402
|
+
"large"
|
|
4403
|
+
]
|
|
4404
|
+
}
|
|
4405
|
+
]
|
|
4406
|
+
}
|
|
4407
|
+
},
|
|
4408
|
+
"$a11y": {
|
|
4409
|
+
"role": "button",
|
|
4410
|
+
"label": "{props.pictures.0.alt}"
|
|
4411
|
+
},
|
|
4412
|
+
"$on": {
|
|
4413
|
+
"press": "select"
|
|
4414
|
+
},
|
|
4415
|
+
"$context": {
|
|
4416
|
+
"index": 0
|
|
4417
|
+
},
|
|
4418
|
+
"children": [
|
|
4419
|
+
{
|
|
4420
|
+
"part": "image",
|
|
4421
|
+
"component": "Image",
|
|
4422
|
+
"props": {
|
|
4423
|
+
"src": "{props.pictures.0.src}",
|
|
4424
|
+
"alt": "{props.pictures.0.alt}",
|
|
4425
|
+
"fit": "cover"
|
|
4426
|
+
},
|
|
4427
|
+
"$a11y": {
|
|
4428
|
+
"hidden": true
|
|
4429
|
+
},
|
|
4430
|
+
"style": {
|
|
4431
|
+
"position": "absolute",
|
|
4432
|
+
"inset": 0,
|
|
4433
|
+
"width": "100%",
|
|
4434
|
+
"height": "100%"
|
|
4435
|
+
}
|
|
4436
|
+
}
|
|
4437
|
+
]
|
|
4438
|
+
},
|
|
4439
|
+
{
|
|
4440
|
+
"part": "pair",
|
|
4441
|
+
"component": "Box",
|
|
4442
|
+
"$if": [
|
|
4443
|
+
{
|
|
4444
|
+
"$eq": [
|
|
4445
|
+
"{len(props.pictures)}",
|
|
4446
|
+
2
|
|
4447
|
+
]
|
|
4448
|
+
}
|
|
4449
|
+
],
|
|
4450
|
+
"props": {
|
|
4451
|
+
"pressable": true
|
|
4452
|
+
},
|
|
4453
|
+
"style": {
|
|
4454
|
+
"position": "relative",
|
|
4455
|
+
"overflow": "hidden",
|
|
4456
|
+
"minWidth": 0,
|
|
4457
|
+
"minHeight": 0,
|
|
4458
|
+
"cursor": "pointer",
|
|
4459
|
+
"flexGrow": 1,
|
|
4460
|
+
"flexShrink": 1,
|
|
4461
|
+
"flexBasis": 0,
|
|
4462
|
+
"height": "100%"
|
|
4463
|
+
},
|
|
4464
|
+
"$recipe": {
|
|
4465
|
+
"size": "half"
|
|
4466
|
+
},
|
|
4467
|
+
"$a11y": {
|
|
4468
|
+
"role": "button",
|
|
4469
|
+
"label": "{props.pictures.1.alt}"
|
|
4470
|
+
},
|
|
4471
|
+
"$on": {
|
|
4472
|
+
"press": "select"
|
|
4473
|
+
},
|
|
4474
|
+
"$context": {
|
|
4475
|
+
"index": 1
|
|
4476
|
+
},
|
|
4477
|
+
"children": [
|
|
4478
|
+
{
|
|
4479
|
+
"part": "image",
|
|
4480
|
+
"component": "Image",
|
|
4481
|
+
"props": {
|
|
4482
|
+
"src": "{props.pictures.1.src}",
|
|
4483
|
+
"alt": "{props.pictures.1.alt}",
|
|
4484
|
+
"fit": "cover"
|
|
4485
|
+
},
|
|
4486
|
+
"$a11y": {
|
|
4487
|
+
"hidden": true
|
|
4488
|
+
},
|
|
4489
|
+
"style": {
|
|
4490
|
+
"position": "absolute",
|
|
4491
|
+
"inset": 0,
|
|
4492
|
+
"width": "100%",
|
|
4493
|
+
"height": "100%"
|
|
4494
|
+
}
|
|
4495
|
+
}
|
|
4496
|
+
]
|
|
4497
|
+
},
|
|
4498
|
+
{
|
|
4499
|
+
"part": "side",
|
|
4500
|
+
"component": "Box",
|
|
4501
|
+
"$if": {
|
|
4502
|
+
"$lt": [
|
|
4503
|
+
2,
|
|
4504
|
+
"{len(props.pictures)}"
|
|
4505
|
+
]
|
|
4506
|
+
},
|
|
4507
|
+
"style": {
|
|
4508
|
+
"display": "flex",
|
|
4509
|
+
"flexDirection": "column",
|
|
4510
|
+
"flexGrow": 1,
|
|
4511
|
+
"flexShrink": 1,
|
|
4512
|
+
"flexBasis": 0,
|
|
4513
|
+
"minWidth": 0,
|
|
4514
|
+
"height": "100%"
|
|
4515
|
+
},
|
|
4516
|
+
"children": [
|
|
4517
|
+
{
|
|
4518
|
+
"part": "top",
|
|
4519
|
+
"component": "Box",
|
|
4520
|
+
"$if": "props.pictures.1",
|
|
4521
|
+
"props": {
|
|
4522
|
+
"pressable": true
|
|
4523
|
+
},
|
|
4524
|
+
"style": {
|
|
4525
|
+
"position": "relative",
|
|
4526
|
+
"overflow": "hidden",
|
|
4527
|
+
"minWidth": 0,
|
|
4528
|
+
"minHeight": 0,
|
|
4529
|
+
"cursor": "pointer",
|
|
4530
|
+
"flexGrow": 1,
|
|
4531
|
+
"flexShrink": 1,
|
|
4532
|
+
"flexBasis": 0,
|
|
4533
|
+
"width": "100%"
|
|
4534
|
+
},
|
|
4535
|
+
"$recipe": {
|
|
4536
|
+
"size": "small"
|
|
4537
|
+
},
|
|
4538
|
+
"$a11y": {
|
|
4539
|
+
"role": "button",
|
|
4540
|
+
"label": "{props.pictures.1.alt}"
|
|
4541
|
+
},
|
|
4542
|
+
"$on": {
|
|
4543
|
+
"press": "select"
|
|
4544
|
+
},
|
|
4545
|
+
"$context": {
|
|
4546
|
+
"index": 1
|
|
4547
|
+
},
|
|
4548
|
+
"children": [
|
|
4549
|
+
{
|
|
4550
|
+
"part": "image",
|
|
4551
|
+
"component": "Image",
|
|
4552
|
+
"props": {
|
|
4553
|
+
"src": "{props.pictures.1.src}",
|
|
4554
|
+
"alt": "{props.pictures.1.alt}",
|
|
4555
|
+
"fit": "cover"
|
|
4556
|
+
},
|
|
4557
|
+
"$a11y": {
|
|
4558
|
+
"hidden": true
|
|
4559
|
+
},
|
|
4560
|
+
"style": {
|
|
4561
|
+
"position": "absolute",
|
|
4562
|
+
"inset": 0,
|
|
4563
|
+
"width": "100%",
|
|
4564
|
+
"height": "100%"
|
|
4565
|
+
}
|
|
4566
|
+
}
|
|
4567
|
+
]
|
|
4568
|
+
},
|
|
4569
|
+
{
|
|
4570
|
+
"part": "bottom",
|
|
4571
|
+
"component": "Box",
|
|
4572
|
+
"$if": "props.pictures.2",
|
|
4573
|
+
"props": {
|
|
4574
|
+
"pressable": true
|
|
4575
|
+
},
|
|
4576
|
+
"style": {
|
|
4577
|
+
"position": "relative",
|
|
4578
|
+
"overflow": "hidden",
|
|
4579
|
+
"minWidth": 0,
|
|
4580
|
+
"minHeight": 0,
|
|
4581
|
+
"cursor": "pointer",
|
|
4582
|
+
"flexGrow": 1,
|
|
4583
|
+
"flexShrink": 1,
|
|
4584
|
+
"flexBasis": 0,
|
|
4585
|
+
"width": "100%"
|
|
4586
|
+
},
|
|
4587
|
+
"$recipe": {
|
|
4588
|
+
"size": "small"
|
|
4589
|
+
},
|
|
4590
|
+
"$a11y": {
|
|
4591
|
+
"role": "button",
|
|
4592
|
+
"label": {
|
|
4593
|
+
"$cond": [
|
|
4594
|
+
{
|
|
4595
|
+
"$lt": [
|
|
4596
|
+
3,
|
|
4597
|
+
"{len(props.pictures)}"
|
|
4598
|
+
]
|
|
4599
|
+
},
|
|
4600
|
+
{
|
|
4601
|
+
"$fill": [
|
|
4602
|
+
"$string.morePicturesLabel",
|
|
4603
|
+
{
|
|
4604
|
+
"alt": "{props.pictures.2.alt}",
|
|
4605
|
+
"count": {
|
|
4606
|
+
"$sub": [
|
|
4607
|
+
"{len(props.pictures)}",
|
|
4608
|
+
3
|
|
4609
|
+
]
|
|
4610
|
+
}
|
|
4611
|
+
}
|
|
4612
|
+
]
|
|
4613
|
+
},
|
|
4614
|
+
"{props.pictures.2.alt}"
|
|
4615
|
+
]
|
|
4616
|
+
}
|
|
4617
|
+
},
|
|
4618
|
+
"$on": {
|
|
4619
|
+
"press": "select"
|
|
4620
|
+
},
|
|
4621
|
+
"$context": {
|
|
4622
|
+
"index": 2
|
|
4623
|
+
},
|
|
4624
|
+
"children": [
|
|
4625
|
+
{
|
|
4626
|
+
"part": "image",
|
|
4627
|
+
"component": "Image",
|
|
4628
|
+
"props": {
|
|
4629
|
+
"src": "{props.pictures.2.src}",
|
|
4630
|
+
"alt": "{props.pictures.2.alt}",
|
|
4631
|
+
"fit": "cover"
|
|
4632
|
+
},
|
|
4633
|
+
"$a11y": {
|
|
4634
|
+
"hidden": true
|
|
4635
|
+
},
|
|
4636
|
+
"style": {
|
|
4637
|
+
"position": "absolute",
|
|
4638
|
+
"inset": 0,
|
|
4639
|
+
"width": "100%",
|
|
4640
|
+
"height": "100%"
|
|
4641
|
+
}
|
|
4642
|
+
},
|
|
4643
|
+
{
|
|
4644
|
+
"part": "more",
|
|
4645
|
+
"component": "Box",
|
|
4646
|
+
"$if": {
|
|
4647
|
+
"$lt": [
|
|
4648
|
+
3,
|
|
4649
|
+
"{len(props.pictures)}"
|
|
4650
|
+
]
|
|
4651
|
+
},
|
|
4652
|
+
"$a11y": {
|
|
4653
|
+
"hidden": true
|
|
4654
|
+
},
|
|
4655
|
+
"style": {
|
|
4656
|
+
"position": "absolute",
|
|
4657
|
+
"inset": 0,
|
|
4658
|
+
"display": "flex",
|
|
4659
|
+
"alignItems": "center",
|
|
4660
|
+
"justifyContent": "center"
|
|
4661
|
+
},
|
|
4662
|
+
"children": [
|
|
4663
|
+
{
|
|
4664
|
+
"part": "moreLabel",
|
|
4665
|
+
"component": "Text",
|
|
4666
|
+
"props": {
|
|
4667
|
+
"text": {
|
|
4668
|
+
"$fill": [
|
|
4669
|
+
"$string.morePictures",
|
|
4670
|
+
{
|
|
4671
|
+
"count": {
|
|
4672
|
+
"$sub": [
|
|
4673
|
+
"{len(props.pictures)}",
|
|
4674
|
+
3
|
|
4675
|
+
]
|
|
4676
|
+
}
|
|
4677
|
+
}
|
|
4678
|
+
]
|
|
4679
|
+
},
|
|
4680
|
+
"lines": 1
|
|
4681
|
+
}
|
|
4682
|
+
}
|
|
4683
|
+
]
|
|
4684
|
+
}
|
|
4685
|
+
]
|
|
4686
|
+
}
|
|
4687
|
+
]
|
|
4688
|
+
}
|
|
4689
|
+
]
|
|
4690
|
+
}
|
|
4150
4691
|
}
|
|
4151
4692
|
}
|
|
4152
4693
|
}
|