PageSourceSearch

https://cikian.github.io/libs/background/ribbon-dynamic.js

js cikian.github.io collected 2026-10-03 08:48:11 UTC 8,489 bytes, 165 lines download raw bytes

vendor: 7,170 bytes, lines 1-132
1"object" == typeof window && (window.Ribbons = function () {
2    var t = window,
3        i = document.body,
4        n = document.documentElement,
5        o = function () {
6            if (1 === arguments.length) {
7                if (Array.isArray(arguments[0])) {
8                    var t = Math.round(o(0, arguments[0].length - 1));
9                    return arguments[0][t]
10                }
11                return o(0, arguments[0])
12            }
13            return 2 === arguments.length ? Math.random() * (arguments[1] - arguments[0]) + arguments[0] : 0
14        },
15        s = function (o) {
16            var s = Math.max(0, t.innerWidth || n.clientWidth || i.clientWidth || 0),
17                h = Math.max(0, t.innerHeight || n.clientHeight || i.clientHeight || 0),
18                e = Math.max(0, t.pageXOffset || n.scrollLeft || i.scrollLeft || 0) - (n.clientLeft || 0),
19                a = Math.max(0, t.pageYOffset || n.scrollTop || i.scrollTop || 0) - (n.clientTop || 0);
20            return {
21                width: s,
22                height: h,
23                ratio: s / h,
24                centerx: s / 2,
25                centery: h / 2,
26                scrollx: e,
27                scrolly: a
28            }
29        },
30        h = function (t, i) {
31            this.x = 0, this.y = 0, this.set(t, i)
32        };
33    h.prototype = {
34        constructor: h,
35        set: function (t, i) {
36            this.x = t || 0, this.y = i || 0
37        },
38        copy: function (t) {
39            return this.x = t.x || 0, this.y = t.y || 0, this
40        },
41        multiply: function (t, i) {
42            return this.x *= t || 1, this.y *= i || 1, this
43        },
44        divide: function (t, i) {
45            return this.x /= t || 1, this.y /= i || 1, this
46        },
47        add: function (t, i) {
48            return this.x += t || 0, this.y += i || 0, this
49        },
50        subtract: function (t, i) {
51            return this.x -= t || 0, this.y -= i || 0, this
52        },
53        clampX: function (t, i) {
54            return this.x = Math.max(t, Math.min(this.x, i)), this
55        },
56        clampY: function (t, i) {
57            return this.y = Math.max(t, Math.min(this.y, i)), this
58        },
59        flipX: function () {
60            return this.x *= -1, this
61        },
62        flipY: function () {
63            return this.y *= -1, this
64        }
65    };
66    var e = function (t) {
67        this._canvas = null, this._context = null, this._sto = null, this._width = 0, this._height = 0, this._scroll = 0, this._ribbons = [], this._options = {
68            colorSaturation: "80%",
69            colorBrightness: "60%",
70            colorAlpha: .65,
71            colorCycleSpeed: 6,
72            verticalPosition: "center",
73            horizontalSpeed: 150,
74            ribbonCount: 5,
75            strokeSize: 5,
76            parallaxAmount: -.5,
77            animateSections: !0
78        }, this._onDraw = this._onDraw.bind(this), this._onResize = this._onResize.bind(this), this._onScroll = this._onScroll.bind(this), this.setOptions(t), this.init()
79    };
80    return e.prototype = {
81        constructor: e,
82        setOptions: function (t) {
83            if ("object" == typeof t)
84                for (var i in t) t.hasOwnProperty(i) && (this._options[i] = t[i])
85        },
86        init: function () {
87            try {
88                this._canvas = document.createElement("canvas"), this._canvas.style.display = "block", this._canvas.style.position = "fixed", this._canvas.style.margin = "0", this._canvas.style.padding = "0", this._canvas.style.border = "0", this._canvas.style.outline = "0", this._canvas.style.left = "0", this._canvas.style.top = "0", this._canvas.style.width = "100%", this._canvas.style.height = "100%", this._canvas.style["z-index"] = "-1", this._onResize(), this._context = this._canvas.getContext("2d"), this._context.clearRect(0, 0, this._width, this._height), this._context.globalAlpha = this._options.colorAlpha, window.addEventListener("resize", this._onResize), window.addEventListener("scroll", this._onScroll), document.body.appendChild(this._canvas)
89            } catch (t) {
90                return void console.warn("Canvas Context Error: " + t.toString())
91            }
92            this._onDraw()
93        },
94        addRibbon: function () {
95            var t = Math.round(o(1, 9)) > 5 ? "right" : "left",
96                i = 1e3,
97                n = this._width + 200,
98                s = 0,
99                e = 0,
100                a = "right" === t ? -200 : n,
101                r = Math.round(o(0, this._height));
102            /^(top|min)$/i.test(this._options.verticalPosition) ? r = 200 : /^(middle|center)$/i.test(this._options.verticalPosition) ? r = this._height / 2 : /^(bottom|max)$/i.test(this._options.verticalPosition) && (r = this._height - 200);
103            for (var l = [], c = new h(a, r), p = new h(a, r), _ = null, d = Math.round(o(0, 360)), u = 0; !(i <= 0);) {
104                if (i--, s = Math.round((1 * Math.random() - .2) * this._options.horizontalSpeed), e = Math.round((1 * Math.random() - .5) * (.25 * this._height)), (_ = new h).copy(p), "right" === t) {
105                    if (_.add(s, e), p.x >= n) break
106                } else if ("left" === t && (_.subtract(s, e), p.x <= -200)) break;
107                l.push({
108                    point1: new h(c.x, c.y),
109                    point2: new h(p.x, p.y),
110                    point3: _,
111                    color: d,
112                    delay: u,
113                    dir: t,
114                    alpha: 0,
115                    phase: 0
116                }), c.copy(p), p.copy(_), u += 4, d += this._options.colorCycleSpeed
117            }
118            this._ribbons.push(l)
119        },
120        _drawRibbonSection: function (t) {
121            if (t) {
122                if (t.phase >= 1 && t.alpha <= 0) return !0;
123                if (t.delay <= 0) {
124                    if (t.phase += .02, t.alpha = 1 * Math.sin(t.phase), t.alpha = t.alpha <= 0 ? 0 : t.alpha, t.alpha = t.alpha >= 1 ? 1 : t.alpha, this._options.animateSections) {
125                        var i = .1 * Math.sin(1 + t.phase * Math.PI / 2);
126                        "right" === t.dir ? (t.point1.add(i, 0), t.point2.add(i, 0), t.point3.add(i, 0)) : (t.point1.subtract(i, 0), t.point2.subtract(i, 0), t.point3.subtract(i, 0)), t.point1.add(0, i), t.point2.add(0, i), t.point3.add(0, i)
127                    }
128                } else t.delay -= .5;
129                var n = this._options.colorSaturation,
130                    o = this._options.colorBrightness,
131                    s = "hsla(" + t.color + ", " + n + ", " + o + ", " + t.alpha + " )";
132                this._context.save(), 0 !== this._options.parallaxAmount && this._context.translate(0, this._scroll * this._options.parallaxAmount), this._context.beginPath(), this._context.moveTo(t.point1.x, t.point1.y), this._context.lineTo(t.point2.x, t.point2.y), this._context.lineTo(t.point3.x, t.point3.y), this._context.fillStyle = s, this._context.fill(), this._options.strokeSize > 0 && (this._context.lineWidth = this._options.strokeSize, this._context.strokeStyle = s, this._context.lineCap = "round", this._context.stroke()), this._context.restore(
132)
133            }
134            return !1
135        },
136        _onDraw: function () {
137            for (var t = 0, i = this._ribbons.length; t < i; ++t) this._ribbons[t] || this._ribbons.splice(t, 1);
138            this._context.clearRect(0, 0, this._width, this._height);
139            for (var n = 0; n < this._ribbons.length; ++n) {
140                for (var o = this._ribbons[n], s = o.length, h = 0, e = 0; e < s; ++e) this._drawRibbonSection(o[e]) && h++;
141                h >= s && (this._ribbons[n] = null)
142            }
143            this._ribbons.length < this._options.ribbonCount && this.addRibbon(), requestAnimationFrame(this._onDraw)
144        },
145        _onResize: function (t) {
146            var i = s();
147            this._width = i.width, this._height = i.height, this._canvas && (this._canvas.width = this._width, this._canvas.height = this._height, this._context && (this._context.globalAlpha = this._options.colorAlpha))
148        },
149        _onScroll: function (t) {
150            var i = s();
151            this._scroll = i.scrolly
152        }
153    }, e
154}()), new Ribbons({
155    colorSaturation: "60%",
156    colorBrightness: "50%",
157    colorAlpha: .5,
158    colorCycleSpeed: 5,
159    verticalPosition: "random",
160    horizontalSpeed: 200,
161    ribbonCount: 3,
162    strokeSize: 0,
163    parallaxAmount: -.2,
164    animateSections: !0
165});

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.