From 3989f301541cf09f58765efd13924ffeeeca4ce3 Mon Sep 17 00:00:00 2001 From: Chris Lorenzo Date: Wed, 20 May 2026 23:07:56 -0400 Subject: [PATCH] refactor(core): dedupe shader-write tail and tighten elementNode exports MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Extract `_writeShaderTarget(target)` to share the rendered/pre-render/DOM self-assign tail that was duplicated between `set effects(v)` and `shaderAccessor`. The two copies were a real drift hazard since each carried the same `// eslint-disable-next-line no-self-assign` comment for the DOM-renderer style-refresh trick. - Replace the six consecutive `if (v.X) parseAndAssignShaderProps(...)` calls in `set effects(v)` with a loop over `EFFECT_SHADER_KEYS`. - Drop the `export` on `LightningRendererNumberProps` — it's only referenced one line below where it's declared. Co-Authored-By: Claude Opus 4.7 --- src/core/elementNode.ts | 65 +++++++++++++++++++++-------------------- 1 file changed, 34 insertions(+), 31 deletions(-) diff --git a/src/core/elementNode.ts b/src/core/elementNode.ts index 5cb57ad..2fbb6e0 100644 --- a/src/core/elementNode.ts +++ b/src/core/elementNode.ts @@ -168,6 +168,15 @@ function buildFontTemplate() { _fontTemplate = tpl; } +const EFFECT_SHADER_KEYS = [ + 'border', + 'borderTop', + 'borderRight', + 'borderBottom', + 'borderLeft', + 'shadow', +] as const satisfies ReadonlyArray; + const parseAndAssignShaderProps = ( prefix: string, obj: Record, @@ -215,7 +224,7 @@ function getPropertyAlias(name: string) { return name; } -export const LightningRendererNumberProps = [ +const LightningRendererNumberProps = [ 'alpha', 'color', 'colorTop', @@ -820,28 +829,16 @@ export class ElementNode { return this.lng.shader; } - set effects(v: StyleEffects) { - if (!SHADERS_ENABLED) return; - let target = this.lng.shader || {}; - if (this.lng.shader?.props) { - target = this.lng.shader.props; - } - if (v.rounded) target.radius = v.rounded.radius; - if (v.borderRadius) target.radius = v.borderRadius; - if (v.border) parseAndAssignShaderProps('border', v.border, target); - if (v.borderTop) - parseAndAssignShaderProps('borderTop', v.borderTop, target); - if (v.borderRight) - parseAndAssignShaderProps('borderRight', v.borderRight, target); - if (v.borderBottom) - parseAndAssignShaderProps('borderBottom', v.borderBottom, target); - if (v.borderLeft) - parseAndAssignShaderProps('borderLeft', v.borderLeft, target); - if (v.shadow) parseAndAssignShaderProps('shadow', v.shadow, target); - + /** + * Commit a built shader-props target back to `this.lng.shader`. When the + * node is already rendered we either convert the props into a real shader + * (first time) or self-assign so the DOM renderer's setter reapplies style; + * pre-render we just attach the bag for the upcoming `render()`. + */ + _writeShaderTarget(target: unknown) { if (this.rendered) { if (!this.lng.shader) { - this.lng.shader = Config.convertToShader(this, target); + this.lng.shader = Config.convertToShader(this, target as StyleEffects); } else if (isDomRendererActive()) { // eslint-disable-next-line no-self-assign -- lng.shader is a setter, force style update this.lng.shader = this.lng.shader; @@ -851,6 +848,21 @@ export class ElementNode { } } + set effects(v: StyleEffects) { + if (!SHADERS_ENABLED) return; + let target = this.lng.shader || {}; + if (this.lng.shader?.props) { + target = this.lng.shader.props; + } + if (v.rounded) target.radius = v.rounded.radius; + if (v.borderRadius) target.radius = v.borderRadius; + for (const k of EFFECT_SHADER_KEYS) { + if (v[k]) parseAndAssignShaderProps(k, v[k], target); + } + + this._writeShaderTarget(target); + } + set id(id: string) { this._id = id; if ( @@ -1796,16 +1808,7 @@ export function shaderAccessor | number>( parseAndAssignShaderProps(key, value, target); } - if (this.rendered) { - if (!this.lng.shader) { - this.lng.shader = Config.convertToShader(this, target); - } else if (isDomRendererActive()) { - // eslint-disable-next-line no-self-assign -- lng.shader is a setter, force style update - this.lng.shader = this.lng.shader; - } - } else { - this.lng.shader = target; - } + this._writeShaderTarget(target); if (animationSettings) { this.animate({ shaderProps: target }, animationSettings).start();