{
  "name": "Slime Drip",
  "dimension": "text",
  "slot": "action_bar",
  "width": 256,
  "height": 128,
  "textBaseline": 128,
  "placement": {
    "x": 0,
    "y": 0
  },
  "shapes": [],
  "texts": [],
  "heads": [],
  "images": [],
  "bars": [],
  "triggers": [],
  "effect": {
    "glsl": "float oozeMask(vec2 q, float col, float root, float len, float phase, float wide) {\n    float live = step(0.0, root);\n    float stem = step(abs(q.x - col), 0.1) * step(root + 1.0, q.y) * step(q.y, root + len);\n    float tip = step(abs(q.y - root - len), 0.1) * step(abs(q.x - col - 0.5 * wide), 0.1 + 0.5 * wide);\n    tip *= step(0.30, phase) * (1.0 - step(0.78, phase));\n    float fall = clamp((phase - 0.78) / 0.22, 0.0, 1.0);\n    float dropY = root + 4.0 + floor(4.0 * fall * fall);\n    float drop = step(abs(q.x - col), 0.1) * step(abs(q.y - dropY), 0.1);\n    drop *= step(0.78, phase) * (1.0 - smoothstep(0.94, 1.0, phase));\n    return max(stem, max(tip, drop)) * live;\n}\nvec4 effect(Fx f) {\n    vec2 q = f.q;\n    float seed = h2(f.o + vec2(19.0, 7.0));\n    float col = floor((0.20 + seed * 0.65) * max(f.w, 1.0)) + 0.5;\n    float root = -1.0;\n    for (int j = 0; j < 8; j++) {\n        float y = float(j) + 0.5;\n        if (G(vec2(col, y)) > 0.5) root = y;\n    }\n    float phase = fract(f.t * 0.28 + seed);\n    float len = 1.0 + floor(3.0 * smoothstep(0.0, 0.70, phase));\n    if (phase >= 0.78) len = 1.0;\n    float wide = step(3.0, f.w) * step(0.45, phase);\n    float ink = G(q);\n    float slime = oozeMask(q, col, root, len, phase, wide);\n    float a = max(ink, slime);\n    float shadow = max(G(q - 1.0), oozeMask(q - 1.0, col, root, len, phase, wide));\n    float slimeSide = oozeMask(q - vec2(1.0, 0.0), col, root, len, phase, wide);\n    float flutter = 0.5 + 0.3 * sin(f.t * 6.2831853 + sin(f.t * 3.14159265)) + 0.2 * sin(f.t * 15.707963 + f.o.x * 0.19);\n    float sputter = pow(max(0.0, sin(f.t * 3.14159265 + seed * 6.2831853)), 18.0);\n    float light = 0.82 + 0.18 * flutter - 0.21 * sputter;\n    float grad = clamp((q.y - 1.0) / 7.0, 0.0, 1.0);\n    vec3 c = mix(vec3(0.64, 1.0, 0.10), vec3(0.19, 0.83, 0.025), grad);\n    float upper = 1.0 - G(q - vec2(0.0, 1.0));\n    c = mix(c, vec3(0.83, 1.0, 0.36), upper * 0.58);\n    float gloss = sin((f.o.x + q.x) * 0.43 - f.t * 1.5707963 + q.y * 0.55);\n    c = mix(c, vec3(0.89, 1.0, 0.52), smoothstep(0.91, 1.0, gloss) * 0.30);\n    if (ink < 0.5) {\n        c = vec3(0.24, 0.88, 0.035);\n        if (q.y >= root + len || phase >= 0.78) c = vec3(0.57, 1.0, 0.11);\n    }\n    c *= light;\n    float halo = N8(q);\n    vec4 back = vec4(0.24, 0.77, 0.025, halo * (0.12 + flutter * 0.10));\n    float rim = max(N4(q), slimeSide);\n    back = over(vec4(0.012, 0.045, 0.008, max(rim * 0.93, shadow)), back);\n    return over(vec4(c, a), back);\n}",
    "pad": [
      1,
      1,
      2,
      8
    ],
    "prompt": "spooky text that drips toxic green slime and flickers like a dying candle",
    "sample": "Toxic Whispers"
  }
}