diff --git a/CHANGELOG.md b/CHANGELOG.md
index 74fc192..ddab70b 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,13 @@
+## 0.20.2
+
+### Patches
+
+ * Fix `frame` calculation on graph transformations.
+
+
+
+
+
## 0.20.1
### Patches
diff --git a/css-doodle.js b/css-doodle.js
index 800da99..343a729 100644
--- a/css-doodle.js
+++ b/css-doodle.js
@@ -1,4 +1,4 @@
-/*! css-doodle@0.20.1 */
+/*! css-doodle@0.20.2 */
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
typeof define === 'function' && define.amd ? define(factory) :
@@ -10,28 +10,11 @@
* I'll improve and replace them little by little.
*/
- const symbols$1 = {
- ':': 'colon',
- ';': 'semicolon',
- ',': 'comma',
- '(': 'left-paren',
- ')': 'right-paren',
- '[': 'left-square-bracket',
- ']': 'right-square-bracket',
- '{': 'left-curly-brace',
- '}': 'right-curly-brace',
- 'π': 'pi',
- '±': 'plus-or-minus',
- '+': 'plus',
- '-': 'minus',
- '*': 'product',
- '/': 'division',
- '%': 'mod',
- '"': 'double-quote',
- "'": 'single-quote',
- '`': 'backquote',
- '@': 'at',
- };
+ const symbols$1 = [
+ ':', ';', ',', '(', ')', '[', ']',
+ '{', '}', 'π', '±', '+', '-', '*',
+ '/', '%', '"', "'", '`', '@',
+ ];
const is$2 = {
escape: c => c == '\\',
@@ -40,7 +23,7 @@
sign: c => /^[+-]$/.test(c),
dot: c => c == '.',
quote: c => /^["'`]$/.test(c),
- symbol: c => symbols$1[c],
+ symbol: c => symbols$1.includes(c),
hexNum: c => /^[0-9a-f]$/i.test(c),
hex: (a, b, c) => a == '0' && is$2.letter(b, 'x') && is$2.hexNum(c),
expWithSign: (a, b, c) => is$2.letter(a, 'e') && is$2.sign(b) && is$2.digit(c),
@@ -2082,8 +2065,8 @@
if (w <= 0) w = 2 / 1000;
for (let i = 0; i < split; ++i) {
let t = rad * i;
- let [x, y] = fn(t, i);
- let theta = atan2(y, x);
+ let [x, y, dx = 0, dy = 0] = fn(t, i);
+ let theta = atan2(y + dy, x - dx);
let point = [
x - w * cos(theta),
y - w * sin(theta)
@@ -2110,7 +2093,9 @@
let [dx, dy = dx] = String(offset).split(/[,\s]/).map(Number);
return [
x + (dx || 0),
- y - (dy || 0)
+ y - (dy || 0),
+ dx,
+ dy
];
}
@@ -2147,6 +2132,8 @@
});
let x = calc(px, context);
let y = calc(py, context);
+ let dx = 0;
+ let dy = 0;
if (pr) {
let r = calc(pr, context);
x = r * Math.cos(t);
@@ -2156,9 +2143,9 @@
[x, y] = rotate(x, y, Number(props.rotate) || 0);
}
if (props.move) {
- [x, y] = translate(x, y, props.move);
+ [x, y, dx, dy] = translate(x, y, props.move);
}
- return [x, y];
+ return [x, y, dx, dy];
});
}
diff --git a/css-doodle.min.js b/css-doodle.min.js
index 53ea78e..9c70b08 100644
--- a/css-doodle.min.js
+++ b/css-doodle.min.js
@@ -1 +1 @@
-/*! css-doodle@0.20.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={":":"colon",";":"semicolon",",":"comma","(":"left-paren",")":"right-paren","[":"left-square-bracket","]":"right-square-bracket","{":"left-curly-brace","}":"right-curly-brace",\u03c0:"pi","\xb1":"plus-or-minus","+":"plus","-":"minus","*":"product","/":"division","%":"mod",'"':"double-quote","'":"single-quote","`":"backquote","@":"at"},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[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 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(q(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 P(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()&&/[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.replace(/\n+|\s+/g," ")}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,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=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=V(e,t);break}e.next()}return n}function B(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(B(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 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=H(t,n.name),!i&&n.fallback&&n.fallback.every((e=>{if(s=H(t,e.name),s)return i=s,!1}));try{r=X(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 V(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 X(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))P(n);else if("/"==e&&"/"==n.curr(1))P(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=q(n,t);e.property&&r.push(e)}}else{let e=B(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 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 Y(e){return/^[a-zA-Z]$/.test(e)}function J(e){return null==e}function K(e){return J(e)||Number.isNaN(e)}function Q(e){return J(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 J(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){return(t,...n)=>{let r=t.reduce(((e,t,r)=>{return e+t+(J(i=n[r])?"":i);var i}),"");return e(r)}}const[oe,ae,ue]=[1,32,1024];function ce(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?ue:ae,s=1==t&&1==n?ue:oe,l={x:G(t||oe,1,i),y:G(n||t||oe,1,i),z:G(r||oe,1,s)};return Object.assign({},l,{count:l.x*l.y*l.z,ratio:l.x/l.y})}function he(e){return/^texture\w*$|^(fragment|vertex)$/.test(e)}function pe(){return new n({type:"LineBreak",value:"\n"})}function fe(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 de(e){return fe(e).map((e=>e.value)).join("")}const me="http://www.w3.org/2000/svg",ge="http://www.w3.org/1999/xlink";function ye(e,t){return`url("data:image/svg+xml;utf8,${encodeURIComponent(e)+(t?`#${t}`:"")}")`}function ve(e){const t=`xmlns="${me}"`,n=`xmlns:xlink="${ge}"`;return e.includes("`),e.includes("xmlns")||(e=e.replace(/