@appinternalleads/ui 0.4.0 → 0.4.1
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/dist/cjs/agent/AgentComponent.js +1 -1
- package/dist/cjs/agent/AgentComponent.js.map +1 -1
- package/dist/cjs/agent/manifests.js +81 -1
- package/dist/cjs/agent/manifests.js.map +1 -1
- package/dist/cjs/agent/result.js +6 -0
- package/dist/cjs/agent/result.js.map +1 -1
- package/dist/cjs/components/catalog.js +18 -0
- package/dist/cjs/components/catalog.js.map +1 -1
- package/dist/cjs/components/onboarding/animated-status/AnimatedStage.js +21 -0
- package/dist/cjs/components/onboarding/animated-status/AnimatedStage.js.map +1 -0
- package/dist/cjs/components/onboarding/animated-status/AnimatedStage.types.js +6 -0
- package/dist/cjs/components/onboarding/animated-status/AnimatedStage.types.js.map +1 -0
- package/dist/cjs/components/onboarding/animated-status/AnimatedStage.web.js +89 -0
- package/dist/cjs/components/onboarding/animated-status/AnimatedStage.web.js.map +1 -0
- package/dist/cjs/components/onboarding/animated-status/AnimatedStatusView.js +62 -0
- package/dist/cjs/components/onboarding/animated-status/AnimatedStatusView.js.map +1 -0
- package/dist/cjs/components/onboarding/animated-status/AnimatedStill.js +20 -0
- package/dist/cjs/components/onboarding/animated-status/AnimatedStill.js.map +1 -0
- package/dist/cjs/components/onboarding/animated-status/contract.js +87 -0
- package/dist/cjs/components/onboarding/animated-status/contract.js.map +1 -0
- package/dist/cjs/components/onboarding/animated-status/engine.js +40 -0
- package/dist/cjs/components/onboarding/animated-status/engine.js.map +1 -0
- package/dist/cjs/components/onboarding/animated-status/index.js +20 -0
- package/dist/cjs/components/onboarding/animated-status/index.js.map +1 -0
- package/dist/cjs/components/onboarding/animated-status/presets.json +126 -0
- package/dist/cjs/components/onboarding/animated-status/riv.js +7 -0
- package/dist/cjs/components/onboarding/animated-status/riv.js.map +1 -0
- package/dist/cjs/components/onboarding/index.js +4 -0
- package/dist/cjs/components/onboarding/index.js.map +1 -1
- package/dist/cjs/components/onboarding/presets.js +90 -84
- package/dist/cjs/components/onboarding/presets.js.map +1 -1
- package/dist/cjs/components/onboarding/receipt-printer/ReceiptStage.js +43 -6
- package/dist/cjs/components/onboarding/receipt-printer/ReceiptStage.js.map +1 -1
- package/dist/cjs/components/onboarding/send-completion/SendCompletionView.js +111 -0
- package/dist/cjs/components/onboarding/send-completion/SendCompletionView.js.map +1 -0
- package/dist/cjs/components/onboarding/send-completion/SendStage.js +37 -0
- package/dist/cjs/components/onboarding/send-completion/SendStage.js.map +1 -0
- package/dist/cjs/components/onboarding/send-completion/SendStage.types.js +6 -0
- package/dist/cjs/components/onboarding/send-completion/SendStage.types.js.map +1 -0
- package/dist/cjs/components/onboarding/send-completion/SendStage.web.js +107 -0
- package/dist/cjs/components/onboarding/send-completion/SendStage.web.js.map +1 -0
- package/dist/cjs/components/onboarding/send-completion/SendStill.js +17 -0
- package/dist/cjs/components/onboarding/send-completion/SendStill.js.map +1 -0
- package/dist/cjs/components/onboarding/send-completion/contract.js +83 -0
- package/dist/cjs/components/onboarding/send-completion/contract.js.map +1 -0
- package/dist/cjs/components/onboarding/send-completion/engine.js +32 -0
- package/dist/cjs/components/onboarding/send-completion/engine.js.map +1 -0
- package/dist/cjs/components/onboarding/send-completion/index.js +22 -0
- package/dist/cjs/components/onboarding/send-completion/index.js.map +1 -0
- package/dist/cjs/components/onboarding/send-completion/presets.json +132 -0
- package/dist/cjs/components/onboarding/send-completion/riv.js +7 -0
- package/dist/cjs/components/onboarding/send-completion/riv.js.map +1 -0
- package/dist/cjs/components/onboarding/shared/actions-data.js +2 -0
- package/dist/cjs/components/onboarding/shared/actions-data.js.map +1 -1
- package/dist/cjs/components/onboarding/shared/configColor.js +76 -0
- package/dist/cjs/components/onboarding/shared/configColor.js.map +1 -0
- package/dist/cjs/components/onboarding/shared/contract.js +4 -0
- package/dist/cjs/components/onboarding/shared/contract.js.map +1 -1
- package/dist/cjs/components/onboarding/shared/describe.js +1 -1
- package/dist/cjs/components/onboarding/shared/describe.js.map +1 -1
- package/dist/cjs/components/onboarding/shared/mock.js +2 -0
- package/dist/cjs/components/onboarding/shared/mock.js.map +1 -1
- package/dist/cjs/components/onboarding/views.js +8 -0
- package/dist/cjs/components/onboarding/views.js.map +1 -1
- package/dist/cjs/motion/MotionPlayer.js +42 -0
- package/dist/cjs/motion/MotionPlayer.js.map +1 -0
- package/dist/cjs/motion/agent.js +323 -0
- package/dist/cjs/motion/agent.js.map +1 -0
- package/dist/cjs/motion/cat/Cat.js +79 -0
- package/dist/cjs/motion/cat/Cat.js.map +1 -0
- package/dist/cjs/motion/cat/animation.js +204 -0
- package/dist/cjs/motion/cat/animation.js.map +1 -0
- package/dist/cjs/motion/cat/art.generated.js +37 -0
- package/dist/cjs/motion/cat/art.generated.js.map +1 -0
- package/dist/cjs/motion/cat/config.js +136 -0
- package/dist/cjs/motion/cat/config.js.map +1 -0
- package/dist/cjs/motion/cat/index.js +75 -0
- package/dist/cjs/motion/cat/index.js.map +1 -0
- package/dist/cjs/motion/cat/rig.js +99 -0
- package/dist/cjs/motion/cat/rig.js.map +1 -0
- package/dist/cjs/motion/cat/scene.js +148 -0
- package/dist/cjs/motion/cat/scene.js.map +1 -0
- package/dist/cjs/motion/configurable/config.js +477 -0
- package/dist/cjs/motion/configurable/config.js.map +1 -0
- package/dist/cjs/motion/configurable/controls.js +44 -0
- package/dist/cjs/motion/configurable/controls.js.map +1 -0
- package/dist/cjs/motion/easing.js +62 -0
- package/dist/cjs/motion/easing.js.map +1 -0
- package/dist/cjs/motion/fit.js +12 -0
- package/dist/cjs/motion/fit.js.map +1 -0
- package/dist/cjs/motion/index.js +101 -0
- package/dist/cjs/motion/index.js.map +1 -0
- package/dist/cjs/motion/neon/GlowRenderer.js +18 -0
- package/dist/cjs/motion/neon/GlowRenderer.js.map +1 -0
- package/dist/cjs/motion/neon/NeonCanvas.js +97 -0
- package/dist/cjs/motion/neon/NeonCanvas.js.map +1 -0
- package/dist/cjs/motion/neon/NeonText.js +108 -0
- package/dist/cjs/motion/neon/NeonText.js.map +1 -0
- package/dist/cjs/motion/neon/NeonTextFrame.js +36 -0
- package/dist/cjs/motion/neon/NeonTextFrame.js.map +1 -0
- package/dist/cjs/motion/neon/artwork.js +102 -0
- package/dist/cjs/motion/neon/artwork.js.map +1 -0
- package/dist/cjs/motion/neon/audio.js +165 -0
- package/dist/cjs/motion/neon/audio.js.map +1 -0
- package/dist/cjs/motion/neon/config.js +334 -0
- package/dist/cjs/motion/neon/config.js.map +1 -0
- package/dist/cjs/motion/neon/flicker.js +196 -0
- package/dist/cjs/motion/neon/flicker.js.map +1 -0
- package/dist/cjs/motion/neon/fonts.js +52 -0
- package/dist/cjs/motion/neon/fonts.js.map +1 -0
- package/dist/cjs/motion/neon/frame.js +24 -0
- package/dist/cjs/motion/neon/frame.js.map +1 -0
- package/dist/cjs/motion/neon/glitch.js +114 -0
- package/dist/cjs/motion/neon/glitch.js.map +1 -0
- package/dist/cjs/motion/neon/index.js +119 -0
- package/dist/cjs/motion/neon/index.js.map +1 -0
- package/dist/cjs/motion/neon/layers.js +68 -0
- package/dist/cjs/motion/neon/layers.js.map +1 -0
- package/dist/cjs/motion/neon/material.js +56 -0
- package/dist/cjs/motion/neon/material.js.map +1 -0
- package/dist/cjs/motion/neon/random.js +43 -0
- package/dist/cjs/motion/neon/random.js.map +1 -0
- package/dist/cjs/motion/neon/scene.js +549 -0
- package/dist/cjs/motion/neon/scene.js.map +1 -0
- package/dist/cjs/motion/neon/synth.js +213 -0
- package/dist/cjs/motion/neon/synth.js.map +1 -0
- package/dist/cjs/motion/neon/typography.js +81 -0
- package/dist/cjs/motion/neon/typography.js.map +1 -0
- package/dist/cjs/motion/neon/wall.js +113 -0
- package/dist/cjs/motion/neon/wall.js.map +1 -0
- package/dist/cjs/motion/paperfold/PaperFold.js +40 -0
- package/dist/cjs/motion/paperfold/PaperFold.js.map +1 -0
- package/dist/cjs/motion/paperfold/PaperFoldFrame.js +290 -0
- package/dist/cjs/motion/paperfold/PaperFoldFrame.js.map +1 -0
- package/dist/cjs/motion/paperfold/PaperFoldPlayer.js +59 -0
- package/dist/cjs/motion/paperfold/PaperFoldPlayer.js.map +1 -0
- package/dist/cjs/motion/paperfold/art.js +388 -0
- package/dist/cjs/motion/paperfold/art.js.map +1 -0
- package/dist/cjs/motion/paperfold/config.js +103 -0
- package/dist/cjs/motion/paperfold/config.js.map +1 -0
- package/dist/cjs/motion/paperfold/controls.js +493 -0
- package/dist/cjs/motion/paperfold/controls.js.map +1 -0
- package/dist/cjs/motion/paperfold/engine.js +722 -0
- package/dist/cjs/motion/paperfold/engine.js.map +1 -0
- package/dist/cjs/motion/paperfold/fonts.js +25 -0
- package/dist/cjs/motion/paperfold/fonts.js.map +1 -0
- package/dist/cjs/motion/paperfold/index.js +113 -0
- package/dist/cjs/motion/paperfold/index.js.map +1 -0
- package/dist/cjs/motion/paperfold/manipulate.js +170 -0
- package/dist/cjs/motion/paperfold/manipulate.js.map +1 -0
- package/dist/cjs/motion/paperfold/presets.js +119 -0
- package/dist/cjs/motion/paperfold/presets.js.map +1 -0
- package/dist/cjs/motion/paperfold/template.js +40 -0
- package/dist/cjs/motion/paperfold/template.js.map +1 -0
- package/dist/cjs/motion/player.js +203 -0
- package/dist/cjs/motion/player.js.map +1 -0
- package/dist/cjs/motion/promo/PromoFrame.js +293 -0
- package/dist/cjs/motion/promo/PromoFrame.js.map +1 -0
- package/dist/cjs/motion/promo/PromoShowcasePlayer.js +59 -0
- package/dist/cjs/motion/promo/PromoShowcasePlayer.js.map +1 -0
- package/dist/cjs/motion/promo/config.js +565 -0
- package/dist/cjs/motion/promo/config.js.map +1 -0
- package/dist/cjs/motion/promo/controls.js +571 -0
- package/dist/cjs/motion/promo/controls.js.map +1 -0
- package/dist/cjs/motion/promo/easing.js +35 -0
- package/dist/cjs/motion/promo/easing.js.map +1 -0
- package/dist/cjs/motion/promo/engine.js +567 -0
- package/dist/cjs/motion/promo/engine.js.map +1 -0
- package/dist/cjs/motion/promo/fonts.js +20 -0
- package/dist/cjs/motion/promo/fonts.js.map +1 -0
- package/dist/cjs/motion/promo/icons.js +29 -0
- package/dist/cjs/motion/promo/icons.js.map +1 -0
- package/dist/cjs/motion/promo/index.js +73 -0
- package/dist/cjs/motion/promo/index.js.map +1 -0
- package/dist/cjs/motion/promo/presets.js +44 -0
- package/dist/cjs/motion/promo/presets.js.map +1 -0
- package/dist/cjs/motion/promo/template.js +38 -0
- package/dist/cjs/motion/promo/template.js.map +1 -0
- package/dist/cjs/motion/replication2/Replication2Player.js +93 -0
- package/dist/cjs/motion/replication2/Replication2Player.js.map +1 -0
- package/dist/cjs/motion/replication2/config.js +352 -0
- package/dist/cjs/motion/replication2/config.js.map +1 -0
- package/dist/cjs/motion/replication2/controls.js +286 -0
- package/dist/cjs/motion/replication2/controls.js.map +1 -0
- package/dist/cjs/motion/replication2/driver.js +68 -0
- package/dist/cjs/motion/replication2/driver.js.map +1 -0
- package/dist/cjs/motion/replication2/easing.js +97 -0
- package/dist/cjs/motion/replication2/easing.js.map +1 -0
- package/dist/cjs/motion/replication2/engine.js +481 -0
- package/dist/cjs/motion/replication2/engine.js.map +1 -0
- package/dist/cjs/motion/replication2/html.js +88 -0
- package/dist/cjs/motion/replication2/html.js.map +1 -0
- package/dist/cjs/motion/replication2/index.js +61 -0
- package/dist/cjs/motion/replication2/index.js.map +1 -0
- package/dist/cjs/motion/replication2/measure.js +30 -0
- package/dist/cjs/motion/replication2/measure.js.map +1 -0
- package/dist/cjs/motion/replication2/metrics.js +10 -0
- package/dist/cjs/motion/replication2/metrics.js.map +1 -0
- package/dist/cjs/motion/replication2/presets.js +67 -0
- package/dist/cjs/motion/replication2/presets.js.map +1 -0
- package/dist/cjs/motion/replication2/riv.js +7 -0
- package/dist/cjs/motion/replication2/riv.js.map +1 -0
- package/dist/cjs/motion/replication2/rive-contract.js +158 -0
- package/dist/cjs/motion/replication2/rive-contract.js.map +1 -0
- package/dist/cjs/motion/replication2/template.js +35 -0
- package/dist/cjs/motion/replication2/template.js.map +1 -0
- package/dist/cjs/motion/sample.js +149 -0
- package/dist/cjs/motion/sample.js.map +1 -0
- package/dist/cjs/motion/templates/hey-template.js +1552 -0
- package/dist/cjs/motion/templates/hey-template.js.map +1 -0
- package/dist/cjs/motion/templates/index.js +22 -0
- package/dist/cjs/motion/templates/index.js.map +1 -0
- package/dist/cjs/motion/templates/word-motion.js +1165 -0
- package/dist/cjs/motion/templates/word-motion.js.map +1 -0
- package/dist/cjs/motion/types.js +3 -0
- package/dist/cjs/motion/types.js.map +1 -0
- package/dist/cjs/motion/typesurface/TypeSurfaceCanvas.js +62 -0
- package/dist/cjs/motion/typesurface/TypeSurfaceCanvas.js.map +1 -0
- package/dist/cjs/motion/typesurface/art.js +861 -0
- package/dist/cjs/motion/typesurface/art.js.map +1 -0
- package/dist/cjs/motion/typesurface/config.js +269 -0
- package/dist/cjs/motion/typesurface/config.js.map +1 -0
- package/dist/cjs/motion/typesurface/engine.js +607 -0
- package/dist/cjs/motion/typesurface/engine.js.map +1 -0
- package/dist/cjs/motion/typesurface/fonts.js +45 -0
- package/dist/cjs/motion/typesurface/fonts.js.map +1 -0
- package/dist/cjs/motion/typesurface/index.js +72 -0
- package/dist/cjs/motion/typesurface/index.js.map +1 -0
- package/dist/cjs/motion/typesurface/layout.js +130 -0
- package/dist/cjs/motion/typesurface/layout.js.map +1 -0
- package/dist/cjs/motion/typesurface/ops.js +175 -0
- package/dist/cjs/motion/typesurface/ops.js.map +1 -0
- package/dist/cjs/motion/typesurface/presets.js +192 -0
- package/dist/cjs/motion/typesurface/presets.js.map +1 -0
- package/dist/cjs/motion/typesurface/renderer.js +672 -0
- package/dist/cjs/motion/typesurface/renderer.js.map +1 -0
- package/dist/cjs/motion/typesurface/shaders.js +300 -0
- package/dist/cjs/motion/typesurface/shaders.js.map +1 -0
- package/dist/cjs/motion/typesurface/surfaces.js +156 -0
- package/dist/cjs/motion/typesurface/surfaces.js.map +1 -0
- package/dist/cjs/motion/typesurface/text.js +34 -0
- package/dist/cjs/motion/typesurface/text.js.map +1 -0
- package/dist/cjs/motion/typesurface/timeline.js +64 -0
- package/dist/cjs/motion/typesurface/timeline.js.map +1 -0
- package/dist/cjs/motion/validate.js +89 -0
- package/dist/cjs/motion/validate.js.map +1 -0
- package/dist/cjs/native/RiveReceiptStage.js +9 -150
- package/dist/cjs/native/RiveReceiptStage.js.map +1 -1
- package/dist/cjs/native/riveReceiptStageFactory.js +162 -0
- package/dist/cjs/native/riveReceiptStageFactory.js.map +1 -0
- package/dist/cjs/tokens/stage.js +10 -0
- package/dist/cjs/tokens/stage.js.map +1 -0
- package/dist/esm/agent/AgentComponent.js +1 -1
- package/dist/esm/agent/AgentComponent.js.map +1 -1
- package/dist/esm/agent/manifests.d.ts.map +1 -1
- package/dist/esm/agent/manifests.js +81 -1
- package/dist/esm/agent/manifests.js.map +1 -1
- package/dist/esm/agent/result.d.ts.map +1 -1
- package/dist/esm/agent/result.js +6 -0
- package/dist/esm/agent/result.js.map +1 -1
- package/dist/esm/agent/types.d.ts +1 -1
- package/dist/esm/agent/types.d.ts.map +1 -1
- package/dist/esm/components/catalog.d.ts +1 -1
- package/dist/esm/components/catalog.d.ts.map +1 -1
- package/dist/esm/components/catalog.js +18 -0
- package/dist/esm/components/catalog.js.map +1 -1
- package/dist/esm/components/onboarding/animated-status/AnimatedStage.d.ts +9 -0
- package/dist/esm/components/onboarding/animated-status/AnimatedStage.d.ts.map +1 -0
- package/dist/esm/components/onboarding/animated-status/AnimatedStage.js +18 -0
- package/dist/esm/components/onboarding/animated-status/AnimatedStage.js.map +1 -0
- package/dist/esm/components/onboarding/animated-status/AnimatedStage.types.d.ts +31 -0
- package/dist/esm/components/onboarding/animated-status/AnimatedStage.types.d.ts.map +1 -0
- package/dist/esm/components/onboarding/animated-status/AnimatedStage.types.js +3 -0
- package/dist/esm/components/onboarding/animated-status/AnimatedStage.types.js.map +1 -0
- package/dist/esm/components/onboarding/animated-status/AnimatedStage.web.d.ts +4 -0
- package/dist/esm/components/onboarding/animated-status/AnimatedStage.web.d.ts.map +1 -0
- package/dist/esm/components/onboarding/animated-status/AnimatedStage.web.js +86 -0
- package/dist/esm/components/onboarding/animated-status/AnimatedStage.web.js.map +1 -0
- package/dist/esm/components/onboarding/animated-status/AnimatedStatusView.d.ts +32 -0
- package/dist/esm/components/onboarding/animated-status/AnimatedStatusView.d.ts.map +1 -0
- package/dist/esm/components/onboarding/animated-status/AnimatedStatusView.js +59 -0
- package/dist/esm/components/onboarding/animated-status/AnimatedStatusView.js.map +1 -0
- package/dist/esm/components/onboarding/animated-status/AnimatedStill.d.ts +8 -0
- package/dist/esm/components/onboarding/animated-status/AnimatedStill.d.ts.map +1 -0
- package/dist/esm/components/onboarding/animated-status/AnimatedStill.js +17 -0
- package/dist/esm/components/onboarding/animated-status/AnimatedStill.js.map +1 -0
- package/dist/esm/components/onboarding/animated-status/contract.d.ts +61 -0
- package/dist/esm/components/onboarding/animated-status/contract.d.ts.map +1 -0
- package/dist/esm/components/onboarding/animated-status/contract.js +78 -0
- package/dist/esm/components/onboarding/animated-status/contract.js.map +1 -0
- package/dist/esm/components/onboarding/animated-status/engine.d.ts +24 -0
- package/dist/esm/components/onboarding/animated-status/engine.d.ts.map +1 -0
- package/dist/esm/components/onboarding/animated-status/engine.js +32 -0
- package/dist/esm/components/onboarding/animated-status/engine.js.map +1 -0
- package/dist/esm/components/onboarding/animated-status/index.d.ts +5 -0
- package/dist/esm/components/onboarding/animated-status/index.d.ts.map +1 -0
- package/dist/esm/components/onboarding/animated-status/index.js +4 -0
- package/dist/esm/components/onboarding/animated-status/index.js.map +1 -0
- package/dist/esm/components/onboarding/animated-status/presets.json +126 -0
- package/dist/esm/components/onboarding/animated-status/riv.d.ts +3 -0
- package/dist/esm/components/onboarding/animated-status/riv.d.ts.map +1 -0
- package/dist/esm/components/onboarding/animated-status/riv.js +4 -0
- package/dist/esm/components/onboarding/animated-status/riv.js.map +1 -0
- package/dist/esm/components/onboarding/index.d.ts +2 -0
- package/dist/esm/components/onboarding/index.d.ts.map +1 -1
- package/dist/esm/components/onboarding/index.js +4 -0
- package/dist/esm/components/onboarding/index.js.map +1 -1
- package/dist/esm/components/onboarding/presets.d.ts.map +1 -1
- package/dist/esm/components/onboarding/presets.js +6 -0
- package/dist/esm/components/onboarding/presets.js.map +1 -1
- package/dist/esm/components/onboarding/receipt-printer/ReceiptStage.d.ts +4 -6
- package/dist/esm/components/onboarding/receipt-printer/ReceiptStage.d.ts.map +1 -1
- package/dist/esm/components/onboarding/receipt-printer/ReceiptStage.js +42 -6
- package/dist/esm/components/onboarding/receipt-printer/ReceiptStage.js.map +1 -1
- package/dist/esm/components/onboarding/send-completion/SendCompletionView.d.ts +47 -0
- package/dist/esm/components/onboarding/send-completion/SendCompletionView.d.ts.map +1 -0
- package/dist/esm/components/onboarding/send-completion/SendCompletionView.js +108 -0
- package/dist/esm/components/onboarding/send-completion/SendCompletionView.js.map +1 -0
- package/dist/esm/components/onboarding/send-completion/SendStage.d.ts +9 -0
- package/dist/esm/components/onboarding/send-completion/SendStage.d.ts.map +1 -0
- package/dist/esm/components/onboarding/send-completion/SendStage.js +34 -0
- package/dist/esm/components/onboarding/send-completion/SendStage.js.map +1 -0
- package/dist/esm/components/onboarding/send-completion/SendStage.types.d.ts +33 -0
- package/dist/esm/components/onboarding/send-completion/SendStage.types.d.ts.map +1 -0
- package/dist/esm/components/onboarding/send-completion/SendStage.types.js +3 -0
- package/dist/esm/components/onboarding/send-completion/SendStage.types.js.map +1 -0
- package/dist/esm/components/onboarding/send-completion/SendStage.web.d.ts +4 -0
- package/dist/esm/components/onboarding/send-completion/SendStage.web.d.ts.map +1 -0
- package/dist/esm/components/onboarding/send-completion/SendStage.web.js +104 -0
- package/dist/esm/components/onboarding/send-completion/SendStage.web.js.map +1 -0
- package/dist/esm/components/onboarding/send-completion/SendStill.d.ts +11 -0
- package/dist/esm/components/onboarding/send-completion/SendStill.d.ts.map +1 -0
- package/dist/esm/components/onboarding/send-completion/SendStill.js +14 -0
- package/dist/esm/components/onboarding/send-completion/SendStill.js.map +1 -0
- package/dist/esm/components/onboarding/send-completion/contract.d.ts +99 -0
- package/dist/esm/components/onboarding/send-completion/contract.d.ts.map +1 -0
- package/dist/esm/components/onboarding/send-completion/contract.js +76 -0
- package/dist/esm/components/onboarding/send-completion/contract.js.map +1 -0
- package/dist/esm/components/onboarding/send-completion/engine.d.ts +20 -0
- package/dist/esm/components/onboarding/send-completion/engine.d.ts.map +1 -0
- package/dist/esm/components/onboarding/send-completion/engine.js +28 -0
- package/dist/esm/components/onboarding/send-completion/engine.js.map +1 -0
- package/dist/esm/components/onboarding/send-completion/index.d.ts +6 -0
- package/dist/esm/components/onboarding/send-completion/index.d.ts.map +1 -0
- package/dist/esm/components/onboarding/send-completion/index.js +6 -0
- package/dist/esm/components/onboarding/send-completion/index.js.map +1 -0
- package/dist/esm/components/onboarding/send-completion/presets.json +132 -0
- package/dist/esm/components/onboarding/send-completion/riv.d.ts +3 -0
- package/dist/esm/components/onboarding/send-completion/riv.d.ts.map +1 -0
- package/dist/esm/components/onboarding/send-completion/riv.js +4 -0
- package/dist/esm/components/onboarding/send-completion/riv.js.map +1 -0
- package/dist/esm/components/onboarding/shared/actions-data.d.ts.map +1 -1
- package/dist/esm/components/onboarding/shared/actions-data.js +2 -0
- package/dist/esm/components/onboarding/shared/actions-data.js.map +1 -1
- package/dist/esm/components/onboarding/shared/configColor.d.ts +29 -0
- package/dist/esm/components/onboarding/shared/configColor.d.ts.map +1 -0
- package/dist/esm/components/onboarding/shared/configColor.js +69 -0
- package/dist/esm/components/onboarding/shared/configColor.js.map +1 -0
- package/dist/esm/components/onboarding/shared/contract.d.ts +1 -1
- package/dist/esm/components/onboarding/shared/contract.d.ts.map +1 -1
- package/dist/esm/components/onboarding/shared/contract.js +4 -0
- package/dist/esm/components/onboarding/shared/contract.js.map +1 -1
- package/dist/esm/components/onboarding/shared/describe.d.ts.map +1 -1
- package/dist/esm/components/onboarding/shared/describe.js +1 -1
- package/dist/esm/components/onboarding/shared/describe.js.map +1 -1
- package/dist/esm/components/onboarding/shared/mock.d.ts +2 -0
- package/dist/esm/components/onboarding/shared/mock.d.ts.map +1 -1
- package/dist/esm/components/onboarding/shared/mock.js +2 -0
- package/dist/esm/components/onboarding/shared/mock.js.map +1 -1
- package/dist/esm/components/onboarding/views.d.ts.map +1 -1
- package/dist/esm/components/onboarding/views.js +8 -0
- package/dist/esm/components/onboarding/views.js.map +1 -1
- package/dist/esm/motion/MotionPlayer.d.ts +22 -0
- package/dist/esm/motion/MotionPlayer.d.ts.map +1 -0
- package/dist/esm/motion/MotionPlayer.js +39 -0
- package/dist/esm/motion/MotionPlayer.js.map +1 -0
- package/dist/esm/motion/agent.d.ts +146 -0
- package/dist/esm/motion/agent.d.ts.map +1 -0
- package/dist/esm/motion/agent.js +278 -0
- package/dist/esm/motion/agent.js.map +1 -0
- package/dist/esm/motion/cat/Cat.d.ts +43 -0
- package/dist/esm/motion/cat/Cat.d.ts.map +1 -0
- package/dist/esm/motion/cat/Cat.js +74 -0
- package/dist/esm/motion/cat/Cat.js.map +1 -0
- package/dist/esm/motion/cat/animation.d.ts +86 -0
- package/dist/esm/motion/cat/animation.d.ts.map +1 -0
- package/dist/esm/motion/cat/animation.js +193 -0
- package/dist/esm/motion/cat/animation.js.map +1 -0
- package/dist/esm/motion/cat/art.generated.d.ts +53 -0
- package/dist/esm/motion/cat/art.generated.d.ts.map +1 -0
- package/dist/esm/motion/cat/art.generated.js +34 -0
- package/dist/esm/motion/cat/art.generated.js.map +1 -0
- package/dist/esm/motion/cat/config.d.ts +103 -0
- package/dist/esm/motion/cat/config.d.ts.map +1 -0
- package/dist/esm/motion/cat/config.js +129 -0
- package/dist/esm/motion/cat/config.js.map +1 -0
- package/dist/esm/motion/cat/index.d.ts +13 -0
- package/dist/esm/motion/cat/index.d.ts.map +1 -0
- package/dist/esm/motion/cat/index.js +13 -0
- package/dist/esm/motion/cat/index.js.map +1 -0
- package/dist/esm/motion/cat/rig.d.ts +44 -0
- package/dist/esm/motion/cat/rig.d.ts.map +1 -0
- package/dist/esm/motion/cat/rig.js +86 -0
- package/dist/esm/motion/cat/rig.js.map +1 -0
- package/dist/esm/motion/cat/scene.d.ts +66 -0
- package/dist/esm/motion/cat/scene.d.ts.map +1 -0
- package/dist/esm/motion/cat/scene.js +137 -0
- package/dist/esm/motion/cat/scene.js.map +1 -0
- package/dist/esm/motion/configurable/config.d.ts +80 -0
- package/dist/esm/motion/configurable/config.d.ts.map +1 -0
- package/dist/esm/motion/configurable/config.js +468 -0
- package/dist/esm/motion/configurable/config.js.map +1 -0
- package/dist/esm/motion/configurable/controls.d.ts +74 -0
- package/dist/esm/motion/configurable/controls.d.ts.map +1 -0
- package/dist/esm/motion/configurable/controls.js +38 -0
- package/dist/esm/motion/configurable/controls.js.map +1 -0
- package/dist/esm/motion/easing.d.ts +4 -0
- package/dist/esm/motion/easing.d.ts.map +1 -0
- package/dist/esm/motion/easing.js +58 -0
- package/dist/esm/motion/easing.js.map +1 -0
- package/dist/esm/motion/fit.d.ts +8 -0
- package/dist/esm/motion/fit.d.ts.map +1 -0
- package/dist/esm/motion/fit.js +8 -0
- package/dist/esm/motion/fit.js.map +1 -0
- package/dist/esm/motion/index.d.ts +27 -0
- package/dist/esm/motion/index.d.ts.map +1 -0
- package/dist/esm/motion/index.js +21 -0
- package/dist/esm/motion/index.js.map +1 -0
- package/dist/esm/motion/neon/GlowRenderer.d.ts +31 -0
- package/dist/esm/motion/neon/GlowRenderer.d.ts.map +1 -0
- package/dist/esm/motion/neon/GlowRenderer.js +14 -0
- package/dist/esm/motion/neon/GlowRenderer.js.map +1 -0
- package/dist/esm/motion/neon/NeonCanvas.d.ts +42 -0
- package/dist/esm/motion/neon/NeonCanvas.d.ts.map +1 -0
- package/dist/esm/motion/neon/NeonCanvas.js +92 -0
- package/dist/esm/motion/neon/NeonCanvas.js.map +1 -0
- package/dist/esm/motion/neon/NeonText.d.ts +26 -0
- package/dist/esm/motion/neon/NeonText.d.ts.map +1 -0
- package/dist/esm/motion/neon/NeonText.js +103 -0
- package/dist/esm/motion/neon/NeonText.js.map +1 -0
- package/dist/esm/motion/neon/NeonTextFrame.d.ts +29 -0
- package/dist/esm/motion/neon/NeonTextFrame.d.ts.map +1 -0
- package/dist/esm/motion/neon/NeonTextFrame.js +33 -0
- package/dist/esm/motion/neon/NeonTextFrame.js.map +1 -0
- package/dist/esm/motion/neon/artwork.d.ts +29 -0
- package/dist/esm/motion/neon/artwork.d.ts.map +1 -0
- package/dist/esm/motion/neon/artwork.js +98 -0
- package/dist/esm/motion/neon/artwork.js.map +1 -0
- package/dist/esm/motion/neon/audio.d.ts +49 -0
- package/dist/esm/motion/neon/audio.d.ts.map +1 -0
- package/dist/esm/motion/neon/audio.js +161 -0
- package/dist/esm/motion/neon/audio.js.map +1 -0
- package/dist/esm/motion/neon/config.d.ts +319 -0
- package/dist/esm/motion/neon/config.d.ts.map +1 -0
- package/dist/esm/motion/neon/config.js +319 -0
- package/dist/esm/motion/neon/config.js.map +1 -0
- package/dist/esm/motion/neon/flicker.d.ts +82 -0
- package/dist/esm/motion/neon/flicker.d.ts.map +1 -0
- package/dist/esm/motion/neon/flicker.js +187 -0
- package/dist/esm/motion/neon/flicker.js.map +1 -0
- package/dist/esm/motion/neon/fonts.d.ts +29 -0
- package/dist/esm/motion/neon/fonts.d.ts.map +1 -0
- package/dist/esm/motion/neon/fonts.js +47 -0
- package/dist/esm/motion/neon/fonts.js.map +1 -0
- package/dist/esm/motion/neon/frame.d.ts +22 -0
- package/dist/esm/motion/neon/frame.d.ts.map +1 -0
- package/dist/esm/motion/neon/frame.js +20 -0
- package/dist/esm/motion/neon/frame.js.map +1 -0
- package/dist/esm/motion/neon/glitch.d.ts +64 -0
- package/dist/esm/motion/neon/glitch.d.ts.map +1 -0
- package/dist/esm/motion/neon/glitch.js +108 -0
- package/dist/esm/motion/neon/glitch.js.map +1 -0
- package/dist/esm/motion/neon/index.d.ts +29 -0
- package/dist/esm/motion/neon/index.d.ts.map +1 -0
- package/dist/esm/motion/neon/index.js +28 -0
- package/dist/esm/motion/neon/index.js.map +1 -0
- package/dist/esm/motion/neon/layers.d.ts +56 -0
- package/dist/esm/motion/neon/layers.d.ts.map +1 -0
- package/dist/esm/motion/neon/layers.js +64 -0
- package/dist/esm/motion/neon/layers.js.map +1 -0
- package/dist/esm/motion/neon/material.d.ts +68 -0
- package/dist/esm/motion/neon/material.d.ts.map +1 -0
- package/dist/esm/motion/neon/material.js +51 -0
- package/dist/esm/motion/neon/material.js.map +1 -0
- package/dist/esm/motion/neon/random.d.ts +15 -0
- package/dist/esm/motion/neon/random.d.ts.map +1 -0
- package/dist/esm/motion/neon/random.js +37 -0
- package/dist/esm/motion/neon/random.js.map +1 -0
- package/dist/esm/motion/neon/scene.d.ts +255 -0
- package/dist/esm/motion/neon/scene.d.ts.map +1 -0
- package/dist/esm/motion/neon/scene.js +532 -0
- package/dist/esm/motion/neon/scene.js.map +1 -0
- package/dist/esm/motion/neon/synth.d.ts +18 -0
- package/dist/esm/motion/neon/synth.d.ts.map +1 -0
- package/dist/esm/motion/neon/synth.js +208 -0
- package/dist/esm/motion/neon/synth.js.map +1 -0
- package/dist/esm/motion/neon/typography.d.ts +53 -0
- package/dist/esm/motion/neon/typography.d.ts.map +1 -0
- package/dist/esm/motion/neon/typography.js +74 -0
- package/dist/esm/motion/neon/typography.js.map +1 -0
- package/dist/esm/motion/neon/wall.d.ts +62 -0
- package/dist/esm/motion/neon/wall.d.ts.map +1 -0
- package/dist/esm/motion/neon/wall.js +106 -0
- package/dist/esm/motion/neon/wall.js.map +1 -0
- package/dist/esm/motion/paperfold/PaperFold.d.ts +36 -0
- package/dist/esm/motion/paperfold/PaperFold.d.ts.map +1 -0
- package/dist/esm/motion/paperfold/PaperFold.js +37 -0
- package/dist/esm/motion/paperfold/PaperFold.js.map +1 -0
- package/dist/esm/motion/paperfold/PaperFoldFrame.d.ts +39 -0
- package/dist/esm/motion/paperfold/PaperFoldFrame.d.ts.map +1 -0
- package/dist/esm/motion/paperfold/PaperFoldFrame.js +283 -0
- package/dist/esm/motion/paperfold/PaperFoldFrame.js.map +1 -0
- package/dist/esm/motion/paperfold/PaperFoldPlayer.d.ts +27 -0
- package/dist/esm/motion/paperfold/PaperFoldPlayer.d.ts.map +1 -0
- package/dist/esm/motion/paperfold/PaperFoldPlayer.js +56 -0
- package/dist/esm/motion/paperfold/PaperFoldPlayer.js.map +1 -0
- package/dist/esm/motion/paperfold/art.d.ts +148 -0
- package/dist/esm/motion/paperfold/art.d.ts.map +1 -0
- package/dist/esm/motion/paperfold/art.js +374 -0
- package/dist/esm/motion/paperfold/art.js.map +1 -0
- package/dist/esm/motion/paperfold/config.d.ts +47 -0
- package/dist/esm/motion/paperfold/config.d.ts.map +1 -0
- package/dist/esm/motion/paperfold/config.js +96 -0
- package/dist/esm/motion/paperfold/config.js.map +1 -0
- package/dist/esm/motion/paperfold/controls.d.ts +57 -0
- package/dist/esm/motion/paperfold/controls.d.ts.map +1 -0
- package/dist/esm/motion/paperfold/controls.js +506 -0
- package/dist/esm/motion/paperfold/controls.js.map +1 -0
- package/dist/esm/motion/paperfold/engine.d.ts +397 -0
- package/dist/esm/motion/paperfold/engine.d.ts.map +1 -0
- package/dist/esm/motion/paperfold/engine.js +699 -0
- package/dist/esm/motion/paperfold/engine.js.map +1 -0
- package/dist/esm/motion/paperfold/fonts.d.ts +3 -0
- package/dist/esm/motion/paperfold/fonts.d.ts.map +1 -0
- package/dist/esm/motion/paperfold/fonts.js +21 -0
- package/dist/esm/motion/paperfold/fonts.js.map +1 -0
- package/dist/esm/motion/paperfold/index.d.ts +17 -0
- package/dist/esm/motion/paperfold/index.d.ts.map +1 -0
- package/dist/esm/motion/paperfold/index.js +17 -0
- package/dist/esm/motion/paperfold/index.js.map +1 -0
- package/dist/esm/motion/paperfold/manipulate.d.ts +59 -0
- package/dist/esm/motion/paperfold/manipulate.d.ts.map +1 -0
- package/dist/esm/motion/paperfold/manipulate.js +161 -0
- package/dist/esm/motion/paperfold/manipulate.js.map +1 -0
- package/dist/esm/motion/paperfold/presets.d.ts +9 -0
- package/dist/esm/motion/paperfold/presets.d.ts.map +1 -0
- package/dist/esm/motion/paperfold/presets.js +115 -0
- package/dist/esm/motion/paperfold/presets.js.map +1 -0
- package/dist/esm/motion/paperfold/template.d.ts +3 -0
- package/dist/esm/motion/paperfold/template.d.ts.map +1 -0
- package/dist/esm/motion/paperfold/template.js +37 -0
- package/dist/esm/motion/paperfold/template.js.map +1 -0
- package/dist/esm/motion/player.d.ts +35 -0
- package/dist/esm/motion/player.d.ts.map +1 -0
- package/dist/esm/motion/player.js +197 -0
- package/dist/esm/motion/player.js.map +1 -0
- package/dist/esm/motion/promo/PromoFrame.d.ts +31 -0
- package/dist/esm/motion/promo/PromoFrame.d.ts.map +1 -0
- package/dist/esm/motion/promo/PromoFrame.js +288 -0
- package/dist/esm/motion/promo/PromoFrame.js.map +1 -0
- package/dist/esm/motion/promo/PromoShowcasePlayer.d.ts +25 -0
- package/dist/esm/motion/promo/PromoShowcasePlayer.d.ts.map +1 -0
- package/dist/esm/motion/promo/PromoShowcasePlayer.js +56 -0
- package/dist/esm/motion/promo/PromoShowcasePlayer.js.map +1 -0
- package/dist/esm/motion/promo/config.d.ts +91 -0
- package/dist/esm/motion/promo/config.d.ts.map +1 -0
- package/dist/esm/motion/promo/config.js +550 -0
- package/dist/esm/motion/promo/config.js.map +1 -0
- package/dist/esm/motion/promo/controls.d.ts +86 -0
- package/dist/esm/motion/promo/controls.d.ts.map +1 -0
- package/dist/esm/motion/promo/controls.js +567 -0
- package/dist/esm/motion/promo/controls.js.map +1 -0
- package/dist/esm/motion/promo/easing.d.ts +3 -0
- package/dist/esm/motion/promo/easing.d.ts.map +1 -0
- package/dist/esm/motion/promo/easing.js +32 -0
- package/dist/esm/motion/promo/easing.js.map +1 -0
- package/dist/esm/motion/promo/engine.d.ts +205 -0
- package/dist/esm/motion/promo/engine.d.ts.map +1 -0
- package/dist/esm/motion/promo/engine.js +551 -0
- package/dist/esm/motion/promo/engine.js.map +1 -0
- package/dist/esm/motion/promo/fonts.d.ts +7 -0
- package/dist/esm/motion/promo/fonts.d.ts.map +1 -0
- package/dist/esm/motion/promo/fonts.js +16 -0
- package/dist/esm/motion/promo/fonts.js.map +1 -0
- package/dist/esm/motion/promo/icons.d.ts +7 -0
- package/dist/esm/motion/promo/icons.d.ts.map +1 -0
- package/dist/esm/motion/promo/icons.js +26 -0
- package/dist/esm/motion/promo/icons.js.map +1 -0
- package/dist/esm/motion/promo/index.d.ts +15 -0
- package/dist/esm/motion/promo/index.d.ts.map +1 -0
- package/dist/esm/motion/promo/index.js +15 -0
- package/dist/esm/motion/promo/index.js.map +1 -0
- package/dist/esm/motion/promo/presets.d.ts +13 -0
- package/dist/esm/motion/promo/presets.d.ts.map +1 -0
- package/dist/esm/motion/promo/presets.js +40 -0
- package/dist/esm/motion/promo/presets.js.map +1 -0
- package/dist/esm/motion/promo/template.d.ts +8 -0
- package/dist/esm/motion/promo/template.d.ts.map +1 -0
- package/dist/esm/motion/promo/template.js +35 -0
- package/dist/esm/motion/promo/template.js.map +1 -0
- package/dist/esm/motion/replication2/Replication2Player.d.ts +26 -0
- package/dist/esm/motion/replication2/Replication2Player.d.ts.map +1 -0
- package/dist/esm/motion/replication2/Replication2Player.js +90 -0
- package/dist/esm/motion/replication2/Replication2Player.js.map +1 -0
- package/dist/esm/motion/replication2/config.d.ts +78 -0
- package/dist/esm/motion/replication2/config.d.ts.map +1 -0
- package/dist/esm/motion/replication2/config.js +341 -0
- package/dist/esm/motion/replication2/config.js.map +1 -0
- package/dist/esm/motion/replication2/controls.d.ts +70 -0
- package/dist/esm/motion/replication2/controls.d.ts.map +1 -0
- package/dist/esm/motion/replication2/controls.js +283 -0
- package/dist/esm/motion/replication2/controls.js.map +1 -0
- package/dist/esm/motion/replication2/driver.d.ts +23 -0
- package/dist/esm/motion/replication2/driver.d.ts.map +1 -0
- package/dist/esm/motion/replication2/driver.js +65 -0
- package/dist/esm/motion/replication2/driver.js.map +1 -0
- package/dist/esm/motion/replication2/easing.d.ts +19 -0
- package/dist/esm/motion/replication2/easing.d.ts.map +1 -0
- package/dist/esm/motion/replication2/easing.js +92 -0
- package/dist/esm/motion/replication2/easing.js.map +1 -0
- package/dist/esm/motion/replication2/engine.d.ts +236 -0
- package/dist/esm/motion/replication2/engine.d.ts.map +1 -0
- package/dist/esm/motion/replication2/engine.js +470 -0
- package/dist/esm/motion/replication2/engine.js.map +1 -0
- package/dist/esm/motion/replication2/html.d.ts +30 -0
- package/dist/esm/motion/replication2/html.d.ts.map +1 -0
- package/dist/esm/motion/replication2/html.js +83 -0
- package/dist/esm/motion/replication2/html.js.map +1 -0
- package/dist/esm/motion/replication2/index.d.ts +15 -0
- package/dist/esm/motion/replication2/index.d.ts.map +1 -0
- package/dist/esm/motion/replication2/index.js +15 -0
- package/dist/esm/motion/replication2/index.js.map +1 -0
- package/dist/esm/motion/replication2/measure.d.ts +3 -0
- package/dist/esm/motion/replication2/measure.d.ts.map +1 -0
- package/dist/esm/motion/replication2/measure.js +27 -0
- package/dist/esm/motion/replication2/measure.js.map +1 -0
- package/dist/esm/motion/replication2/metrics.d.ts +6 -0
- package/dist/esm/motion/replication2/metrics.d.ts.map +1 -0
- package/dist/esm/motion/replication2/metrics.js +7 -0
- package/dist/esm/motion/replication2/metrics.js.map +1 -0
- package/dist/esm/motion/replication2/presets.d.ts +13 -0
- package/dist/esm/motion/replication2/presets.d.ts.map +1 -0
- package/dist/esm/motion/replication2/presets.js +63 -0
- package/dist/esm/motion/replication2/presets.js.map +1 -0
- package/dist/esm/motion/replication2/riv.d.ts +3 -0
- package/dist/esm/motion/replication2/riv.d.ts.map +1 -0
- package/dist/esm/motion/replication2/riv.js +4 -0
- package/dist/esm/motion/replication2/riv.js.map +1 -0
- package/dist/esm/motion/replication2/rive-contract.d.ts +27 -0
- package/dist/esm/motion/replication2/rive-contract.d.ts.map +1 -0
- package/dist/esm/motion/replication2/rive-contract.js +153 -0
- package/dist/esm/motion/replication2/rive-contract.js.map +1 -0
- package/dist/esm/motion/replication2/template.d.ts +8 -0
- package/dist/esm/motion/replication2/template.d.ts.map +1 -0
- package/dist/esm/motion/replication2/template.js +32 -0
- package/dist/esm/motion/replication2/template.js.map +1 -0
- package/dist/esm/motion/sample.d.ts +61 -0
- package/dist/esm/motion/sample.d.ts.map +1 -0
- package/dist/esm/motion/sample.js +138 -0
- package/dist/esm/motion/sample.js.map +1 -0
- package/dist/esm/motion/templates/hey-template.d.ts +3 -0
- package/dist/esm/motion/templates/hey-template.d.ts.map +1 -0
- package/dist/esm/motion/templates/hey-template.js +1549 -0
- package/dist/esm/motion/templates/hey-template.js.map +1 -0
- package/dist/esm/motion/templates/index.d.ts +22 -0
- package/dist/esm/motion/templates/index.d.ts.map +1 -0
- package/dist/esm/motion/templates/index.js +15 -0
- package/dist/esm/motion/templates/index.js.map +1 -0
- package/dist/esm/motion/templates/word-motion.d.ts +3 -0
- package/dist/esm/motion/templates/word-motion.d.ts.map +1 -0
- package/dist/esm/motion/templates/word-motion.js +1162 -0
- package/dist/esm/motion/templates/word-motion.js.map +1 -0
- package/dist/esm/motion/types.d.ts +192 -0
- package/dist/esm/motion/types.d.ts.map +1 -0
- package/dist/esm/motion/types.js +2 -0
- package/dist/esm/motion/types.js.map +1 -0
- package/dist/esm/motion/typesurface/TypeSurfaceCanvas.d.ts +22 -0
- package/dist/esm/motion/typesurface/TypeSurfaceCanvas.d.ts.map +1 -0
- package/dist/esm/motion/typesurface/TypeSurfaceCanvas.js +58 -0
- package/dist/esm/motion/typesurface/TypeSurfaceCanvas.js.map +1 -0
- package/dist/esm/motion/typesurface/art.d.ts +21 -0
- package/dist/esm/motion/typesurface/art.d.ts.map +1 -0
- package/dist/esm/motion/typesurface/art.js +854 -0
- package/dist/esm/motion/typesurface/art.js.map +1 -0
- package/dist/esm/motion/typesurface/config.d.ts +273 -0
- package/dist/esm/motion/typesurface/config.d.ts.map +1 -0
- package/dist/esm/motion/typesurface/config.js +260 -0
- package/dist/esm/motion/typesurface/config.js.map +1 -0
- package/dist/esm/motion/typesurface/engine.d.ts +94 -0
- package/dist/esm/motion/typesurface/engine.d.ts.map +1 -0
- package/dist/esm/motion/typesurface/engine.js +603 -0
- package/dist/esm/motion/typesurface/engine.js.map +1 -0
- package/dist/esm/motion/typesurface/fonts.d.ts +25 -0
- package/dist/esm/motion/typesurface/fonts.d.ts.map +1 -0
- package/dist/esm/motion/typesurface/fonts.js +40 -0
- package/dist/esm/motion/typesurface/fonts.js.map +1 -0
- package/dist/esm/motion/typesurface/index.d.ts +17 -0
- package/dist/esm/motion/typesurface/index.d.ts.map +1 -0
- package/dist/esm/motion/typesurface/index.js +17 -0
- package/dist/esm/motion/typesurface/index.js.map +1 -0
- package/dist/esm/motion/typesurface/layout.d.ts +57 -0
- package/dist/esm/motion/typesurface/layout.d.ts.map +1 -0
- package/dist/esm/motion/typesurface/layout.js +122 -0
- package/dist/esm/motion/typesurface/layout.js.map +1 -0
- package/dist/esm/motion/typesurface/ops.d.ts +70 -0
- package/dist/esm/motion/typesurface/ops.d.ts.map +1 -0
- package/dist/esm/motion/typesurface/ops.js +164 -0
- package/dist/esm/motion/typesurface/ops.js.map +1 -0
- package/dist/esm/motion/typesurface/presets.d.ts +33 -0
- package/dist/esm/motion/typesurface/presets.d.ts.map +1 -0
- package/dist/esm/motion/typesurface/presets.js +185 -0
- package/dist/esm/motion/typesurface/presets.js.map +1 -0
- package/dist/esm/motion/typesurface/renderer.d.ts +78 -0
- package/dist/esm/motion/typesurface/renderer.d.ts.map +1 -0
- package/dist/esm/motion/typesurface/renderer.js +666 -0
- package/dist/esm/motion/typesurface/renderer.js.map +1 -0
- package/dist/esm/motion/typesurface/shaders.d.ts +17 -0
- package/dist/esm/motion/typesurface/shaders.d.ts.map +1 -0
- package/dist/esm/motion/typesurface/shaders.js +297 -0
- package/dist/esm/motion/typesurface/shaders.js.map +1 -0
- package/dist/esm/motion/typesurface/surfaces.d.ts +81 -0
- package/dist/esm/motion/typesurface/surfaces.d.ts.map +1 -0
- package/dist/esm/motion/typesurface/surfaces.js +149 -0
- package/dist/esm/motion/typesurface/surfaces.js.map +1 -0
- package/dist/esm/motion/typesurface/text.d.ts +17 -0
- package/dist/esm/motion/typesurface/text.d.ts.map +1 -0
- package/dist/esm/motion/typesurface/text.js +28 -0
- package/dist/esm/motion/typesurface/text.js.map +1 -0
- package/dist/esm/motion/typesurface/timeline.d.ts +15 -0
- package/dist/esm/motion/typesurface/timeline.d.ts.map +1 -0
- package/dist/esm/motion/typesurface/timeline.js +57 -0
- package/dist/esm/motion/typesurface/timeline.js.map +1 -0
- package/dist/esm/motion/validate.d.ts +22 -0
- package/dist/esm/motion/validate.d.ts.map +1 -0
- package/dist/esm/motion/validate.js +84 -0
- package/dist/esm/motion/validate.js.map +1 -0
- package/dist/esm/native/RiveReceiptStage.d.ts +25 -2
- package/dist/esm/native/RiveReceiptStage.d.ts.map +1 -1
- package/dist/esm/native/RiveReceiptStage.js +7 -148
- package/dist/esm/native/RiveReceiptStage.js.map +1 -1
- package/dist/esm/native/riveReceiptStageFactory.d.ts +26 -0
- package/dist/esm/native/riveReceiptStageFactory.d.ts.map +1 -0
- package/dist/esm/native/riveReceiptStageFactory.js +159 -0
- package/dist/esm/native/riveReceiptStageFactory.js.map +1 -0
- package/dist/esm/tokens/stage.d.ts +7 -0
- package/dist/esm/tokens/stage.d.ts.map +1 -0
- package/dist/esm/tokens/stage.js +7 -0
- package/dist/esm/tokens/stage.js.map +1 -0
- package/package.json +35 -1
- package/spec/examples/components/onboarding/animated-status/case1.json +42 -0
- package/spec/examples/components/onboarding/animated-status/case2.json +42 -0
- package/spec/examples/components/onboarding/animated-status/case3.json +42 -0
- package/spec/examples/components/onboarding/animated-status/case4.json +42 -0
- package/spec/examples/components/onboarding/animated-status/case5.json +42 -0
- package/spec/examples/components/onboarding/send-completion/case1.json +48 -0
- package/spec/examples/components/onboarding/send-completion/case2.json +48 -0
- package/spec/examples/components/onboarding/send-completion/case3.json +48 -0
- package/spec/examples/components/onboarding/send-completion/case4.json +48 -0
- package/spec/examples/components/onboarding/send-completion/case5.json +48 -0
- package/spec/families/onboarding.schema.json +610 -1
- package/src/agent/AgentComponent.tsx +1 -1
- package/src/agent/manifests.ts +83 -1
- package/src/agent/result.ts +6 -0
- package/src/agent/types.ts +1 -1
- package/src/components/catalog.ts +21 -1
- package/src/components/onboarding/animated-status/AnimatedStage.tsx +18 -0
- package/src/components/onboarding/animated-status/AnimatedStage.types.ts +30 -0
- package/src/components/onboarding/animated-status/AnimatedStage.web.tsx +99 -0
- package/src/components/onboarding/animated-status/AnimatedStatusView.tsx +109 -0
- package/src/components/onboarding/animated-status/AnimatedStill.tsx +23 -0
- package/src/components/onboarding/animated-status/contract.ts +105 -0
- package/src/components/onboarding/animated-status/engine.ts +49 -0
- package/src/components/onboarding/animated-status/index.ts +8 -0
- package/src/components/onboarding/animated-status/presets.json +126 -0
- package/src/components/onboarding/animated-status/riv.ts +4 -0
- package/src/components/onboarding/index.ts +4 -0
- package/src/components/onboarding/presets.ts +6 -0
- package/src/components/onboarding/receipt-printer/ReceiptStage.tsx +46 -7
- package/src/components/onboarding/send-completion/SendCompletionView.tsx +164 -0
- package/src/components/onboarding/send-completion/SendStage.tsx +27 -0
- package/src/components/onboarding/send-completion/SendStage.types.ts +32 -0
- package/src/components/onboarding/send-completion/SendStage.web.tsx +116 -0
- package/src/components/onboarding/send-completion/SendStill.tsx +19 -0
- package/src/components/onboarding/send-completion/contract.ts +127 -0
- package/src/components/onboarding/send-completion/engine.ts +37 -0
- package/src/components/onboarding/send-completion/index.ts +10 -0
- package/src/components/onboarding/send-completion/presets.json +132 -0
- package/src/components/onboarding/send-completion/riv.ts +4 -0
- package/src/components/onboarding/shared/actions-data.ts +2 -0
- package/src/components/onboarding/shared/configColor.ts +72 -0
- package/src/components/onboarding/shared/contract.ts +4 -0
- package/src/components/onboarding/shared/describe.ts +1 -1
- package/src/components/onboarding/shared/mock.ts +2 -0
- package/src/components/onboarding/views.ts +8 -0
- package/src/motion/MotionPlayer.tsx +62 -0
- package/src/motion/agent.ts +288 -0
- package/src/motion/cat/Cat.tsx +118 -0
- package/src/motion/cat/animation.ts +206 -0
- package/src/motion/cat/art.generated.ts +44 -0
- package/src/motion/cat/config.ts +186 -0
- package/src/motion/cat/index.ts +26 -0
- package/src/motion/cat/rig.ts +102 -0
- package/src/motion/cat/scene.ts +181 -0
- package/src/motion/configurable/config.ts +420 -0
- package/src/motion/configurable/controls.ts +93 -0
- package/src/motion/easing.ts +55 -0
- package/src/motion/fit.ts +8 -0
- package/src/motion/index.ts +29 -0
- package/src/motion/neon/GlowRenderer.tsx +83 -0
- package/src/motion/neon/NeonCanvas.tsx +175 -0
- package/src/motion/neon/NeonText.tsx +113 -0
- package/src/motion/neon/NeonTextFrame.tsx +67 -0
- package/src/motion/neon/artwork.ts +95 -0
- package/src/motion/neon/audio.ts +162 -0
- package/src/motion/neon/config.ts +484 -0
- package/src/motion/neon/flicker.ts +225 -0
- package/src/motion/neon/fonts.ts +76 -0
- package/src/motion/neon/frame.ts +34 -0
- package/src/motion/neon/glitch.ts +142 -0
- package/src/motion/neon/index.ts +41 -0
- package/src/motion/neon/layers.tsx +209 -0
- package/src/motion/neon/material.ts +88 -0
- package/src/motion/neon/random.ts +40 -0
- package/src/motion/neon/scene.ts +610 -0
- package/src/motion/neon/synth.ts +188 -0
- package/src/motion/neon/typography.ts +102 -0
- package/src/motion/neon/wall.ts +157 -0
- package/src/motion/paperfold/PaperFold.tsx +45 -0
- package/src/motion/paperfold/PaperFoldFrame.tsx +576 -0
- package/src/motion/paperfold/PaperFoldPlayer.tsx +80 -0
- package/src/motion/paperfold/art.ts +455 -0
- package/src/motion/paperfold/config.ts +98 -0
- package/src/motion/paperfold/controls.ts +557 -0
- package/src/motion/paperfold/engine.ts +852 -0
- package/src/motion/paperfold/fonts.ts +21 -0
- package/src/motion/paperfold/index.ts +30 -0
- package/src/motion/paperfold/manipulate.ts +188 -0
- package/src/motion/paperfold/presets.ts +117 -0
- package/src/motion/paperfold/template.ts +38 -0
- package/src/motion/player.ts +207 -0
- package/src/motion/promo/PromoFrame.tsx +501 -0
- package/src/motion/promo/PromoShowcasePlayer.tsx +78 -0
- package/src/motion/promo/config.ts +479 -0
- package/src/motion/promo/controls.ts +643 -0
- package/src/motion/promo/easing.ts +36 -0
- package/src/motion/promo/engine.ts +587 -0
- package/src/motion/promo/fonts.ts +16 -0
- package/src/motion/promo/icons.tsx +29 -0
- package/src/motion/promo/index.ts +24 -0
- package/src/motion/promo/presets.ts +40 -0
- package/src/motion/promo/template.ts +36 -0
- package/src/motion/replication2/Replication2Player.tsx +115 -0
- package/src/motion/replication2/config.ts +323 -0
- package/src/motion/replication2/controls.ts +336 -0
- package/src/motion/replication2/driver.ts +92 -0
- package/src/motion/replication2/easing.ts +88 -0
- package/src/motion/replication2/engine.ts +539 -0
- package/src/motion/replication2/html.ts +87 -0
- package/src/motion/replication2/index.ts +14 -0
- package/src/motion/replication2/measure.ts +28 -0
- package/src/motion/replication2/metrics.ts +7 -0
- package/src/motion/replication2/presets.ts +63 -0
- package/src/motion/replication2/riv.ts +4 -0
- package/src/motion/replication2/rive-contract.ts +165 -0
- package/src/motion/replication2/template.ts +33 -0
- package/src/motion/sample.ts +173 -0
- package/src/motion/templates/hey-template.ts +1553 -0
- package/src/motion/templates/index.ts +17 -0
- package/src/motion/templates/word-motion.ts +1166 -0
- package/src/motion/types.ts +162 -0
- package/src/motion/typesurface/TypeSurfaceCanvas.tsx +73 -0
- package/src/motion/typesurface/art.ts +639 -0
- package/src/motion/typesurface/config.ts +486 -0
- package/src/motion/typesurface/engine.ts +586 -0
- package/src/motion/typesurface/fonts.ts +63 -0
- package/src/motion/typesurface/index.ts +16 -0
- package/src/motion/typesurface/layout.ts +133 -0
- package/src/motion/typesurface/ops.ts +196 -0
- package/src/motion/typesurface/presets.ts +199 -0
- package/src/motion/typesurface/renderer.ts +579 -0
- package/src/motion/typesurface/shaders.ts +303 -0
- package/src/motion/typesurface/surfaces.ts +223 -0
- package/src/motion/typesurface/text.ts +35 -0
- package/src/motion/typesurface/timeline.ts +58 -0
- package/src/motion/validate.ts +101 -0
- package/src/native/RiveReceiptStage.tsx +8 -155
- package/src/native/riveReceiptStageFactory.tsx +175 -0
- package/src/tokens/stage.ts +6 -0
- package/tools/ask/dist/components.mjs +6887 -46
- package/tools/ask/mcp.mjs +80 -1
|
@@ -0,0 +1,501 @@
|
|
|
1
|
+
/* eslint-disable comppack/no-raw-colour -- a video frame, not site UI: every colour is config content; the few literals are fixed tints (white highlights, black shade) of the procedural drawing (DECISIONS §26). */
|
|
2
|
+
import type { ComponentType, CSSProperties, ReactNode } from 'react';
|
|
3
|
+
import { getPath, type PromoConfig } from './config';
|
|
4
|
+
import { frameState, rgba, type Anim, type FrameState, type Rect, type TextBlock } from './engine';
|
|
5
|
+
import { Icon } from './icons';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* **The procedural renderer.** Draws one frame of promo-product-showcase from the engine's state:
|
|
9
|
+
* plain DOM (divs, CSS gradients and filters, one generated SVG turbulence for grain). No Remotion,
|
|
10
|
+
* no clock: the Remotion composition passes `useCurrentFrame()`, the web player a rAF clock, and both
|
|
11
|
+
* get the same pixels. Everything is laid out at the render size itself, so a 4K render is 4K
|
|
12
|
+
* vector drawing, never an enlarged raster.
|
|
13
|
+
*
|
|
14
|
+
* Copy is rendered as React text (escaped); images only from validated asset references.
|
|
15
|
+
*/
|
|
16
|
+
export type ImageProps = { src: string; style?: CSSProperties; alt: string };
|
|
17
|
+
export type PromoFrameProps = {
|
|
18
|
+
/** A validated, complete config (resolveConfig). */
|
|
19
|
+
config: PromoConfig;
|
|
20
|
+
/** Motion frame (60 fps). */
|
|
21
|
+
frame: number;
|
|
22
|
+
width: number;
|
|
23
|
+
height: number;
|
|
24
|
+
/** Turns an asset reference into a URL: `static:x.png` → where the host serves it. Defaults to `/x.png`. */
|
|
25
|
+
resolveAsset?: (ref: string) => string;
|
|
26
|
+
/** The image element; Remotion passes its `Img` so renders wait for images to load. */
|
|
27
|
+
ImageComponent?: ComponentType<ImageProps>;
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
const DefaultImage = ({ src, style, alt }: ImageProps) => <img src={src} style={style} alt={alt} />;
|
|
31
|
+
const defaultResolve = (ref: string) => (ref.startsWith('static:') ? `/${ref.slice(7)}` : ref);
|
|
32
|
+
export const FONT_STACK = (family: string) => `'${family}', 'Inter', system-ui, -apple-system, 'Segoe UI', sans-serif`;
|
|
33
|
+
|
|
34
|
+
type Ctx = { st: FrameState; n: (p: string) => number; s: (p: string) => string; b: (p: string) => boolean; u: number; img: (ref: string, style: CSSProperties, alt: string) => ReactNode };
|
|
35
|
+
|
|
36
|
+
const animTransform = (a: Anim, extra = '') => `translate(${a.x}px, ${a.y}px) rotate(${a.rotation}deg) scale(${a.scale}) ${extra}`.trim();
|
|
37
|
+
const animFilter = (a: Anim) => (a.blur > 0.05 ? `blur(${a.blur}px)` : undefined);
|
|
38
|
+
const abs = (r: Rect): CSSProperties => ({ position: 'absolute', left: r.x, top: r.y, width: r.width, height: r.height });
|
|
39
|
+
|
|
40
|
+
export function PromoFrame({ config, frame, width, height, resolveAsset = defaultResolve, ImageComponent = DefaultImage }: PromoFrameProps) {
|
|
41
|
+
const st = frameState(config, frame, width, height);
|
|
42
|
+
const cfg = st.cfg;
|
|
43
|
+
const n = (p: string) => getPath(cfg, p) as number;
|
|
44
|
+
const s = (p: string) => getPath(cfg, p) as string;
|
|
45
|
+
const b = (p: string) => getPath(cfg, p) as boolean;
|
|
46
|
+
const u = st.size.unit;
|
|
47
|
+
const img = (ref: string, style: CSSProperties, alt: string) => <ImageComponent src={resolveAsset(ref)} style={style} alt={alt} />;
|
|
48
|
+
const ctx: Ctx = { st, n, s, b, u, img };
|
|
49
|
+
const cam = st.camera;
|
|
50
|
+
const bgScale = 1 + (cam.scale - 1) * 0.35;
|
|
51
|
+
|
|
52
|
+
return (
|
|
53
|
+
<div
|
|
54
|
+
data-promo-frame={Math.round(st.frame * 100) / 100}
|
|
55
|
+
style={{ position: 'relative', width, height, overflow: 'hidden', background: s('canvas.backgroundColor'), fontFamily: FONT_STACK(s('typography.fontFamily')) }}
|
|
56
|
+
>
|
|
57
|
+
<div style={{ position: 'absolute', inset: 0, transform: `scale(${bgScale}) translate(${cam.driftX * 0.3}px, ${cam.driftY * 0.3}px)` }}>
|
|
58
|
+
<Background ctx={ctx} />
|
|
59
|
+
</div>
|
|
60
|
+
<Particles ctx={ctx} />
|
|
61
|
+
<div
|
|
62
|
+
style={{
|
|
63
|
+
position: 'absolute', inset: 0, opacity: st.exit.opacity, transformOrigin: '50% 50%',
|
|
64
|
+
transform: `perspective(${cam.perspective}px) translate(${-cam.x + cam.driftX}px, ${-cam.y + cam.driftY}px) rotateX(${cam.tilt}deg) rotate(${cam.rotation}deg) scale(${cam.scale})`,
|
|
65
|
+
}}
|
|
66
|
+
>
|
|
67
|
+
<Headline ctx={ctx} />
|
|
68
|
+
{st.product.visible && <Product ctx={ctx} />}
|
|
69
|
+
{st.floating.map((f, i) => <Floating key={i} ctx={ctx} i={i} f={f} />)}
|
|
70
|
+
<Cta ctx={ctx} />
|
|
71
|
+
</div>
|
|
72
|
+
<Logo ctx={ctx} />
|
|
73
|
+
{st.exit.toBase > 0 && <div style={{ position: 'absolute', inset: 0, background: s('canvas.backgroundColor'), opacity: st.exit.toBase }} />}
|
|
74
|
+
</div>
|
|
75
|
+
);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/* ─── background ──────────────────────────────────────────────────────────────────────────────── */
|
|
79
|
+
function Background({ ctx }: { ctx: Ctx }) {
|
|
80
|
+
const { st, n, s, b, u } = ctx;
|
|
81
|
+
const { width, height } = st.size;
|
|
82
|
+
const short = Math.min(width, height);
|
|
83
|
+
const stops = getPath(st.cfg, 'background.gradient.stops') as { offset: number; color: string; opacity: number }[];
|
|
84
|
+
const layers: ReactNode[] = [<div key="base" style={{ position: 'absolute', inset: 0, background: s('background.baseColor') }} />];
|
|
85
|
+
if (b('background.gradient.enabled')) {
|
|
86
|
+
const type = s('background.gradient.type');
|
|
87
|
+
const list = stops.map((x) => `${rgba(x.color, x.opacity)} ${Math.round(x.offset * 1000) / 10}%`).join(', ');
|
|
88
|
+
if (type === 'linear') layers.push(<div key="g" style={{ position: 'absolute', inset: 0, background: `linear-gradient(${n('background.gradient.angle')}deg, ${list})` }} />);
|
|
89
|
+
else if (type === 'radial') layers.push(<div key="g" style={{ position: 'absolute', inset: 0, background: `radial-gradient(ellipse at 50% 55%, ${list})` }} />);
|
|
90
|
+
else {
|
|
91
|
+
// Mesh: a soft blob of each stop colour, placed around the canvas by its offset and the angle.
|
|
92
|
+
const soft = n('background.gradient.softness');
|
|
93
|
+
const blobs = stops.map((x, i) => {
|
|
94
|
+
const a = ((n('background.gradient.angle') + x.offset * 300 + i * 17) * Math.PI) / 180;
|
|
95
|
+
const cx = 50 + 38 * Math.cos(a), cy = 50 + 38 * Math.sin(a);
|
|
96
|
+
return `radial-gradient(circle at ${cx}% ${cy}%, ${rgba(x.color, x.opacity)} 0%, ${rgba(x.color, 0)} ${Math.round(45 + soft * 45)}%)`;
|
|
97
|
+
});
|
|
98
|
+
layers.push(<div key="g" style={{ position: 'absolute', inset: 0, background: `${blobs.join(', ')}, linear-gradient(${n('background.gradient.angle')}deg, ${list})` }} />);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
const glow = (key: string, p: string, blur: number) => {
|
|
102
|
+
if (!b(`${p}.enabled`)) return;
|
|
103
|
+
const r = n(`${p}.radius`) * short;
|
|
104
|
+
layers.push(
|
|
105
|
+
<div key={key} style={{
|
|
106
|
+
position: 'absolute', left: n(`${p}.x`) * width - r, top: n(`${p}.y`) * height - r, width: 2 * r, height: 2 * r, borderRadius: '50%',
|
|
107
|
+
background: `radial-gradient(circle, ${rgba(s(`${p}.color`), n(`${p}.intensity`) * st.lightsIn)} 0%, ${rgba(s(`${p}.color`), 0)} 70%)`,
|
|
108
|
+
filter: blur > 0 ? `blur(${blur}px)` : undefined,
|
|
109
|
+
}} />,
|
|
110
|
+
);
|
|
111
|
+
};
|
|
112
|
+
glow('glow', 'background.glow', n('background.glow.blur') * u);
|
|
113
|
+
glow('glow2', 'background.secondaryGlow', 0);
|
|
114
|
+
st.lights.forEach((l, i) => layers.push(
|
|
115
|
+
<div key={`l${i}`} style={{
|
|
116
|
+
position: 'absolute', left: l.x - l.radius, top: l.y - l.radius, width: 2 * l.radius, height: 2 * l.radius, borderRadius: '50%',
|
|
117
|
+
background: `radial-gradient(circle, ${rgba(l.color, l.opacity)} 0%, ${rgba(l.color, l.opacity * 0.35)} 40%, ${rgba(l.color, 0)} 70%)`,
|
|
118
|
+
filter: l.blur > 0 ? `blur(${l.blur}px)` : undefined, mixBlendMode: 'screen',
|
|
119
|
+
}} />,
|
|
120
|
+
));
|
|
121
|
+
if (b('background.vignette.enabled')) {
|
|
122
|
+
layers.push(<div key="v" style={{ position: 'absolute', inset: 0, background: `radial-gradient(ellipse at 50% 50%, ${rgba(s('background.vignette.color'), 0)} 45%, ${rgba(s('background.vignette.color'), n('background.vignette.intensity'))} 100%)` }} />);
|
|
123
|
+
}
|
|
124
|
+
if (b('background.noise.enabled')) {
|
|
125
|
+
const seed = n('background.noise.seed');
|
|
126
|
+
layers.push(
|
|
127
|
+
<svg key="n" width={width} height={height} style={{ position: 'absolute', inset: 0, opacity: n('background.noise.opacity'), mixBlendMode: 'overlay' }} aria-hidden="true">
|
|
128
|
+
<filter id={`promo-grain-${seed}`} x="0" y="0" width="100%" height="100%">
|
|
129
|
+
<feTurbulence type="fractalNoise" baseFrequency={0.9 / (n('background.noise.scale') * Math.max(1, u))} numOctaves={2} seed={seed} stitchTiles="stitch" />
|
|
130
|
+
<feColorMatrix type="saturate" values="0" />
|
|
131
|
+
</filter>
|
|
132
|
+
<rect width="100%" height="100%" filter={`url(#promo-grain-${seed})`} />
|
|
133
|
+
</svg>,
|
|
134
|
+
);
|
|
135
|
+
}
|
|
136
|
+
return <>{layers}</>;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
function Particles({ ctx }: { ctx: Ctx }) {
|
|
140
|
+
const { st, n, s, u } = ctx;
|
|
141
|
+
if (!st.particles.length) return null;
|
|
142
|
+
const color = s('particles.color');
|
|
143
|
+
const glow = n('particles.glow'), blur = n('particles.blur') * u;
|
|
144
|
+
return (
|
|
145
|
+
<div style={{ position: 'absolute', inset: 0, filter: blur > 0 ? `blur(${blur}px)` : undefined }} aria-hidden="true">
|
|
146
|
+
{st.particles.map((p, i) => (
|
|
147
|
+
<div key={i} style={{
|
|
148
|
+
position: 'absolute', left: p.x - p.size / 2, top: p.y - p.size / 2, width: p.size, height: p.size, borderRadius: '50%',
|
|
149
|
+
background: color, opacity: p.opacity, boxShadow: glow > 0 ? `0 0 ${p.size * 2.5}px ${p.size * 0.6}px ${rgba(color, glow)}` : undefined,
|
|
150
|
+
}} />
|
|
151
|
+
))}
|
|
152
|
+
</div>
|
|
153
|
+
);
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
/* ─── copy ────────────────────────────────────────────────────────────────────────────────────── */
|
|
157
|
+
function Units({ block, style, reveal, unitStyle }: { block: TextBlock; style: CSSProperties; reveal: boolean; unitStyle?: CSSProperties }) {
|
|
158
|
+
if (!block.units.length) return null;
|
|
159
|
+
return (
|
|
160
|
+
<div style={style}>
|
|
161
|
+
{block.units.map((w, i) => {
|
|
162
|
+
const a = block.anims[i]!;
|
|
163
|
+
const inner = (
|
|
164
|
+
<span style={{ ...unitStyle, display: 'inline-block', transform: animTransform(reveal ? { ...a, y: a.y + (1 - a.clip) * 1.1 * Number(style.fontSize ?? 0) } : a), filter: animFilter(a), opacity: a.opacity, whiteSpace: 'pre' }}>
|
|
165
|
+
{w}
|
|
166
|
+
</span>
|
|
167
|
+
);
|
|
168
|
+
const last = i === block.units.length - 1;
|
|
169
|
+
return (
|
|
170
|
+
<span key={i}>
|
|
171
|
+
{reveal ? <span style={{ display: 'inline-block', overflow: 'hidden', verticalAlign: 'top', paddingBottom: '0.08em' }}>{inner}</span> : inner}
|
|
172
|
+
{last ? null : block.split === 'lines' ? <br /> : ' '}
|
|
173
|
+
</span>
|
|
174
|
+
);
|
|
175
|
+
})}
|
|
176
|
+
</div>
|
|
177
|
+
);
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
function Headline({ ctx }: { ctx: Ctx }) {
|
|
181
|
+
const { st, n, s, b, u } = ctx;
|
|
182
|
+
const t = st.layout.text;
|
|
183
|
+
const align = t.align;
|
|
184
|
+
const left = t.x - t.width / 2;
|
|
185
|
+
const titleSize = n('typography.titleSize') * u * t.titleScale;
|
|
186
|
+
const gradient = b('typography.titleGradient.enabled');
|
|
187
|
+
const titleFill: CSSProperties = gradient
|
|
188
|
+
? { backgroundImage: `linear-gradient(180deg, ${s('typography.titleGradient.from')}, ${s('typography.titleGradient.to')})`, WebkitBackgroundClip: 'text', backgroundClip: 'text', color: 'transparent', WebkitTextFillColor: 'transparent', paddingBottom: '0.08em', marginBottom: '-0.08em' }
|
|
189
|
+
: { color: s('typography.titleColor') };
|
|
190
|
+
const shadows = [
|
|
191
|
+
n('typography.shadowOpacity') > 0 ? `drop-shadow(0 ${6 * u}px ${n('typography.shadowBlur') * u}px ${rgba(s('typography.shadowColor'), n('typography.shadowOpacity'))})` : '',
|
|
192
|
+
st.bloom.title > 0 ? `drop-shadow(0 0 ${n('glow.radius') * u * 0.25}px ${rgba(s('glow.color'), st.bloom.title * 0.9)})` : '',
|
|
193
|
+
].filter(Boolean).join(' ');
|
|
194
|
+
const eyebrowPill = s('typography.eyebrowStyle') === 'pill';
|
|
195
|
+
const eyebrowSize = n('typography.eyebrowSize') * u;
|
|
196
|
+
const column = (children: ReactNode, key: string, opacity = 1, extra: Anim | undefined = undefined) => (
|
|
197
|
+
<div key={key} style={{
|
|
198
|
+
position: 'absolute', left, top: t.y, width: t.width, display: 'flex', flexDirection: 'column', gap: n('typography.gap') * u,
|
|
199
|
+
alignItems: align === 'left' ? 'flex-start' : align === 'right' ? 'flex-end' : 'center', textAlign: align, opacity,
|
|
200
|
+
transform: extra ? animTransform(extra) : undefined, filter: extra ? animFilter(extra) : undefined,
|
|
201
|
+
}}>
|
|
202
|
+
{children}
|
|
203
|
+
</div>
|
|
204
|
+
);
|
|
205
|
+
const parts = (eyebrow: TextBlock, title: TextBlock, subtitle: TextBlock) => [
|
|
206
|
+
eyebrow.units.length ? (
|
|
207
|
+
<div key="e" style={{
|
|
208
|
+
display: 'inline-flex', alignItems: 'center', padding: eyebrowPill ? `${eyebrowSize * 0.45}px ${eyebrowSize * 1.05}px` : 0, borderRadius: 999,
|
|
209
|
+
background: eyebrowPill ? rgba(s('typography.eyebrowBackground'), n('typography.eyebrowBackgroundOpacity')) : undefined,
|
|
210
|
+
border: eyebrowPill ? `${Math.max(1, u)}px solid ${rgba(s('typography.eyebrowBackground'), n('typography.eyebrowBackgroundOpacity') * 1.6)}` : undefined,
|
|
211
|
+
opacity: eyebrow.anims[0]?.opacity ?? 1, transform: eyebrow.anims.length === 1 ? animTransform(eyebrow.anims[0]!) : undefined, filter: eyebrow.anims.length === 1 ? animFilter(eyebrow.anims[0]!) : undefined,
|
|
212
|
+
}}>
|
|
213
|
+
<Units block={eyebrow.anims.length === 1 ? { ...eyebrow, anims: [{ opacity: 1, x: 0, y: 0, scale: 1, rotation: 0, blur: 0, clip: eyebrow.anims[0]!.clip }] } : eyebrow} reveal={s('textAnimation.eyebrow.mode') === 'reveal'} style={{
|
|
214
|
+
fontSize: eyebrowSize, fontWeight: n('typography.eyebrowWeight'), letterSpacing: `${n('typography.eyebrowLetterSpacing')}em`,
|
|
215
|
+
textTransform: s('typography.eyebrowCase') === 'uppercase' ? 'uppercase' : 'none', color: s('typography.eyebrowColor'), lineHeight: 1.2, whiteSpace: 'nowrap',
|
|
216
|
+
}} />
|
|
217
|
+
</div>
|
|
218
|
+
) : null,
|
|
219
|
+
<Units key="t" block={title} reveal={s('textAnimation.title.mode') === 'reveal'} unitStyle={titleFill} style={{
|
|
220
|
+
fontSize: titleSize, fontWeight: n('typography.titleWeight'), letterSpacing: `${n('typography.titleLetterSpacing')}em`, lineHeight: n('typography.titleLineHeight'),
|
|
221
|
+
filter: shadows || undefined, textWrap: 'balance', color: s('typography.titleColor'),
|
|
222
|
+
} as CSSProperties} />,
|
|
223
|
+
<Units key="s" block={subtitle} reveal={s('textAnimation.subtitle.mode') === 'reveal'} style={{
|
|
224
|
+
fontSize: n('typography.subtitleSize') * u, fontWeight: n('typography.subtitleWeight'), lineHeight: n('typography.subtitleLineHeight'),
|
|
225
|
+
color: rgba(s('typography.subtitleColor'), n('typography.subtitleOpacity')), maxWidth: t.width * 0.9, textWrap: 'balance',
|
|
226
|
+
} as CSSProperties} />,
|
|
227
|
+
];
|
|
228
|
+
const cur = st.text;
|
|
229
|
+
const nodes = [column(parts(cur.eyebrow, cur.title, cur.subtitle), 'cur')];
|
|
230
|
+
if (cur.leaving) {
|
|
231
|
+
const one = (text: string): TextBlock => ({ text, split: 'none', units: text ? [text] : [], anims: text ? [{ opacity: 1, x: 0, y: 0, scale: 1, rotation: 0, blur: 0, clip: 1 }] : [] });
|
|
232
|
+
nodes.unshift(column(parts(one(cur.leaving.eyebrow), one(cur.leaving.title), one(cur.leaving.subtitle)), 'old', cur.leaving.anim.opacity, cur.leaving.anim));
|
|
233
|
+
}
|
|
234
|
+
return <>{nodes}</>;
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
function Cta({ ctx }: { ctx: Ctx }) {
|
|
238
|
+
const { st, n, s, b, u } = ctx;
|
|
239
|
+
if (!b('content.cta.enabled') || !s('content.cta.text')) return null;
|
|
240
|
+
const a = st.text.cta;
|
|
241
|
+
const size = n('typography.ctaSize') * u;
|
|
242
|
+
const style = s('content.cta.style');
|
|
243
|
+
const bg = s('content.cta.backgroundColor');
|
|
244
|
+
const outline = style === 'outline';
|
|
245
|
+
return (
|
|
246
|
+
<div style={{ position: 'absolute', left: st.layout.cta.x, top: st.layout.cta.y, transform: `translate(-50%, -50%) ${animTransform(a)}`, opacity: a.opacity, filter: animFilter(a) }}>
|
|
247
|
+
<div style={{
|
|
248
|
+
display: 'flex', alignItems: 'center', gap: size * 0.5, whiteSpace: 'nowrap', padding: `${size * 0.72}px ${size * 1.5}px`,
|
|
249
|
+
borderRadius: style === 'rounded' ? size * 0.5 : 999, background: outline ? 'transparent' : bg, border: outline ? `${2 * u}px solid ${bg}` : undefined,
|
|
250
|
+
color: outline ? bg : s('content.cta.textColor'), fontSize: size, fontWeight: n('typography.ctaWeight'), letterSpacing: '-0.01em',
|
|
251
|
+
boxShadow: outline ? undefined : `0 ${10 * u}px ${36 * u}px ${rgba(s('productWindow.shadowColor'), 0.35)}, 0 0 ${n('glow.radius') * u * 0.3}px ${rgba(s('glow.color'), st.bloom.product * 0.6)}`,
|
|
252
|
+
}}>
|
|
253
|
+
{s('content.cta.text')}
|
|
254
|
+
{b('content.cta.arrow') && <Icon name="arrow" size={size * 1.05} color={outline ? bg : s('content.cta.textColor')} />}
|
|
255
|
+
</div>
|
|
256
|
+
</div>
|
|
257
|
+
);
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
function Logo({ ctx }: { ctx: Ctx }) {
|
|
261
|
+
const { st, n, s, b, u, img } = ctx;
|
|
262
|
+
if (!b('content.logo.enabled')) return null;
|
|
263
|
+
const size = n('content.logo.size') * u;
|
|
264
|
+
const a = st.logo;
|
|
265
|
+
const logoRef = s('assets.logo');
|
|
266
|
+
const mark = s('content.logo.mark');
|
|
267
|
+
const mc = s('content.logo.markColor');
|
|
268
|
+
const markNode = mark === 'none' ? null
|
|
269
|
+
: mark === 'spark' ? <Icon name="sparkle" size={size * 1.15} color={mc} />
|
|
270
|
+
: <div style={{ width: size * 0.9, height: size * 0.9, borderRadius: mark === 'square' ? size * 0.22 : '50%', background: mark === 'ring' ? 'transparent' : mc, border: mark === 'ring' ? `${size * 0.16}px solid ${mc}` : undefined, flex: 'none' }} />;
|
|
271
|
+
return (
|
|
272
|
+
<div style={{ position: 'absolute', left: st.layout.logo.x, top: st.layout.logo.y, transform: 'translateY(-50%)', opacity: a.opacity * st.exit.opacity, display: 'flex', alignItems: 'center', gap: size * 0.4 }}>
|
|
273
|
+
{logoRef ? img(logoRef, { height: size * 1.4, width: 'auto', display: 'block' }, s('content.logo.text') || 'Logo')
|
|
274
|
+
: <>{markNode}<span style={{ fontSize: size, fontWeight: 800, letterSpacing: '0.04em', color: s('content.logo.color'), lineHeight: 1 }}>{s('content.logo.text')}</span></>}
|
|
275
|
+
</div>
|
|
276
|
+
);
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
/* ─── the product ─────────────────────────────────────────────────────────────────────────────── */
|
|
280
|
+
function Product({ ctx }: { ctx: Ctx }) {
|
|
281
|
+
const { st, n, s, b, u } = ctx;
|
|
282
|
+
const w = st.layout.window;
|
|
283
|
+
const p = st.product;
|
|
284
|
+
const radius = n('productWindow.radius') * u;
|
|
285
|
+
const shadow = b('productWindow.shadow') ? `0 ${n('productWindow.shadowOffsetY') * u}px ${n('productWindow.shadowBlur') * u}px ${rgba(s('productWindow.shadowColor'), n('productWindow.shadowOpacity'))}` : '';
|
|
286
|
+
const bloom = st.bloom.product > 0 ? `0 0 ${n('glow.radius') * u}px ${n('glow.radius') * u * 0.15}px ${rgba(s('glow.color'), st.bloom.product)}` : '';
|
|
287
|
+
return (
|
|
288
|
+
<div style={{
|
|
289
|
+
position: 'absolute', left: w.cx - w.width / 2, top: w.cy - w.height / 2, width: w.width, height: w.height, opacity: p.opacity,
|
|
290
|
+
transform: `translate(${p.x}px, ${p.y}px) perspective(${n('window.perspective') * u}px) rotateX(${p.tilt}deg) rotateY(${p.tiltY}deg) rotate(${p.rotation}deg) scale(${p.scale})`,
|
|
291
|
+
transformOrigin: '50% 60%',
|
|
292
|
+
}}>
|
|
293
|
+
<div style={{
|
|
294
|
+
position: 'absolute', inset: 0, borderRadius: radius, overflow: 'hidden', background: s('productWindow.backgroundColor'),
|
|
295
|
+
boxShadow: [shadow, bloom].filter(Boolean).join(', ') || undefined,
|
|
296
|
+
border: n('productWindow.borderWidth') > 0 ? `${n('productWindow.borderWidth') * u}px solid ${rgba(s('productWindow.borderColor'), n('productWindow.borderOpacity'))}` : undefined,
|
|
297
|
+
boxSizing: 'border-box', fontFamily: FONT_STACK(s('typography.uiFontFamily')),
|
|
298
|
+
}}>
|
|
299
|
+
<TopBar ctx={ctx} />
|
|
300
|
+
<Header ctx={ctx} />
|
|
301
|
+
<Content ctx={ctx} />
|
|
302
|
+
</div>
|
|
303
|
+
<Badge ctx={ctx} />
|
|
304
|
+
</div>
|
|
305
|
+
);
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
function TopBar({ ctx }: { ctx: Ctx }) {
|
|
309
|
+
const { st, n, s, b, u } = ctx;
|
|
310
|
+
const h = st.layout.ui.topBar;
|
|
311
|
+
if (!h) return null;
|
|
312
|
+
const dot = h * 0.24;
|
|
313
|
+
return (
|
|
314
|
+
<div style={{ position: 'absolute', left: 0, top: 0, right: 0, height: h, background: s('window.topBarColor'), display: 'flex', alignItems: 'center', padding: `0 ${h * 0.45}px`, gap: h * 0.4, color: s('window.topBarTextColor'), fontSize: h * 0.34 }}>
|
|
315
|
+
{b('window.showTrafficLights') && (
|
|
316
|
+
<div style={{ display: 'flex', gap: dot * 0.65, flex: 'none' }}>
|
|
317
|
+
{['window.trafficLight1', 'window.trafficLight2', 'window.trafficLight3'].map((k) => <div key={k} style={{ width: dot, height: dot, borderRadius: '50%', background: s(k) }} />)}
|
|
318
|
+
</div>
|
|
319
|
+
)}
|
|
320
|
+
{b('content.showTopBarTitle') && <span style={{ fontWeight: 600, whiteSpace: 'nowrap', flex: 'none' }}>{s('content.productName')}</span>}
|
|
321
|
+
{b('window.showAddressBar') && (
|
|
322
|
+
<div style={{ flex: 1, display: 'flex', justifyContent: 'center' }}>
|
|
323
|
+
<div style={{ minWidth: '38%', maxWidth: '60%', height: h * 0.6, borderRadius: h * 0.3, background: rgba('#ffffff', 0.9), border: `${Math.max(1, u)}px solid ${rgba('#000000', 0.06)}`, display: 'flex', alignItems: 'center', justifyContent: 'center', gap: h * 0.14, padding: `0 ${h * 0.4}px`, whiteSpace: 'nowrap', overflow: 'hidden' }}>
|
|
324
|
+
<Icon name="lock" size={h * 0.26} color={s('window.topBarTextColor')} />
|
|
325
|
+
{s('window.addressText')}
|
|
326
|
+
</div>
|
|
327
|
+
</div>
|
|
328
|
+
)}
|
|
329
|
+
{!b('window.showAddressBar') && <div style={{ flex: 1 }} />}
|
|
330
|
+
<div style={{ width: n('window.topBarHeight') * u * 0.9, flex: 'none' }} />
|
|
331
|
+
</div>
|
|
332
|
+
);
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
function Header({ ctx }: { ctx: Ctx }) {
|
|
336
|
+
const { st, n, s, b, u, img } = ctx;
|
|
337
|
+
const h = st.layout.ui.header;
|
|
338
|
+
if (!h) return null;
|
|
339
|
+
const fs = n('productHeader.fontSize') * u;
|
|
340
|
+
const nav = getPath(st.cfg, 'productHeader.navItems') as string[];
|
|
341
|
+
const active = s('productHeader.activeItem');
|
|
342
|
+
return (
|
|
343
|
+
<div style={{
|
|
344
|
+
position: 'absolute', left: 0, right: 0, top: st.layout.ui.topBar, height: h, background: s('productHeader.backgroundColor'), display: 'flex', alignItems: 'center',
|
|
345
|
+
padding: `0 ${n('productHeader.padding') * u}px`, gap: fs * 1.6, fontSize: fs, fontWeight: n('productHeader.fontWeight'),
|
|
346
|
+
borderBottom: b('productHeader.showDivider') ? `${Math.max(1, u * 1.5)}px solid ${s('productHeader.dividerColor')}` : undefined, boxSizing: 'border-box',
|
|
347
|
+
}}>
|
|
348
|
+
{b('productHeader.showLogo') && (s('assets.appLogo')
|
|
349
|
+
? img(s('assets.appLogo'), { height: fs * 1.6, width: 'auto', display: 'block' }, s('productHeader.logo') || 'App logo')
|
|
350
|
+
: <span style={{ fontWeight: 800, letterSpacing: '0.06em', color: s('productHeader.logoColor'), whiteSpace: 'nowrap' }}>{s('productHeader.logo')}</span>)}
|
|
351
|
+
<div style={{ flex: 1, display: 'flex', justifyContent: 'center', gap: fs * 0.5 }}>
|
|
352
|
+
{nav.map((item, i) => {
|
|
353
|
+
const on = item === active;
|
|
354
|
+
return <span key={i} style={{ padding: `${fs * 0.45}px ${fs * 1}px`, borderRadius: 999, whiteSpace: 'nowrap', color: on ? s('productHeader.activeColor') : s('productHeader.textColor'), background: on ? s('productHeader.activeBackground') : 'transparent', fontWeight: on ? Math.min(800, n('productHeader.fontWeight') + 100) : undefined }}>{item}</span>;
|
|
355
|
+
})}
|
|
356
|
+
</div>
|
|
357
|
+
{b('productHeader.showAction') && s('productHeader.actionText') && (
|
|
358
|
+
<span style={{ padding: `${fs * 0.5}px ${fs * 1.1}px`, borderRadius: 999, background: s('productHeader.accentColor'), color: '#ffffff', fontWeight: 600, whiteSpace: 'nowrap' }}>{s('productHeader.actionText')}</span>
|
|
359
|
+
)}
|
|
360
|
+
</div>
|
|
361
|
+
);
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
function Content({ ctx }: { ctx: Ctx }) {
|
|
365
|
+
const { st, s, b, u, img } = ctx;
|
|
366
|
+
const ui = st.layout.ui;
|
|
367
|
+
const fs = ui.fontSize;
|
|
368
|
+
const cards = getPath(st.cfg, 'productContent.cards') as Record<string, unknown>[];
|
|
369
|
+
const accent = s('productContent.accentColor');
|
|
370
|
+
const anim = (a: Anim): CSSProperties => ({ opacity: a.opacity, transform: animTransform(a), filter: animFilter(a) });
|
|
371
|
+
return (
|
|
372
|
+
<div style={{ position: 'absolute', left: 0, right: 0, top: ui.topBar + ui.header, bottom: 0, background: s('productContent.backgroundColor') }}>
|
|
373
|
+
<div style={{ position: 'absolute', left: 0, top: -(ui.topBar + ui.header), width: '100%', height: '100%', fontSize: fs, color: s('productContent.textColor') }}>
|
|
374
|
+
{ui.greeting && (
|
|
375
|
+
<div style={{ ...abs(ui.greeting), ...anim(st.ui.greeting), background: s('productContent.greeting.bubbleColor'), color: s('productContent.greeting.textColor'), borderRadius: fs * 1.1, borderBottomRightRadius: s('productContent.greeting.align') === 'right' ? fs * 0.3 : fs * 1.1, borderBottomLeftRadius: s('productContent.greeting.align') === 'left' ? fs * 0.3 : fs * 1.1, padding: `${fs * 0.7}px ${fs * 0.9}px`, boxSizing: 'border-box', lineHeight: 1.4, overflow: 'hidden' }}>
|
|
376
|
+
{s('productContent.greeting.text')}
|
|
377
|
+
</div>
|
|
378
|
+
)}
|
|
379
|
+
{ui.response && (
|
|
380
|
+
<div style={{ ...abs(ui.response), ...anim(st.ui.response), display: 'flex', alignItems: 'center', gap: fs * 0.6 }}>
|
|
381
|
+
{b('productContent.avatar.enabled') && (s('assets.avatar')
|
|
382
|
+
? img(s('assets.avatar'), { width: fs * 1.9, height: fs * 1.9, borderRadius: '50%', objectFit: 'cover', flex: 'none' }, 'Assistant')
|
|
383
|
+
: <div style={{ width: fs * 1.9, height: fs * 1.9, borderRadius: '50%', flex: 'none', background: `linear-gradient(135deg, ${s('productContent.avatar.color')}, ${accent})`, color: '#ffffff', display: 'flex', alignItems: 'center', justifyContent: 'center', fontWeight: 700, fontSize: fs * 0.8 }}>{s('productContent.avatar.initials')}</div>)}
|
|
384
|
+
<span style={{ color: s('productContent.textColor'), fontWeight: 500, whiteSpace: 'nowrap', overflow: 'hidden', textOverflow: 'ellipsis' }}>{s('productContent.response.text')}</span>
|
|
385
|
+
</div>
|
|
386
|
+
)}
|
|
387
|
+
{ui.hero && (
|
|
388
|
+
<div style={{ ...abs(ui.hero), ...anim(st.ui.hero), borderRadius: fs * 0.9, overflow: 'hidden', background: `linear-gradient(120deg, ${rgba(accent, 0.18)}, ${rgba(accent, 0.45)})` }}>
|
|
389
|
+
{s('assets.heroImage') ? img(s('assets.heroImage'), { width: '100%', height: '100%', objectFit: 'cover', display: 'block' }, 'Hero') : <Placeholder kind="website" accent={accent} u={u} />}
|
|
390
|
+
</div>
|
|
391
|
+
)}
|
|
392
|
+
{ui.cards.map((r, i) => <Card key={i} r={r} a={st.ui.cards[i]!} c={cards[i]!} fs={fs} u={u} img={img} />)}
|
|
393
|
+
{ui.input && (
|
|
394
|
+
<div style={{ ...abs(ui.input), display: 'flex', alignItems: 'center', gap: fs * 0.6, padding: `0 ${fs * 0.4}px 0 ${fs * 1}px`, boxSizing: 'border-box', borderRadius: 999, background: s('productContent.input.backgroundColor'), border: `${Math.max(1, u * 1.5)}px solid ${s('productContent.input.borderColor')}` }}>
|
|
395
|
+
<span style={{ flex: 1, whiteSpace: 'nowrap', overflow: 'hidden', color: st.ui.typed ? s('productContent.textColor') : s('productContent.mutedColor') }}>
|
|
396
|
+
{st.ui.typed || s('productContent.input.placeholder')}
|
|
397
|
+
{st.ui.typed && st.ui.caret && <span style={{ display: 'inline-block', width: Math.max(1, u * 2), height: fs * 1.1, background: accent, marginLeft: u * 2, verticalAlign: 'middle' }} />}
|
|
398
|
+
</span>
|
|
399
|
+
<div style={{ width: ui.input.height * 0.74, height: ui.input.height * 0.74, borderRadius: '50%', background: s('productContent.sendButtonColor'), color: s('productContent.sendButtonTextColor'), display: 'flex', alignItems: 'center', justifyContent: 'center', fontWeight: 700, fontSize: fs * 1.05, flex: 'none' }}>
|
|
400
|
+
{s('productContent.sendButton')}
|
|
401
|
+
</div>
|
|
402
|
+
</div>
|
|
403
|
+
)}
|
|
404
|
+
</div>
|
|
405
|
+
</div>
|
|
406
|
+
);
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
function Card({ r, a, c, fs, u, img }: { r: Rect; a: Anim; c: Record<string, unknown>; fs: number; u: number; img: Ctx['img'] }) {
|
|
410
|
+
const accent = c.accentColor as string;
|
|
411
|
+
const radius = (c.radius as number) * u;
|
|
412
|
+
const titleFs = Math.min(fs * 1.02, r.width * 0.085);
|
|
413
|
+
const hasText = Boolean(c.title || c.subtitle);
|
|
414
|
+
return (
|
|
415
|
+
<div style={{
|
|
416
|
+
...abs(r), opacity: a.opacity * (c.opacity as number), filter: animFilter(a), borderRadius: radius, background: c.backgroundColor as string, overflow: 'hidden',
|
|
417
|
+
transform: `${animTransform(a)} rotate(${c.rotation as number}deg) scale(${c.scale as number})`, boxShadow: `0 ${8 * u}px ${28 * u}px ${rgba('#1c1432', 0.1)}`,
|
|
418
|
+
border: `${Math.max(1, u)}px solid ${rgba(accent, 0.18)}`, boxSizing: 'border-box', display: 'flex', flexDirection: 'column',
|
|
419
|
+
}}>
|
|
420
|
+
<div style={{ position: 'relative', flex: 1, margin: radius * 0.45, marginBottom: hasText ? 0 : radius * 0.45, borderRadius: radius * 0.7, overflow: 'hidden', background: rgba(accent, 0.12) }}>
|
|
421
|
+
{c.image ? img(c.image as string, { width: '100%', height: '100%', objectFit: c.imageFit as 'cover' | 'contain', display: 'block' }, (c.title as string) || 'Preview') : <Placeholder kind={c.placeholder as string} accent={accent} u={u} />}
|
|
422
|
+
</div>
|
|
423
|
+
{hasText && (
|
|
424
|
+
<div style={{ padding: `${titleFs * 0.6}px ${radius * 0.6}px ${titleFs * 0.75}px`, color: c.textColor as string, lineHeight: 1.25 }}>
|
|
425
|
+
{c.title ? <div style={{ fontSize: titleFs, fontWeight: 700, whiteSpace: 'nowrap', overflow: 'hidden', textOverflow: 'ellipsis' }}>{c.title as string}</div> : null}
|
|
426
|
+
{c.subtitle ? <div style={{ fontSize: titleFs * 0.78, opacity: 0.6, whiteSpace: 'nowrap', overflow: 'hidden', textOverflow: 'ellipsis' }}>{c.subtitle as string}</div> : null}
|
|
427
|
+
</div>
|
|
428
|
+
)}
|
|
429
|
+
</div>
|
|
430
|
+
);
|
|
431
|
+
}
|
|
432
|
+
|
|
433
|
+
/** Procedural previews: small, generic drawings of a website, a gallery, a chart… in the card's accent. */
|
|
434
|
+
function Placeholder({ kind, accent, u }: { kind: string; accent: string; u: number }) {
|
|
435
|
+
const box: CSSProperties = { position: 'absolute', borderRadius: 6 * u };
|
|
436
|
+
const line = (top: string, left: string, width: string, op = 0.35, h = '7%') => <div style={{ ...box, top, left, width, height: h, background: rgba(accent, op) }} />;
|
|
437
|
+
switch (kind) {
|
|
438
|
+
case 'website': return (
|
|
439
|
+
<div style={{ position: 'absolute', inset: 0 }}>
|
|
440
|
+
{line('8%', '8%', '22%', 0.5, '6%')}{line('8%', '60%', '32%', 0.2, '6%')}
|
|
441
|
+
<div style={{ ...box, top: '22%', left: '8%', right: '8%', height: '40%', background: `linear-gradient(120deg, ${rgba(accent, 0.85)}, ${rgba(accent, 0.35)})` }} />
|
|
442
|
+
{line('70%', '8%', '60%', 0.3)}{line('82%', '8%', '40%', 0.2)}
|
|
443
|
+
<div style={{ ...box, top: '72%', right: '8%', width: '22%', height: '14%', borderRadius: 999, background: rgba(accent, 0.9) }} />
|
|
444
|
+
</div>
|
|
445
|
+
);
|
|
446
|
+
case 'gallery': return (
|
|
447
|
+
<div style={{ position: 'absolute', inset: '8%', display: 'grid', gridTemplateColumns: '1fr 1fr', gridTemplateRows: '1fr 1fr', gap: '8%' }}>
|
|
448
|
+
{[0.85, 0.45, 0.3, 0.65].map((o, i) => <div key={i} style={{ borderRadius: 8 * u, background: `linear-gradient(${40 + i * 70}deg, ${rgba(accent, o)}, ${rgba(accent, o * 0.4)})` }} />)}
|
|
449
|
+
</div>
|
|
450
|
+
);
|
|
451
|
+
case 'chart': return (
|
|
452
|
+
<div style={{ position: 'absolute', inset: '10%', display: 'flex', alignItems: 'flex-end', gap: '6%' }}>
|
|
453
|
+
{[0.35, 0.55, 0.45, 0.72, 0.6, 0.9].map((h, i) => <div key={i} style={{ flex: 1, height: `${h * 100}%`, borderRadius: 5 * u, background: rgba(accent, 0.35 + h * 0.6) }} />)}
|
|
454
|
+
</div>
|
|
455
|
+
);
|
|
456
|
+
case 'gradient': return <div style={{ position: 'absolute', inset: 0, background: `radial-gradient(circle at 30% 30%, ${rgba('#ffffff', 0.7)}, ${rgba(accent, 0.9)} 45%, ${rgba(accent, 0.5)})` }} />;
|
|
457
|
+
case 'text': return <div style={{ position: 'absolute', inset: 0 }}>{line('14%', '10%', '70%', 0.55, '9%')}{line('34%', '10%', '80%', 0.25)}{line('48%', '10%', '74%', 0.25)}{line('62%', '10%', '56%', 0.25)}</div>;
|
|
458
|
+
default: return null;
|
|
459
|
+
}
|
|
460
|
+
}
|
|
461
|
+
|
|
462
|
+
function Badge({ ctx }: { ctx: Ctx }) {
|
|
463
|
+
const { st, n, s, b, u } = ctx;
|
|
464
|
+
if (!b('content.badge.enabled') || !s('content.badge.text')) return null;
|
|
465
|
+
const a = st.badge;
|
|
466
|
+
const fs = n('typography.badgeSize') * u;
|
|
467
|
+
return (
|
|
468
|
+
<div style={{ position: 'absolute', right: -fs * 1.2, top: -fs * 1.3, opacity: a.opacity, transform: animTransform(a, 'rotate(4deg)'), transformOrigin: '100% 0' }}>
|
|
469
|
+
<div style={{ display: 'flex', alignItems: 'center', gap: fs * 0.45, padding: `${fs * 0.6}px ${fs * 1}px`, borderRadius: 999, background: s('content.badge.backgroundColor'), color: s('content.badge.textColor'), fontSize: fs, fontWeight: 700, whiteSpace: 'nowrap', boxShadow: `0 ${8 * u}px ${30 * u}px ${rgba(s('productWindow.shadowColor'), 0.3)}` }}>
|
|
470
|
+
<Icon name={s('content.badge.icon')} size={fs * 1.15} color={s('content.badge.textColor')} />
|
|
471
|
+
{s('content.badge.text')}
|
|
472
|
+
</div>
|
|
473
|
+
</div>
|
|
474
|
+
);
|
|
475
|
+
}
|
|
476
|
+
|
|
477
|
+
function Floating({ ctx, i, f }: { ctx: Ctx; i: number; f: FrameState['floating'][number] }) {
|
|
478
|
+
const { st, u } = ctx;
|
|
479
|
+
const item = (getPath(st.cfg, 'floatingElements') as Record<string, unknown>[])[i]!;
|
|
480
|
+
const fs = (item.fontSize as number) * u;
|
|
481
|
+
const bg = rgba(item.backgroundColor as string, item.backgroundOpacity as number);
|
|
482
|
+
const fg = item.textColor as string;
|
|
483
|
+
const radius = (item.borderRadius as number) * u;
|
|
484
|
+
const type = item.type as string;
|
|
485
|
+
const shadow = `0 ${10 * u}px ${34 * u}px ${rgba('#1c0a3a', 0.22)}`;
|
|
486
|
+
let body: ReactNode;
|
|
487
|
+
if (type === 'icon') body = <div style={{ width: fs * 2.4, height: fs * 2.4, borderRadius: Math.min(radius, fs * 1.2), background: bg, display: 'flex', alignItems: 'center', justifyContent: 'center', boxShadow: shadow }}><Icon name={item.icon as string} size={fs * 1.3} color={fg} /></div>;
|
|
488
|
+
else if (type === 'text') body = <span style={{ fontSize: fs, fontWeight: 700, color: fg, whiteSpace: 'nowrap' }}>{item.content as string}</span>;
|
|
489
|
+
else body = (
|
|
490
|
+
<div style={{ display: 'flex', alignItems: 'center', gap: fs * 0.5, padding: type === 'badge' ? `${fs * 0.7}px ${fs * 0.95}px` : `${fs * 0.5}px ${fs * 0.95}px`, borderRadius: type === 'badge' ? Math.min(radius, fs * 0.8) : radius, background: bg, color: fg, fontSize: fs, fontWeight: 700, whiteSpace: 'nowrap', boxShadow: shadow, border: `${Math.max(1, u)}px solid ${rgba('#ffffff', 0.5)}` }}>
|
|
491
|
+
{type === 'badge' && item.icon !== 'none' && <div style={{ width: fs * 1.6, height: fs * 1.6, borderRadius: fs * 0.45, background: rgba(fg, 0.12), display: 'flex', alignItems: 'center', justifyContent: 'center' }}><Icon name={item.icon as string} size={fs * 1.05} color={fg} /></div>}
|
|
492
|
+
{item.content as string}
|
|
493
|
+
</div>
|
|
494
|
+
);
|
|
495
|
+
const blur = (item.blur as number) * u + f.blur;
|
|
496
|
+
return (
|
|
497
|
+
<div style={{ position: 'absolute', left: f.x, top: f.y, opacity: f.opacity, transform: `translate(-50%, -50%) rotate(${f.rotation}deg) scale(${f.scale})`, filter: blur > 0.05 ? `blur(${blur}px)` : undefined }}>
|
|
498
|
+
{body}
|
|
499
|
+
</div>
|
|
500
|
+
);
|
|
501
|
+
}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { useEffect, useMemo, useRef, useState } from 'react';
|
|
2
|
+
import { getPath, validateConfig, type ConfigError, type PromoConfig } from './config';
|
|
3
|
+
import { MOTION_FPS, timeline } from './engine';
|
|
4
|
+
import { installPromoFonts } from './fonts';
|
|
5
|
+
import { PromoFrame, type PromoFrameProps } from './PromoFrame';
|
|
6
|
+
|
|
7
|
+
export type PromoShowcasePlayerProps = {
|
|
8
|
+
/** The canonical config (any subset; defaults fill the rest). Validated before anything is drawn. */
|
|
9
|
+
config: unknown;
|
|
10
|
+
autoPlay?: boolean;
|
|
11
|
+
/** Overrides loop.enabled for playback (a non-looping config replays from the start). */
|
|
12
|
+
loop?: boolean;
|
|
13
|
+
/** Rendered width in CSS px; the height follows the config's aspect ratio. Defaults to 640. */
|
|
14
|
+
width?: number;
|
|
15
|
+
/** Seek to this motion frame and hold (scrubbing). */
|
|
16
|
+
frame?: number;
|
|
17
|
+
onFrame?: (frame: number) => void;
|
|
18
|
+
onInvalid?: (errors: ConfigError[]) => void;
|
|
19
|
+
resolveAsset?: PromoFrameProps['resolveAsset'];
|
|
20
|
+
className?: string;
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
const RATIO: Record<string, number> = { '16:9': 16 / 9, '9:16': 9 / 16, '1:1': 1 };
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* **promo-product-showcase in a React web app.** Validates the config, then draws each frame with the
|
|
27
|
+
* package's procedural renderer at the player's own size (vector, never a scaled bitmap). A rAF clock
|
|
28
|
+
* turns time into 60 fps motion frames; the engine does the rest. The drawing is `aria-hidden` inside
|
|
29
|
+
* a `role="img"` box labelled with the copy. Reduced motion shows the settled final frame.
|
|
30
|
+
*/
|
|
31
|
+
export function PromoShowcasePlayer({ config, autoPlay = true, loop, width = 640, frame, onFrame, onInvalid, resolveAsset, className }: PromoShowcasePlayerProps) {
|
|
32
|
+
const key = JSON.stringify(config ?? {});
|
|
33
|
+
const checked = useMemo(() => validateConfig(JSON.parse(key)), [key]);
|
|
34
|
+
const cfg = checked.config as PromoConfig | undefined;
|
|
35
|
+
const [now, setNow] = useState(0);
|
|
36
|
+
const cb = useRef({ onFrame, onInvalid });
|
|
37
|
+
cb.current = { onFrame, onInvalid };
|
|
38
|
+
const aspect = cfg ? String(getPath(cfg, 'canvas.aspectRatio')) : '16:9';
|
|
39
|
+
const height = Math.round(width / (RATIO[aspect] ?? 16 / 9));
|
|
40
|
+
|
|
41
|
+
useEffect(() => installPromoFonts(), []);
|
|
42
|
+
useEffect(() => { if (!checked.valid) cb.current.onInvalid?.(checked.errors); }, [checked]);
|
|
43
|
+
useEffect(() => {
|
|
44
|
+
if (!cfg) return;
|
|
45
|
+
const total = timeline(cfg).length;
|
|
46
|
+
const reduced = typeof window !== 'undefined' && window.matchMedia?.('(prefers-reduced-motion: reduce)').matches;
|
|
47
|
+
if (frame !== undefined || !autoPlay || reduced) { setNow(frame ?? (reduced ? total - 1 : 0)); return; }
|
|
48
|
+
const looping = loop ?? true;
|
|
49
|
+
let raf = 0;
|
|
50
|
+
const start = performance.now();
|
|
51
|
+
const tick = (t: number) => {
|
|
52
|
+
const m = ((t - start) / 1000) * MOTION_FPS;
|
|
53
|
+
const f = looping ? m % total : Math.min(m, total - 1);
|
|
54
|
+
setNow(f);
|
|
55
|
+
cb.current.onFrame?.(f);
|
|
56
|
+
if (looping || m < total) raf = requestAnimationFrame(tick);
|
|
57
|
+
};
|
|
58
|
+
raf = requestAnimationFrame(tick);
|
|
59
|
+
return () => cancelAnimationFrame(raf);
|
|
60
|
+
}, [cfg, frame, autoPlay, loop]);
|
|
61
|
+
|
|
62
|
+
if (!checked.valid) {
|
|
63
|
+
return (
|
|
64
|
+
<div role="alert" className={className} style={{ width, padding: 12, font: '13px/1.4 system-ui', border: '1px solid currentColor' }}>
|
|
65
|
+
<strong>This promo configuration is not valid.</strong>
|
|
66
|
+
<ul>{checked.errors.slice(0, 8).map((e) => <li key={e.path + e.message}>{e.message}</li>)}</ul>
|
|
67
|
+
</div>
|
|
68
|
+
);
|
|
69
|
+
}
|
|
70
|
+
const label = [getPath(cfg, 'content.productName'), getPath(cfg, 'content.title'), getPath(cfg, 'content.subtitle')].filter(Boolean).join(' — ');
|
|
71
|
+
return (
|
|
72
|
+
<div role="img" aria-label={label} className={className} style={{ width, height, position: 'relative', overflow: 'hidden' }}>
|
|
73
|
+
<div aria-hidden="true">
|
|
74
|
+
<PromoFrame config={cfg!} frame={now} width={width} height={height} resolveAsset={resolveAsset} />
|
|
75
|
+
</div>
|
|
76
|
+
</div>
|
|
77
|
+
);
|
|
78
|
+
}
|