cool bars done enough
This commit is contained in:
parent
1b5b70a832
commit
2fbccaac7c
2 changed files with 99 additions and 1 deletions
98
html/bars.tsx
Normal file
98
html/bars.tsx
Normal file
|
@ -0,0 +1,98 @@
|
|||
import { JSX } from "preact";
|
||||
import { Main, render_and_copy } from "./common.tsx";
|
||||
|
||||
const Bar = ({
|
||||
color,
|
||||
animation_time,
|
||||
side,
|
||||
}: {
|
||||
color: string;
|
||||
animation_time: number;
|
||||
side: "left" | "right";
|
||||
}): JSX.Element => (
|
||||
<div class="bar">
|
||||
<div
|
||||
class="bar-inner"
|
||||
style={{
|
||||
transform: `translateX(${side == "left" ? -100 : 100}%)`,
|
||||
backgroundColor: color,
|
||||
animation: `${animation_time}s alternate-reverse ease infinite spin`,
|
||||
outline: `1px solid ${color}`,
|
||||
}}
|
||||
></div>
|
||||
</div>
|
||||
);
|
||||
|
||||
function coprime(a: number, b: number): boolean {
|
||||
if (a == b) return false;
|
||||
for (let i = 2; i < Math.min(a, b); i++) {
|
||||
if (a % i == 0 && b % i == 0) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
function next_coprime(ns: number[]): number {
|
||||
if (ns.length == 0) return 2;
|
||||
|
||||
for (let a = ns.at(-1) ?? 0; ; a++) {
|
||||
let good = true;
|
||||
for (const b of ns) {
|
||||
if (!coprime(a, b)) good = false;
|
||||
}
|
||||
if (good) return a;
|
||||
}
|
||||
}
|
||||
|
||||
function gen_coprimes(to: number): number[] {
|
||||
if (to <= 0) return [];
|
||||
if (to == 1) return [2];
|
||||
|
||||
const xs = gen_coprimes(to - 1);
|
||||
return [...xs, next_coprime(xs)];
|
||||
}
|
||||
|
||||
const BarPair = ({
|
||||
color,
|
||||
animation_time,
|
||||
num_bars,
|
||||
}: {
|
||||
color: string;
|
||||
animation_time: number;
|
||||
num_bars: number;
|
||||
}): JSX.Element => (
|
||||
<div class="bar-pair" style={{ height: `${(1 / num_bars) * 100}%` }}>
|
||||
<Bar color={color} animation_time={animation_time} side="left" />
|
||||
<Bar color={color} animation_time={animation_time} side="right" />
|
||||
</div>
|
||||
);
|
||||
|
||||
const Bars = ({ colors }: { colors: string[] }): JSX.Element => (
|
||||
<Main>
|
||||
{...colors.map((c, i) => (
|
||||
<BarPair
|
||||
color={c}
|
||||
animation_time={2 ** i * 0.1}
|
||||
num_bars={colors.length}
|
||||
/>
|
||||
))}
|
||||
</Main>
|
||||
);
|
||||
|
||||
render_and_copy(
|
||||
<Bars
|
||||
colors={[
|
||||
"#FF6961",
|
||||
"#FFB347",
|
||||
"#FFFF99",
|
||||
"#77DD77",
|
||||
"#ADD8E6",
|
||||
"#B19CD9",
|
||||
"rgb(var(--color-longan))",
|
||||
"rgb(var(--color-mango))",
|
||||
"rgb(var(--color-strawberry))",
|
||||
"rgb(var(--color-cherry))",
|
||||
]}
|
||||
/>
|
||||
);
|
|
@ -23,7 +23,7 @@ const wheel_style = (
|
|||
});
|
||||
|
||||
const get_delays = (...lengths: number[]): number[] => {
|
||||
let out = [0];
|
||||
const out = [0];
|
||||
for (const l of lengths) {
|
||||
out.push((out.at(-1) ?? 0) + animation_length(l));
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue