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