Editors' picks
PINE LIBRARY
Updated

Motion

3 074
▮ FEATURES
  • Now as library version :)
  • String-based transition-effects
  • Performance optimization. Reduced memory consumption up to >90% by kicking the output to the "stdout".
  • Use marquee- or loader-effect on any possible string location.


Example: UI Price-Ticker
[CLX][#01] Animation - Price Ticker (Marquee)


----------------------------------------------------------------------------

Library "Motion"

_getStringMono(_len, _str, _sep)
  Parameters:
    _len
    _str
    _sep

marquee(this, _extern, _ws, _subLen, _subStart)
  Parameters:
    this
    _extern
    _ws
    _subLen
    _subStart

transition(this, _subLen, _subStart)
  Parameters:
    this
    _subLen
    _subStart

hold(this)
  Parameters:
    this

keyframe
  keyframe A keyframe object.
  Fields:
    seq
    intv
    step
    length
    update_no
    frame_no
    ltr
    hold
Release Notes
▮ v2
  • Bug fix: Removed "typo" in str.format().
  • Bug fix: Removed "out of bounds" on string length change.
  • Updated: User inputs.
  • New: Changelog.


👀 STILL UNDER DEVELOPMENT! Frequently updated!

Added:
nz(_src, _replacement)
  Parameters:
    _src
    _replacement

Updated:
keyframe
  keyframe A keyframe object.
  Fields:
    seq
    intv
    step
    length
    update_no
    frame_no
    pointer
    ltr
    hold
Release Notes
v3
  • Bug fix: The `_ws` whitespace parameter in the marquee function should now working like expected. Thx to HeWhoMustNotBeNamed
Release Notes
v4
▮ v4
  • Removed unnecessary exports


    • Removed:
      nz(_src, _replacement)

      _getStringMono(_len, _str, _sep)
Release Notes
v5
Release Notes
v6

Added:
start(this)
  Parameters:
    this

stop(this)
  Parameters:
    this

toggle(this)
  Parameters:
    this

reset(this)
  Parameters:
    this

reverse(this)
  Parameters:
    this

transition
  transition A transition object.
  Fields:
    fx
    max_loops
    sub_start
    sub_length
    refill
    external_seq
    type
    dir
    side

Updated:
transition(this, _fx, _maxLoops, _subLen, _subStart, _ltr, _autoplay, _refill, _series)
  Parameters:
    this
    _fx
    _maxLoops
    _subLen
    _subStart
    _ltr
    _autoplay
    _refill
    _series

keyframe
  keyframe A keyframe object.
  Fields:
    seq
    ws
    intv
    step
    update_no
    frame_no
    loop_no
    length
    pointer
    ltr
    __transition
    execution
    setup

Removed:
marquee(this, _extern, _ws, _subLen, _subStart)

hold(this)
Release Notes
v7
Release Notes
v8

Updated:
keyframe
  keyframe A keyframe object.
  Fields:
    seq
    ws
    intv
    step
    fx
    max_loops
    sub_start
    sub_length
    refill
    ltr
    external_seq
    type
    dir
    side
    update_no
    frame_no
    loop_no
    length
    pointer
    execution
    setup

Removed:
transition
  transition A transition object.

Bug Fixes:
-- LTR & Placeholder feature should now working like expected.
Release Notes
▮ v9 Major Upgrade

This update is a major upgrade to the library. The library now uses a more object-oriented approach, while the exported functions are now more user-friendly. Additional string effects are added.

Updated:
transition()
keyframe

New Secondary Functions:
prev(this, _skip)
next(this, _skip)

New Simplified Functions:
marquee(this, _seq, _ws, _maxLoops, _ltr)
slideInLeft(this, _seq, _ws, _maxLoops, _refill)
slideOutLeft(this, _seq, _ws, _maxLoops, _refill)
slideInRight(this, _seq, _ws, _maxLoops, _refill)
slideOutRight(this, _seq, _ws, _maxLoops, _refill)
blink(this, _seq, _ws, _maxLoops)

Also refactored most of the utility functions.

================================================================================

▮ Setup

To use this library in your scripts, you must first import it. To do this, add the following line to the top of your script:

Pine Script®
import cryptolinx/Motion/1 as motion


Next, create a `keyframe` object by using the `varip` keyword.

Pine Script®
varip myKeyframe = motion.keyframe.new(_intv = 1, _steps = 1,)


Based on your needs, you can now use one of the simplified functions to create a transition effect, or you can use the `transition()` or `iteration()` function to create a custom transition effect.

Simplified Functions:

(direct output)

Pine Script®
// motion.marquee(keyframe myKeyframe, string _seq, int _ws, int _maxLoops, bool _ltr) motion.marquee(myKeyframe, 'Hello World!', 3, 0) // 0 = infinite loops // motion.slideInLeft(keyframe myKeyframe, string _seq, int _ws, int _maxLoops, bool _refill) motion.slideInLeft(myKeyframe, 'Hello World!', 3, 0) // 0 = infinite loops // motion.slideOutLeft(keyframe myKeyframe, string _seq, int _ws, int _maxLoops, bool _refill) motion.slideOutLeft(myKeyframe, 'Hello World!', 3, 0) // 0 = infinite loops // motion.slideInRight(keyframe myKeyframe, string _seq, int _ws, int _maxLoops, bool _refill) motion.slideInRight(myKeyframe, 'Hello World!', 3, 0) // 0 = infinite loops // motion.slideOutRight(keyframe myKeyframe, string _seq, int _ws, int _maxLoops, bool _refill) motion.slideOutRight(myKeyframe, 'Hello World!', 3, 0) // 0 = infinite loops // motion.blink(keyframe myKeyframe, string _seq, int _ws, int _maxLoops) motion.blink(myKeyframe, 'Hello World!', 3, 0) // 0 = infinite loops


(indirect output)

Pine Script®
// After you create a transition, you can use the output field of the `keyframe` object to output the result // motion.marquee(myKeyframe, 'Hello World!', 3, 0) myKeyframe.output


Note: The transition() function doesn't store anything at the output field, to not overload the object with unnecessary long varip string data.

Example advanced transition() usage:
[CLX][#01] Animation - Price Ticker (Marquee)


================================================================================

Here are some numbers about the update frequency:
snapshot
Release Notes
v10

- code improvements
- bug fixes
- new fx
Release Notes
🚀 v11

- new motion color_gradient() fx
- new fadeIn/Out() fx
- added missing simplified blend-effects

📑 ADDED
color_gradient(this, _color_from, _color_to, _transp_from, _transp_to, _steps, _maxLoops, _resetOnEveryBar, _autoplay, _cycle, _timerType, _timerMu, _timerStart, _timerMode)
// --
fadeIn(this, _color_from, _color_to, _steps, _transp_from, _transp_to, _maxLoops, _timerType)
fadeOut(this, _color_from, _color_to, _steps, _transp_from, _transp_to, _maxLoops, _timerType)
// --
blendInLeft(this, _seq, _ws, _maxLoops, _refill, _timerType)
blendOutLeft(this, _seq, _ws, _maxLoops, _refill, _timerType)
blendInRight(this, _seq, _ws, _maxLoops, _refill, _timerType)
blendOutRight(this, _seq, _ws, _maxLoops, _refill, _timerType)


📑 UPDATED:
marquee(this, _seq, _ws, _maxLoops, _ltr, _timerType)
// --
blink(this, _seq, _ws, _maxLoops, _timerType)
// --
slideInLeft(this, _seq, _ws, _maxLoops, _refill, _timerType)
slideOutLeft(this, _seq, _ws, _maxLoops, _refill, _timerType)
slideInRight(this, _seq, _ws, _maxLoops, _refill, _timerType)
slideOutRight(this, _seq, _ws, _maxLoops, _refill, _timerType)
Release Notes
🎬 Motion Library - Dynamic Transitions & Animations for Pine Script™

📢 ABOUT

Motion is a powerful animation library designed to bring your Pine Script™ charts to life. Generate smooth transition effects for strings, colors, and positions with per-tick updates. Whether you need scrolling marquees, color gradients, or dynamic label movements — Motion delivers with user-friendly APIs and optimal performance.

FEATURES

🎯 Content FX (Text Effects)
• [c]marquee[/c] — Scrolling text effect (like HTML marquee)
• [c]spot[/c] — Spotlight effect highlighting portions of text
• [c]blink[/c] — Flashing/blinking text visibility toggle
• [c]slide_in_left[/c] / [c]slide_in_right[/c] — Text slides in from sides
• [c]slide_out_left[/c] / [c]slide_out_right[/c] — Text slides out to sides
• [c]blend_in_left[/c] / [c]blend_in_right[/c] — Fade in from sides
• [c]blend_out_left[/c] / [c]blend_out_right[/c] — Fade out to sides
• [c]show[/c] / [c]hide[/c] — Simple visibility control

🎨 Style FX (Color Effects)
• [c]gradient()[/c] — Smooth color transitions between any colors
• [c]fade()[/c] — Fade colors in/out with transparency control
• [c]fade_in()[/c] / [c]fade_out()[/c] — Simplified fade helpers

📍 Position FX (Movement Effects)
• [c]movement()[/c] — Move labels/lines along custom paths
• [c]move()[/c] — Simplified position manipulation

📊 Easing Functions
• [c]linear[/c] — Constant speed
• [c]ease[/c] — Smooth acceleration/deceleration
• [c]ease_in[/c] — Slow start, fast end
• [c]ease_out[/c] — Fast start, slow end
• [c]progressive[/c] — Accelerating progression
• [c]exponential[/c] — Exponential growth curve
• [c]fibonacci[/c] — Based on fibonacci sequence ratios

🔧 TWO WAYS TO USE

🅿️ Primitive Method (Frameworkless)
Ultra-lightweight, zero overhead for simple needs:
Pine Script®
import cryptolinx/Motion/VERSION as m // Simple marquee with one line! string text = "Hello World!".motion() // Or with arrays array<string> items = array.from("A", "B", "C") string current = items.motion()


🔷 Framework Method (Full Control)
Complete animation framework with keyframes, transitions, timers:
Pine Script®
import cryptolinx/Motion/VERSION as m // Define keyframe with custom timing var kf = m.keyframe.new(intv = 3, steps = 1) // Apply transition effect string animated = kf.transition( _seq = "Hello World!", _fx = "marquee", __opt = m.option.new(reverse = true, bounce = true) )


💡 EXAMPLES

🔄 Marquee Effect
Pine Script®
var kf = m.keyframe.new(intv = 2) string scrolling = kf.transition( _seq = "Breaking News: Markets Rally!", _fx = "marquee", __opt = m.option.new(ws = 5) ) label.new(bar_index, high, scrolling, style = label.style_label_down)


🌈 Rainbow Gradient
Pine Script®
var kf = m.keyframe.new() color rainbow = array.from( color.red, color.orange, color.yellow, color.green, color.blue, color.purple ).fade(_steps = 8) label.new(bar_index, close, "✨", textcolor = rainbow)


💫 Slide In Animation
Pine Script®
var kf = m.keyframe.new(intv = 1) string animated = kf.transition( _seq = "ALERT!", _fx = "slide_in_right", __opt = m.option.new(max_loops = 1, prefix = "⚠️ ", suffix = " ⚠️") )


🔢 Iteration Effect (Cycling Values)
Pine Script®
var kf = m.keyframe.new(intv = 5) string countdown = kf.iteration( _seqArr = array.from("3", "2", "1", "GO!"), __opt = m.option.new(prefix = "[ ", suffix = " ]") )


📍 Label Movement
Pine Script®
var label myLabel = label.new(bar_index, close, "Moving!") var kf = m.keyframe.new() // Define path: x:y offsets separated by > kf.move(myLabel, "5:0>0:-5>-5:0>0:5", _yHeight = high - low)


🎭 Multi-Transition Chaining
Pine Script®
var kf = m.keyframe.new() // Chain multiple effects on one keyframe kf.transition(_seq = "Hello", _fx = "blink", __opt = m.option.new(max_loops = 3)) string final = kf.transition(_seq = "Hello World!", _fx = "marquee")


📊 OBJECT TYPES

keyframe — Main animation controller
• [c]intv[/c] — Interval between updates (Δt)
• [c]steps[/c] — Updates per execution
• [c]exec[/c] — Start/stop control
• [c]offset[/c] — Timeline offset

transition — Effect configuration
• [c]fx[/c] — Effect type (marquee, blink, slide, etc.)
• [c]action[/c], [c]dir[/c], [c]side[/c] — Parsed effect properties

option — Customization settings
• [c]max_loops[/c] — Loop count (0 = infinite)
• [c]reverse[/c] / [c]bounce[/c] — Direction control
• [c]prefix[/c] / [c]suffix[/c] — Text additions
• [c]sub_start[/c] / [c]sub_length[/c] — Subsequence slicing
• [c]easing[/c] — Easing function type

timer — Timing control
• [c]frequency[/c] — on_tick, on_time, on_index, on_input
• [c]start_on[/c] — now, on_open, on_close
• [c]mu[/c] — Time unit fineness

FREQUENCY MODES

• [c]on_tick[/c] — Update every price tick (smoothest)
• [c]on_time[/c] — Update based on real-world time
• [c]on_index[/c] — Update based on bar index
• [c]on_input[/c] — External control via [c]extern[/c] field

📛 METHOD BADGES

• 🅿️ [c]method-primitive[/c] → Zero-overhead, frameworkless
• 🔷 [c]method-primary[/c] → Core framework methods
• 🔶 [c]method-secondary[/c] → Simplified user-friendly wrappers
• 🔺 [c]method-library[/c] → Internal framework methods

🚀 WHY MOTION?

• 🎬 Dynamic Charts — Bring static labels to life with animations
• ⚡ Optimized — Fine-tuned for minimal memory usage
• 🔧 Flexible — From one-liners to complex multi-transition chains
• 📖 Documented — Comprehensive inline examples
• 🔗 Chainable — Compose effects together seamlessly
• 🎯 Per-Tick Updates — Smooth real-time animations

📋 COMPLETE METHOD REFERENCE

Primitive Methods
• [c]motion()[/c] — Basic string/array manipulation (+4 overloads)
• [c]run()[/c] — Generate oscillating series (+1 overload)
• [c]easing()[/c] — Apply easing curves (+1 overload)

Primary Methods
• [c]transition()[/c] — Text transition effects
• [c]iteration()[/c] — Value cycling/iteration
• [c]gradient()[/c] — Color gradient generation
• [c]movement()[/c] — Position path animation

Secondary Methods (Simplified)
• [c]fx()[/c] — Unified effect wrapper (+3 overloads)
• [c]iterate()[/c] — Simple iteration (+3 overloads)
• [c]fade()[/c] — Color fading (+4 overloads)
• [c]fade_in()[/c] / [c]fade_out()[/c] — Direction-specific fades (+4 overloads each)
• [c]move()[/c] — Position movement (+4 overloads)

Controller Methods
• [c]start()[/c] — Start animation execution
• [c]stop()[/c] — Stop animation
• [c]reset()[/c] — Reset to initial state

🎮 TIP: DEBUGGING

Enable the built-in console insights by creating a copy of the script:
Pine Script®
// In script settings: // Show Console - Insights = true // Shows: Keyframe state, pointer position, loop count, etc.

Disclaimer

The information and publications are not meant to be, and do not constitute, financial, investment, trading, or other types of advice or recommendations supplied or endorsed by TradingView. Read more in the Terms of Use.