Replace the gear spinner with the thinking-orbs canvas engine (vendored framework-free build, driven by js/orb.js in the "solving" state) and the inline SVG brand icon with a pure CSS book whose cover flips open on page load and while the brand is hovered (js/logo.js).
558 lines
19 KiB
JavaScript
558 lines
19 KiB
JavaScript
function U(n, s, t) {
|
|
return n + (s - n) * t;
|
|
}
|
|
function nt(n) {
|
|
return n - Math.floor(n);
|
|
}
|
|
function G(n, s) {
|
|
const t = Math.floor(n), r = Math.floor(s);
|
|
let a = n - t, o = s - r;
|
|
a = a * a * (3 - 2 * a), o = o * o * (3 - 2 * o);
|
|
const c = E(t, r), M = E(t + 1, r), h = E(t, r + 1), m = E(t + 1, r + 1);
|
|
return c + (M - c) * a + (h - c) * o + (c - M - h + m) * a * o;
|
|
}
|
|
function E(n, s) {
|
|
const t = Math.sin(n * 12.9898 + s * 78.233) * 43758.5453;
|
|
return t - Math.floor(t);
|
|
}
|
|
function J(n, s) {
|
|
const t = Math.PI * (3 - Math.sqrt(5)), r = 1 - 2 * (n + 0.5) / s, a = Math.sqrt(1 - r * r), o = n * t;
|
|
return [a * Math.cos(o), r, a * Math.sin(o)];
|
|
}
|
|
function et(n, s) {
|
|
return Math.atan2(Math.sin(n - s), Math.cos(n - s));
|
|
}
|
|
function _(n, s, t, r, a) {
|
|
const o = Math.sin(s), c = Math.cos(s), M = Math.sin(n), h = Math.cos(n);
|
|
return (m, D, p) => {
|
|
const e = m * h + p * M, l = -m * M + p * h, R = D * c - l * o, w = D * o + l * c;
|
|
return [t + e * a, r - R * a, w];
|
|
};
|
|
}
|
|
function rt(n, s, t, r = 0.3) {
|
|
for (const a of s) {
|
|
const o = a.a ?? 1, c = Math.min(1, Math.max(0, a.white)), M = Math.round((t ? 1 - c : c) * 255);
|
|
n.fillStyle = `rgba(${M},${M},${M},${o})`, n.beginPath(), n.arc(a.x, a.y, a.r, 0, Math.PI * 2), n.fill();
|
|
}
|
|
}
|
|
function it(n, s, t) {
|
|
for (const r of s) {
|
|
const a = r.a ?? 1, o = Math.min(1, Math.max(0, r.white)), c = Math.round((t ? 1 - o : o) * 255);
|
|
n.strokeStyle = `rgba(${c},${c},${c},${a})`, n.lineWidth = r.w, n.beginPath(), n.moveTo(r.x1, r.y1), n.lineTo(r.x2, r.y2), n.stroke();
|
|
}
|
|
}
|
|
function L(n, s, t = 0.3) {
|
|
const r = [];
|
|
for (const a of n)
|
|
(a.a ?? 1) < 0.02 || (a.r = Math.max(t, a.r), r.push(a));
|
|
return r.sort((a, o) => a.z - o.z), { dots: r, lines: s.filter((a) => (a.a ?? 1) >= 0.02) };
|
|
}
|
|
function ht(n, s, t) {
|
|
s.lines.length && it(n, s.lines, t), rt(n, s.dots, t);
|
|
}
|
|
function $(n, s) {
|
|
return (n / 300) ** s;
|
|
}
|
|
const Mt = (n, s, t) => {
|
|
const r = n / 2, a = n / 2, o = n / 2 * 0.76, c = _(s * 0.4, 0.3, r, a, 1), M = $(n, t.rsPow ?? 0.6), h = [], m = t.ghostN ?? 150;
|
|
for (let e = 0; e < m; e++) {
|
|
const l = J(e, m), [R, w, i] = c(l[0] * o, l[1] * o, l[2] * o), u = (i / o + 1) / 2;
|
|
h.push({ x: R, y: w, z: i, r: 0.8 * M, white: 0.78, a: 0.1 + 0.22 * u });
|
|
}
|
|
const D = t.strandN ?? 52, p = t.turns ?? 3;
|
|
for (let e = 0; e < 3; e++) {
|
|
const l = e / 3 * 2 * Math.PI;
|
|
for (let R = 0; R < D; R++) {
|
|
const w = (nt(R / D + s * 0.045) * 2 - 1) * 0.96, i = Math.sqrt(Math.max(0, 1 - w * w)), u = Math.min(1, (1 - Math.abs(w)) / 0.1), y = w * Math.PI * p + l, b = 1 + 0.075 * Math.sin(w * Math.PI * p * 2 + l * 2 + s * 0.8), f = i * o * b, [P, x, g] = c(Math.cos(y) * f, w * o * b, Math.sin(y) * f), d = (g / o + 1) / 2;
|
|
h.push({
|
|
x: P,
|
|
y: x,
|
|
z: g,
|
|
r: ((t.rBase ?? 1.2) + (t.rDepth ?? 1.8) * d) * M,
|
|
white: 0.55 - 0.45 * d,
|
|
a: u * (0.45 + 0.55 * d)
|
|
});
|
|
}
|
|
}
|
|
return L(h, [], t.rMin);
|
|
};
|
|
function lt(n, s, t, r) {
|
|
const a = 2 * s * t + r, o = n % a, c = new Array(s).fill(0);
|
|
let M = -1;
|
|
if (o < 2 * s * t) {
|
|
const h = Math.floor(o / t), m = (o - h * t) / t, p = 1 - (1 - Math.min(1, m / 0.7)) ** 3;
|
|
if (h < s) {
|
|
for (let e = 0; e < h; e++) c[e] = 1;
|
|
c[h] = p, M = h;
|
|
} else {
|
|
const e = 2 * s - 1 - h;
|
|
for (let l = 0; l < e; l++) c[l] = 1;
|
|
c[e] = 1 - p, M = e;
|
|
}
|
|
}
|
|
return { amount: c, active: M };
|
|
}
|
|
function pt(n, s, t) {
|
|
let [r, a, o] = n, c = !1;
|
|
for (let M = 0; M < s.length; M++) {
|
|
if (t.amount[M] <= 0) continue;
|
|
const h = s[M], m = h.axis === 0 ? r : h.axis === 1 ? a : o;
|
|
if (m < h.lo || m >= h.hi) continue;
|
|
M === t.active && (c = !0);
|
|
const D = h.ang * t.amount[M], p = Math.cos(D), e = Math.sin(D);
|
|
if (h.axis === 0) {
|
|
const l = a * p - o * e;
|
|
o = a * e + o * p, a = l;
|
|
} else if (h.axis === 1) {
|
|
const l = r * p + o * e;
|
|
o = -r * e + o * p, r = l;
|
|
} else {
|
|
const l = r * p - a * e;
|
|
a = r * e + a * p, r = l;
|
|
}
|
|
}
|
|
return [r, a, o, c];
|
|
}
|
|
function ut(n) {
|
|
const s = [];
|
|
for (let t = 0; t < n; t++) {
|
|
const r = Math.min(2, Math.floor(E(t, 2.3) * 3)), a = -1 + 0.5 * Math.min(3, Math.floor(E(t, 5.9) * 4)), o = E(t, 7.7) < 0.5 ? 1 : -1;
|
|
s.push({ axis: r, lo: a, hi: a + 0.5, ang: o * Math.PI / 2 });
|
|
}
|
|
return s;
|
|
}
|
|
const ft = (n, s, t) => {
|
|
const a = n / 2, o = n / 2, c = n / 2 * 0.82, M = 0.4 + 0.06 * Math.sin(s * 0.35), h = _(s * 0.5, M, a, o, c), m = s * (0.5 + (1.7 - 0.5) * (t.scanMul ?? 1)), D = $(n, t.rsPow ?? 0.6), p = t.dimBase ?? 1, e = [], l = t.latRings ?? 17, R = t.lonDensity ?? 44;
|
|
for (let w = 0; w <= l; w++) {
|
|
const i = -Math.PI / 2 + w / l * Math.PI, u = Math.cos(i), y = Math.sin(i), b = Math.max(1, Math.round(Math.abs(u) * R));
|
|
for (let f = 0; f < b; f++) {
|
|
const P = f / b * 2 * Math.PI, [x, g, d] = h(u * Math.cos(P), y, u * Math.sin(P)), v = (d + 1) / 2, k = et(P + s * 0.5, m), N = Math.exp(-(k * k) / 0.18) * Math.max(0, d);
|
|
e.push({
|
|
x,
|
|
y: g,
|
|
z: d,
|
|
r: ((t.rBase ?? 0.6) + (t.rDepth ?? 1.7) * v + (t.rBoost ?? 1) * N) * D,
|
|
white: (t.inkFar ?? 0.62) - (t.inkSpan ?? 0.54) * v,
|
|
// dimBase < 1 fades un-scanned dots so the meridian reads clearly
|
|
a: p + (1 - p) * Math.min(1, N)
|
|
});
|
|
}
|
|
}
|
|
return L(e, [], t.rMin);
|
|
}, dt = (n, s, t) => {
|
|
const r = n / 2, a = n / 2, o = n / 2 * 0.82, c = _(s * 0.55, 0.35 + 0.1 * Math.sin(s * 0.9), r, a, o), M = $(n, t.rsPow ?? 0.6), h = t.moveCount ?? 14, m = ut(h), D = lt(s, h, 0.42, 1.2), p = [], e = t.latRings ?? 15, l = t.lonDensity ?? 40;
|
|
for (let R = 0; R <= e; R++) {
|
|
const w = -Math.PI / 2 + R / e * Math.PI, i = Math.cos(w), u = Math.sin(w), y = Math.max(1, Math.round(Math.abs(i) * l));
|
|
for (let b = 0; b < y; b++) {
|
|
const f = b / y * 2 * Math.PI, [P, x, g, d] = pt([i * Math.cos(f), u, i * Math.sin(f)], m, D), [v, k, N] = c(P, x, g), z = (N + 1) / 2;
|
|
p.push({
|
|
x: v,
|
|
y: k,
|
|
z: N,
|
|
r: ((t.rBase ?? 0.6) + (t.rDepth ?? 1.7) * z + (d ? t.rActive ?? 0.3 : 0)) * M,
|
|
white: (t.inkFar ?? 0.62) - (t.inkSpan ?? 0.54) * z - (d ? 0.14 : 0)
|
|
});
|
|
}
|
|
}
|
|
return L(p, [], t.rMin);
|
|
}, bt = (n, s, t) => {
|
|
const r = n / 2, a = n / 2, o = n / 2 * 0.874, c = _(s * 0.18, 0.38, r, a, 1), M = $(n, t.rsPow ?? 0.6), h = [], m = t.rings ?? 15, D = t.lonDensity ?? 40;
|
|
for (let p = 0; p <= m; p++) {
|
|
const e = -Math.PI / 2 + p / m * Math.PI, l = Math.cos(e), R = Math.sin(e), w = 0.62 * Math.sin(s * 2.1 - p * 0.52) + 0.38 * Math.sin(s * 1.27 + p * 0.83), i = o * (0.88 + 0.105 * w), u = Math.max(1, Math.round(Math.abs(l) * D));
|
|
for (let y = 0; y < u; y++) {
|
|
const b = y / u * 2 * Math.PI, [f, P, x] = c(l * Math.cos(b) * i, R * i, l * Math.sin(b) * i), g = (x / o + 1) / 2, d = Math.max(0, w);
|
|
h.push({
|
|
x: f,
|
|
y: P,
|
|
z: x,
|
|
r: ((t.rBase ?? 0.6) + (t.rDepth ?? 1.7) * g) * (1 + 0.4 * d) * M,
|
|
white: 0.66 - 0.56 * g - 0.1 * d
|
|
});
|
|
}
|
|
}
|
|
return L(h, [], t.rMin);
|
|
};
|
|
function xt(n) {
|
|
return n * n * (3 - 2 * n);
|
|
}
|
|
function st(n) {
|
|
const s = n.length, t = [];
|
|
let r = 0;
|
|
for (let a = 0; a < s; a++) {
|
|
const o = n[a], c = n[(a + 1) % s], M = Math.hypot(c[0] - o[0], c[1] - o[1]);
|
|
t.push(M), r += M;
|
|
}
|
|
return (a) => {
|
|
let o = a * r, c = 0;
|
|
for (; o > t[c] && c < s - 1; )
|
|
o -= t[c], c++;
|
|
const M = n[c], h = n[(c + 1) % s], m = t[c] ? Math.min(1, o / t[c]) : 0;
|
|
return [M[0] + (h[0] - M[0]) * m, M[1] + (h[1] - M[1]) * m];
|
|
};
|
|
}
|
|
const yt = (n) => {
|
|
const s = -Math.PI / 2 + n * 2 * Math.PI;
|
|
return [Math.cos(s) * 0.24, Math.sin(s) * 0.24];
|
|
}, gt = st([
|
|
[0, -0.26],
|
|
[0.24, 0.16],
|
|
[-0.24, 0.16]
|
|
]), mt = st([
|
|
[0, -0.2],
|
|
[0.2, -0.2],
|
|
[0.2, 0.2],
|
|
[-0.2, 0.2],
|
|
[-0.2, -0.2]
|
|
]), H = [yt, gt, mt];
|
|
function wt(n) {
|
|
return Math.max(6, Math.round(34 * n));
|
|
}
|
|
const V = 1.4, ot = 0.9, Q = V + ot, Pt = (n, s, t) => {
|
|
const r = H.length, a = s % (Q * r), o = Math.floor(a / Q), c = a - o * Q, M = c > V ? xt((c - V) / ot) : 0, h = t.spread ?? 1, m = H[o], D = H[(o + 1) % r], p = 160, e = [];
|
|
for (let x = 0; x < p; x++) {
|
|
const g = x / p, d = m(g), v = D(g);
|
|
e.push([(d[0] + (v[0] - d[0]) * M) * h, (d[1] + (v[1] - d[1]) * M) * h]);
|
|
}
|
|
const l = [];
|
|
let R = 0;
|
|
for (let x = 0; x < p; x++) {
|
|
const g = e[x], d = e[(x + 1) % p], v = Math.hypot(d[0] - g[0], d[1] - g[1]);
|
|
l.push(v), R += v;
|
|
}
|
|
const w = wt(t.iconD ?? 1), i = (t.rDot ?? 0.021) * 1.35 * h, u = 1 + 0.02 * Math.sin(c * 3.1), y = [], b = n / 2;
|
|
let f = 0, P = 0;
|
|
for (let x = 0; x < w; x++) {
|
|
const g = x / w * R;
|
|
for (; P + l[f] < g && f < p - 1; )
|
|
P += l[f], f++;
|
|
const d = e[f], v = e[(f + 1) % p], k = l[f] ? Math.min(1, (g - P) / l[f]) : 0, N = (d[0] + (v[0] - d[0]) * k) * u, z = (d[1] + (v[1] - d[1]) * k) * u;
|
|
y.push({
|
|
x: b + N * n,
|
|
y: b + z * n,
|
|
z: 0,
|
|
r: Math.max(0.35, i * n),
|
|
white: 0.1
|
|
});
|
|
}
|
|
return L(y, [], t.rMin);
|
|
}, Rt = (n, s, t) => {
|
|
const r = n / 2, a = n / 2, o = n / 2 * 0.82, c = _(s * 0.12, 0.3, r, a, 1), M = $(n, t.rsPow ?? 0.6), h = [], m = t.orbitN ?? 12, D = t.ghostN ?? 40, p = t.particles ?? 3;
|
|
for (let e = 0; e < m; e++) {
|
|
const l = E(e, 1.7), R = E(e, 5.2), w = E(e, 8.9), i = o * (0.45 + 0.52 * l), u = l * 2 * Math.PI, y = Math.acos(2 * R - 1), b = Math.sin(y) * Math.cos(u), f = Math.cos(y), P = Math.sin(y) * Math.sin(u);
|
|
let x = -f, g = b;
|
|
const d = 0, v = Math.max(1e-6, Math.sqrt(x * x + g * g));
|
|
x /= v, g /= v;
|
|
const k = f * d - P * g, N = P * x - b * d, z = b * g - f * x, O = (0.25 + 0.55 * w) * (w > 0.5 ? 1 : -1);
|
|
for (let B = 0; B < D; B++) {
|
|
const I = B / D * 2 * Math.PI, [S, A, T] = c(
|
|
(x * Math.cos(I) + k * Math.sin(I)) * i,
|
|
(g * Math.cos(I) + N * Math.sin(I)) * i,
|
|
(d * Math.cos(I) + z * Math.sin(I)) * i
|
|
), C = (T / i + 1) / 2;
|
|
h.push({
|
|
x: S,
|
|
y: A,
|
|
z: T,
|
|
r: (t.ghostR ?? 0.9) * M,
|
|
white: 0.72,
|
|
a: (t.ghostA ?? 0.5) * (0.4 + 0.6 * C)
|
|
});
|
|
}
|
|
for (let B = 0; B < p; B++) {
|
|
const I = s * O + B / p * 2 * Math.PI + R * 6, [S, A, T] = c(
|
|
(x * Math.cos(I) + k * Math.sin(I)) * i,
|
|
(g * Math.cos(I) + N * Math.sin(I)) * i,
|
|
(d * Math.cos(I) + z * Math.sin(I)) * i
|
|
), C = (T / i + 1) / 2;
|
|
h.push({
|
|
x: S,
|
|
y: A,
|
|
z: T,
|
|
r: ((t.partR ?? 1.2) + (t.partRDepth ?? 1.6) * C) * M,
|
|
white: 0.3 - 0.22 * C
|
|
});
|
|
}
|
|
}
|
|
return L(h, [], t.rMin);
|
|
}, Z = (n, s, t) => {
|
|
const r = n / 2, a = n / 2, o = n / 2 * 0.78, c = t.spin ?? 1, M = 0.3, h = _(s * 0.1 * c, M, r, a, 1), m = $(n, t.rsPow ?? 0.6), D = [], p = t.ghostN ?? 150;
|
|
for (let z = 0; z < p; z++) {
|
|
const O = J(z, p), [B, I, S] = h(O[0] * o, O[1] * o, O[2] * o), A = (S / o + 1) / 2;
|
|
D.push({ x: B, y: I, z: S, r: 0.8 * m, white: 0.78, a: 0.1 + 0.22 * A });
|
|
}
|
|
const e = s * 0.24 * c, l = t.faceOn ? -M : 0.55 + 0.3 * Math.sin(s * 0.18) * c, R = Math.cos(e), w = 0, i = Math.sin(e), u = -i * Math.sin(l), y = Math.cos(l), b = R * Math.sin(l), f = w * b - i * y, P = i * u - R * b, x = R * y - w * u, g = 0.23 * (t.wobMul ?? 1), d = t.faceOn ? o / (1 + 0.85 * g) : o, v = t.lanes ?? 5, k = t.segs ?? 88, N = Math.max(1, Math.round(v * (t.bandMul ?? 1)));
|
|
for (let z = 0; z < N; z++) {
|
|
const O = (z - (N - 1) / 2) * 0.075, B = Math.abs(z - (N - 1) / 2) / Math.max(1, (N - 1) / 2);
|
|
for (let I = 0; I < k; I++) {
|
|
const S = I / k * 2 * Math.PI, A = (0.16 * Math.sin(S * 3 - s * 1.7 + z * 0.22) + 0.07 * Math.sin(S * 5 + s * 1.1)) * (t.wobMul ?? 1), T = t.faceOn ? 1 + A : 1, C = t.faceOn ? O : O + A, q = R * Math.cos(S) + u * Math.sin(S) + f * C, F = w * Math.cos(S) + y * Math.sin(S) + P * C, j = i * Math.cos(S) + b * Math.sin(S) + x * C, W = Math.sqrt(q * q + F * F + j * j), Y = d * T, [ct, at, X] = h(q / W * Y, F / W * Y, j / W * Y), K = (X / o + 1) / 2;
|
|
D.push({
|
|
x: ct,
|
|
y: at,
|
|
z: X,
|
|
r: ((t.rBase ?? 1.1) + (t.rDepth ?? 1.7) * K) * (1 - 0.25 * B) * m,
|
|
white: 0.52 - 0.44 * K + 0.18 * B,
|
|
a: 0.4 + 0.6 * K
|
|
});
|
|
}
|
|
}
|
|
return L(D, [], t.rMin);
|
|
}, Dt = (n, s, t) => {
|
|
const r = n / 2, a = n / 2, o = n / 2 * 0.8 * (t.spread ?? 1), c = _(s * 0.12, 0.32, r, a, o), M = $(n, t.rsPow ?? 0.6), h = t.nodeN ?? 30, m = t.thr ?? 0.72, D = t.nodeR ?? 1.4, p = t.nodeRDepth ?? 1.8, e = [];
|
|
for (let i = 0; i < h; i++) {
|
|
const u = J(i, h), y = u[0] + 0.3 * (G(i * 0.31 + 9, s * 0.24) - 0.5) * 2, b = u[1] + 0.3 * (G(i * 0.53 + 27, s * 0.21) - 0.5) * 2, f = u[2] + 0.3 * (G(i * 0.77 + 55, s * 0.27) - 0.5) * 2, P = Math.sqrt(y * y + b * b + f * f);
|
|
e.push([y / P, b / P, f / P]);
|
|
}
|
|
const l = [], R = [];
|
|
for (let i = 0; i < h; i++)
|
|
for (let u = i + 1; u < h; u++) {
|
|
const y = e[i][0] - e[u][0], b = e[i][1] - e[u][1], f = e[i][2] - e[u][2], P = Math.sqrt(y * y + b * b + f * f);
|
|
if (P >= m) continue;
|
|
const [x, g, d] = c(e[i][0], e[i][1], e[i][2]), [v, k, N] = c(e[u][0], e[u][1], e[u][2]), z = ((d + N) / 2 + 1) / 2;
|
|
l.push({
|
|
x1: x,
|
|
y1: g,
|
|
x2: v,
|
|
y2: k,
|
|
white: 0.42,
|
|
a: (1 - P / m) * (0.3 + 0.55 * z),
|
|
w: Math.max(0.6, (t.lineW ?? 0.8) * M)
|
|
});
|
|
}
|
|
for (let i = 0; i < h; i++) {
|
|
const [u, y, b] = c(e[i][0], e[i][1], e[i][2]), f = (b + 1) / 2, P = 1 + 0.25 * Math.sin(s * 1.4 + i * 2.7);
|
|
R.push({
|
|
x: u,
|
|
y,
|
|
z: b,
|
|
r: (D + p * f) * P * M,
|
|
white: 0.55 - 0.45 * f
|
|
});
|
|
}
|
|
const w = t.signals ?? 5;
|
|
for (let i = 0; i < w; i++) {
|
|
const u = Math.floor(s * 0.55 + i * 7.31), y = Math.floor(E(u, i * 3.1 + 1.7) * h), b = Math.floor(E(u, i * 5.7 + 4.2) * h);
|
|
if (y === b) continue;
|
|
const f = nt(s * 0.55 + i * 7.31), P = U(e[y][0], e[b][0], f), x = U(e[y][1], e[b][1], f), g = U(e[y][2], e[b][2], f), d = Math.max(1e-6, Math.sqrt(P * P + x * x + g * g)), [v, k, N] = c(P / d, x / d, g / d), z = (N + 1) / 2;
|
|
R.push({
|
|
x: v,
|
|
y: k,
|
|
z: N,
|
|
r: (D * 1.5 + p * z) * M,
|
|
white: 0.05,
|
|
a: 0.5 + 0.5 * z
|
|
});
|
|
}
|
|
return L(R, l, t.rMin);
|
|
}, vt = {
|
|
orbits: Rt,
|
|
globe: ft,
|
|
rubik: dt,
|
|
wave: bt,
|
|
web: Dt,
|
|
braid: Mt,
|
|
ribbon: Z,
|
|
// ring shares ribbon's geometry — the `faceOn` profile flag switches it
|
|
ring: Z,
|
|
morph: Pt
|
|
}, Ct = Object.fromEntries(
|
|
Object.entries(vt).map(([n, s]) => [
|
|
n,
|
|
(t, r, a, o, c) => ht(t, s(r, a, c), o)
|
|
])
|
|
), zt = [
|
|
["latRings", "lonDensity"],
|
|
["rings", "lonDensity"],
|
|
["lanes", "segs"]
|
|
], Nt = ["orbitN", "ghostN", "nodeN", "strandN", "signals"], It = ["iconD"], kt = [
|
|
"rBase",
|
|
"rDepth",
|
|
"rActive",
|
|
"rDot",
|
|
"ghostR",
|
|
"partR",
|
|
"partRDepth",
|
|
"nodeR",
|
|
"nodeRDepth"
|
|
];
|
|
function St(n, s) {
|
|
const t = { ...n }, r = /* @__PURE__ */ new Set(), a = Math.sqrt(s);
|
|
for (const [o, c] of zt) {
|
|
const M = t[o], h = t[c];
|
|
M != null && h != null && !r.has(o) && !r.has(c) && (t[o] = Math.max(2, Math.round(M * a)), t[c] = Math.max(2, Math.round(h * a)), r.add(o), r.add(c));
|
|
}
|
|
for (const o of Nt) {
|
|
const c = t[o];
|
|
c != null && c !== 0 && !r.has(o) && (t[o] = Math.max(1, Math.round(c * s)));
|
|
}
|
|
for (const o of It) {
|
|
const c = t[o];
|
|
c != null && (t[o] = Math.max(0.02, c * s));
|
|
}
|
|
return t;
|
|
}
|
|
function Bt(n, s) {
|
|
const t = { ...n };
|
|
for (const r of kt) {
|
|
const a = t[r];
|
|
a != null && (t[r] = a * s);
|
|
}
|
|
return t.rSizeMul = (t.rSizeMul ?? 1) * s, t;
|
|
}
|
|
const Et = {
|
|
globe: {
|
|
latRings: 17,
|
|
lonDensity: 44,
|
|
rBase: 0.6,
|
|
rDepth: 1.7,
|
|
rBoost: 1,
|
|
inkFar: 0.62,
|
|
inkSpan: 0.54,
|
|
rsPow: 0.6,
|
|
rMin: 0.3
|
|
},
|
|
orbits: {
|
|
orbitN: 12,
|
|
ghostN: 40,
|
|
ghostR: 0.9,
|
|
ghostA: 0.5,
|
|
particles: 3,
|
|
partR: 1.2,
|
|
partRDepth: 1.6,
|
|
rsPow: 0.6,
|
|
rMin: 0.3
|
|
},
|
|
rubik: {
|
|
latRings: 15,
|
|
lonDensity: 40,
|
|
moveCount: 14,
|
|
rBase: 0.6,
|
|
rDepth: 1.7,
|
|
rActive: 0.3,
|
|
inkFar: 0.62,
|
|
inkSpan: 0.54,
|
|
rsPow: 0.6,
|
|
rMin: 0.3
|
|
},
|
|
wave: {
|
|
rings: 15,
|
|
lonDensity: 40,
|
|
rBase: 0.6,
|
|
rDepth: 1.7,
|
|
rsPow: 0.6,
|
|
rMin: 0.3
|
|
},
|
|
web: {
|
|
nodeN: 30,
|
|
thr: 0.72,
|
|
signals: 5,
|
|
nodeR: 1.4,
|
|
nodeRDepth: 1.8,
|
|
lineW: 0.8,
|
|
rsPow: 0.6,
|
|
rMin: 0.3
|
|
},
|
|
braid: {
|
|
strandN: 52,
|
|
turns: 3,
|
|
ghostN: 150,
|
|
rBase: 1.2,
|
|
rDepth: 1.8,
|
|
rsPow: 0.6,
|
|
rMin: 0.3
|
|
},
|
|
ribbon: {
|
|
lanes: 5,
|
|
segs: 88,
|
|
ghostN: 150,
|
|
rBase: 1.1,
|
|
rDepth: 1.7,
|
|
rsPow: 0.6,
|
|
rMin: 0.3
|
|
},
|
|
// ring shares ribbon's painter; faceOn cancels the camera tilt and moves
|
|
// the undulation onto the radius, and there is no ghost sphere behind it
|
|
ring: {
|
|
lanes: 5,
|
|
segs: 88,
|
|
ghostN: 0,
|
|
faceOn: 1,
|
|
rBase: 1.1,
|
|
rDepth: 1.7,
|
|
rsPow: 0.6,
|
|
rMin: 0.3
|
|
},
|
|
morph: {
|
|
rDot: 0.021,
|
|
iconD: 1,
|
|
rMin: 0.25
|
|
}
|
|
}, Ot = {
|
|
working: "orbits",
|
|
searching: "globe",
|
|
solving: "rubik",
|
|
listening: "wave",
|
|
connecting: "web",
|
|
weaving: "braid",
|
|
composing: "ribbon",
|
|
breathing: "ring",
|
|
shaping: "morph"
|
|
}, At = {
|
|
orbits: {
|
|
64: { speed: 1.885, count: 1, size: 1 },
|
|
20: { speed: 3.9, count: 0.238, size: 2.4 }
|
|
},
|
|
globe: {
|
|
64: { speed: 2.015, count: 0.42, size: 1.15, extra: { scanMul: 4.08, dimBase: 0.45 } },
|
|
20: { speed: 2.665, count: 0.105, size: 1.75, extra: { scanMul: 4.335, dimBase: 0.45 } }
|
|
},
|
|
rubik: {
|
|
64: { speed: 1.82, count: 0.35, size: 1.05 },
|
|
20: { speed: 1.95, count: 0.088, size: 1.9 }
|
|
},
|
|
wave: {
|
|
64: { speed: 4.388, count: 0.341, size: 1 },
|
|
20: { speed: 3.998, count: 0.105, size: 1.6 }
|
|
},
|
|
web: {
|
|
64: { speed: 3.315, count: 1.35, size: 0.95 },
|
|
20: { speed: 6.63, count: 0.25, size: 1.52 }
|
|
},
|
|
braid: {
|
|
64: { speed: 1.625, count: 0.5, size: 1 },
|
|
20: { speed: 2.75, count: 0.1125, size: 1.36 }
|
|
},
|
|
ribbon: {
|
|
64: { speed: 2.34, count: 0.25, size: 0.85, extra: { spin: 0, bandMul: 3.9, wobMul: 1 } },
|
|
20: { speed: 3.12, count: 0.051, size: 1.073, extra: { spin: 0, bandMul: 4.94, wobMul: 1 } }
|
|
},
|
|
ring: {
|
|
64: { speed: 3.24, count: 0.25, size: 0.956, extra: { spin: 0, bandMul: 3.627, wobMul: 0.368 } },
|
|
20: { speed: 3.78, count: 0.028, size: 1.622, extra: { spin: 0, bandMul: 3.968, wobMul: 0.565 } }
|
|
},
|
|
morph: {
|
|
64: { speed: 2.405, count: 0.702, size: 0.395, extra: { spread: 1.45 } },
|
|
20: { speed: 2.08, count: 0.53, size: 1.011, extra: { spread: 1.45 } }
|
|
}
|
|
}, tt = /* @__PURE__ */ new Map();
|
|
function Lt(n, s) {
|
|
const t = `${n}-${s}`, r = tt.get(t);
|
|
if (r) return r;
|
|
const a = Ot[n], o = At[a][s];
|
|
let c = { ...Et[a] };
|
|
o.count !== 1 && (c = St(c, o.count)), o.size !== 1 && (c = Bt(c, o.size)), o.extra && (c = { ...c, ...o.extra });
|
|
const M = { mode: a, speed: o.speed, opts: c };
|
|
return tt.set(t, M), M;
|
|
}
|
|
export {
|
|
Ct as MODE_DRAWS,
|
|
vt as MODE_FRAMES,
|
|
Ot as STATE_TO_MODE,
|
|
L as finalizeFrame,
|
|
_ as makeProj,
|
|
rt as paint,
|
|
ht as paintFrame,
|
|
it as paintLines,
|
|
$ as radiusScale,
|
|
Lt as resolvePreset
|
|
};
|