{
  "name": "Ghostly Fade",
  "dimension": "text",
  "slot": "action_bar",
  "width": 256,
  "height": 128,
  "textBaseline": 128,
  "placement": {
    "x": 0,
    "y": 0
  },
  "shapes": [],
  "texts": [],
  "heads": [],
  "images": [],
  "bars": [],
  "triggers": [],
  "effect": {
    "glsl": "vec2 spiritDrift(float t, vec2 o) {\n    float phase = o.x * 0.12 + o.y * 0.07;\n    return vec2(0.48 * sin(t * 1.05 - phase), 0.85 * sin(t * 1.25 - phase));\n}\nvec4 effect(Fx f) {\n    vec2 drift = spiritDrift(f.t, f.o);\n    vec2 src = f.p - drift;\n    float breath = 0.5 + 0.5 * sin(f.t * 1.0 + 0.55);\n    float opacity = mix(0.48, 0.95, breath);\n    float a = G(src);\n    vec3 pale = mix(vec3(0.65, 0.82, 0.88), vec3(0.91, 0.99, 1.0), breath);\n    pale = mix(pale, vec3(0.57, 0.72, 0.84), clamp(f.q.y / 8.0, 0.0, 1.0) * 0.18);\n    vec4 col = vec4(0.0);\n    for (int i = 3; i >= 1; i--) {\n        float fi = float(i);\n        vec2 old = spiritDrift(f.t - fi * 0.45, f.o) + vec2(-0.30 * fi, -0.33 * fi);\n        col = over(vec4(0.58, 0.78, 0.86, G(f.p - old) * (0.075 - fi * 0.014) * opacity), col);\n    }\n    float halo = N8(src) * (1.0 - a);\n    col = over(vec4(0.61, 0.82, 0.91, halo * (0.035 + breath * 0.035)), col);\n    col = over(vec4(0.035, 0.075, 0.12, G(src - 1.0) * (1.0 - a) * (0.42 + breath * 0.25)), col);\n    return over(vec4(pale, a * opacity), col);\n}",
    "pad": [
      2,
      2,
      2,
      2
    ],
    "prompt": "ghostly pale text that slowly fades in and out and drifts gently like a spirit",
    "sample": "Pale Spirit"
  }
}