{ "id": "gsap-7384c5a6ea78", "sourceId": "gsap", "title": "curveMode", "sourceUrl": "https://demos.gsap.com/demo/curvemode", "demoUrl": "https://codepen.io/GreenSock/pen/zxvRmrY", "sourceStatus": "unresolved", "sourceReason": "Public page unavailable through web browsing", "sourceRevision": null, "sourceLicense": null, "originalDemoAcquired": false, "disposition": "ready_for_independent_study", "evidenceBasis": "catalog_linked_api", "studyId": "gsap-7384c5a6ea78", "sharedStudyCanonicalId": null, "label": "Independently authored documentation study; original Pen unavailable", "catalogEvidence": { "localPath": "artifacts/full-import/gsap/remaining-docs/catalog-evidence.json", "sha256": "4f2a4f9aa64456b85b905b562b60d7733629b41026787b3057cba29e8b10de69", "bytes": 30117, "recordId": "gsap-7384c5a6ea78" }, "sourceInputs": [ { "kind": "authored-study-specification", "localPath": "artifacts/full-import/gsap/remaining-docs/study-specs.json", "sha256": "cbb89331eda8783b5cf2f173b326b9195eeabfb223374fb60019161d9f46d4a6", "bytes": 52279, "recordId": "gsap-7384c5a6ea78" }, { "kind": "official-catalog-metadata", "localPath": "artifacts/full-import/gsap/remaining-docs/catalog-evidence.json", "sha256": "4f2a4f9aa64456b85b905b562b60d7733629b41026787b3057cba29e8b10de69", "bytes": 30117, "recordId": "gsap-7384c5a6ea78" }, { "kind": "official-documentation-evidence", "localPath": "artifacts/full-import/gsap/remaining-docs/official-documentation-evidence.json", "sha256": "bfa25f561e61c597569cf1bc0b3538e6dce4b9985a932775ceab41e665ca24a2", "bytes": 11430, "recordIds": [ "morph", "tween" ] }, { "kind": "original-library-source", "localPath": "artifacts/full-import/gsap/library/src/gsap-core.js", "sha256": "8063816e0e7c3e6c07970fb06feafb06146fd266db5d8346419176b3d496e284", "gitBlob": "c673b9e2e0ee04832afb13cb892ae75f503e268c", "revision": "13e2b790546426a1a2e0e9b409f3f8dc6d6611f2", "sourcePath": "src/gsap-core.js", "ranges": [ { "id": "direction-controls", "startLine": 1354, "endLine": 1391, "rangeSha256": "8e2f36127b2fc568686d2d934ad3b74a21274c78bf1045d210e376260598819f" }, { "id": "tween-factories", "startLine": 2637, "endLine": 2657, "rangeSha256": "23ae9d51865c9b7966bbc3b6cdbdb560fc790ff19e3b8bb524a3493fbf60c58a" } ] }, { "kind": "original-library-source", "localPath": "artifacts/full-import/gsap/library/src/MorphSVGPlugin.js", "sha256": "ed1a050ea542e5f7918b079f1a9d7094baa7ca2eef4a03c9700fc975f330859b", "gitBlob": "16ca88dddb9dca68d6823e903e87685e031c6a39", "revision": "13e2b790546426a1a2e0e9b409f3f8dc6d6611f2", "sourcePath": "src/MorphSVGPlugin.js", "ranges": [ { "id": "morph-curve-mode", "startLine": 693, "endLine": 745, "rangeSha256": "62266909dc6cdfb31d563639247d86f7d5cf67336d146bb1843eb01950fab4c7" } ] } ], "studiedPrinciple": "Compare coordinate interpolation with curveMode control-handle angle/length interpolation on the same authored path pair.", "namedApis": [ { "name": "gsap.to(path, {morphSVG: {shape, curveMode}})", "purpose": "Use false and true in parallel controlled morphs.", "libraryEvidence": [ "morph-curve-mode", "tween-factories" ], "documentationEvidence": [ "morph" ], "minimumVersion": "3.14.0" }, { "name": "tween.pause(), tween.play(), tween.reverse()", "purpose": "Control both comparison tweens together.", "libraryEvidence": [ "direction-controls" ], "documentationEvidence": [ "tween" ] } ], "implementationBrief": { "scene": "Two equally sized SVG viewports containing identical copies of a newly drawn smooth cubic outline. Each morphs to the same second outline with changed tangent angles and handle lengths; only curveMode differs.", "controls": [ { "label": "Play comparison", "type": "button", "action": "Restart both comparisons from their source path with the same timing." }, { "label": "Progress", "type": "range", "action": "Pause both and set an identical normalized progress from zero to one." }, { "label": "Reverse", "type": "button", "action": "Reverse both existing comparison tweens from the current playhead." }, { "label": "Reset", "type": "button", "action": "Restore the original authored d strings and rebuild both tweens." } ], "mechanismSteps": [ "Define two compatible closed paths with several smooth cubic anchors and nonzero handles. Reuse exactly the same source and endpoint strings in both panels.", "Construct paused tweens with morphSVG:{shape:endPath,curveMode:false} on the left and curveMode:true on the right; use the same duration and ease.", "Synchronize progress and direction. When replaying, restore source d explicitly so the prior endpoint is not recaptured as a new start.", "Explain that true changes how control handles interpolate; the comparison makes no universal better/worse claim.", "If the chosen geometry produces little visible difference, retain that honest result or revise the independently authored path pair and record the change; do not fabricate a difference in the label." ] }, "authoredDefaults": { "durationSeconds": 1.6, "ease": "none", "initialProgress": 0, "viewBox": "0 0 240 240", "pathArt": "Two new closed outlines with six smooth cubic anchors" }, "verificationRequired": [ "Both panels use identical start/end path strings and differ only in curveMode.", "At progress 0 and 1 the supplied endpoints are recognizable; intermediate d values change and remain finite.", "Reverse and direct progress jumps work without recreating tweens on every toggle.", "Static view shows labeled source and destination outlines; no animation is required to understand the study." ], "unsupportedClaims": [ "Original composition, assets, timing, breakpoint behavior, and live interaction are not observable in captured frames. This brief does not establish visual fidelity or recover original code.", "curveMode is not guaranteed to improve every path pair; closely spaced anchors or different geometry may look worse.", "No original path art, exact easing, or comparison controls were recovered." ], "dependencies": { "package": "gsap", "version": "3.15.0", "revision": "13e2b790546426a1a2e0e9b409f3f8dc6d6611f2", "repository": "https://github.com/greensock/GSAP", "plugins": [ "MorphSVGPlugin" ], "registration": "gsap.registerPlugin(MorphSVGPlugin) after loading core and those plugin scripts", "runtimeCandidates": [ { "path": "dist/gsap.js", "localPath": "artifacts/full-import/gsap/library/dist/gsap.js", "gitBlob": "ec5ffee3f099bc454f2f1c79cee6a55ba97e7400", "sha256": "01effe0e121c22ba0f885a3f091f3dc6d1f0d445c4fba37dcb298e314eca5cfb", "bytes": 179557 }, { "path": "dist/MorphSVGPlugin.js", "localPath": "artifacts/full-import/gsap/library/dist/MorphSVGPlugin.js", "gitBlob": "40531f708058713a7ad2942b74d0e1442c31431c", "sha256": "786b51ffe878fa747bb7e115815d438ec9113bde1303967172c34b129f5472ef", "bytes": 55989 } ], "license": { "name": "GSAP Standard 'No Charge' License (custom, not MIT)", "localPath": "artifacts/full-import/gsap/licenses/gsap-standard-license.html", "sha256": "bf8536e67b77db780f7db0c14a645f184f554bb19e938d1e52d58986e2f10528", "bytes": 6988, "url": "https://gsap.com/community/standard-license/" }, "originalDependencyVersionKnown": false }, "runtimeVerified": false, "implementationWritten": false }