From 6ed3d210fb04662fdcd02c7fe10dab66cd6b71da Mon Sep 17 00:00:00 2001 From: Nigel Ihza Firdausy <106657905+Ni-zav@users.noreply.github.com> Date: Sat, 10 Oct 2026 15:50:18 +0700 Subject: [PATCH] fix(expr): reflect pending TextStyle baseline edits in expression getters (#545) --- crates/expr/src/prelude.js | 6 ++++-- crates/expr/src/tests.rs | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+), 2 deletions(-) diff --git a/crates/expr/src/prelude.js b/crates/expr/src/prelude.js index aa202539..5756365a 100644 --- a/crates/expr/src/prelude.js +++ b/crates/expr/src/prelude.js @@ -932,8 +932,10 @@ __TextStyle.prototype = { setVerticalScaling: __styleSetter('vScale'), setTsume: __styleSetter('tsume'), setBaselineOption: __styleSetter('baseline', function (v) { return String(v).toLowerCase().replace('_baseline', ''); }), - setSuperscript: __styleSetter('superscript', Boolean), - setSubscript: __styleSetter('subscript', Boolean), + // Canonical baseline operations also make the returned TextStyle's getters reflect + // the pending edit, rather than waiting for the host to apply a superscript flag. + setSuperscript: __styleSetter('baseline', function (v) { return v ? 'superscript' : 'normal'; }), + setSubscript: __styleSetter('baseline', function (v) { return v ? 'subscript' : 'normal'; }), setKerningType: __styleSetter('kerning', function (v) { v = String(v).toLowerCase(); return v === 'manual' ? 0 : v; }), setKerning: __styleSetter('kerning', Number), setLigature: __styleSetter('ligatures', Boolean), diff --git a/crates/expr/src/tests.rs b/crates/expr/src/tests.rs index 4c638205..dc1a17be 100644 --- a/crates/expr/src/tests.rs +++ b/crates/expr/src/tests.rs @@ -1160,3 +1160,36 @@ fn thousands_of_host_reads_on_one_thread_keep_working() { assert_eq!(f.num("function a() { return effect(1)(1); } function b() { return a(); } b() + 1", t), 43.0, "evaluation {i}"); } } + +#[test] +fn pending_text_style_baseline_setters_are_visible_to_expression_getters() { + let x = fx(); + assert_eq!( + x.num("thisComp.layer('Title').text.sourceText.style.setSuperscript(true).isSuperscript ? 1 : 0", 0.0), + 1.0 + ); + assert_eq!( + x.num("thisComp.layer('Title').text.sourceText.style.setSubscript(true).isSubscript ? 1 : 0", 0.0), + 1.0 + ); + assert_eq!( + x.num("thisComp.layer('Title').text.sourceText.style.setSuperscript(true).setSubscript(true).isSuperscript ? 1 : 0", 0.0), + 0.0 + ); + assert_eq!( + x.num("thisComp.layer('Title').text.sourceText.style.setSuperscript(true).setSubscript(true).isSubscript ? 1 : 0", 0.0), + 1.0 + ); + assert_eq!( + x.num("thisComp.layer('Title').text.sourceText.style.setSubscript(true).setSubscript(false).isSubscript ? 1 : 0", 0.0), + 0.0 + ); + assert_eq!( + x.num("thisComp.layer('Title').text.sourceText.style.setBaselineOption('superscript').isSuperscript ? 1 : 0", 0.0), + 1.0 + ); + assert_eq!( + x.text("var s = text.sourceText.style.setSuperscript(true); s.setText(s.isSuperscript ? 'super' : 'normal')", 0.0), + "super" + ); +}