@exponential_app/eui 0.3.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/catalog/a11y.json +10 -0
- package/catalog/core.catalog.json +284 -6
- package/catalog/core.schema.json +437 -4
- package/catalog/layout.json +3 -2
- package/catalog/limits.json +10 -1
- package/catalog/macros.json +1 -0
- package/catalog/recipes.json +3 -1
- package/catalog/strings.json +9 -2
- package/catalog/style.json +21 -0
- package/catalog/theme.schema.json +4435 -3676
- package/conformance/manifest.json +2 -2
- 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-4z7f2bp1.js → index-4xczxey5.js} +35 -15
- package/dist/chunks/{index-4z7f2bp1.js.map → index-4xczxey5.js.map} +4 -4
- package/dist/chunks/{index-dx45asrf.js → index-5sjj5p84.js} +174 -8
- package/dist/chunks/{index-dx45asrf.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-abcjanhc.js → index-f9wkb6aq.js} +192 -3
- package/dist/chunks/{index-abcjanhc.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-h3zgfghf.js → index-vkn82srs.js} +179 -8
- package/dist/chunks/{index-h3zgfghf.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 +3154 -63
- 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 +3 -3
- package/dist/index.js +333 -98
- package/dist/index.js.map +4 -4
- package/dist/types/src/catalog.generated.d.ts +50 -4
- 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 +1 -1
- package/dist/types/src/web/primitives/dock.d.ts +5 -2
- package/dist/types/src/web/primitives/index.d.ts +2 -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/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 +165 -230
- package/dist/web/index.js.map +8 -9
- package/dist/web/primitives/index.js +584 -7
- package/dist/web/primitives/index.js.map +7 -6
- package/docs/components.generated.json +392 -4
- package/docs/round-6-contract.md +5 -3
- package/docs/themes.generated.json +27 -0
- package/fixtures/bind-time.json +4 -0
- package/fixtures/catalog-components.json +930 -16
- package/fixtures/catalog-macros.json +11 -0
- package/fixtures/conformance-baseline.json +33020 -32952
- package/fixtures/conformance-known.json +64 -70
- package/fixtures/kitchen-sink.expanded.json +72 -0
- package/fixtures/kitchen-sink.json +33 -0
- 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 +1 -0
- package/fixtures/prompt-budget.json +16 -16
- package/fixtures/specimens.json +717 -21
- package/fixtures/theme-recipes.json +1518 -32
- package/fixtures/theme-resolved.json +732 -56
- package/fixtures/zoom.json +1382 -0
- package/generated/ExponentialUICatalog.generated.kt +20 -20
- package/generated/ExponentialUICatalog.generated.swift +20 -20
- 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 +29 -29
- package/generated/catalog.themes.generated.rs +8 -8
- package/generated/core.descriptions.json +171 -5
- package/generated/core.runtime.json +189 -1
- package/package.json +1 -1
- package/themes/neutral.theme.json +172 -3
- package/dist/chunks/index-t6qz1770.js +0 -95
- package/dist/chunks/index-t6qz1770.js.map +0 -11
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/web/urls.ts", "../src/web/media.ts", "../src/web/primitives/measure.ts", "../src/web/primitives/voice-wave.ts", "../src/web/primitives/motion.ts", "../src/web/primitives/motion-paint.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"// VAPP-103: every href and every src the renderer emits passes the host\n// contract's policy (`catalog/host.json` urls / media): Link (external or\n// not), markdown links + images, FileUpload file urls, Image / Avatar /\n// Video / Audio. A denied href paints as text; a denied src loads nothing.\n// Relative urls resolve against the host's base (on the web, the\n// document's when the host sets none). VAPP-107: a private, loopback or\n// link-local host is denied unless the host's policy opts it in\n// (`allowPrivate`); the page's OWN host is opted in when it is private (a\n// dev server on localhost keeps its same-origin images and links), the LAN\n// and every other private host stay denied. Shared by React and Solid\n// (FEED-128): one filter, both renderers.\n\nimport { DEFAULT_MEDIA_SCHEMES, decideUrl, isPrivateHost, mediaRequest, safeHref, type MediaRequest, type UrlPolicy } from \"@exponential_app/eui\"\nimport type { AnyHostPlugin as HostPlugin } from \"./host-types\"\n\nconst documentBase = (): string | undefined => (typeof document !== `undefined` && document.baseURI ? document.baseURI : undefined)\n\n/** VAPP-107: the page's OWN host when it is private (a dev server on\n * localhost): the renderer opts it in on top of the host's `allowPrivate`,\n * exactly as the Exponential app's hosts opt their own origin in. The page\n * already runs there; nothing else private is reached. */\nexport function ownPrivateHosts(): string[] {\n try {\n const base = documentBase()\n if (!base) return []\n const host = new URL(base).hostname.toLowerCase()\n return isPrivateHost(host) ? [host] : []\n } catch {\n return []\n }\n}\n\nfunction withOwnOrigin(allow: readonly string[] | undefined): readonly string[] | undefined {\n const own = ownPrivateHosts()\n if (!own.length) return allow\n return [...(allow ?? []), ...own.filter((h) => !(allow ?? []).includes(h))]\n}\n\n/** The URL policy a plugin's hrefs pass. */\nexport function urlPolicyOf(host: HostPlugin): UrlPolicy {\n const urls = host.urls ?? {}\n const withBase = urls.baseUrl ? urls : { ...urls, baseUrl: host.media?.baseUrl ?? documentBase() }\n return { ...withBase, allowPrivate: withOwnOrigin(withBase.allowPrivate) }\n}\n\n/** The href a link may navigate to, or undefined (paint it as text). */\nexport function linkHref(host: HostPlugin, href: unknown): string | undefined {\n return safeHref(urlPolicyOf(host), href)\n}\n\n/** The media request for a src (`resolveUrl` rewrites first; the host's\n * `mediaRequest` or the plugin's `media` options build it), re-checked\n * against the media schemes/hosts so a host hook cannot widen them. Null =\n * nothing loads. */\nexport function mediaRequestOf(host: HostPlugin, src: unknown): MediaRequest | null {\n if (typeof src !== `string` || !src) return null\n const rewritten = host.resolveUrl ? host.resolveUrl(src) : src\n const req = host.mediaRequest ? host.mediaRequest(rewritten) : mediaRequest(rewritten, { baseUrl: documentBase(), ...host.media, allowPrivate: withOwnOrigin(host.media?.allowPrivate) })\n if (!req) return null\n return mediaUrlAllowed(host, req.url) ? req : null\n}\n\n/** Does an absolute media url pass the media schemes, hosts and private\n * opt-ins (VAPP-107; the page's own private host counts as opted in)? */\nexport function mediaUrlAllowed(host: HostPlugin, url: string): boolean {\n return decideUrl({ schemes: host.media?.schemes ?? DEFAULT_MEDIA_SCHEMES, hosts: host.media?.hosts, allowPrivate: withOwnOrigin(host.media?.allowPrivate) }, url).allowed\n}\n\n/** The default opener: only what the policy allows, in a new tab. */\nexport function openAllowed(host: HostPlugin, url: string): void {\n const href = linkHref(host, url)\n if (!href) return\n if (host.openUrl) host.openUrl(href)\n else if (typeof window !== `undefined`) window.open(href, `_blank`, `noopener,noreferrer`)\n}\n",
|
|
6
|
+
"// VAPP-91: the media loader. A source resolves through the host's\n// `mediaRequest` (absolute url + headers, the policy hook that adds auth for\n// /api/attachments) after `resolveUrl`, always under the media policy\n// (VAPP-103: schemes + hosts, `urls.ts`; a denied src loads nothing); a\n// request with headers is fetched once — under `MEDIA_LIMITS` (bytes,\n// timeout) — and shown as a blob url (an <img> cannot send headers). A\n// direct <img> load is the browser's (its own decode limits).\n//\n// Video/Audio are STREAMS (`kind: \"stream\"`, catalog/host.json: the policy\n// applies, the player's byte limits do not): a request with headers goes\n// to the host's `mediaStreamUrl` (a signed / cookie-authed url the player\n// streams and seeks, re-checked against the policy) when it has one, else\n// it is fetched whole into a blob url under `MEDIA_LIMITS.maxBytes` and a\n// `MEDIA_LIMITS.timeoutMs` total timeout (VAPP-107: a whole-fetch past\n// either fails like a 404; a long video needs `mediaStreamUrl`). No pixel\n// check on a stream. A poster is an image.\n//\n// Blob urls pin their bytes until revoked, so the cache is bounded: every\n// mounted consumer holds a reference; an entry nobody holds stays cached\n// (a re-mounted row, a virtualized list scrolling back, shows it at once)\n// until more than MEDIA_CACHE_IDLE_MAX idle entries exist, when the least\n// recently released one is dropped and its url revoked. An entry in use is\n// never evicted.\n//\n// FEED-128: hoisted from the React renderer: the cache, the fetchers and\n// `openMediaSource` (one source's plan + load) are framework-free; a\n// renderer wraps them in its reactivity (React: `useMediaSource`).\n\nimport { MEDIA_LIMITS, mediaImageWithinLimits } from \"@exponential_app/eui\"\nimport type { AnyHostPlugin as HostPlugin } from \"./host-types\"\nimport { mediaRequestOf, mediaUrlAllowed } from \"./urls\"\n\n/** What a source feeds: an image (the limits hold) or a player stream. */\nexport type MediaKind = `image` | `stream`\n\n/** How many fetched media nobody shows stay cached (their blob urls live). */\nexport const MEDIA_CACHE_IDLE_MAX = 64\n\nexport interface MediaCacheEntry {\n promise: Promise<string>\n /** Set once the fetch resolved. */\n url?: string\n /** Mounted consumers. */\n refs: number\n}\n\n/** Insertion order = recency (acquire/release move an entry to the end). */\nconst blobs = new Map<string, MediaCacheEntry>()\n\nexport function mediaCacheKey(url: string, headers: Record<string, string>): string {\n return `${url}\\n${JSON.stringify(headers)}`\n}\n\nfunction touch(k: string, e: MediaCacheEntry): void {\n blobs.delete(k)\n blobs.set(k, e)\n}\n\nexport function acquireMedia(k: string, load: () => Promise<string>): MediaCacheEntry {\n let e = blobs.get(k)\n if (!e) {\n const entry: MediaCacheEntry = { refs: 0, promise: Promise.resolve(``) }\n entry.promise = load().then((url) => {\n entry.url = url\n // Evicted (or failed over) while loading: nobody can use it.\n if (blobs.get(k) !== entry) URL.revokeObjectURL(url)\n return url\n })\n entry.promise.catch(() => {\n if (blobs.get(k) === entry) blobs.delete(k)\n })\n e = entry\n }\n e.refs += 1\n touch(k, e)\n return e\n}\n\nexport function releaseMedia(k: string, e: MediaCacheEntry): void {\n e.refs -= 1\n if (e.refs > 0 || blobs.get(k) !== e) return\n touch(k, e)\n let idle = 0\n for (const v of blobs.values()) if (v.refs === 0) idle += 1\n for (const [ok, v] of blobs) {\n if (idle <= MEDIA_CACHE_IDLE_MAX) break\n if (v.refs > 0) continue\n blobs.delete(ok)\n if (v.url) URL.revokeObjectURL(v.url)\n idle -= 1\n }\n}\n\n/** The cache's size (tests). */\nexport function mediaCacheStats(): { entries: number; inUse: number } {\n let inUse = 0\n for (const v of blobs.values()) if (v.refs > 0) inUse += 1\n return { entries: blobs.size, inUse }\n}\n\n/** Drop every idle entry and revoke its url (tests, a host that logs out). */\nexport function clearMediaCache(): void {\n for (const [k, v] of blobs) {\n if (v.refs > 0) continue\n blobs.delete(k)\n if (v.url) URL.revokeObjectURL(v.url)\n }\n}\n\n/** One source, planned: `direct` = the url to use as is (no headers, or\n * undefined when the policy denies it), `denied` = the policy refused a\n * non-empty src, `key` = the cache identity of a FETCHED source ('' when\n * direct), `open()` = start (or join) its load: the url promise and the\n * release a consumer calls when it unmounts. */\nexport interface MediaSourcePlan {\n fetched: boolean\n key: string\n direct: string | undefined\n denied: boolean\n open: () => { promise: Promise<string>; release: () => void }\n}\n\nexport function openMediaSource(host: HostPlugin, src: string, kind: MediaKind = `image`): MediaSourcePlan {\n const req = mediaRequestOf(host, src)\n const headers = req?.headers ?? {}\n const fetched = req !== null && Object.keys(headers).length > 0\n const k = fetched ? `${kind}\\n${mediaCacheKey(req.url, headers)}` : ``\n return {\n fetched,\n key: k,\n direct: req ? req.url : undefined,\n denied: Boolean(src) && req === null,\n open: () => {\n if (!req || !fetched) return { promise: Promise.resolve(req ? req.url : ``), release: () => {} }\n const hosted = kind === `stream` && host.mediaStreamUrl !== undefined\n const allowed = (url: string) => mediaUrlAllowed(host, url)\n const entry = hosted ? streamEntry(host, req) : acquireMedia(k, () => (kind === `stream` ? fetchStream(req.url, headers, MEDIA_LIMITS, allowed) : fetchLimited(req.url, headers, MEDIA_LIMITS, true, allowed)).then((b) => URL.createObjectURL(b)))\n return { promise: entry.promise, release: hosted ? () => {} : () => releaseMedia(k, entry) }\n },\n }\n}\n\n/** A host stream url (never cached here, never revoked: the host owns\n * it), re-checked against the media policy. */\nexport function streamEntry(host: HostPlugin, req: { url: string; headers: Record<string, string> }): MediaCacheEntry {\n const promise = Promise.resolve(host.mediaStreamUrl!(req)).then((url) => {\n if (typeof url !== `string` || !mediaUrlAllowed(host, url)) throw new Error(`stream url denied by the media policy`)\n return url\n })\n return { promise, refs: 0 }\n}\n\n/** A Video/Audio fetch (no `mediaStreamUrl`): the whole body into a blob\n * under `maxBytes` (Content-Length up front, then as it streams) and\n * `timeoutMs` for the WHOLE download (VAPP-107); no pixel check. */\nexport function fetchStream(url: string, headers: Record<string, string>, limits: { maxBytes: number; timeoutMs: number } = MEDIA_LIMITS, allowed: (url: string) => boolean = defaultAllowed): Promise<Blob> {\n return fetchLimited(url, headers, { ...limits, maxPixels: Infinity }, false, allowed)\n}\n\n/** The plain media policy (default schemes, the page's own private host). */\nfunction defaultAllowed(url: string): boolean {\n return mediaUrlAllowed({} as HostPlugin, url)\n}\n\n/** A fetch under `MEDIA_LIMITS`: the whole request within `timeoutMs`, the\n * body (Content-Length up front, then as it streams) within `maxBytes`, an\n * image's width × height × frames within `maxPixels` before any decode\n * (`mediaImageWithinLimits`: SVG sizes count, an unreadable raster is\n * refused; `image = false` skips that check: a stream's bytes are not\n * an image). A redirected response's final url must pass `allowed` (the\n * host's media policy) or the load fails before a byte is read. */\nexport async function fetchLimited(url: string, headers: Record<string, string>, limits: { maxBytes: number; timeoutMs: number; maxPixels: number } = MEDIA_LIMITS, image = true, allowed: (url: string) => boolean = defaultAllowed): Promise<Blob> {\n const abort = new AbortController()\n const timer = setTimeout(() => abort.abort(new Error(`media timed out after ${limits.timeoutMs} ms`)), limits.timeoutMs)\n const over = () => new Error(`media is over ${limits.maxBytes} bytes`)\n try {\n const r = await fetch(url, { headers, signal: abort.signal })\n // Release train 2026-10-23: fetch follows redirects on its own, so a\n // public url answering 302 → http://127.0.0.1/ must be re-policed\n // (catalog/host.json media: a redirect hop passes the same rules).\n if (r.redirected && !allowed(r.url)) {\n abort.abort()\n throw new Error(`media redirect denied by the media policy`)\n }\n if (!r.ok) throw new Error(`HTTP ${r.status}`)\n if (Number(r.headers.get(`content-length`) ?? NaN) > limits.maxBytes) throw over()\n const chunks: Uint8Array[] = []\n let total = 0\n if (r.body) {\n const reader = r.body.getReader()\n for (;;) {\n const { done, value } = await reader.read()\n if (done) break\n total += value.byteLength\n if (total > limits.maxBytes) {\n abort.abort()\n throw over()\n }\n chunks.push(value)\n }\n } else {\n const all = new Uint8Array(await r.arrayBuffer())\n if (all.byteLength > limits.maxBytes) throw over()\n chunks.push(all)\n }\n // The whole body: SVG sizes, animation frames and unreadable rasters\n // follow the core's pixel × frame rule (gpui, SwiftUI, Compose alike).\n if (image) {\n const refused = mediaImageWithinLimits(chunks.length === 1 ? chunks[0]! : concat(chunks), limits)\n if (refused) throw new Error(refused)\n }\n return new Blob(chunks as BlobPart[], { type: r.headers.get(`content-type`) ?? `` })\n } finally {\n clearTimeout(timer)\n }\n}\n\nfunction concat(chunks: readonly Uint8Array[]): Uint8Array {\n const out = new Uint8Array(chunks.reduce((n, c) => n + c.byteLength, 0))\n let at = 0\n for (const c of chunks) {\n out.set(c, at)\n at += c.byteLength\n }\n return out\n}\n\n",
|
|
7
|
+
"// NEW-82: element measurements in LAYOUT px, framework-free (the React and\n// Solid renderers share them). `getBoundingClientRect()` is in VISUAL px: it\n// includes CSS `zoom` and transforms, while everything a painter lays out\n// (an SVG viewBox, a breakpoint, a translateY, a scrollTop) is in the\n// element's own unzoomed CSS px. Inside a `zoom: 0.76` phone frame a 200 px\n// box reads 152 from the rect.\n//\n// The rect stays the source whenever it agrees with the layout box (no\n// zoom, no transform): its FRACTIONAL width is what the renderers measured\n// before, so an unscaled page measures byte-identically. A scaled element\n// reads the ResizeObserver entry's `borderBoxSize` (fractional, unzoomed),\n// else the rect divided by `currentCSSZoom` when that alone explains the\n// difference, else `offsetWidth`/`offsetHeight` (whole px). The two\n// divided reads snap to Blink's 1/64 px LayoutUnit: un-zooming is a float\n// division (700 px under `zoom: 0.76` reads 700.0000087…).\n\nexport interface LayoutSize {\n width: number\n height: number\n}\n\n/** Within a pixel: `offsetWidth` is the layout box snapped to whole px. */\nconst near = (a: number, b: number) => Math.abs(a - b) < 1\nconst unit = (v: number) => Math.round(v * 64) / 64\nconst sized = (width: number, height: number): LayoutSize => ({ width: unit(width), height: unit(height) })\n\n/** An element's border box in layout (unzoomed, untransformed) CSS px.\n * `entry` = the ResizeObserver entry of this element, when there is one. */\nexport function layoutSize(el: HTMLElement, entry?: ResizeObserverEntry): LayoutSize {\n const r = el.getBoundingClientRect()\n const ow = el.offsetWidth\n const oh = el.offsetHeight\n // No offset box (jsdom, no layout): the rect is all there is.\n if (ow === 0 && oh === 0) return { width: r.width, height: r.height }\n if (near(r.width, ow) && near(r.height, oh)) return { width: r.width, height: r.height }\n const box = entry?.borderBoxSize?.[0]\n if (box) {\n if (near(box.inlineSize, ow) && near(box.blockSize, oh)) return sized(box.inlineSize, box.blockSize)\n // A vertical writing mode: inline = height.\n if (near(box.blockSize, ow) && near(box.inlineSize, oh)) return sized(box.blockSize, box.inlineSize)\n }\n const zoom = (el as HTMLElement & { currentCSSZoom?: number }).currentCSSZoom\n if (zoom && zoom !== 1 && near(r.width / zoom, ow) && near(r.height / zoom, oh)) return sized(r.width / zoom, r.height / zoom)\n return { width: ow, height: oh }\n}\n\n/** Visual px per layout px on one axis: 1 when they agree within a pixel\n * (an unscaled element maps byte-identically), else `visual / layout`.\n * Divide a visual delta (a pointer offset, a rect difference) by it. */\nexport function visualScale(visual: number, layout: number): number {\n return layout > 0 && !near(visual, layout) ? visual / layout : 1\n}\n\n/** `visualScale` of an element: its rect over its offset box. */\nexport function elementScale(el: HTMLElement, rect: DOMRect = el.getBoundingClientRect()): { x: number; y: number } {\n return { x: visualScale(rect.width, el.offsetWidth), y: visualScale(rect.height, el.offsetHeight) }\n}\n",
|
|
8
|
+
"// NEW-77: THE voice level (catalog/style.json `voiceWave`): three closed\n// polar waves around one optional centre child. The geometry is the core's\n// `voiceWave` (src/voice-wave.ts, fixtures/voice-wave.json; the painters\n// import it from `@exponential_app/eui`, never through here, so this barrel\n// does not carry style.json); this module holds what both web painters\n// share: the size enum's px (the neutral theme's `VoiceWave/root` edges),\n// the clock that drives the phase, the accessible name and the class\n// recipes. Colours follow the theme's\n// recipe: outer = info (blue-500, the exponential theme's `info`), mid +\n// inner = primary, all muted-foreground and the whole wave at .35 opacity\n// while idle or muted.\n\nimport type { VoiceWaveActivity, VoiceWaveRingName } from \"../../voice-wave\"\n\nexport type { VoiceWaveActivity, VoiceWaveRingName } from \"../../voice-wave\"\n\nexport const VOICE_WAVE_SIZES = [`sm`, `md`, `lg`, `xl`] as const\nexport type VoiceWaveSize = (typeof VOICE_WAVE_SIZES)[number]\n\n/** The box edge per size (px): the `VoiceWave/root` recipe's width. */\nexport const VOICE_WAVE_SIZE_PX: Readonly<Record<VoiceWaveSize, number>> = { sm: 32, md: 56, lg: 160, xl: 200 }\n\n/** Whether `activity` moves the waves (listening, thinking, speaking). */\nexport function voiceWaveAnimates(activity: VoiceWaveActivity): boolean {\n return activity === `listening` || activity === `thinking` || activity === `speaking`\n}\n\n/** Idle and muted paint quiet: muted colours, the wave at .35 opacity (an\n * unknown activity is idle, as in the core). */\nexport function voiceWaveQuiet(activity: VoiceWaveActivity): boolean {\n return !voiceWaveAnimates(activity)\n}\n\nconst NAMED: readonly string[] = [`idle`, `listening`, `thinking`, `speaking`, `muted`]\n\n/** The accessible name (a11y.json `VoiceWave`): the label with the activity\n * appended (`Voice, listening`); none without a label (decorative). */\nexport function voiceWaveName(label: string | undefined, activity: VoiceWaveActivity): string | undefined {\n return label ? `${label}, ${NAMED.includes(activity) ? activity : `idle`}` : undefined\n}\n\n/** Calls `onFrame(elapsed seconds)` on every animation frame after the\n * first (the first frame is the clock's zero, already painted); returns\n * the stop. Without `requestAnimationFrame` (SSR) it never ticks. */\nexport function voiceWaveClock(onFrame: (elapsed: number) => void): () => void {\n if (typeof requestAnimationFrame !== `function`) return () => {}\n let start: number | null = null\n let id = 0\n const tick = (now: number) => {\n if (start === null) start = now\n else onFrame((now - start) / 1000)\n id = requestAnimationFrame(tick)\n }\n id = requestAnimationFrame(tick)\n return () => cancelAnimationFrame(id)\n}\n\n/** THE CHILD RULE's painter half (catalog/style.json `voiceWave`): the child\n * is laid out centred at its own size; this measures its own (untransformed)\n * border box and draws it scaled about its centre (= the box centre) by\n * `scaleOf(its size)` (the core's `voiceWaveChildBox(size, child).scale`:\n * min(1, childSize / its longer edge), 0 at `sm`). Re-measures on every\n * resize (ResizeObserver: before the first paint); without one (SSR,\n * jsdom) it measures once. Returns the stop. */\nexport function voiceWaveFitChild(el: HTMLElement, scaleOf: (child: { width: number; height: number }) => number): () => void {\n const apply = (width: number, height: number) => {\n const s = scaleOf({ width, height })\n el.style.transform = s === 1 ? `` : `scale(${s})`\n }\n if (typeof ResizeObserver !== `function`) {\n apply(el.offsetWidth, el.offsetHeight)\n return () => {}\n }\n const ro = new ResizeObserver((entries) => {\n const e = entries[entries.length - 1]!\n const b = e.borderBoxSize?.[0]\n if (b) apply(b.inlineSize, b.blockSize)\n else apply(el.offsetWidth, el.offsetHeight)\n })\n ro.observe(el, { box: `border-box` })\n return () => ro.disconnect()\n}\n\nexport const VOICE_WAVE_CLASSES = {\n root: `relative inline-flex shrink-0 items-center justify-center`,\n quiet: `opacity-35`,\n size: { sm: `size-8`, md: `size-14`, lg: `size-40`, xl: `size-50` } satisfies Record<VoiceWaveSize, string>,\n svg: `pointer-events-none absolute inset-0 size-full overflow-visible`,\n ring: { outer: `text-blue-500`, mid: `text-primary`, inner: `text-primary` } satisfies Record<VoiceWaveRingName, string>,\n ringQuiet: `text-muted-foreground`,\n child: `relative flex shrink-0 items-center justify-center text-foreground`,\n /** At `sm` (childSize 0): kept, painted nothing, no hit target. */\n childHidden: `invisible pointer-events-none`,\n childMuted: `text-muted-foreground`,\n} as const\n",
|
|
9
|
+
"// EXP-1604: the `Motion` native's web half, shared by React, Solid and\n// <exponential-surface> (eui-motion README.md › Painting a Motion). The\n// framework wrappers render `<span role=img><canvas/></span>` and hand both\n// elements to a `MotionView`; it owns everything else:\n//\n// 1. Source → Lottie: `layers` (the dialect document) → the WASM `compile`;\n// `lottie` as is; `src` fetched under the host's media policy (`.json`, or\n// a `.lottie` archive: its first animation, images inlined).\n// 2. Load with slot overrides: every `$color.<token>` slot = the theme's\n// colour for the mode; `$mode: dark`; the node's `slots` last. Reloads on\n// theme / mode / slots changes.\n// 3. Clock: the engine's (`setPlayback` + `tick(ms)`); `progress` scrubs,\n// `play: false` freezes; reduced motion, autoplay off, off-screen\n// (IntersectionObserver) or a hidden document → the poster, no ticking;\n// ≤ 60 fps; ≤ 8 animating per surface (tree order); a finished finite\n// loop stops.\n// 4. Box: the wrapper sizes it (`motionBoxStyle`); the canvas fills it at\n// devicePixelRatio, the composition fitted (contain | cover | fill).\n// 5. Interactivity (M4, EXP-1605, README › Interactivity): the state machine\n// (`stateMachine`, else a `.lottie` src's first) runs IN THE ENGINE; this\n// file only posts interactions / inputs to it (`MotionStateDriver`) and\n// turns its status into the node's `on` events (press, hover, visible,\n// complete, state). The wrappers hand an `emit` (their A2UI action\n// plumbing) and whether `on.press` makes the Motion a button.\n//\n// The WASM (and its JS glue) is imported lazily on the first Motion that\n// paints: never in a host's initial bundle; bundlers emit the .wasm as a\n// hashed asset (`new URL(…, import.meta.url)` in the glue).\n//\n// Without IntersectionObserver or requestAnimationFrame (SSR, jsdom) it\n// paints nothing and loads nothing.\n\n// The package root is external to the web entries (like web/media.ts):\n// importing ../../theme here would bundle the whole catalog.\nimport { MEDIA_LIMITS, parseColor, resolveToken, type ModeName, type ResolvedTheme } from \"@exponential_app/eui\"\nimport type { HostPlugin } from \"../host-types\"\nimport { fetchLimited } from \"../media\"\nimport { mediaRequestOf, mediaUrlAllowed } from \"../urls\"\nimport { MotionCanvasPool, motionConcat, motionFitMatrix, paintMotionFrame, type MotionFit, type MotionImageSource } from \"./motion-paint\"\n\nexport { paintMotionFrame, motionFitMatrix, motionConcat, motionFrameSize, MotionCanvasPool } from \"./motion-paint\"\nexport type { MotionFit, MotionMatrix } from \"./motion-paint\"\n\n/** At most this many Motions animate per surface (tree order). */\nexport const MOTION_MAX_PLAYING = 8\n/** At most this many frames per second. */\nexport const MOTION_MAX_FPS = 60\n\nexport interface MotionEnv {\n theme: ResolvedTheme\n mode: ModeName\n reducedMotion: boolean\n host: HostPlugin\n /** A load failure (the box stays empty): the wrapper reports it as a paint error. */\n onError?: (message: string) => void\n /** The node's `on` events (the wrapper's A2UI action plumbing). */\n emit?: MotionEmit\n /** `on.press` is set: the Motion is a button (Enter / Space press it). */\n pressable?: boolean\n}\n\n/** The events a Motion fires (its `on`); `state` carries `{state}`. */\nexport type MotionEvent = `press` | `hover` | `visible` | `complete` | `state`\nexport type MotionEmit = (event: MotionEvent, payload?: Record<string, unknown>) => void\n\ntype Props = Record<string, unknown>\ntype Player = import(\"../../motion/wasm\").MotionBindings[`MotionPlayer`][`prototype`]\n\nconst DIALECT_KEYS = [`size`, `fps`, `duration`, `start`, `time`, `name`, `layers`, `assets`, `markers`] as const\nconst PLAYBACK_KEYS = [`autoplay`, `loop`, `plays`, `direction`, `speed`, `segment`, `marker`, `poster`] as const\n\nconst isObj = (v: unknown): v is Record<string, unknown> => typeof v === `object` && v !== null && !Array.isArray(v)\n\n/** The composition size a node declares without loading anything (the\n * dialect's `size`, an inline Lottie's `w`/`h`); null for `src`. */\nexport function motionDeclaredSize(props: Props): [number, number] | null {\n if (Array.isArray(props.layers)) {\n const s = props.size\n if (Array.isArray(s) && typeof s[0] === `number` && typeof s[1] === `number` && s[0] > 0 && s[1] > 0) return [s[0], s[1]]\n return null\n }\n if (isObj(props.lottie)) {\n const { w, h } = props.lottie\n if (typeof w === `number` && typeof h === `number` && w > 0 && h > 0) return [w, h]\n }\n return null\n}\n\n/** Contract §4 (shared with eui-core's layout): an unstyled box is the\n * composition's px width, shrinking to the available width, aspect kept;\n * a style width or height wins (the aspect still fills the other edge). */\nexport function motionBoxStyle(size: [number, number] | null, nodeStyle: unknown): Record<string, string> {\n const style = isObj(nodeStyle) ? nodeStyle : {}\n const hasW = style.width !== undefined\n const hasH = style.height !== undefined\n const out: Record<string, string> = {}\n if (!size) return out\n if (!hasW && !hasH) {\n out.width = `${size[0]}px`\n out.maxWidth = `100%`\n }\n if (!(hasW && hasH)) out.aspectRatio = `${size[0]} / ${size[1]}`\n return out\n}\n\n/** The fit prop, defaulted. */\nexport function motionFit(value: unknown): MotionFit {\n return value === `cover` || value === `fill` ? value : `contain`\n}\n\n/** Contract §6: role img named by `label`; hidden (decorative) without one.\n * M4 §4: with `on.press` (`pressable`) a focusable button named by `label`. */\nexport function motionA11y(label: unknown, pressable = false): { role?: `img` | `button`; tabIndex?: number; \"aria-label\"?: string; \"aria-hidden\"?: `true` } {\n const named = typeof label === `string` && label\n if (pressable) return named ? { role: `button`, tabIndex: 0, \"aria-label\": label } : { role: `button`, tabIndex: 0 }\n return named ? { role: `img`, \"aria-label\": label } : { \"aria-hidden\": `true` }\n}\n\n/** The theme's slot overrides for `slotIds` (contract §2). */\nexport function motionThemeSlots(slotIds: readonly string[], theme: ResolvedTheme, mode: ModeName, own: unknown): Record<string, unknown> {\n const out: Record<string, unknown> = {}\n for (const id of slotIds) {\n if (!id.startsWith(`$color.`)) continue\n const c = parseColor(resolveToken(theme, id, mode))\n if (c) out[id] = { p: { a: 0, k: [c.r / 255, c.g / 255, c.b / 255, c.a] } }\n }\n if (mode === `dark`) out.$mode = `dark`\n if (isObj(own)) Object.assign(out, own)\n return out\n}\n\n// --- Surfaces: ≤ 8 animating, tree order -------------------------------------\n\nconst surfaces = new Map<Node, Set<MotionView>>()\nlet hiddenListeners = 0\nconst hiddenWatchers = new Set<MotionView>()\nconst onVisibility = () => hiddenWatchers.forEach((v) => v.schedule())\n\nfunction surfaceOf(el: Element): Node {\n return el.closest(`[data-xui-surface]`) ?? el.ownerDocument\n}\n\nfunction granted(view: MotionView, surface: Node): boolean {\n const set = surfaces.get(surface)\n if (!set) return false\n const live = [...set].filter((v) => v.root.isConnected)\n if (live.length <= MOTION_MAX_PLAYING) return set.has(view)\n live.sort((a, b) => (a.root.compareDocumentPosition(b.root) & Node.DOCUMENT_POSITION_FOLLOWING ? -1 : 1))\n return live.indexOf(view) < MOTION_MAX_PLAYING\n}\n\n/** Whether this environment paints Motions at all. */\nexport function motionCanPaint(): boolean {\n return typeof IntersectionObserver === `function` && typeof requestAnimationFrame === `function` && typeof Path2D === `function`\n}\n\n// --- dotLottie (zip) ---------------------------------------------------------\n\nasync function inflate(data: Uint8Array, method: number): Promise<Uint8Array> {\n if (method === 0) return data\n if (method !== 8 || typeof DecompressionStream !== `function`) throw new Error(`unsupported .lottie compression`)\n const stream = new Blob([data as BlobPart]).stream().pipeThrough(new DecompressionStream(`deflate-raw`))\n return new Uint8Array(await new Response(stream).arrayBuffer())\n}\n\n/** The entries of a zip archive (central directory). */\nasync function unzip(bytes: Uint8Array): Promise<Map<string, Uint8Array>> {\n const dv = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength)\n let eocd = -1\n for (let k = bytes.length - 22; k >= Math.max(0, bytes.length - 65557); k--) {\n if (dv.getUint32(k, true) === 0x06054b50) {\n eocd = k\n break\n }\n }\n if (eocd < 0) throw new Error(`not a .lottie archive`)\n const count = dv.getUint16(eocd + 10, true)\n let p = dv.getUint32(eocd + 16, true)\n const out = new Map<string, Uint8Array>()\n const dec = new TextDecoder()\n for (let k = 0; k < count; k++) {\n if (dv.getUint32(p, true) !== 0x02014b50) break\n const method = dv.getUint16(p + 10, true)\n const size = dv.getUint32(p + 20, true)\n const nameLen = dv.getUint16(p + 28, true)\n const extraLen = dv.getUint16(p + 30, true)\n const commentLen = dv.getUint16(p + 32, true)\n const local = dv.getUint32(p + 42, true)\n const name = dec.decode(bytes.subarray(p + 46, p + 46 + nameLen))\n const start = local + 30 + dv.getUint16(local + 26, true) + dv.getUint16(local + 28, true)\n if (!name.endsWith(`/`)) out.set(name, await inflate(bytes.subarray(start, start + size), method))\n p += 46 + nameLen + extraLen + commentLen\n }\n return out\n}\n\nfunction base64(bytes: Uint8Array): string {\n let s = ``\n for (let k = 0; k < bytes.length; k += 0x8000) s += String.fromCharCode(...bytes.subarray(k, k + 0x8000))\n return btoa(s)\n}\n\n/** A .lottie archive's first animation as Lottie JSON, its images inlined. */\nexport async function motionFromDotLottie(bytes: Uint8Array): Promise<string> {\n return (await motionDotLottie(bytes)).lottie\n}\n\n/** A .lottie archive's first animation (Lottie JSON, images inlined) and its\n * first state machine (dotLottie 2 `s/<id>.json`, v1 `states/`), or null. */\nexport async function motionDotLottie(bytes: Uint8Array): Promise<{ lottie: string; stateMachine: Record<string, unknown> | null }> {\n const files = await unzip(bytes)\n const dec = new TextDecoder()\n const manifest = files.get(`manifest.json`) ? (JSON.parse(dec.decode(files.get(`manifest.json`))) as { animations?: { id?: string }[]; stateMachines?: { id?: string }[]; states?: (string | { id?: string })[] }) : {}\n const id = manifest.animations?.[0]?.id\n const anims = [...files.keys()].filter((n) => /^(animations|a)\\/[^/]+\\.json$/.test(n))\n const name = (id && anims.find((n) => n.endsWith(`/${id}.json`))) || anims[0]\n if (!name) throw new Error(`the .lottie archive has no animation`)\n const lottie = JSON.parse(dec.decode(files.get(name))) as { assets?: Record<string, unknown>[] }\n for (const a of lottie.assets ?? []) {\n const p = a.p\n if (typeof p !== `string` || p.startsWith(`data:`) || a.layers) continue\n const file = files.get(`images/${p}`) ?? files.get(`i/${p}`)\n if (!file) continue\n const ext = p.split(`.`).pop()?.toLowerCase()\n const mime = ext === `jpg` || ext === `jpeg` ? `image/jpeg` : ext === `webp` ? `image/webp` : ext === `svg` ? `image/svg+xml` : `image/png`\n a.p = `data:${mime};base64,${base64(file)}`\n a.u = ``\n a.e = 1\n }\n const first = manifest.stateMachines?.[0]?.id ?? manifest.states?.map((s) => (typeof s === `string` ? s : s.id))[0]\n const machines = [...files.keys()].filter((n) => /^(s|states)\\/[^/]+\\.json$/.test(n))\n const smName = (first && machines.find((n) => n.endsWith(`/${first}.json`))) || machines[0]\n let stateMachine: Record<string, unknown> | null = null\n if (smName) {\n try {\n const v = JSON.parse(dec.decode(files.get(smName))) as unknown\n if (isObj(v)) stateMachine = v\n } catch {\n // A broken machine: the animation still plays on its props.\n }\n }\n return { lottie: JSON.stringify(lottie), stateMachine }\n}\n\n// --- State machines (M4) -----------------------------------------------------\n\n/** The engine's state-machine API (the WASM `MotionPlayer`). */\nexport interface MotionMachinePlayer {\n setStateMachine(json: string): boolean\n smPost(kind: string, layer: string): boolean\n smSetInputs(json: string): boolean\n smStatus(): string\n}\n\n/** A Motion's state machine half (README › Interactivity §1–4). The engine\n * interprets the machine; this posts interactions and inputs to it, restarts\n * the clock when the state changes and turns its status into events:\n * `state` for every entered state (`{state}`), `complete` once per state\n * when its play finished or it is final. Without a machine it still reports\n * `complete` for a finished finite play. */\nexport class MotionStateDriver {\n private machineKey = ``\n private inputsKey = ``\n private completeSent = false\n running = false\n\n constructor(\n private readonly player: MotionMachinePlayer,\n private readonly emit: MotionEmit,\n /** The state changed: restart the clock at 0. */\n private readonly restart: () => void\n ) {}\n\n /** Start (or restart, when its JSON changed) the machine; null = none.\n * Returns whether one runs (its state's playback replaces the props'). */\n setMachine(machine: unknown): boolean {\n const key = isObj(machine) ? JSON.stringify(machine) : ``\n if (key === this.machineKey) return this.running\n this.machineKey = key\n this.inputsKey = ``\n // `{}` parses to no machine: the engine drops the old one.\n this.running = this.player.setStateMachine(key || `{}`)\n if (this.running) this.changed()\n this.drain()\n return this.running\n }\n\n /** The node's `inputs` (literal or bound): written on every change. */\n setInputs(inputs: unknown): void {\n if (!this.running || !isObj(inputs)) return\n const key = JSON.stringify(inputs)\n if (key === this.inputsKey) return\n this.inputsKey = key\n if (this.player.smSetInputs(key)) this.changed()\n this.drain()\n }\n\n /** An interaction (`click`, `pointerDown`, `pointerUp`, `pointerEnter`, `pointerExit`). */\n post(kind: string, layer = ``): void {\n if (!this.running) return\n if (this.player.smPost(kind, layer)) this.changed()\n this.drain()\n }\n\n /** The clock reported `done` for the current play. */\n done(): void {\n if (!this.completeSent) {\n this.completeSent = true\n this.emit(`complete`)\n }\n this.post(`complete`)\n }\n\n /** A new play without a machine (the playback props changed). */\n replay(): void {\n if (!this.running) this.completeSent = false\n }\n\n private changed(): void {\n this.completeSent = false\n this.restart()\n }\n\n private drain(): void {\n if (!this.running) return\n const status = JSON.parse(this.player.smStatus()) as { entered?: string[]; final?: boolean } | null\n for (const state of status?.entered ?? []) this.emit(`state`, { state })\n if (status?.final && !this.completeSent) {\n this.completeSent = true\n this.emit(`complete`)\n }\n }\n}\n\n// --- The view ----------------------------------------------------------------\n\nlet themeIds = new WeakMap<object, number>()\nlet nextThemeId = 1\nconst themeId = (t: object) => {\n let id = themeIds.get(t)\n if (!id) themeIds.set(t, (id = nextThemeId++))\n return id\n}\n\n/** One Motion on the page: load, clock, paint. `update` on every prop or\n * environment change; `destroy` on unmount. */\nexport class MotionView {\n private props: Props = {}\n private nodeStyle: unknown = undefined\n private env: MotionEnv | null = null\n private sourceKey = ``\n private slotsKey = ``\n private playbackKey = ``\n private generation = 0\n private lottie: string | null = null\n /** A `.lottie` src's first state machine. */\n private fileMachine: Record<string, unknown> | null = null\n private driver: MotionStateDriver | null = null\n private halfSeen = false\n private visibleSent = false\n private slotIds: string[] = []\n private player: Player | null = null\n private images: (MotionImageSource | null)[] = []\n private pool = new MotionCanvasPool()\n private io: IntersectionObserver | null = null\n private ro: ResizeObserver | null = null\n private visible = false\n private surface: Node | null = null\n private raf = 0\n private last = 0\n private lastPaint = -Infinity\n private elapsed = 0\n private finished = false\n private restarts = 0\n private inTick = false\n private painted = ``\n private destroyed = false\n\n constructor(\n readonly root: HTMLElement,\n readonly canvas: HTMLCanvasElement\n ) {\n // M4 §3–4: interactions reach the machine and the node's `on` even\n // where nothing paints (the events need no player).\n root.addEventListener(`click`, this.onClick)\n root.addEventListener(`keydown`, this.onKey)\n root.addEventListener(`pointerdown`, this.onPointer)\n root.addEventListener(`pointerup`, this.onPointer)\n root.addEventListener(`pointerenter`, this.onPointer)\n root.addEventListener(`pointerleave`, this.onPointer)\n if (!motionCanPaint()) return\n this.io = new IntersectionObserver(\n (entries) => {\n const e = entries[entries.length - 1]\n this.visible = Boolean(e?.isIntersecting)\n // `visible`: the first time half of it is on screen.\n if (e && e.isIntersecting && e.intersectionRatio >= 0.5) this.halfSeen = true\n this.flushVisible()\n this.schedule()\n },\n { threshold: [0, 0.5] }\n )\n this.io.observe(root)\n if (typeof ResizeObserver === `function`) {\n this.ro = new ResizeObserver(() => this.repaint())\n this.ro.observe(root)\n }\n hiddenWatchers.add(this)\n if (hiddenListeners++ === 0) document.addEventListener(`visibilitychange`, onVisibility)\n }\n\n /** `nodeStyle` = the node's own `style` (a style width/height wins over the composition size). */\n update(props: Props, env: MotionEnv, nodeStyle?: unknown): void {\n if (this.destroyed) return\n this.props = props\n this.nodeStyle = nodeStyle\n this.env = env\n if (!this.io) return\n this.flushVisible()\n const sourceKey = Array.isArray(props.layers)\n ? `d:${JSON.stringify(Object.fromEntries(DIALECT_KEYS.map((k) => [k, props[k]])))}`\n : isObj(props.lottie)\n ? `l:${JSON.stringify(props.lottie)}`\n : typeof props.src === `string` && props.src\n ? `s:${props.src}`\n : ``\n const slotsKey = `${themeId(env.theme)}:${env.mode}:${JSON.stringify(props.slots ?? null)}`\n if (sourceKey !== this.sourceKey) {\n this.sourceKey = sourceKey\n this.slotsKey = slotsKey\n void this.load()\n return\n }\n if (slotsKey !== this.slotsKey) {\n this.slotsKey = slotsKey\n this.instantiate()\n return\n }\n this.applyMachine()\n this.applyPlayback()\n this.schedule()\n }\n\n private emit(event: MotionEvent, payload?: Record<string, unknown>): void {\n if (!this.destroyed) this.env?.emit?.(event, payload)\n }\n\n /** `on.visible` once, as soon as there is an env to emit through. */\n private flushVisible(): void {\n if (!this.halfSeen || this.visibleSent || !this.env) return\n this.visibleSent = true\n this.emit(`visible`)\n }\n\n private onClick = (): void => {\n this.driver?.post(`click`)\n this.emit(`press`)\n }\n\n private onKey = (e: KeyboardEvent): void => {\n if (!this.env?.pressable || (e.key !== `Enter` && e.key !== ` `) || e.target !== this.root) return\n e.preventDefault()\n this.onClick()\n }\n\n private onPointer = (e: PointerEvent): void => {\n const kind = e.type === `pointerdown` ? `pointerDown` : e.type === `pointerup` ? `pointerUp` : e.type === `pointerenter` ? `pointerEnter` : `pointerExit`\n this.driver?.post(kind)\n if (kind === `pointerEnter`) this.emit(`hover`)\n }\n\n /** The machine (the prop, else the file's) and its inputs → the engine. */\n private applyMachine(): void {\n const d = this.driver\n if (!d) return\n const was = d.running\n const running = d.setMachine(isObj(this.props.stateMachine) ? this.props.stateMachine : this.fileMachine)\n if (was && !running) this.playbackKey = `` // back on the playback props\n d.setInputs(this.props.inputs)\n }\n\n /** The state changed: the clock restarts at 0. */\n private restartClock = (): void => {\n this.elapsed = 0\n this.finished = false\n this.restarts++\n this.painted = ``\n if (!this.inTick) this.schedule()\n }\n\n destroy(): void {\n this.destroyed = true\n for (const t of [`click`, `keydown`, `pointerdown`, `pointerup`, `pointerenter`, `pointerleave`] as const) this.root.removeEventListener(t, (t === `click` ? this.onClick : t === `keydown` ? this.onKey : this.onPointer) as EventListener)\n this.generation++\n this.stop()\n this.leaveSurface()\n this.io?.disconnect()\n this.ro?.disconnect()\n if (this.io) {\n hiddenWatchers.delete(this)\n if (--hiddenListeners === 0) document.removeEventListener(`visibilitychange`, onVisibility)\n }\n this.player?.free()\n this.player = null\n }\n\n private fail(message: string): void {\n this.root.dataset.state = `error`\n this.env?.onError?.(message)\n }\n\n private async load(): Promise<void> {\n const gen = ++this.generation\n this.free()\n this.lottie = null\n this.fileMachine = null\n this.root.dataset.state = `loading`\n const props = this.props\n const env = this.env!\n try {\n const wasm = await (await import(\"../../motion/wasm\")).loadMotionWasm()\n let lottie: string\n if (Array.isArray(props.layers)) {\n const doc = Object.fromEntries(DIALECT_KEYS.filter((k) => props[k] !== undefined).map((k) => [k, props[k]]))\n const out = JSON.parse(wasm.compile(JSON.stringify(doc))) as { lottie?: unknown; errors?: { path?: string; message?: string }[] }\n if (!out.lottie) throw new Error(`Motion: ${(out.errors ?? []).map((e) => `${e.path ?? ``} ${e.message ?? ``}`.trim()).join(`; `) || `invalid layers`}`)\n lottie = JSON.stringify(out.lottie)\n } else if (isObj(props.lottie)) lottie = JSON.stringify(props.lottie)\n else if (typeof props.src === `string` && props.src) {\n const req = mediaRequestOf(env.host, props.src)\n if (!req) throw new Error(`Motion: src denied by the media policy`)\n const blob = await fetchLimited(req.url, req.headers ?? {}, MEDIA_LIMITS, false, (u) => mediaUrlAllowed(env.host, u))\n const bytes = new Uint8Array(await blob.arrayBuffer())\n if (bytes[0] === 0x50 && bytes[1] === 0x4b) {\n const dot = await motionDotLottie(bytes)\n lottie = dot.lottie\n this.fileMachine = dot.stateMachine\n } else lottie = new TextDecoder().decode(bytes)\n } else throw new Error(`Motion: no source (layers, lottie or src)`)\n if (gen !== this.generation) return\n this.lottie = lottie\n const slots = (JSON.parse(lottie) as { slots?: unknown }).slots\n this.slotIds = isObj(slots) ? Object.keys(slots) : []\n this.instantiate()\n } catch (e) {\n if (gen !== this.generation) return\n this.fail(e instanceof Error ? e.message : String(e))\n }\n }\n\n private free(): void {\n this.stop()\n this.driver = null\n this.player?.free()\n this.player = null\n this.images = []\n this.painted = ``\n }\n\n /** (Re)build the player from the loaded Lottie with the current slots. */\n private instantiate(): void {\n if (!this.lottie || !this.env) return\n void import(\"../../motion/wasm\").then(async (m) => {\n const wasm = await m.loadMotionWasm()\n if (this.destroyed || !this.lottie || !this.env) return\n this.free()\n const slots = motionThemeSlots(this.slotIds, this.env.theme, this.env.mode, this.props.slots)\n try {\n this.player = new wasm.MotionPlayer(this.lottie, JSON.stringify(slots))\n } catch (e) {\n this.fail(`Motion: ${e instanceof Error ? e.message : String(e)}`)\n return\n }\n this.root.dataset.state = `ready`\n if (!motionDeclaredSize(this.props)) {\n // `src`: the box learns the composition size once loaded (§4).\n const w = this.player.width(), h = this.player.height()\n if (w > 0 && h > 0) Object.assign(this.root.style, motionBoxStyle([w, h], this.nodeStyle))\n }\n this.loadImages()\n this.playbackKey = ``\n this.applyPlayback()\n this.driver = new MotionStateDriver(this.player, (event, payload) => this.emit(event, payload), this.restartClock)\n this.applyMachine()\n this.schedule()\n })\n }\n\n private loadImages(): void {\n const player = this.player\n if (!player || !this.env) return\n const env = this.env\n player.images().forEach((loc, k) => {\n this.images[k] = null\n let url: string | null = loc\n if (!loc.startsWith(`data:`)) url = mediaRequestOf(env.host, loc)?.url ?? null\n if (!url) return\n const img = new Image()\n img.decoding = `async`\n img.onload = () => {\n if (this.player !== player) return\n this.images[k] = img\n this.repaint()\n }\n img.src = url\n })\n }\n\n private applyPlayback(): void {\n // A running machine's state owns the playback (M4 §1).\n if (!this.player || this.driver?.running) return\n const key = JSON.stringify(Object.fromEntries(PLAYBACK_KEYS.map((k) => [k, this.props[k]])))\n if (key === this.playbackKey) return\n this.playbackKey = key\n this.player.setPlayback(key)\n this.elapsed = 0\n this.finished = false\n this.driver?.replay()\n }\n\n private wantsToAnimate(): boolean {\n const p = this.props\n // With a machine its state's `autoplay` decides (the engine's clock holds the poster).\n const autoplay = this.driver?.running || p.autoplay !== false\n return Boolean(this.player) && typeof p.progress !== `number` && autoplay && p.play !== false && !this.env?.reducedMotion && !this.finished && this.visible && !document.hidden\n }\n\n private leaveSurface(): void {\n if (!this.surface) return\n const set = surfaces.get(this.surface)\n set?.delete(this)\n if (set && set.size === 0) surfaces.delete(this.surface)\n set?.forEach((v) => v.schedule())\n this.surface = null\n }\n\n /** Start or stop the clock to match the state; paint the still frame when stopped. */\n schedule(): void {\n if (this.destroyed || !this.io) return\n if (this.wantsToAnimate()) {\n if (!this.surface) {\n this.surface = surfaceOf(this.root)\n let set = surfaces.get(this.surface)\n if (!set) surfaces.set(this.surface, (set = new Set()))\n set.add(this)\n set.forEach((v) => v !== this && v.schedule())\n }\n if (granted(this, this.surface)) {\n if (!this.raf) {\n this.last = -1\n this.raf = requestAnimationFrame(this.tick)\n }\n return\n }\n } else this.leaveSurface()\n this.stop()\n this.repaint()\n }\n\n private stop(): void {\n if (this.raf) cancelAnimationFrame(this.raf)\n this.raf = 0\n }\n\n private tick = (now: number): void => {\n this.raf = 0\n if (!this.player || this.destroyed) return\n if (this.last >= 0) this.elapsed += now - this.last\n this.last = now\n if (this.player.done(this.elapsed)) {\n // `complete` once; a machine may move on (its clock restarts at 0).\n const before = this.restarts\n this.inTick = true\n this.driver?.done()\n if (!this.driver) this.emit(`complete`)\n this.inTick = false\n if (this.restarts === before || !this.player) {\n this.finished = true\n this.schedule()\n return\n }\n }\n if (now - this.lastPaint >= 1000 / MOTION_MAX_FPS - 1) {\n this.lastPaint = now\n this.paint(this.player.tick(this.elapsed))\n }\n if (!this.raf) this.raf = requestAnimationFrame(this.tick)\n }\n\n /** The frame shown while the clock is stopped. */\n private stillFrame(): number {\n const p = this.player!\n const progress = this.props.progress\n if (typeof progress === `number`) return p.progressFrame(Math.max(0, Math.min(1, progress)))\n if (this.finished || (this.elapsed > 0 && !this.env?.reducedMotion && (this.driver?.running || this.props.autoplay !== false))) return p.tick(this.elapsed)\n return p.posterFrame()\n }\n\n private repaint(): void {\n if (!this.player || this.raf) {\n if (this.raf) this.painted = ``\n return\n }\n this.painted = ``\n this.paint(this.stillFrame())\n }\n\n private paint(frame: number): void {\n const player = this.player\n if (!player) return\n const rect = this.root.getBoundingClientRect()\n const dpr = (typeof window !== `undefined` && window.devicePixelRatio) || 1\n const w = Math.max(1, Math.round(rect.width * dpr))\n const h = Math.max(1, Math.round(rect.height * dpr))\n const fit = motionFit(this.props.fit)\n const key = `${frame}|${w}|${h}|${fit}`\n if (key === this.painted) return\n this.painted = key\n if (this.canvas.width !== w || this.canvas.height !== h) {\n this.canvas.width = w\n this.canvas.height = h\n }\n const ctx = this.canvas.getContext(`2d`)\n if (!ctx) return\n const base = motionConcat([dpr, 0, 0, dpr, 0, 0], motionFitMatrix(player.width(), player.height(), w / dpr, h / dpr, fit))\n paintMotionFrame(ctx, w, h, player.sample(frame), base, this.images, this.pool)\n }\n}\n\n/** Test seam: forget the per-theme ids (a fresh module state). */\nexport function resetMotionThemeIds(): void {\n themeIds = new WeakMap()\n nextThemeId = 1\n}\n",
|
|
10
|
+
"// EXP-1604: eUI Motion's ONE web painter (React, Solid and\n// <exponential-surface> all paint through it). It replays the engine's\n// packed display list (apps/desktop/crates/eui-motion/README.md › Packed\n// frames) on a Canvas2D context and nothing else: no Lottie, no clock.\n// Semantics follow the reference raster (eui-motion `raster.rs`\n// `paint_reference`): a layer is a full-size offscreen group clipped to the\n// current clip ∩ its path, filtered, then composited onto its parent under\n// that clip with its alpha and blend; luma mattes turn the group into a\n// luminance mask first. The filters (blur, colour matrix, gradient map, drop\n// shadow) are pixel ports of the raster's, so every browser paints the same\n// pixels as the native painters (ctx.filter differs per engine).\n\nexport type MotionMatrix = readonly [number, number, number, number, number, number]\nexport type MotionFit = `contain` | `cover` | `fill`\n\n/** A canvas a group paints into (OffscreenCanvas where there is one). */\nexport type MotionCanvas = HTMLCanvasElement | OffscreenCanvas\nexport type MotionContext = CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D\nexport type MotionImageSource = CanvasImageSource & { width: number; height: number }\n\nexport const MOTION_PACKED_VERSION = 1\n\nconst BLENDS: readonly GlobalCompositeOperation[] = [\n `source-over`,\n `multiply`,\n `screen`,\n `overlay`,\n `darken`,\n `lighten`,\n `color-dodge`,\n `color-burn`,\n `hard-light`,\n `soft-light`,\n `difference`,\n `exclusion`,\n `hue`,\n `saturation`,\n `color`,\n `luminosity`,\n `destination-in`,\n `destination-out`,\n `destination-in`, // luma-in (after the luminance mask)\n `destination-out`, // luma-out\n `xor`,\n]\nconst LUMA_IN = 18\nconst LUMA_OUT = 19\nconst CAPS: readonly CanvasLineCap[] = [`butt`, `round`, `square`]\nconst JOINS: readonly CanvasLineJoin[] = [`miter`, `round`, `bevel`]\n\n/** The fit transform of a `cw × ch` composition into a `bw × bh` box\n * (contain = centred, cover = centred and overflowing, fill = stretched). */\nexport function motionFitMatrix(cw: number, ch: number, bw: number, bh: number, fit: MotionFit = `contain`): MotionMatrix {\n if (!(cw > 0) || !(ch > 0)) return [1, 0, 0, 1, 0, 0]\n if (fit === `fill`) return [bw / cw, 0, 0, bh / ch, 0, 0]\n const s = fit === `cover` ? Math.max(bw / cw, bh / ch) : Math.min(bw / cw, bh / ch)\n return [s, 0, 0, s, (bw - cw * s) / 2, (bh - ch * s) / 2]\n}\n\n/** `a ∘ b` (b applied first). */\nexport function motionConcat(a: MotionMatrix, b: MotionMatrix): MotionMatrix {\n return [a[0] * b[0] + a[2] * b[1], a[1] * b[0] + a[3] * b[1], a[0] * b[2] + a[2] * b[3], a[1] * b[2] + a[3] * b[3], a[0] * b[4] + a[2] * b[5] + a[4], a[1] * b[4] + a[3] * b[5] + a[5]]\n}\n\n/** The composition size a packed frame declares. */\nexport function motionFrameSize(packed: ArrayLike<number>): { width: number; height: number } {\n return { width: Number(packed[1]) || 0, height: Number(packed[2]) || 0 }\n}\n\n/** Reuses group canvases across frames (one painter instance per Motion). */\nexport class MotionCanvasPool {\n private free: MotionCanvas[] = []\n constructor(private readonly make: (w: number, h: number) => MotionCanvas | null = defaultCanvas) {}\n take(w: number, h: number): { canvas: MotionCanvas; ctx: MotionContext } | null {\n let c = this.free.pop() ?? this.make(w, h)\n if (!c) return null\n if (c.width !== w || c.height !== h) {\n c.width = w\n c.height = h\n }\n const ctx = c.getContext(`2d`) as MotionContext | null\n if (!ctx) return null\n ctx.setTransform(1, 0, 0, 1, 0, 0)\n ctx.globalAlpha = 1\n ctx.globalCompositeOperation = `source-over`\n ctx.clearRect(0, 0, w, h)\n return { canvas: c, ctx }\n }\n give(c: MotionCanvas): void {\n if (this.free.length < 8) this.free.push(c)\n }\n}\n\nfunction defaultCanvas(w: number, h: number): MotionCanvas | null {\n if (typeof OffscreenCanvas === `function`) return new OffscreenCanvas(w, h)\n if (typeof document === `undefined`) return null\n const c = document.createElement(`canvas`)\n c.width = w\n c.height = h\n return c\n}\n\ntype Clip = { m: MotionMatrix; path: Path2D | null }\ntype Frame =\n | { kind: `clip`; clips: number }\n | { kind: `layer`; clips: number; canvas: MotionCanvas; ctx: MotionContext; blend: number; alpha: number; filters: Filter[]; clip: Clip }\ntype Stop = { offset: number; color: [number, number, number, number] }\ntype Filter = { kind: 0; sx: number; sy: number } | { kind: 1; m: number[] } | { kind: 2; amount: number; stops: Stop[] } | { kind: 3; color: [number, number, number, number]; dx: number; dy: number; sigma: number }\n\n/** Paint one packed frame into `ctx` (a `width × height` px canvas, cleared\n * first) under `base` (the fit transform × devicePixelRatio). `images` =\n * the decoded assets in `MotionPlayer.images()` order (null while\n * loading: skipped). Returns false when the stream is not a v1 frame. */\nexport function paintMotionFrame(ctx: MotionContext, width: number, height: number, packed: ArrayLike<number>, base: MotionMatrix, images: readonly (MotionImageSource | null | undefined)[] = [], pool: MotionCanvasPool = new MotionCanvasPool()): boolean {\n ctx.setTransform(1, 0, 0, 1, 0, 0)\n ctx.globalAlpha = 1\n ctx.globalCompositeOperation = `source-over`\n ctx.clearRect(0, 0, width, height)\n if (packed[0] !== MOTION_PACKED_VERSION) return false\n const scale = Math.sqrt(Math.abs(base[0] * base[3] - base[1] * base[2]))\n let i = 3\n const n = packed.length\n const f = () => Number(packed[i++])\n const mat = (): MotionMatrix => [f(), f(), f(), f(), f(), f()]\n const readPath = (): Path2D | null => {\n const count = f()\n const p = typeof Path2D === `function` ? new Path2D() : null\n let any = false\n for (let k = 0; k < count; k++) {\n const v = f()\n if (v === 0) {\n const x = f(), y = f()\n p?.moveTo(x, y)\n any = true\n } else if (v === 1) {\n const x = f(), y = f()\n p?.lineTo(x, y)\n any = true\n } else if (v === 2) {\n const x1 = f(), y1 = f(), x2 = f(), y2 = f(), x = f(), y = f()\n p?.bezierCurveTo(x1, y1, x2, y2, x, y)\n any = true\n } else p?.closePath()\n }\n return any ? p : null\n }\n const readStops = (): Stop[] => {\n const count = f()\n const out: Stop[] = []\n for (let k = 0; k < count; k++) out.push({ offset: f(), color: [f(), f(), f(), f()] })\n return out\n }\n type Brush = { kind: 0; color: [number, number, number, number] } | { kind: 1; x0: number; y0: number; x1: number; y1: number; stops: Stop[] } | { kind: 2; cx: number; cy: number; fx: number; fy: number; r: number; stops: Stop[] }\n const readBrush = (): Brush => {\n const kind = f()\n if (kind === 1) return { kind: 1, x0: f(), y0: f(), x1: f(), y1: f(), stops: readStops() }\n if (kind === 2) return { kind: 2, cx: f(), cy: f(), fx: f(), fy: f(), r: f(), stops: readStops() }\n return { kind: 0, color: [f(), f(), f(), f()] }\n }\n const readFilters = (): Filter[] => {\n const count = f()\n const out: Filter[] = []\n for (let k = 0; k < count; k++) {\n const kind = f()\n if (kind === 0) out.push({ kind: 0, sx: f(), sy: f() })\n else if (kind === 1) {\n const m: number[] = []\n for (let j = 0; j < 20; j++) m.push(f())\n out.push({ kind: 1, m })\n } else if (kind === 2) out.push({ kind: 2, amount: f(), stops: readStops() })\n else out.push({ kind: 3, color: [f(), f(), f(), f()], dx: f(), dy: f(), sigma: f() })\n }\n return out\n }\n\n const clips: Clip[] = []\n const stack: Frame[] = []\n const top = (): MotionContext => {\n for (let k = stack.length - 1; k >= 0; k--) {\n const fr = stack[k]!\n if (fr.kind === `layer`) return fr.ctx\n }\n return ctx\n }\n /** Apply the clip stack; false = nothing can show (an empty clip path). */\n const applyClips = (c: MotionContext, list: readonly Clip[]): boolean => {\n for (const clip of list) {\n if (!clip.path) return false\n const m = motionConcat(base, clip.m)\n c.setTransform(m[0], m[1], m[2], m[3], m[4], m[5])\n c.clip(clip.path, `nonzero`)\n }\n return true\n }\n const setStyle = (c: MotionContext, brush: Brush, stroke: boolean) => {\n let style: string | CanvasGradient\n if (brush.kind === 0) style = css(brush.color)\n else {\n const g = brush.kind === 1 ? c.createLinearGradient(brush.x0, brush.y0, brush.x1, brush.y1) : c.createRadialGradient(brush.fx, brush.fy, 0, brush.cx, brush.cy, Math.max(0, brush.r))\n let last = 0\n for (const s of brush.stops) {\n last = Math.max(last, clamp01(s.offset))\n g.addColorStop(last, css(s.color))\n }\n style = g\n }\n if (stroke) c.strokeStyle = style\n else c.fillStyle = style\n }\n\n while (i < n) {\n const op = f()\n if (op === 1) {\n const blend = f()\n const alpha = f()\n const t = mat()\n const path = readPath()\n const filters = readFilters()\n const group = pool.take(width, height)\n const clip = { m: t, path }\n if (!group) return false\n stack.push({ kind: `layer`, clips: clips.length, canvas: group.canvas, ctx: group.ctx, blend, alpha, filters, clip })\n clips.push(clip)\n } else if (op === 2) {\n const t = mat()\n const path = readPath()\n stack.push({ kind: `clip`, clips: clips.length })\n clips.push({ m: t, path })\n } else if (op === 3) {\n const fr = stack.pop()\n if (!fr) continue\n clips.length = fr.clips\n if (fr.kind === `clip`) continue\n const dst = top()\n const needsPixels = fr.blend === LUMA_IN || fr.blend === LUMA_OUT || fr.filters.length > 0\n if (needsPixels) {\n const img = fr.ctx.getImageData(0, 0, width, height)\n const px = premultiply(img.data)\n if (fr.blend === LUMA_IN || fr.blend === LUMA_OUT) lumaMask(px)\n applyFilters(px, width, height, fr.filters, base, scale)\n unpremultiply(px, img.data)\n fr.ctx.putImageData(img, 0, 0)\n }\n dst.save()\n if (applyClips(dst, [...clips, fr.clip])) {\n dst.setTransform(1, 0, 0, 1, 0, 0)\n dst.globalAlpha = clamp01(fr.alpha)\n dst.globalCompositeOperation = BLENDS[fr.blend] ?? `source-over`\n dst.drawImage(fr.canvas, 0, 0)\n }\n dst.restore()\n pool.give(fr.canvas)\n } else if (op === 4 || op === 5) {\n const t = mat()\n let rule: CanvasFillRule = `nonzero`\n let width_ = 0, cap = 0, join = 0, miter = 4, dashOffset = 0\n let dashes: number[] = []\n if (op === 4) rule = f() === 1 ? `evenodd` : `nonzero`\n else {\n width_ = f()\n cap = f()\n join = f()\n miter = f()\n dashOffset = f()\n const dn = f()\n for (let k = 0; k < dn; k++) dashes.push(f())\n }\n const brush = readBrush()\n const path = readPath()\n if (!path) continue\n const c = top()\n c.save()\n if (applyClips(c, clips)) {\n const m = motionConcat(base, t)\n c.setTransform(m[0], m[1], m[2], m[3], m[4], m[5])\n setStyle(c, brush, op === 5)\n if (op === 4) c.fill(path, rule)\n else if (width_ > 0) {\n c.lineWidth = width_\n c.lineCap = CAPS[cap] ?? `butt`\n c.lineJoin = JOINS[join] ?? `miter`\n c.miterLimit = miter > 0 ? miter : 4\n if (dashes.length && dashes.every((d) => d >= 0 && Number.isFinite(d)) && dashes.some((d) => d > 0)) {\n c.setLineDash(dashes)\n c.lineDashOffset = dashOffset\n }\n c.stroke(path)\n }\n }\n c.restore()\n } else if (op === 6) {\n const t = mat()\n const asset = f()\n const alpha = f()\n const w = f()\n const h = f()\n const img = images[asset]\n if (!img || !img.width || !img.height) continue\n const c = top()\n c.save()\n if (applyClips(c, clips)) {\n const m = motionConcat(base, t)\n c.setTransform(m[0], m[1], m[2], m[3], m[4], m[5])\n c.globalAlpha = clamp01(alpha)\n c.imageSmoothingQuality = `low`\n c.drawImage(img, 0, 0, w > 0 ? w : img.width, h > 0 ? h : img.height)\n }\n c.restore()\n } else return false\n }\n return true\n}\n\nfunction clamp01(v: number): number {\n return v < 0 ? 0 : v > 1 ? 1 : v\n}\n\nfunction css(c: readonly number[]): string {\n return `rgb(${clamp01(c[0]!) * 255} ${clamp01(c[1]!) * 255} ${clamp01(c[2]!) * 255} / ${clamp01(c[3]!)})`\n}\n\n// --- Pixel ops (ports of eui-motion raster.rs, premultiplied RGBA8) ----------\n\nfunction premultiply(src: Uint8ClampedArray): Uint8Array {\n const out = new Uint8Array(src.length)\n for (let k = 0; k < src.length; k += 4) {\n const a = src[k + 3]!\n out[k + 3] = a\n if (a === 255) {\n out[k] = src[k]!\n out[k + 1] = src[k + 1]!\n out[k + 2] = src[k + 2]!\n } else if (a > 0) {\n out[k] = Math.round((src[k]! * a) / 255)\n out[k + 1] = Math.round((src[k + 1]! * a) / 255)\n out[k + 2] = Math.round((src[k + 2]! * a) / 255)\n }\n }\n return out\n}\n\nfunction unpremultiply(src: Uint8Array, out: Uint8ClampedArray): void {\n for (let k = 0; k < src.length; k += 4) {\n const a = src[k + 3]!\n out[k + 3] = a\n if (a === 0) {\n out[k] = out[k + 1] = out[k + 2] = 0\n } else {\n out[k] = Math.round((src[k]! * 255) / a)\n out[k + 1] = Math.round((src[k + 1]! * 255) / a)\n out[k + 2] = Math.round((src[k + 2]! * 255) / a)\n }\n }\n}\n\nfunction lumaMask(p: Uint8Array): void {\n for (let k = 0; k < p.length; k += 4) {\n const l = Math.max(0, Math.min(255, Math.round(0.2125 * p[k]! + 0.7154 * p[k + 1]! + 0.0721 * p[k + 2]!)))\n p[k] = p[k + 1] = p[k + 2] = p[k + 3] = l\n }\n}\n\nfunction applyFilters(p: Uint8Array, w: number, h: number, filters: readonly Filter[], base: MotionMatrix, scale: number): void {\n for (const fl of filters) {\n if (fl.kind === 0) blur(p, w, h, 4, fl.sx * scale, fl.sy * scale)\n else if (fl.kind === 1) colorMatrix(p, fl.m)\n else if (fl.kind === 2) gradientMap(p, fl.stops, fl.amount)\n else {\n const ddx = base[0] * fl.dx + base[2] * fl.dy\n const ddy = base[1] * fl.dx + base[3] * fl.dy\n dropShadow(p, w, h, fl.color, ddx, ddy, fl.sigma * scale)\n }\n }\n}\n\nconst BOX_SIGMA = 2\nconst div255 = (x: number) => {\n const v = x + 128\n return (v + (v >> 8)) >> 8\n}\n\nfunction boxSize(sigma: number): number {\n return Math.max(0, Math.floor((sigma * 3 * Math.sqrt(2 * Math.PI)) / 4 + 0.5))\n}\n\ntype Pass = { box: [number, number] } | { kernel: Uint32Array }\n\nfunction passes(sigma: number): Pass[] {\n if (sigma < BOX_SIGMA) {\n const r = Math.ceil(3 * sigma)\n const ws: number[] = []\n for (let k = 0; k <= 2 * r; k++) {\n const x = k - r\n ws.push(Math.exp((-x * x) / (2 * sigma * sigma)))\n }\n const sum = ws.reduce((a, b) => a + b, 0)\n const kernel = new Uint32Array(ws.map((v) => Math.round((v / sum) * 65536)))\n const total = kernel.reduce((a, b) => a + b, 0)\n kernel[r] = Math.max(0, kernel[r]! + 65536 - total)\n return [{ kernel }]\n }\n const d = boxSize(sigma)\n if (d <= 1) return []\n const r = Math.floor(d / 2)\n return d % 2 === 1 ? [{ box: [r, r] }, { box: [r, r] }, { box: [r, r] }] : [{ box: [r, r - 1] }, { box: [r - 1, r] }, { box: [r, r] }]\n}\n\n/** Separable gaussian of a premultiplied buffer (`ch` channels), transparent outside. */\nfunction blur(buf: Uint8Array, w: number, h: number, ch: number, sx: number, sy: number): void {\n if (!w || !h) return\n if (sx > 0 && Number.isFinite(sx)) for (const p of passes(sx)) runPass(buf, w, h, ch, p, true)\n if (sy > 0 && Number.isFinite(sy)) for (const p of passes(sy)) runPass(buf, w, h, ch, p, false)\n}\n\n/** One horizontal or vertical pass: lines along the axis, `step` apart. */\nfunction runPass(buf: Uint8Array, w: number, h: number, ch: number, pass: Pass, horizontal: boolean): void {\n const len = horizontal ? w : h\n const lines = horizontal ? h : w\n const step = horizontal ? ch : w * ch\n const lineStep = horizontal ? w * ch : ch\n const tmp = new Uint32Array(len)\n for (let line = 0; line < lines; line++) {\n for (let c = 0; c < ch; c++) {\n const o = line * lineStep + c\n for (let x = 0; x < len; x++) tmp[x] = buf[o + x * step]!\n if (`box` in pass) {\n const [l, r] = pass.box\n const d = l + r + 1\n const half = d >> 1\n let sum = 0\n for (let k = 0; k <= Math.min(r, len - 1); k++) sum += tmp[k]!\n for (let x = 0; x < len; x++) {\n buf[o + x * step] = Math.floor((sum + half) / d)\n const add = x + r + 1\n if (add < len) sum += tmp[add]!\n if (x >= l) sum -= tmp[x - l]!\n }\n } else {\n const k = pass.kernel\n const r = k.length >> 1\n for (let x = 0; x < len; x++) {\n const lo = Math.max(0, x - r)\n const hi = Math.min(len - 1, x + r)\n let acc = 0\n for (let s = lo; s <= hi; s++) acc += k[s + r - x]! * tmp[s]!\n buf[o + x * step] = Math.min(255, Math.floor((acc + 32768) / 65536))\n }\n }\n }\n }\n}\n\nconst IDENTITY_MATRIX = [1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0]\n\nfunction colorMatrix(p: Uint8Array, m: readonly number[]): void {\n if (m.every((v, k) => Math.fround(v) === Math.fround(IDENTITY_MATRIX[k]!))) return\n const clearAlpha = Math.max(0, Math.min(255, Math.round(m[19]! * 255)))\n for (let k = 0; k < p.length; k += 4) {\n const a = p[k + 3]!\n if (a === 0 && clearAlpha === 0) continue\n const [r, g, b, af] = a === 0 ? [0, 0, 0, 0] : [p[k]! / a, p[k + 1]! / a, p[k + 2]! / a, a / 255]\n const row = (j: number) => clamp01(m[j]! * r + m[j + 1]! * g + m[j + 2]! * b + m[j + 3]! * af + m[j + 4]!)\n const a8 = Math.round(row(15) * 255)\n p[k] = Math.min(a8, Math.round(row(0) * a8))\n p[k + 1] = Math.min(a8, Math.round(row(5) * a8))\n p[k + 2] = Math.min(a8, Math.round(row(10) * a8))\n p[k + 3] = a8\n }\n}\n\nfunction gradientMap(p: Uint8Array, stops: readonly Stop[], amountRaw: number): void {\n const amount = clamp01(amountRaw)\n if (amount <= 0 || !stops.length) return\n const sorted = [...stops].sort((a, b) => a.offset - b.offset)\n const first = sorted[0]!\n const last = sorted[sorted.length - 1]!\n const lut: number[][] = []\n for (let k = 0; k < 256; k++) {\n const t = k / 255\n let c: readonly number[] = last.color\n if (t <= first.offset) c = first.color\n else if (t < last.offset) {\n for (let j = 0; j + 1 < sorted.length; j++) {\n const a = sorted[j]!, b = sorted[j + 1]!\n if (t <= b.offset) {\n const span = b.offset - a.offset\n const fr = span > 0 ? (t - a.offset) / span : 1\n c = a.color.map((v, q) => v + (b.color[q]! - v) * fr)\n break\n }\n }\n }\n lut.push([...c])\n }\n const mix = (o: number, nv: number) => clamp01(o + (clamp01(nv) - o) * amount)\n for (let k = 0; k < p.length; k += 4) {\n const a = p[k + 3]!\n if (a === 0) continue\n const r = p[k]! / a, g = p[k + 1]! / a, b = p[k + 2]! / a\n const l = clamp01(0.2126 * r + 0.7152 * g + 0.0722 * b)\n const c = lut[Math.round(l * 255)]!\n const a8 = Math.round(clamp01((a / 255) * (1 + (clamp01(c[3]!) - 1) * amount)) * 255)\n p[k] = Math.min(a8, Math.round(mix(r, c[0]!) * a8))\n p[k + 1] = Math.min(a8, Math.round(mix(g, c[1]!) * a8))\n p[k + 2] = Math.min(a8, Math.round(mix(b, c[2]!) * a8))\n p[k + 3] = a8\n }\n}\n\n/** The content over its shadow: alpha shifted by (dx, dy) device px\n * (bilinear), blurred by `sigma`, tinted `color`. */\nfunction dropShadow(p: Uint8Array, w: number, h: number, color: readonly number[], dxRaw: number, dyRaw: number, sigma: number): void {\n const ok = Number.isFinite(dxRaw) && Number.isFinite(dyRaw)\n const dx = ok ? dxRaw : 0\n const dy = ok ? dyRaw : 0\n const ix = Math.floor(dx), iy = Math.floor(dy)\n const wx1 = Math.round((dx - ix) * 256), wy1 = Math.round((dy - iy) * 256)\n const wx0 = 256 - wx1, wy0 = 256 - wy1\n const at = (x: number, y: number) => (x < 0 || y < 0 || x >= w || y >= h ? 0 : p[(y * w + x) * 4 + 3]!)\n const shifted = new Uint8Array(w * h)\n for (let y = 0; y < h; y++) {\n for (let x = 0; x < w; x++) {\n const sx = x - ix, sy = y - iy\n const v = (at(sx, sy) * wx0 + at(sx - 1, sy) * wx1) * wy0 + (at(sx, sy - 1) * wx0 + at(sx - 1, sy - 1) * wx1) * wy1\n shifted[y * w + x] = Math.min(255, Math.floor((v + 32768) / 65536))\n }\n }\n blur(shifted, w, h, 1, sigma, sigma)\n const ca = clamp01(color[3]!)\n const rgb = [clamp01(color[0]!), clamp01(color[1]!), clamp01(color[2]!)]\n for (let k = 0; k < w * h; k++) {\n const o = k * 4\n const sa = p[o + 3]!\n const a = shifted[k]!\n // content over shadow (premultiplied source-over)\n let sr = 0, sg = 0, sb = 0, s8 = 0\n if (a) {\n s8 = Math.min(255, Math.round(a * ca))\n sr = Math.round(rgb[0]! * s8)\n sg = Math.round(rgb[1]! * s8)\n sb = Math.round(rgb[2]! * s8)\n }\n const inv = 255 - sa\n p[o] = Math.min(255, p[o]! + div255(sr * inv))\n p[o + 1] = Math.min(255, p[o + 1]! + div255(sg * inv))\n p[o + 2] = Math.min(255, p[o + 2]! + div255(sb * inv))\n p[o + 3] = Math.min(255, sa + div255(s8 * inv))\n }\n}\n"
|
|
11
|
+
],
|
|
12
|
+
"mappings": "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",
|
|
13
|
+
"debugId": "4B679732CF837C4A64756E2164756E21",
|
|
14
|
+
"names": []
|
|
15
|
+
}
|
|
@@ -3,10 +3,10 @@ import {
|
|
|
3
3
|
parseTokenRef2,
|
|
4
4
|
isKnownToken2,
|
|
5
5
|
catalogView2
|
|
6
|
-
} from "./index-
|
|
6
|
+
} from "./index-f9wkb6aq.js";
|
|
7
7
|
import {
|
|
8
8
|
style_default
|
|
9
|
-
} from "./index-
|
|
9
|
+
} from "./index-cvf7bbs5.js";
|
|
10
10
|
|
|
11
11
|
// packages/exponential-ui/src/style.ts
|
|
12
12
|
var LAYOUT = style_default.layout;
|
|
@@ -396,7 +396,7 @@ function contrast2(a, b) {
|
|
|
396
396
|
}
|
|
397
397
|
// packages/exponential-ui/catalog/recipes.json
|
|
398
398
|
var recipes_default = {
|
|
399
|
-
$comment: "VAPP-92: the RECIPE contract. A theme styles a component PART under a `when` selector (the node's recipe props + the interaction `state`); this file fixes what a theme may name. `states` = the interaction states a painter reports (`default` is the absence of all; round 1 adds `invalid` = a field whose checks failed, `dragover` = a drop zone a drag hovers); `keys` = the whitelist a recipe style may set: a SUBSET of style.json's visual keys plus the padding/gap/size keys a part's box needs and `native` (true = the painter may use the platform's own control for this part, geometry still from the tokens); round 1 lets a recipe set `transition`/`transitionEasing` (so a theme's motion tokens finally animate hover/press/open), `transform` (a chevron that rotates when `open`), `borderStyle`, the four per-side border widths (an app bar's bottom rule, a tab bar's top rule), `textDecoration`, `letterSpacing`, `fontStyle`, `textTransform`. A part-level discriminator the painter supplies per drawn piece: CodeBlock/token `kind` (the codeToken enum), Table/headerCell+cell `align` and Table/row `striped` (true on ODD rows of a striped table), Stepper's step `status` (a macro `$recipe`). `native` lists every native component's PARTS (the painter paints each part with its resolved recipe) and the PROPS a `when` may key on (the component's enum/boolean props; the catalog default fills an unset one, so a theme always sees a concrete value; a part-level discriminator the PAINTER supplies is listed too, see below). Macro parts come from macros.json (every template `part`) and their `when` props from the macro's `recipeProps` (+ a part's `$recipe` keys); src/recipes.ts derives them. Both lists are append-only. Round 2 (docs/round-2-contract.md §6): `parts` lists EVERY part a painter lays out (the conformance dump names each `<node id>.<part>[.<index or row key>]`), so the layout-only parts are here too (Switch/body, Radio/items, Slider/header, Table/body, CodeBlock/body+code, FileUpload/title+browse+fileIcon, the fields' `input`, Tooltip/anchor, Accordion/count, List/section, Carousel/controls+previous+next); keys add `backdropBlur` (`$blur.*`) and `animation`; Resizable is new. EXP-1259: SearchList is new (its parts are also a searchable Menu submenu's: head, search, count, list, empty, fade), Tabs gain `close` + `new` (props `closable`, `addable`), Skeleton gains its rows (`row`, `dot`, `bar`). EXP-1324: CodeBlock gains the `variant` (default|destructive) and `size` (default|sm) props, shadcn's code-block. VAPP-162 (docs/round-5-contract.md): Segmented gains `orientation` + the `badge` part (an option `count`), VoiceWave the `variant` prop + the `bar` part (the `bars` meter), QrCode and QrScanner are new. EXP-1495 (docs/round-6-contract.md): Carousel gains `counter` (prop + part) and the `thumbnails` strip (parts `thumbnails`, `thumbnail`, state `selected` = the current page).",
|
|
399
|
+
$comment: "VAPP-92: the RECIPE contract. A theme styles a component PART under a `when` selector (the node's recipe props + the interaction `state`); this file fixes what a theme may name. `states` = the interaction states a painter reports (`default` is the absence of all; round 1 adds `invalid` = a field whose checks failed, `dragover` = a drop zone a drag hovers); `keys` = the whitelist a recipe style may set: a SUBSET of style.json's visual keys plus the padding/gap/size keys a part's box needs and `native` (true = the painter may use the platform's own control for this part, geometry still from the tokens); round 1 lets a recipe set `transition`/`transitionEasing` (so a theme's motion tokens finally animate hover/press/open), `transform` (a chevron that rotates when `open`), `borderStyle`, the four per-side border widths (an app bar's bottom rule, a tab bar's top rule), `textDecoration`, `letterSpacing`, `fontStyle`, `textTransform`. A part-level discriminator the painter supplies per drawn piece: CodeBlock/token `kind` (the codeToken enum), Table/headerCell+cell `align` and Table/row `striped` (true on ODD rows of a striped table), Stepper's step `status` (a macro `$recipe`). `native` lists every native component's PARTS (the painter paints each part with its resolved recipe) and the PROPS a `when` may key on (the component's enum/boolean props; the catalog default fills an unset one, so a theme always sees a concrete value; a part-level discriminator the PAINTER supplies is listed too, see below). Macro parts come from macros.json (every template `part`) and their `when` props from the macro's `recipeProps` (+ a part's `$recipe` keys); src/recipes.ts derives them. Both lists are append-only. Round 2 (docs/round-2-contract.md §6): `parts` lists EVERY part a painter lays out (the conformance dump names each `<node id>.<part>[.<index or row key>]`), so the layout-only parts are here too (Switch/body, Radio/items, Slider/header, Table/body, CodeBlock/body+code, FileUpload/title+browse+fileIcon, the fields' `input`, Tooltip/anchor, Accordion/count, List/section, Carousel/controls+previous+next); keys add `backdropBlur` (`$blur.*`) and `animation`; Resizable is new. EXP-1259: SearchList is new (its parts are also a searchable Menu submenu's: head, search, count, list, empty, fade), Tabs gain `close` + `new` (props `closable`, `addable`), Skeleton gains its rows (`row`, `dot`, `bar`). EXP-1324: CodeBlock gains the `variant` (default|destructive) and `size` (default|sm) props, shadcn's code-block. VAPP-162 (docs/round-5-contract.md): Segmented gains `orientation` + the `badge` part (an option `count`), VoiceWave the `variant` prop + the `bar` part (the `bars` meter), QrCode and QrScanner are new. EXP-1495 (docs/round-6-contract.md): Carousel gains `counter` (prop + part) and the `thumbnails` strip (parts `thumbnails`, `thumbnail`, state `selected` = the current page). EXP-1586: ZoomableImage is new (the picture `image` + THE zoom pill: `pill`, `zoomOut`, `percent`, `zoomIn`, `divider`, `fit`; `fit` reports `selected` while the view is at rest).",
|
|
400
400
|
states: ["hover", "pressed", "focus", "disabled", "checked", "open", "selected", "invalid", "dragover"],
|
|
401
401
|
keys: [
|
|
402
402
|
"backgroundColor",
|
|
@@ -441,11 +441,13 @@ var recipes_default = {
|
|
|
441
441
|
Text: { parts: ["root"], props: ["variant", "tone"] },
|
|
442
442
|
Markdown: { parts: ["root", "paragraph", "heading", "link", "code", "codeBlock", "quote", "table", "listItem"], props: [] },
|
|
443
443
|
Image: { parts: ["root", "fallback"], props: ["fit"] },
|
|
444
|
+
Motion: { parts: ["root"], props: ["fit"] },
|
|
444
445
|
Icon: { parts: ["root"], props: ["size", "tone"] },
|
|
445
446
|
Video: { parts: ["root", "controls", "poster"], props: ["autoplay"] },
|
|
446
447
|
AudioPlayer: { parts: ["root", "controls", "track"], props: [] },
|
|
447
448
|
Avatar: { parts: ["root", "image", "fallback"], props: ["size"] },
|
|
448
449
|
QrCode: { parts: ["root", "plate", "module", "label"], props: ["level"] },
|
|
450
|
+
ZoomableImage: { parts: ["root", "image", "pill", "zoomOut", "percent", "zoomIn", "divider", "fit"], props: ["controls"] },
|
|
449
451
|
Carousel: { parts: ["root", "page", "indicator", "controls", "previous", "next", "counter", "thumbnails", "thumbnail"], props: ["loop", "indicators", "counter"] },
|
|
450
452
|
Tabs: { parts: ["root", "list", "tab", "indicator", "content", "close", "new"], props: ["fill", "closable", "addable"] },
|
|
451
453
|
Segmented: { parts: ["root", "item", "icon", "label", "badge"], props: ["type", "variant", "size", "fill", "orientation"] },
|
|
@@ -2671,6 +2673,174 @@ var neutral_theme_default = {
|
|
|
2671
2673
|
}
|
|
2672
2674
|
]
|
|
2673
2675
|
},
|
|
2676
|
+
ZoomableImage: {
|
|
2677
|
+
root: [
|
|
2678
|
+
{
|
|
2679
|
+
style: {
|
|
2680
|
+
backgroundColor: "#00000000"
|
|
2681
|
+
}
|
|
2682
|
+
}
|
|
2683
|
+
],
|
|
2684
|
+
image: [
|
|
2685
|
+
{
|
|
2686
|
+
style: {
|
|
2687
|
+
borderRadius: "$radius.md"
|
|
2688
|
+
}
|
|
2689
|
+
}
|
|
2690
|
+
],
|
|
2691
|
+
pill: [
|
|
2692
|
+
{
|
|
2693
|
+
style: {
|
|
2694
|
+
padding: 4,
|
|
2695
|
+
gap: 2,
|
|
2696
|
+
borderRadius: "$radius.full",
|
|
2697
|
+
backgroundColor: "$color.popover",
|
|
2698
|
+
borderWidth: "$border.hairline",
|
|
2699
|
+
borderColor: "$color.border",
|
|
2700
|
+
boxShadow: "$shadow.lg",
|
|
2701
|
+
backdropBlur: "$blur.lg"
|
|
2702
|
+
}
|
|
2703
|
+
}
|
|
2704
|
+
],
|
|
2705
|
+
zoomOut: [
|
|
2706
|
+
{
|
|
2707
|
+
style: {
|
|
2708
|
+
width: 28,
|
|
2709
|
+
height: 28,
|
|
2710
|
+
borderRadius: "$radius.full",
|
|
2711
|
+
color: "$color.foreground",
|
|
2712
|
+
backgroundColor: "#00000000",
|
|
2713
|
+
transition: "$motion.fast"
|
|
2714
|
+
}
|
|
2715
|
+
},
|
|
2716
|
+
{
|
|
2717
|
+
when: {
|
|
2718
|
+
state: "hover"
|
|
2719
|
+
},
|
|
2720
|
+
style: {
|
|
2721
|
+
backgroundColor: "$color.accent",
|
|
2722
|
+
color: "$color.accentForeground"
|
|
2723
|
+
}
|
|
2724
|
+
},
|
|
2725
|
+
{
|
|
2726
|
+
when: {
|
|
2727
|
+
state: "disabled"
|
|
2728
|
+
},
|
|
2729
|
+
style: {
|
|
2730
|
+
opacity: "$opacity.disabled"
|
|
2731
|
+
}
|
|
2732
|
+
}
|
|
2733
|
+
],
|
|
2734
|
+
percent: [
|
|
2735
|
+
{
|
|
2736
|
+
style: {
|
|
2737
|
+
height: 28,
|
|
2738
|
+
paddingHorizontal: "$spacing.md",
|
|
2739
|
+
borderRadius: "$radius.full",
|
|
2740
|
+
color: "$color.foreground",
|
|
2741
|
+
backgroundColor: "#00000000",
|
|
2742
|
+
fontFamily: "$type.family.sans",
|
|
2743
|
+
fontSize: "$type.size.sm",
|
|
2744
|
+
lineHeight: "$type.lineHeight.sm",
|
|
2745
|
+
fontWeight: "$type.weight.medium",
|
|
2746
|
+
transition: "$motion.fast"
|
|
2747
|
+
}
|
|
2748
|
+
},
|
|
2749
|
+
{
|
|
2750
|
+
when: {
|
|
2751
|
+
state: "hover"
|
|
2752
|
+
},
|
|
2753
|
+
style: {
|
|
2754
|
+
backgroundColor: "$color.accent",
|
|
2755
|
+
color: "$color.accentForeground"
|
|
2756
|
+
}
|
|
2757
|
+
},
|
|
2758
|
+
{
|
|
2759
|
+
when: {
|
|
2760
|
+
state: "disabled"
|
|
2761
|
+
},
|
|
2762
|
+
style: {
|
|
2763
|
+
opacity: "$opacity.disabled"
|
|
2764
|
+
}
|
|
2765
|
+
}
|
|
2766
|
+
],
|
|
2767
|
+
zoomIn: [
|
|
2768
|
+
{
|
|
2769
|
+
style: {
|
|
2770
|
+
width: 28,
|
|
2771
|
+
height: 28,
|
|
2772
|
+
borderRadius: "$radius.full",
|
|
2773
|
+
color: "$color.foreground",
|
|
2774
|
+
backgroundColor: "#00000000",
|
|
2775
|
+
transition: "$motion.fast"
|
|
2776
|
+
}
|
|
2777
|
+
},
|
|
2778
|
+
{
|
|
2779
|
+
when: {
|
|
2780
|
+
state: "hover"
|
|
2781
|
+
},
|
|
2782
|
+
style: {
|
|
2783
|
+
backgroundColor: "$color.accent",
|
|
2784
|
+
color: "$color.accentForeground"
|
|
2785
|
+
}
|
|
2786
|
+
},
|
|
2787
|
+
{
|
|
2788
|
+
when: {
|
|
2789
|
+
state: "disabled"
|
|
2790
|
+
},
|
|
2791
|
+
style: {
|
|
2792
|
+
opacity: "$opacity.disabled"
|
|
2793
|
+
}
|
|
2794
|
+
}
|
|
2795
|
+
],
|
|
2796
|
+
divider: [
|
|
2797
|
+
{
|
|
2798
|
+
style: {
|
|
2799
|
+
width: 1,
|
|
2800
|
+
height: 16,
|
|
2801
|
+
backgroundColor: "$color.border"
|
|
2802
|
+
}
|
|
2803
|
+
}
|
|
2804
|
+
],
|
|
2805
|
+
fit: [
|
|
2806
|
+
{
|
|
2807
|
+
style: {
|
|
2808
|
+
width: 28,
|
|
2809
|
+
height: 28,
|
|
2810
|
+
borderRadius: "$radius.full",
|
|
2811
|
+
color: "$color.foreground",
|
|
2812
|
+
backgroundColor: "#00000000",
|
|
2813
|
+
transition: "$motion.fast"
|
|
2814
|
+
}
|
|
2815
|
+
},
|
|
2816
|
+
{
|
|
2817
|
+
when: {
|
|
2818
|
+
state: "hover"
|
|
2819
|
+
},
|
|
2820
|
+
style: {
|
|
2821
|
+
backgroundColor: "$color.accent",
|
|
2822
|
+
color: "$color.accentForeground"
|
|
2823
|
+
}
|
|
2824
|
+
},
|
|
2825
|
+
{
|
|
2826
|
+
when: {
|
|
2827
|
+
state: "disabled"
|
|
2828
|
+
},
|
|
2829
|
+
style: {
|
|
2830
|
+
opacity: "$opacity.disabled"
|
|
2831
|
+
}
|
|
2832
|
+
},
|
|
2833
|
+
{
|
|
2834
|
+
when: {
|
|
2835
|
+
state: "selected"
|
|
2836
|
+
},
|
|
2837
|
+
style: {
|
|
2838
|
+
backgroundColor: "$color.accent",
|
|
2839
|
+
color: "$color.accentForeground"
|
|
2840
|
+
}
|
|
2841
|
+
}
|
|
2842
|
+
]
|
|
2843
|
+
},
|
|
2674
2844
|
QrCode: {
|
|
2675
2845
|
root: [
|
|
2676
2846
|
{
|
|
@@ -6556,8 +6726,9 @@ var neutral_theme_default = {
|
|
|
6556
6726
|
cell: [
|
|
6557
6727
|
{
|
|
6558
6728
|
style: {
|
|
6559
|
-
|
|
6560
|
-
paddingHorizontal: "$spacing.sm"
|
|
6729
|
+
minHeight: "$control.row",
|
|
6730
|
+
paddingHorizontal: "$spacing.sm",
|
|
6731
|
+
paddingVertical: "$spacing.xs"
|
|
6561
6732
|
}
|
|
6562
6733
|
},
|
|
6563
6734
|
{
|
|
@@ -6565,7 +6736,7 @@ var neutral_theme_default = {
|
|
|
6565
6736
|
density: "compact"
|
|
6566
6737
|
},
|
|
6567
6738
|
style: {
|
|
6568
|
-
|
|
6739
|
+
minHeight: "$control.rowCompact"
|
|
6569
6740
|
}
|
|
6570
6741
|
}
|
|
6571
6742
|
],
|
|
@@ -8835,5 +9006,5 @@ function actionMessage2(action) {
|
|
|
8835
9006
|
|
|
8836
9007
|
export { STYLE_KEYS2, STYLE_LAYOUT_KEYS2, STYLE_VISUAL_KEYS2, STYLE_LAYOUT_EFFECT_KEYS2, STYLE_MEDIA2, STYLE_TRANSFORM2, STYLE_STATES2, styleKeyEnum2, styleKeyType2, validateStyle2, create2, props2, parseMediaCondition2, mediaMatches2, resolveConditions2, activeBreakpoint2, parseColor2, toHex2, isThemeHex2, toThemeHex2, luminance2, contrast2, RECIPE_STATES2, RECIPE_KEYS2, macroParts2, recipeParts2, nativeRecipeProps2, MODES2, DENSITIES2, THEME_SCHEMA_ID2, ThemeError2, validateTheme2, tryLoadTheme2, loadTheme2, resolveMode2, applyDensity2, applyContrast2, resolveToken2, resolveConditionKey2, resolveStyleValues2, recipeStyle2, resolveRecipe2, nodeRecipeQuery2, resolveNodeStyle2, shadowCss2, easingCss2, neutralTheme2, exponentialTheme2, playfulTheme2, orangeTheme2, BUILTIN_THEMES2, BUILTIN_THEME_IDS2, DEFAULT_THEME_ID2, builtinTheme2, themeOrDefault2, builtinThemes2, host_default, HOST_CONTRACT2, HOST_CONTRACT_VERSION2, A2UI_MESSAGE_KINDS2, EXTENSION_MESSAGE_KINDS2, MESSAGE_KINDS2, HOST_ERROR_CODES2, DEFAULT_URL_SCHEMES2, DEFAULT_MEDIA_SCHEMES2, MEDIA_LIMITS2, PAINT_ERROR_HOOK2, RENDER_FAILED2, MCP_MIME_TYPES2, MCP_ACTION_TOOL2, SSE_EVENTS2, SURFACE_SETTING_KEYS2, FORMATTER_METHODS2, SURFACE_COMMANDS2, errorMessage2, actionMessage2 };
|
|
8837
9008
|
|
|
8838
|
-
//# debugId=
|
|
8839
|
-
//# sourceMappingURL=index-
|
|
9009
|
+
//# debugId=65E0D5194D2F9C8F64756E2164756E21
|
|
9010
|
+
//# sourceMappingURL=index-vkn82srs.js.map
|