waygraph 0.15.53 → 0.16.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -3
- package/bin/waygraph +2 -2
- package/dist/analysis/check.d.ts +38 -0
- package/dist/analysis/check.js +87 -0
- package/dist/analysis/coverage-gap.d.ts +1 -1
- package/dist/analysis/coverage-gap.js +14 -37
- package/dist/analysis/flow-source.d.ts +9 -0
- package/dist/analysis/flow-source.js +25 -0
- package/dist/analysis/graph.d.ts +13 -14
- package/dist/analysis/graph.js +48 -371
- package/dist/analysis/map-check.js +4 -39
- package/dist/analysis/practices-check.d.ts +1 -1
- package/dist/analysis/practices-check.js +24 -45
- package/dist/cli/args.d.ts +23 -0
- package/dist/cli/args.js +20 -0
- package/dist/{cli.d.ts → cli/cli.d.ts} +0 -1
- package/dist/{cli.js → cli/cli.js} +10 -9
- package/dist/{commands → cli/commands}/agent-dive-scaffold.js +35 -64
- package/dist/cli/commands/agent-dive.js +42 -0
- package/dist/{commands → cli/commands}/check.d.ts +0 -1
- package/dist/cli/commands/check.js +104 -0
- package/dist/cli/commands/codemod-checkpoints.d.ts +18 -0
- package/dist/cli/commands/codemod-checkpoints.js +186 -0
- package/dist/cli/commands/codemod-flows.d.ts +18 -0
- package/dist/cli/commands/codemod-flows.js +284 -0
- package/dist/cli/commands/codemod-stubs.d.ts +10 -0
- package/dist/cli/commands/codemod-stubs.js +187 -0
- package/dist/{commands → cli/commands}/extensions.js +5 -4
- package/dist/{commands → cli/commands}/init.js +1 -2
- package/dist/{commands → cli/commands}/list.js +9 -7
- package/dist/cli/commands/manifest.d.ts +2 -0
- package/dist/cli/commands/manifest.js +20 -0
- package/dist/cli/commands/map.js +57 -0
- package/dist/{commands → cli/commands}/run.d.ts +0 -1
- package/dist/cli/commands/run.js +64 -0
- package/dist/{commands → cli/commands}/session.js +61 -88
- package/dist/{commands → cli/commands}/test.js +11 -14
- package/dist/cli/commands/traverse.js +105 -0
- package/dist/{commands → cli/commands}/try.js +29 -25
- package/dist/{commands → cli/commands}/upgrade.js +40 -4
- package/dist/cli/flags.d.ts +193 -16
- package/dist/cli/flags.js +179 -234
- package/dist/cli/run-chain.d.ts +1 -0
- package/dist/cli/run-chain.js +42 -7
- package/dist/cli/usage.d.ts +1 -1
- package/dist/cli/usage.js +21 -53
- package/dist/cli/util.d.ts +2 -2
- package/dist/cli/util.js +2 -3
- package/dist/{highlights → demo/narration}/css.d.ts +1 -1
- package/dist/{highlights → demo/narration}/css.js +2 -3
- package/dist/{highlights → demo/narration}/demo-pace.d.ts +7 -11
- package/dist/{highlights → demo/narration}/demo-pace.js +9 -11
- package/dist/{highlights → demo/narration}/device.d.ts +4 -2
- package/dist/{highlights → demo/narration}/device.js +3 -1
- package/dist/demo/narration/merge.d.ts +8 -0
- package/dist/demo/narration/merge.js +71 -0
- package/dist/{highlights/run-phase.d.ts → demo/narration/narration.d.ts} +10 -14
- package/dist/{highlights/run-phase.js → demo/narration/narration.js} +25 -94
- package/dist/{highlights → demo/narration}/shorthand.d.ts +1 -1
- package/dist/demo/narration/stub-ctx.d.ts +8 -0
- package/dist/demo/narration/stub-ctx.js +164 -0
- package/dist/{highlights → demo/narration}/style.d.ts +1 -7
- package/dist/{highlights → demo/narration}/style.js +1 -41
- package/dist/{highlights → demo/narration}/todo-dock.d.ts +3 -3
- package/dist/{highlights → demo/narration}/todo-dock.js +13 -30
- package/dist/demo/overlay/auto-chrome.d.ts +7 -0
- package/dist/demo/overlay/auto-chrome.js +97 -0
- package/dist/{session/overlay-beacon.d.ts → demo/overlay/beacon.d.ts} +7 -0
- package/dist/{session/overlay-beacon.js → demo/overlay/beacon.js} +5 -0
- package/dist/demo/overlay/cursor.d.ts +12 -0
- package/dist/demo/overlay/cursor.js +142 -0
- package/dist/demo/overlay/device-stage.d.ts +13 -0
- package/dist/demo/overlay/device-stage.js +396 -0
- package/dist/demo/overlay/inpage/banner.d.ts +1 -0
- package/dist/demo/overlay/inpage/banner.js +160 -0
- package/dist/demo/overlay/inpage/caption.d.ts +2 -0
- package/dist/demo/overlay/inpage/caption.js +24 -0
- package/dist/demo/overlay/inpage/core.d.ts +1 -0
- package/dist/demo/overlay/inpage/core.js +345 -0
- package/dist/demo/overlay/inpage/device-chip.d.ts +1 -0
- package/dist/demo/overlay/inpage/device-chip.js +191 -0
- package/dist/demo/overlay/inpage/network.d.ts +9 -0
- package/dist/demo/overlay/inpage/network.js +200 -0
- package/dist/demo/overlay/inpage/panel-chrome.d.ts +1 -0
- package/dist/demo/overlay/inpage/panel-chrome.js +203 -0
- package/dist/demo/overlay/inpage/stamp.d.ts +1 -0
- package/dist/demo/overlay/inpage/stamp.js +46 -0
- package/dist/demo/overlay/inpage/swipe-zoom.d.ts +1 -0
- package/dist/demo/overlay/inpage/swipe-zoom.js +220 -0
- package/dist/demo/overlay/inpage/todos.d.ts +1 -0
- package/dist/demo/overlay/inpage/todos.js +294 -0
- package/dist/demo/overlay/locator-theater.d.ts +25 -0
- package/dist/demo/overlay/locator-theater.js +76 -0
- package/dist/demo/overlay/network-capture.d.ts +22 -0
- package/dist/demo/overlay/network-capture.js +127 -0
- package/dist/demo/overlay/overlay-css.d.ts +3 -0
- package/dist/demo/overlay/overlay-css.js +369 -0
- package/dist/demo/overlay/overlay-stage.d.ts +23 -0
- package/dist/demo/overlay/overlay-stage.js +106 -0
- package/dist/demo/overlay/overlay.d.ts +10 -0
- package/dist/demo/overlay/overlay.js +89 -0
- package/dist/{pilot-overlay/overlay-fixtures.d.ts → demo/overlay/phase-fixtures.d.ts} +2 -2
- package/dist/{pilot-overlay/overlay-fixtures.js → demo/overlay/phase-fixtures.js} +2 -2
- package/dist/{pilot-overlay/action-ring.js → demo/overlay/pilot/actions.js} +2 -1
- package/dist/{pilot-overlay → demo/overlay/pilot}/fixtures.d.ts +6 -5
- package/dist/{pilot-overlay → demo/overlay/pilot}/fixtures.js +19 -18
- package/dist/{pilot-overlay → demo/overlay/pilot}/shell.d.ts +2 -2
- package/dist/{pilot-overlay → demo/overlay/pilot}/shell.js +13 -22
- package/dist/demo/overlay/reattach.d.ts +7 -0
- package/dist/demo/overlay/reattach.js +23 -0
- package/dist/demo/overlay/rings.d.ts +33 -0
- package/dist/demo/overlay/rings.js +448 -0
- package/dist/{ui → demo/overlay/ui}/components/ring.js +2 -2
- package/dist/{ui → demo/overlay/ui}/overlay.css +4 -4
- package/dist/{ui → demo/overlay/ui}/shadow.d.ts +1 -1
- package/dist/{ui → demo/overlay/ui}/shadow.js +39 -2
- package/dist/demo/stepper/after.d.ts +3 -0
- package/dist/demo/stepper/after.js +113 -0
- package/dist/demo/stepper/banner-log.d.ts +37 -0
- package/dist/demo/stepper/banner-log.js +63 -0
- package/dist/demo/stepper/before.d.ts +4 -0
- package/dist/demo/stepper/before.js +110 -0
- package/dist/demo/stepper/demo-log.d.ts +31 -0
- package/dist/demo/stepper/demo-log.js +309 -0
- package/dist/demo/stepper/gate.d.ts +11 -0
- package/dist/demo/stepper/gate.js +78 -0
- package/dist/demo/stepper/interaction-patch.d.ts +3 -0
- package/dist/demo/stepper/interaction-patch.js +323 -0
- package/dist/demo/stepper/pacing.d.ts +21 -0
- package/dist/demo/stepper/pacing.js +23 -0
- package/dist/demo/stepper/slides.d.ts +11 -0
- package/dist/demo/stepper/slides.js +233 -0
- package/dist/demo/stepper/step-panels.d.ts +21 -0
- package/dist/demo/stepper/step-panels.js +589 -0
- package/dist/demo/stepper/stepper.d.ts +24 -0
- package/dist/demo/stepper/stepper.js +122 -0
- package/dist/demo/stepper/teardown.d.ts +48 -0
- package/dist/demo/stepper/teardown.js +179 -0
- package/dist/demo/stepper/todo-advance.d.ts +14 -0
- package/dist/demo/stepper/todo-advance.js +110 -0
- package/dist/demo/stepper/view.d.ts +68 -0
- package/dist/demo/stepper/view.js +31 -0
- package/dist/demo/types.d.ts +17 -0
- package/dist/demo/verbose-log.js +15 -0
- package/dist/{types.d.ts → engine/block/block.d.ts} +106 -91
- package/dist/{core → engine/block}/block.js +10 -53
- package/dist/{core → engine/block}/compose.d.ts +10 -7
- package/dist/{core → engine/block}/compose.js +1 -1
- package/dist/{core/blocks → engine/block/kinds}/api.d.ts +17 -12
- package/dist/{core/blocks → engine/block/kinds}/api.js +26 -18
- package/dist/{core/blocks → engine/block/kinds}/effect.d.ts +13 -18
- package/dist/engine/block/kinds/effect.js +17 -0
- package/dist/{core/blocks → engine/block/kinds}/method.d.ts +19 -29
- package/dist/{core/blocks → engine/block/kinds}/method.js +7 -21
- package/dist/{core/blocks → engine/block/kinds}/nav.d.ts +22 -31
- package/dist/{core/blocks → engine/block/kinds}/nav.js +6 -12
- package/dist/{core/blocks → engine/block/kinds}/page.d.ts +15 -20
- package/dist/{core/blocks → engine/block/kinds}/page.js +5 -7
- package/dist/engine/checkpoint/checkpoint.d.ts +22 -0
- package/dist/engine/checkpoint/checkpoint.js +8 -0
- package/dist/engine/checkpoint/route.d.ts +28 -0
- package/dist/engine/checkpoint/route.js +28 -0
- package/dist/{core → engine}/config.d.ts +7 -2
- package/dist/engine/config.js +6 -0
- package/dist/engine/engine.d.ts +45 -0
- package/dist/{core → engine}/engine.js +6 -10
- package/dist/engine/env.d.ts +59 -0
- package/dist/engine/env.js +83 -0
- package/dist/{errors.d.ts → engine/errors.d.ts} +23 -22
- package/dist/{errors.js → engine/errors.js} +22 -22
- package/dist/{core → engine/flow}/branch-regression.d.ts +8 -7
- package/dist/{core → engine/flow}/branch-regression.js +4 -3
- package/dist/engine/flow/flow.d.ts +162 -0
- package/dist/engine/flow/flow.js +244 -0
- package/dist/{core → engine/flow}/map-builder.d.ts +42 -40
- package/dist/{core → engine/flow}/map-builder.js +46 -48
- package/dist/{core → engine}/locate.d.ts +1 -1
- package/dist/{core → engine}/locate.js +1 -2
- package/dist/{mem-stub.d.ts → engine/mem/mem-stub.d.ts} +9 -8
- package/dist/{mem-stub.js → engine/mem/mem-stub.js} +2 -2
- package/dist/{mem-page.d.ts → engine/mem/mem.d.ts} +1 -1
- package/dist/{mem-page.js → engine/mem/mem.js} +2 -1
- package/dist/engine/page-gone.d.ts +5 -0
- package/dist/engine/page-gone.js +20 -0
- package/dist/engine/run/connect.d.ts +28 -0
- package/dist/{types.js → engine/run/connect.js} +11 -10
- package/dist/engine/run/events.d.ts +67 -0
- package/dist/engine/run/events.js +90 -0
- package/dist/engine/run/hooks.d.ts +16 -0
- package/dist/engine/run/hooks.js +8 -0
- package/dist/engine/run/launch.d.ts +13 -0
- package/dist/engine/run/launch.js +27 -0
- package/dist/{core/run-graph.d.ts → engine/run/run.d.ts} +9 -11
- package/dist/{core/run-graph.js → engine/run/run.js} +22 -11
- package/dist/engine/stub/pace.d.ts +12 -0
- package/dist/engine/stub/pace.js +2 -0
- package/dist/engine/stub/ring.d.ts +130 -0
- package/dist/engine/stub/ring.js +41 -0
- package/dist/engine/stub/stub.d.ts +268 -0
- package/dist/engine/stub/stub.js +1 -0
- package/dist/engine/stub/todos.d.ts +104 -0
- package/dist/engine/stub/todos.js +2 -0
- package/dist/engine/stub/viewport.d.ts +26 -0
- package/dist/engine/stub/viewport.js +2 -0
- package/dist/{trait.d.ts → engine/trait/trait.d.ts} +1 -1
- package/dist/index.d.ts +84 -36
- package/dist/index.js +44 -19
- package/dist/{session/auto-explore-run.d.ts → live/auto/auto.d.ts} +10 -16
- package/dist/{session/auto-explore-run.js → live/auto/auto.js} +164 -248
- package/dist/{session/auto-explore.d.ts → live/auto/explore.d.ts} +4 -14
- package/dist/{session/auto-explore.js → live/auto/explore.js} +21 -127
- package/dist/{auto-session/session.d.ts → live/auto-session/auto-session.d.ts} +1 -1
- package/dist/{auto-session/session.js → live/auto-session/auto-session.js} +27 -24
- package/dist/{auto-session → live/auto-session}/helpers.d.ts +16 -5
- package/dist/{auto-session → live/auto-session}/helpers.js +1 -1
- package/dist/{session/auto-session-ipc.d.ts → live/auto-session/ipc.d.ts} +7 -5
- package/dist/{session/auto-session-ipc.js → live/auto-session/ipc.js} +31 -16
- package/dist/{session/browser.d.ts → live/auto-session/start.d.ts} +1 -2
- package/dist/{session/browser.js → live/auto-session/start.js} +2 -3
- package/dist/{pilot-overlay → live/pilot}/panel.d.ts +1 -1
- package/dist/{pilot-overlay → live/pilot}/panel.js +23 -31
- package/dist/{session → live/pilot}/pilot.d.ts +4 -3
- package/dist/{session → live/pilot}/pilot.js +4 -4
- package/dist/{traverse → live/traverse}/coverage.d.ts +4 -0
- package/dist/{traverse → live/traverse}/coverage.js +3 -0
- package/dist/{traverse → live/traverse}/lease.d.ts +1 -0
- package/dist/{traverse → live/traverse}/lease.js +1 -0
- package/dist/{traverse/run.d.ts → live/traverse/traverse.d.ts} +4 -1
- package/dist/{traverse/run.js → live/traverse/traverse.js} +26 -43
- package/dist/manifest/manifest.d.ts +52 -0
- package/dist/manifest/manifest.js +93 -0
- package/dist/manifest/map-imports.d.ts +7 -0
- package/dist/manifest/map-imports.js +22 -0
- package/dist/manifest/maps.d.ts +33 -0
- package/dist/manifest/maps.js +62 -0
- package/dist/manifest/pack.d.ts +21 -0
- package/dist/manifest/pack.js +109 -0
- package/dist/manifest/project.d.ts +60 -0
- package/dist/manifest/project.js +101 -0
- package/dist/{session/block-inject.js → manifest/roots.js} +1 -18
- package/dist/manifest/scan.d.ts +19 -0
- package/dist/manifest/scan.js +57 -0
- package/dist/{blocks-select.d.ts → manifest/select.d.ts} +3 -0
- package/dist/{blocks-select.js → manifest/select.js} +2 -0
- package/dist/manifest/source.d.ts +23 -0
- package/dist/manifest/source.js +86 -0
- package/dist/runner/mode.d.ts +71 -0
- package/dist/runner/mode.js +1 -0
- package/dist/runner/modes/branches.d.ts +5 -0
- package/dist/runner/modes/branches.js +37 -0
- package/dist/runner/modes/demo.d.ts +3 -0
- package/dist/runner/modes/demo.js +13 -0
- package/dist/runner/modes/report.d.ts +2 -0
- package/dist/runner/modes/report.js +54 -0
- package/dist/runner/modes/run.d.ts +2 -0
- package/dist/runner/modes/run.js +3 -0
- package/dist/runner/options.d.ts +31 -0
- package/dist/runner/options.js +42 -0
- package/dist/runner/plan/find.d.ts +18 -0
- package/dist/runner/plan/find.js +65 -0
- package/dist/runner/plan/plan.d.ts +11 -0
- package/dist/runner/plan/plan.js +97 -0
- package/dist/runner/plan/seed-mem.d.ts +12 -0
- package/dist/runner/plan/seed-mem.js +98 -0
- package/dist/runner/plan/spec.d.ts +5 -0
- package/dist/runner/plan/spec.js +17 -0
- package/dist/runner/play-steps.d.ts +2 -0
- package/dist/runner/play-steps.js +59 -0
- package/dist/runner/runner.d.ts +4 -0
- package/dist/runner/runner.js +64 -0
- package/dist/runner/session.d.ts +9 -0
- package/dist/runner/session.js +87 -0
- package/dist/{browser.js → runtime/browser.js} +4 -2
- package/dist/{env-file.js → runtime/env-file.js} +7 -12
- package/dist/{extensions.d.ts → runtime/extensions.d.ts} +2 -5
- package/dist/{extensions.js → runtime/extensions.js} +3 -1
- package/dist/runtime/full-launch.d.ts +1 -0
- package/dist/runtime/full-launch.js +34 -0
- package/dist/runtime/global-flag.d.ts +5 -0
- package/dist/runtime/global-flag.js +18 -0
- package/dist/{playwright-config.d.ts → runtime/playwright-config.d.ts} +1 -1
- package/dist/{playwright.config.js → runtime/playwright.config.js} +3 -2
- package/dist/runtime/run-log.d.ts +2 -0
- package/dist/runtime/run-log.js +17 -0
- package/dist/{video-dir.js → runtime/video-dir.js} +3 -2
- package/dist/{config.d.ts → runtime/waygraph-config.d.ts} +8 -9
- package/dist/{config.js → runtime/waygraph-config.js} +21 -51
- package/dist/{webserver.js → runtime/webserver.js} +5 -30
- package/examples/routed-demo/config/waygraph.config.ts +20 -0
- package/examples/routed-demo/package.json +1 -4
- package/examples/routed-demo/scripts/fixture-server.mjs +1 -1
- package/examples/routed-demo/src/flows/routed-demo-map.flow.ts +2 -4
- package/examples/routed-demo/src/flows/routed-demo.flow.ts +2 -3
- package/examples/routed-demo/src/map/(app_base)/dashboard/_methods/click-widget.block.ts +5 -4
- package/examples/routed-demo/src/map/(app_base)/dashboard/_nav.block.ts +3 -3
- package/examples/routed-demo/src/map/(app_base)/dashboard/_page.block.ts +3 -3
- package/examples/routed-demo/src/map/(external)/docs/_nav.block.ts +3 -3
- package/examples/routed-demo/src/map/(external)/docs/_page.block.ts +3 -3
- package/examples/routed-demo/src/states/routed-demo.states.ts +5 -3
- package/examples/routed-demo/tests/routed-demo.spec.ts +4 -4
- package/examples/routed-demo/tsconfig.json +1 -1
- package/examples/saucedemo/README.md +11 -12
- package/examples/saucedemo/config/waygraph.config.ts +17 -0
- package/examples/saucedemo/docs/CONVENTION.md +5 -7
- package/examples/saucedemo/docs/HELPERS.md +12 -12
- package/examples/saucedemo/package-lock.json +10 -3
- package/examples/saucedemo/package.json +12 -29
- package/examples/saucedemo/src/blocks/SITE-MAP.md +0 -1
- package/examples/saucedemo/src/blocks/saucedemo-web/NAV.md +1 -5
- package/examples/saucedemo/src/blocks/saucedemo-web/cart/nav-cart.block.ts +3 -52
- package/examples/saucedemo/src/blocks/saucedemo-web/cart/nav-checkout-info.block.ts +3 -3
- package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-one/methods/fill-first-name.method.block.ts +5 -4
- package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-one/methods/fill-last-name.method.block.ts +5 -4
- package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-one/methods/fill-postal-code.method.block.ts +5 -4
- package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-one/methods/submit-checkout-info.method.block.ts +5 -4
- package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-two/methods/finish-order.method.block.ts +21 -27
- package/examples/saucedemo/src/blocks/saucedemo-web/inventory/inventory.page.block.ts +3 -9
- package/examples/saucedemo/src/blocks/saucedemo-web/inventory/methods/add-all-to-cart.method.block.ts +4 -6
- package/examples/saucedemo/src/blocks/saucedemo-web/inventory/methods/add-to-cart.effect.block.ts +10 -76
- package/examples/saucedemo/src/blocks/saucedemo-web/inventory/methods/remove-all-from-cart.method.block.ts +4 -6
- package/examples/saucedemo/src/blocks/saucedemo-web/inventory/methods/remove-from-cart.effect.block.ts +4 -3
- package/examples/saucedemo/src/blocks/saucedemo-web/inventory/nav-item-detail.block.ts +3 -3
- package/examples/saucedemo/src/blocks/saucedemo-web/inventory-item/nav-back-to-inventory.block.ts +3 -3
- package/examples/saucedemo/src/blocks/saucedemo-web/inventory-item/nav-back-to-products.block.ts +3 -3
- package/examples/saucedemo/src/blocks/saucedemo-web/inventory-item/nav-continue-shopping.block.ts +3 -3
- package/examples/saucedemo/src/blocks/saucedemo-web/methods/fill-password.method.block.ts +5 -29
- package/examples/saucedemo/src/blocks/saucedemo-web/methods/fill-username.method.block.ts +5 -48
- package/examples/saucedemo/src/blocks/saucedemo-web/methods/submit-login.method.block.ts +13 -77
- package/examples/saucedemo/src/blocks/saucedemo-web/methods/submit-logout.method.block.ts +5 -4
- package/examples/saucedemo/src/blocks/saucedemo-web/nav-login.block.ts +3 -3
- package/examples/saucedemo/src/flows/api-demo.flow.ts +26 -18
- package/examples/saucedemo/src/flows/cart-bulk.flow.ts +19 -14
- package/examples/saucedemo/src/flows/cart-continue.flow.ts +10 -8
- package/examples/saucedemo/src/flows/cart-mem.flow.ts +7 -7
- package/examples/saucedemo/src/flows/catalog-logout.flow.ts +13 -8
- package/examples/saucedemo/src/flows/checkout-then-browse-again.flow.ts +26 -48
- package/examples/saucedemo/src/flows/checkout.flow.ts +70 -86
- package/examples/saucedemo/src/flows/device-showcase.flow.ts +24 -25
- package/examples/saucedemo/src/flows/login.flow.ts +11 -18
- package/examples/saucedemo/src/flows/mem-stub-demo.flow.ts +9 -20
- package/examples/saucedemo/src/flows/shop.flow.ts +15 -20
- package/examples/saucedemo/src/flows/smoke.flow.ts +12 -27
- package/examples/saucedemo/src/flows/stub-on-error.flow.ts +24 -43
- package/examples/saucedemo/src/flows/viewer-blocked.flow.ts +26 -34
- package/examples/saucedemo/src/states/checkout.mem-stubs.ts +11 -0
- package/examples/saucedemo/src/states/checkout.states.ts +21 -11
- package/examples/saucedemo/src/stubs/device-showcase.ts +191 -0
- package/examples/saucedemo/src/stubs/login.ts +37 -0
- package/examples/saucedemo/tests/auto-graph.spec.ts +4 -12
- package/examples/saucedemo/tests/chain-flow-episodes.spec.ts +7 -9
- package/examples/saucedemo/tests/submit-login-branch.spec.ts +18 -5
- package/package.json +12 -7
- package/templates/agents/waygraph-planner.agent.md +2 -2
- package/templates/quickstart/README.md +4 -7
- package/templates/quickstart/config/waygraph.config.ts +17 -0
- package/templates/quickstart/docs/CONVENTION.md +5 -6
- package/templates/quickstart/docs/HELPERS.md +11 -9
- package/templates/quickstart/package.json +14 -17
- package/templates/quickstart/src/blocks/SITE-MAP.md +13 -3
- package/templates/quickstart/src/blocks/saucedemo-web/NAV.md +1 -5
- package/templates/quickstart/src/blocks/saucedemo-web/cart/nav-cart.block.ts +3 -52
- package/templates/quickstart/src/blocks/saucedemo-web/cart/nav-checkout-info.block.ts +3 -3
- package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-one/methods/fill-first-name.method.block.ts +5 -4
- package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-one/methods/fill-last-name.method.block.ts +5 -4
- package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-one/methods/fill-postal-code.method.block.ts +5 -4
- package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-one/methods/submit-checkout-info.method.block.ts +5 -4
- package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-two/methods/finish-order.method.block.ts +21 -27
- package/templates/quickstart/src/blocks/saucedemo-web/inventory/inventory.page.block.ts +3 -9
- package/templates/quickstart/src/blocks/saucedemo-web/inventory/methods/add-all-to-cart.method.block.ts +4 -6
- package/templates/quickstart/src/blocks/saucedemo-web/inventory/methods/add-to-cart.effect.block.ts +10 -76
- package/templates/quickstart/src/blocks/saucedemo-web/inventory/methods/remove-all-from-cart.method.block.ts +4 -6
- package/templates/quickstart/src/blocks/saucedemo-web/inventory/methods/remove-from-cart.effect.block.ts +4 -3
- package/templates/quickstart/src/blocks/saucedemo-web/inventory/nav-item-detail.block.ts +3 -3
- package/templates/quickstart/src/blocks/saucedemo-web/inventory-item/nav-back-to-inventory.block.ts +3 -3
- package/templates/quickstart/src/blocks/saucedemo-web/inventory-item/nav-back-to-products.block.ts +3 -3
- package/templates/quickstart/src/blocks/saucedemo-web/inventory-item/nav-continue-shopping.block.ts +3 -3
- package/templates/quickstart/src/blocks/saucedemo-web/methods/fill-password.method.block.ts +5 -29
- package/templates/quickstart/src/blocks/saucedemo-web/methods/fill-username.method.block.ts +5 -48
- package/templates/quickstart/src/blocks/saucedemo-web/methods/submit-login.method.block.ts +13 -77
- package/templates/quickstart/src/blocks/saucedemo-web/methods/submit-logout.method.block.ts +5 -4
- package/templates/quickstart/src/blocks/saucedemo-web/nav-login.block.ts +3 -3
- package/templates/quickstart/src/flows/api-demo.flow.ts +45 -0
- package/templates/quickstart/src/flows/cart-bulk.flow.ts +19 -14
- package/templates/quickstart/src/flows/cart-continue.flow.ts +10 -8
- package/templates/quickstart/src/flows/cart-mem.flow.ts +7 -7
- package/templates/quickstart/src/flows/catalog-logout.flow.ts +13 -8
- package/templates/quickstart/src/flows/checkout-then-browse-again.flow.ts +26 -48
- package/templates/quickstart/src/flows/checkout.flow.ts +70 -63
- package/templates/quickstart/src/flows/device-showcase.flow.ts +24 -25
- package/templates/quickstart/src/flows/login.flow.ts +11 -18
- package/templates/quickstart/src/flows/mem-stub-demo.flow.ts +12 -0
- package/templates/quickstart/src/flows/shop.flow.ts +15 -20
- package/templates/quickstart/src/flows/smoke.flow.ts +12 -27
- package/templates/quickstart/src/flows/stub-on-error.flow.ts +31 -0
- package/templates/quickstart/src/flows/viewer-blocked.flow.ts +26 -34
- package/templates/quickstart/src/states/checkout.mem-stubs.ts +11 -0
- package/templates/quickstart/src/states/checkout.states.ts +21 -11
- package/templates/quickstart/src/stubs/device-showcase.ts +191 -0
- package/templates/quickstart/src/stubs/login.ts +37 -0
- package/templates/quickstart/tests/chain-flow.spec.ts +7 -10
- package/templates/scaffold/README.md +2 -1
- package/templates/scaffold/STRUCTURE.md +5 -4
- package/templates/scaffold/config/waygraph.config.ts +1 -0
- package/templates/scaffold/gitignore +1 -0
- package/templates/scaffold/src/flows/README.md +2 -2
- package/templates/scaffold/src/map/(app_base)/docs/_nav.block.ts +3 -3
- package/templates/scaffold/src/map/(app_base)/docs/_page.block.ts +3 -3
- package/templates/scaffold/src/map/(app_base)/home/_methods/add-item.effect.block.ts +4 -4
- package/templates/scaffold/src/map/(app_base)/home/_methods/assert-hello.method.block.ts +3 -3
- package/templates/scaffold/src/map/(app_base)/home/_methods/assert-item-added.method.block.ts +3 -3
- package/templates/scaffold/src/map/(app_base)/home/_methods/clear-cart.method.block.ts +5 -4
- package/templates/scaffold/src/map/(app_base)/home/_methods/remove-item.effect.block.ts +4 -4
- package/templates/scaffold/src/map/(app_base)/home/_nav.block.ts +3 -3
- package/templates/scaffold/src/map/(app_base)/home/_page.block.ts +3 -3
- package/templates/scaffold/src/map/(app_base)/home/nav-verification-link.block.ts +4 -4
- package/templates/scaffold/src/map/(external)/hoppscotch/_keys.ts +21 -0
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/assert-response-body.method.block.ts +4 -4
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/assert-response-header.method.block.ts +4 -4
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/assert-status.method.block.ts +4 -4
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/pick-extension-interceptor.method.block.ts +5 -4
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/read-response-body.method.block.ts +6 -5
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/read-response-headers.method.block.ts +6 -5
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/send-request.method.block.ts +5 -4
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-bearer-token.method.block.ts +6 -5
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-headers.method.block.ts +6 -5
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-json-body.method.block.ts +6 -5
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-method.method.block.ts +6 -5
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-query-params.method.block.ts +6 -5
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-url.method.block.ts +6 -5
- package/templates/scaffold/src/map/(external)/hoppscotch/_nav.block.ts +3 -3
- package/templates/scaffold/src/map/(external)/hoppscotch/_page.block.ts +3 -3
- package/templates/scaffold/src/map/(external)/hoppscotch/_states.ts +6 -0
- package/templates/scaffold/src/map/(external)/hoppscotch/settings/_nav.block.ts +3 -3
- package/templates/scaffold/src/map/(external)/mailpit/_keys.ts +13 -0
- package/templates/scaffold/src/map/(external)/mailpit/_methods/assert-email-content.method.block.ts +4 -4
- package/templates/scaffold/src/map/(external)/mailpit/_methods/assert-email-received.method.block.ts +4 -4
- package/templates/scaffold/src/map/(external)/mailpit/_methods/extract-email-link.method.block.ts +6 -5
- package/templates/scaffold/src/map/(external)/mailpit/_methods/open-message.method.block.ts +6 -5
- package/templates/scaffold/src/map/(external)/mailpit/_nav.block.ts +3 -3
- package/templates/scaffold/src/map/(external)/mailpit/_page.block.ts +3 -3
- package/templates/scaffold/src/map/(external)/mailpit/_states.ts +9 -0
- package/templates/scaffold/src/map/README.md +7 -0
- package/templates/scaffold/src/states/README.md +4 -1
- package/templates/scaffold/src/states/demo.mem-keys.ts +1 -29
- package/templates/scaffold/src/states/demo.states.ts +14 -20
- package/templates/scaffold/tests/hoppscotch.spec.ts +1 -11
- package/templates/scaffold/tests/mail-verify.spec.ts +2 -2
- package/templates/skills/waygraph-blind-pilot.skill.md +2 -6
- package/templates/skills/waygraph-convention.skill.md +23 -14
- package/templates/skills/waygraph-pilot.skill.md +7 -4
- package/dist/auto-session/verbose-log.js +0 -16
- package/dist/auto-session.d.ts +0 -2
- package/dist/auto-session.js +0 -3
- package/dist/cli/discover.d.ts +0 -40
- package/dist/cli/discover.js +0 -148
- package/dist/commands/agent-dive.js +0 -52
- package/dist/commands/check.js +0 -192
- package/dist/commands/map.js +0 -29
- package/dist/commands/run.js +0 -104
- package/dist/commands/traverse.js +0 -177
- package/dist/core/block.d.ts +0 -109
- package/dist/core/blocks/effect.js +0 -23
- package/dist/core/config.js +0 -17
- package/dist/core/engine.d.ts +0 -198
- package/dist/core/flow.d.ts +0 -293
- package/dist/core/flow.js +0 -432
- package/dist/core.d.ts +0 -14
- package/dist/core.js +0 -15
- package/dist/highlights/merge.d.ts +0 -8
- package/dist/highlights/merge.js +0 -173
- package/dist/highlights/stub-ctx.d.ts +0 -10
- package/dist/highlights/stub-ctx.js +0 -331
- package/dist/highlights/types.d.ts +0 -607
- package/dist/highlights.d.ts +0 -9
- package/dist/highlights.js +0 -10
- package/dist/pilot-overlay.d.ts +0 -5
- package/dist/pilot-overlay.js +0 -6
- package/dist/runner/banner-log.js +0 -63
- package/dist/runner/chain-run.js +0 -102
- package/dist/runner/cursor.js +0 -140
- package/dist/runner/demo-log.js +0 -316
- package/dist/runner/device-stage.d.ts +0 -9
- package/dist/runner/device-stage.js +0 -420
- package/dist/runner/discovery.js +0 -105
- package/dist/runner/index.js +0 -2
- package/dist/runner/inpage/banner.d.ts +0 -21
- package/dist/runner/inpage/banner.js +0 -156
- package/dist/runner/inpage/caption.d.ts +0 -3
- package/dist/runner/inpage/caption.js +0 -23
- package/dist/runner/inpage/core.d.ts +0 -4
- package/dist/runner/inpage/core.js +0 -316
- package/dist/runner/inpage/device.d.ts +0 -3
- package/dist/runner/inpage/device.js +0 -211
- package/dist/runner/inpage/network.d.ts +0 -15
- package/dist/runner/inpage/network.js +0 -217
- package/dist/runner/inpage/panel-chrome.js +0 -192
- package/dist/runner/inpage/stamp.js +0 -46
- package/dist/runner/inpage/swipe-zoom.js +0 -220
- package/dist/runner/inpage/todos.js +0 -337
- package/dist/runner/interaction-patch.js +0 -384
- package/dist/runner/main.js +0 -469
- package/dist/runner/network-capture.d.ts +0 -9
- package/dist/runner/network-capture.js +0 -126
- package/dist/runner/overlay-css.d.ts +0 -3
- package/dist/runner/overlay-css.js +0 -377
- package/dist/runner/overlay-install.js +0 -90
- package/dist/runner/overlay-stage.js +0 -110
- package/dist/runner/rings.js +0 -514
- package/dist/runner/seed-mem.js +0 -110
- package/dist/runner/slides.js +0 -278
- package/dist/runner/step-mode.js +0 -703
- package/dist/runner/step-panels.js +0 -729
- package/dist/runner/teardown.js +0 -202
- package/dist/runner/todo-dock.js +0 -142
- package/dist/session/step-overlay.d.ts +0 -37
- package/dist/session/step-overlay.js +0 -244
- package/examples/routed-demo/playwright.config.ts +0 -21
- package/examples/saucedemo/playwright.config.ts +0 -19
- package/examples/saucedemo/scripts/drive-auto-cli.mjs +0 -93
- package/examples/saucedemo/scripts/prove-add-to-cart-menu.mjs +0 -126
- package/examples/saucedemo/scripts/prove-auto-graph.mjs +0 -92
- package/examples/saucedemo/scripts/prove-wrong-login-runtime.mjs +0 -63
- package/examples/saucedemo/src/blocks/saucedemo-web/ff-owner-auth.block.ts +0 -22
- package/templates/quickstart/playwright.config.ts +0 -14
- package/templates/quickstart/scripts/drive-auto-cli.mjs +0 -93
- package/templates/quickstart/src/blocks/saucedemo-web/ff-owner-auth.block.ts +0 -22
- /package/dist/{commands → cli/commands}/agent-dive-scaffold.d.ts +0 -0
- /package/dist/{commands → cli/commands}/agent-dive.d.ts +0 -0
- /package/dist/{commands → cli/commands}/extensions.d.ts +0 -0
- /package/dist/{commands → cli/commands}/init.d.ts +0 -0
- /package/dist/{commands → cli/commands}/list.d.ts +0 -0
- /package/dist/{commands → cli/commands}/map.d.ts +0 -0
- /package/dist/{commands → cli/commands}/session.d.ts +0 -0
- /package/dist/{commands → cli/commands}/test.d.ts +0 -0
- /package/dist/{commands → cli/commands}/traverse.d.ts +0 -0
- /package/dist/{commands → cli/commands}/try.d.ts +0 -0
- /package/dist/{commands → cli/commands}/upgrade.d.ts +0 -0
- /package/dist/{highlights → demo/narration}/shorthand.js +0 -0
- /package/dist/{pilot-overlay/action-ring.d.ts → demo/overlay/pilot/actions.d.ts} +0 -0
- /package/dist/{ui → demo/overlay/ui}/components/ring.d.ts +0 -0
- /package/dist/{ui → demo/overlay/ui}/stylesheet.d.ts +0 -0
- /package/dist/{ui → demo/overlay/ui}/stylesheet.js +0 -0
- /package/dist/{ui → demo/overlay/ui}/tokens.d.ts +0 -0
- /package/dist/{ui → demo/overlay/ui}/tokens.js +0 -0
- /package/dist/{highlights → demo}/types.js +0 -0
- /package/dist/{auto-session → demo}/verbose-log.d.ts +0 -0
- /package/dist/{selector.d.ts → engine/trait/selector.d.ts} +0 -0
- /package/dist/{selector.js → engine/trait/selector.js} +0 -0
- /package/dist/{trait.js → engine/trait/trait.js} +0 -0
- /package/dist/{session/block-inject.d.ts → manifest/roots.d.ts} +0 -0
- /package/dist/{browser.d.ts → runtime/browser.d.ts} +0 -0
- /package/dist/{env-file.d.ts → runtime/env-file.d.ts} +0 -0
- /package/dist/{playwright-config.js → runtime/playwright-config.js} +0 -0
- /package/dist/{playwright.config.d.ts → runtime/playwright.config.d.ts} +0 -0
- /package/dist/{video-dir.d.ts → runtime/video-dir.d.ts} +0 -0
- /package/dist/{webserver.d.ts → runtime/webserver.d.ts} +0 -0
|
@@ -9,9 +9,13 @@
|
|
|
9
9
|
* Agents: do not claim the stepper works unless
|
|
10
10
|
* `assertWgOverlayReady(page)` (or WAYGRAPH_PROVE_EXIT=1) passes.
|
|
11
11
|
*/
|
|
12
|
+
/** Selector matching every element waygraph's overlay draws into a page. */
|
|
12
13
|
export const WG_UI_SEL = '[data-wg-ui="1"]';
|
|
14
|
+
/** Selector of the overlay element that appears when the step panel is ready. */
|
|
13
15
|
export const WG_READY_PANEL_SEL = '[data-wg-modal="panel"][data-wg-ready="1"]';
|
|
16
|
+
/** Selector of the overlay element that appears when the auto panel is ready. */
|
|
14
17
|
export const WG_READY_AUTO_SEL = '[data-wg-modal="auto-panel"][data-wg-ready="1"]';
|
|
18
|
+
/** Selector of the overlay element that appears when the banner is ready. */
|
|
15
19
|
export const WG_READY_BANNER_SEL = '[data-wg-modal="banner"][data-wg-ready="1"]';
|
|
16
20
|
/** Browser-side beacon reader (also installed as window.__wgOverlayBeacon). */
|
|
17
21
|
export function readWgOverlayBeaconInPage() {
|
|
@@ -37,6 +41,7 @@ export function readWgOverlayBeaconInPage() {
|
|
|
37
41
|
};
|
|
38
42
|
});
|
|
39
43
|
}
|
|
44
|
+
/** Reads the overlay beacon from a page: what waygraph's own UI is showing. */
|
|
40
45
|
export async function readWgOverlayBeacon(page) {
|
|
41
46
|
return page.evaluate(() => {
|
|
42
47
|
const w = window;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { WgBox, WgPage } from "../types.js";
|
|
2
|
+
export declare function moveCursorTo(page: WgPage, box: WgBox, ms: number): Promise<{
|
|
3
|
+
x: number;
|
|
4
|
+
y: number;
|
|
5
|
+
}>;
|
|
6
|
+
export declare function clickPulseAt(page: WgPage, x: any, y: any, tone: any): Promise<void>;
|
|
7
|
+
/**
|
|
8
|
+
* Touch swipe trail (mobile/tablet). dir: left|right|up|down.
|
|
9
|
+
* Returns after the trail animation completes.
|
|
10
|
+
* Self-contained when overlay helper is not installed yet (device runs before panel).
|
|
11
|
+
*/
|
|
12
|
+
export declare function playSwipeTrail(page: WgPage, opts: any): Promise<void>;
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
// The demo cursor: travels to what a step clicks, pulses on the click, draws a swipe trail on touch devices.
|
|
2
|
+
import { ignorePageGone } from "../../engine/page-gone.js";
|
|
3
|
+
export async function moveCursorTo(page, box, ms) {
|
|
4
|
+
const x = box.x + box.width / 2;
|
|
5
|
+
const y = box.y + box.height / 2;
|
|
6
|
+
const travel = Math.max(0, Number(ms) || 0);
|
|
7
|
+
await page
|
|
8
|
+
.evaluate(({ x, y, ms }) => {
|
|
9
|
+
if (window.__wgMoveCursorTo)
|
|
10
|
+
window.__wgMoveCursorTo(x, y, ms);
|
|
11
|
+
}, { x, y, ms: travel })
|
|
12
|
+
.catch(ignorePageGone);
|
|
13
|
+
// CSS transition is async - wait the full travel so the cursor is ON the
|
|
14
|
+
// target before ring/pulse/real click (NavBlock click nav was skipping
|
|
15
|
+
// this and looked like a teleport).
|
|
16
|
+
if (travel > 0) {
|
|
17
|
+
await new Promise((res) => setTimeout(res, travel));
|
|
18
|
+
}
|
|
19
|
+
return { x, y };
|
|
20
|
+
}
|
|
21
|
+
export async function clickPulseAt(page, x, y, tone) {
|
|
22
|
+
await page
|
|
23
|
+
.evaluate(({ x, y, tone }) => {
|
|
24
|
+
if (window.__wgClickPulse)
|
|
25
|
+
window.__wgClickPulse(x, y, tone || "planned");
|
|
26
|
+
}, { x, y, tone: tone || "planned" })
|
|
27
|
+
.catch(ignorePageGone);
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Touch swipe trail (mobile/tablet). dir: left|right|up|down.
|
|
31
|
+
* Returns after the trail animation completes.
|
|
32
|
+
* Self-contained when overlay helper is not installed yet (device runs before panel).
|
|
33
|
+
*/
|
|
34
|
+
export async function playSwipeTrail(page, opts) {
|
|
35
|
+
const o = opts || {};
|
|
36
|
+
const waitMs = await page
|
|
37
|
+
.evaluate((payload) => {
|
|
38
|
+
if (typeof window.__wgSwipeTrail === "function") {
|
|
39
|
+
return window.__wgSwipeTrail(payload);
|
|
40
|
+
}
|
|
41
|
+
// Fallback: inject a one-shot trail without full overlay install.
|
|
42
|
+
const dir = payload.dir === "right" || payload.dir === "up" || payload.dir === "down"
|
|
43
|
+
? payload.dir
|
|
44
|
+
: "left";
|
|
45
|
+
const ms = Math.max(280, Math.min(1400, Number(payload.ms) || 720));
|
|
46
|
+
const label = payload.label || "swipe";
|
|
47
|
+
let layer = __wgById("wg-swipe-layer");
|
|
48
|
+
if (layer)
|
|
49
|
+
layer.remove();
|
|
50
|
+
layer = document.createElement("div");
|
|
51
|
+
layer.id = "wg-swipe-layer";
|
|
52
|
+
layer.setAttribute("data-wg-ui", "1");
|
|
53
|
+
layer.style.cssText =
|
|
54
|
+
"position:fixed;inset:0;z-index:2147483646;pointer-events:none;overflow:hidden;";
|
|
55
|
+
const finger = document.createElement("div");
|
|
56
|
+
finger.style.cssText =
|
|
57
|
+
"position:absolute;width:28px;height:28px;margin:-14px 0 0 -14px;border-radius:50%;" +
|
|
58
|
+
"background:rgba(15,23,42,.92);border:2px solid #fff;box-shadow:0 4px 16px rgba(0,0,0,.4);";
|
|
59
|
+
const lab = document.createElement("div");
|
|
60
|
+
lab.textContent = label;
|
|
61
|
+
lab.style.cssText =
|
|
62
|
+
"position:absolute;left:50%;top:18%;transform:translateX(-50%);padding:6px 12px;" +
|
|
63
|
+
"border-radius:999px;background:rgba(15,23,42,.88);color:#e0f2fe;" +
|
|
64
|
+
"border:1px solid rgba(56,189,248,.55);font:700 12px/1.2 system-ui,sans-serif;";
|
|
65
|
+
layer.appendChild(lab);
|
|
66
|
+
layer.appendChild(finger);
|
|
67
|
+
__wgAdd(layer);
|
|
68
|
+
const vw = window.innerWidth || 390;
|
|
69
|
+
const vh = window.innerHeight || 844;
|
|
70
|
+
const pad = Math.min(vw, vh) * 0.18;
|
|
71
|
+
let x0;
|
|
72
|
+
let y0;
|
|
73
|
+
let x1;
|
|
74
|
+
let y1;
|
|
75
|
+
if (dir === "left") {
|
|
76
|
+
x0 = vw - pad;
|
|
77
|
+
x1 = pad;
|
|
78
|
+
y0 = y1 = vh * 0.52;
|
|
79
|
+
}
|
|
80
|
+
else if (dir === "right") {
|
|
81
|
+
x0 = pad;
|
|
82
|
+
x1 = vw - pad;
|
|
83
|
+
y0 = y1 = vh * 0.52;
|
|
84
|
+
}
|
|
85
|
+
else if (dir === "up") {
|
|
86
|
+
x0 = x1 = vw * 0.5;
|
|
87
|
+
y0 = vh - pad;
|
|
88
|
+
y1 = pad;
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
x0 = x1 = vw * 0.5;
|
|
92
|
+
y0 = pad;
|
|
93
|
+
y1 = vh - pad;
|
|
94
|
+
}
|
|
95
|
+
finger.style.left = x0 + "px";
|
|
96
|
+
finger.style.top = y0 + "px";
|
|
97
|
+
const steps = 12;
|
|
98
|
+
const stepMs = Math.floor(ms / steps);
|
|
99
|
+
for (let i = 1; i <= steps; i++) {
|
|
100
|
+
const t = i / steps;
|
|
101
|
+
const e = t * t * (3 - 2 * t);
|
|
102
|
+
const x = x0 + (x1 - x0) * e;
|
|
103
|
+
const y = y0 + (y1 - y0) * e;
|
|
104
|
+
setTimeout(() => {
|
|
105
|
+
finger.style.left = x + "px";
|
|
106
|
+
finger.style.top = y + "px";
|
|
107
|
+
const dot = document.createElement("div");
|
|
108
|
+
dot.style.cssText =
|
|
109
|
+
"position:absolute;width:14px;height:14px;margin:-7px 0 0 -7px;border-radius:50%;" +
|
|
110
|
+
"background:rgba(147,197,253,.55);border:2px solid rgba(255,255,255,.85);left:" +
|
|
111
|
+
x +
|
|
112
|
+
"px;top:" +
|
|
113
|
+
y +
|
|
114
|
+
"px;opacity:" +
|
|
115
|
+
(0.85 - t * 0.55) +
|
|
116
|
+
";transition:opacity .45s ease,transform .45s ease;";
|
|
117
|
+
layer.appendChild(dot);
|
|
118
|
+
requestAnimationFrame(() => {
|
|
119
|
+
dot.style.opacity = "0";
|
|
120
|
+
dot.style.transform = "scale(1.8)";
|
|
121
|
+
});
|
|
122
|
+
if (i === steps) {
|
|
123
|
+
setTimeout(() => {
|
|
124
|
+
const el = __wgById("wg-swipe-layer");
|
|
125
|
+
if (el)
|
|
126
|
+
el.remove();
|
|
127
|
+
}, 400);
|
|
128
|
+
}
|
|
129
|
+
}, i * stepMs);
|
|
130
|
+
}
|
|
131
|
+
return ms + 120;
|
|
132
|
+
}, {
|
|
133
|
+
dir: o.dir || "left",
|
|
134
|
+
label: o.label || "swipe",
|
|
135
|
+
hint: o.hint || "",
|
|
136
|
+
ms: o.ms || 720,
|
|
137
|
+
})
|
|
138
|
+
.catch(() => 0);
|
|
139
|
+
const n = Number(waitMs) || 0;
|
|
140
|
+
if (n > 0)
|
|
141
|
+
await new Promise((r) => setTimeout(r, n));
|
|
142
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { WgPage } from "../types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Video recording locks Playwright viewport to recordVideo.size. Shrinking
|
|
4
|
+
* setViewportSize to mobile/tablet letterboxes the .webm top-left. Instead keep
|
|
5
|
+
* the stage size and center a device-sized #wg-device-shell inside the frame.
|
|
6
|
+
*/
|
|
7
|
+
export declare function applyVideoDeviceStage(page: WgPage, target: any, stage: any, opts: any): Promise<void>;
|
|
8
|
+
/**
|
|
9
|
+
* Apply authored device fixture to the live page (0.13+).
|
|
10
|
+
* Seamless viewport lerp + centered window + toast on set/clear.
|
|
11
|
+
* With --video: keep recordVideo stage size and center a device shell in-frame.
|
|
12
|
+
*/
|
|
13
|
+
export declare function applyDeviceToPage(page: WgPage, device: any, sync: any): Promise<void>;
|
|
@@ -0,0 +1,396 @@
|
|
|
1
|
+
import { resolveDeviceState } from "../narration/device.js";
|
|
2
|
+
import { envNumber } from "../../engine/env.js";
|
|
3
|
+
import { ignorePageGone } from "../../engine/page-gone.js";
|
|
4
|
+
/**
|
|
5
|
+
* Fit + center the OS browser window on the device viewport so mobile/tablet
|
|
6
|
+
* is not stuck top-left inside a maximized frame (0.13.4).
|
|
7
|
+
* Desktop clear restores maximized.
|
|
8
|
+
*/
|
|
9
|
+
async function fitWindowToDeviceViewport(page, viewport, opts) {
|
|
10
|
+
const maximize = !!(opts && opts.maximize);
|
|
11
|
+
let client;
|
|
12
|
+
try {
|
|
13
|
+
client = await page.context().newCDPSession(page);
|
|
14
|
+
const { windowId } = await client.send("Browser.getWindowForTarget");
|
|
15
|
+
if (maximize) {
|
|
16
|
+
await client.send("Browser.setWindowBounds", {
|
|
17
|
+
windowId,
|
|
18
|
+
bounds: { windowState: "maximized" },
|
|
19
|
+
});
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
if (!viewport || !viewport.width || !viewport.height)
|
|
23
|
+
return;
|
|
24
|
+
const metrics = await page
|
|
25
|
+
.evaluate(() => {
|
|
26
|
+
const chromeW = Math.max(0, (window.outerWidth || 0) - (window.innerWidth || 0));
|
|
27
|
+
const chromeH = Math.max(0, (window.outerHeight || 0) - (window.innerHeight || 0));
|
|
28
|
+
return {
|
|
29
|
+
chromeW: Number.isFinite(chromeW) ? chromeW : 0,
|
|
30
|
+
// First paint after maximize often reports 0 chrome - use a floor.
|
|
31
|
+
chromeH: chromeH > 20 ? chromeH : 88,
|
|
32
|
+
screenW: window.screen.availWidth || 1920,
|
|
33
|
+
screenH: window.screen.availHeight || 1080,
|
|
34
|
+
};
|
|
35
|
+
})
|
|
36
|
+
.catch(() => ({ chromeW: 0, chromeH: 88, screenW: 1920, screenH: 1080 }));
|
|
37
|
+
// Leave maximized before setting pixel bounds (Chromium ignores size while max).
|
|
38
|
+
await client.send("Browser.setWindowBounds", {
|
|
39
|
+
windowId,
|
|
40
|
+
bounds: { windowState: "normal" },
|
|
41
|
+
});
|
|
42
|
+
const winW = Math.min(metrics.screenW, Math.max(320, Math.floor(viewport.width + metrics.chromeW)));
|
|
43
|
+
const winH = Math.min(metrics.screenH, Math.max(320, Math.floor(viewport.height + metrics.chromeH)));
|
|
44
|
+
const left = Math.max(0, Math.floor((metrics.screenW - winW) / 2));
|
|
45
|
+
const top = Math.max(0, Math.floor((metrics.screenH - winH) / 2));
|
|
46
|
+
await client.send("Browser.setWindowBounds", {
|
|
47
|
+
windowId,
|
|
48
|
+
bounds: {
|
|
49
|
+
windowState: "normal",
|
|
50
|
+
left,
|
|
51
|
+
top,
|
|
52
|
+
width: winW,
|
|
53
|
+
height: winH,
|
|
54
|
+
},
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
/* headless / no window - ignore */
|
|
59
|
+
}
|
|
60
|
+
finally {
|
|
61
|
+
if (client)
|
|
62
|
+
await client.detach().catch(ignorePageGone);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Video recording locks Playwright viewport to recordVideo.size. Shrinking
|
|
67
|
+
* setViewportSize to mobile/tablet letterboxes the .webm top-left. Instead keep
|
|
68
|
+
* the stage size and center a device-sized #wg-device-shell inside the frame.
|
|
69
|
+
*/
|
|
70
|
+
export async function applyVideoDeviceStage(page, target, stage, opts) {
|
|
71
|
+
const clear = !!(opts && opts.clear);
|
|
72
|
+
const shutterOut = !!(opts && opts.shutterOut);
|
|
73
|
+
const enterIn = !!(opts && opts.enterIn);
|
|
74
|
+
const desktopFlat = !!(opts && (opts.desktopFlat || opts.shutterOut));
|
|
75
|
+
const result = await page
|
|
76
|
+
.evaluate(({ tw, th, sw, sh, clear, shutterOut, enterIn, desktopFlat }) => {
|
|
77
|
+
const MATTE = "#0b1220";
|
|
78
|
+
const unwrap = () => {
|
|
79
|
+
const shell = document.getElementById("wg-device-shell");
|
|
80
|
+
if (shell) {
|
|
81
|
+
const parent = shell.parentNode;
|
|
82
|
+
if (parent) {
|
|
83
|
+
while (shell.firstChild)
|
|
84
|
+
parent.insertBefore(shell.firstChild, shell);
|
|
85
|
+
}
|
|
86
|
+
shell.remove();
|
|
87
|
+
}
|
|
88
|
+
document.documentElement.classList.remove("wg-video-device-stage");
|
|
89
|
+
document.documentElement.style.removeProperty("background");
|
|
90
|
+
const b = document.body;
|
|
91
|
+
if (b) {
|
|
92
|
+
b.style.margin = "";
|
|
93
|
+
b.style.minHeight = "";
|
|
94
|
+
b.style.display = "";
|
|
95
|
+
b.style.alignItems = "";
|
|
96
|
+
b.style.justifyContent = "";
|
|
97
|
+
b.style.background = "";
|
|
98
|
+
b.style.overflow = "";
|
|
99
|
+
}
|
|
100
|
+
};
|
|
101
|
+
if (clear) {
|
|
102
|
+
unwrap();
|
|
103
|
+
return { waitMs: 0 };
|
|
104
|
+
}
|
|
105
|
+
if (!document.body)
|
|
106
|
+
return { waitMs: 0 };
|
|
107
|
+
document.documentElement.classList.add("wg-video-device-stage");
|
|
108
|
+
document.documentElement.style.background = MATTE;
|
|
109
|
+
document.body.style.margin = "0";
|
|
110
|
+
document.body.style.minHeight = "100vh";
|
|
111
|
+
document.body.style.display = "flex";
|
|
112
|
+
document.body.style.alignItems = "center";
|
|
113
|
+
document.body.style.justifyContent = "center";
|
|
114
|
+
document.body.style.background = MATTE;
|
|
115
|
+
document.body.style.overflow = "hidden";
|
|
116
|
+
let shell = document.getElementById("wg-device-shell");
|
|
117
|
+
const created = !shell;
|
|
118
|
+
if (!shell) {
|
|
119
|
+
shell = document.createElement("div");
|
|
120
|
+
shell.id = "wg-device-shell";
|
|
121
|
+
const move = [];
|
|
122
|
+
for (const child of [...document.body.childNodes]) {
|
|
123
|
+
if (child.nodeType === 1 &&
|
|
124
|
+
child.getAttribute &&
|
|
125
|
+
child.getAttribute("data-wg-ui") === "1") {
|
|
126
|
+
continue;
|
|
127
|
+
}
|
|
128
|
+
if (child.nodeType === 1 && child.id === "wg-device-shell")
|
|
129
|
+
continue;
|
|
130
|
+
move.push(child);
|
|
131
|
+
}
|
|
132
|
+
for (const n of move)
|
|
133
|
+
shell.appendChild(n);
|
|
134
|
+
document.body.appendChild(shell);
|
|
135
|
+
}
|
|
136
|
+
// Desktop flat: always full-bleed, never reintroduce bezel on overlay rebuild.
|
|
137
|
+
if (desktopFlat) {
|
|
138
|
+
shell.classList.remove("wg-shell-enter");
|
|
139
|
+
shell.classList.add("wg-shell-shutter-out");
|
|
140
|
+
shell.classList.add("wg-shell-desktop-flat");
|
|
141
|
+
shell.style.width = sw + "px";
|
|
142
|
+
shell.style.height = sh + "px";
|
|
143
|
+
shell.style.maxWidth = sw + "px";
|
|
144
|
+
shell.style.maxHeight = sh + "px";
|
|
145
|
+
shell.style.transform = "scale(1)";
|
|
146
|
+
shell.style.transformOrigin = "center center";
|
|
147
|
+
shell.style.borderRadius = "0";
|
|
148
|
+
shell.style.boxShadow = "none";
|
|
149
|
+
shell.style.border = "none";
|
|
150
|
+
shell.style.outline = "none";
|
|
151
|
+
return { waitMs: shutterOut ? 480 : 0 };
|
|
152
|
+
}
|
|
153
|
+
// Leaving desktop-flat: clear INLINE radius/shadow overrides so CSS
|
|
154
|
+
// border-radius:16px applies evenly on all corners again.
|
|
155
|
+
shell.style.removeProperty("border-radius");
|
|
156
|
+
shell.style.removeProperty("box-shadow");
|
|
157
|
+
shell.style.removeProperty("border");
|
|
158
|
+
shell.style.removeProperty("outline");
|
|
159
|
+
if (enterIn && (created || shell.classList.contains("wg-shell-shutter-out"))) {
|
|
160
|
+
shell.classList.remove("wg-shell-shutter-out");
|
|
161
|
+
shell.classList.remove("wg-shell-desktop-flat");
|
|
162
|
+
shell.classList.add("wg-shell-enter");
|
|
163
|
+
void shell.offsetWidth;
|
|
164
|
+
}
|
|
165
|
+
const scale = Math.min(sw / tw, sh / th) * 0.92;
|
|
166
|
+
shell.style.width = tw + "px";
|
|
167
|
+
shell.style.height = th + "px";
|
|
168
|
+
shell.style.maxWidth = tw + "px";
|
|
169
|
+
shell.style.maxHeight = th + "px";
|
|
170
|
+
shell.style.transform = "scale(" + scale + ")";
|
|
171
|
+
shell.style.transformOrigin = "center center";
|
|
172
|
+
shell.classList.remove("wg-shell-shutter-out");
|
|
173
|
+
shell.classList.remove("wg-shell-desktop-flat");
|
|
174
|
+
if (enterIn && shell.classList.contains("wg-shell-enter")) {
|
|
175
|
+
requestAnimationFrame(() => {
|
|
176
|
+
shell.classList.remove("wg-shell-enter");
|
|
177
|
+
});
|
|
178
|
+
return { waitMs: 520 };
|
|
179
|
+
}
|
|
180
|
+
shell.classList.remove("wg-shell-enter");
|
|
181
|
+
return { waitMs: 0 };
|
|
182
|
+
}, {
|
|
183
|
+
tw: target.width,
|
|
184
|
+
th: target.height,
|
|
185
|
+
sw: stage.width,
|
|
186
|
+
sh: stage.height,
|
|
187
|
+
clear,
|
|
188
|
+
shutterOut,
|
|
189
|
+
enterIn,
|
|
190
|
+
desktopFlat,
|
|
191
|
+
})
|
|
192
|
+
.catch(() => ({ waitMs: 0 }));
|
|
193
|
+
const waitMs = result && result.waitMs ? Number(result.waitMs) : 0;
|
|
194
|
+
if (waitMs > 0)
|
|
195
|
+
await new Promise((r) => setTimeout(r, waitMs));
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Apply authored device fixture to the live page (0.13+).
|
|
199
|
+
* Seamless viewport lerp + centered window + toast on set/clear.
|
|
200
|
+
* With --video: keep recordVideo stage size and center a device shell in-frame.
|
|
201
|
+
*/
|
|
202
|
+
export async function applyDeviceToPage(page, device, sync) {
|
|
203
|
+
const mode = sync || (device ? "set" : "keep");
|
|
204
|
+
if (mode === "keep" && !device)
|
|
205
|
+
return;
|
|
206
|
+
const d = device ||
|
|
207
|
+
resolveDeviceState("desktop", false) || {
|
|
208
|
+
preset: "desktop",
|
|
209
|
+
viewport: { width: 1280, height: 720, deviceScaleFactor: 1 },
|
|
210
|
+
isMobile: false,
|
|
211
|
+
hasTouch: false,
|
|
212
|
+
touchMode: false,
|
|
213
|
+
};
|
|
214
|
+
const realSet = typeof page.__wgRealSetViewportSize === "function"
|
|
215
|
+
? page.__wgRealSetViewportSize
|
|
216
|
+
: page.setViewportSize.bind(page);
|
|
217
|
+
const target = {
|
|
218
|
+
width: Math.max(200, Math.floor(d.viewport.width)),
|
|
219
|
+
height: Math.max(200, Math.floor(d.viewport.height)),
|
|
220
|
+
};
|
|
221
|
+
const videoStage = page.__wgVideoViewport &&
|
|
222
|
+
page.__wgVideoViewport.width > 0 &&
|
|
223
|
+
page.__wgVideoViewport.height > 0
|
|
224
|
+
? {
|
|
225
|
+
width: Math.floor(page.__wgVideoViewport.width),
|
|
226
|
+
height: Math.floor(page.__wgVideoViewport.height),
|
|
227
|
+
}
|
|
228
|
+
: null;
|
|
229
|
+
let from = null;
|
|
230
|
+
try {
|
|
231
|
+
from = page.viewportSize();
|
|
232
|
+
}
|
|
233
|
+
catch {
|
|
234
|
+
from = null;
|
|
235
|
+
}
|
|
236
|
+
// Non-headless (no --video) used to literally resize the real OS browser window/viewport to
|
|
237
|
+
// each device's pixel size - a real, confirmed complaint: it didn't look like the same animated
|
|
238
|
+
// device-shell bezel the --video path already has, just a plain resize. Both now use the exact
|
|
239
|
+
// same applyVideoDeviceStage bezel technique - the "stage" (the fixed outer viewport the shell is
|
|
240
|
+
// centered within) is the recordVideo canvas size when recording, or the window's own size at
|
|
241
|
+
// the FIRST device switch when not (captured once, persisted on the page - the window itself is
|
|
242
|
+
// only really resized that one time, to establish a stable stage; every device switch after that
|
|
243
|
+
// paints the animated shell inside it instead of resizing the window again).
|
|
244
|
+
let establishingHeadedStage = false;
|
|
245
|
+
if (!videoStage && !page.__wgHeadedStage) {
|
|
246
|
+
page.__wgHeadedStage =
|
|
247
|
+
from && from.width > 0 && from.height > 0 ? { width: from.width, height: from.height } : { width: 1280, height: 720 };
|
|
248
|
+
establishingHeadedStage = true;
|
|
249
|
+
}
|
|
250
|
+
const stage = videoStage || page.__wgHeadedStage;
|
|
251
|
+
const announce = mode === "set" || mode === "clear";
|
|
252
|
+
const toDesktop = mode === "clear" || (d.preset === "desktop" && !d.touchMode);
|
|
253
|
+
const shouldAnimate = announce &&
|
|
254
|
+
from &&
|
|
255
|
+
from.width > 0 &&
|
|
256
|
+
from.height > 0 &&
|
|
257
|
+
(from.width !== target.width || from.height !== target.height);
|
|
258
|
+
// Always clear camera zoom when returning to desktop (video + headed).
|
|
259
|
+
if (toDesktop) {
|
|
260
|
+
page.__wgDesktopFlat = true;
|
|
261
|
+
await page
|
|
262
|
+
.evaluate(() => {
|
|
263
|
+
window.__wgZoomOutOnHide = true;
|
|
264
|
+
if (window.__wgClearZoom)
|
|
265
|
+
window.__wgClearZoom();
|
|
266
|
+
})
|
|
267
|
+
.catch(ignorePageGone);
|
|
268
|
+
}
|
|
269
|
+
else if (announce) {
|
|
270
|
+
page.__wgDesktopFlat = false;
|
|
271
|
+
}
|
|
272
|
+
// Swipe trail is for scrolling (see ensureLocatorInView), not device morph.
|
|
273
|
+
const nextOrient = d.orientation === "landscape" || d.orientation === "portrait"
|
|
274
|
+
? d.orientation
|
|
275
|
+
: target.height > target.width
|
|
276
|
+
? "portrait"
|
|
277
|
+
: "landscape";
|
|
278
|
+
page.__wgDeviceOrient = nextOrient;
|
|
279
|
+
page.__wgDevicePreset = toDesktop ? "desktop" : d.preset || "";
|
|
280
|
+
if (stage) {
|
|
281
|
+
// Lock the Playwright viewport to the stage size so frames/window fill it; center the device
|
|
282
|
+
// shell inside (OS window centering alone does not). Do NOT fitWindow to the device size -
|
|
283
|
+
// that shrinks the viewport below the stage and (when recording) pads the .webm with grey
|
|
284
|
+
// (top-left bias). Headed-without-video reuses this exact technique (see `stage`'s own
|
|
285
|
+
// comment above) - the real OS window is only ever resized once, right here, to establish the
|
|
286
|
+
// stage itself; every device switch after that paints the animated shell inside it instead.
|
|
287
|
+
if (!videoStage && establishingHeadedStage) {
|
|
288
|
+
await fitWindowToDeviceViewport(page, stage, { maximize: false }).catch(ignorePageGone);
|
|
289
|
+
}
|
|
290
|
+
await realSet(stage).catch(ignorePageGone);
|
|
291
|
+
const shellFrom = page.__wgDeviceShell || target;
|
|
292
|
+
if (toDesktop) {
|
|
293
|
+
// Zoom already cleared above. Full-bleed desktop shell (no matte frame).
|
|
294
|
+
// Shutter-out: soft rounded -> radius 0, then flat edge-to-edge.
|
|
295
|
+
const desk = {
|
|
296
|
+
width: stage.width,
|
|
297
|
+
height: stage.height,
|
|
298
|
+
};
|
|
299
|
+
page.__wgDeviceShell = { ...desk };
|
|
300
|
+
await applyVideoDeviceStage(page, desk, stage, {
|
|
301
|
+
clear: false,
|
|
302
|
+
shutterOut: true,
|
|
303
|
+
desktopFlat: true,
|
|
304
|
+
});
|
|
305
|
+
await realSet(stage).catch(ignorePageGone);
|
|
306
|
+
}
|
|
307
|
+
else {
|
|
308
|
+
// Lerp shell size when switching mobile <-> tablet mid-run.
|
|
309
|
+
const firstDevice = !page.__wgDeviceShell;
|
|
310
|
+
if (announce &&
|
|
311
|
+
shellFrom &&
|
|
312
|
+
(shellFrom.width !== target.width || shellFrom.height !== target.height)) {
|
|
313
|
+
const steps = 14;
|
|
314
|
+
const ms = envNumber("WAYGRAPH_DEVICE_TRANSITION_MS") ?? 520;
|
|
315
|
+
const stepMs = Math.max(12, Math.floor(ms / steps));
|
|
316
|
+
for (let i = 1; i <= steps; i++) {
|
|
317
|
+
const t = i / steps;
|
|
318
|
+
const e = t * t * (3 - 2 * t);
|
|
319
|
+
const mid = {
|
|
320
|
+
width: Math.round(shellFrom.width + (target.width - shellFrom.width) * e),
|
|
321
|
+
height: Math.round(shellFrom.height + (target.height - shellFrom.height) * e),
|
|
322
|
+
};
|
|
323
|
+
await applyVideoDeviceStage(page, mid, stage, {
|
|
324
|
+
clear: false,
|
|
325
|
+
enterIn: i === 1 && firstDevice,
|
|
326
|
+
});
|
|
327
|
+
if (i < steps)
|
|
328
|
+
await new Promise((r) => setTimeout(r, stepMs));
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
else {
|
|
332
|
+
await applyVideoDeviceStage(page, target, stage, {
|
|
333
|
+
clear: false,
|
|
334
|
+
enterIn: firstDevice || announce,
|
|
335
|
+
});
|
|
336
|
+
}
|
|
337
|
+
page.__wgDeviceShell = { ...target };
|
|
338
|
+
// Re-assert stage size after any prior fitWindow.
|
|
339
|
+
await realSet(stage).catch(ignorePageGone);
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
else {
|
|
343
|
+
// Unmaximize + center early so the lerp does not sit in the corner of a
|
|
344
|
+
// maximized frame. Desktop clear maximizes at the end instead.
|
|
345
|
+
if (!toDesktop) {
|
|
346
|
+
await fitWindowToDeviceViewport(page, from && from.width ? from : target, {
|
|
347
|
+
maximize: false,
|
|
348
|
+
});
|
|
349
|
+
}
|
|
350
|
+
try {
|
|
351
|
+
if (shouldAnimate) {
|
|
352
|
+
const steps = 14;
|
|
353
|
+
const ms = envNumber("WAYGRAPH_DEVICE_TRANSITION_MS") ?? 520;
|
|
354
|
+
const stepMs = Math.max(12, Math.floor(ms / steps));
|
|
355
|
+
for (let i = 1; i <= steps; i++) {
|
|
356
|
+
const t = i / steps;
|
|
357
|
+
const e = t * t * (3 - 2 * t); // smoothstep
|
|
358
|
+
const mid = {
|
|
359
|
+
width: Math.round(from.width + (target.width - from.width) * e),
|
|
360
|
+
height: Math.round(from.height + (target.height - from.height) * e),
|
|
361
|
+
};
|
|
362
|
+
await realSet(mid);
|
|
363
|
+
if (!toDesktop && (i === 1 || i === steps || i % 3 === 0)) {
|
|
364
|
+
await fitWindowToDeviceViewport(page, mid, { maximize: false });
|
|
365
|
+
}
|
|
366
|
+
if (i < steps)
|
|
367
|
+
await new Promise((r) => setTimeout(r, stepMs));
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
else {
|
|
371
|
+
await realSet(target);
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
catch {
|
|
375
|
+
/* maximized / null viewport hosts may reject - toast still updates */
|
|
376
|
+
}
|
|
377
|
+
if (toDesktop) {
|
|
378
|
+
await fitWindowToDeviceViewport(page, target, { maximize: true });
|
|
379
|
+
}
|
|
380
|
+
else {
|
|
381
|
+
await fitWindowToDeviceViewport(page, target, { maximize: false });
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
// Fire toast near the end of the lerp so it reads as one seamless beat.
|
|
385
|
+
await page
|
|
386
|
+
.evaluate((payload) => {
|
|
387
|
+
if (window.__wgSyncDevice)
|
|
388
|
+
window.__wgSyncDevice(payload);
|
|
389
|
+
}, {
|
|
390
|
+
sync: mode,
|
|
391
|
+
device: d,
|
|
392
|
+
remain: mode === "keep" || mode === "set",
|
|
393
|
+
announce,
|
|
394
|
+
})
|
|
395
|
+
.catch(ignorePageGone);
|
|
396
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function installBanner({ title, favicon, bannerPos, todoPos, envAutoplay, todoDockUi, bannerUi, tag: bannerTag }: any): void;
|