CrossStrokeField

← prev index next →

Fades a stroke across the ribbon's width — the field for a soft inner core fading toward the edges, or (edge-anchored) an outer rim fading inward.

Remarks

This is the across-the-width member of the StrokeField family: like every field it turns where into how much — a scalar weight consumers read by #id (field="#id") — but a stroke field is defined only along a stroke, weighting each point by its stroke coordinate rather than its position in space (see the general SpatialField concept for position-based fields). Here the weight depends on the perpendicular cross-stroke distance: with the default center-line anchor it is full at the centre and fades toward the edges (a core); with anchor="edge" it is full at the edges and fades inward (a rim).

Key attributes. threshold sets how far out the full-weight core extends — it is a radius from the centreline, so the full core is twice as wide — and softness sets how gradually the weight fades past that: the smoothstep transition runs from threshold - softness to threshold + softness (half the full transition span on each side). By default both are fractions of the local half-width (threshold-space="fraction" / softness-space="fraction"), so on a variable-width stroke the core's absolute thickness tracks the local width. threshold-space and softness-space switch either value independently to an absolute unit: screen measures it in screen pixels and world in world units, both FIXED regardless of the local width — e.g. threshold-space="world" softness-space="screen" holds a constant world-unit core with a crisp fixed-pixel falloff. anchor picks which side the distance is measured from: center-line (the default) grows the full-weight region outward from the centreline (a core), while edge measures inward from the stroke edge, so anchor="edge" threshold-space="screen" threshold="8" holds a constant 8-pixel outer rim on any variable-width stroke. Neither value is clamped: a threshold at or past the stroke edge with nonzero softness still shows the partial falloff that starts inside the edge. Absolute spaces apply during GPU rendering; the CPU-side evaluate() treats the values as fractions (the anchor applies on both). A cap-field-mode option further chooses how the field behaves in the stroke's end caps. Because a stroke field returns zero off-stroke, it is meaningful only through a stroke's tonemap, not on a surface.

Related. Sibling stroke fields shape weight along the length instead of across it: sk-progress-stroke-field ramps from start to end, and sk-dash-array-stroke-field makes a repeating dash pattern. The usual consumer is a sk-tonemap applied through a sk-stroke-paint. threshold-space/softness-space mirror how sk-stroke-paint's width-space makes the stroke width itself screen- or world-absolute.

Constructor

constructor(config?: { threshold?: number; softness?: number; capFieldMode?: CapFieldMode; thresholdSpace?: FieldSpace; softnessSpace?: FieldSpace; anchor?: FieldAnchor })

Properties

Config Properties

PropertyTypeDefaultDescriptionDeclared by
thresholdanimatable number — Cross-position threshold — controls where along the stroke cross-axis the weight switches. CrossStrokeField
softnessanimatable number — Edge softness — how gradually the weight transitions at the boundary (0 = hard). CrossStrokeField
capFieldModeanimatable CapFieldMode — How the field gradient behaves in stroke cap regions. CrossStrokeField
thresholdSpaceanimatable FieldSpace — The unit space threshold is expressed in. CrossStrokeField
softnessSpaceanimatable FieldSpace — The unit space softness is expressed in. CrossStrokeField
anchoranimatable FieldAnchor — Where the cross distance is measured from. CrossStrokeField

Other Properties

PropertyTypeDefaultDescriptionDeclared by
thresholdBasebase value number — The base (non-animated) value of threshold. CrossStrokeField
softnessBasebase value number — The base (non-animated) value of softness. CrossStrokeField
thresholdSpaceBasebase value FieldSpace — The base (non-animated) value of thresholdSpace. CrossStrokeField
softnessSpaceBasebase value FieldSpace — The base (non-animated) value of softnessSpace. CrossStrokeField
anchorBasebase value FieldAnchor — The base (non-animated) value of anchor. CrossStrokeField
remapCurve SampledCurve | null — Optional curve that reshapes this field's raw [0, 1] output. StrokeField
remapPhase number 0 Horizontal remap phase — an animatable scalar that translates a present StrokeField
enabled boolean true Whether this field is enabled. When disabled, evaluate() returns 0. StrokeField
sceneread-only any — Gets the Scene this animatable belongs to, if any. SkenraAnimatable
animationsread-only SkenraAnimation[] — Public getter for the animations affecting this target. SkenraAnimatable

Methods

MethodDescriptionDeclared by
animate(firstArg: TypedKeyframe<this>[] | TypedPropertyIndexedKeyframes<this> | Record<string, any> | globalThis.Keyframe[] | globalThis.PropertyIndexedKeyframes | null, secondArg?: number | KeyframeAnimationOptions | globalThis.KeyframeAnimationOptions): SkenraAnimation & Animation Creates a new SkenraAnimation for this target per Web Animations API. SkenraAnimatable
removeAnimation(animation: SkenraAnimation): boolean Removes a specific animation from this object. SkenraAnimatable
constrain(type: K, config: ConstraintConfigMap[K]): ConstraintReturnMap[K] Creates a constraint on this Animatable using a fluent API. SkenraAnimatable

Example

const field = new CrossStrokeField({ threshold: 0.5, softness: 0.1 });

// At center: weight = 1
field.evaluate([0, 0, 0], [0, 0]);

// At edge: weight = 0
field.evaluate([0, 0, 0], [0, 1]);