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` ${circles} `; return { path: `${variant.title.kebab}-${size.w}x${size.h}-${i + 1}.svg`, content: svg, }; }); } } }, renderInstructions: listOutputFiles, }; export default template;