import { listOutputFiles, Template } from './index.js';
import { colorSetToVariants } from '../color-set/index.js';
import { scalePow } from 'd3-scale';
import { Perlin2 } from 'tumult';
import { source } from 'common-tags';
type Combination = {
color1: string;
color2: string;
color3: string;
};
const template: Template = {
name: 'Dot Grid wallpaper',
render: async function* (colorSet, options) {
for (const size of options.wallpaperSizes) {
const patternSize = size.w / Math.round(size.w / 36);
const scale = scalePow()
.domain([0, 1])
.range([patternSize * 0.1, patternSize * 0.95])
.exponent(2 / 3)
.clamp(true);
const perlin = new Perlin2();
const circles: string[] = [];
for (let i = 0; i < size.h; i += patternSize) {
for (let j = 0; j < size.w; j += patternSize) {
const denominator = (Math.min(size.w, size.h) / patternSize) * 21;
const rand = perlin.gen(j / denominator, i / denominator);
const radius = scale(rand) / 2;
const x = j + patternSize / 2;
const y = i + patternSize / 2;
circles.push(source`
`);
}
}
const variants = colorSetToVariants(colorSet);
for (const variant of variants) {
const combinations: Combination[] = [
{
color1: variant.colors.accent3,
color2: variant.colors.accent4,
color3: variant.colors.accent6,
},
{
color1: variant.colors.accent1,
color2: variant.colors.accent2,
color3: variant.colors.accent7,
},
];
yield* combinations.map(({ color1, color2, color3 }, i) => {
const svg = source`
`;
return {
path: `${variant.title.kebab}-${size.w}x${size.h}-${i + 1}.svg`,
content: svg,
};
});
}
}
},
renderInstructions: listOutputFiles,
};
export default template;