diff --git a/CHANGELOG.md b/CHANGELOG.md index aa1315e..ef7c4bd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,47 @@ +## 0.24.0 + +### Changes + +* Removed `@min-size`, `@max-size`, `@path()`, `nrand()`, and `@reflect()` since I never used them. +* Removed the feature of registering typed custom properties automatically, which was used for animation. +* Renamed `place-cell` to `offset` in favor of shorter name. + +### Features + +* Added Perlin noise function `@rn()` and `@noise()`. + ```css + /* similar to @r() function */ + scale: @rn(0, 1); + rotate: @rn(360deg); + ``` + +* Added support for `direction` inside `@plot()` function. + Each element will rotate towards the curve direction or with custom angles. + ```csss + @offset: @plot( + /* the syntax is similar to offset-rotate */ + direction: auto 90deg; + ); + ``` + +* Added support for `unit` inside `@plot()` function. + Now the `box-shadow` value can be plotted. + ```css + box-shadow: @m10( + @plot(r: 10, unit: em) 0 0 #000 + ); + ``` + Or simply put the unit at the end of `r`. + ```css + box-shadow: @m10( + @plot(r: 10em) 0 0 #000 + ); + ``` + +

+ + + ## 0.23.1 * Fixed `index` calculation in `@pattern`. diff --git a/css-doodle.js b/css-doodle.js index 8658519..a2f93ab 100644 --- a/css-doodle.js +++ b/css-doodle.js @@ -1,4 +1,4 @@ -/*! css-doodle@0.23.1 */ +/*! css-doodle@0.24.0 */ (function (global, factory) { typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : typeof define === 'function' && define.amd ? define(factory) : @@ -191,7 +191,8 @@ else if (is$2.symbol(curr) && !is$2.selfClosedTag(curr, next)) { let lastToken = last$3(tokens); // negative - if (curr === '-' && is$2.digit(next) && (!lastToken || !lastToken.isNumber())) { + let isNextDigit = is$2.digit(next) || (is$2.dot(next) && is$2.digit(next2)); + if (curr === '-' && isNextDigit && (!lastToken || !lastToken.isNumber())) { let num = readNumber(iter); tokens.push(new Token({ type: 'Number', value: num, pos @@ -264,7 +265,7 @@ return tokens; } - function parse$7(input) { + function parse$9(input) { let iter = iterator$1(scan(input)); return walk$2(iter); } @@ -347,7 +348,7 @@ } function shuffle(arr) { - let ret = Array.from ? Array.from(arr) : arr.slice(); + let ret = [...arr]; let m = arr.length; while (m) { let i = ~~(random() * m--); @@ -358,6 +359,10 @@ return ret; } + function duplicate(arr) { + return [].concat(arr, arr); + } + function flat_map(arr, fn) { if (Array.prototype.flatMap) return arr.flatMap(fn); return arr.reduce((acc, x) => acc.concat(fn(x)), []); @@ -379,6 +384,7 @@ clone, shuffle, flat_map, + duplicate, remove_empty_values } } @@ -968,7 +974,7 @@ function evaluate_value(values, extra) { values.forEach && values.forEach(v => { if (v.type == 'text' && v.value) { - let vars = parse$7(v.value); + let vars = parse$9(v.value); v.value = vars.reduce((ret, p) => { let rule = '', other = '', parsed; rule = read_variable(extra, p.name); @@ -982,7 +988,7 @@ }); } try { - parsed = parse$6(rule, extra); + parsed = parse$8(rule, extra); } catch (e) { } if (parsed) { ret.push.apply(ret, parsed); @@ -1011,7 +1017,7 @@ }, []); } - function parse$6(input, extra) { + function parse$8(input, extra) { const it = iterator(input); const Tokens = []; while (!it.end()) { @@ -1114,7 +1120,7 @@ let index = 1; for (let i = 1; i <= y; ++i) { for (let j = 1; j <= x; ++j) { - ret.push(fn(index++, j, i, max)); + ret.push(fn(index++, j, i, max, x, y)); } } return ret; @@ -1210,7 +1216,7 @@ }); } - function parse$5(input) { + function parse$7(input) { let iter = iterator$1(removeParens(scan(input))); let stack = []; let tokens = []; @@ -1396,31 +1402,20 @@ return element; } - function random_func(random) { + function Random(random) { - function lerp(start, end, t) { - return start * (1 - t) + end * t; + function lerp(t, a, b) { + return a + t * (b - a); } function rand(start = 0, end) { if (arguments.length == 1) { [start, end] = [0, start]; } - return lerp(start, end, random()); + return lerp(random(), start, end); } - function nrand(mean = 0, scale = 1) { - let u1 = 0, u2 = 0; - //Convert [0,1) to (0,1) - while (u1 === 0) u1 = random(); - while (u2 === 0) u2 = random(); - const R = Math.sqrt(-2.0 * Math.log(u1)); - const t = 2.0 * Math.PI * u2; - const u0 = R * Math.cos(t); - return mean + scale * u0; - } - - function pick( ...items) { + function pick(...items) { let args = items.reduce((acc, n) => acc.concat(n), []); return args[~~(random() * args.length)]; } @@ -1432,7 +1427,6 @@ return { lerp, rand, - nrand, pick, unique_id }; @@ -1899,7 +1893,65 @@ } } - function parse$4(input) { + /** + * Improved noise by Ken Perlin + * Translated from: https://mrl.nyu.edu/~perlin/noise/ + */ + + class Perlin { + constructor(random) { + let { lerp } = Random(random); + let { shuffle, duplicate } = List(random); + this.lerp = lerp; + this.p = duplicate(shuffle([ + 151,160,137,91,90,15, + 131,13,201,95,96,53,194,233,7,225,140,36,103,30,69,142,8,99,37,240,21,10,23, + 190,6,148,247,120,234,75,0,26,197,62,94,252,219,203,117,35,11,32,57,177,33, + 88,237,149,56,87,174,20,125,136,171,168,68,175,74,165,71,134,139,48,27,166, + 77,146,158,231,83,111,229,122,60,211,133,230,220,105,92,41,55,46,245,40,244, + 102,143,54,65,25,63,161,1,216,80,73,209,76,132,187,208,89,18,169,200,196, + 135,130,116,188,159,86,164,100,109,198,173,186,3,64,52,217,226,250,124,123, + 5,202,38,147,118,126,255,82,85,212,207,206,59,227,47,16,58,17,182,189,28,42, + 223,183,170,213,119,248,152,2,44,154,163,70,221,153,101,155,167,43,172,9, + 129,22,39,253,19,98,108,110,79,113,224,232,178,185,112,104,218,246,97,228, + 251,34,242,193,238,210,144,12,191,179,162,241,81,51,145,235,249,14,239,107, + 49,192,214,31,181,199,106,157,184,84,204,176,115,121,50,45,127,4,150,254, + 138,236,205,93,222,114,67,29,24,72,243,141,128,195,78,66,215,61,156,180 + ])); + } + + // Convert LO 4 bits of hash code into 12 gradient directions. + grad(hash, x, y, z) { + let h = hash & 15, + u = h < 8 ? x : y, + v = h < 4 ? y : h == 12 || h == 14 ? x : z; + return ((h&1) == 0 ? u : -u) + ((h&2) == 0 ? v : -v); + } + + noise(x, y, z) { + let { p, grad, lerp } = this; + // Find unit cube that contains point. + let [X, Y, Z] = [x, y, z].map(n => Math.floor(n) & 255); + // Find relative x, y, z of point in cube. + [x, y, z] = [x, y, z].map(n => n - Math.floor(n)); + // Compute fade curves for each of x, y, z. + let [u, v, w] = [x, y, z].map(n => n * n * n * (n * (n * 6 - 15) + 10)); + // hash coordinates of the 8 cube corners. + let A = p[X ]+Y, AA = p[A]+Z, AB = p[A+1]+Z, + B = p[X+1]+Y, BA = p[B]+Z, BB = p[B+1]+Z; + // And add blended results from 8 corners of cube. + return lerp(w, lerp(v, lerp(u, grad(p[AA ], x , y , z ), + grad(p[BA ], x-1, y , z )), + lerp(u, grad(p[AB ], x , y-1, z ), + grad(p[BB ], x-1, y-1, z ))), + lerp(v, lerp(u, grad(p[AA+1], x , y , z-1 ), + grad(p[BA+1], x-1, y , z-1 )), + lerp(u, grad(p[AB+1], x , y-1, z-1 ), + grad(p[BB+1], x-1, y-1, z-1 )))); + } + } + + function parse$6(input) { let iter = iterator$1(scan(input)); let commands = {}; let tokens = []; @@ -1930,16 +1982,15 @@ } } } - if (tokens.length && name) { commands[name] = transformNegative(name, joinTokens$1(tokens), negative); } - return commands; } function transformNegative(name, value, negative) { - if (name === 'fill-rule') { + let excludes = ['fill-rule', 'fill']; + if (excludes.includes(name)) { return value; } return negative ? `-1 * (${ value })` : value; @@ -1949,11 +2000,133 @@ return tokens.map(n => n.value).join(''); } - const { cos, sin, atan2, PI } = Math; + function parse$5(input, noSpace) { + let group = []; + let tokens = []; + let parenStack = []; + let quoteStack = []; + + if (is_empty(input)) { + return group; + } + + let iter = iterator$1(scan(input)); + + function isSeperator(token) { + if (noSpace) { + return token.isSymbol(','); + } + return token.isSymbol(',') || token.isSpace(); + } + + while (iter.next()) { + let { prev, curr, next } = iter.get(); + if (curr.isSymbol('(')) { + parenStack.push(curr.value); + } + if (curr.isSymbol(')')) { + parenStack.pop(); + } + if (curr.status === 'open') { + quoteStack.push(curr.value); + } + if (curr.status === 'close') { + quoteStack.pop(); + } + if (isSeperator(curr) && !parenStack.length && !quoteStack.length) { + group.push(joinTokens(tokens)); + tokens = []; + } else { + tokens.push(curr); + } + } + + if (tokens.length) { + group.push(joinTokens(tokens)); + } + + return group; + } + + function joinTokens(tokens) { + return tokens.map(n => n.value).join(''); + } + + const keywords = ['auto', 'reverse']; + const units = ['deg', 'rad', 'grad', 'turn']; + + function parse$4(input) { + let iter = iterator$1(scan(input)); + let matched = false; + let unit = ''; + let ret = { + direction: '', + angle: '', + }; + while (iter.next()) { + let { prev, curr, next } = iter.get(); + if (curr.isWord() && keywords.includes(curr.value)) { + ret.direction = curr.value; + matched = true; + } + else if (curr.isNumber()) { + ret.angle = Number(curr.value); + matched = true; + } + else if (curr.isWord() && prev && prev.isNumber() && units.includes(curr.value)) { + unit = curr.value; + } + else if (curr.isSpace() && ret.direction !== '' && ret.angle !== '') { + break; + } + } + if (!matched) { + ret.direction = 'auto'; + } + return normalizeAngle(ret, unit); + } + + function normalizeAngle(input, unit) { + let { angle } = input; + if (angle === '') { + angle = 0; + } + if (unit === 'rad') { + angle /= (Math.PI / 180); + } + if (unit === 'grad') { + angle *= .9; + } + if (unit === 'turn') { + angle *= 360; + } + return Object.assign({}, input, { angle }); + } + + function parse$3(input) { + let iter = iterator$1(scan(input)); + let ret = {}; + let matched = false; + while (iter.next()) { + let { prev, curr } = iter.get(); + if (curr.isNumber()) { + ret.value = Number(curr.value); + matched = true; + } + else if (matched && curr.isWord() && prev && prev.isNumber()) { + ret.unit = curr.value; + } else { + break; + } + } + return ret; + } + + const { cos, sin, abs, atan2, PI } = Math; const _ = make_tag_function(c => { return create_shape_points( - parse$4(c), {min: 3, max: 3600} + parse$6(c), {min: 3, max: 3600} ); }); @@ -2090,6 +2263,20 @@ }, }; + class Point { + constructor(x, y, angle) { + this.x = x; + this.y = y; + this.extra = angle; + } + valueOf() { + return this.x + ' ' + this.y; + } + toString() { + return this.valueOf(); + } + } + function create_polygon_points(option, fn) { if (typeof arguments[0] == 'function') { fn = option; @@ -2104,25 +2291,37 @@ let turn = option.turn || 1; let frame = option.frame; let fill = option['fill'] || option['fill-rule']; + let direction = parse$4(option['direction'] || option['dir'] || ''); + let unit = option.unit; let rad = (PI * 2) * turn / split; let points = []; let first_point, first_point2; - if (fill == 'nonzero' || fill == 'evenodd') { - points.push(fill); - } - let factor = (option.scale === undefined) ? 1 : option.scale; - let add = ([x1, y1]) => { + let add = ([x1, y1, dx = 0, dy = 0]) => { + if (x1 == 'evenodd' || x1 == 'nonzero') { + return points.push(new Point(x1, '', '')); + } let [x, y] = scale(x1, -y1, factor); - if (!option.absolute) { + let [dx1, dy2] = scale(dx, -dy, factor); + let angle = calc_angle(x, y, dx1, dy2, direction); + if (unit !== undefined && unit !== '%') { + if (unit !== 'none') { + x += unit; + y += unit; + } + } else { x = (x + 1) * 50 + '%'; y = (y + 1) * 50 + '%'; } - points.push(x + ' ' + y); + points.push(new Point(x, y, angle)); }; + if (fill == 'nonzero' || fill == 'evenodd') { + add([fill, '', '']); + } + for (let i = 0; i < split; ++i) { let t = rad * i; let point = fn(t, i); @@ -2153,6 +2352,20 @@ return points; } + function calc_angle(x, y, dx, dy, option) { + let base = atan2(y + dy, x - dx) * 180 / PI; + if (option.direction === 'reverse') { + base -= 180; + } + if (!option.direction) { + base = 90; + } + if (option.angle) { + base += option.angle; + } + return base; + } + function rotate(x, y, deg) { let rad = -PI / 180 * deg; return [ @@ -2162,7 +2375,7 @@ } function translate(x, y, offset) { - let [dx, dy = dx] = String(offset).split(/[,\s]+/).map(Number); + let [dx, dy = dx] = parse$5(offset).map(Number); return [ x + (dx || 0), y - (dy || 0), @@ -2172,7 +2385,7 @@ } function scale(x, y, factor) { - let [fx, fy = fx] = String(factor).split(/[,\s]+/).map(Number); + let [fx, fy = fx] = parse$5(factor).map(Number); return [ x * fx, y * fy @@ -2181,11 +2394,18 @@ function create_shape_points(props, {min, max}) { let split = clamp(parseInt(props.vertices || props.points || props.split) || 0, min, max); - let option = Object.assign({}, props, { split }); let px = is_empty(props.x) ? 'cos(t)' : props.x; let py = is_empty(props.y) ? 'sin(t)' : props.y; let pr = is_empty(props.r) ? '' : props.r; + let { unit, value } = parse$3(pr); + if (unit && !props[unit] && unit !== 't') { + if (is_empty(props.unit)) { + props.unit = unit; + } + pr = props.r = value; + } + if (props.degree) { props.rotate = props.degree; } @@ -2194,6 +2414,8 @@ props.move = props.origin; } + let option = Object.assign({}, props, { split }); + return create_polygon_points(option, (t, i) => { let context = Object.assign({}, props, { 't': t, @@ -2206,7 +2428,7 @@ a = Number(a) || 0; b = Number(b) || 0; if (a > b) [a, b] = [b, a]; - let step = Math.abs(b - a) / (split - 1); + let step = abs(b - a) / (split - 1); return a + step * i; } }); @@ -2216,8 +2438,8 @@ let dy = 0; if (pr) { let r = calc(pr, context); - x = r * Math.cos(t); - y = r * Math.sin(t); + x = r * cos(t); + y = r * sin(t); } if (props.rotate) { [x, y] = rotate(x, y, Number(props.rotate) || 0); @@ -2229,58 +2451,6 @@ }); } - function parse$3(input, noSpace) { - let group = []; - let tokens = []; - let parenStack = []; - let quoteStack = []; - - if (is_empty(input)) { - return group; - } - - let iter = iterator$1(scan(input)); - - function isSeperator(token) { - if (noSpace) { - return token.isSymbol(','); - } - return token.isSymbol(',') || token.isSpace(); - } - - while (iter.next()) { - let { prev, curr, next } = iter.get(); - if (curr.isSymbol('(')) { - parenStack.push(curr.value); - } - if (curr.isSymbol(')')) { - parenStack.pop(); - } - if (curr.status === 'open') { - quoteStack.push(curr.value); - } - if (curr.status === 'close') { - quoteStack.pop(); - } - if (isSeperator(curr) && !parenStack.length && !quoteStack.length) { - group.push(joinTokens(tokens)); - tokens = []; - } else { - tokens.push(curr); - } - } - - if (tokens.length) { - group.push(joinTokens(tokens)); - } - - return group; - } - - function joinTokens(tokens) { - return tokens.map(n => n.value).join(''); - } - function readStatement$1(iter, token) { let fragment = []; while (iter.next()) { @@ -2499,39 +2669,39 @@ function get_exposed(random) { const { shuffle } = List(random); - const { pick, rand, nrand, unique_id } = random_func(random); + const { pick, rand, lerp, unique_id } = Random(random); const Expose = { - index({ count }) { + i({ count }) { return _ => count; }, - row({ y }) { + y({ y }) { return _ => y; }, - col({ x }) { + x({ x }) { return _ => x; }, - depth({ z }) { + z({ z }) { return _ => z; }, - size({ grid }) { + I({ grid }) { return _ => grid.count; }, - ['size-row']({ grid }) { + Y({ grid }) { return _ => grid.y; }, - ['size-col']({ grid }) { + X({ grid }) { return _ => grid.x; }, - ['size-depth']({ grid }) { + Z({ grid }) { return _ => grid.z; }, @@ -2555,25 +2725,25 @@ return n => extra ? (extra[3] + (Number(n) || 0)) : '@N'; }, - repeat: ( + µ: ( make_sequence('') ), - multiple: ( + m: ( make_sequence(',') ), - ['multiple-with-space']: ( + M: ( make_sequence(' ') ), - pick({ context }) { + p({ context }) { return expand((...args) => { return push_stack(context, 'last_pick', pick(args)); }); }, - ['pick-n']({ context, extra, position }) { + pn({ context, extra, position }) { let counter = 'pn-counter' + position; return expand((...args) => { if (!context[counter]) context[counter] = 0; @@ -2586,14 +2756,14 @@ }); }, - ['pick-d']({ context, extra, position }) { + pd({ context, extra, position }) { let counter = 'pd-counter' + position; let values = 'pd-values' + position; return expand((...args) => { if (!context[counter]) context[counter] = 0; context[counter] += 1; if (!context[values]) { - context[values] = shuffle(args); + context[values] = shuffle(args || []); } let max = args.length; let [idx = context[counter]] = extra || []; @@ -2603,14 +2773,14 @@ }); }, - ['last-pick']({ context }) { + lp({ context }) { return (n = 1) => { let stack = context.last_pick; return stack ? stack.last(n) : ''; }; }, - rand({ context }) { + r({ context }) { return (...args) => { let transform_type = args.every(is_letter) ? by_charcode @@ -2620,17 +2790,7 @@ }; }, - nrand({ context }) { - return (...args) => { - let transform_type = args.every(is_letter) - ? by_charcode - : by_unit; - let value = transform_type(nrand).apply(null, args); - return push_stack(context, 'last_rand', value); - }; - }, - - ['rand-int']({ context }) { + ri({ context }) { return (...args) => { let transform_type = args.every(is_letter) ? by_charcode @@ -2641,24 +2801,57 @@ } }, - ['nrand-int']({ context }) { + rn({ x, y, context, position, grid, extra }) { + let counter = 'noise-2d' + position; + let [ni, nx, ny, nm, NX, NY] = extra || []; + let isSeqContext = (ni && nm); return (...args) => { - let transform_type = args.every(is_letter) - ? by_charcode - : by_unit; - let nrand_int = (...args) => Math.round(nrand(...args)); - let value = transform_type(nrand_int).apply(null, args); + let [start, end = start, freq = 1, amp = 1] = args; + if (args.length == 1) { + [start, end] = [0, start]; + } + if (!context[counter]) { + context[counter] = new Perlin(random); + } + freq = normalize(freq); + amp = normalize(amp); + let transform = [start, end].every(is_letter) ? by_charcode : by_unit; + let t = isSeqContext + ? context[counter].noise((nx - 1)/NX * freq, (ny - 1)/NY * freq, 0) + : context[counter].noise((x - 1)/grid.x * freq, (y - 1)/grid.y * freq, 0); + let fn = transform((start, end) => map2d(t * amp, start, end, amp)); + let value = fn(start, end); return push_stack(context, 'last_rand', value); - } + }; }, - ['last-rand']({ context }) { + lr({ context }) { return (n = 1) => { let stack = context.last_rand; return stack ? stack.last(n) : ''; }; }, + noise({ context, grid, position, ...rest }) { + let vars = { + i: rest.count, I: grid.count, + x: rest.x, X: grid.x, + y: rest.y, Y: grid.y, + z: rest.z, Z: grid.z, + }; + return (x, y, z = 0) => { + let counter = 'raw-noise-2d' + position; + if (!context[counter]) { + context[counter] = new Perlin(random); + } + return context[counter].noise( + calc(x, vars), + calc(y, vars), + calc(z, vars) + ); + }; + }, + stripe() { return (...input) => { let colors = input.map(get_value); @@ -2670,7 +2863,7 @@ return ''; } colors.forEach(step => { - let [_, size] = parse$3(step); + let [_, size] = parse$5(step); if (size !== undefined) custom_sizes.push(size); else default_count += 1; }); @@ -2679,7 +2872,7 @@ : `100% / ${max}`; return colors.map((step, i) => { if (custom_sizes.length) { - let [color, size] = parse$3(step); + let [color, size] = parse$5(step); let prefix = prev ? (prev + ' + ') : ''; prev = prefix + (size !== undefined ? size : default_size); return `${color} 0 calc(${ prev })` @@ -2690,15 +2883,6 @@ } }, - reflect() { - return (...input) => { - return [ - ...input, - ...input.slice(0, -1).reverse() - ].join(','); - } - }, - calc() { return value => calc(get_value(value)); }, @@ -2717,7 +2901,7 @@ return create_svg_url(svg); }), - ['svg-filter']: lazy((...args) => { + filter: lazy((...args) => { let value = args.map(input => get_value(input()).trim()).join(','); let id = unique_id('filter-'); if (!value.startsWith('<')) { @@ -2747,7 +2931,10 @@ return commands => { let [idx = count, _, __, max = grid.count] = extra || []; if (!context[key]) { - let config = parse$4(commands); + let config = parse$6(commands); + delete config['fill']; + delete config['fill-rule']; + delete config['frame']; config.points = max; context[key] = create_shape_points(config, {min: 1, max: 65536}); } @@ -2755,20 +2942,6 @@ }; }, - Plot({ count, context, extra, position, grid }) { - let key = 'offset-points' + position; - return commands => { - let [idx = count, _, __, max = grid.count] = extra || []; - if (!context[key]) { - let config = parse$4(commands); - config.points = max; - config.absolute = true; - context[key] = create_shape_points(config, {min: 1, max: 65536}); - } - return context[key][idx - 1]; - }; - }, - shape() { return memo('shape-function', (type = '', ...args) => { type = String(type).trim(); @@ -2782,7 +2955,7 @@ if (rest.length) { commands = type + ',' + rest; } - let config = parse$4(commands); + let config = parse$6(commands); points = create_shape_points(config, {min: 3, max: 3600}); } } @@ -2806,10 +2979,6 @@ return value => value; }, - path() { - return value => value; - }, - invert() { return commands => { let parsed = parse$1(commands); @@ -2903,61 +3072,61 @@ return -1 * num; } + function map2d(value, min, max, amp = 1) { + let dimention = 2; + let v = Math.sqrt(dimention / 4) * amp; + let [ma, mb] = [-v, v]; + return lerp((value - ma) / (mb - ma), min * amp, max * amp); + } + + function normalize(value) { + value = Number(value) || 0; + return value < 0 ? 0 : value; + } + return alias_for(Expose, { - 'm': 'multiple', - 'M': 'multiple-with-space', - - 'r': 'rand', - 'rn': 'nrand', - 'ri': 'rand-int', - 'rni': 'nrand-int', - 'lr': 'last-rand', - - 'p': 'pick', - 'pn': 'pick-n', - 'pd': 'pick-d', - 'lp': 'last-pick', - - 'rep': 'repeat', - - 'i': 'index', - 'x': 'col', - 'y': 'row', - 'z': 'depth', - - 'I': 'size', - 'X': 'size-col', - 'Y': 'size-row', - 'Z': 'size-depth', - - 'flipv': 'flipV', - 'fliph': 'flipH', - - // legacy names, keep them before 1.0 - 'nr': 'rn', - 'nri': 'nri', - 'ms': 'multiple-with-space', - 's': 'size', - 'sx': 'size-col', - 'sy': 'size-row', - 'sz': 'size-depth', - 'size-x': 'size-col', - 'size-y': 'size-row', - 'size-z': 'size-depth', - 'multi': 'multiple', - 'pick-by-turn': 'pick-n', - 'max-row': 'size-row', - 'max-col': 'size-col', - 'offset': 'plot', - 'Offset': 'Plot', - 'point': 'plot', - 'Point': 'Plot', - 'paint': 'canvas', + 'index': 'i', + 'col': 'x', + 'row': 'y', + 'depth': 'z', + 'rand': 'r', + 'pick': 'p', // error prone 'stripes': 'stripe', 'strip': 'stripe', 'patern': 'pattern', + 'flipv': 'flipV', + 'fliph': 'flipH', + + // legacy names, keep them before 1.0 + 'svg-filter': 'filter', + 'last-rand': 'lr', + 'last-pick': 'lp', + 'multiple': 'm', + 'multi': 'm', + 'rep': 'µ', + 'repeat': 'µ', + 'ms': 'M', + 's': 'I', + 'size': 'I', + 'sx': 'X', + 'size-x': 'X', + 'size-col': 'X', + 'max-col': 'X', + 'sy': 'Y', + 'size-y': 'Y', + 'size-row': 'Y', + 'max-row': 'Y', + 'sz': 'Z', + 'size-z': 'Z', + 'size-depth': 'Z', + 'pick-by-turn': 'pn', + 'offset': 'plot', + 'Offset': 'Plot', + 'point': 'plot', + 'Point': 'Plot', + 'paint': 'canvas', }); } @@ -3087,10 +3256,10 @@ return !!presets[name]; } - var Property = { + const Expose = { ['@size'](value, { is_special_selector, grid }) { - let [w, h = w] = parse$3(value); + let [w, h = w] = parse$5(value); if (is_preset(w)) { [w, h] = get_preset(w, h); } @@ -3111,17 +3280,7 @@ return styles; }, - ['@min-size'](value) { - let [w, h = w] = parse$3(value); - return `min-width: ${ w }; min-height: ${ h };`; - }, - - ['@max-size'](value) { - let [w, h = w] = parse$3(value); - return `max-width: ${ w }; max-height: ${ h };`; - }, - - ['@place-cell']: (() => { + ['@offset']: (() => { let map_left_right = { 'center': '50%', 'left': '0%', 'right': '100%', @@ -3133,8 +3292,8 @@ 'left': '50%', 'right': '50%', }; - return value => { - let [left, top = '50%'] = parse$3(value); + return (value, { extra }) => { + let [left, top = '50%'] = parse$5(value); left = map_left_right[left] || left; top = map_top_bottom[top] || top; const cw = 'var(--internal-cell-width, 25%)'; @@ -3148,6 +3307,8 @@ margin-left: calc(${ cw } / -2); margin-top: calc(${ ch } / -2); grid-area: unset; + --plot-angle: ${ extra || 0 }; + transform: rotate(${ extra || 0 }deg); `; } })(), @@ -3162,7 +3323,7 @@ }, ['@shape']: memo('shape-property', value => { - let [type, ...args] = parse$3(value); + let [type, ...args] = parse$5(value); let prop = 'clip-path'; if (typeof shapes[type] !== 'function') return ''; let points = shapes[type](...args); @@ -3178,6 +3339,13 @@ }; + var Property = alias_for(Expose, { + + // legacy names. + '@place-cell': '@offset', + + }); + function nth(input, curr, max) { for (let i = 0; i <= max; ++i) { if (calc(input, { n: i }) == curr) return true; @@ -3280,35 +3448,6 @@ return expose; }, {}); - const initial = { - length: '0px', - number: 0, - color: 'black', - url: 'url()', - image: 'url()', - integer: 0, - angle: '0deg', - time: '0ms', - resolution: '0dpi', - percentage: '0%', - 'length-percentage': '0%', - 'transform-function': 'translate(0)', - 'transform-list': 'translate(0)', - 'custom-ident': '_' - }; - - function get_definition(name) { - let type = String(name).substr(2).split('-')[0]; - if (initial[type] !== undefined) { - return { - name: name, - syntax: `<${type}> | <${type}>+ | <${type}>#`, - initialValue: initial[type], - inherits: false - } - } - } - let { join, make_array, remove_empty_values } = List(); function is_host_selector(s) { @@ -3337,13 +3476,12 @@ this.canvas = {}; this.pattern = {}; this.shaders = {}; - this.paths = {}; this.reset(); this.Func = get_exposed(random); this.Selector = Selector(random); this.custom_properties = {}; this.uniforms = {}; - this.unique_id = random_func(random).unique_id; + this.unique_id = Random(random).unique_id; } reset() { @@ -3383,9 +3521,8 @@ args.forEach(arg => { let type = typeof arg.value; let is_string_or_number = (type === 'number' || type === 'string'); - if (!arg.cluster && (is_string_or_number)) { - input.push(...parse$3(arg.value, true)); + input.push(...parse$5(arg.value, true)); } else { if (typeof arg === 'function') { @@ -3450,9 +3587,6 @@ : this.compose_argument(n, coords, extra); }); let value = this.apply_func(fn, coords, args); - if (fname == 'path') { - return this.compose_path(value); - } return value; } } @@ -3499,20 +3633,15 @@ return '${' + id + '}'; } - compose_path(commands) { - let id = this.unique_id('path'); - this.paths[id] = { - id, - commands - }; - return '${' + id + '}'; - } - compose_value(value, coords) { if (!Array.isArray(value)) { - return ''; + return { + value: '', + extra: '', + } } - return value.reduce((result, val) => { + let extra = ''; + let output = value.reduce((result, val) => { switch (val.type) { case 'text': { result += val.value; @@ -3549,11 +3678,10 @@ let output = this.apply_func(fn, coords, args); if (!is_nil(output)) { - if (fname == 'path') { - result += this.compose_path(output); - } else { - result += output; - } + result += output; + } + if (output.extra) { + extra = output.extra; } } } @@ -3561,14 +3689,27 @@ } return result; }, ''); + + return { + value: output, + extra: extra, + } } compose_rule(token, _coords, selector) { let coords = Object.assign({}, _coords); let prop = token.property; + let extra; let value_group = token.value.reduce((ret, v) => { let composed = this.compose_value(v, coords); - if (composed) ret.push(composed); + if (composed) { + if (composed.value) { + ret.push(composed.value); + } + if (composed.extra) { + extra = composed.extra; + } + } return ret; }, []); @@ -3607,7 +3748,7 @@ } if (prop === 'content') { - if (!/["']|^none$|^(var|counter|counters|attr)\(/.test(value)) { + if (!/["']|^none$|^(var|counter|counters|attr|url)\(/.test(value)) { value = `'${ value }'`; } } @@ -3641,7 +3782,8 @@ if (Property[prop]) { let transformed = Property[prop](value, { is_special_selector: is_special_selector(selector), - grid: coords.grid + grid: coords.grid, + extra }); switch (prop) { case '@grid': { @@ -3691,7 +3833,7 @@ case '@grid': { let value_group = token.value.reduce((ret, v) => { let composed = this.compose_value(v, coords); - if (composed) ret.push(composed); + if (composed && composed.value) ret.push(composed.value); return ret; }, []); let value = value_group.join(', '); @@ -3842,24 +3984,14 @@ }); }); - let definitions = []; - Object.keys(this.custom_properties).forEach(name => { - let def = get_definition(name); - if (def) { - definitions.push(def); - } - }); - return { props: this.props, styles: this.styles, grid: this.grid, doodles: this.doodles, shaders: this.shaders, - paths: this.paths, canvas: this.canvas, pattern: this.pattern, - definitions: definitions, uniforms: this.uniforms } } @@ -4617,7 +4749,7 @@ let { x: gx, y: gy, z: gz } = this.grid_size; const compiled = this.generate( - parse$6(use + styles, this.extra) + parse$8(use + styles, this.extra) ); if (!this.shadowRoot.innerHTML) { @@ -4639,20 +4771,12 @@ if (gx !== x || gy !== y || gz !== z) { Object.assign(this.grid_size, grid); return this.build_grid( - this.generate(parse$6(use + styles, this.extra)), + this.generate(parse$8(use + styles, this.extra)), grid ); } } - let svg_paths = this.build_svg_paths(compiled.paths); - if (svg_paths) { - let defs = this.shadowRoot.querySelector('.svg-defs'); - if (defs) { - defs.innerHTML = svg_paths; - } - } - if (compiled.uniforms.time) { this.register_uniform_time(); } @@ -4758,12 +4882,11 @@ fn = options; options = null; } - let parsed = parse$6(code, this.extra); + let parsed = parse$8(code, this.extra); let _grid = parse_grid({}); let compiled = generator(parsed, _grid, this.random); let grid = compiled.grid ? compiled.grid : _grid; const { keyframes, host, container, cells } = compiled.styles; - let svg_defs = this.build_svg_paths(compiled.paths); let replace = this.replace(compiled); let grid_container = create_grid(grid); @@ -4784,9 +4907,7 @@ ${ cells } ${ keyframes } - - ${ svg_defs } - + ${ grid_container } @@ -4810,7 +4931,7 @@ } shader_to_image({ shader, cell }, fn) { - let parsed = parse$5(shader); + let parsed = parse$7(shader); let element = this.doodle.getElementById(cell); let { width, height } = element && element.getBoundingClientRect() || { width: 0, height: 0 @@ -4847,7 +4968,7 @@ } } let use = this.get_use(); - let parsed = parse$6(use + un_entity(this.innerHTML), this.extra); + let parsed = parse$8(use + un_entity(this.innerHTML), this.extra); let compiled = this.generate(parsed); this.grid_size = compiled.grid @@ -4857,13 +4978,12 @@ this.build_grid(compiled, this.grid_size); } - replace({ doodles, shaders, paths, canvas, pattern }) { + replace({ doodles, shaders, canvas, pattern }) { let doodle_ids = Object.keys(doodles); let shader_ids = Object.keys(shaders); - let path_ids = Object.keys(paths); let canvas_ids = Object.keys(canvas); let pattern_ids = Object.keys(pattern); - let length = doodle_ids.length + canvas_ids.length + shader_ids.length + path_ids.length + pattern_ids.length; + let length = doodle_ids.length + canvas_ids.length + shader_ids.length + pattern_ids.length; return input => { if (!length) { return Promise.resolve(input); @@ -4905,13 +5025,6 @@ return Promise.resolve(''); } }), - path_ids.map(id => { - if (input.includes(id)) { - return Promise.resolve({ id, value: '#' + id }); - } else { - return Promise.resolve(''); - } - }) ); return Promise.all(mappings).then(mapping => { @@ -4942,7 +5055,6 @@ const { keyframes, host, container, cells } = compiled.styles; let style_container = get_grid_styles(grid) + host + container; let style_cells = has_delay ? '' : cells; - let svg_defs = this.build_svg_paths(compiled.paths); const { uniforms } = compiled; @@ -4953,9 +5065,7 @@ - - ${ svg_defs } - + ${ create_grid(grid) } `; @@ -4970,26 +5080,15 @@ } // might be removed in the future - const definitions = compiled.definitions; if (window.CSS && window.CSS.registerProperty) { try { if (uniforms.time) { this.register_uniform_time(); } - definitions.forEach(CSS.registerProperty); } catch (e) { } } } - build_svg_paths(paths) { - let names = Object.keys(paths || {}); - return names.map(name => ` - - - - `).join(''); - } - register_uniform_time() { if (!this.is_uniform_time_registered) { try { diff --git a/css-doodle.min.js b/css-doodle.min.js index b597d6f..b294a31 100644 --- a/css-doodle.min.js +++ b/css-doodle.min.js @@ -1 +1 @@ -/*! css-doodle@0.23.1 */!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).CSSDoodle=t()}(this,(function(){"use strict";const e=[":",";",",","(",")","[","]","{","}","\u03c0","\xb1","+","-","*","/","%",'"',"'","`","@"],t={escape:e=>"\\"==e,space:e=>/[\r\n\t\s]/.test(e),digit:e=>/^[0-9]$/.test(e),sign:e=>/^[+-]$/.test(e),dot:e=>"."==e,quote:e=>/^["'`]$/.test(e),symbol:t=>e.includes(t),hexNum:e=>/^[0-9a-f]$/i.test(e),hex:(e,n,r)=>"0"==e&&t.letter(n,"x")&&t.hexNum(r),expWithSign:(e,n,r)=>t.letter(e,"e")&&t.sign(n)&&t.digit(r),exp:(e,n)=>t.letter(e,"e")&&t.digit(n),dots:(e,n)=>t.dot(e)&&t.dot(n),letter:(e,t)=>String(e).toLowerCase()==String(t).toLowerCase(),comment:(e,t)=>"/"==e&&"*"==t,selfClosedTag:(e,t)=>"/"==e&&">"==t,closedTag:(e,t)=>"<"==e&&"/"==t};class n{constructor({type:e,value:t,pos:n,status:r}){this.type=e,this.value=t,this.pos=n,r&&(this.status=r)}isSymbol(...e){let t="Symbol"==this.type;return e.length?e.some((e=>e===this.value)):t}isSpace(){return"Space"==this.type}isNumber(){return"Number"==this.type}isWord(){return"Word"==this.type}}function r(e){let t=-1,n=e.length,r=-1,i=0;return{curr:(n=0)=>e[t+n],next(n=1){let s=e[t+=n];return"\n"==s?(i++,r=0):r+=n,s},end:()=>t>=n,get:()=>({prev:e[t-1],curr:e[t+0],next:e[t+1],next2:e[t+2],next3:e[t+3],pos:[r,i]})}}function i(e){for(;e.next();){let{curr:n,prev:r}=e.get();if(t.comment(n,r))break}}function s(e){return[":",";",",","{","}","(",")","[","]"].includes(e)}function l(e){let n="";for(;!e.end();){let{curr:r,next:i}=e.get();n+=r;let s=t.symbol(i)||t.space(i)||t.digit(i);if(n.length&&s&&!t.closedTag(r,i))break;e.next()}return n.trim()}function o(e){let n="";for(;!e.end();){let{curr:r,next:i}=e.get();if(n+=r,!t.space(i))break;e.next()}return n}function a(e){let n="",r=!1;for(;!e.end();){let{curr:i,next:s,next2:l,next3:o}=e.get();if(n+=i,r&&t.dot(s))break;if(t.dot(i)&&(r=!0),t.dots(s,l))break;if(t.expWithSign(s,l,o))n+=e.next()+e.next();else if(t.exp(s,l))n+=e.next();else if(!t.digit(s)&&!t.dot(s))break;e.next()}return n}function u(e){let n="0x";for(e.next(2);!e.end();){let{curr:r,next:i}=e.get();if(n+=r,!t.hexNum(i))break;e.next()}return n}function c(e){return e[e.length-1]}function h(e){let h=r(String(e).trim()),p=[],f=[];for(;h.next();){let{prev:e,curr:r,next:d,next2:m,pos:g}=h.get();if(t.comment(r,d))i(h);else if(t.hex(r,d,m)){let e=u(h);p.push(new n({type:"Number",value:e,pos:g}))}else if(t.digit(r)||t.digit(d)&&t.dot(r)&&!t.dots(e,r)){let e=a(h);p.push(new n({type:"Number",value:e,pos:g}))}else if(t.symbol(r)&&!t.selfClosedTag(r,d)){let e=c(p);if("-"===r&&t.digit(d)&&(!e||!e.isNumber())){let e=a(h);p.push(new n({type:"Number",value:e,pos:g}));continue}let i={type:"Symbol",value:r,pos:g};if(f.length&&t.escape(e.value)){p.pop();let e=l(h);e.length&&p.push(new n({type:"Word",value:e,pos:g}))}else{if(t.quote(r)){c(f)==r?(f.pop(),i.status="close"):(f.push(r),i.status="open")}p.push(new n(i))}}else if(t.space(r)){let e=o(h),t=c(p),{next:r}=h.get();if(!f.length&&t){if(s(t.value)||s(r))continue;e=" "}p.length&&r&&r.trim()&&p.push(new n({type:"Space",value:e,pos:g}))}else{let e=l(h);e.length&&p.push(new n({type:"Word",value:e,pos:g}))}}let d=c(p);return d&&d.isSpace()&&(p.length=p.length-1),p}function p(e){let t=[];for(;e.next();){let{curr:n,next:r}=e.get();if("var"===n.value){if(r&&r.isSymbol("(")){e.next();let n=f(e);m(n.name)&&t.push(n)}}else if(t.length&&!n.isSymbol(","))break}return t}function f(e){let t={},n=[];for(;e.next();){let{curr:r,next:i}=e.get();if(r.isSymbol(")",";")&&!t.name){t.name=d(n);break}r.isSymbol(",")?(void 0===t.name&&(t.name=d(n),n=[]),t.name&&(t.fallback=p(e))):n.push(r)}return t}function d(e){return e.map((e=>e.value)).join("")}function m(e){return void 0!==e&&(!(e.length<=2)&&(!e.substr(2).startsWith("-")&&!!e.startsWith("--")))}function g(e){return{make_array:function(e){return Array.isArray(e)?e:[e]},join:function(e,t="\n"){return(e||[]).join(t)},last:function(e,t=1){return e[e.length-t]},first:function(e){return e[0]},clone:function(e){return JSON.parse(JSON.stringify(e))},shuffle:function(t){let n=Array.from?Array.from(t):t.slice(),r=t.length;for(;r;){let t=~~(e()*r--),i=n[r];n[r]=n[t],n[t]=i}return n},flat_map:function(e,t){return Array.prototype.flatMap?e.flatMap(t):e.reduce(((e,n)=>e.concat(t(n))),[])},remove_empty_values:function(e){return e.filter((e=>null!=e&&String(e).trim().length))}}}let{first:y,last:v,clone:x}=g();const b={func:(e="")=>({type:"func",name:e,arguments:[]}),argument:()=>({type:"argument",value:[]}),text:(e="")=>({type:"text",value:e}),pseudo:(e="")=>({type:"pseudo",selector:e,styles:[]}),cond:(e="")=>({type:"cond",name:e,styles:[],arguments:[]}),rule:(e="")=>({type:"rule",property:e,value:[]}),keyframes:(e="")=>({type:"keyframes",name:e,steps:[]}),step:(e="")=>({type:"step",name:e,styles:[]})},_={white_space:e=>/[\s\n\t]/.test(e),line_break:e=>/\n/.test(e),number:e=>!isNaN(e),pair:e=>['"',"(",")","'"].includes(e),pair_of:(e,t)=>({'"':'"',"'":"'","(":")"}[e]==t)},w={\u03c0:Math.PI,"\u220f":Math.PI};function $(e){return["@canvas","@shaders","@doodle"].includes(e)}function k(e,{col:t,line:n}){console.warn(`(at line ${n}, column ${t}) ${e}`)}function S(e){return function(t,n){let r=t.index(),i="";for(;!t.end();){let n=t.next();if(e(n))break;i+=n}return n&&t.index(r),i}}function j(e,t){return S((e=>/[^\w@]/.test(e)))(e,t)}function E(e){return S((e=>/[\s\{]/.test(e)))(e)}function z(e,t){return S((e=>_.line_break(e)||"{"==e))(e,t)}function T(e,t){let n,r=b.step();for(;!e.end()&&"}"!=(n=e.curr());)if(_.white_space(n))e.next();else{if(r.name.length){if(r.styles.push(q(e,t)),"}"==e.curr())break}else r.name=W(e);e.next()}return r}function P(e,t){const n=[];let r;for(;!e.end()&&"}"!=(r=e.curr());)_.white_space(r)||n.push(T(e,t)),e.next();return n}function A(e,t){let n,r=b.keyframes();for(;!e.end()&&"}"!=(n=e.curr());)if(r.name.length){if("{"==n){e.next(),r.steps=P(e,t);break}e.next()}else if(j(e),r.name=E(e),!r.name.length){k("missing keyframes name",e.info());break}return r}function R(e,t={}){for(e.next();!e.end();){let n=e.curr();if(t.inline){if("\n"==n)break}else if("*"==(n=e.curr())&&"/"==e.curr(1))break;e.next()}t.inline||(e.next(),e.next())}function C(e){for(e.next();!e.end();){if(">"==e.curr())break;e.next()}}function M(e){let t,n="";for(;!e.end()&&":"!=(t=e.curr());)_.white_space(t)||(n+=t),e.next();return n}function N(e,t,n){let r,i=[],s=[],l=[],o="";for(;!e.end();){if(r=e.curr(),/[\('"`]/.test(r)&&"\\"!==e.curr(-1))l.length&&"("!=r&&r===v(l)?l.pop():l.push(r),o+=r;else if("@"!=r||n)if(n&&/[)]/.test(r)||!n&&/[,)]/.test(r))if(l.length)")"==r&&l.pop(),o+=r;else{if(o.length&&(s.length?s.push(b.text(o)):s.push(b.text((a=o).trim().length?_.number(+a)?+a:a.trim():a)),o.startsWith("\xb1")&&!n)){let e=o.substr(1),t=x(s);v(t).value="-"+e,i.push(L(t)),v(s).value=e}if(i.push(L(s)),[s,o]=[[],""],")"==r)break}else w[r]&&!/[0-9]/.test(e.curr(-1))&&(r=w[r]),o+=r;else s.length||(o=o.trimLeft()),o.length&&(s.push(b.text(o)),o=""),s.push(O(e));if(!(!t||")"!=e.curr(1)&&/[0-9a-zA-Z_\-.]/.test(e.curr())||l.length)){s.length&&i.push(L(s));break}e.next()}var a;return i}function L(e){let t=e.map((e=>{if("text"==e.type&&"string"==typeof e.value){let t=String(e.value);t.includes("`")&&(e.value=t=t.replace(/`/g,'"')),e.value=t}return e})),n=y(t)||{},r=v(t)||{};if("text"==n.type&&"text"==r.type){let e=y(n.value),i=v(r.value);"string"==typeof n.value&&"string"==typeof r.value&&_.pair_of(e,i)&&(n.value=n.value.slice(1),r.value=r.value.slice(0,r.value.length-1),t.cluster=!0)}return t}function O(e){let t,n=b.func(),r="@",i=!1;for(e.next();!e.end();){t=e.curr();let s="."==t&&"@"==e.curr(1),l=e.curr(1);if("("==t||s){i=!0,e.next(),n.arguments=N(e,s,$(r));break}if(!i&&"("!==l&&!/[0-9a-zA-Z_\-.]/.test(l)){r+=t;break}r+=t,e.next()}let{fname:s,extra:l}=function(e){let t="",n="";if(/\D$/.test(e)&&!/\d+x\d+/.test(e)||Math[e.substr(1)])return{fname:e,extra:n};for(let r=e.length-1;r>=0;r--){let i=e[r],s=e[r-1],l=e[r+1];if(!(/[\d.]/.test(i)||"x"==i&&/\d/.test(s)&&/\d/.test(l))){t=e.substring(0,r+1);break}n=i+n}return{fname:t,extra:n}}(r);return n.name=s,l.length&&n.arguments.unshift([{type:"text",value:l}]),n.position=e.info().index,n}function I(e){let t,n=b.text(),r=0,i=!0;const s=[],l=[];for(s[r]=[];!e.end();)if(t=e.curr(),i&&_.white_space(t))e.next();else{if(i=!1,"\n"!=t||_.white_space(e.curr(-1)))if(","!=t||l.length){if(/[;}<]/.test(t)){n.value.length&&(s[r].push(n),n=b.text());break}"@"==t?(n.value.length&&(s[r].push(n),n=b.text()),s[r].push(O(e))):_.white_space(t)&&_.white_space(e.curr(-1))||("("==t&&l.push(t),")"==t&&l.pop(),w[t]&&!/[0-9]/.test(e.curr(-1))&&(t=w[t]),n.value+=t)}else n.value.length&&(s[r].push(n),n=b.text()),s[++r]=[],i=!0;else n.value+=" ";e.next()}return n.value.length&&s[r].push(n),s}function W(e){let t,n="";for(;!e.end()&&"{"!=(t=e.curr());)_.white_space(t)||(n+=t),e.next();return n}function U(e){let t,n={name:"",arguments:[]};for(;!e.end();){if("("==(t=e.curr()))e.next(),n.arguments=N(e);else{if(/[){]/.test(t))break;_.white_space(t)||(n.name+=t)}e.next()}return n}function D(e,t){let n,r=b.pseudo();for(;!e.end()&&"}"!=(n=e.curr());)if(_.white_space(n))e.next();else{if(r.selector){let n=q(e,t);if("@use"==n.property?r.styles=r.styles.concat(n.value):r.styles.push(n),"}"==e.curr())break}else r.selector=W(e);e.next()}return r}function q(e,t){let n=b.rule();for(;!e.end()&&";"!=e.curr();){if(n.property.length){n.value=I(e);break}if(n.property=M(e),"@use"==n.property){n.value=X(e,t);break}e.next()}return n}function H(e,t){let n,r=b.cond();for(;!e.end()&&"}"!=(n=e.curr());){if(r.name.length)if(":"==n){let t=D(e);t.selector&&r.styles.push(t)}else if("@"!=n||z(e,!0).includes(":")){if(!_.white_space(n)){let n=q(e,t);if(n.property&&r.styles.push(n),"}"==e.curr())break}}else r.styles.push(H(e));else Object.assign(r,U(e));e.next()}return r}function B(e,t){let n="";return e&&e.get_variable&&(n=e.get_variable(t)),n}function F(e,t){e.forEach&&e.forEach((e=>{if("text"==e.type&&e.value){let n=p(r(h(e.value)));e.value=n.reduce(((e,n)=>{let r,i="",s="";i=B(t,n.name),!i&&n.fallback&&n.fallback.every((e=>{if(s=B(t,e.name),s)return i=s,!1}));try{r=V(i,t)}catch(e){}return r&&e.push.apply(e,r),e}),[])}"func"==e.type&&e.arguments&&e.arguments.forEach((e=>{F(e,t)}))}))}function X(e,t){return e.next(),(I(e)||[]).reduce(((e,n)=>{F(n,t);let[r]=n;return r.value&&r.value.length&&e.push(...r.value),e}),[])}function V(e,t){const n=function(e=""){let t=0,n=1,r=1;return{curr:(n=0)=>e[t+n],end:()=>e.length<=t,info:()=>({index:t,col:n,line:r}),index:e=>void 0===e?t:t=e,next(){let i=e[t++];return"\n"==i?(r++,n=0):n++,i}}}(e),r=[];for(;!n.end();){let e=n.curr();if(_.white_space(e))n.next();else{if("/"==e&&"*"==n.curr(1))R(n);else if("/"==e&&"/"==n.curr(1))R(n,{inline:!0});else if(":"==e){let e=D(n,t);e.selector&&r.push(e)}else if("@"==e&&"@keyframes"===j(n,!0)){let e=A(n,t);r.push(e)}else if("@"!=e||z(n,!0).includes(":")){if("<"==e)C(n);else if(!_.white_space(e)){let e=q(n,t);e.property&&r.push(e)}}else{let e=H(n,t);e.name.length&&r.push(e)}n.next()}}return r}function G(e,t,n){return Math.max(t,Math.min(n,e))}function Y(e,t,n){let r=0,i=e,s=e=>e>0&&e<1?.1:1,l=arguments.length;1==l&&([e,t]=[s(e),e]),l<3&&(n=s(e));let o=[];for(;(n>=0&&e<=t||n<0&&e>t)&&(o.push(e),e+=n,!(r++>=1e3)););return o.length||o.push(i),o}function Z(e){return/^[a-zA-Z]$/.test(e)}function K(e){return null==e}function J(e){return K(e)||Number.isNaN(e)}function Q(e){return K(e)||""===e}function ee(e){let t=()=>e;return t.lazy=!0,t}function te(e,t,n){return"c-"+e+"-"+t+"-"+n}function ne(e){for(;e&&e.value;)return ne(e.value);return K(e)?"":e}function re(e,t,n=0){let r=new Image;r.crossOrigin="anonymous",r.src=e,r.onload=function(){setTimeout(t,n)}}function ie(){return/^((?!chrome|android).)*safari/i.test(navigator.userAgent)}function se(e){let t=document.createElement("textarea");return t.innerHTML=e,t.value}function le(e,t=0){let n=3735928559^t,r=1103547991^t;for(let t,i=0;i>>16,2246822507)^Math.imul(r^r>>>13,3266489909),r=Math.imul(r^r>>>16,2246822507)^Math.imul(n^n>>>13,3266489909),4294967296*(2097151&r)+(n>>>0)}function oe(e){return(t,...n)=>{let r=t.reduce(((e,t,r)=>{return e+t+(K(i=n[r])?"":i);var i}),"");return e(r)}}const[ae,ue,ce]=[1,32,1024];function he(e){let[t,n,r]=(e+"").replace(/\s+/g,"").replace(/[,\uff0cxX]+/g,"x").split("x").map((e=>parseInt(e)));const i=1==t||1==n?ce:ue,s=1==t&&1==n?ce:ae,l={x:G(t||ae,1,i),y:G(n||t||ae,1,i),z:G(r||ae,1,s)};return Object.assign({},l,{count:l.x*l.y*l.z,ratio:l.x/l.y})}function pe(e){return/^texture\w*$|^(fragment|vertex)$/.test(e)}function fe(){return new n({type:"LineBreak",value:"\n"})}function de(e){let t=e[0],n=e[e.length-1];for(;t&&t.isSymbol("(")&&n&&n.isSymbol(")");)t=(e=e.slice(1,e.length-1))[0],n=e[e.length-1];return e}function me(e){return de(e).map((e=>e.value)).join("")}const ge="http://www.w3.org/2000/svg",ye="http://www.w3.org/1999/xlink";function ve(e,t){return`url("data:image/svg+xml;utf8,${encodeURIComponent(e)+(t?`#${t}`:"")}")`}function xe(e){const t=`xmlns="${ge}"`,n=`xmlns:xlink="${ye}"`;return e.includes("${e}`),e.includes("xmlns")||(e=e.replace(/])/,`{be(t,n,e)})),t.appendChild(n))}catch(e){}if("statement"===e.type)if(n&&"text"==n.name&&"content"===e.name)t.textContent=e.value;else try{let n=e.name.startsWith("xlink:")?ye:ge;t.setAttributeNS(n,e.name,e.value)}catch(e){}if(!n){let e=t.childNodes[0];return e&&e.outerHTML||""}return t}function _e(e){function t(e,t,n){return e*(1-n)+t*n}return{lerp:t,rand:function(n=0,r){return 1==arguments.length&&([n,r]=[0,n]),t(n,r,e())},nrand:function(t=0,n=1){let r=0,i=0;for(;0===r;)r=e();for(;0===i;)i=e();const s=Math.sqrt(-2*Math.log(r)),l=2*Math.PI*i;return t+n*(s*Math.cos(l))},pick:function(...t){let n=t.reduce(((e,t)=>e.concat(t)),[]);return n[~~(e()*n.length)]},unique_id:function(e=""){return e+Math.random().toString(32).substr(2)}}}function we(e){return(...t)=>{let n=function(e){let t="";return e.some((e=>{let n=String(e).trim();if(!n)return"";let r=n.match(/\d(\D+)$/);return t=r?r[1]:""})),t}(t);return function(e,t){return(...n)=>{n=n.map((e=>Number(String(e).replace(/\D+$/g,""))));let r=e.apply(null,n);return t.length?Array.isArray(r)?r.map((e=>e+t)):r+t:r}}(e,n).apply(null,t)}}function $e(e){return(...t)=>{let n=t.map((e=>String(e).charCodeAt(0))),r=e.apply(null,n);return Array.isArray(r)?r.map((e=>String.fromCharCode(e))):String.fromCharCode(r)}}let{last:ke}=g();const Se={\u03c0:Math.PI,gcd:(e,t)=>{for(;t;)[e,t]=[t,e%t];return e}};function je(e,t){return ze(Te(e),Object.assign({},Se,t))}const Ee={"^":7,"*":6,"/":6,"\xf7":6,"%":6,"&":5,"|":5,"+":4,"-":4,"<":3,"<<":3,">":3,">>":3,"=":3,"==":3,"\u2264":3,"<=":3,"\u2265":3,">=":3,"\u2260":3,"!=":3,"\u2227":2,"&&":2,"\u2228":2,"||":2,"(":1,")":1};function ze(e,t,n=[]){let r=[];for(;e.length;){let{name:s,value:l,type:o}=e.shift();if("variable"===o){let e=t[l];J(e)&&(e=Math[l]),J(e)&&(e=Ae(l,t)),J(e)&&/^\-\D/.test(l)&&(e=Ae("-1"+l.substr(1),t)),void 0===e&&(e=0),"number"!=typeof e&&(n.push(e),(i=n)[0]==i[2]&&i[1]==i[3]?(e=0,n=[]):e=ze(Te(e),t,n)),r.push(e)}else if("function"===o){let e=!1;/^\-/.test(s)&&(e=!0,s=s.substr(1));let n,i=l.map((e=>ze(e,t))),o=s.split(".");for(;n=o.pop();){if(!n)continue;let e=t[n]||Math[n];i="function"==typeof e?Array.isArray(i)?e(...i):e(i):0}e&&(i*=-1),r.push(i)}else if(/\d+/.test(l))r.push(l);else{let e=r.pop(),t=r.pop();r.push(Pe(l,Number(t),Number(e)))}}var i;return Number(r[0])||0}function Te(e){let t=function(e){let t=String(e),n=[],r="";for(let e=0;e=]$/.test(s.value))s.value+=i;else if(/^[|&<>]$/.test(i)&&s&&s.value==i)s.value+=i;else if("-"==i&&"e"==t[e-1])r+=i;else if(n.length||r.length||!/[+-]/.test(i)){let{type:e,value:t}=s||{};"operator"==e&&!r.length&&/[^()]/.test(i)&&/[^()]/.test(t)?r+=i:(r.length&&(n.push({type:"number",value:r}),r=""),n.push({type:"operator",value:i}))}else r+=i}else/\S/.test(i)&&(","==i?(n.push({type:"number",value:r}),r="",n.push({type:"comma",value:i})):"!"==i?(n.push({type:"number",value:r}),n.push({type:"operator",value:i}),r=""):r+=i)}return r.length&&n.push({type:"number",value:r}),n}(e);const n=[],r=[];for(let e=0;e=Ee[s];){let e=n.pop();/[()]/.test(e)||r.push({type:"operator",value:e})}n.push(s)}}for(;n.length;)r.push({type:"operator",value:n.pop()});return r}function Pe(e,t,n){switch(e){case"+":return t+n;case"-":return t-n;case"*":return t*n;case"%":return t%n;case"|":return t|n;case"&":return t&n;case"<":return t":return t>n;case"^":return Math.pow(t,n);case"\xf7":case"/":return t/n;case"=":case"==":return t==n;case"\u2264":case"<=":return t<=n;case"\u2265":case">=":return t>=n;case"\u2260":case"!=":return t!=n;case"\u2227":case"&&":return t&&n;case"\u2228":case"||":return t||n;case"<<":return t<>":return t>>n}}function Ae(e,t){let[n,r,i]=e.match(/([\d.\-]+)(.*)/)||[],s=t[i];return void 0===s?s:"number"==typeof s?Number(r)*s:r*ze(Te(s),t)}var Re=new class{constructor(){this.cache={}}clear(){this.cache={}}set(e,t){if(K(e))return"";let n=this.getKey(e);return this.cache[n]=t}get(e){let t=this.getKey(e);return this.cache[t]}getKey(e){return le("string"==typeof e?e:JSON.stringify(e))}};function Ce(e,t){return(...n)=>{let r=e+n.join("-");return Re.get(r)||Re.set(r,t.apply(null,n))}}const{last:Me,flat_map:Ne}=g();function Le(e){return(...t)=>e.apply(null,Ne(t,(e=>String(e).startsWith("[")?Ie(e):e)))}function Oe(e,t){return{type:e,value:t}}const Ie=Ce("build_range",(e=>{let t=function(e){let t=String(e),n=[],r=[];if(!t.startsWith("[")||!t.endsWith("]"))return n;for(let e=1;e{if("char"==e)return t;let[n,r]=t,i=!1;n>r&&([n,r]=[r,n],i=!0);let s=$e(Y)(n,r);return i&&s.reverse(),s}))}));class We{constructor(e){this.prev=this.next=null,this.data=e}}class Ue{constructor(e=20){this._limit=e,this._size=0}push(e){this._size>=this._limit&&(this.root=this.root.next,this.root.prev=null);let t=new We(e);this.root?(t.prev=this.tail,this.tail.next=t,this.tail=t):this.root=this.tail=t,this._size++}last(e=1){let t=this.tail;for(;--e&&t.prev;)t=t.prev;return t.data}}function De(e){let t,n=r(h(e)),i={},s=[],l=!1;for(;n.next();){let{prev:e,curr:r,next:o}=n.get();if(r.isSymbol(":")&&!t)t=He(s),s=[];else if(r.isSymbol(";")&&t)i[t]=qe(t,He(s),l),s=[],t=null,l=!1;else if(!r.isSymbol(";")){let n=e&&e.isSymbol("-"),i=o&&o.isSymbol("-"),a=r.isSymbol("-");t||s.length||!a||n||i||o&&o.isSymbol(":")?s.push(r):l=!0}}return s.length&&t&&(i[t]=qe(t,He(s),l)),i}function qe(e,t,n){return"fill-rule"===e?t:n?`-1 * (${t})`:t}function He(e){return e.map((e=>e.value)).join("")}const{cos:Be,sin:Fe,atan2:Xe,PI:Ve}=Math,Ge=oe((e=>Ke(De(e),{min:3,max:3600}))),Ye={circle:()=>Ge`split:180;scale:.99`,triangle:()=>Ge`rotate:30;scale:1.1;move:0 .2`,pentagon:()=>Ge`split:5;rotate:54`,hexagon:()=>Ge`split:6;rotate:30;scale:.98`,octagon:()=>Ge`split:8;rotat:22.5;scale:.99`,star:()=>Ge`split:10;r:cos(5t);rotate:-18;scale:.99`,infinity:()=>Ge`split:180;scale:.99;x:cos(t)*.99 / (sin(t)^2 + 1);y:x * sin(t)`,heart:()=>Ge`split:180;rotate:180;a:cos(t)*13/18 - cos(2t)*5/18;b:cos(3t)/18 + cos(4t)/18;x:(.75 * sin(t)^3) * 1.2;y:(a - b + .2) * -1.1`,bean:()=>Ge`split:180;r:sin(t)^3 + cos(t)^3;move:-.35 .35;`,bicorn:()=>Ge`split:180;x:cos(t);y:sin(t)^2 / (2 + sin(t)) - .5`,drop:()=>Ge`split:180;rotate:90;scale:.95;x:sin(t);y:(1 + sin(t)) * cos(t) / 1.6`,fish:()=>Ge`split:240;x:cos(t) - sin(t)^2 / sqrt(2) - .04;y:sin(2t)/2`,whale:()=>Ge`split:240;rotate:180;R:3.4 * (sin(t)^2 - .5) * cos(t);x:cos(t) * R + .75;y:sin(t) * R * 1.2`,windmill:()=>Ge`split:18;R:seq(.618, 1, 0);T:seq(t-.55, t, t);x:R * cos(T);y:R * sin(T)`,vase:()=>Ge`split:240;scale:.3;x:sin(4t) + sin(t) * 1.4;y:cos(t) + cos(t) * 4.8 + .3`,clover:(e=3)=>(4==(e=G(e,3,5))&&(e=2),Ge`split:240;r:cos(${e}t);scale:.98`),hypocycloid:(e=3)=>(e=G(e,3,5),Ge`split:240;scale:${[0,0,0,.34,.25,.19][e]};k:${e};x:(k-1)*cos(t) + cos((k-1)*t);y:(k-1)*sin(t) - sin((k-1)*t)`),bud:(e=3)=>(e=G(e,3,10),Ge`split:240;scale:.8;r:1 + .2 * cos(${e}t)`)};function Ze(e,t,n){let[r,i=r]=String(n).split(/[,\s]+/).map(Number);return[e*r,t*i]}function Ke(e,{min:t,max:n}){let r=G(parseInt(e.vertices||e.points||e.split)||0,t,n),i=Object.assign({},e,{split:r}),s=Q(e.x)?"cos(t)":e.x,l=Q(e.y)?"sin(t)":e.y,o=Q(e.r)?"":e.r;return e.degree&&(e.rotate=e.degree),e.origin&&(e.move=e.origin),function(e,t){"function"==typeof arguments[0]&&(t=e,e={}),t||(t=e=>[Be(e),Fe(e)]);let n,r,i=e.split||180,s=e.turn||1,l=e.frame,o=e.fill||e["fill-rule"],a=2*Ve*s/i,u=[];"nonzero"!=o&&"evenodd"!=o||u.push(o);let c=void 0===e.scale?1:e.scale,h=([t,n])=>{let[r,i]=Ze(t,-n,c);e.absolute||(r=50*(r+1)+"%",i=50*(i+1)+"%"),u.push(r+" "+i)};for(let e=0;e1&&(e*=2),0==e&&(e=.002);for(let n=0;n{let i=Object.assign({},e,{t,\u03b8:t,seq:(...e)=>e.length?e[n%e.length]:"",range:(e,t=0)=>((e=Number(e)||0)>(t=Number(t)||0)&&([e,t]=[t,e]),e+Math.abs(t-e)/(r-1)*n)}),a=je(s,i),u=je(l,i),c=0,h=0;if(o){let e=je(o,i);a=e*Math.cos(t),u=e*Math.sin(t)}return e.rotate&&([a,u]=function(e,t,n){let r=-Ve/180*n;return[e*Be(r)-t*Fe(r),t*Be(r)+e*Fe(r)]}(a,u,Number(e.rotate)||0)),e.move&&([a,u,c,h]=function(e,t,n){let[r,i=r]=String(n).split(/[,\s]+/).map(Number);return[e+(r||0),t-(i||0),r,i]}(a,u,e.move)),[a,u,c,h]}))}function Je(e,t){let n=[],i=[],s=[],l=[];if(Q(e))return n;let o=r(h(e));for(;o.next();){let{prev:e,curr:r,next:u}=o.get();r.isSymbol("(")&&s.push(r.value),r.isSymbol(")")&&s.pop(),"open"===r.status&&l.push(r.value),"close"===r.status&&l.pop(),a=r,!(t?a.isSymbol(","):a.isSymbol(",")||a.isSpace())||s.length||l.length?i.push(r):(n.push(Qe(i)),i=[])}var a;return i.length&&n.push(Qe(i)),n}function Qe(e){return e.map((e=>e.value)).join("")}function et(e,t){let n=[];for(;e.next();){let{curr:t,next:r}=e.get(),i=!r||t.isSymbol(";")||r.isSymbol("}");if(n.push(t),i)break}return n.length&&(t.value=rt(n)),t}function tt(e,t){let n=[],r=[],i=t&&t.type||"";for(;e.next();){let{prev:s,curr:l,next:o}=e.get(),a=!o||l.isSymbol("}");if("block"===i&&a){o||!n.length||l.isSymbol("}")||(n[n.length-1].value+=";"+l.value),t.value=n;break}if(l.isSymbol("{")){let t=st(r,(e=>e.isSpace()));if(!t.length)continue;let i=t.pop(),s=it(tt(e,{type:"block",name:i,value:[]}));for(;i=t.pop();)s=it({type:"block",name:i,value:[s]});n.push(s),r=[]}else if(l.isSymbol(":")&&!nt(s,o)&&r.length){let s=st(r,(e=>e.isSymbol(","))),l=et(e,{type:"statement",name:"unkown",value:""});s.forEach((e=>{n.push(Object.assign({},l,{name:e}))})),"block"==i&&(t.value=n),r=[]}else l.isSymbol(";")?n.length&&r.length&&(n[n.length-1].value+=";"+rt(r),r=[]):r.push(l)}return n.length&&"block"==i&&(t.value=n),i?t:n}function nt(e,t){let n=e&&e.value,r=t&&t.value;return["xlink:actuate","xlink:arcrole","xlink:href","xlink:role","xlink:show","xlink:title","xlink:type","xml:base","xml:lang","xml:space"].includes(n+":"+r)}function rt(e){return e.filter(((t,n)=>!t.isSymbol(";","}")||n!==e.length-1)).map((e=>e.value)).join("")}function it(e){let t=e.name||"",[n,...r]=t.split(/#/),i=r[r.length-1];return i&&(e.name=n,e.value.push({type:"statement",name:"id",value:i})),e}function st(e,t){let n=[],r=[];return e.forEach((e=>{t(e)?(n.push(rt(r)),r=[]):r.push(e)})),r.length&&n.push(rt(r)),n}function lt(e,t){return tt(r(h(e)),t||{type:"block",name:"svg",value:[]})}function ot(e){let t=r(h(e)),n={},i={commands:[],valid:!0};for(;t.next();){let{curr:e}=t.get();if(!e.isSpace()&&!e.isSymbol(","))if(e.isWord())n.name&&(i.commands.push(n),n={}),n.name=e.value,n.value=[],"MmLlHhVvCcSsQqTtAaZz".includes(e.value)?"mlhvcsqtaz".includes(e.value)?n.type="relative":n.type="absolute":(n.type="unknown",i.valid=!1);else if(n.value){let t=e.value;e.isNumber()&&(t=Number(e.value)),n.value.push(t)}else n.name||(i.valid=!1)}return n.name&&i.commands.push(n),i}const at={name:"cssd-uniform-time","animation-name":"cssd-uniform-time-animation","animation-duration":"31536000000","animation-iteration-count":"infinite","animation-delay":"0s","animation-direction":"normal","animation-fill-mode":"none","animation-play-state":"running","animation-timing-function":"linear"};function ut(e){const{shuffle:t}=g(e),{pick:n,rand:r,nrand:i,unique_id:s}=_e(e),l={index:({count:e})=>t=>e,row:({y:e})=>t=>e,col:({x:e})=>t=>e,depth:({z:e})=>t=>e,size:({grid:e})=>t=>e.count,"size-row":({grid:e})=>t=>e.y,"size-col":({grid:e})=>t=>e.x,"size-depth":({grid:e})=>t=>e.z,id:({x:e,y:t,z:n})=>r=>te(e,t,n),n:({extra:e})=>t=>e?e[0]+(Number(t)||0):"@n",nx:({extra:e})=>t=>e?e[1]+(Number(t)||0):"@nx",ny:({extra:e})=>t=>e?e[2]+(Number(t)||0):"@ny",N:({extra:e})=>t=>e?e[3]+(Number(t)||0):"@N",repeat:o(""),multiple:o(","),"multiple-with-space":o(" "),pick:({context:e})=>Le(((...t)=>a(e,"last_pick",n(t)))),"pick-n"({context:e,extra:t,position:n}){let r="pn-counter"+n;return Le(((...n)=>{e[r]||(e[r]=0),e[r]+=1;let i=n.length,[s=e[r]]=t||[],l=n[(s-1)%i];return a(e,"last_pick",l)}))},"pick-d"({context:e,extra:n,position:r}){let i="pd-counter"+r,s="pd-values"+r;return Le(((...r)=>{e[i]||(e[i]=0),e[i]+=1,e[s]||(e[s]=t(r));let l=r.length,[o=e[i]]=n||[],u=(o-1)%l,c=e[s][u];return a(e,"last_pick",c)}))},"last-pick":({context:e})=>(t=1)=>{let n=e.last_pick;return n?n.last(t):""},rand:({context:e})=>(...t)=>{let n=(t.every(Z)?$e:we)(r).apply(null,t);return a(e,"last_rand",n)},nrand:({context:e})=>(...t)=>{let n=(t.every(Z)?$e:we)(i).apply(null,t);return a(e,"last_rand",n)},"rand-int":({context:e})=>(...t)=>{let n=(t.every(Z)?$e:we)(((...e)=>Math.round(r(...e)))).apply(null,t);return a(e,"last_rand",n)},"nrand-int":({context:e})=>(...t)=>{let n=(t.every(Z)?$e:we)(((...e)=>Math.round(i(...e)))).apply(null,t);return a(e,"last_rand",n)},"last-rand":({context:e})=>(t=1)=>{let n=e.last_rand;return n?n.last(t):""},stripe:()=>(...e)=>{let t,n=e.map(ne),r=n.length,i=0,s=[];if(!r)return"";n.forEach((e=>{let[t,n]=Je(e);void 0!==n?s.push(n):i+=1}));let l=s.length?`(100% - ${s.join(" - ")}) / ${i}`:`100% / ${r}`;return n.map(((e,n)=>{if(s.length){let[n,r]=Je(e);return t=(t?t+" + ":"")+(void 0!==r?r:l),`${n} 0 calc(${t})`}return`${e} 0 ${100/r*(n+1)}%`})).join(",")},reflect:()=>(...e)=>[...e,...e.slice(0,-1).reverse()].join(","),calc:()=>e=>je(ne(e)),hex:()=>e=>parseInt(ne(e)).toString(16),svg:ee(((...e)=>{let t=e.map((e=>ne(e()).trim())).join(",");if(!t.startsWith("<")){t=be(lt(t))}return ve(xe(t))})),"svg-filter":ee(((...e)=>{let t=e.map((e=>ne(e()).trim())).join(","),n=s("filter-");if(!t.startsWith("<")){t=be(lt(t,{type:"block",name:"filter"}))}return ve(xe(t).replace(/])/,`e=>`var(${ne(e)})`,t:()=>e=>`var(--${at.name})`,plot({count:e,context:t,extra:n,position:r,grid:i}){let s="offset-points"+r;return r=>{let[l=e,o,a,u=i.count]=n||[];if(!t[s]){let e=De(r);e.points=u,t[s]=Ke(e,{min:1,max:65536})}return t[s][l-1]}},Plot({count:e,context:t,extra:n,position:r,grid:i}){let s="offset-points"+r;return r=>{let[l=e,o,a,u=i.count]=n||[];if(!t[s]){let e=De(r);e.points=u,e.absolute=!0,t[s]=Ke(e,{min:1,max:65536})}return t[s][l-1]}},shape:()=>Ce("shape-function",((e="",...t)=>{let n=[];if((e=String(e).trim()).length)if("function"==typeof Ye[e])n=Ye[e](t);else{let r=e,i=t.join(",");i.length&&(r=e+","+i),n=Ke(De(r),{min:3,max:3600})}return`polygon(${n.join(",")})`})),doodle:()=>e=>e,shaders:()=>e=>e,canvas:()=>e=>e,pattern:()=>e=>e,path:()=>e=>e,invert:()=>e=>{let t=ot(e);return t.valid?t.commands.map((({name:e,value:t})=>{switch(e){case"v":return"h"+t.join(" ");case"V":return"H"+t.join(" ");case"h":return"v"+t.join(" ");case"H":return"V"+t.join(" ");default:return e+t.join(" ")}})).join(" "):e},flipH:()=>e=>{let t=ot(e);return t.valid?t.commands.map((({name:e,value:t})=>{switch(e){case"h":case"H":return e+t.map(u).join(" ");default:return e+t.join(" ")}})).join(" "):e},flipV:()=>e=>{let t=ot(e);return t.valid?t.commands.map((({name:e,value:t})=>{switch(e){case"v":case"V":return e+t.map(u).join(" ");default:return e+t.join(" ")}})).join(" "):e},flip(...e){let t=l.flipH(...e),n=l.flipV(...e);return e=>n(t(e))},reverse:(...e)=>e=>{let t=ot(e);return t.valid?t.commands.reverse().map((({name:e,value:t})=>e+t.join(" "))).join(" "):e}};function o(e){return ee(((t,...n)=>{if(!n||!t)return"";let r=ne(t()),i=je(r);return 0===i&&(i=r),function(e,t){let[n,r=1]=String(e).split("x");n=G(parseInt(n)||1,1,65536),r=G(parseInt(r)||1,1,65536);let i=n*r,s=[],l=1;for(let e=1;e<=r;++e)for(let r=1;r<=n;++r)s.push(t(l++,r,e,i));return s}(i,((...e)=>n.map((t=>ne(t(...e)))).join(","))).join(e)}))}function a(e,t,n){return e[t]||(e[t]=new Ue),e[t].push(n),n}function u(e){return-1*e}return c=l,h={m:"multiple",M:"multiple-with-space",r:"rand",rn:"nrand",ri:"rand-int",rni:"nrand-int",lr:"last-rand",p:"pick",pn:"pick-n",pd:"pick-d",lp:"last-pick",rep:"repeat",i:"index",x:"col",y:"row",z:"depth",I:"size",X:"size-col",Y:"size-row",Z:"size-depth",flipv:"flipV",fliph:"flipH",nr:"rn",nri:"nri",ms:"multiple-with-space",s:"size",sx:"size-col",sy:"size-row",sz:"size-depth","size-x":"size-col","size-y":"size-row","size-z":"size-depth",multi:"multiple","pick-by-turn":"pick-n","max-row":"size-row","max-col":"size-col",offset:"plot",Offset:"Plot",point:"plot",Point:"Plot",paint:"canvas",stripes:"stripe",strip:"stripe",patern:"pattern"},Object.keys(h).forEach((e=>{c[e]=c[h[e]]})),c;var c,h}at.animation=`\n ${at["animation-duration"]}ms\n ${at["animation-timing-function"]} ${at["animation-delay"]} ${at["animation-iteration-count"]} ${at["animation-name"]}`;let ct=[];function ht(e){if(!ct.length){let e=new Set;for(let t in document.head.style)t.startsWith("-")||e.add(t.replace(/[A-Z]/g,"-$&").toLowerCase());e.has("grid-gap")||e.add("grid-gap"),ct=Array.from(e)}return e&&e.test?ct.filter((t=>e.test(t))):ct}function pt(e){let t=new RegExp(`\\-?${e}\\-?`);return ht(t).map((e=>e.replace(t,""))).reduce(((e,t)=>(e[t]=t,e)),{})}const ft=pt("webkit"),dt=pt("moz");function mt(e,t){return ft[e]?`-webkit-${t} ${t}`:dt[e]?`-moz-${t} ${t}`:t}const gt={"4a0":[1682,2378],"2a0":[1189,1682],a0:[841,1189],a1:[594,841],a2:[420,594],a3:[297,420],a4:[210,297],a5:[148,210],a6:[105,148],a7:[74,105],a8:[52,74],a9:[37,52],a10:[26,37],b0:[1e3,1414],b1:[707,1e3],b2:[500,707],b3:[353,500],b4:[250,353],b5:[176,250],b6:[125,176],b7:[88,125],b8:[62,88],b9:[44,62],b10:[31,44],b11:[22,32],b12:[16,22],c0:[917,1297],c1:[648,917],c2:[458,648],c3:[324,458],c4:[229,324],c5:[162,229],c6:[114,162],c7:[81,114],c8:[57,81],c9:[40,57],c10:[28,40],c11:[22,32],c12:[16,22],d0:[764,1064],d1:[532,760],d2:[380,528],d3:[264,376],d4:[188,260],d5:[130,184],d6:[92,126],letter:[216,279],postcard:[100,148],poster:[390,540]},yt={portrait:"p",pt:"p",p:"p",landscape:"l",ls:"l",l:"l"};var vt={"@size"(e,{is_special_selector:t,grid:n}){let[r,i=r]=Je(e);gt[r]&&([r,i]=function(e,t){e=String(e).toLowerCase();let[n,r]=gt[e]||[];return"p"==yt[t]&&([r,n]=[n,r]),[r,n].map((e=>e+"mm"))}(r,i));let s=`\n width:${r};height:${i};`;return t?"auto"!==r&&"auto"!==i||(s+=`aspect-ratio:${n.ratio};`):s+=`\n --internal-cell-width:${r};--internal-cell-height:${i};`,s},"@min-size"(e){let[t,n=t]=Je(e);return`min-width:${t};min-height:${n};`},"@max-size"(e){let[t,n=t]=Je(e);return`max-width:${t};max-height:${n};`},"@place-cell":(()=>{let e={center:"50%",left:"0%",right:"100%",top:"50%",bottom:"50%"},t={center:"50%",top:"0%",bottom:"100%",left:"50%",right:"50%"};return n=>{let[r,i="50%"]=Je(n);r=e[r]||r,i=t[i]||i;const s="var(--internal-cell-width, 25%)",l="var(--internal-cell-height, 25%)";return`\n position:absolute;left:${r};top:${i};width:${s};height:${l};margin-left:calc(${s} / -2);margin-top:calc(${l} / -2);grid-area:unset;`}})(),"@grid"(e,t){let[n,...r]=e.split("/").map((e=>e.trim()));return r=r.join(" / "),{grid:he(n),size:r?this["@size"](r,t):""}},"@shape":Ce("shape-property",(e=>{let[t,...n]=Je(e),r="clip-path";return"function"!=typeof Ye[t]?"":mt(r,`${r}:polygon(${Ye[t](...n).join(",")});`)+"overflow:hidden;"})),"@use"(e){if(e.length>2)return e}};function xt(e,t,n){for(let r=0;r<=n;++r)if(je(e,{n:r})==t)return!0}const bt={even:e=>!(e%2),odd:e=>!!(e%2)};function _t(e){return/^(even|odd)$/.test(e)}var wt=Object.getOwnPropertyNames(Math).reduce(((e,t)=>(e[t]=()=>(...e)=>(e=e.map(ne),"number"==typeof Math[t]?Math[t]:Math[t].apply(null,e.map(je))),e)),{});const $t={length:"0px",number:0,color:"black",url:"url()",image:"url()",integer:0,angle:"0deg",time:"0ms",resolution:"0dpi",percentage:"0%","length-percentage":"0%","transform-function":"translate(0)","transform-list":"translate(0)","custom-ident":"_"};let{join:kt,make_array:St,remove_empty_values:jt}=g();function Et(e){return/^\:(host|doodle)/.test(e)}function zt(e){return/^\:(container|parent)/.test(e)}function Tt(e){return Et(e)||zt(e)}class Pt{constructor(e,t){this.tokens=e,this.rules={},this.props={},this.keyframes={},this.grid=null,this.is_grid_defined=!1,this.coords=[],this.doodles={},this.canvas={},this.pattern={},this.shaders={},this.paths={},this.reset(),this.Func=ut(t),this.Selector=function(e){return{at:({x:e,y:t})=>(n,r)=>e==n&&t==r,nth:({count:e,grid:t})=>(...n)=>n.some((n=>_t(n)?bt[n](e):xt(n,e,t.count))),row:({y:e,grid:t})=>(...n)=>n.some((n=>_t(n)?bt[n](e):xt(n,e,t.y))),col:({x:e,grid:t})=>(...n)=>n.some((n=>_t(n)?bt[n](e):xt(n,e,t.x))),even:({count:e,grid:t,y:n})=>r=>{if("cross"===r&&bt.even(t.x)){let t=bt.even(n)?"odd":"even";return bt[t](e)}return bt.even(e)},odd:({count:e,grid:t,y:n})=>r=>{if("cross"===r&&bt.even(t.x)){let t=bt.even(n)?"even":"odd";return bt[t](e)}return bt.odd(e)},random:()=>(t=.5)=>(t>=1&&t<=0&&(t=.5),e()s=>!!je("("+s+")",{x:r,X:n.x,y:i,Y:n.y,i:t,I:n.count,random:e})}}(t),this.custom_properties={},this.uniforms={},this.unique_id=_e(t).unique_id}reset(){this.styles={host:"",container:"",cells:"",keyframes:""},this.coords=[],this.doodles={},this.canvas={},this.pattern={},this.shaders={};for(let e in this.rules)e.startsWith("#c")&&delete this.rules[e]}add_rule(e,t){let n=this.rules[e];n||(n=this.rules[e]=[]),n.push.apply(n,St(t))}pick_func(e){return this.Func[e]||wt[e]}apply_func(e,t,n){let r=e(...St(t)),i=[];return n.forEach((e=>{let t=typeof e.value,n="number"===t||"string"===t;if(!e.cluster&&n)i.push(...Je(e.value,!0));else if("function"==typeof e)i.push(e);else if(!K(e.value)){let t=ne(e.value);i.push(t)}})),i=jt(i),r(...St(i))}compose_aname(...e){return e.join("-")}compose_selector({x:e,y:t,z:n},r=""){return`#${te(e,t,n)}${r}`}is_composable(e){return["doodle","shaders","canvas","pattern"].includes(e)}compose_argument(e,t,n=[]){let r=e.map((e=>{if("text"===e.type)return e.value;if("func"===e.type){let r=e.name.substr(1),i=this.pick_func(r);if("function"==typeof i){if("t"===r&&(this.uniforms.time=!0),this.is_composable(r)){let n=ne((e.arguments[0]||[])[0]);if(!K(n))switch(r){case"doodle":return this.compose_doodle(n);case"shaders":return this.compose_shaders(n,t);case"canvas":return this.compose_canvas(n,e.arguments.slice(1));case"pattern":return this.compose_pattern(n,t)}}t.extra=n,t.position=e.position;let s=e.arguments.map((e=>i.lazy?(...n)=>this.compose_argument(e,t,n):this.compose_argument(e,t,n))),l=this.apply_func(i,t,s);return"path"==r?this.compose_path(l):l}}}));return{cluster:e.cluster,value:r.length>=2?{value:r.join("")}:r[0]}}compose_doodle(e){let t=this.unique_id("doodle");return this.doodles[t]=e,"${"+t+"}"}compose_shaders(e,{x:t,y:n,z:r}){let i=this.unique_id("shader");return this.shaders[i]={shader:e,cell:te(t,n,r)},"${"+i+"}"}compose_pattern(e,{x:t,y:n,z:r}){let i=this.unique_id("pattern");return this.pattern[i]={code:e,cell:te(t,n,r)},"${"+i+"}"}compose_canvas(e,t=[]){let n=e,r=t.map((e=>ne(e[0]))).join(",");r.length&&(n=e+","+r);let i=this.unique_id("canvas");return this.canvas[i]={code:n},"${"+i+"}"}compose_path(e){let t=this.unique_id("path");return this.paths[t]={id:t,commands:e},"${"+t+"}"}compose_value(e,t){return Array.isArray(e)?e.reduce(((e,n)=>{switch(n.type){case"text":e+=n.value;break;case"func":{let r=n.name.substr(1),i=this.pick_func(r);if("function"==typeof i)if("t"===r&&(this.uniforms.time=!0),this.is_composable(r)){let i=ne((n.arguments[0]||[])[0]);if(!K(i))switch(r){case"doodle":e+=this.compose_doodle(i);break;case"shaders":e+=this.compose_shaders(i,t);break;case"pattern":e+=this.compose_pattern(i,t);break;case"canvas":e+=this.compose_canvas(i,n.arguments.slice(1))}}else{t.position=n.position;let s=n.arguments.map((e=>i.lazy?(...n)=>this.compose_argument(e,t,n):this.compose_argument(e,t))),l=this.apply_func(i,t,s);K(l)||(e+="path"==r?this.compose_path(l):l)}}}return e}),""):""}compose_rule(e,t,n){let r=Object.assign({},t),i=e.property,s=e.value.reduce(((e,t)=>{let n=this.compose_value(t,r);return n&&e.push(n),e}),[]),l=s.join(", ");if(/^animation(\-name)?$/.test(i)){if(this.props.has_animation=!0,Et(n)){let e=at[i];e&&l&&(l=e+","+l)}if(r.count>1){let{count:e}=r;switch(i){case"animation-name":l=s.map((t=>this.compose_aname(t,e))).join(", ");break;case"animation":l=s.map((t=>{let n=(t||"").split(/\s+/);return n[0]=this.compose_aname(n[0],e),n.join(" ")})).join(", ")}}}"content"===i&&(/["']|^none$|^(var|counter|counters|attr)\(/.test(l)||(l=`'${l}'`)),"transition"===i&&(this.props.has_transition=!0);let o=`${i}:${l};`;if(o=mt(i,o),"clip-path"===i&&(o+=";overflow:hidden;"),"width"!==i&&"height"!==i||Tt(n)||(o+=`--internal-cell-${i}:${l};`),"background"===i&&(l.includes("shader")||l.includes("canvas")||l.includes("pattern"))&&(o+="background-size:100% 100%;"),/^\-\-/.test(i)&&(this.custom_properties[i]=l),vt[i]){let t=vt[i](l,{is_special_selector:Tt(n),grid:r.grid});switch(i){case"@grid":Et(n)?o=t.size||"":(o="",this.is_grid_defined||(t=vt[i](l,{is_special_selector:!0,grid:r.grid}),this.add_rule(":host",t.size||""))),this.grid=r.grid,this.is_grid_defined=!0;break;case"@place-cell":Et(n)||(o=t);break;case"@use":e.value.length&&this.compose(r,e.value),o="";break;default:o=t}}return o}pre_compose_rule(e,t){let n=Object.assign({},t),r=e.property;switch(r){case"@grid":{let t=e.value.reduce(((e,t)=>{let r=this.compose_value(t,n);return r&&e.push(r),e}),[]).join(", "),i=vt[r](t,{});this.grid=i.grid;break}case"@use":e.value.length&&this.pre_compose(n,e.value)}}pre_compose(e,t){(t||this.tokens).forEach((t=>{switch(t.type){case"rule":this.pre_compose_rule(t,e);break;case"pseudo":Et(t.selector)&&(t.styles||[]).forEach((t=>{this.pre_compose_rule(t,e)}))}}))}compose(e,t,n){this.coords.push(e),(t||this.tokens).forEach(((t,r)=>{if(t.skip)return!1;if(n&&this.grid)return!1;switch(t.type){case"rule":this.add_rule(this.compose_selector(e),this.compose_rule(t,e));break;case"pseudo":{t.selector.startsWith(":doodle")&&(t.selector=t.selector.replace(/^\:+doodle/,":host"));let n=Tt(t.selector);n&&(t.skip=!0),t.selector.split(",").forEach((r=>{let i=t.styles.map((t=>this.compose_rule(t,e,r))),s=n?r:this.compose_selector(e,r);this.add_rule(s,i)}));break}case"cond":{let n=this.Selector[t.name.substr(1)];if(n){let r=t.arguments.map((t=>this.compose_argument(t,e)));this.apply_func(n,e,r)&&this.compose(e,t.styles)}break}case"keyframes":this.keyframes[t.name]||(this.keyframes[t.name]=e=>`\n ${kt(t.steps.map((t=>`\n ${t.name}{${kt(t.styles.map((t=>this.compose_rule(t,e))))}}`)))}`)}}))}output(){Object.keys(this.rules).forEach(((e,t)=>{if(zt(e))this.styles.container+=`\n .container{${kt(this.rules[e])}}`;else{let t=Et(e)?"host":"cells",n=kt(this.rules[e]).trim(),r="host"===t?`${e}, .host`:e;this.styles[t]+=`${r}{${n}}`}}));let e=Object.keys(this.keyframes);this.uniforms.time&&(this.styles.container+=`\n:host, .host{animation:${at.animation};}`,this.styles.keyframes+=`\n @keyframes ${at["animation-name"]}{from{--${at.name}:0} to{--${at.name}:${at["animation-duration"]}}}`),this.coords.forEach(((t,n)=>{e.forEach((e=>{let r=this.compose_aname(e,t.count);var i,s;this.styles.keyframes+=`\n ${i=0===n,s=`@keyframes ${e}{${this.keyframes[e](t)}}`,i?"function"==typeof s?s():s:""} @keyframes ${r}{${this.keyframes[e](t)}}`}))}));let t=[];return Object.keys(this.custom_properties).forEach((e=>{let n=function(e){let t=String(e).substr(2).split("-")[0];if(void 0!==$t[t])return{name:e,syntax:`<${t}>|<${t}>+ |<${t}>#`,initialValue:$t[t],inherits:!1}}(e);n&&t.push(n)})),{props:this.props,styles:this.styles,grid:this.grid,doodles:this.doodles,shaders:this.shaders,paths:this.paths,canvas:this.canvas,pattern:this.pattern,definitions:t,uniforms:this.uniforms}}}function At(e,t,n){let r=new Pt(e,n),i={};r.pre_compose({x:1,y:1,z:1,count:1,context:{},grid:{x:1,y:1,z:1,count:1}});let{grid:s}=r.output();if(s&&(t=s),r.reset(),1==t.z)for(let e=1,n=0;e<=t.y;++e)for(let s=1;s<=t.x;++s)r.compose({x:s,y:e,z:1,count:++n,grid:t,context:i});else for(let e=1,n=0;e<=t.z;++e)r.compose({x:1,y:1,z:e,count:++n,grid:t,context:i});return r.output()}var Rt=window,Ct=Math,Mt=[],Nt=256,Lt=Ct.pow(Nt,6),Ot=Ct.pow(2,52),It=2*Ot,Wt=255;function Ut(e,t,n){var r=[],i=Bt(Ht((t=1==t?{entropy:!0}:t||{}).entropy?[e,Ft(Mt)]:null==e?function(){try{var e;return e=new Uint8Array(Nt),(Rt.crypto||Rt.msCrypto).getRandomValues(e),Ft(e)}catch(e){var t=Rt.navigator,n=t&&t.plugins;return[+new Date,Rt,n,Rt.screen,Ft(Mt)]}}():e,3),r),s=new Dt(r),l=function(){for(var e=s.g(6),t=Lt,n=0;e=It;)e/=2,t/=2,n>>>=1;return(e+n)/t};return l.int32=function(){return 0|s.g(4)},l.quick=function(){return s.g(4)/4294967296},l.double=l,Bt(Ft(s.S),Mt),(t.pass||n||function(e,t,n,r){return r&&(r.S&&qt(r,s),e.state=function(){return qt(s,{})}),n?(Ct.random=e,t):e})(l,i,"global"in t?t.global:this==Ct,t.state)}function Dt(e){var t,n=e.length,r=this,i=0,s=r.i=r.j=0,l=r.S=[];for(n||(e=[n++]);i{let t=`uniform sampler2D ${e.name};`;o=Vt(o,t)}));let a=function(e,t,n){let r=Xt(e,e.VERTEX_SHADER,t),i=Xt(e,e.FRAGMENT_SHADER,n),s=e.createProgram();return e.attachShader(s,r),e.attachShader(s,i),e.linkProgram(s),e.getProgramParameter(s,e.LINK_STATUS)||(console.warn("Link failed:"+e.getProgramInfoLog(s)),console.warn("vs info-log:"+e.getShaderInfoLog(r)),console.warn("fs info-log:"+e.getShaderInfoLog(i))),s}(l,e.vertex||"#version 300 es\n in vec4 position;void main(){gl_Position = position;}","#version 300 es\n precision highp float;out vec4 FragColor;"+o),u=l.getAttribLocation(a,"position"),c=l.createBuffer();l.bindBuffer(l.ARRAY_BUFFER,c);return l.bufferData(l.ARRAY_BUFFER,new Float32Array([-1,-1,-1,1,1,-1,1,1,-1,1,1,-1]),l.STATIC_DRAW),l.enableVertexAttribArray(u),l.vertexAttribPointer(u,2,l.FLOAT,!1,0,0),l.viewport(0,0,l.drawingBufferWidth,l.drawingBufferHeight),l.clearColor(0,0,0,0),l.clear(l.COLOR_BUFFER_BIT),l.useProgram(a),l.uniform2fv(l.getUniformLocation(a,"u_resolution"),[t,n]),e.textures.forEach(((e,t)=>{!function(e,t,n){const r=e.createTexture();e.activeTexture(e["TEXTURE"+n]),e.pixelStorei(e.UNPACK_FLIP_Y_WEBGL,!0),e.bindTexture(e.TEXTURE_2D,r),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR)}(l,e.value,t),l.uniform1i(l.getUniformLocation(a,e.name),t)})),l.drawArrays(l.TRIANGLES,0,6),Promise.resolve(Re.set(e,i.toDataURL()))}function Yt(e,t){let n=[];for(;e.next();){let{curr:t,next:r}=e.get(),i=!r||t.isSymbol(";")||r.isSymbol("}");if(n.push(t),i)break}return n.length&&(t.value=Kt(n)),t}function Zt(e,t){let n=[],r=[],i=t&&t.type||"",s=[];for(;e.next();){let{prev:l,curr:o,next:a}=e.get(),u=!a||o.isSymbol("}");if("block"===i&&u){a||!n.length||o.isSymbol("}")||(n[n.length-1].value+=";"+o.value),t.value=n;break}if(o.isSymbol("{")&&r.length&&!s.length){let t=Jt(r);if(!t.length)continue;let i=Zt(e,{type:"block",name:"unkown",value:[]});t.forEach((e=>{let t=Object.assign({},i,{name:e.name,args:e.args});n.push(t)})),r=[]}else if(o.isSymbol(":")&&r.length&&!s.length){let s=Kt(r);n.push(Yt(e,{type:"statement",name:s,value:""})),"block"==i&&(t.value=n),r=[]}else o.isSymbol(";")?n.length&&r.length&&(n[n.length-1].value+=";"+Kt(r),r=[]):(o.isSymbol("(")&&s.push(o),o.isSymbol(")")&&s.pop(),r.push(o))}return n.length&&"block"==i&&(t.value=n),i?t:n}function Kt(e){return e.filter(((t,n)=>!t.isSymbol(";")||n!==e.length-1)).map((e=>e.value)).join("")}function Jt(e){let t=r(e),n=[],i="",s=[],l=[],o=[];for(;t.next();){let{curr:e,next:r}=t.get();!i.length&&e.isWord()?i=e.value:e.isSymbol("(")?(o.length&&l.push(e.value),o.push(e)):e.isSymbol(")")?(o.pop(),o.length?l.push(e.value):l.length&&(s.push(l.join("")),l=[])):e.isSymbol(",")?o.length?(s.push(l.join("")),l=[]):(l.length&&(s.push(l.join("")),l=[]),i&&(n.push({name:i,args:s}),i="",s=[],l=[])):l.push(e.value)}return i&&n.push({name:i,args:s}),n.filter(((e,t,n)=>n.findIndex((t=>t.name===e.name&&e.args.join("")==t.args.join("")))===t))}function Qt(e){return Zt(r(h(e)))}function en(e,t){if("fill"===e.name){let{r:n,g:r,b:i,a:s}=t.get_rgba_color(e.value);return{type:"statement",value:`\ncolor = vec4(${tn(n/255)}, ${tn(r/255)}, ${tn(i/255)}, ${tn(s)});`}}return"grid"==e.name?{type:"grid",value:e.value}:{type:"statement",value:""}}function tn(e){return String(e).includes(".")?e:e+".0"}function nn(e,t){let n=Qt(e),r=[],i={x:1,y:1};return n.forEach((e=>{if("statement"===e.type){let n=en(e,t);"statement"==n.type&&r.push(n.value),"grid"===n.type&&(i=function(e){let[t,n=t]=String(e+"").replace(/\s+/g,"").replace(/[,\uff0cxX]+/g,"x").split("x").map((e=>parseInt(e)));return(!t||t<1)&&(t=1),(!n||n<1)&&(n=1),{x:t,y:n}}(n.value))}else"block"===e.type&&r.push(function(e,t){if("match"===e.name){let n=e.args[0],r=[];return e.value.forEach((e=>{let n=en(e,t);"statement"==n.type&&r.push(n.value)})),`\n if (${n}){${r.join("")}}`}return""}(e,t))})),function(e,t){return`\n vec3 mapping(vec2 uv, vec2 grid){vec2 _grid = 1.0/grid;float x = ceil(uv.x/_grid.x);float y = ceil(grid.y - uv.y/_grid.y);float i = x + (y - 1.0) * y;return vec3(x, y, i);} vec4 getColor(float x, float y, float i, float I, float X, float Y){vec4 color = vec4(0, 0, 0, 0);${e} return color;} void main(){vec2 uv = gl_FragCoord.xy/u_resolution.xy;vec2 grid = vec2(${t.x}, ${t.y});vec3 p = mapping(uv, grid);FragColor = getColor(p.x, p.y, p.z, grid.x * grid.y, grid.x, grid.y);}`}(r.join(""),i)}let rn=1;function sn(e){let t=Re.get(e);if(t)return Promise.resolve(t);let n="css-doodle-paint-"+rn++,r=function(e,t){(t=se(t)).includes("paint(")||(t=`\n paint(ctx,{width, height}, props){${t}}`);return`\n registerPaint('${e}', class{${t}})\n`}(n,e),i=new Blob([r],{type:"text/javascript"});try{CSS.paintWorklet&&CSS.paintWorklet.addModule(URL.createObjectURL(i))}catch(e){}return Promise.resolve(Re.set(e,`paint(${n})`))}class ln extends HTMLElement{constructor(){super(),this.doodle=this.attachShadow({mode:"open"}),this.extra={get_variable:e=>function(e,t){return getComputedStyle(e).getPropertyValue(t).trim().replace(/^\(|\)$/g,"")}(this,e),get_rgba_color:e=>function(e,t){let n=e.querySelector("#defs");return n?(n.style.color=t,function(e){let[t,n,r,i=1]=e.replace(/rgba?\((.+)\)/,((e,t)=>t)).split(/,\s*/);return{r:t,g:n,b:r,a:i}}(getComputedStyle(n).color)):{r:0,g:0,b:0,a:1}}(this.shadowRoot,e)}}connectedCallback(e){/^(complete|interactive|loaded)$/.test(document.readyState)?this.load(e):setTimeout((()=>this.load(e)))}update(e){Re.clear();let t=this.get_use();e||(e=se(this.innerHTML)),this.innerHTML=e,this.grid_size||(this.grid_size=this.get_grid());let{x:n,y:r,z:i}=this.grid_size;const s=this.generate(V(t+e,this.extra));if(!this.shadowRoot.innerHTML)return Object.assign(this.grid_size,s.grid),this.build_grid(s,s.grid);if(s.grid){let{x:e,y:t,z:l}=s.grid;if(n!==e||r!==t||i!==l)return Object.assign(this.grid_size,s.grid),this.build_grid(s,s.grid);Object.assign(this.grid_size,s.grid)}else{let s=this.get_grid(),{x:l,y:o,z:a}=s;if(n!==l||r!==o||i!==a)return Object.assign(this.grid_size,s),this.build_grid(this.generate(V(t+e,this.extra)),s)}let l=this.build_svg_paths(s.paths);if(l){let e=this.shadowRoot.querySelector(".svg-defs");e&&(e.innerHTML=l)}s.uniforms.time&&this.register_uniform_time();let o=this.replace(s);this.set_content(".style-keyframes",o(s.styles.keyframes)),s.props.has_animation&&(this.set_content(".style-cells",""),this.set_content(".style-container","")),setTimeout((()=>{this.set_content(".style-container",o(an(this.grid_size)+s.styles.host+s.styles.container)),this.set_content(".style-cells",o(s.styles.cells))}))}get grid(){return Object.assign({},this.grid_size)}set grid(e){this.attr("grid",e),this.connectedCallback(!0)}get seed(){return this._seed_value}set seed(e){this.attr("seed",e),this.connectedCallback(!0)}get use(){return this.attr("use")}set use(e){this.attr("use",e),this.connectedCallback(!0)}static get observedAttributes(){return["grid","use","seed"]}attributeChangedCallback(e,t,n){if(t==n)return!1;["grid","use","seed"].includes(e)&&!K(t)&&(this[e]=n)}get_grid(){return he(this.attr("grid"))}get_use(){let e=this.attr("use")||"";return e&&(e=`@use:${e};`),e}attr(e,t){return 1===arguments.length?this.getAttribute(e):2===arguments.length?(this.setAttribute(e,t),t):void 0}generate(e){let t=this.get_grid(),n=this.attr("seed")||this.attr("data-seed");K(n)&&(n=Date.now()),n=String(n),this._seed_value=n;let r=this.random=Ut(n);return this.compiled=At(e,t,r)}doodle_to_image(e,t,n){"function"==typeof t&&(n=t,t=null);let r=V(e,this.extra),i=he({}),s=At(r,i,this.random),l=s.grid?s.grid:i;const{keyframes:o,host:a,container:u,cells:c}=s.styles;let h=this.build_svg_paths(s.paths),p=this.replace(s),f=cn(l);p(`\n
${h}${f}
`).then((e=>{let t=`data:image/svg+xml;base64,${window.btoa(unescape(encodeURIComponent(e)))}`;ie()&&re(t),n(t)}))}pattern_to_image({code:e,cell:t},n){let r=nn(e,this.extra);this.shader_to_image({shader:r,cell:t},n)}canvas_to_image({code:e},t){sn(e).then(t)}shader_to_image({shader:e,cell:t},n){let i=function(e){let t,n,i=r(de(h(e))),s=[],l=[],o={textures:[]};for(;i.next();){let{curr:e,next:r}=i.get();if(e.isSymbol("{")){if(s.length)l.push(e);else{let n=me(l);pe(n)?(t=n,l=[]):l.push(e)}s.push("{")}else if(e.isSymbol("}"))if(s.pop(),!s.length&&t){let e=me(l);t&&e.length&&(t.startsWith("texture")?o.textures.push({name:t,value:e}):o[t]=e,l=[]),t=null}else l.push(e);else Q(n)||n==e.pos[1]||(l.push(fe()),n=null),e.isWord()&&e.value.startsWith("#")&&(l.push(fe()),n=r.pos[1]),l.push(e)}return Q(o.fragment)?{fragment:me(l),textures:[]}:o}(e),s=this.doodle.getElementById(t),{width:l,height:o}=s&&s.getBoundingClientRect()||{width:0,height:0},a=window.devicePixelRatio||1;if(i.textures.length){let e=i.textures.map((e=>new Promise((t=>{this.doodle_to_image(e.value,{width:l,height:o},(n=>{let r=new Image;r.width=l*a,r.height=o*a,r.onload=()=>t({name:e.name,value:r}),r.src=n}))}))));Promise.all(e).then((e=>{i.textures=e,Gt(i,l,o).then(n)}))}else Gt(i,l,o).then(n)}load(e){e||this.hasAttribute("click-to-update")&&this.addEventListener("click",(e=>this.update()));let t=V(this.get_use()+se(this.innerHTML),this.extra),n=this.generate(t);this.grid_size=n.grid?n.grid:this.get_grid(),this.build_grid(n,this.grid_size)}replace({doodles:e,shaders:t,paths:n,canvas:r,pattern:i}){let s=Object.keys(e),l=Object.keys(t),o=Object.keys(n),a=Object.keys(r),u=Object.keys(i),c=s.length+a.length+l.length+o.length+u.length;return n=>{if(!c)return Promise.resolve(n);let h=[].concat(s.map((t=>n.includes(t)?new Promise((n=>{this.doodle_to_image(e[t],(e=>n({id:t,value:e})))})):Promise.resolve(""))),l.map((e=>n.includes(e)?new Promise((n=>{this.shader_to_image(t[e],(t=>n({id:e,value:t})))})):Promise.resolve(""))),a.map((e=>n.includes(e)?new Promise((t=>{this.canvas_to_image(r[e],(n=>t({id:e,value:n})))})):Promise.resolve(""))),u.map((e=>n.includes(e)?new Promise((t=>{this.pattern_to_image(i[e],(n=>t({id:e,value:n})))})):Promise.resolve(""))),o.map((e=>n.includes(e)?Promise.resolve({id:e,value:"#"+e}):Promise.resolve(""))));return Promise.all(h).then((e=>(n.replaceAll?e.forEach((({id:e,value:t})=>{n=n.replaceAll("${"+e+"}",/^canvas/.test(e)?t:`url(${t})`)})):e.forEach((({id:e,value:t})=>{n=n.replace("${"+e+"}",/^canvas/.test(e)?t:`url(${t})`)})),n)))}}build_grid(e,t){const{has_transition:n,has_animation:r}=e.props;let i=n||r;const{keyframes:s,host:l,container:o,cells:a}=e.styles;let u=an(t)+l+o,c=i?"":a,h=this.build_svg_paths(e.paths);const{uniforms:p}=e;let f=this.replace(e);this.doodle.innerHTML=`\n${h}${cn(t)}`,this.set_content(".style-container",f(u)),i?setTimeout((()=>{this.set_content(".style-cells",f(a))}),50):this.set_content(".style-cells",f(a));const d=e.definitions;if(window.CSS&&window.CSS.registerProperty)try{p.time&&this.register_uniform_time(),d.forEach(CSS.registerProperty)}catch(e){}}build_svg_paths(e){return Object.keys(e||{}).map((t=>`\n`)).join("")}register_uniform_time(){if(!this.is_uniform_time_registered){try{CSS.registerProperty({name:"--"+at.name,syntax:"",initialValue:0,inherits:!0})}catch(e){}this.is_uniform_time_registered=!0}}export({scale:e,name:t,download:n,detail:r}={}){return new Promise(((i,s)=>{let l=function(e){let t={};if(e.computedStyleMap)for(let[n,r]of e.computedStyleMap())n.startsWith("--")&&(t[n]=r[0][0]);else{let n=getComputedStyle(e);for(let e of n)e.startsWith("--")&&(t[e]=n.getPropertyValue(e))}return function(e){let t=[];for(let n in e)t.push(n+":"+e[n]);return t.join(";")}(t)}(this),o=this.doodle.innerHTML,{width:a,height:u}=this.getBoundingClientRect(),c=a*(e=parseInt(e)||1),h=u*e,p=`\n${o}`.replace(/\n\s+|^\s+|\n+/g," ").trim();var f;n||r?function(e,t,n,r){return new Promise(((i,s)=>{let l=`data:image/svg+xml;utf8,${encodeURIComponent(e)}`;function o(){let e=new Image;e.crossOrigin="anonymous",e.src=l,e.onload=()=>{let o=document.createElement("canvas"),a=o.getContext("2d"),u=window.devicePixelRatio||1;1!=r&&(u=1),o.width=t*u,o.height=n*u,a.drawImage(e,0,0,o.width,o.height);try{o.toBlob((e=>{i({blob:e,source:l,url:URL.createObjectURL(e)})}))}catch(e){s(e)}}}ie()?re(l,o,200):o()}))}(p,c,h,e).then((({source:e,url:r,blob:s})=>{if(i({width:c,height:h,svg:p,blob:s,source:e}),n){let e=document.createElement("a");e.download=function(e){return(K(e)?Date.now():String(e).replace(/\/.png$/g,""))+".png"}(t),e.href=r,e.click()}})).catch((e=>{s(e)})):i({width:c,height:h,svg:p})}))}set_content(e,t){if(t instanceof Promise)t.then((t=>{this.set_content(e,t)}));else{const n=this.shadowRoot.querySelector(e);n&&(n.styleSheet?n.styleSheet.cssText=t:n.innerHTML=t)}}}function on(e={}){const t=ht(/grid/).map((e=>`${e}:inherit;`)).join("");return`\n *{box-sizing:border-box\n} *::after, *::before{box-sizing:inherit\n}:host, .host{display:block;visibility:visible;width:auto;height:auto;--${at.name}:0\n}:host([hidden]), .host[hidden]{display:none\n} .container{position:relative;width:100%;height:100%;display:grid;${t}} cell:empty{position:relative;line-height:1;display:grid;place-items:center\n} svg{position:absolute;width:100%;height:100%;}`}function an(e){let{x:t,y:n}=e||{};return`\n:host, .host{grid-template-rows:repeat(${n}, 1fr);grid-template-columns:repeat(${t}, 1fr);}`}function un(e,t,n){let r=document.createElement("cell");return r.id=te(e,t,n),r}function cn(e){let{x:t,y:n,z:r}=e||{},i=document.createElement("grid"),s=document.createDocumentFragment();if(1==r)for(let e=1;e<=n;++e)for(let n=1;n<=t;++n)s.appendChild(un(n,e,1));else{let e=null;for(let t=1;t<=r;++t){let n=un(1,1,t);(e||s).appendChild(n),e=n}e=null}return i.className="container",i.appendChild(s),i.outerHTML}customElements.get("css-doodle")||customElements.define("css-doodle",ln);return oe((e=>{let t=document.createElement("css-doodle");return t.update&&t.update(e),t}))})); \ No newline at end of file +/*! css-doodle@0.24.0 */!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).CSSDoodle=t()}(this,(function(){"use strict";const e=[":",";",",","(",")","[","]","{","}","\u03c0","\xb1","+","-","*","/","%",'"',"'","`","@"],t={escape:e=>"\\"==e,space:e=>/[\r\n\t\s]/.test(e),digit:e=>/^[0-9]$/.test(e),sign:e=>/^[+-]$/.test(e),dot:e=>"."==e,quote:e=>/^["'`]$/.test(e),symbol:t=>e.includes(t),hexNum:e=>/^[0-9a-f]$/i.test(e),hex:(e,n,r)=>"0"==e&&t.letter(n,"x")&&t.hexNum(r),expWithSign:(e,n,r)=>t.letter(e,"e")&&t.sign(n)&&t.digit(r),exp:(e,n)=>t.letter(e,"e")&&t.digit(n),dots:(e,n)=>t.dot(e)&&t.dot(n),letter:(e,t)=>String(e).toLowerCase()==String(t).toLowerCase(),comment:(e,t)=>"/"==e&&"*"==t,selfClosedTag:(e,t)=>"/"==e&&">"==t,closedTag:(e,t)=>"<"==e&&"/"==t};class n{constructor({type:e,value:t,pos:n,status:r}){this.type=e,this.value=t,this.pos=n,r&&(this.status=r)}isSymbol(...e){let t="Symbol"==this.type;return e.length?e.some((e=>e===this.value)):t}isSpace(){return"Space"==this.type}isNumber(){return"Number"==this.type}isWord(){return"Word"==this.type}}function r(e){let t=-1,n=e.length,r=-1,i=0;return{curr:(n=0)=>e[t+n],next(n=1){let s=e[t+=n];return"\n"==s?(i++,r=0):r+=n,s},end:()=>t>=n,get:()=>({prev:e[t-1],curr:e[t+0],next:e[t+1],next2:e[t+2],next3:e[t+3],pos:[r,i]})}}function i(e){for(;e.next();){let{curr:n,prev:r}=e.get();if(t.comment(n,r))break}}function s(e){return[":",";",",","{","}","(",")","[","]"].includes(e)}function l(e){let n="";for(;!e.end();){let{curr:r,next:i}=e.get();n+=r;let s=t.symbol(i)||t.space(i)||t.digit(i);if(n.length&&s&&!t.closedTag(r,i))break;e.next()}return n.trim()}function o(e){let n="";for(;!e.end();){let{curr:r,next:i}=e.get();if(n+=r,!t.space(i))break;e.next()}return n}function a(e){let n="",r=!1;for(;!e.end();){let{curr:i,next:s,next2:l,next3:o}=e.get();if(n+=i,r&&t.dot(s))break;if(t.dot(i)&&(r=!0),t.dots(s,l))break;if(t.expWithSign(s,l,o))n+=e.next()+e.next();else if(t.exp(s,l))n+=e.next();else if(!t.digit(s)&&!t.dot(s))break;e.next()}return n}function u(e){let n="0x";for(e.next(2);!e.end();){let{curr:r,next:i}=e.get();if(n+=r,!t.hexNum(i))break;e.next()}return n}function c(e){return e[e.length-1]}function h(e){let h=r(String(e).trim()),p=[],f=[];for(;h.next();){let{prev:e,curr:r,next:d,next2:m,pos:g}=h.get();if(t.comment(r,d))i(h);else if(t.hex(r,d,m)){let e=u(h);p.push(new n({type:"Number",value:e,pos:g}))}else if(t.digit(r)||t.digit(d)&&t.dot(r)&&!t.dots(e,r)){let e=a(h);p.push(new n({type:"Number",value:e,pos:g}))}else if(t.symbol(r)&&!t.selfClosedTag(r,d)){let e=c(p),i=t.digit(d)||t.dot(d)&&t.digit(m);if("-"===r&&i&&(!e||!e.isNumber())){let e=a(h);p.push(new n({type:"Number",value:e,pos:g}));continue}let s={type:"Symbol",value:r,pos:g};if(f.length&&t.escape(e.value)){p.pop();let e=l(h);e.length&&p.push(new n({type:"Word",value:e,pos:g}))}else{if(t.quote(r)){c(f)==r?(f.pop(),s.status="close"):(f.push(r),s.status="open")}p.push(new n(s))}}else if(t.space(r)){let e=o(h),t=c(p),{next:r}=h.get();if(!f.length&&t){if(s(t.value)||s(r))continue;e=" "}p.length&&r&&r.trim()&&p.push(new n({type:"Space",value:e,pos:g}))}else{let e=l(h);e.length&&p.push(new n({type:"Word",value:e,pos:g}))}}let d=c(p);return d&&d.isSpace()&&(p.length=p.length-1),p}function p(e){let t=[];for(;e.next();){let{curr:n,next:r}=e.get();if("var"===n.value){if(r&&r.isSymbol("(")){e.next();let n=f(e);m(n.name)&&t.push(n)}}else if(t.length&&!n.isSymbol(","))break}return t}function f(e){let t={},n=[];for(;e.next();){let{curr:r,next:i}=e.get();if(r.isSymbol(")",";")&&!t.name){t.name=d(n);break}r.isSymbol(",")?(void 0===t.name&&(t.name=d(n),n=[]),t.name&&(t.fallback=p(e))):n.push(r)}return t}function d(e){return e.map((e=>e.value)).join("")}function m(e){return void 0!==e&&(!(e.length<=2)&&(!e.substr(2).startsWith("-")&&!!e.startsWith("--")))}function g(e){return{make_array:function(e){return Array.isArray(e)?e:[e]},join:function(e,t="\n"){return(e||[]).join(t)},last:function(e,t=1){return e[e.length-t]},first:function(e){return e[0]},clone:function(e){return JSON.parse(JSON.stringify(e))},shuffle:function(t){let n=[...t],r=t.length;for(;r;){let t=~~(e()*r--),i=n[r];n[r]=n[t],n[t]=i}return n},flat_map:function(e,t){return Array.prototype.flatMap?e.flatMap(t):e.reduce(((e,n)=>e.concat(t(n))),[])},duplicate:function(e){return[].concat(e,e)},remove_empty_values:function(e){return e.filter((e=>null!=e&&String(e).trim().length))}}}let{first:y,last:v,clone:x}=g();const b={func:(e="")=>({type:"func",name:e,arguments:[]}),argument:()=>({type:"argument",value:[]}),text:(e="")=>({type:"text",value:e}),pseudo:(e="")=>({type:"pseudo",selector:e,styles:[]}),cond:(e="")=>({type:"cond",name:e,styles:[],arguments:[]}),rule:(e="")=>({type:"rule",property:e,value:[]}),keyframes:(e="")=>({type:"keyframes",name:e,steps:[]}),step:(e="")=>({type:"step",name:e,styles:[]})},_={white_space:e=>/[\s\n\t]/.test(e),line_break:e=>/\n/.test(e),number:e=>!isNaN(e),pair:e=>['"',"(",")","'"].includes(e),pair_of:(e,t)=>({'"':'"',"'":"'","(":")"}[e]==t)},w={\u03c0:Math.PI,"\u220f":Math.PI};function k(e){return["@canvas","@shaders","@doodle"].includes(e)}function $(e,{col:t,line:n}){console.warn(`(at line ${n}, column ${t}) ${e}`)}function S(e){return function(t,n){let r=t.index(),i="";for(;!t.end();){let n=t.next();if(e(n))break;i+=n}return n&&t.index(r),i}}function j(e,t){return S((e=>/[^\w@]/.test(e)))(e,t)}function E(e){return S((e=>/[\s\{]/.test(e)))(e)}function z(e,t){return S((e=>_.line_break(e)||"{"==e))(e,t)}function T(e,t){let n,r=b.step();for(;!e.end()&&"}"!=(n=e.curr());)if(_.white_space(n))e.next();else{if(r.name.length){if(r.styles.push(X(e,t)),"}"==e.curr())break}else r.name=W(e);e.next()}return r}function A(e,t){const n=[];let r;for(;!e.end()&&"}"!=(r=e.curr());)_.white_space(r)||n.push(T(e,t)),e.next();return n}function R(e,t){let n,r=b.keyframes();for(;!e.end()&&"}"!=(n=e.curr());)if(r.name.length){if("{"==n){e.next(),r.steps=A(e,t);break}e.next()}else if(j(e),r.name=E(e),!r.name.length){$("missing keyframes name",e.info());break}return r}function N(e,t={}){for(e.next();!e.end();){let n=e.curr();if(t.inline){if("\n"==n)break}else if("*"==(n=e.curr())&&"/"==e.curr(1))break;e.next()}t.inline||(e.next(),e.next())}function C(e){for(e.next();!e.end();){if(">"==e.curr())break;e.next()}}function P(e){let t,n="";for(;!e.end()&&":"!=(t=e.curr());)_.white_space(t)||(n+=t),e.next();return n}function M(e,t,n){let r,i=[],s=[],l=[],o="";for(;!e.end();){if(r=e.curr(),/[\('"`]/.test(r)&&"\\"!==e.curr(-1))l.length&&"("!=r&&r===v(l)?l.pop():l.push(r),o+=r;else if("@"!=r||n)if(n&&/[)]/.test(r)||!n&&/[,)]/.test(r))if(l.length)")"==r&&l.pop(),o+=r;else{if(o.length&&(s.length?s.push(b.text(o)):s.push(b.text((a=o).trim().length?_.number(+a)?+a:a.trim():a)),o.startsWith("\xb1")&&!n)){let e=o.substr(1),t=x(s);v(t).value="-"+e,i.push(L(t)),v(s).value=e}if(i.push(L(s)),[s,o]=[[],""],")"==r)break}else w[r]&&!/[0-9]/.test(e.curr(-1))&&(r=w[r]),o+=r;else s.length||(o=o.trimLeft()),o.length&&(s.push(b.text(o)),o=""),s.push(O(e));if(!(!t||")"!=e.curr(1)&&/[0-9a-zA-Z_\-.]/.test(e.curr())||l.length)){s.length&&i.push(L(s));break}e.next()}var a;return i}function L(e){let t=e.map((e=>{if("text"==e.type&&"string"==typeof e.value){let t=String(e.value);t.includes("`")&&(e.value=t=t.replace(/`/g,'"')),e.value=t}return e})),n=y(t)||{},r=v(t)||{};if("text"==n.type&&"text"==r.type){let e=y(n.value),i=v(r.value);"string"==typeof n.value&&"string"==typeof r.value&&_.pair_of(e,i)&&(n.value=n.value.slice(1),r.value=r.value.slice(0,r.value.length-1),t.cluster=!0)}return t}function O(e){let t,n=b.func(),r="@",i=!1;for(e.next();!e.end();){t=e.curr();let s="."==t&&"@"==e.curr(1),l=e.curr(1);if("("==t||s){i=!0,e.next(),n.arguments=M(e,s,k(r));break}if(!i&&"("!==l&&!/[0-9a-zA-Z_\-.]/.test(l)){r+=t;break}r+=t,e.next()}let{fname:s,extra:l}=function(e){let t="",n="";if(/\D$/.test(e)&&!/\d+x\d+/.test(e)||Math[e.substr(1)])return{fname:e,extra:n};for(let r=e.length-1;r>=0;r--){let i=e[r],s=e[r-1],l=e[r+1];if(!(/[\d.]/.test(i)||"x"==i&&/\d/.test(s)&&/\d/.test(l))){t=e.substring(0,r+1);break}n=i+n}return{fname:t,extra:n}}(r);return n.name=s,l.length&&n.arguments.unshift([{type:"text",value:l}]),n.position=e.info().index,n}function I(e){let t,n=b.text(),r=0,i=!0;const s=[],l=[];for(s[r]=[];!e.end();)if(t=e.curr(),i&&_.white_space(t))e.next();else{if(i=!1,"\n"!=t||_.white_space(e.curr(-1)))if(","!=t||l.length){if(/[;}<]/.test(t)){n.value.length&&(s[r].push(n),n=b.text());break}"@"==t?(n.value.length&&(s[r].push(n),n=b.text()),s[r].push(O(e))):_.white_space(t)&&_.white_space(e.curr(-1))||("("==t&&l.push(t),")"==t&&l.pop(),w[t]&&!/[0-9]/.test(e.curr(-1))&&(t=w[t]),n.value+=t)}else n.value.length&&(s[r].push(n),n=b.text()),s[++r]=[],i=!0;else n.value+=" ";e.next()}return n.value.length&&s[r].push(n),s}function W(e){let t,n="";for(;!e.end()&&"{"!=(t=e.curr());)_.white_space(t)||(n+=t),e.next();return n}function U(e){let t,n={name:"",arguments:[]};for(;!e.end();){if("("==(t=e.curr()))e.next(),n.arguments=M(e);else{if(/[){]/.test(t))break;_.white_space(t)||(n.name+=t)}e.next()}return n}function D(e,t){let n,r=b.pseudo();for(;!e.end()&&"}"!=(n=e.curr());)if(_.white_space(n))e.next();else{if(r.selector){let n=X(e,t);if("@use"==n.property?r.styles=r.styles.concat(n.value):r.styles.push(n),"}"==e.curr())break}else r.selector=W(e);e.next()}return r}function X(e,t){let n=b.rule();for(;!e.end()&&";"!=e.curr();){if(n.property.length){n.value=I(e);break}if(n.property=P(e),"@use"==n.property){n.value=F(e,t);break}e.next()}return n}function q(e,t){let n,r=b.cond();for(;!e.end()&&"}"!=(n=e.curr());){if(r.name.length)if(":"==n){let t=D(e);t.selector&&r.styles.push(t)}else if("@"!=n||z(e,!0).includes(":")){if(!_.white_space(n)){let n=X(e,t);if(n.property&&r.styles.push(n),"}"==e.curr())break}}else r.styles.push(q(e));else Object.assign(r,U(e));e.next()}return r}function H(e,t){let n="";return e&&e.get_variable&&(n=e.get_variable(t)),n}function B(e,t){e.forEach&&e.forEach((e=>{if("text"==e.type&&e.value){let n=p(r(h(e.value)));e.value=n.reduce(((e,n)=>{let r,i="",s="";i=H(t,n.name),!i&&n.fallback&&n.fallback.every((e=>{if(s=H(t,e.name),s)return i=s,!1}));try{r=V(i,t)}catch(e){}return r&&e.push.apply(e,r),e}),[])}"func"==e.type&&e.arguments&&e.arguments.forEach((e=>{B(e,t)}))}))}function F(e,t){return e.next(),(I(e)||[]).reduce(((e,n)=>{B(n,t);let[r]=n;return r.value&&r.value.length&&e.push(...r.value),e}),[])}function V(e,t){const n=function(e=""){let t=0,n=1,r=1;return{curr:(n=0)=>e[t+n],end:()=>e.length<=t,info:()=>({index:t,col:n,line:r}),index:e=>void 0===e?t:t=e,next(){let i=e[t++];return"\n"==i?(r++,n=0):n++,i}}}(e),r=[];for(;!n.end();){let e=n.curr();if(_.white_space(e))n.next();else{if("/"==e&&"*"==n.curr(1))N(n);else if("/"==e&&"/"==n.curr(1))N(n,{inline:!0});else if(":"==e){let e=D(n,t);e.selector&&r.push(e)}else if("@"==e&&"@keyframes"===j(n,!0)){let e=R(n,t);r.push(e)}else if("@"!=e||z(n,!0).includes(":")){if("<"==e)C(n);else if(!_.white_space(e)){let e=X(n,t);e.property&&r.push(e)}}else{let e=q(n,t);e.name.length&&r.push(e)}n.next()}}return r}function Y(e,t,n){return Math.max(t,Math.min(n,e))}function Z(e,t,n){let r=0,i=e,s=e=>e>0&&e<1?.1:1,l=arguments.length;1==l&&([e,t]=[s(e),e]),l<3&&(n=s(e));let o=[];for(;(n>=0&&e<=t||n<0&&e>t)&&(o.push(e),e+=n,!(r++>=1e3)););return o.length||o.push(i),o}function G(e,t){return Object.keys(t).forEach((n=>{e[n]=e[t[n]]})),e}function K(e){return/^[a-zA-Z]$/.test(e)}function J(e){return null==e}function Q(e){return J(e)||Number.isNaN(e)}function ee(e){return J(e)||""===e}function te(e){let t=()=>e;return t.lazy=!0,t}function ne(e,t,n){return"c-"+e+"-"+t+"-"+n}function re(e){for(;e&&e.value;)return re(e.value);return J(e)?"":e}function ie(e,t,n=0){let r=new Image;r.crossOrigin="anonymous",r.src=e,r.onload=function(){setTimeout(t,n)}}function se(){return/^((?!chrome|android).)*safari/i.test(navigator.userAgent)}function le(e){let t=document.createElement("textarea");return t.innerHTML=e,t.value}function oe(e,t=0){let n=3735928559^t,r=1103547991^t;for(let t,i=0;i>>16,2246822507)^Math.imul(r^r>>>13,3266489909),r=Math.imul(r^r>>>16,2246822507)^Math.imul(n^n>>>13,3266489909),4294967296*(2097151&r)+(n>>>0)}function ae(e){return(t,...n)=>{let r=t.reduce(((e,t,r)=>{return e+t+(J(i=n[r])?"":i);var i}),"");return e(r)}}const[ue,ce,he]=[1,32,1024];function pe(e){let[t,n,r]=(e+"").replace(/\s+/g,"").replace(/[,\uff0cxX]+/g,"x").split("x").map((e=>parseInt(e)));const i=1==t||1==n?he:ce,s=1==t&&1==n?he:ue,l={x:Y(t||ue,1,i),y:Y(n||t||ue,1,i),z:Y(r||ue,1,s)};return Object.assign({},l,{count:l.x*l.y*l.z,ratio:l.x/l.y})}function fe(e){return/^texture\w*$|^(fragment|vertex)$/.test(e)}function de(){return new n({type:"LineBreak",value:"\n"})}function me(e){let t=e[0],n=e[e.length-1];for(;t&&t.isSymbol("(")&&n&&n.isSymbol(")");)t=(e=e.slice(1,e.length-1))[0],n=e[e.length-1];return e}function ge(e){return me(e).map((e=>e.value)).join("")}const ye="http://www.w3.org/2000/svg",ve="http://www.w3.org/1999/xlink";function xe(e,t){return`url("data:image/svg+xml;utf8,${encodeURIComponent(e)+(t?`#${t}`:"")}")`}function be(e){const t=`xmlns="${ye}"`,n=`xmlns:xlink="${ve}"`;return e.includes("${e}`),e.includes("xmlns")||(e=e.replace(/])/,`{_e(t,n,e)})),t.appendChild(n))}catch(e){}if("statement"===e.type)if(n&&"text"==n.name&&"content"===e.name)t.textContent=e.value;else try{let n=e.name.startsWith("xlink:")?ve:ye;t.setAttributeNS(n,e.name,e.value)}catch(e){}if(!n){let e=t.childNodes[0];return e&&e.outerHTML||""}return t}function we(e){function t(e,t,n){return t+e*(n-t)}return{lerp:t,rand:function(n=0,r){return 1==arguments.length&&([n,r]=[0,n]),t(e(),n,r)},pick:function(...t){let n=t.reduce(((e,t)=>e.concat(t)),[]);return n[~~(e()*n.length)]},unique_id:function(e=""){return e+Math.random().toString(32).substr(2)}}}function ke(e){return(...t)=>{let n=function(e){let t="";return e.some((e=>{let n=String(e).trim();if(!n)return"";let r=n.match(/\d(\D+)$/);return t=r?r[1]:""})),t}(t);return function(e,t){return(...n)=>{n=n.map((e=>Number(String(e).replace(/\D+$/g,""))));let r=e.apply(null,n);return t.length?Array.isArray(r)?r.map((e=>e+t)):r+t:r}}(e,n).apply(null,t)}}function $e(e){return(...t)=>{let n=t.map((e=>String(e).charCodeAt(0))),r=e.apply(null,n);return Array.isArray(r)?r.map((e=>String.fromCharCode(e))):String.fromCharCode(r)}}let{last:Se}=g();const je={\u03c0:Math.PI,gcd:(e,t)=>{for(;t;)[e,t]=[t,e%t];return e}};function Ee(e,t){return Te(Ae(e),Object.assign({},je,t))}const ze={"^":7,"*":6,"/":6,"\xf7":6,"%":6,"&":5,"|":5,"+":4,"-":4,"<":3,"<<":3,">":3,">>":3,"=":3,"==":3,"\u2264":3,"<=":3,"\u2265":3,">=":3,"\u2260":3,"!=":3,"\u2227":2,"&&":2,"\u2228":2,"||":2,"(":1,")":1};function Te(e,t,n=[]){let r=[];for(;e.length;){let{name:s,value:l,type:o}=e.shift();if("variable"===o){let e=t[l];Q(e)&&(e=Math[l]),Q(e)&&(e=Ne(l,t)),Q(e)&&/^\-\D/.test(l)&&(e=Ne("-1"+l.substr(1),t)),void 0===e&&(e=0),"number"!=typeof e&&(n.push(e),(i=n)[0]==i[2]&&i[1]==i[3]?(e=0,n=[]):e=Te(Ae(e),t,n)),r.push(e)}else if("function"===o){let e=!1;/^\-/.test(s)&&(e=!0,s=s.substr(1));let n,i=l.map((e=>Te(e,t))),o=s.split(".");for(;n=o.pop();){if(!n)continue;let e=t[n]||Math[n];i="function"==typeof e?Array.isArray(i)?e(...i):e(i):0}e&&(i*=-1),r.push(i)}else if(/\d+/.test(l))r.push(l);else{let e=r.pop(),t=r.pop();r.push(Re(l,Number(t),Number(e)))}}var i;return Number(r[0])||0}function Ae(e){let t=function(e){let t=String(e),n=[],r="";for(let e=0;e=]$/.test(s.value))s.value+=i;else if(/^[|&<>]$/.test(i)&&s&&s.value==i)s.value+=i;else if("-"==i&&"e"==t[e-1])r+=i;else if(n.length||r.length||!/[+-]/.test(i)){let{type:e,value:t}=s||{};"operator"==e&&!r.length&&/[^()]/.test(i)&&/[^()]/.test(t)?r+=i:(r.length&&(n.push({type:"number",value:r}),r=""),n.push({type:"operator",value:i}))}else r+=i}else/\S/.test(i)&&(","==i?(n.push({type:"number",value:r}),r="",n.push({type:"comma",value:i})):"!"==i?(n.push({type:"number",value:r}),n.push({type:"operator",value:i}),r=""):r+=i)}return r.length&&n.push({type:"number",value:r}),n}(e);const n=[],r=[];for(let e=0;e=ze[s];){let e=n.pop();/[()]/.test(e)||r.push({type:"operator",value:e})}n.push(s)}}for(;n.length;)r.push({type:"operator",value:n.pop()});return r}function Re(e,t,n){switch(e){case"+":return t+n;case"-":return t-n;case"*":return t*n;case"%":return t%n;case"|":return t|n;case"&":return t&n;case"<":return t":return t>n;case"^":return Math.pow(t,n);case"\xf7":case"/":return t/n;case"=":case"==":return t==n;case"\u2264":case"<=":return t<=n;case"\u2265":case">=":return t>=n;case"\u2260":case"!=":return t!=n;case"\u2227":case"&&":return t&&n;case"\u2228":case"||":return t||n;case"<<":return t<>":return t>>n}}function Ne(e,t){let[n,r,i]=e.match(/([\d.\-]+)(.*)/)||[],s=t[i];return void 0===s?s:"number"==typeof s?Number(r)*s:r*Te(Ae(s),t)}var Ce=new class{constructor(){this.cache={}}clear(){this.cache={}}set(e,t){if(J(e))return"";let n=this.getKey(e);return this.cache[n]=t}get(e){let t=this.getKey(e);return this.cache[t]}getKey(e){return oe("string"==typeof e?e:JSON.stringify(e))}};function Pe(e,t){return(...n)=>{let r=e+n.join("-");return Ce.get(r)||Ce.set(r,t.apply(null,n))}}const{last:Me,flat_map:Le}=g();function Oe(e){return(...t)=>e.apply(null,Le(t,(e=>String(e).startsWith("[")?We(e):e)))}function Ie(e,t){return{type:e,value:t}}const We=Pe("build_range",(e=>{let t=function(e){let t=String(e),n=[],r=[];if(!t.startsWith("[")||!t.endsWith("]"))return n;for(let e=1;e{if("char"==e)return t;let[n,r]=t,i=!1;n>r&&([n,r]=[r,n],i=!0);let s=$e(Z)(n,r);return i&&s.reverse(),s}))}));class Ue{constructor(e){this.prev=this.next=null,this.data=e}}class De{constructor(e=20){this._limit=e,this._size=0}push(e){this._size>=this._limit&&(this.root=this.root.next,this.root.prev=null);let t=new Ue(e);this.root?(t.prev=this.tail,this.tail.next=t,this.tail=t):this.root=this.tail=t,this._size++}last(e=1){let t=this.tail;for(;--e&&t.prev;)t=t.prev;return t.data}}class Xe{constructor(e){let{lerp:t}=we(e),{shuffle:n,duplicate:r}=g(e);this.lerp=t,this.p=r(n([151,160,137,91,90,15,131,13,201,95,96,53,194,233,7,225,140,36,103,30,69,142,8,99,37,240,21,10,23,190,6,148,247,120,234,75,0,26,197,62,94,252,219,203,117,35,11,32,57,177,33,88,237,149,56,87,174,20,125,136,171,168,68,175,74,165,71,134,139,48,27,166,77,146,158,231,83,111,229,122,60,211,133,230,220,105,92,41,55,46,245,40,244,102,143,54,65,25,63,161,1,216,80,73,209,76,132,187,208,89,18,169,200,196,135,130,116,188,159,86,164,100,109,198,173,186,3,64,52,217,226,250,124,123,5,202,38,147,118,126,255,82,85,212,207,206,59,227,47,16,58,17,182,189,28,42,223,183,170,213,119,248,152,2,44,154,163,70,221,153,101,155,167,43,172,9,129,22,39,253,19,98,108,110,79,113,224,232,178,185,112,104,218,246,97,228,251,34,242,193,238,210,144,12,191,179,162,241,81,51,145,235,249,14,239,107,49,192,214,31,181,199,106,157,184,84,204,176,115,121,50,45,127,4,150,254,138,236,205,93,222,114,67,29,24,72,243,141,128,195,78,66,215,61,156,180]))}grad(e,t,n,r){let i=15&e,s=i<8?t:n,l=i<4?n:12==i||14==i?t:r;return(0==(1&i)?s:-s)+(0==(2&i)?l:-l)}noise(e,t,n){let{p:r,grad:i,lerp:s}=this,[l,o,a]=[e,t,n].map((e=>255&Math.floor(e)));[e,t,n]=[e,t,n].map((e=>e-Math.floor(e)));let[u,c,h]=[e,t,n].map((e=>e*e*e*(e*(6*e-15)+10))),p=r[l]+o,f=r[p]+a,d=r[p+1]+a,m=r[l+1]+o,g=r[m]+a,y=r[m+1]+a;return s(h,s(c,s(u,i(r[f],e,t,n),i(r[g],e-1,t,n)),s(u,i(r[d],e,t-1,n),i(r[y],e-1,t-1,n))),s(c,s(u,i(r[f+1],e,t,n-1),i(r[g+1],e-1,t,n-1)),s(u,i(r[d+1],e,t-1,n-1),i(r[y+1],e-1,t-1,n-1))))}}function qe(e){let t,n=r(h(e)),i={},s=[],l=!1;for(;n.next();){let{prev:e,curr:r,next:o}=n.get();if(r.isSymbol(":")&&!t)t=Be(s),s=[];else if(r.isSymbol(";")&&t)i[t]=He(t,Be(s),l),s=[],t=null,l=!1;else if(!r.isSymbol(";")){let n=e&&e.isSymbol("-"),i=o&&o.isSymbol("-"),a=r.isSymbol("-");t||s.length||!a||n||i||o&&o.isSymbol(":")?s.push(r):l=!0}}return s.length&&t&&(i[t]=He(t,Be(s),l)),i}function He(e,t,n){return["fill-rule","fill"].includes(e)?t:n?`-1 * (${t})`:t}function Be(e){return e.map((e=>e.value)).join("")}function Fe(e,t){let n=[],i=[],s=[],l=[];if(ee(e))return n;let o=r(h(e));for(;o.next();){let{prev:e,curr:r,next:u}=o.get();r.isSymbol("(")&&s.push(r.value),r.isSymbol(")")&&s.pop(),"open"===r.status&&l.push(r.value),"close"===r.status&&l.pop(),a=r,!(t?a.isSymbol(","):a.isSymbol(",")||a.isSpace())||s.length||l.length?i.push(r):(n.push(Ve(i)),i=[])}var a;return i.length&&n.push(Ve(i)),n}function Ve(e){return e.map((e=>e.value)).join("")}const Ye=["auto","reverse"],Ze=["deg","rad","grad","turn"];function Ge(e){let t=r(h(e)),n=!1,i="",s={direction:"",angle:""};for(;t.next();){let{prev:e,curr:r,next:l}=t.get();if(r.isWord()&&Ye.includes(r.value))s.direction=r.value,n=!0;else if(r.isNumber())s.angle=Number(r.value),n=!0;else if(r.isWord()&&e&&e.isNumber()&&Ze.includes(r.value))i=r.value;else if(r.isSpace()&&""!==s.direction&&""!==s.angle)break}return n||(s.direction="auto"),function(e,t){let{angle:n}=e;""===n&&(n=0);"rad"===t&&(n/=Math.PI/180);"grad"===t&&(n*=.9);"turn"===t&&(n*=360);return Object.assign({},e,{angle:n})}(s,i)}const{cos:Ke,sin:Je,abs:Qe,atan2:et,PI:tt}=Math,nt=ae((e=>ot(qe(e),{min:3,max:3600}))),rt={circle:()=>nt`split:180;scale:.99`,triangle:()=>nt`rotate:30;scale:1.1;move:0 .2`,pentagon:()=>nt`split:5;rotate:54`,hexagon:()=>nt`split:6;rotate:30;scale:.98`,octagon:()=>nt`split:8;rotat:22.5;scale:.99`,star:()=>nt`split:10;r:cos(5t);rotate:-18;scale:.99`,infinity:()=>nt`split:180;scale:.99;x:cos(t)*.99 / (sin(t)^2 + 1);y:x * sin(t)`,heart:()=>nt`split:180;rotate:180;a:cos(t)*13/18 - cos(2t)*5/18;b:cos(3t)/18 + cos(4t)/18;x:(.75 * sin(t)^3) * 1.2;y:(a - b + .2) * -1.1`,bean:()=>nt`split:180;r:sin(t)^3 + cos(t)^3;move:-.35 .35;`,bicorn:()=>nt`split:180;x:cos(t);y:sin(t)^2 / (2 + sin(t)) - .5`,drop:()=>nt`split:180;rotate:90;scale:.95;x:sin(t);y:(1 + sin(t)) * cos(t) / 1.6`,fish:()=>nt`split:240;x:cos(t) - sin(t)^2 / sqrt(2) - .04;y:sin(2t)/2`,whale:()=>nt`split:240;rotate:180;R:3.4 * (sin(t)^2 - .5) * cos(t);x:cos(t) * R + .75;y:sin(t) * R * 1.2`,windmill:()=>nt`split:18;R:seq(.618, 1, 0);T:seq(t-.55, t, t);x:R * cos(T);y:R * sin(T)`,vase:()=>nt`split:240;scale:.3;x:sin(4t) + sin(t) * 1.4;y:cos(t) + cos(t) * 4.8 + .3`,clover:(e=3)=>(4==(e=Y(e,3,5))&&(e=2),nt`split:240;r:cos(${e}t);scale:.98`),hypocycloid:(e=3)=>(e=Y(e,3,5),nt`split:240;scale:${[0,0,0,.34,.25,.19][e]};k:${e};x:(k-1)*cos(t) + cos((k-1)*t);y:(k-1)*sin(t) - sin((k-1)*t)`),bud:(e=3)=>(e=Y(e,3,10),nt`split:240;scale:.8;r:1 + .2 * cos(${e}t)`)};class it{constructor(e,t,n){this.x=e,this.y=t,this.extra=n}valueOf(){return this.x+" "+this.y}toString(){return this.valueOf()}}function st(e,t,n,r,i){let s=180*et(t+r,e-n)/tt;return"reverse"===i.direction&&(s-=180),i.direction||(s=90),i.angle&&(s+=i.angle),s}function lt(e,t,n){let[r,i=r]=Fe(n).map(Number);return[e*r,t*i]}function ot(e,{min:t,max:n}){let i=Y(parseInt(e.vertices||e.points||e.split)||0,t,n),s=ee(e.x)?"cos(t)":e.x,l=ee(e.y)?"sin(t)":e.y,o=ee(e.r)?"":e.r,{unit:a,value:u}=function(e){let t=r(h(e)),n={},i=!1;for(;t.next();){let{prev:e,curr:r}=t.get();if(r.isNumber())n.value=Number(r.value),i=!0;else{if(!(i&&r.isWord()&&e&&e.isNumber()))break;n.unit=r.value}}return n}(o);return a&&!e[a]&&"t"!==a&&(ee(e.unit)&&(e.unit=a),o=e.r=u),e.degree&&(e.rotate=e.degree),e.origin&&(e.move=e.origin),function(e,t){"function"==typeof arguments[0]&&(t=e,e={}),t||(t=e=>[Ke(e),Je(e)]);let n,r,i=e.split||180,s=e.turn||1,l=e.frame,o=e.fill||e["fill-rule"],a=Ge(e.direction||e.dir||""),u=e.unit,c=2*tt*s/i,h=[],p=void 0===e.scale?1:e.scale,f=([e,t,n=0,r=0])=>{if("evenodd"==e||"nonzero"==e)return h.push(new it(e,"",""));let[i,s]=lt(e,-t,p),[l,o]=lt(n,-r,p),c=st(i,s,l,o,a);void 0!==u&&"%"!==u?"none"!==u&&(i+=u,s+=u):(i=50*(i+1)+"%",s=50*(s+1)+"%"),h.push(new it(i,s,c))};"nonzero"!=o&&"evenodd"!=o||f([o,"",""]);for(let e=0;e1&&(e*=2),0==e&&(e=.002);for(let n=0;n{let r=Object.assign({},e,{t,\u03b8:t,seq:(...e)=>e.length?e[n%e.length]:"",range:(e,t=0)=>((e=Number(e)||0)>(t=Number(t)||0)&&([e,t]=[t,e]),e+Qe(t-e)/(i-1)*n)}),a=Ee(s,r),u=Ee(l,r),c=0,h=0;if(o){let e=Ee(o,r);a=e*Ke(t),u=e*Je(t)}return e.rotate&&([a,u]=function(e,t,n){let r=-tt/180*n;return[e*Ke(r)-t*Je(r),t*Ke(r)+e*Je(r)]}(a,u,Number(e.rotate)||0)),e.move&&([a,u,c,h]=function(e,t,n){let[r,i=r]=Fe(n).map(Number);return[e+(r||0),t-(i||0),r,i]}(a,u,e.move)),[a,u,c,h]}))}function at(e,t){let n=[];for(;e.next();){let{curr:t,next:r}=e.get(),i=!r||t.isSymbol(";")||r.isSymbol("}");if(n.push(t),i)break}return n.length&&(t.value=ht(n)),t}function ut(e,t){let n=[],r=[],i=t&&t.type||"";for(;e.next();){let{prev:s,curr:l,next:o}=e.get(),a=!o||l.isSymbol("}");if("block"===i&&a){o||!n.length||l.isSymbol("}")||(n[n.length-1].value+=";"+l.value),t.value=n;break}if(l.isSymbol("{")){let t=ft(r,(e=>e.isSpace()));if(!t.length)continue;let i=t.pop(),s=pt(ut(e,{type:"block",name:i,value:[]}));for(;i=t.pop();)s=pt({type:"block",name:i,value:[s]});n.push(s),r=[]}else if(l.isSymbol(":")&&!ct(s,o)&&r.length){let s=ft(r,(e=>e.isSymbol(","))),l=at(e,{type:"statement",name:"unkown",value:""});s.forEach((e=>{n.push(Object.assign({},l,{name:e}))})),"block"==i&&(t.value=n),r=[]}else l.isSymbol(";")?n.length&&r.length&&(n[n.length-1].value+=";"+ht(r),r=[]):r.push(l)}return n.length&&"block"==i&&(t.value=n),i?t:n}function ct(e,t){let n=e&&e.value,r=t&&t.value;return["xlink:actuate","xlink:arcrole","xlink:href","xlink:role","xlink:show","xlink:title","xlink:type","xml:base","xml:lang","xml:space"].includes(n+":"+r)}function ht(e){return e.filter(((t,n)=>!t.isSymbol(";","}")||n!==e.length-1)).map((e=>e.value)).join("")}function pt(e){let t=e.name||"",[n,...r]=t.split(/#/),i=r[r.length-1];return i&&(e.name=n,e.value.push({type:"statement",name:"id",value:i})),e}function ft(e,t){let n=[],r=[];return e.forEach((e=>{t(e)?(n.push(ht(r)),r=[]):r.push(e)})),r.length&&n.push(ht(r)),n}function dt(e,t){return ut(r(h(e)),t||{type:"block",name:"svg",value:[]})}function mt(e){let t=r(h(e)),n={},i={commands:[],valid:!0};for(;t.next();){let{curr:e}=t.get();if(!e.isSpace()&&!e.isSymbol(","))if(e.isWord())n.name&&(i.commands.push(n),n={}),n.name=e.value,n.value=[],"MmLlHhVvCcSsQqTtAaZz".includes(e.value)?"mlhvcsqtaz".includes(e.value)?n.type="relative":n.type="absolute":(n.type="unknown",i.valid=!1);else if(n.value){let t=e.value;e.isNumber()&&(t=Number(e.value)),n.value.push(t)}else n.name||(i.valid=!1)}return n.name&&i.commands.push(n),i}const gt={name:"cssd-uniform-time","animation-name":"cssd-uniform-time-animation","animation-duration":"31536000000","animation-iteration-count":"infinite","animation-delay":"0s","animation-direction":"normal","animation-fill-mode":"none","animation-play-state":"running","animation-timing-function":"linear"};function yt(e){const{shuffle:t}=g(e),{pick:n,rand:r,lerp:i,unique_id:s}=we(e),l={i:({count:e})=>t=>e,y:({y:e})=>t=>e,x:({x:e})=>t=>e,z:({z:e})=>t=>e,I:({grid:e})=>t=>e.count,Y:({grid:e})=>t=>e.y,X:({grid:e})=>t=>e.x,Z:({grid:e})=>t=>e.z,id:({x:e,y:t,z:n})=>r=>ne(e,t,n),n:({extra:e})=>t=>e?e[0]+(Number(t)||0):"@n",nx:({extra:e})=>t=>e?e[1]+(Number(t)||0):"@nx",ny:({extra:e})=>t=>e?e[2]+(Number(t)||0):"@ny",N:({extra:e})=>t=>e?e[3]+(Number(t)||0):"@N",\u00b5:o(""),m:o(","),M:o(" "),p:({context:e})=>Oe(((...t)=>a(e,"last_pick",n(t)))),pn({context:e,extra:t,position:n}){let r="pn-counter"+n;return Oe(((...n)=>{e[r]||(e[r]=0),e[r]+=1;let i=n.length,[s=e[r]]=t||[],l=n[(s-1)%i];return a(e,"last_pick",l)}))},pd({context:e,extra:n,position:r}){let i="pd-counter"+r,s="pd-values"+r;return Oe(((...r)=>{e[i]||(e[i]=0),e[i]+=1,e[s]||(e[s]=t(r||[]));let l=r.length,[o=e[i]]=n||[],u=(o-1)%l,c=e[s][u];return a(e,"last_pick",c)}))},lp:({context:e})=>(t=1)=>{let n=e.last_pick;return n?n.last(t):""},r:({context:e})=>(...t)=>{let n=(t.every(K)?$e:ke)(r).apply(null,t);return a(e,"last_rand",n)},ri:({context:e})=>(...t)=>{let n=(t.every(K)?$e:ke)(((...e)=>Math.round(r(...e)))).apply(null,t);return a(e,"last_rand",n)},rn({x:t,y:n,context:r,position:s,grid:l,extra:o}){let u="noise-2d"+s,[h,p,f,d,m,g]=o||[],y=h&&d;return(...s)=>{let[o,h=o,d=1,v=1]=s;1==s.length&&([o,h]=[0,o]),r[u]||(r[u]=new Xe(e)),d=c(d),v=c(v);let x=[o,h].every(K)?$e:ke,b=y?r[u].noise((p-1)/m*d,(f-1)/g*d,0):r[u].noise((t-1)/l.x*d,(n-1)/l.y*d,0),_=x(((e,t)=>function(e,t,n,r=1){let s=2,l=Math.sqrt(s/4)*r,[o,a]=[-l,l];return i((e-o)/(a-o),t*r,n*r)}(b*v,e,t,v))),w=_(o,h);return a(r,"last_rand",w)}},lr:({context:e})=>(t=1)=>{let n=e.last_rand;return n?n.last(t):""},noise({context:t,grid:n,position:r,...i}){let s={i:i.count,I:n.count,x:i.x,X:n.x,y:i.y,Y:n.y,z:i.z,Z:n.z};return(n,i,l=0)=>{let o="raw-noise-2d"+r;return t[o]||(t[o]=new Xe(e)),t[o].noise(Ee(n,s),Ee(i,s),Ee(l,s))}},stripe:()=>(...e)=>{let t,n=e.map(re),r=n.length,i=0,s=[];if(!r)return"";n.forEach((e=>{let[t,n]=Fe(e);void 0!==n?s.push(n):i+=1}));let l=s.length?`(100% - ${s.join(" - ")}) / ${i}`:`100% / ${r}`;return n.map(((e,n)=>{if(s.length){let[n,r]=Fe(e);return t=(t?t+" + ":"")+(void 0!==r?r:l),`${n} 0 calc(${t})`}return`${e} 0 ${100/r*(n+1)}%`})).join(",")},calc:()=>e=>Ee(re(e)),hex:()=>e=>parseInt(re(e)).toString(16),svg:te(((...e)=>{let t=e.map((e=>re(e()).trim())).join(",");if(!t.startsWith("<")){t=_e(dt(t))}return xe(be(t))})),filter:te(((...e)=>{let t=e.map((e=>re(e()).trim())).join(","),n=s("filter-");if(!t.startsWith("<")){t=_e(dt(t,{type:"block",name:"filter"}))}return xe(be(t).replace(/])/,`e=>`var(${re(e)})`,t:()=>e=>`var(--${gt.name})`,plot({count:e,context:t,extra:n,position:r,grid:i}){let s="offset-points"+r;return r=>{let[l=e,o,a,u=i.count]=n||[];if(!t[s]){let e=qe(r);delete e.fill,delete e["fill-rule"],delete e.frame,e.points=u,t[s]=ot(e,{min:1,max:65536})}return t[s][l-1]}},shape:()=>Pe("shape-function",((e="",...t)=>{let n=[];if((e=String(e).trim()).length)if("function"==typeof rt[e])n=rt[e](t);else{let r=e,i=t.join(",");i.length&&(r=e+","+i),n=ot(qe(r),{min:3,max:3600})}return`polygon(${n.join(",")})`})),doodle:()=>e=>e,shaders:()=>e=>e,canvas:()=>e=>e,pattern:()=>e=>e,invert:()=>e=>{let t=mt(e);return t.valid?t.commands.map((({name:e,value:t})=>{switch(e){case"v":return"h"+t.join(" ");case"V":return"H"+t.join(" ");case"h":return"v"+t.join(" ");case"H":return"V"+t.join(" ");default:return e+t.join(" ")}})).join(" "):e},flipH:()=>e=>{let t=mt(e);return t.valid?t.commands.map((({name:e,value:t})=>{switch(e){case"h":case"H":return e+t.map(u).join(" ");default:return e+t.join(" ")}})).join(" "):e},flipV:()=>e=>{let t=mt(e);return t.valid?t.commands.map((({name:e,value:t})=>{switch(e){case"v":case"V":return e+t.map(u).join(" ");default:return e+t.join(" ")}})).join(" "):e},flip(...e){let t=l.flipH(...e),n=l.flipV(...e);return e=>n(t(e))},reverse:(...e)=>e=>{let t=mt(e);return t.valid?t.commands.reverse().map((({name:e,value:t})=>e+t.join(" "))).join(" "):e}};function o(e){return te(((t,...n)=>{if(!n||!t)return"";let r=re(t()),i=Ee(r);return 0===i&&(i=r),function(e,t){let[n,r=1]=String(e).split("x");n=Y(parseInt(n)||1,1,65536),r=Y(parseInt(r)||1,1,65536);let i=n*r,s=[],l=1;for(let e=1;e<=r;++e)for(let o=1;o<=n;++o)s.push(t(l++,o,e,i,n,r));return s}(i,((...e)=>n.map((t=>re(t(...e)))).join(","))).join(e)}))}function a(e,t,n){return e[t]||(e[t]=new De),e[t].push(n),n}function u(e){return-1*e}function c(e){return(e=Number(e)||0)<0?0:e}return G(l,{index:"i",col:"x",row:"y",depth:"z",rand:"r",pick:"p",stripes:"stripe",strip:"stripe",patern:"pattern",flipv:"flipV",fliph:"flipH","svg-filter":"filter","last-rand":"lr","last-pick":"lp",multiple:"m",multi:"m",rep:"\xb5",repeat:"\xb5",ms:"M",s:"I",size:"I",sx:"X","size-x":"X","size-col":"X","max-col":"X",sy:"Y","size-y":"Y","size-row":"Y","max-row":"Y",sz:"Z","size-z":"Z","size-depth":"Z","pick-by-turn":"pn",offset:"plot",Offset:"Plot",point:"plot",Point:"Plot",paint:"canvas"})}gt.animation=`\n ${gt["animation-duration"]}ms\n ${gt["animation-timing-function"]} ${gt["animation-delay"]} ${gt["animation-iteration-count"]} ${gt["animation-name"]}`;let vt=[];function xt(e){if(!vt.length){let e=new Set;for(let t in document.head.style)t.startsWith("-")||e.add(t.replace(/[A-Z]/g,"-$&").toLowerCase());e.has("grid-gap")||e.add("grid-gap"),vt=Array.from(e)}return e&&e.test?vt.filter((t=>e.test(t))):vt}function bt(e){let t=new RegExp(`\\-?${e}\\-?`);return xt(t).map((e=>e.replace(t,""))).reduce(((e,t)=>(e[t]=t,e)),{})}const _t=bt("webkit"),wt=bt("moz");function kt(e,t){return _t[e]?`-webkit-${t} ${t}`:wt[e]?`-moz-${t} ${t}`:t}const $t={"4a0":[1682,2378],"2a0":[1189,1682],a0:[841,1189],a1:[594,841],a2:[420,594],a3:[297,420],a4:[210,297],a5:[148,210],a6:[105,148],a7:[74,105],a8:[52,74],a9:[37,52],a10:[26,37],b0:[1e3,1414],b1:[707,1e3],b2:[500,707],b3:[353,500],b4:[250,353],b5:[176,250],b6:[125,176],b7:[88,125],b8:[62,88],b9:[44,62],b10:[31,44],b11:[22,32],b12:[16,22],c0:[917,1297],c1:[648,917],c2:[458,648],c3:[324,458],c4:[229,324],c5:[162,229],c6:[114,162],c7:[81,114],c8:[57,81],c9:[40,57],c10:[28,40],c11:[22,32],c12:[16,22],d0:[764,1064],d1:[532,760],d2:[380,528],d3:[264,376],d4:[188,260],d5:[130,184],d6:[92,126],letter:[216,279],postcard:[100,148],poster:[390,540]},St={portrait:"p",pt:"p",p:"p",landscape:"l",ls:"l",l:"l"};const jt={"@size"(e,{is_special_selector:t,grid:n}){let[r,i=r]=Fe(e);$t[r]&&([r,i]=function(e,t){e=String(e).toLowerCase();let[n,r]=$t[e]||[];return"p"==St[t]&&([r,n]=[n,r]),[r,n].map((e=>e+"mm"))}(r,i));let s=`\n width:${r};height:${i};`;return t?"auto"!==r&&"auto"!==i||(s+=`aspect-ratio:${n.ratio};`):s+=`\n --internal-cell-width:${r};--internal-cell-height:${i};`,s},"@offset":(()=>{let e={center:"50%",left:"0%",right:"100%",top:"50%",bottom:"50%"},t={center:"50%",top:"0%",bottom:"100%",left:"50%",right:"50%"};return(n,{extra:r})=>{let[i,s="50%"]=Fe(n);i=e[i]||i,s=t[s]||s;const l="var(--internal-cell-width, 25%)",o="var(--internal-cell-height, 25%)";return`\n position:absolute;left:${i};top:${s};width:${l};height:${o};margin-left:calc(${l} / -2);margin-top:calc(${o} / -2);grid-area:unset;--plot-angle:${r||0};transform:rotate(${r||0}deg);`}})(),"@grid"(e,t){let[n,...r]=e.split("/").map((e=>e.trim()));return r=r.join(" / "),{grid:pe(n),size:r?this["@size"](r,t):""}},"@shape":Pe("shape-property",(e=>{let[t,...n]=Fe(e),r="clip-path";return"function"!=typeof rt[t]?"":kt(r,`${r}:polygon(${rt[t](...n).join(",")});`)+"overflow:hidden;"})),"@use"(e){if(e.length>2)return e}};var Et=G(jt,{"@place-cell":"@offset"});function zt(e,t,n){for(let r=0;r<=n;++r)if(Ee(e,{n:r})==t)return!0}const Tt={even:e=>!(e%2),odd:e=>!!(e%2)};function At(e){return/^(even|odd)$/.test(e)}var Rt=Object.getOwnPropertyNames(Math).reduce(((e,t)=>(e[t]=()=>(...e)=>(e=e.map(re),"number"==typeof Math[t]?Math[t]:Math[t].apply(null,e.map(Ee))),e)),{});let{join:Nt,make_array:Ct,remove_empty_values:Pt}=g();function Mt(e){return/^\:(host|doodle)/.test(e)}function Lt(e){return/^\:(container|parent)/.test(e)}function Ot(e){return Mt(e)||Lt(e)}class It{constructor(e,t){this.tokens=e,this.rules={},this.props={},this.keyframes={},this.grid=null,this.is_grid_defined=!1,this.coords=[],this.doodles={},this.canvas={},this.pattern={},this.shaders={},this.reset(),this.Func=yt(t),this.Selector=function(e){return{at:({x:e,y:t})=>(n,r)=>e==n&&t==r,nth:({count:e,grid:t})=>(...n)=>n.some((n=>At(n)?Tt[n](e):zt(n,e,t.count))),row:({y:e,grid:t})=>(...n)=>n.some((n=>At(n)?Tt[n](e):zt(n,e,t.y))),col:({x:e,grid:t})=>(...n)=>n.some((n=>At(n)?Tt[n](e):zt(n,e,t.x))),even:({count:e,grid:t,y:n})=>r=>{if("cross"===r&&Tt.even(t.x)){let t=Tt.even(n)?"odd":"even";return Tt[t](e)}return Tt.even(e)},odd:({count:e,grid:t,y:n})=>r=>{if("cross"===r&&Tt.even(t.x)){let t=Tt.even(n)?"even":"odd";return Tt[t](e)}return Tt.odd(e)},random:()=>(t=.5)=>(t>=1&&t<=0&&(t=.5),e()s=>!!Ee("("+s+")",{x:r,X:n.x,y:i,Y:n.y,i:t,I:n.count,random:e})}}(t),this.custom_properties={},this.uniforms={},this.unique_id=we(t).unique_id}reset(){this.styles={host:"",container:"",cells:"",keyframes:""},this.coords=[],this.doodles={},this.canvas={},this.pattern={},this.shaders={};for(let e in this.rules)e.startsWith("#c")&&delete this.rules[e]}add_rule(e,t){let n=this.rules[e];n||(n=this.rules[e]=[]),n.push.apply(n,Ct(t))}pick_func(e){return this.Func[e]||Rt[e]}apply_func(e,t,n){let r=e(...Ct(t)),i=[];return n.forEach((e=>{let t=typeof e.value,n="number"===t||"string"===t;if(!e.cluster&&n)i.push(...Fe(e.value,!0));else if("function"==typeof e)i.push(e);else if(!J(e.value)){let t=re(e.value);i.push(t)}})),i=Pt(i),r(...Ct(i))}compose_aname(...e){return e.join("-")}compose_selector({x:e,y:t,z:n},r=""){return`#${ne(e,t,n)}${r}`}is_composable(e){return["doodle","shaders","canvas","pattern"].includes(e)}compose_argument(e,t,n=[]){let r=e.map((e=>{if("text"===e.type)return e.value;if("func"===e.type){let r=e.name.substr(1),i=this.pick_func(r);if("function"==typeof i){if("t"===r&&(this.uniforms.time=!0),this.is_composable(r)){let n=re((e.arguments[0]||[])[0]);if(!J(n))switch(r){case"doodle":return this.compose_doodle(n);case"shaders":return this.compose_shaders(n,t);case"canvas":return this.compose_canvas(n,e.arguments.slice(1));case"pattern":return this.compose_pattern(n,t)}}t.extra=n,t.position=e.position;let s=e.arguments.map((e=>i.lazy?(...n)=>this.compose_argument(e,t,n):this.compose_argument(e,t,n)));return this.apply_func(i,t,s)}}}));return{cluster:e.cluster,value:r.length>=2?{value:r.join("")}:r[0]}}compose_doodle(e){let t=this.unique_id("doodle");return this.doodles[t]=e,"${"+t+"}"}compose_shaders(e,{x:t,y:n,z:r}){let i=this.unique_id("shader");return this.shaders[i]={shader:e,cell:ne(t,n,r)},"${"+i+"}"}compose_pattern(e,{x:t,y:n,z:r}){let i=this.unique_id("pattern");return this.pattern[i]={code:e,cell:ne(t,n,r)},"${"+i+"}"}compose_canvas(e,t=[]){let n=e,r=t.map((e=>re(e[0]))).join(",");r.length&&(n=e+","+r);let i=this.unique_id("canvas");return this.canvas[i]={code:n},"${"+i+"}"}compose_value(e,t){if(!Array.isArray(e))return{value:"",extra:""};let n="";return{value:e.reduce(((e,r)=>{switch(r.type){case"text":e+=r.value;break;case"func":{let i=r.name.substr(1),s=this.pick_func(i);if("function"==typeof s)if("t"===i&&(this.uniforms.time=!0),this.is_composable(i)){let n=re((r.arguments[0]||[])[0]);if(!J(n))switch(i){case"doodle":e+=this.compose_doodle(n);break;case"shaders":e+=this.compose_shaders(n,t);break;case"pattern":e+=this.compose_pattern(n,t);break;case"canvas":e+=this.compose_canvas(n,r.arguments.slice(1))}}else{t.position=r.position;let i=r.arguments.map((e=>s.lazy?(...n)=>this.compose_argument(e,t,n):this.compose_argument(e,t))),l=this.apply_func(s,t,i);J(l)||(e+=l),l.extra&&(n=l.extra)}}}return e}),""),extra:n}}compose_rule(e,t,n){let r,i=Object.assign({},t),s=e.property,l=e.value.reduce(((e,t)=>{let n=this.compose_value(t,i);return n&&(n.value&&e.push(n.value),n.extra&&(r=n.extra)),e}),[]),o=l.join(", ");if(/^animation(\-name)?$/.test(s)){if(this.props.has_animation=!0,Mt(n)){let e=gt[s];e&&o&&(o=e+","+o)}if(i.count>1){let{count:e}=i;switch(s){case"animation-name":o=l.map((t=>this.compose_aname(t,e))).join(", ");break;case"animation":o=l.map((t=>{let n=(t||"").split(/\s+/);return n[0]=this.compose_aname(n[0],e),n.join(" ")})).join(", ")}}}"content"===s&&(/["']|^none$|^(var|counter|counters|attr|url)\(/.test(o)||(o=`'${o}'`)),"transition"===s&&(this.props.has_transition=!0);let a=`${s}:${o};`;if(a=kt(s,a),"clip-path"===s&&(a+=";overflow:hidden;"),"width"!==s&&"height"!==s||Ot(n)||(a+=`--internal-cell-${s}:${o};`),"background"===s&&(o.includes("shader")||o.includes("canvas")||o.includes("pattern"))&&(a+="background-size:100% 100%;"),/^\-\-/.test(s)&&(this.custom_properties[s]=o),Et[s]){let t=Et[s](o,{is_special_selector:Ot(n),grid:i.grid,extra:r});switch(s){case"@grid":Mt(n)?a=t.size||"":(a="",this.is_grid_defined||(t=Et[s](o,{is_special_selector:!0,grid:i.grid}),this.add_rule(":host",t.size||""))),this.grid=i.grid,this.is_grid_defined=!0;break;case"@place-cell":Mt(n)||(a=t);break;case"@use":e.value.length&&this.compose(i,e.value),a="";break;default:a=t}}return a}pre_compose_rule(e,t){let n=Object.assign({},t),r=e.property;switch(r){case"@grid":{let t=e.value.reduce(((e,t)=>{let r=this.compose_value(t,n);return r&&r.value&&e.push(r.value),e}),[]).join(", "),i=Et[r](t,{});this.grid=i.grid;break}case"@use":e.value.length&&this.pre_compose(n,e.value)}}pre_compose(e,t){(t||this.tokens).forEach((t=>{switch(t.type){case"rule":this.pre_compose_rule(t,e);break;case"pseudo":Mt(t.selector)&&(t.styles||[]).forEach((t=>{this.pre_compose_rule(t,e)}))}}))}compose(e,t,n){this.coords.push(e),(t||this.tokens).forEach(((t,r)=>{if(t.skip)return!1;if(n&&this.grid)return!1;switch(t.type){case"rule":this.add_rule(this.compose_selector(e),this.compose_rule(t,e));break;case"pseudo":{t.selector.startsWith(":doodle")&&(t.selector=t.selector.replace(/^\:+doodle/,":host"));let n=Ot(t.selector);n&&(t.skip=!0),t.selector.split(",").forEach((r=>{let i=t.styles.map((t=>this.compose_rule(t,e,r))),s=n?r:this.compose_selector(e,r);this.add_rule(s,i)}));break}case"cond":{let n=this.Selector[t.name.substr(1)];if(n){let r=t.arguments.map((t=>this.compose_argument(t,e)));this.apply_func(n,e,r)&&this.compose(e,t.styles)}break}case"keyframes":this.keyframes[t.name]||(this.keyframes[t.name]=e=>`\n ${Nt(t.steps.map((t=>`\n ${t.name}{${Nt(t.styles.map((t=>this.compose_rule(t,e))))}}`)))}`)}}))}output(){Object.keys(this.rules).forEach(((e,t)=>{if(Lt(e))this.styles.container+=`\n .container{${Nt(this.rules[e])}}`;else{let t=Mt(e)?"host":"cells",n=Nt(this.rules[e]).trim(),r="host"===t?`${e}, .host`:e;this.styles[t]+=`${r}{${n}}`}}));let e=Object.keys(this.keyframes);return this.uniforms.time&&(this.styles.container+=`\n:host, .host{animation:${gt.animation};}`,this.styles.keyframes+=`\n @keyframes ${gt["animation-name"]}{from{--${gt.name}:0} to{--${gt.name}:${gt["animation-duration"]}}}`),this.coords.forEach(((t,n)=>{e.forEach((e=>{let r=this.compose_aname(e,t.count);var i,s;this.styles.keyframes+=`\n ${i=0===n,s=`@keyframes ${e}{${this.keyframes[e](t)}}`,i?"function"==typeof s?s():s:""} @keyframes ${r}{${this.keyframes[e](t)}}`}))})),{props:this.props,styles:this.styles,grid:this.grid,doodles:this.doodles,shaders:this.shaders,canvas:this.canvas,pattern:this.pattern,uniforms:this.uniforms}}}function Wt(e,t,n){let r=new It(e,n),i={};r.pre_compose({x:1,y:1,z:1,count:1,context:{},grid:{x:1,y:1,z:1,count:1}});let{grid:s}=r.output();if(s&&(t=s),r.reset(),1==t.z)for(let e=1,n=0;e<=t.y;++e)for(let s=1;s<=t.x;++s)r.compose({x:s,y:e,z:1,count:++n,grid:t,context:i});else for(let e=1,n=0;e<=t.z;++e)r.compose({x:1,y:1,z:e,count:++n,grid:t,context:i});return r.output()}var Ut=window,Dt=Math,Xt=[],qt=256,Ht=Dt.pow(qt,6),Bt=Dt.pow(2,52),Ft=2*Bt,Vt=255;function Yt(e,t,n){var r=[],i=Jt(Kt((t=1==t?{entropy:!0}:t||{}).entropy?[e,Qt(Xt)]:null==e?function(){try{var e;return e=new Uint8Array(qt),(Ut.crypto||Ut.msCrypto).getRandomValues(e),Qt(e)}catch(e){var t=Ut.navigator,n=t&&t.plugins;return[+new Date,Ut,n,Ut.screen,Qt(Xt)]}}():e,3),r),s=new Zt(r),l=function(){for(var e=s.g(6),t=Ht,n=0;e=Ft;)e/=2,t/=2,n>>>=1;return(e+n)/t};return l.int32=function(){return 0|s.g(4)},l.quick=function(){return s.g(4)/4294967296},l.double=l,Jt(Qt(s.S),Xt),(t.pass||n||function(e,t,n,r){return r&&(r.S&&Gt(r,s),e.state=function(){return Gt(s,{})}),n?(Dt.random=e,t):e})(l,i,"global"in t?t.global:this==Dt,t.state)}function Zt(e){var t,n=e.length,r=this,i=0,s=r.i=r.j=0,l=r.S=[];for(n||(e=[n++]);i{let t=`uniform sampler2D ${e.name};`;o=tn(o,t)}));let a=function(e,t,n){let r=en(e,e.VERTEX_SHADER,t),i=en(e,e.FRAGMENT_SHADER,n),s=e.createProgram();return e.attachShader(s,r),e.attachShader(s,i),e.linkProgram(s),e.getProgramParameter(s,e.LINK_STATUS)||(console.warn("Link failed:"+e.getProgramInfoLog(s)),console.warn("vs info-log:"+e.getShaderInfoLog(r)),console.warn("fs info-log:"+e.getShaderInfoLog(i))),s}(l,e.vertex||"#version 300 es\n in vec4 position;void main(){gl_Position = position;}","#version 300 es\n precision highp float;out vec4 FragColor;"+o),u=l.getAttribLocation(a,"position"),c=l.createBuffer();l.bindBuffer(l.ARRAY_BUFFER,c);return l.bufferData(l.ARRAY_BUFFER,new Float32Array([-1,-1,-1,1,1,-1,1,1,-1,1,1,-1]),l.STATIC_DRAW),l.enableVertexAttribArray(u),l.vertexAttribPointer(u,2,l.FLOAT,!1,0,0),l.viewport(0,0,l.drawingBufferWidth,l.drawingBufferHeight),l.clearColor(0,0,0,0),l.clear(l.COLOR_BUFFER_BIT),l.useProgram(a),l.uniform2fv(l.getUniformLocation(a,"u_resolution"),[t,n]),e.textures.forEach(((e,t)=>{!function(e,t,n){const r=e.createTexture();e.activeTexture(e["TEXTURE"+n]),e.pixelStorei(e.UNPACK_FLIP_Y_WEBGL,!0),e.bindTexture(e.TEXTURE_2D,r),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR)}(l,e.value,t),l.uniform1i(l.getUniformLocation(a,e.name),t)})),l.drawArrays(l.TRIANGLES,0,6),Promise.resolve(Ce.set(e,i.toDataURL()))}function rn(e,t){let n=[];for(;e.next();){let{curr:t,next:r}=e.get(),i=!r||t.isSymbol(";")||r.isSymbol("}");if(n.push(t),i)break}return n.length&&(t.value=ln(n)),t}function sn(e,t){let n=[],r=[],i=t&&t.type||"",s=[];for(;e.next();){let{prev:l,curr:o,next:a}=e.get(),u=!a||o.isSymbol("}");if("block"===i&&u){a||!n.length||o.isSymbol("}")||(n[n.length-1].value+=";"+o.value),t.value=n;break}if(o.isSymbol("{")&&r.length&&!s.length){let t=on(r);if(!t.length)continue;let i=sn(e,{type:"block",name:"unkown",value:[]});t.forEach((e=>{let t=Object.assign({},i,{name:e.name,args:e.args});n.push(t)})),r=[]}else if(o.isSymbol(":")&&r.length&&!s.length){let s=ln(r);n.push(rn(e,{type:"statement",name:s,value:""})),"block"==i&&(t.value=n),r=[]}else o.isSymbol(";")?n.length&&r.length&&(n[n.length-1].value+=";"+ln(r),r=[]):(o.isSymbol("(")&&s.push(o),o.isSymbol(")")&&s.pop(),r.push(o))}return n.length&&"block"==i&&(t.value=n),i?t:n}function ln(e){return e.filter(((t,n)=>!t.isSymbol(";")||n!==e.length-1)).map((e=>e.value)).join("")}function on(e){let t=r(e),n=[],i="",s=[],l=[],o=[];for(;t.next();){let{curr:e,next:r}=t.get();!i.length&&e.isWord()?i=e.value:e.isSymbol("(")?(o.length&&l.push(e.value),o.push(e)):e.isSymbol(")")?(o.pop(),o.length?l.push(e.value):l.length&&(s.push(l.join("")),l=[])):e.isSymbol(",")?o.length?(s.push(l.join("")),l=[]):(l.length&&(s.push(l.join("")),l=[]),i&&(n.push({name:i,args:s}),i="",s=[],l=[])):l.push(e.value)}return i&&n.push({name:i,args:s}),n.filter(((e,t,n)=>n.findIndex((t=>t.name===e.name&&e.args.join("")==t.args.join("")))===t))}function an(e){return sn(r(h(e)))}function un(e,t){if("fill"===e.name){let{r:n,g:r,b:i,a:s}=t.get_rgba_color(e.value);return{type:"statement",value:`\ncolor = vec4(${cn(n/255)}, ${cn(r/255)}, ${cn(i/255)}, ${cn(s)});`}}return"grid"==e.name?{type:"grid",value:e.value}:{type:"statement",value:""}}function cn(e){return String(e).includes(".")?e:e+".0"}function hn(e,t){let n=an(e),r=[],i={x:1,y:1};return n.forEach((e=>{if("statement"===e.type){let n=un(e,t);"statement"==n.type&&r.push(n.value),"grid"===n.type&&(i=function(e){let[t,n=t]=String(e+"").replace(/\s+/g,"").replace(/[,\uff0cxX]+/g,"x").split("x").map((e=>parseInt(e)));return(!t||t<1)&&(t=1),(!n||n<1)&&(n=1),{x:t,y:n}}(n.value))}else"block"===e.type&&r.push(function(e,t){if("match"===e.name){let n=e.args[0],r=[];return e.value.forEach((e=>{let n=un(e,t);"statement"==n.type&&r.push(n.value)})),`\n if (${n}){${r.join("")}}`}return""}(e,t))})),function(e,t){return`\n vec3 mapping(vec2 uv, vec2 grid){vec2 _grid = 1.0/grid;float x = ceil(uv.x/_grid.x);float y = ceil(grid.y - uv.y/_grid.y);float i = x + (y - 1.0) * y;return vec3(x, y, i);} vec4 getColor(float x, float y, float i, float I, float X, float Y){vec4 color = vec4(0, 0, 0, 0);${e} return color;} void main(){vec2 uv = gl_FragCoord.xy/u_resolution.xy;vec2 grid = vec2(${t.x}, ${t.y});vec3 p = mapping(uv, grid);FragColor = getColor(p.x, p.y, p.z, grid.x * grid.y, grid.x, grid.y);}`}(r.join(""),i)}let pn=1;function fn(e){let t=Ce.get(e);if(t)return Promise.resolve(t);let n="css-doodle-paint-"+pn++,r=function(e,t){(t=le(t)).includes("paint(")||(t=`\n paint(ctx,{width, height}, props){${t}}`);return`\n registerPaint('${e}', class{${t}})\n`}(n,e),i=new Blob([r],{type:"text/javascript"});try{CSS.paintWorklet&&CSS.paintWorklet.addModule(URL.createObjectURL(i))}catch(e){}return Promise.resolve(Ce.set(e,`paint(${n})`))}class dn extends HTMLElement{constructor(){super(),this.doodle=this.attachShadow({mode:"open"}),this.extra={get_variable:e=>function(e,t){return getComputedStyle(e).getPropertyValue(t).trim().replace(/^\(|\)$/g,"")}(this,e),get_rgba_color:e=>function(e,t){let n=e.querySelector("#defs");return n?(n.style.color=t,function(e){let[t,n,r,i=1]=e.replace(/rgba?\((.+)\)/,((e,t)=>t)).split(/,\s*/);return{r:t,g:n,b:r,a:i}}(getComputedStyle(n).color)):{r:0,g:0,b:0,a:1}}(this.shadowRoot,e)}}connectedCallback(e){/^(complete|interactive|loaded)$/.test(document.readyState)?this.load(e):setTimeout((()=>this.load(e)))}update(e){Ce.clear();let t=this.get_use();e||(e=le(this.innerHTML)),this.innerHTML=e,this.grid_size||(this.grid_size=this.get_grid());let{x:n,y:r,z:i}=this.grid_size;const s=this.generate(V(t+e,this.extra));if(!this.shadowRoot.innerHTML)return Object.assign(this.grid_size,s.grid),this.build_grid(s,s.grid);if(s.grid){let{x:e,y:t,z:l}=s.grid;if(n!==e||r!==t||i!==l)return Object.assign(this.grid_size,s.grid),this.build_grid(s,s.grid);Object.assign(this.grid_size,s.grid)}else{let s=this.get_grid(),{x:l,y:o,z:a}=s;if(n!==l||r!==o||i!==a)return Object.assign(this.grid_size,s),this.build_grid(this.generate(V(t+e,this.extra)),s)}s.uniforms.time&&this.register_uniform_time();let l=this.replace(s);this.set_content(".style-keyframes",l(s.styles.keyframes)),s.props.has_animation&&(this.set_content(".style-cells",""),this.set_content(".style-container","")),setTimeout((()=>{this.set_content(".style-container",l(gn(this.grid_size)+s.styles.host+s.styles.container)),this.set_content(".style-cells",l(s.styles.cells))}))}get grid(){return Object.assign({},this.grid_size)}set grid(e){this.attr("grid",e),this.connectedCallback(!0)}get seed(){return this._seed_value}set seed(e){this.attr("seed",e),this.connectedCallback(!0)}get use(){return this.attr("use")}set use(e){this.attr("use",e),this.connectedCallback(!0)}static get observedAttributes(){return["grid","use","seed"]}attributeChangedCallback(e,t,n){if(t==n)return!1;["grid","use","seed"].includes(e)&&!J(t)&&(this[e]=n)}get_grid(){return pe(this.attr("grid"))}get_use(){let e=this.attr("use")||"";return e&&(e=`@use:${e};`),e}attr(e,t){return 1===arguments.length?this.getAttribute(e):2===arguments.length?(this.setAttribute(e,t),t):void 0}generate(e){let t=this.get_grid(),n=this.attr("seed")||this.attr("data-seed");J(n)&&(n=Date.now()),n=String(n),this._seed_value=n;let r=this.random=Yt(n);return this.compiled=Wt(e,t,r)}doodle_to_image(e,t,n){"function"==typeof t&&(n=t,t=null);let r=V(e,this.extra),i=pe({}),s=Wt(r,i,this.random),l=s.grid?s.grid:i;const{keyframes:o,host:a,container:u,cells:c}=s.styles;let h=this.replace(s),p=vn(l);h(`\n
${p}
`).then((e=>{let t=`data:image/svg+xml;base64,${window.btoa(unescape(encodeURIComponent(e)))}`;se()&&ie(t),n(t)}))}pattern_to_image({code:e,cell:t},n){let r=hn(e,this.extra);this.shader_to_image({shader:r,cell:t},n)}canvas_to_image({code:e},t){fn(e).then(t)}shader_to_image({shader:e,cell:t},n){let i=function(e){let t,n,i=r(me(h(e))),s=[],l=[],o={textures:[]};for(;i.next();){let{curr:e,next:r}=i.get();if(e.isSymbol("{")){if(s.length)l.push(e);else{let n=ge(l);fe(n)?(t=n,l=[]):l.push(e)}s.push("{")}else if(e.isSymbol("}"))if(s.pop(),!s.length&&t){let e=ge(l);t&&e.length&&(t.startsWith("texture")?o.textures.push({name:t,value:e}):o[t]=e,l=[]),t=null}else l.push(e);else ee(n)||n==e.pos[1]||(l.push(de()),n=null),e.isWord()&&e.value.startsWith("#")&&(l.push(de()),n=r.pos[1]),l.push(e)}return ee(o.fragment)?{fragment:ge(l),textures:[]}:o}(e),s=this.doodle.getElementById(t),{width:l,height:o}=s&&s.getBoundingClientRect()||{width:0,height:0},a=window.devicePixelRatio||1;if(i.textures.length){let e=i.textures.map((e=>new Promise((t=>{this.doodle_to_image(e.value,{width:l,height:o},(n=>{let r=new Image;r.width=l*a,r.height=o*a,r.onload=()=>t({name:e.name,value:r}),r.src=n}))}))));Promise.all(e).then((e=>{i.textures=e,nn(i,l,o).then(n)}))}else nn(i,l,o).then(n)}load(e){e||this.hasAttribute("click-to-update")&&this.addEventListener("click",(e=>this.update()));let t=V(this.get_use()+le(this.innerHTML),this.extra),n=this.generate(t);this.grid_size=n.grid?n.grid:this.get_grid(),this.build_grid(n,this.grid_size)}replace({doodles:e,shaders:t,canvas:n,pattern:r}){let i=Object.keys(e),s=Object.keys(t),l=Object.keys(n),o=Object.keys(r),a=i.length+l.length+s.length+o.length;return u=>{if(!a)return Promise.resolve(u);let c=[].concat(i.map((t=>u.includes(t)?new Promise((n=>{this.doodle_to_image(e[t],(e=>n({id:t,value:e})))})):Promise.resolve(""))),s.map((e=>u.includes(e)?new Promise((n=>{this.shader_to_image(t[e],(t=>n({id:e,value:t})))})):Promise.resolve(""))),l.map((e=>u.includes(e)?new Promise((t=>{this.canvas_to_image(n[e],(n=>t({id:e,value:n})))})):Promise.resolve(""))),o.map((e=>u.includes(e)?new Promise((t=>{this.pattern_to_image(r[e],(n=>t({id:e,value:n})))})):Promise.resolve(""))));return Promise.all(c).then((e=>(u.replaceAll?e.forEach((({id:e,value:t})=>{u=u.replaceAll("${"+e+"}",/^canvas/.test(e)?t:`url(${t})`)})):e.forEach((({id:e,value:t})=>{u=u.replace("${"+e+"}",/^canvas/.test(e)?t:`url(${t})`)})),u)))}}build_grid(e,t){const{has_transition:n,has_animation:r}=e.props;let i=n||r;const{keyframes:s,host:l,container:o,cells:a}=e.styles;let u=gn(t)+l+o,c=i?"":a;const{uniforms:h}=e;let p=this.replace(e);if(this.doodle.innerHTML=`\n${vn(t)}`,this.set_content(".style-container",p(u)),i?setTimeout((()=>{this.set_content(".style-cells",p(a))}),50):this.set_content(".style-cells",p(a)),window.CSS&&window.CSS.registerProperty)try{h.time&&this.register_uniform_time()}catch(e){}}register_uniform_time(){if(!this.is_uniform_time_registered){try{CSS.registerProperty({name:"--"+gt.name,syntax:"",initialValue:0,inherits:!0})}catch(e){}this.is_uniform_time_registered=!0}}export({scale:e,name:t,download:n,detail:r}={}){return new Promise(((i,s)=>{let l=function(e){let t={};if(e.computedStyleMap)for(let[n,r]of e.computedStyleMap())n.startsWith("--")&&(t[n]=r[0][0]);else{let n=getComputedStyle(e);for(let e of n)e.startsWith("--")&&(t[e]=n.getPropertyValue(e))}return function(e){let t=[];for(let n in e)t.push(n+":"+e[n]);return t.join(";")}(t)}(this),o=this.doodle.innerHTML,{width:a,height:u}=this.getBoundingClientRect(),c=a*(e=parseInt(e)||1),h=u*e,p=`\n${o}`.replace(/\n\s+|^\s+|\n+/g," ").trim();var f;n||r?function(e,t,n,r){return new Promise(((i,s)=>{let l=`data:image/svg+xml;utf8,${encodeURIComponent(e)}`;function o(){let e=new Image;e.crossOrigin="anonymous",e.src=l,e.onload=()=>{let o=document.createElement("canvas"),a=o.getContext("2d"),u=window.devicePixelRatio||1;1!=r&&(u=1),o.width=t*u,o.height=n*u,a.drawImage(e,0,0,o.width,o.height);try{o.toBlob((e=>{i({blob:e,source:l,url:URL.createObjectURL(e)})}))}catch(e){s(e)}}}se()?ie(l,o,200):o()}))}(p,c,h,e).then((({source:e,url:r,blob:s})=>{if(i({width:c,height:h,svg:p,blob:s,source:e}),n){let e=document.createElement("a");e.download=function(e){return(J(e)?Date.now():String(e).replace(/\/.png$/g,""))+".png"}(t),e.href=r,e.click()}})).catch((e=>{s(e)})):i({width:c,height:h,svg:p})}))}set_content(e,t){if(t instanceof Promise)t.then((t=>{this.set_content(e,t)}));else{const n=this.shadowRoot.querySelector(e);n&&(n.styleSheet?n.styleSheet.cssText=t:n.innerHTML=t)}}}function mn(e={}){const t=xt(/grid/).map((e=>`${e}:inherit;`)).join("");return`\n *{box-sizing:border-box\n} *::after, *::before{box-sizing:inherit\n}:host, .host{display:block;visibility:visible;width:auto;height:auto;--${gt.name}:0\n}:host([hidden]), .host[hidden]{display:none\n} .container{position:relative;width:100%;height:100%;display:grid;${t}} cell:empty{position:relative;line-height:1;display:grid;place-items:center\n} svg{position:absolute;width:100%;height:100%;}`}function gn(e){let{x:t,y:n}=e||{};return`\n:host, .host{grid-template-rows:repeat(${n}, 1fr);grid-template-columns:repeat(${t}, 1fr);}`}function yn(e,t,n){let r=document.createElement("cell");return r.id=ne(e,t,n),r}function vn(e){let{x:t,y:n,z:r}=e||{},i=document.createElement("grid"),s=document.createDocumentFragment();if(1==r)for(let e=1;e<=n;++e)for(let n=1;n<=t;++n)s.appendChild(yn(n,e,1));else{let e=null;for(let t=1;t<=r;++t){let n=yn(1,1,t);(e||s).appendChild(n),e=n}e=null}return i.className="container",i.appendChild(s),i.outerHTML}customElements.get("css-doodle")||customElements.define("css-doodle",dn);return ae((e=>{let t=document.createElement("css-doodle");return t.update&&t.update(e),t}))})); \ No newline at end of file diff --git a/package.json b/package.json index d4096a1..f355c9d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "css-doodle", - "version": "0.23.1", + "version": "0.24.0", "description": "A web component for drawing patterns with CSS", "main": "css-doodle.js", "scripts": {