satori 0.0.8-beta.0 → 0.0.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -7,6 +7,8 @@
7
7
  `satori` is a function that takes a JSX element and returns a SVG string:
8
8
 
9
9
  ```jsx
10
+ import satori from 'satori'
11
+
10
12
  satori(
11
13
  <div style={{ color: 'black' }}>hello, world</div>,
12
14
  {
@@ -43,15 +45,17 @@ https://satori-playground.vercel.app
43
45
 
44
46
  ### JSX
45
47
 
46
- (TBD: Only pure and stateless function components, only inlined styles.)
48
+ Satori only accepts JSX elements that are pure and stateless. You can use a subset of HTML
49
+ elements (see section below), or custom React components, but React APIs such as `useState` and
50
+ `useEffect` are not supported.
47
51
 
48
52
  ### HTML Elements
49
53
 
50
54
  Satori supports a limited subset of HTML and CSS features, due to its special use cases. In general, only these static and visible elements and properties that are implemented.
51
55
 
52
- For example, the `<input>` HTML element, the `cursor` CSS property are not in consideration.
56
+ For example, the `<input>` HTML element, the `cursor` CSS property are not in consideration. And you can't use `<style>` tags or external resources via `<link>` or `<script>`.
53
57
 
54
- (TBD)
58
+ Also, Satori does not guarantee that the SVG will 100% match the browser-rendered HTML output since Satori implements its own rendering engine based on the [SVG 1.1 spec](https://www.w3.org/TR/SVG11).
55
59
 
56
60
  ### CSS Properties
57
61
 
@@ -69,7 +73,7 @@ For example, the `<input>` HTML element, the `cursor` CSS property are not in co
69
73
  | `flex-wrap` | Supported |
70
74
  | `flex-grow` | Supported |
71
75
  | `flex-shrink` | Supported |
72
- | `flex-basis` | Supported |
76
+ | `flex-basis` | Supported except for `auto` |
73
77
  | `align-items` | Supported |
74
78
  | `align-content` | Supported |
75
79
  | `align-self` | Supported |
@@ -89,6 +93,7 @@ For example, the `<input>` HTML element, the `cursor` CSS property are not in co
89
93
  | `opacity` | Supported |
90
94
  | `background-color` | Supported |
91
95
  | `background-image` | Support `linear-gradient`, `url` |
96
+ | `word-break` | Supported |
92
97
  | `background-clip` | TBD |
93
98
  | `background-size` | TBD |
94
99
  | `background-position` | TBD |
@@ -97,7 +102,6 @@ For example, the `<input>` HTML element, the `cursor` CSS property are not in co
97
102
  | `text-decoration` | TBD |
98
103
  | `text-shadow` | TBD |
99
104
  | `text-transform` | TBD |
100
- | `word-break` | TBD |
101
105
  | `transform-origin` | TBD |
102
106
 
103
107
  Note:
package/dist/esm/index.js CHANGED
@@ -1 +1,2 @@
1
- var ft=Object.defineProperty,ut=Object.defineProperties;var lt=Object.getOwnPropertyDescriptors;var q=Object.getOwnPropertySymbols;var mt=Object.prototype.hasOwnProperty,ct=Object.prototype.propertyIsEnumerable;var K=(t,r,e)=>r in t?ft(t,r,{enumerable:!0,configurable:!0,writable:!0,value:e}):t[r]=e,L=(t,r)=>{for(var e in r||(r={}))mt.call(r,e)&&K(t,e,r[e]);if(q)for(var e of q(r))ct.call(r,e)&&K(t,e,r[e]);return t},Q=(t,r)=>ut(t,lt(r));var Z=(t=>typeof require!="undefined"?require:typeof Proxy!="undefined"?new Proxy(t,{get:(r,e)=>(typeof require!="undefined"?require:r)[e]}):t)(function(t){if(typeof require!="undefined")return require.apply(this,arguments);throw new Error('Dynamic require of "'+t+'" is not supported')});var dt=Z("yoga-wasm-web"),tt;async function pt(t){t||(t=Z("yoga-wasm-web/dist/yoga.wasm")),tt=await dt(t)}var i=tt;function w(t){let r=typeof t;return!(r==="number"||r==="bigint"||r==="string"||r==="boolean")}function et(t){return/^class\s/.test(Function.prototype.toString.call(t))}function A(t,r){return[t[0]*r[0]+t[2]*r[1],t[1]*r[0]+t[3]*r[1],t[0]*r[2]+t[2]*r[3],t[1]*r[2]+t[3]*r[3],t[0]*r[4]+t[2]*r[5]+t[4],t[1]*r[4]+t[3]*r[5]+t[5]]}var nt={p:{display:"block",marginTop:"1em",marginBottom:"1em"},div:{display:"block"},blockquote:{display:"block",marginTop:"1em",marginBottom:"1em",marginLeft:40,marginRight:40},center:{display:"block",textAlign:"center"},hr:{display:"block",marginTop:"0.5em",marginBottom:"0.5em",marginLeft:"auto",marginRight:"auto",borderWidth:1,borderStyle:"inset"},h1:{display:"block",fontSize:"2em",marginTop:"0.67em",marginBottom:"0.67em",marginLeft:0,marginRight:0,fontWeight:"bold"},h2:{display:"block",fontSize:"1.5em",marginTop:"0.83em",marginBottom:"0.83em",marginLeft:0,marginRight:0,fontWeight:"bold"},h3:{display:"block",fontSize:"1.17em",marginTop:"1em",marginBottom:"1em",marginLeft:0,marginRight:0,fontWeight:"bold"},h4:{display:"block",marginTop:"1.33em",marginBottom:"1.33em",marginLeft:0,marginRight:0,fontWeight:"bold"},h5:{display:"block",fontSize:"0.83em",marginTop:"1.67em",marginBottom:"1.67em",marginLeft:0,marginRight:0,fontWeight:"bold"},h6:{display:"block",fontSize:"0.67em",marginTop:"2.33em",marginBottom:"2.33em",marginLeft:0,marginRight:0,fontWeight:"bold"},u:{textDecoration:"underline"},strong:{fontWeight:"bold"},b:{fontWeight:"bold"},i:{fontStyle:"italic"},em:{fontStyle:"italic"},code:{fontFamily:"monospace"},kbd:{fontFamily:"monospace"},pre:{display:"block",fontFamily:"monospace",whiteSpace:"pre",marginTop:"1em",marginBottom:"1em"},mark:{backgroundColor:"yellow",color:"black"},big:{fontSize:"larger"},small:{fontSize:"smaller"},s:{textDecoration:"line-through"}};var gt=new Set(["color","font","fontFamily","fontSize","fontStyle","fontWeight","lineHeight","textAlign","textTransform","whiteSpace","letterSpacing","transform","opacity"]);function D(t){let r={};for(let e in t)gt.has(e)&&(r[e]=t[e]);return r}import ht,{getPropertyName as bt}from"css-to-react-native";import it from"parse-css-dimension";import{parseElementStyle as yt}from"css-background-parser";var Et=new Set(["flex","flexGrow","flexShrink","flexBasis","fontWeight","lineHeight","opacity","scale","scaleX","scaleY"]),rt=[1,0,0,1,0,0];function $t(t,r){return typeof r=="number"?Et.has(t)?String(r):r+"px":r}function ot(t,r){if(typeof t=="number")return t;try{let e=new it(t);if(e.type==="length")switch(e.unit){case"em":return e.value*r;case"rem":return e.value*16;default:return e.value}else if(e.type==="angle")switch(e.unit){case"deg":return e.value;case"rad":return e.value*180/Math.PI;default:return e.value}}catch{}}function P(t,r){let e=[];for(let n in t){let a=bt(n);e.push([a,$t(a,t[n])])}let o=ht(e);if(o.backgroundImage){let{backgrounds:n}=yt(o);o.backgroundImage=n}let f=o.fontSize||r.fontSize;if(typeof f=="string")try{let n=new it(f);switch(n.unit){case"em":f=n.value*r.fontSize;break;case"rem":f=n.value*16;break}}catch{f=16}o.fontSize=f;for(let n in o){let a=o[n];if(typeof a=="string"){let s=ot(a,f);typeof s!="undefined"&&(o[n]=s),a=o[n]}if(n==="opacity"&&(a=o[n]=a*r.opacity),n==="transform"){let s=[...rt],l=a;for(let u of l){let d=Object.keys(u)[0],p=u[d],c=typeof p=="string"?ot(p,f):p,m=[...rt];switch(d){case"translateX":m[4]=c;break;case"translateY":m[5]=c;break;case"scaleX":m[0]=c;break;case"scaleY":m[3]=c;break;case"rotate":let E=c*Math.PI/180,g=Math.cos(E),h=Math.sin(E);m[0]=g,m[1]=h,m[2]=-h,m[3]=g;break;case"skewX":m[2]=Math.tan(c*Math.PI/180);break;case"skewY":m[1]=Math.tan(c*Math.PI/180);break}s=A(m,s)}o.transform=s}}return o}function x(t,r,e){let o=r[t];return typeof o=="undefined"?e:o}function M(t,r,e,o,f){let n=L(L(L({},e),P(nt[r],e)),P(o,e));if(r==="img"){let a=parseInt(f.width),l=parseInt(f.height)/a;n.width||(n.width=a),n.height||(n.height=l*n.width)}return t.setDisplay(x(n.display,{flex:i.DISPLAY_FLEX,none:i.DISPLAY_NONE},i.DISPLAY_FLEX)),t.setAlignContent(x(n.alignContent,{stretch:i.ALIGN_STRETCH,center:i.ALIGN_CENTER,"flex-start":i.ALIGN_FLEX_START,"flex-end":i.ALIGN_FLEX_END,"space-between":i.ALIGN_SPACE_BETWEEN,"space-around":i.ALIGN_SPACE_AROUND,baseline:i.ALIGN_BASELINE,normal:i.ALIGN_AUTO},i.ALIGN_AUTO)),t.setAlignItems(x(n.alignItems,{stretch:i.ALIGN_STRETCH,center:i.ALIGN_CENTER,"flex-start":i.ALIGN_FLEX_START,"flex-end":i.ALIGN_FLEX_END,baseline:i.ALIGN_BASELINE,normal:i.ALIGN_AUTO},i.ALIGN_FLEX_START)),t.setAlignSelf(x(n.alignSelf,{stretch:i.ALIGN_STRETCH,center:i.ALIGN_CENTER,"flex-start":i.ALIGN_FLEX_START,"flex-end":i.ALIGN_FLEX_END,baseline:i.ALIGN_BASELINE,normal:i.ALIGN_AUTO},i.ALIGN_AUTO)),t.setJustifyContent(x(n.justifyContent,{center:i.JUSTIFY_CENTER,"flex-start":i.JUSTIFY_FLEX_START,"flex-end":i.JUSTIFY_FLEX_END,"space-between":i.JUSTIFY_SPACE_BETWEEN,"space-around":i.JUSTIFY_SPACE_AROUND},i.JUSTIFY_FLEX_START)),t.setFlexDirection(x(n.flexDirection,{row:i.FLEX_DIRECTION_ROW,column:i.FLEX_DIRECTION_COLUMN,"row-reverse":i.FLEX_DIRECTION_ROW_REVERSE,"column-reverse":i.FLEX_DIRECTION_COLUMN_REVERSE},i.FLEX_DIRECTION_ROW)),t.setFlexWrap(x(n.flexWrap,{wrap:i.WRAP_WRAP,nowrap:i.WRAP_NO_WRAP,"wrap-reverse":i.WRAP_WRAP_REVERSE},i.WRAP_WRAP)),typeof n.flexBasis!="undefined"&&t.setFlexBasis(n.flexBasis),t.setFlexGrow(typeof n.flexGrow=="undefined"?0:n.flexGrow),t.setFlexShrink(typeof n.flexShrink=="undefined"?1:n.flexShrink),typeof n.maxHeight!="undefined"&&t.setMaxHeight(n.maxHeight),typeof n.maxWidth!="undefined"&&t.setMaxWidth(n.maxWidth),typeof n.minHeight!="undefined"&&t.setMinHeight(n.minHeight),typeof n.minWidth!="undefined"&&t.setMinWidth(n.minWidth),t.setOverflow(x(n.overflow,{visible:i.OVERFLOW_VISIBLE,hidden:i.OVERFLOW_HIDDEN},i.OVERFLOW_VISIBLE)),t.setMargin(i.EDGE_TOP,n.marginTop||0),t.setMargin(i.EDGE_BOTTOM,n.marginBottom||0),t.setMargin(i.EDGE_LEFT,n.marginLeft||0),t.setMargin(i.EDGE_RIGHT,n.marginRight||0),t.setBorder(i.EDGE_TOP,n.borderWidth||0),t.setBorder(i.EDGE_BOTTOM,n.borderWidth||0),t.setBorder(i.EDGE_LEFT,n.borderWidth||0),t.setBorder(i.EDGE_RIGHT,n.borderWidth||0),t.setPadding(i.EDGE_TOP,n.paddingTop||0),t.setPadding(i.EDGE_BOTTOM,n.paddingBottom||0),t.setPadding(i.EDGE_LEFT,n.paddingLeft||0),t.setPadding(i.EDGE_RIGHT,n.paddingRight||0),t.setPositionType(x(n.position,{absolute:i.POSITION_TYPE_ABSOLUTE,relative:i.POSITION_TYPE_RELATIVE},i.POSITION_TYPE_RELATIVE)),typeof n.top!="undefined"&&t.setPosition(i.EDGE_TOP,n.top),typeof n.bottom!="undefined"&&t.setPosition(i.EDGE_BOTTOM,n.bottom),typeof n.left!="undefined"&&t.setPosition(i.EDGE_LEFT,n.left),typeof n.right!="undefined"&&t.setPosition(i.EDGE_RIGHT,n.right),typeof n.height!="undefined"?t.setHeight(n.height):t.setHeightAuto(),typeof n.width!="undefined"?t.setWidth(n.width):t.setWidthAuto(),[n,D(n)]}import{LineBreaker as _t}from"css-line-break";function N({left:t,top:r,width:e,height:o},f,n){let a;if(n)a=f;else{let s=t+e/2,l=r+o/2;a=A([1,0,0,1,s,l],A(f,[1,0,0,1,-s,-l])),f.__parent&&(a=A(f.__parent,a)),f.splice(0,6,...a)}return`matrix(${a.join(",")})`}function Y({content:t,left:r,top:e,width:o,height:f,isInheritingTransform:n,path:a,debug:s},l){let u="",d=1,p="";return l.transform&&(u=N({left:r,top:e,width:o,height:f},l.transform,n)),l.opacity&&(d=+l.opacity),s&&(p=`<rect x="${r}" y="${e}" width="${o}" height="${a===null?.5:f}" fill="transparent" stroke="#575eff" stroke-width="1" ${u?`transform="${u}"`:""}></rect>`),a===null?`<text x="${r}" y="${e}" width="${o}" height="${f}" fill="${l.color}" font-weight="${l.fontWeight}" font-style="${l.fontStyle}" font-size="${l.fontSize}" font-family="${l.fontFamily}" ${l.letterSpacing?`letter-spacing="${l.letterSpacing}"`:""} ${u?`transform="${u}"`:""} ${d!==1?`opacity="${d}"`:""}>${t}</text>${p}`:`<path fill="${l.color}" ${u?`transform="${u}"`:""} ${d!==1?`opacity="${d}"`:""} d="${a}"></path>${p}`}function*X(t,r){let{parentStyle:e,parent:o,font:f,id:n,isInheritingTransform:a,debug:s,embedFont:l}=r,u=_t(t,{lineBreak:"strict",wordBreak:"normal"}),d=[];for(let g;!(g=u.next()).done;)d.push(g.value.slice());let p=[];o.setAlignItems(i.ALIGN_BASELINE),e.textAlign==="left"?o.setJustifyContent(i.JUSTIFY_FLEX_START):e.textAlign==="center"?o.setJustifyContent(i.JUSTIFY_CENTER):e.textAlign==="right"?o.setJustifyContent(i.JUSTIFY_FLEX_END):e.textAlign==="justify"&&o.setJustifyContent(i.JUSTIFY_SPACE_BETWEEN);for(let g of d){let h=i.Node.create();o.insertChild(h,o.getChildCount());let _=f.measure(g,e),S=(e.letterSpacing||0)*g.length;h.setWidth(_.width+S),h.setHeight(_.ascent*1.2),h.setMargin(i.EDGE_BOTTOM,_.descent*1.2),p.push(h)}let[c,m]=yield,E="";for(let g=0;g<p.length;g++){let h=p[g],_=d[g];e.position==="absolute"&&h.calculateLayout();let{left:S,top:$,width:F,height:I}=h.getComputedLayout();S+=c,$+=m;let R=null;l?R=f.getSVG(_,Q(L({},e),{top:$,left:S,letterSpacing:e.letterSpacing})):$+=f.getAscent(e),E+=Y({content:_,id:n,left:S,top:$,width:F,height:I,isInheritingTransform:a,path:R,debug:s},e)}return E}import St from"gradient-parser";function xt(t){return t.type==="literal"?t.value:t.type==="hex"?`#${t.value}`:t.type==="rgb"?`rgb(${t.value.join(",")})`:t.type==="rgba"?`rgba(${t.value.join(",")})`:"transparent"}function U({id:t,width:r},{image:e}){if(e.startsWith("linear-gradient(")){let o=St.parse(e)[0],f,n,a,s;if(o.orientation.type==="directional")[f,n,a,s]={top:[0,1,0,0],bottom:[0,0,0,1],left:[1,0,0,0],right:[0,0,1,0]}[o.orientation.value];else if(o.orientation.type==="angular"){let m=+o.orientation.value/180*Math.PI-Math.PI/2,E=Math.cos(m),g=Math.sin(m);f=0,n=0,a=E,s=g,a<0&&(f-=a,a=0),s<0&&(n-=s,s=0)}let l=r,u=[];for(let m of o.colorStops){let E=xt(m);if(!u.length&&(u.push({offset:0,color:E}),typeof m.length=="undefined"||m.length.value==="0"))continue;let g=typeof m.length=="undefined"?void 0:m.length.type==="%"?m.length.value/100:m.length.value/l;u.push({offset:g,color:E})}u.length||u.push({offset:0,color:"transparent"});let d=u[u.length-1];d.offset!==1&&(typeof d.offset=="undefined"?d.offset=1:u.push({offset:1,color:d.color}));let p=0,c=1;for(let m=0;m<u.length;m++)if(typeof u[m].offset=="undefined"){for(c<m&&(c=m);typeof u[c].offset=="undefined";)c++;u[m].offset=(u[c].offset-u[p].offset)/(c-p)*(m-p)+u[p].offset}else p=m;return[`satori_bi${t}`,`<linearGradient id="satori_bi${t}" x1="${f}" y1="${n}" x2="${a}" y2="${s}">${u.map(m=>`<stop offset="${m.offset*100}%" stop-color="${m.color}"/>`).join("")}</linearGradient>`]}if(e.startsWith("url(")){let o=e.slice(4,-1);return[`satori_bi${t}`,`<pattern id="satori_bi${t}" patternContentUnits="objectBoundingBox" width="1" height="1"><image href="${o}" x="0" y="0" width="1" height="1"/></pattern>`]}}function B(t,r,e){return e<t+r&&(e/2<t&&e/2<r?t=r=e/2:e/2<t?t=e-r:e/2<r&&(r=e-t)),[t,r]}function W({left:t,top:r,width:e,height:o},f){let{borderTopLeftRadius:n,borderTopRightRadius:a,borderBottomLeftRadius:s,borderBottomRightRadius:l}=f;return n=Math.min(n||0,e,o),a=Math.min(a||0,e,o),s=Math.min(s||0,e,o),l=Math.min(l||0,e,o),!n&&!a&&!s&&!l?"":([n,a]=B(n,a,e),[n,s]=B(n,s,o),[a,l]=B(a,l,o),[s,l]=B(s,l,e),`M${t+n},${r} h${e-n-a} a${a},${a} 0 0 1 ${a},${a} v${o-a-l} a${l},${l} 0 0 1 ${-l},${l} h${l+s-e} a${s},${s} 0 0 1 ${-s},${-s} v${s+n-o} a${n},${n} 0 0 1 ${n},${-n}`)}function O({id:t,width:r,height:e},o){if(!o.shadowColor||!o.shadowOffset||typeof o.shadowRadius=="undefined")return"";let f=Math.min(o.shadowOffset.width-o.shadowRadius*2,0),n=Math.max(o.shadowOffset.width+o.shadowRadius*2+r,r),a=Math.min(o.shadowOffset.height-o.shadowRadius*2,0),s=Math.max(o.shadowOffset.height+o.shadowRadius*2+e,e);return`<defs><filter id="satori_s-${t}" x="${f/r*100}%" y="${a/e*100}%" width="${(n-f)/r*100}%" height="${(s-a)/e*100}%"><feDropShadow dx="${o.shadowOffset.width}" dy="${o.shadowOffset.height}" stdDeviation="${o.shadowRadius}" flood-color="${o.shadowColor}" flood-opacity="1"/></filter></defs>`}function H({id:t,left:r,top:e,width:o,height:f,isInheritingTransform:n,debug:a},s){if(s.display==="none")return"";let l="rect",u="transparent",d=0,p="",c="",m=[],E=1,g="";if(s.backgroundColor&&m.push(s.backgroundColor),s.borderWidth&&(d=s.borderWidth,u=s.borderColor),s.opacity&&(E=+s.opacity),s.transform&&(p=N({left:r,top:e,width:o,height:f},s.transform,n)),s.backgroundImage){let S=s.backgroundImage.map(($,F)=>U({id:t+"_"+F,width:o,height:f},$)).filter(Boolean);for(let $ of S)c+=$[1],m.push(`url(#${$[0]})`)}let h=W({left:r,top:e,width:o,height:f},s);h&&(l="path");let _=O({width:o,height:f,id:t},s);return m.length||m.push("transparent"),a&&(g=`<rect x="${r}" y="${e}" width="${o}" height="${f}" fill="transparent" stroke="#ff5757" stroke-width="1" ${p?`transform="${p}"`:""}></rect>`),`${c?`<defs>${c}</defs>`:""}${_?`${_}<g filter="url(#satori_s-${t})">`:""}${E!==1?`<g opacity="${E}">`:""}${m.map((S,$)=>S==="transparent"&&!($===m.length-1&&d)?"":`<${l} x="${r}" y="${e}" width="${o}" height="${f}" fill="${S}" ${$===m.length-1&&d?`stroke="${u}" stroke-width="${d}"`:""} ${h?`d="${h}"`:""} ${p?`transform="${p}"`:""}></${l}>`).join("")}${E!==1?"</g>":""}${_?"</g>":""}${g}`}function z({id:t,left:r,top:e,width:o,height:f,src:n,debug:a},s){if(s.display==="none")return"";let l="",u=1,d=s.objectFit==="contain"?"xMidYMid":s.objectFit==="cover"?"xMidYMid slice":"none",p=W({left:r,top:e,width:o,height:f},s);p&&(l=`<clipPath id="satori_c-${t}"><path x="${r}" y="${e}" width="${o}" height="${f}" d="${p}"></path></clipPath>`),s.opacity&&(u=+s.opacity);let c=O({width:o,height:f,id:t},s);return`${c}${c?`<g filter="url(#satori_s-${t})">`:""}${l}<image href="${n}" x="${r}" y="${e}" width="${o}" height="${f}" preserveAspectRatio="${d}" ${l?`clip-path="url(#satori_c-${t})"`:""} ${u!==1?`opacity="${u}"`:""}></image>${c?"</g>":""}`}function*k(t,r){let{id:e,inheritedStyle:o,parent:f,font:n,debug:a,embedFont:s=!0}=r;if(t===null||typeof t=="undefined")return yield,"";if(!w(t)||typeof t.type=="function"){let T;if(!w(t))T=X(String(t),r);else{if(et(t.type))throw new Error("Class component is not supported.");T=k(t.type(t.props),r)}T.next();let G=yield;return T.next(G).value}let{type:l,props:u}=t,{style:d,children:p}=u,c=i.Node.create();f.insertChild(c,f.getChildCount());let[m,E]=M(c,l,o,d,u),g=m.transform===o.transform;g||(m.transform.__parent=o.transform);let h=typeof p=="undefined"?[]:[].concat(p),_=[],S=0;for(let T of h){let G=k(T,{id:e*h.length+ ++S,parentStyle:m,inheritedStyle:E,isInheritingTransform:!0,parent:c,font:n,embedFont:s,debug:a});G.next(),_.push(G)}let[$,F]=yield;m.position==="absolute"&&c.calculateLayout();let{left:I,top:R,width:V,height:j}=c.getComputedLayout();I+=$,R+=F;let C="";l==="img"?C=z({id:e,left:I,top:R,width:V,height:j,src:u.src,isInheritingTransform:g,debug:a},m):C=H({id:e,left:I,top:R,width:V,height:j,isInheritingTransform:g,debug:a},m);for(let T of _)C+=T.next([I,R]).value;return C}import at from"opentype.js";var v=class{constructor(r){this.fonts=new Map;for(let e of r){let o=e.data,f="buffer"in o?at.parse(o.buffer.slice(o.byteOffset,o.byteOffset+o.byteLength)):at.parse(o);this.defaultFont||(this.defaultFont=f),this.fonts.has(e.name)||this.fonts.set(e.name,[]),this.fonts.get(e.name).push([f,e.weight,e.style])}}get({name:r,weight:e,style:o}){if(!this.fonts.has(r))return this.defaultFont;e==="normal"&&(e=400),e==="bold"&&(e=700);let f=[...this.fonts.get(r)];return f.sort(([n,a,s],[l,u,d])=>{if(a!==u)return a?!u||a===e?-1:u===e?1:e===400&&a===500||e===500&&a===400?-1:e===400&&u===500||e===500&&u===400?1:e<400?a<e&&u<e?u-a:a<e?-1:u<e?1:a-u:e<a&&e<u?a-u:e<a?-1:e<u?1:u-a:1;if(s!==d){if(s===o)return-1;if(d===o)return 1}return-1}),f[0][0]}measure(r,{fontFamily:e,fontSize:o,fontWeight:f=400,fontStyle:n="normal"}){let a=this.get({name:e,weight:f,style:n});return{width:a.getAdvanceWidth(r,o),ascent:a.ascender/a.unitsPerEm*o,descent:-(a.descender/a.unitsPerEm)*o}}getSVG(r,{fontFamily:e,fontSize:o,fontWeight:f=400,fontStyle:n="normal",top:a,left:s,letterSpacing:l=0}){let u=this.get({name:e,weight:f,style:n});return a+=u.ascender/u.unitsPerEm*o,u.getPath(r,s,a,o,{letterSpacing:l/o}).toPathData(2)}getAscent({fontFamily:r,fontSize:e,fontWeight:o=400,fontStyle:f="normal"}){let n=this.get({name:r,weight:o,style:f});return n.ascender/n.unitsPerEm*e}};function J({width:t,height:r,content:e},o){return`<svg width="${t}" height="${r}" viewBox="0 0 ${t} ${r}" xmlns="http://www.w3.org/2000/svg">${e}</svg>`}function st(t,r){if(!i)throw new Error("Satori is not initialized.");let e=new v(r.fonts),o=i.Node.create();o.setWidth(r.width),o.setHeight(r.height),o.setFlexDirection(i.FLEX_DIRECTION_ROW),o.setFlexWrap(i.WRAP_WRAP),o.setAlignContent(i.ALIGN_AUTO),o.setAlignItems(i.ALIGN_FLEX_START),o.setJustifyContent(i.JUSTIFY_FLEX_START);let f=k(t,{id:1,parentStyle:{},inheritedStyle:{fontSize:16,fontWeight:"normal",fontFamily:"serif",fontStyle:"normal",lineHeight:1.2,color:"black",opacity:1},parent:o,font:e,embedFont:r.embedFont,debug:r.debug});f.next(),o.calculateLayout(r.width,r.height,i.DIRECTION_LTR);let n=f.next([0,0]).value;return J({width:r.width,height:r.height,content:n})}export{st as default,pt as init};
1
+ var H=Object.defineProperty,Lt=Object.defineProperties,It=Object.getOwnPropertyDescriptor,At=Object.getOwnPropertyDescriptors,Ft=Object.getOwnPropertyNames,lt=Object.getOwnPropertySymbols;var mt=Object.prototype.hasOwnProperty,Ct=Object.prototype.propertyIsEnumerable;var ct=(t,r,e)=>r in t?H(t,r,{enumerable:!0,configurable:!0,writable:!0,value:e}):t[r]=e,B=(t,r)=>{for(var e in r||(r={}))mt.call(r,e)&&ct(t,e,r[e]);if(lt)for(var e of lt(r))Ct.call(r,e)&&ct(t,e,r[e]);return t},pt=(t,r)=>Lt(t,At(r)),Nt=t=>H(t,"__esModule",{value:!0});var dt=(t,r)=>()=>(t&&(r=t(t=0)),r);var Ot=(t,r)=>{for(var e in r)H(t,e,{get:r[e],enumerable:!0})},kt=(t,r,e,i)=>{if(r&&typeof r=="object"||typeof r=="function")for(let a of Ft(r))!mt.call(t,a)&&(e||a!=="default")&&H(t,a,{get:()=>r[a],enumerable:!(i=It(r,a))||i.enumerable});return t};var vt=(t=>(r,e)=>t&&t.get(r)||(e=kt(Nt({}),r,1),t&&t.set(r,e),e))(typeof WeakMap!="undefined"?new WeakMap:0);var m=dt(()=>{});var gt={};Ot(gt,{default:()=>Gt});import{default as Gt}from"yoga-layout-prebuilt";var ht=dt(()=>{m()});m();m();m();var K;K=(ht(),vt(gt)).default;function Wt(t){K=t}function C(){return K}m();m();function q(t){let r=typeof t;return!(r==="number"||r==="bigint"||r==="string"||r==="boolean")}function bt(t){return/^class\s/.test(Function.prototype.toString.call(t))}function D(t,r){return[t[0]*r[0]+t[2]*r[1],t[1]*r[0]+t[3]*r[1],t[0]*r[2]+t[2]*r[3],t[1]*r[2]+t[3]*r[3],t[0]*r[4]+t[2]*r[5]+t[4],t[1]*r[4]+t[3]*r[5]+t[5]]}function A(t,r,e){let i=r[t];return typeof i=="undefined"?e:i}m();m();var yt={p:{display:"block",marginTop:"1em",marginBottom:"1em"},div:{display:"block"},blockquote:{display:"block",marginTop:"1em",marginBottom:"1em",marginLeft:40,marginRight:40},center:{display:"block",textAlign:"center"},hr:{display:"block",marginTop:"0.5em",marginBottom:"0.5em",marginLeft:"auto",marginRight:"auto",borderWidth:1,borderStyle:"inset"},h1:{display:"block",fontSize:"2em",marginTop:"0.67em",marginBottom:"0.67em",marginLeft:0,marginRight:0,fontWeight:"bold"},h2:{display:"block",fontSize:"1.5em",marginTop:"0.83em",marginBottom:"0.83em",marginLeft:0,marginRight:0,fontWeight:"bold"},h3:{display:"block",fontSize:"1.17em",marginTop:"1em",marginBottom:"1em",marginLeft:0,marginRight:0,fontWeight:"bold"},h4:{display:"block",marginTop:"1.33em",marginBottom:"1.33em",marginLeft:0,marginRight:0,fontWeight:"bold"},h5:{display:"block",fontSize:"0.83em",marginTop:"1.67em",marginBottom:"1.67em",marginLeft:0,marginRight:0,fontWeight:"bold"},h6:{display:"block",fontSize:"0.67em",marginTop:"2.33em",marginBottom:"2.33em",marginLeft:0,marginRight:0,fontWeight:"bold"},u:{textDecoration:"underline"},strong:{fontWeight:"bold"},b:{fontWeight:"bold"},i:{fontStyle:"italic"},em:{fontStyle:"italic"},code:{fontFamily:"monospace"},kbd:{fontFamily:"monospace"},pre:{display:"block",fontFamily:"monospace",whiteSpace:"pre",marginTop:"1em",marginBottom:"1em"},mark:{backgroundColor:"yellow",color:"black"},big:{fontSize:"larger"},small:{fontSize:"smaller"},s:{textDecoration:"line-through"}};m();var wt=new Set(["color","font","fontFamily","fontSize","fontStyle","fontWeight","lineHeight","textAlign","textTransform","whiteSpace","letterSpacing","transform","wordBreak","opacity"]);function Z(t){let r={};for(let e in t)wt.has(e)&&(r[e]=t[e]);return r}m();import{getPropertyName as Et,getStylesForProperty as Pt}from"css-to-react-native";import _t from"parse-css-dimension";import{parseElementStyle as Bt}from"css-background-parser";var Dt=new Set(["flex","flexGrow","flexShrink","flexBasis","fontWeight","lineHeight","opacity","scale","scaleX","scaleY"]),xt=[1,0,0,1,0,0];function Mt(t,r){return typeof r=="number"?Dt.has(t)?String(r):r+"px":r}function $t(t,r){if(typeof t=="number")return t;try{let e=new _t(t);if(e.type==="length")switch(e.unit){case"em":return e.value*r;case"rem":return e.value*16;default:return e.value}else if(e.type==="angle")switch(e.unit){case"deg":return e.value;case"rad":return e.value*180/Math.PI;default:return e.value}}catch{}}function V(t,r){let e=[];for(let o in t){let n=Et(o);e.push([n,Mt(n,t[o])])}let i=e.reduce((o,n)=>{let s=Et(n[0]),l=n[1];return Object.assign(o,Pt(s,l,!0))},{});if(i.backgroundImage){let{backgrounds:o}=Bt(i);i.backgroundImage=o}let a=i.fontSize||r.fontSize;if(typeof a=="string")try{let o=new _t(a);switch(o.unit){case"em":a=o.value*r.fontSize;break;case"rem":a=o.value*16;break}}catch{a=16}i.fontSize=a;for(let o in i){let n=i[o];if(typeof n=="string"){let s=$t(n,a);typeof s!="undefined"&&(i[o]=s),n=i[o]}if(o==="opacity"&&(n=i[o]=n*r.opacity),o==="transform"){let s=[...xt],l=n;for(let f of l){let d=Object.keys(f)[0],g=f[d],p=typeof g=="string"?$t(g,a):g,u=[...xt];switch(d){case"translateX":u[4]=p;break;case"translateY":u[5]=p;break;case"scaleX":u[0]=p;break;case"scaleY":u[3]=p;break;case"rotate":let b=p*Math.PI/180,R=Math.cos(b),T=Math.sin(b);u[0]=R,u[1]=T,u[2]=-T,u[3]=R;break;case"skewX":u[2]=Math.tan(p*Math.PI/180);break;case"skewY":u[1]=Math.tan(p*Math.PI/180);break}s=D(u,s)}i.transform=s}}return i}function Q(t,r,e,i,a){let o=C(),n=B(B(B({},e),V(yt[r],e)),V(i,e));if(r==="img"){let s=parseInt(a.width),f=parseInt(a.height)/s;n.width||(n.width=s),n.height||(n.height=f*n.width)}return t.setDisplay(A(n.display,{flex:o.DISPLAY_FLEX,none:o.DISPLAY_NONE},o.DISPLAY_FLEX)),t.setAlignContent(A(n.alignContent,{stretch:o.ALIGN_STRETCH,center:o.ALIGN_CENTER,"flex-start":o.ALIGN_FLEX_START,"flex-end":o.ALIGN_FLEX_END,"space-between":o.ALIGN_SPACE_BETWEEN,"space-around":o.ALIGN_SPACE_AROUND,baseline:o.ALIGN_BASELINE,normal:o.ALIGN_AUTO},o.ALIGN_AUTO)),t.setAlignItems(A(n.alignItems,{stretch:o.ALIGN_STRETCH,center:o.ALIGN_CENTER,"flex-start":o.ALIGN_FLEX_START,"flex-end":o.ALIGN_FLEX_END,baseline:o.ALIGN_BASELINE,normal:o.ALIGN_AUTO},o.ALIGN_FLEX_START)),t.setAlignSelf(A(n.alignSelf,{stretch:o.ALIGN_STRETCH,center:o.ALIGN_CENTER,"flex-start":o.ALIGN_FLEX_START,"flex-end":o.ALIGN_FLEX_END,baseline:o.ALIGN_BASELINE,normal:o.ALIGN_AUTO},o.ALIGN_AUTO)),t.setJustifyContent(A(n.justifyContent,{center:o.JUSTIFY_CENTER,"flex-start":o.JUSTIFY_FLEX_START,"flex-end":o.JUSTIFY_FLEX_END,"space-between":o.JUSTIFY_SPACE_BETWEEN,"space-around":o.JUSTIFY_SPACE_AROUND},o.JUSTIFY_FLEX_START)),t.setFlexDirection(A(n.flexDirection,{row:o.FLEX_DIRECTION_ROW,column:o.FLEX_DIRECTION_COLUMN,"row-reverse":o.FLEX_DIRECTION_ROW_REVERSE,"column-reverse":o.FLEX_DIRECTION_COLUMN_REVERSE},o.FLEX_DIRECTION_ROW)),t.setFlexWrap(A(n.flexWrap,{wrap:o.WRAP_WRAP,nowrap:o.WRAP_NO_WRAP,"wrap-reverse":o.WRAP_WRAP_REVERSE},o.WRAP_WRAP)),typeof n.flexBasis!="undefined"&&t.setFlexBasis(n.flexBasis),t.setFlexGrow(typeof n.flexGrow=="undefined"?0:n.flexGrow),t.setFlexShrink(typeof n.flexShrink=="undefined"?1:n.flexShrink),typeof n.maxHeight!="undefined"&&t.setMaxHeight(n.maxHeight),typeof n.maxWidth!="undefined"&&t.setMaxWidth(n.maxWidth),typeof n.minHeight!="undefined"&&t.setMinHeight(n.minHeight),typeof n.minWidth!="undefined"&&t.setMinWidth(n.minWidth),t.setOverflow(A(n.overflow,{visible:o.OVERFLOW_VISIBLE,hidden:o.OVERFLOW_HIDDEN},o.OVERFLOW_VISIBLE)),t.setMargin(o.EDGE_TOP,n.marginTop||0),t.setMargin(o.EDGE_BOTTOM,n.marginBottom||0),t.setMargin(o.EDGE_LEFT,n.marginLeft||0),t.setMargin(o.EDGE_RIGHT,n.marginRight||0),t.setBorder(o.EDGE_TOP,n.borderWidth||0),t.setBorder(o.EDGE_BOTTOM,n.borderWidth||0),t.setBorder(o.EDGE_LEFT,n.borderWidth||0),t.setBorder(o.EDGE_RIGHT,n.borderWidth||0),t.setPadding(o.EDGE_TOP,n.paddingTop||0),t.setPadding(o.EDGE_BOTTOM,n.paddingBottom||0),t.setPadding(o.EDGE_LEFT,n.paddingLeft||0),t.setPadding(o.EDGE_RIGHT,n.paddingRight||0),t.setPositionType(A(n.position,{absolute:o.POSITION_TYPE_ABSOLUTE,relative:o.POSITION_TYPE_RELATIVE},o.POSITION_TYPE_RELATIVE)),typeof n.top!="undefined"&&t.setPosition(o.EDGE_TOP,n.top),typeof n.bottom!="undefined"&&t.setPosition(o.EDGE_BOTTOM,n.bottom),typeof n.left!="undefined"&&t.setPosition(o.EDGE_LEFT,n.left),typeof n.right!="undefined"&&t.setPosition(o.EDGE_RIGHT,n.right),typeof n.height!="undefined"?t.setHeight(n.height):t.setHeightAuto(),typeof n.width!="undefined"?t.setWidth(n.width):t.setWidthAuto(),[n,Z(n)]}m();import{LineBreaker as Yt}from"css-line-break";m();m();function M({left:t,top:r,width:e,height:i},a,o){let n;if(o)n=a;else{let s=t+e/2,l=r+i/2;n=D([1,0,0,1,s,l],D(a,[1,0,0,1,-s,-l])),a.__parent&&(n=D(a.__parent,n)),a.splice(0,6,...n)}return`matrix(${n.map(s=>s.toFixed(2)).join(",")})`}function tt({content:t,left:r,top:e,width:i,height:a,isInheritingTransform:o,path:n,debug:s},l){let f="",d=1,g="";return l.transform&&(f=M({left:r,top:e,width:i,height:a},l.transform,o)),l.opacity&&(d=+l.opacity),s&&(g=`<rect x="${r}" y="${e}" width="${i}" height="${n===null?.5:a}" fill="transparent" stroke="#575eff" stroke-width="1" ${f?`transform="${f}"`:""}></rect>`),n===null?`<text x="${r}" y="${e}" width="${i}" height="${a}" fill="${l.color}" font-weight="${l.fontWeight}" font-style="${l.fontStyle}" font-size="${l.fontSize}" font-family="${l.fontFamily}" ${l.letterSpacing?`letter-spacing="${l.letterSpacing}"`:""} ${f?`transform="${f}"`:""} ${d!==1?`opacity="${d}"`:""}>${t}</text>${g}`:`<path fill="${l.color}" ${f?`transform="${f}"`:""} ${d!==1?`opacity="${d}"`:""} d="${n}"></path>${g}`}function*et(t,r){let e=C(),{parentStyle:i,parent:a,font:o,id:n,isInheritingTransform:s,debug:l,embedFont:f}=r,d=Yt(t,{lineBreak:"strict",wordBreak:A(i.wordBreak,{normal:"normal","break-all":"break-all","break-word":"break-word","keep-all":"keep-all"},"normal")}),g=[];for(let _;!(_=d.next()).done;)g.push(_.value.slice());let p=[];a.setAlignItems(e.ALIGN_BASELINE),i.textAlign==="left"?a.setJustifyContent(e.JUSTIFY_FLEX_START):i.textAlign==="center"?a.setJustifyContent(e.JUSTIFY_CENTER):i.textAlign==="right"?a.setJustifyContent(e.JUSTIFY_FLEX_END):i.textAlign==="justify"&&a.setJustifyContent(e.JUSTIFY_SPACE_BETWEEN);let u=o.getFont(i);for(let _ of g){let S=e.Node.create();a.insertChild(S,a.getChildCount());let y=o.measure(u,_,i);S.setWidth(y.width),S.setHeight(y.ascent*1.2),S.setMargin(e.EDGE_BOTTOM,y.descent*1.2),p.push(S)}let[b,R]=yield,T="";for(let _=0;_<p.length;_++){let S=p[_],y=g[_];i.position==="absolute"&&S.calculateLayout();let{left:F,top:N,width:O,height:k}=S.getComputedLayout();F+=b,N+=R;let W=null;f?W=o.getSVG(u,y,pt(B({},i),{top:N,left:F,letterSpacing:i.letterSpacing})):N+=o.getAscent(u,i),T+=tt({content:y,id:n,left:F,top:N,width:O,height:k,isInheritingTransform:s,path:W,debug:l},i)}return T}m();m();m();var rt=rt||{};rt.parse=function(){var t={linearGradient:/^(\-(webkit|o|ms|moz)\-)?(linear\-gradient)/i,repeatingLinearGradient:/^(\-(webkit|o|ms|moz)\-)?(repeating\-linear\-gradient)/i,radialGradient:/^(\-(webkit|o|ms|moz)\-)?(radial\-gradient)/i,repeatingRadialGradient:/^(\-(webkit|o|ms|moz)\-)?(repeating\-radial\-gradient)/i,sideOrCorner:/^to (left (top|bottom)|right (top|bottom)|top (left|right)|bottom (left|right)|left|right|top|bottom)/i,extentKeywords:/^(closest\-side|closest\-corner|farthest\-side|farthest\-corner|contain|cover)/,positionKeywords:/^(left|center|right|top|bottom)/i,pixelValue:/^(-?(([0-9]*\.[0-9]+)|([0-9]+\.?)))px/,percentageValue:/^(-?(([0-9]*\.[0-9]+)|([0-9]+\.?)))\%/,emValue:/^(-?(([0-9]*\.[0-9]+)|([0-9]+\.?)))em/,angleValue:/^(-?(([0-9]*\.[0-9]+)|([0-9]+\.?)))deg/,startCall:/^\(/,endCall:/^\)/,comma:/^,/,hexColor:/^\#([0-9a-fA-F]+)/,literalColor:/^([a-zA-Z]+)/,rgbColor:/^rgb/i,rgbaColor:/^rgba/i,number:/^(([0-9]*\.[0-9]+)|([0-9]+\.?))/},r="";function e(c){var h=new Error(r+": "+c);throw h.source=r,h}function i(){var c=a();return r.length>0&&e("Invalid input not EOF"),c}function a(){return y(o)}function o(){return n("linear-gradient",t.linearGradient,l)||n("repeating-linear-gradient",t.repeatingLinearGradient,l)||n("radial-gradient",t.radialGradient,g)||n("repeating-radial-gradient",t.repeatingRadialGradient,g)}function n(c,h,E){return s(h,function(G){var ut=E();return ut&&(v(t.comma)||e("Missing comma before color stops")),{type:c,orientation:ut,colorStops:y(F)}})}function s(c,h){var E=v(c);if(E){v(t.startCall)||e("Missing (");var G=h(E);return v(t.endCall)||e("Missing )"),G}}function l(){return f()||d()}function f(){return I("directional",t.sideOrCorner,1)}function d(){return I("angular",t.angleValue,1)}function g(){var c,h=p(),E;return h&&(c=[],c.push(h),E=r,v(t.comma)&&(h=p(),h?c.push(h):r=E)),c}function p(){var c=u()||b();if(c)c.at=T();else{var h=R();if(h){c=h;var E=T();E&&(c.at=E)}else{var G=_();G&&(c={type:"default-radial",at:G})}}return c}function u(){var c=I("shape",/^(circle)/i,0);return c&&(c.style=st()||R()),c}function b(){var c=I("shape",/^(ellipse)/i,0);return c&&(c.style=L()||R()),c}function R(){return I("extent-keyword",t.extentKeywords,1)}function T(){if(I("position",/^at/,0)){var c=_();return c||e("Missing positioning value"),c}}function _(){var c=S();if(c.x||c.y)return{type:"position",value:c}}function S(){return{x:L(),y:L()}}function y(c){var h=c(),E=[];if(h)for(E.push(h);v(t.comma);)h=c(),h?E.push(h):e("One extra comma");return E}function F(){var c=N();return c||e("Expected color definition"),c.length=L(),c}function N(){return k()||z()||W()||O()}function O(){return I("literal",t.literalColor,0)}function k(){return I("hex",t.hexColor,1)}function W(){return s(t.rgbColor,function(){return{type:"rgb",value:y(w)}})}function z(){return s(t.rgbaColor,function(){return{type:"rgba",value:y(w)}})}function w(){return v(t.number)[1]}function L(){return I("%",t.percentageValue,1)||P()||st()}function P(){return I("position-keyword",t.positionKeywords,1)}function st(){return I("px",t.pixelValue,1)||I("em",t.emValue,1)}function I(c,h,E){var G=v(h);if(G)return{type:c,value:G[E]}}function v(c){var h,E;return E=/^[\n\r\t\s]+/.exec(r),E&&ft(E[0].length),h=c.exec(r),h&&ft(h[0].length),h}function ft(c){r=r.substr(c)}return function(c){return r=c.toString(),i()}}();var St=rt;function Xt(t){return t.type==="literal"?t.value:t.type==="hex"?`#${t.value}`:t.type==="rgb"?`rgb(${t.value.join(",")})`:t.type==="rgba"?`rgba(${t.value.join(",")})`:"transparent"}function nt({id:t,width:r},{image:e}){if(e.startsWith("linear-gradient(")){let i=St.parse(e)[0],a,o,n,s;if(i.orientation.type==="directional")[a,o,n,s]={top:[0,1,0,0],bottom:[0,0,0,1],left:[1,0,0,0],right:[0,0,1,0]}[i.orientation.value];else if(i.orientation.type==="angular"){let u=+i.orientation.value/180*Math.PI-Math.PI/2,b=Math.cos(u),R=Math.sin(u);a=0,o=0,n=b,s=R,n<0&&(a-=n,n=0),s<0&&(o-=s,s=0)}let l=r,f=[];for(let u of i.colorStops){let b=Xt(u);if(!f.length&&(f.push({offset:0,color:b}),typeof u.length=="undefined"||u.length.value==="0"))continue;let R=typeof u.length=="undefined"?void 0:u.length.type==="%"?u.length.value/100:u.length.value/l;f.push({offset:R,color:b})}f.length||f.push({offset:0,color:"transparent"});let d=f[f.length-1];d.offset!==1&&(typeof d.offset=="undefined"?d.offset=1:f.push({offset:1,color:d.color}));let g=0,p=1;for(let u=0;u<f.length;u++)if(typeof f[u].offset=="undefined"){for(p<u&&(p=u);typeof f[p].offset=="undefined";)p++;f[u].offset=(f[p].offset-f[g].offset)/(p-g)*(u-g)+f[g].offset}else g=u;return[`satori_bi${t}`,`<linearGradient id="satori_bi${t}" x1="${a}" y1="${o}" x2="${n}" y2="${s}">${f.map(u=>`<stop offset="${u.offset*100}%" stop-color="${u.color}"/>`).join("")}</linearGradient>`]}if(e.startsWith("url(")){let i=e.slice(4,-1);return[`satori_bi${t}`,`<pattern id="satori_bi${t}" patternContentUnits="objectBoundingBox" width="1" height="1"><image href="${i}" x="0" y="0" width="1" height="1"/></pattern>`]}}m();function J(t,r,e){return e<t+r&&(e/2<t&&e/2<r?t=r=e/2:e/2<t?t=e-r:e/2<r&&(r=e-t)),[t,r]}function Y({left:t,top:r,width:e,height:i},a){let{borderTopLeftRadius:o,borderTopRightRadius:n,borderBottomLeftRadius:s,borderBottomRightRadius:l}=a;return o=Math.min(o||0,e,i),n=Math.min(n||0,e,i),s=Math.min(s||0,e,i),l=Math.min(l||0,e,i),!o&&!n&&!s&&!l?"":([o,n]=J(o,n,e),[o,s]=J(o,s,i),[n,l]=J(n,l,i),[s,l]=J(s,l,e),`M${t+o},${r} h${e-o-n} a${n},${n} 0 0 1 ${n},${n} v${i-n-l} a${l},${l} 0 0 1 ${-l},${l} h${l+s-e} a${s},${s} 0 0 1 ${-s},${-s} v${s+o-i} a${o},${o} 0 0 1 ${o},${-o}`)}m();function X({id:t,width:r,height:e},i){if(!i.shadowColor||!i.shadowOffset||typeof i.shadowRadius=="undefined")return"";let a=Math.min(i.shadowOffset.width-i.shadowRadius*2,0),o=Math.max(i.shadowOffset.width+i.shadowRadius*2+r,r),n=Math.min(i.shadowOffset.height-i.shadowRadius*2,0),s=Math.max(i.shadowOffset.height+i.shadowRadius*2+e,e);return`<defs><filter id="satori_s-${t}" x="${a/r*100}%" y="${n/e*100}%" width="${(o-a)/r*100}%" height="${(s-n)/e*100}%"><feDropShadow dx="${i.shadowOffset.width}" dy="${i.shadowOffset.height}" stdDeviation="${i.shadowRadius}" flood-color="${i.shadowColor}" flood-opacity="1"/></filter></defs>`}function ot({id:t,left:r,top:e,width:i,height:a,isInheritingTransform:o,debug:n},s){if(s.display==="none")return"";let l="rect",f="transparent",d=0,g="",p="",u=[],b=1,R="";if(s.backgroundColor&&u.push(s.backgroundColor),s.borderWidth&&(d=s.borderWidth,f=s.borderColor),s.opacity&&(b=+s.opacity),s.transform&&(g=M({left:r,top:e,width:i,height:a},s.transform,o)),s.backgroundImage){let S=s.backgroundImage.map((y,F)=>nt({id:t+"_"+F,width:i,height:a},y)).filter(Boolean);for(let y of S)p+=y[1],u.push(`url(#${y[0]})`)}let T=Y({left:r,top:e,width:i,height:a},s);T&&(l="path");let _=X({width:i,height:a,id:t},s);return u.length||u.push("transparent"),n&&(R=`<rect x="${r}" y="${e}" width="${i}" height="${a}" fill="transparent" stroke="#ff5757" stroke-width="1" ${g?`transform="${g}"`:""}></rect>`),`${p?`<defs>${p}</defs>`:""}${_?`${_}<g filter="url(#satori_s-${t})">`:""}${b!==1?`<g opacity="${b}">`:""}${u.map((S,y)=>S==="transparent"&&!(y===u.length-1&&d)?"":`<${l} x="${r}" y="${e}" width="${i}" height="${a}" fill="${S}" ${y===u.length-1&&d?`stroke="${f}" stroke-width="${d}"`:""} ${T?`d="${T}"`:""} ${g?`transform="${g}"`:""}></${l}>`).join("")}${b!==1?"</g>":""}${_?"</g>":""}${R}`}m();function it({id:t,left:r,top:e,width:i,height:a,src:o,debug:n},s){if(s.display==="none")return"";let l="",f=1,d=s.objectFit==="contain"?"xMidYMid":s.objectFit==="cover"?"xMidYMid slice":"none",g=Y({left:r,top:e,width:i,height:a},s);g&&(l=`<clipPath id="satori_c-${t}"><path x="${r}" y="${e}" width="${i}" height="${a}" d="${g}"></path></clipPath>`),s.opacity&&(f=+s.opacity);let p=X({width:i,height:a,id:t},s);return`${p}${p?`<g filter="url(#satori_s-${t})">`:""}${l}<image href="${o}" x="${r}" y="${e}" width="${i}" height="${a}" preserveAspectRatio="${d}" ${l?`clip-path="url(#satori_c-${t})"`:""} ${f!==1?`opacity="${f}"`:""}></image>${p?"</g>":""}`}function*U(t,r){let e=C(),{id:i,inheritedStyle:a,parent:o,font:n,debug:s,embedFont:l=!0}=r;if(t===null||typeof t=="undefined")return yield,"";if(!q(t)||typeof t.type=="function"){let L;if(!q(t))L=et(String(t),r);else{if(bt(t.type))throw new Error("Class component is not supported.");L=U(t.type(t.props),r)}L.next();let P=yield;return L.next(P).value}let{type:f,props:d}=t,{style:g,children:p}=d,u=e.Node.create();o.insertChild(u,o.getChildCount());let[b,R]=Q(u,f,a,g,d),T=b.transform===a.transform;T||(b.transform.__parent=a.transform);let _=typeof p=="undefined"?[]:[].concat(p),S=[],y=0;for(let L of _){let P=U(L,{id:i*_.length+ ++y,parentStyle:b,inheritedStyle:R,isInheritingTransform:!0,parent:u,font:n,embedFont:l,debug:s});P.next(),S.push(P)}let[F,N]=yield;b.position==="absolute"&&u.calculateLayout();let{left:O,top:k,width:W,height:z}=u.getComputedLayout();O+=F,k+=N;let w="";f==="img"?w=it({id:i,left:O,top:k,width:W,height:z,src:d.src,isInheritingTransform:T,debug:s},b):w=ot({id:i,left:O,top:k,width:W,height:z,isInheritingTransform:T,debug:s},b);for(let L of S)w+=L.next([O,k]).value;return w}m();import Rt from"opentype.js";var j=class{constructor(r){this.fonts=new Map;for(let e of r){let i=e.data,a="buffer"in i?Rt.parse(i.buffer.slice(i.byteOffset,i.byteOffset+i.byteLength)):Rt.parse(i);this.defaultFont||(this.defaultFont=a),this.fonts.has(e.name)||this.fonts.set(e.name,[]),this.fonts.get(e.name).push([a,e.weight,e.style])}}get({name:r,weight:e,style:i}){if(!this.fonts.has(r))return this.defaultFont;e==="normal"&&(e=400),e==="bold"&&(e=700);let a=[...this.fonts.get(r)];return a.sort(([o,n,s],[l,f,d])=>{if(n!==f)return n?!f||n===e?-1:f===e?1:e===400&&n===500||e===500&&n===400?-1:e===400&&f===500||e===500&&f===400?1:e<400?n<e&&f<e?f-n:n<e?-1:f<e?1:n-f:e<n&&e<f?n-f:e<n?-1:e<f?1:f-n:1;if(s!==d){if(s===i)return-1;if(d===i)return 1}return-1}),a[0][0]}getFont({fontFamily:r,fontWeight:e=400,fontStyle:i="normal"}){return this.get({name:r,weight:e,style:i})}measure(r,e,{fontSize:i,letterSpacing:a=0}){return{width:r.getAdvanceWidth(e,i,{letterSpacing:a/i}),ascent:r.ascender/r.unitsPerEm*i,descent:-(r.descender/r.unitsPerEm)*i}}getSVG(r,e,{fontSize:i,top:a,left:o,letterSpacing:n=0}){return a+=r.ascender/r.unitsPerEm*i,r.getPath(e,o,a,i,{letterSpacing:n/i}).toPathData(2)}getAscent(r,{fontSize:e}){return r.ascender/r.unitsPerEm*e}};m();function at({width:t,height:r,content:e},i){return`<svg width="${t}" height="${r}" viewBox="0 0 ${t} ${r}" xmlns="http://www.w3.org/2000/svg">${e}</svg>`}function Tt(t,r){let e=C();if(!e)throw new Error("Satori is not initialized.");let i=new j(r.fonts),a=e.Node.create();a.setWidth(r.width),a.setHeight(r.height),a.setFlexDirection(e.FLEX_DIRECTION_ROW),a.setFlexWrap(e.WRAP_WRAP),a.setAlignContent(e.ALIGN_AUTO),a.setAlignItems(e.ALIGN_FLEX_START),a.setJustifyContent(e.JUSTIFY_FLEX_START);let o=U(t,{id:1,parentStyle:{},inheritedStyle:{fontSize:16,fontWeight:"normal",fontFamily:"serif",fontStyle:"normal",lineHeight:1.2,color:"black",opacity:1},parent:a,font:i,embedFont:r.embedFont,debug:r.debug});o.next(),a.calculateLayout(r.width,r.height,e.DIRECTION_LTR);let n=o.next([0,0]).value;return at({width:r.width,height:r.height,content:n})}export{Tt as default,Wt as init};
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../node_modules/.pnpm/tsup@5.11.13_typescript@4.5.5/node_modules/tsup/assets/esm_shims.js","../../src/yoga-prebuilt.ts","../../src/index.ts","../../src/satori.ts","../../src/yoga.ts","../../src/layout.ts","../../src/utils.ts","../../src/handler/index.ts","../../src/handler/presets.ts","../../src/handler/inheritable.ts","../../src/handler/expand.ts","../../src/text.ts","../../src/builder/text.ts","../../src/builder/transform.ts","../../src/builder/rect.ts","../../src/builder/background-image.ts","../../deps/gradient-parser/index.js","../../src/builder/border-radius.ts","../../src/builder/box-shadow.ts","../../src/builder/image.ts","../../src/font.ts","../../src/builder/svg.ts"],"sourcesContent":["// Shim globals in esm bundle\nimport { fileURLToPath } from 'url'\nimport path from 'path'\n\nconst getFilename = () => fileURLToPath(import.meta.url)\nconst getDirname = () => path.dirname(getFilename())\n\nexport const __dirname = /* @__PURE__ */ getDirname()\nexport const __filename = /* @__PURE__ */ getFilename()\n","export { default } from 'yoga-layout-prebuilt'\n","export * from './satori'\nexport { default } from './satori'\n","import type { ReactNode } from 'react'\n\nimport getYoga, { init } from './yoga'\nimport layout from './layout'\nimport FontLoader, { FontOptions } from './font'\nimport svg from './builder/svg'\n\nexport interface SatoriOptions {\n width: number\n height: number\n fonts: FontOptions[]\n embedFont?: boolean\n debug?: boolean\n}\n\nexport { init }\n\nexport default function satori(\n element: ReactNode,\n options: SatoriOptions\n): string {\n const Yoga = getYoga()\n if (!Yoga) throw new Error('Satori is not initialized.')\n\n const font = new FontLoader(options.fonts)\n\n const root = Yoga.Node.create()\n root.setWidth(options.width)\n root.setHeight(options.height)\n root.setFlexDirection(Yoga.FLEX_DIRECTION_ROW)\n root.setFlexWrap(Yoga.WRAP_WRAP)\n root.setAlignContent(Yoga.ALIGN_AUTO)\n root.setAlignItems(Yoga.ALIGN_FLEX_START)\n root.setJustifyContent(Yoga.JUSTIFY_FLEX_START)\n\n const handler = layout(element, {\n id: 1,\n parentStyle: {},\n inheritedStyle: {\n fontSize: 16,\n fontWeight: 'normal',\n fontFamily: 'serif',\n fontStyle: 'normal',\n lineHeight: 1.2,\n color: 'black',\n opacity: 1,\n },\n parent: root,\n font,\n embedFont: options.embedFont,\n debug: options.debug,\n })\n\n handler.next()\n root.calculateLayout(options.width, options.height, Yoga.DIRECTION_LTR)\n\n const content = handler.next([0, 0]).value\n return svg({ width: options.width, height: options.height, content })\n}\n","let Yoga: typeof import('yoga-layout')\n\n// @ts-ignore\nif (WASM) {\n // For WASM build, we don't include the prebuilt version of Yoga but let the\n // user specify the module manually.\n} else {\n Yoga = require('./yoga-prebuilt').default\n}\n\nexport function init(yoga: typeof Yoga) {\n Yoga = yoga\n}\n\nexport default function getYoga(): typeof Yoga {\n return Yoga\n}\n","/**\n * This module is used to calculate the layout of the current sub-tree.\n */\n\nimport type { ReactNode } from 'react'\nimport type { YogaNode } from 'yoga-layout'\n\nimport getYoga from './yoga'\nimport { isReactElement, isClass } from './utils'\nimport handler from './handler'\nimport FontLoader from './font'\nimport layoutText from './text'\nimport rect from './builder/rect'\nimport image from './builder/image'\n\nexport interface LayoutContext {\n id: number\n parentStyle: Record<string, number | string>\n inheritedStyle: Record<string, number | string>\n isInheritingTransform?: boolean\n parent: YogaNode\n font: FontLoader\n embedFont: boolean\n debug?: boolean\n}\n\nexport default function* layout(\n element: ReactNode,\n context: LayoutContext\n): Generator<undefined, string, [number, number]> {\n const Yoga = getYoga()\n const { id, inheritedStyle, parent, font, debug, embedFont = true } = context\n\n // 1. Pre-process the node.\n if (element === null || typeof element === 'undefined') {\n yield\n return ''\n }\n\n // Not a normal element.\n if (!isReactElement(element) || typeof element.type === 'function') {\n let iter: ReturnType<typeof layout>\n\n if (!isReactElement(element)) {\n // Process as text node.\n iter = layoutText(String(element), context)\n } else {\n if (isClass(element.type as Function)) {\n throw new Error('Class component is not supported.')\n }\n // If it's a custom component, Satori strictly requires it to be pure,\n // stateless, and not relying on any React APIs such as hooks or suspense.\n // So we can safely evaluate it to render. Otherwise, an error will be\n // thrown by React.\n iter = layout((element.type as Function)(element.props), context)\n }\n\n iter.next()\n const offset = yield\n return iter.next(offset).value\n }\n\n // Process as element.\n const { type, props } = element\n const { style, children } = props\n\n const node = Yoga.Node.create()\n parent.insertChild(node, parent.getChildCount())\n\n const [computedStyle, newInheritableStyle] = handler(\n node,\n type,\n inheritedStyle,\n style,\n props\n )\n // If the element is inheriting the parent `transform`, or applying its own.\n // This affects the coordinate system.\n const isInheritingTransform =\n computedStyle.transform === inheritedStyle.transform\n if (!isInheritingTransform) {\n ;(computedStyle.transform as any).__parent = inheritedStyle.transform\n }\n\n // 2. Do layout recursively for its children.\n const normalizedChildren =\n typeof children === 'undefined' ? [] : [].concat(children)\n const iterators: ReturnType<typeof layout>[] = []\n\n let i = 0\n for (const child of normalizedChildren) {\n const iter = layout(child, {\n id: id * normalizedChildren.length + ++i,\n parentStyle: computedStyle,\n inheritedStyle: newInheritableStyle,\n isInheritingTransform: true,\n parent: node,\n font,\n embedFont,\n debug,\n })\n iter.next()\n iterators.push(iter)\n }\n\n // 3. Post-process the node.\n const [x, y] = yield\n\n if (computedStyle.position === 'absolute') {\n node.calculateLayout()\n }\n\n let { left, top, width, height } = node.getComputedLayout()\n\n // Attach offset to the current node.\n left += x\n top += y\n\n let result = ''\n\n if (type === 'img') {\n result = image(\n {\n id,\n left,\n top,\n width,\n height,\n src: props.src,\n isInheritingTransform,\n debug,\n },\n computedStyle\n )\n } else {\n result = rect(\n { id, left, top, width, height, isInheritingTransform, debug },\n computedStyle\n )\n }\n\n for (const iter of iterators) {\n result += iter.next([left, top]).value\n }\n\n return result\n}\n","import type { ReactNode, ReactElement } from 'react'\n\nexport function isReactElement(node: ReactNode): node is ReactElement {\n const type = typeof node\n if (\n type === 'number' ||\n type === 'bigint' ||\n type === 'string' ||\n type === 'boolean'\n ) {\n return false\n }\n return true\n}\n\nexport function isClass(f: Function) {\n return /^class\\s/.test(Function.prototype.toString.call(f))\n}\n\n// Multiplies two 2d transform matrices.\nexport function multiply(m1: number[], m2: number[]) {\n return [\n m1[0] * m2[0] + m1[2] * m2[1],\n m1[1] * m2[0] + m1[3] * m2[1],\n m1[0] * m2[2] + m1[2] * m2[3],\n m1[1] * m2[2] + m1[3] * m2[3],\n m1[0] * m2[4] + m1[2] * m2[5] + m1[4],\n m1[1] * m2[4] + m1[3] * m2[5] + m1[5],\n ]\n}\n\nexport function v(\n field: string | number,\n map: Record<string, any>,\n fallback: any\n) {\n const value = map[field]\n return typeof value === 'undefined' ? fallback : value\n}\n","/**\n * Handler to update the Yoga node properties with the given element type and\n * style. Each supported element has its own preset styles, so this function\n * also returns the inherited style for children of the element.\n */\n\nimport type { YogaNode } from 'yoga-layout'\n\nimport getYoga from '../yoga'\nimport presets from './presets'\nimport inheritable from './inheritable'\nimport expand from './expand'\nimport { v } from '../utils'\n\ntype SatoriElement = keyof typeof presets\n\nexport default function handler(\n node: YogaNode,\n type: SatoriElement | string,\n inheritedStyle: Record<string, string | number>,\n definedStyle: Record<string, string | number>,\n props: Record<string, any>\n): [Record<string, string | number>, Record<string, string | number>] {\n const Yoga = getYoga()\n\n // Extend the default style with defined and inherited styles.\n const style = {\n ...inheritedStyle,\n ...expand(presets[type], inheritedStyle),\n ...expand(definedStyle, inheritedStyle),\n }\n\n if (type === 'img') {\n const width = parseInt(props.width)\n const height = parseInt(props.height)\n const r = height / width\n if (!style.width) style.width = width\n if (!style.height) style.height = r * (style.width as number)\n }\n\n // Set properties for Yoga.\n node.setDisplay(\n v(\n style.display,\n {\n flex: Yoga.DISPLAY_FLEX,\n none: Yoga.DISPLAY_NONE,\n },\n Yoga.DISPLAY_FLEX\n )\n )\n\n // if (style.alignContent) {\n node.setAlignContent(\n v(\n style.alignContent,\n {\n stretch: Yoga.ALIGN_STRETCH,\n center: Yoga.ALIGN_CENTER,\n 'flex-start': Yoga.ALIGN_FLEX_START,\n 'flex-end': Yoga.ALIGN_FLEX_END,\n 'space-between': Yoga.ALIGN_SPACE_BETWEEN,\n 'space-around': Yoga.ALIGN_SPACE_AROUND,\n baseline: Yoga.ALIGN_BASELINE,\n normal: Yoga.ALIGN_AUTO,\n },\n Yoga.ALIGN_AUTO\n )\n )\n // }\n\n node.setAlignItems(\n v(\n style.alignItems,\n {\n stretch: Yoga.ALIGN_STRETCH,\n center: Yoga.ALIGN_CENTER,\n 'flex-start': Yoga.ALIGN_FLEX_START,\n 'flex-end': Yoga.ALIGN_FLEX_END,\n baseline: Yoga.ALIGN_BASELINE,\n normal: Yoga.ALIGN_AUTO,\n },\n Yoga.ALIGN_FLEX_START\n )\n )\n node.setAlignSelf(\n v(\n style.alignSelf,\n {\n stretch: Yoga.ALIGN_STRETCH,\n center: Yoga.ALIGN_CENTER,\n 'flex-start': Yoga.ALIGN_FLEX_START,\n 'flex-end': Yoga.ALIGN_FLEX_END,\n baseline: Yoga.ALIGN_BASELINE,\n normal: Yoga.ALIGN_AUTO,\n },\n Yoga.ALIGN_AUTO\n )\n )\n node.setJustifyContent(\n v(\n style.justifyContent,\n {\n center: Yoga.JUSTIFY_CENTER,\n 'flex-start': Yoga.JUSTIFY_FLEX_START,\n 'flex-end': Yoga.JUSTIFY_FLEX_END,\n 'space-between': Yoga.JUSTIFY_SPACE_BETWEEN,\n 'space-around': Yoga.JUSTIFY_SPACE_AROUND,\n },\n Yoga.JUSTIFY_FLEX_START\n )\n )\n // @TODO: node.setAspectRatio\n\n node.setFlexDirection(\n v(\n style.flexDirection,\n {\n row: Yoga.FLEX_DIRECTION_ROW,\n column: Yoga.FLEX_DIRECTION_COLUMN,\n 'row-reverse': Yoga.FLEX_DIRECTION_ROW_REVERSE,\n 'column-reverse': Yoga.FLEX_DIRECTION_COLUMN_REVERSE,\n },\n Yoga.FLEX_DIRECTION_ROW\n )\n )\n node.setFlexWrap(\n v(\n style.flexWrap,\n {\n wrap: Yoga.WRAP_WRAP,\n nowrap: Yoga.WRAP_NO_WRAP,\n 'wrap-reverse': Yoga.WRAP_WRAP_REVERSE,\n },\n Yoga.WRAP_WRAP\n )\n )\n\n // @TODO: node.setFlex\n\n if (typeof style.flexBasis !== 'undefined') {\n // We can't use `auto` here due to this:\n // https://github.com/facebook/yoga/pull/1112\n // @TODO: We need a fork to add this API.\n node.setFlexBasis(style.flexBasis)\n }\n node.setFlexGrow(\n typeof style.flexGrow === 'undefined' ? 0 : (style.flexGrow as number)\n )\n node.setFlexShrink(\n typeof style.flexShrink === 'undefined' ? 1 : (style.flexShrink as number)\n )\n\n if (typeof style.maxHeight !== 'undefined') {\n node.setMaxHeight(style.maxHeight)\n }\n if (typeof style.maxWidth !== 'undefined') {\n node.setMaxWidth(style.maxWidth)\n }\n if (typeof style.minHeight !== 'undefined') {\n node.setMinHeight(style.minHeight)\n }\n if (typeof style.minWidth !== 'undefined') {\n node.setMinWidth(style.minWidth)\n }\n\n node.setOverflow(\n v(\n style.overflow,\n {\n visible: Yoga.OVERFLOW_VISIBLE,\n hidden: Yoga.OVERFLOW_HIDDEN,\n },\n Yoga.OVERFLOW_VISIBLE\n )\n )\n\n node.setMargin(Yoga.EDGE_TOP, (style.marginTop as number) || 0)\n node.setMargin(Yoga.EDGE_BOTTOM, (style.marginBottom as number) || 0)\n node.setMargin(Yoga.EDGE_LEFT, (style.marginLeft as number) || 0)\n node.setMargin(Yoga.EDGE_RIGHT, (style.marginRight as number) || 0)\n\n // @TODO: Add directional border support.\n node.setBorder(Yoga.EDGE_TOP, (style.borderWidth as number) || 0)\n node.setBorder(Yoga.EDGE_BOTTOM, (style.borderWidth as number) || 0)\n node.setBorder(Yoga.EDGE_LEFT, (style.borderWidth as number) || 0)\n node.setBorder(Yoga.EDGE_RIGHT, (style.borderWidth as number) || 0)\n\n node.setPadding(Yoga.EDGE_TOP, style.paddingTop || 0)\n node.setPadding(Yoga.EDGE_BOTTOM, style.paddingBottom || 0)\n node.setPadding(Yoga.EDGE_LEFT, style.paddingLeft || 0)\n node.setPadding(Yoga.EDGE_RIGHT, style.paddingRight || 0)\n\n node.setPositionType(\n v(\n style.position,\n {\n absolute: Yoga.POSITION_TYPE_ABSOLUTE,\n relative: Yoga.POSITION_TYPE_RELATIVE,\n },\n Yoga.POSITION_TYPE_RELATIVE\n )\n )\n\n if (typeof style.top !== 'undefined') {\n node.setPosition(Yoga.EDGE_TOP, style.top)\n }\n if (typeof style.bottom !== 'undefined') {\n node.setPosition(Yoga.EDGE_BOTTOM, style.bottom)\n }\n if (typeof style.left !== 'undefined') {\n node.setPosition(Yoga.EDGE_LEFT, style.left)\n }\n if (typeof style.right !== 'undefined') {\n node.setPosition(Yoga.EDGE_RIGHT, style.right)\n }\n\n if (typeof style.height !== 'undefined') {\n node.setHeight(style.height)\n } else {\n node.setHeightAuto()\n }\n if (typeof style.width !== 'undefined') {\n node.setWidth(style.width)\n } else {\n node.setWidthAuto()\n }\n\n return [style, inheritable(style)]\n}\n","/**\n * Pre-defined styles for elements. Here we hand pick some from Chromium's\n * default styles:\n * https://chromium.googlesource.com/chromium/blink/+/master/Source/core/css/html.css\n *\n * We try to only include commonly used, styling elements rather than senmantic elements.\n */\n\nexport default {\n // Generic block-level elements\n p: {\n display: 'block',\n marginTop: '1em',\n marginBottom: '1em',\n },\n div: {\n display: 'block',\n },\n blockquote: {\n display: 'block',\n marginTop: '1em',\n marginBottom: '1em',\n marginLeft: 40,\n marginRight: 40,\n },\n center: {\n display: 'block',\n textAlign: 'center',\n },\n hr: {\n display: 'block',\n marginTop: '0.5em',\n marginBottom: '0.5em',\n marginLeft: 'auto',\n marginRight: 'auto',\n borderWidth: 1,\n borderStyle: 'inset',\n },\n // Heading elements\n h1: {\n display: 'block',\n fontSize: '2em',\n marginTop: '0.67em',\n marginBottom: '0.67em',\n marginLeft: 0,\n marginRight: 0,\n fontWeight: 'bold',\n },\n h2: {\n display: 'block',\n fontSize: '1.5em',\n marginTop: '0.83em',\n marginBottom: '0.83em',\n marginLeft: 0,\n marginRight: 0,\n fontWeight: 'bold',\n },\n h3: {\n display: 'block',\n fontSize: '1.17em',\n marginTop: '1em',\n marginBottom: '1em',\n marginLeft: 0,\n marginRight: 0,\n fontWeight: 'bold',\n },\n h4: {\n display: 'block',\n marginTop: '1.33em',\n marginBottom: '1.33em',\n marginLeft: 0,\n marginRight: 0,\n fontWeight: 'bold',\n },\n h5: {\n display: 'block',\n fontSize: '0.83em',\n marginTop: '1.67em',\n marginBottom: '1.67em',\n marginLeft: 0,\n marginRight: 0,\n fontWeight: 'bold',\n },\n h6: {\n display: 'block',\n fontSize: '0.67em',\n marginTop: '2.33em',\n marginBottom: '2.33em',\n marginLeft: 0,\n marginRight: 0,\n fontWeight: 'bold',\n },\n // Tables\n // Lists\n // Form elements\n // Inline elements\n u: {\n textDecoration: 'underline',\n },\n strong: {\n fontWeight: 'bold',\n },\n b: {\n fontWeight: 'bold',\n },\n i: {\n fontStyle: 'italic',\n },\n em: {\n fontStyle: 'italic',\n },\n code: {\n fontFamily: 'monospace',\n },\n kbd: {\n fontFamily: 'monospace',\n },\n pre: {\n display: 'block',\n fontFamily: 'monospace',\n whiteSpace: 'pre',\n marginTop: '1em',\n marginBottom: '1em',\n },\n mark: {\n backgroundColor: 'yellow',\n color: 'black',\n },\n big: {\n fontSize: 'larger',\n },\n small: {\n fontSize: 'smaller',\n },\n s: {\n textDecoration: 'line-through',\n },\n}\n","const list = new Set([\n 'color',\n 'font',\n 'fontFamily',\n 'fontSize',\n 'fontStyle',\n 'fontWeight',\n 'lineHeight',\n 'textAlign',\n 'textTransform',\n 'whiteSpace',\n 'letterSpacing',\n 'transform',\n 'wordBreak',\n\n // Special case: SVG doesn't apply opacity to children elements so we need to\n // make it inheritable here.\n 'opacity',\n])\n\nexport default function inheritable(style: Record<string, any>) {\n const inheritedStyle: Record<string, any> = {}\n for (const prop in style) {\n if (list.has(prop)) {\n inheritedStyle[prop] = style[prop]\n }\n }\n return inheritedStyle\n}\n","/**\n * This module expands the CSS properties to get rid of shorthands, as well as\n * cleaning up some properties.\n */\n\nimport { getPropertyName, getStylesForProperty } from 'css-to-react-native'\nimport CssDimension from 'parse-css-dimension'\nimport { parseElementStyle } from 'css-background-parser'\nimport { multiply } from '../utils'\n\n// https://react-cn.github.io/react/tips/style-props-value-px.html\nconst optOutPx = new Set([\n 'flex',\n 'flexGrow',\n 'flexShrink',\n 'flexBasis',\n 'fontWeight',\n 'lineHeight',\n 'opacity',\n 'scale',\n 'scaleX',\n 'scaleY',\n])\n\nconst baseMatrix = [1, 0, 0, 1, 0, 0]\n\nfunction purify(name: string, value?: string | number) {\n if (typeof value === 'number') {\n if (!optOutPx.has(name)) return value + 'px'\n return String(value)\n }\n // @TODO: For `transform`, we need to convert relative values to absolute\n // values here.\n return value\n}\n\nfunction lengthToNumber(\n length: string | number,\n baseFontSize: number\n): number | undefined {\n if (typeof length === 'number') return length\n\n // Convert em and rem values to number (px), convert rad to deg.\n try {\n const parsed = new CssDimension(length)\n if (parsed.type === 'length') {\n switch (parsed.unit) {\n case 'em':\n return parsed.value * baseFontSize\n case 'rem':\n return parsed.value * 16\n default:\n return parsed.value\n }\n } else if (parsed.type === 'angle') {\n switch (parsed.unit) {\n case 'deg':\n return parsed.value\n case 'rad':\n return (parsed.value * 180) / Math.PI\n default:\n return parsed.value\n }\n }\n } catch (err) {}\n}\n\nexport default function expand(\n style: Record<string, string | number>,\n inheritedStyle: Record<string, string | number>\n): Record<string, string | number> {\n const rules = []\n for (const prop in style) {\n const name = getPropertyName(prop)\n rules.push([name, purify(name, style[prop])])\n }\n const transformedStyle = rules.reduce((accum, rule) => {\n const propertyName = getPropertyName(rule[0])\n const value = rule[1]\n return Object.assign(accum, getStylesForProperty(propertyName, value, true))\n }, {})\n\n // Parse background images.\n if (transformedStyle.backgroundImage) {\n const { backgrounds } = parseElementStyle(transformedStyle)\n transformedStyle.backgroundImage = backgrounds\n }\n\n // Calculate the base font size.\n let baseFontSize: number =\n transformedStyle.fontSize || inheritedStyle.fontSize\n if (typeof baseFontSize === 'string') {\n try {\n const parsed = new CssDimension(baseFontSize)\n switch (parsed.unit) {\n case 'em':\n baseFontSize = parsed.value * (inheritedStyle.fontSize as number)\n break\n case 'rem':\n baseFontSize = parsed.value * 16\n break\n }\n } catch (err) {\n baseFontSize = 16\n }\n }\n transformedStyle.fontSize = baseFontSize\n\n for (const prop in transformedStyle) {\n let value = transformedStyle[prop]\n\n // Convert em and rem values to px (number).\n if (typeof value === 'string') {\n const len = lengthToNumber(value, baseFontSize)\n if (typeof len !== 'undefined') transformedStyle[prop] = len\n value = transformedStyle[prop]\n }\n\n // Inherit the opacity.\n if (prop === 'opacity') {\n value = transformedStyle[prop] =\n value * (inheritedStyle.opacity as number)\n }\n\n // Handle CSS transforms To make it easier, we convert different transform\n // types directly to a matrix and apply it recursively to all its children.\n // @TODO: We need to convert relative values (50%) to absolute values. This\n // is pretty tricky to support as we need an extra pass to handle them after\n // the full layout pass.\n if (prop === 'transform') {\n let matrix = [...baseMatrix]\n const transforms = value as { [type: string]: number | string }[]\n\n // Transforms are applied from right to left.\n for (const transform of transforms) {\n const type = Object.keys(transform)[0]\n const v = transform[type]\n const len = typeof v === 'string' ? lengthToNumber(v, baseFontSize) : v\n\n const transformMatrix = [...baseMatrix]\n switch (type) {\n case 'translateX':\n transformMatrix[4] = len\n break\n case 'translateY':\n transformMatrix[5] = len\n break\n case 'scaleX':\n transformMatrix[0] = len\n break\n case 'scaleY':\n transformMatrix[3] = len\n break\n case 'rotate':\n const rad = (len * Math.PI) / 180\n const c = Math.cos(rad)\n const s = Math.sin(rad)\n transformMatrix[0] = c\n transformMatrix[1] = s\n transformMatrix[2] = -s\n transformMatrix[3] = c\n break\n case 'skewX':\n transformMatrix[2] = Math.tan((len * Math.PI) / 180)\n break\n case 'skewY':\n transformMatrix[1] = Math.tan((len * Math.PI) / 180)\n break\n }\n matrix = multiply(transformMatrix, matrix)\n }\n\n transformedStyle.transform = matrix\n }\n }\n\n return transformedStyle\n}\n","/**\n * This module calculates the layout of a text string. Currently the only\n * supported inline node is text. All other nodes are using block layout.\n */\nimport type { LayoutContext } from './layout'\n\nimport getYoga from './yoga'\nimport { LineBreaker } from 'css-line-break'\nimport text from './builder/text'\nimport { v } from './utils'\n\nexport default function* buildTextNodes(content, context: LayoutContext) {\n const Yoga = getYoga()\n const {\n parentStyle,\n parent,\n font,\n id,\n isInheritingTransform,\n debug,\n embedFont,\n } = context\n\n const breaker = LineBreaker(content, {\n lineBreak: 'strict',\n wordBreak: v(\n parentStyle.wordBreak,\n {\n normal: 'normal',\n 'break-all': 'break-all',\n 'break-word': 'break-word',\n 'keep-all': 'keep-all',\n },\n 'normal'\n ),\n })\n\n const words = []\n for (let br; !(br = breaker.next()).done; ) {\n words.push(br.value.slice())\n }\n\n const nodes = []\n\n // @TODO: Find a better way to avoid overriding the parent node.\n parent.setAlignItems(Yoga.ALIGN_BASELINE)\n if (parentStyle.textAlign === 'left') {\n parent.setJustifyContent(Yoga.JUSTIFY_FLEX_START)\n } else if (parentStyle.textAlign === 'center') {\n parent.setJustifyContent(Yoga.JUSTIFY_CENTER)\n } else if (parentStyle.textAlign === 'right') {\n parent.setJustifyContent(Yoga.JUSTIFY_FLEX_END)\n } else if (parentStyle.textAlign === 'justify') {\n parent.setJustifyContent(Yoga.JUSTIFY_SPACE_BETWEEN)\n }\n\n const resolvedFont = font.getFont(parentStyle as any)\n\n for (const word of words) {\n const node = Yoga.Node.create()\n parent.insertChild(node, parent.getChildCount())\n\n const measured = font.measure(resolvedFont, word, parentStyle as any)\n\n node.setWidth(measured.width)\n node.setHeight(measured.ascent * 1.2)\n node.setMargin(Yoga.EDGE_BOTTOM, measured.descent * 1.2)\n\n nodes.push(node)\n }\n\n const [x, y] = yield\n\n let result = ''\n\n for (let i = 0; i < nodes.length; i++) {\n const node = nodes[i]\n const word = words[i]\n if (parentStyle.position === 'absolute') {\n node.calculateLayout()\n }\n\n let { left, top, width, height } = node.getComputedLayout()\n\n // Attach offset to the current node.\n left += x\n top += y\n\n let path: string | null = null\n\n if (embedFont) {\n path = font.getSVG(resolvedFont, word, {\n ...parentStyle,\n top,\n left,\n letterSpacing: parentStyle.letterSpacing,\n } as any)\n } else {\n // We need manually add the font ascender height to ensure it starts\n // at the baseline because <text>'s alignment baseline is set to `hanging`\n // by default and supported to change in SVG 1.1.\n top += font.getAscent(resolvedFont, parentStyle as any)\n }\n\n result += text(\n {\n content: word,\n id,\n left,\n top,\n width,\n height,\n isInheritingTransform,\n path,\n debug,\n },\n parentStyle\n )\n }\n\n return result\n}\n","import transform from './transform'\n\nexport default function text(\n {\n content,\n left,\n top,\n width,\n height,\n isInheritingTransform,\n path,\n debug,\n }: {\n content: string\n id: number\n left: number\n top: number\n width: number\n height: number\n isInheritingTransform: boolean\n path: string | null\n debug?: boolean\n },\n style: Record<string, number | string>\n) {\n let matrix = ''\n let opacity = 1\n let extra = ''\n\n if (style.transform) {\n matrix = transform(\n { left, top, width, height },\n style.transform as unknown as number[],\n isInheritingTransform\n )\n }\n\n if (style.opacity) {\n opacity = +style.opacity\n }\n\n if (debug) {\n extra = `<rect x=\"${left}\" y=\"${top}\" width=\"${width}\" height=\"${\n path === null ? 0.5 : height\n }\" fill=\"transparent\" stroke=\"#575eff\" stroke-width=\"1\" ${\n matrix ? `transform=\"${matrix}\"` : ''\n }></rect>`\n }\n\n // Do not embed the font, use <text> with the raw content instead.\n if (path === null) {\n return `<text x=\"${left}\" y=\"${top}\" width=\"${width}\" height=\"${height}\" fill=\"${\n style.color\n }\" font-weight=\"${style.fontWeight}\" font-style=\"${\n style.fontStyle\n }\" font-size=\"${style.fontSize}\" font-family=\"${style.fontFamily}\" ${\n style.letterSpacing ? `letter-spacing=\"${style.letterSpacing}\"` : ''\n } ${matrix ? `transform=\"${matrix}\"` : ''} ${\n opacity !== 1 ? `opacity=\"${opacity}\"` : ''\n }>${content}</text>${extra}`\n }\n\n return `<path fill=\"${style.color}\" ${\n matrix ? `transform=\"${matrix}\"` : ''\n } ${opacity !== 1 ? `opacity=\"${opacity}\"` : ''} d=\"${path}\"></path>${extra}`\n}\n","import { multiply } from '../utils'\n\nexport default function transform(\n {\n left,\n top,\n width,\n height,\n }: { left: number; top: number; width: number; height: number },\n matrix: number[],\n isInheritingTransform: boolean\n) {\n let result: number[]\n\n // Calculate the transform origin.\n if (isInheritingTransform) {\n result = matrix\n } else {\n // If this element is the transform target, we attach the origin coordinates\n // to this matrix.\n const x = left + width / 2\n const y = top + height / 2\n\n // Due to the different coordinate systems, we need to move the shape to the\n // origin first, then apply the matrix, then move it back.\n result = multiply(\n [1, 0, 0, 1, x, y],\n multiply(matrix, [1, 0, 0, 1, -x, -y])\n )\n\n // And we need to apply its parent transform if it has one.\n if ((matrix as any).__parent) {\n result = multiply((matrix as any).__parent, result)\n }\n\n // Mutate self.\n matrix.splice(0, 6, ...result)\n }\n\n return `matrix(${result.map((v) => v.toFixed(2)).join(',')})`\n}\n","import backgroundImage from './background-image'\nimport radius from './border-radius'\nimport shadow from './box-shadow'\nimport transform from './transform'\n\nexport default function rect(\n {\n id,\n left,\n top,\n width,\n height,\n isInheritingTransform,\n debug,\n }: {\n id: number\n left: number\n top: number\n width: number\n height: number\n isInheritingTransform: boolean\n debug?: boolean\n },\n style: Record<string, number | string>\n) {\n if (style.display === 'none') return ''\n\n let type = 'rect'\n let stroke = 'transparent'\n let strokeWidth = 0\n let matrix = ''\n let defs = ''\n let fills: string[] = []\n let opacity = 1\n let extra = ''\n\n if (style.backgroundColor) {\n fills.push(style.backgroundColor as string)\n }\n\n if (style.borderWidth) {\n strokeWidth = style.borderWidth as number\n stroke = style.borderColor as string\n }\n\n if (style.opacity) {\n opacity = +style.opacity\n }\n\n if (style.transform) {\n matrix = transform(\n { left, top, width, height },\n style.transform as unknown as number[],\n isInheritingTransform\n )\n }\n\n if (style.backgroundImage) {\n const backgrounds = (style.backgroundImage as any)\n .map((background, index) =>\n backgroundImage({ id: id + '_' + index, width, height }, background)\n )\n .filter(Boolean)\n for (const background of backgrounds) {\n defs += background[1]\n fills.push(`url(#${background[0]})`)\n }\n }\n\n const path = radius(\n { left, top, width, height },\n style as Record<string, number>\n )\n if (path) {\n type = 'path'\n }\n\n const filter = shadow({ width, height, id }, style)\n\n if (!fills.length) fills.push('transparent')\n\n if (debug) {\n extra = `<rect x=\"${left}\" y=\"${top}\" width=\"${width}\" height=\"${height}\" fill=\"transparent\" stroke=\"#ff5757\" stroke-width=\"1\" ${\n matrix ? `transform=\"${matrix}\"` : ''\n }></rect>`\n }\n\n return `${defs ? `<defs>${defs}</defs>` : ''}${\n filter ? `${filter}<g filter=\"url(#satori_s-${id})\">` : ''\n }${opacity !== 1 ? `<g opacity=\"${opacity}\">` : ''}${\n // Each background generates a new rectangle.\n fills\n .map((fill, i) => {\n if (fill === 'transparent' && !(i === fills.length - 1 && strokeWidth))\n return ''\n\n return `<${type} x=\"${left}\" y=\"${top}\" width=\"${width}\" height=\"${height}\" fill=\"${fill}\" ${\n i === fills.length - 1 && strokeWidth\n ? `stroke=\"${stroke}\" stroke-width=\"${strokeWidth}\"`\n : ''\n } ${path ? `d=\"${path}\"` : ''} ${\n matrix ? `transform=\"${matrix}\"` : ''\n }></${type}>`\n })\n .join('')\n }${opacity !== 1 ? `</g>` : ''}${filter ? '</g>' : ''}${extra}`\n}\n","import gradient from '../../deps/gradient-parser'\n\ninterface Background {\n attachment: string\n color?: string\n clip: string\n image: string\n origin: string\n position: string\n size: string\n repeat: string\n}\n\nfunction resolveColorFromStop(stop) {\n if (stop.type === 'literal') return stop.value\n if (stop.type === 'hex') return `#${stop.value}`\n if (stop.type === 'rgb') return `rgb(${stop.value.join(',')})`\n if (stop.type === 'rgba') return `rgba(${stop.value.join(',')})`\n return 'transparent'\n}\n\nexport default function backgroundImage(\n { id, width }: { id: string; width: number; height: number },\n { image }: Background\n) {\n if (image.startsWith('linear-gradient(')) {\n const parsed = gradient.parse(image)[0]\n\n // Calculate the direction.\n let x1, y1, x2, y2\n if (parsed.orientation.type === 'directional') {\n ;[x1, y1, x2, y2] = {\n top: [0, 1, 0, 0],\n bottom: [0, 0, 0, 1],\n left: [1, 0, 0, 0],\n right: [0, 0, 1, 0],\n }[parsed.orientation.value]\n } else if (parsed.orientation.type === 'angular') {\n const angle = (+parsed.orientation.value / 180) * Math.PI - Math.PI / 2\n const c = Math.cos(angle)\n const s = Math.sin(angle)\n\n x1 = 0\n y1 = 0\n x2 = c\n y2 = s\n if (x2 < 0) {\n x1 -= x2\n x2 = 0\n }\n if (y2 < 0) {\n y1 -= y2\n y2 = 0\n }\n }\n\n // @TODO\n const totalLength = width\n\n // Resolve the color stops based on the spec:\n // https://drafts.csswg.org/css-images/#color-stop-syntax\n const stops = []\n for (const stop of parsed.colorStops) {\n const color = resolveColorFromStop(stop)\n if (!stops.length) {\n // First stop, ensure it's at the start.\n stops.push({\n offset: 0,\n color,\n })\n\n if (typeof stop.length === 'undefined') continue\n if (stop.length.value === '0') continue\n }\n\n // All offsets are relative values (0-1) in SVG.\n const offset =\n typeof stop.length === 'undefined'\n ? undefined\n : stop.length.type === '%'\n ? stop.length.value / 100\n : stop.length.value / totalLength\n\n stops.push({\n offset,\n color,\n })\n }\n if (!stops.length) {\n stops.push({\n offset: 0,\n color: 'transparent',\n })\n }\n // Last stop, ensure it's at the end.\n const lastStop = stops[stops.length - 1]\n if (lastStop.offset !== 1) {\n if (typeof lastStop.offset === 'undefined') {\n lastStop.offset = 1\n } else {\n stops.push({\n offset: 1,\n color: lastStop.color,\n })\n }\n }\n\n let previousStop = 0\n let nextStop = 1\n // Evenly distribute the missing stop offsets.\n for (let i = 0; i < stops.length; i++) {\n if (typeof stops[i].offset === 'undefined') {\n // Find the next stop that has an offset.\n if (nextStop < i) nextStop = i\n while (typeof stops[nextStop].offset === 'undefined') nextStop++\n\n stops[i].offset =\n ((stops[nextStop].offset - stops[previousStop].offset) /\n (nextStop - previousStop)) *\n (i - previousStop) +\n stops[previousStop].offset\n } else {\n previousStop = i\n }\n }\n\n return [\n `satori_bi${id}`,\n `<linearGradient id=\"satori_bi${id}\" x1=\"${x1}\" y1=\"${y1}\" x2=\"${x2}\" y2=\"${y2}\">${stops\n .map(\n (stop) =>\n `<stop offset=\"${stop.offset * 100}%\" stop-color=\"${stop.color}\"/>`\n )\n .join('')}</linearGradient>`,\n ]\n }\n\n if (image.startsWith('url(')) {\n const src = image.slice(4, -1)\n return [\n `satori_bi${id}`,\n `<pattern id=\"satori_bi${id}\" patternContentUnits=\"objectBoundingBox\" width=\"1\" height=\"1\"><image href=\"${src}\" x=\"0\" y=\"0\" width=\"1\" height=\"1\"/></pattern>`,\n ]\n }\n}\n","// Copyright (c) 2014 Rafael Caricio. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\nvar GradientParser = GradientParser || {}\n\nGradientParser.parse = (function () {\n var tokens = {\n linearGradient: /^(\\-(webkit|o|ms|moz)\\-)?(linear\\-gradient)/i,\n repeatingLinearGradient:\n /^(\\-(webkit|o|ms|moz)\\-)?(repeating\\-linear\\-gradient)/i,\n radialGradient: /^(\\-(webkit|o|ms|moz)\\-)?(radial\\-gradient)/i,\n repeatingRadialGradient:\n /^(\\-(webkit|o|ms|moz)\\-)?(repeating\\-radial\\-gradient)/i,\n sideOrCorner:\n /^to (left (top|bottom)|right (top|bottom)|top (left|right)|bottom (left|right)|left|right|top|bottom)/i,\n extentKeywords:\n /^(closest\\-side|closest\\-corner|farthest\\-side|farthest\\-corner|contain|cover)/,\n positionKeywords: /^(left|center|right|top|bottom)/i,\n pixelValue: /^(-?(([0-9]*\\.[0-9]+)|([0-9]+\\.?)))px/,\n percentageValue: /^(-?(([0-9]*\\.[0-9]+)|([0-9]+\\.?)))\\%/,\n emValue: /^(-?(([0-9]*\\.[0-9]+)|([0-9]+\\.?)))em/,\n angleValue: /^(-?(([0-9]*\\.[0-9]+)|([0-9]+\\.?)))deg/,\n startCall: /^\\(/,\n endCall: /^\\)/,\n comma: /^,/,\n hexColor: /^\\#([0-9a-fA-F]+)/,\n literalColor: /^([a-zA-Z]+)/,\n rgbColor: /^rgb/i,\n rgbaColor: /^rgba/i,\n number: /^(([0-9]*\\.[0-9]+)|([0-9]+\\.?))/,\n }\n\n var input = ''\n\n function error(msg) {\n var err = new Error(input + ': ' + msg)\n err.source = input\n throw err\n }\n\n function getAST() {\n var ast = matchListDefinitions()\n\n if (input.length > 0) {\n error('Invalid input not EOF')\n }\n\n return ast\n }\n\n function matchListDefinitions() {\n return matchListing(matchDefinition)\n }\n\n function matchDefinition() {\n return (\n matchGradient(\n 'linear-gradient',\n tokens.linearGradient,\n matchLinearOrientation\n ) ||\n matchGradient(\n 'repeating-linear-gradient',\n tokens.repeatingLinearGradient,\n matchLinearOrientation\n ) ||\n matchGradient(\n 'radial-gradient',\n tokens.radialGradient,\n matchListRadialOrientations\n ) ||\n matchGradient(\n 'repeating-radial-gradient',\n tokens.repeatingRadialGradient,\n matchListRadialOrientations\n )\n )\n }\n\n function matchGradient(gradientType, pattern, orientationMatcher) {\n return matchCall(pattern, function (captures) {\n var orientation = orientationMatcher()\n if (orientation) {\n if (!scan(tokens.comma)) {\n error('Missing comma before color stops')\n }\n }\n\n return {\n type: gradientType,\n orientation: orientation,\n colorStops: matchListing(matchColorStop),\n }\n })\n }\n\n function matchCall(pattern, callback) {\n var captures = scan(pattern)\n\n if (captures) {\n if (!scan(tokens.startCall)) {\n error('Missing (')\n }\n\n var result = callback(captures)\n\n if (!scan(tokens.endCall)) {\n error('Missing )')\n }\n\n return result\n }\n }\n\n function matchLinearOrientation() {\n return matchSideOrCorner() || matchAngle()\n }\n\n function matchSideOrCorner() {\n return match('directional', tokens.sideOrCorner, 1)\n }\n\n function matchAngle() {\n return match('angular', tokens.angleValue, 1)\n }\n\n function matchListRadialOrientations() {\n var radialOrientations,\n radialOrientation = matchRadialOrientation(),\n lookaheadCache\n\n if (radialOrientation) {\n radialOrientations = []\n radialOrientations.push(radialOrientation)\n\n lookaheadCache = input\n if (scan(tokens.comma)) {\n radialOrientation = matchRadialOrientation()\n if (radialOrientation) {\n radialOrientations.push(radialOrientation)\n } else {\n input = lookaheadCache\n }\n }\n }\n\n return radialOrientations\n }\n\n function matchRadialOrientation() {\n var radialType = matchCircle() || matchEllipse()\n\n if (radialType) {\n radialType.at = matchAtPosition()\n } else {\n var extent = matchExtentKeyword()\n if (extent) {\n radialType = extent\n var positionAt = matchAtPosition()\n if (positionAt) {\n radialType.at = positionAt\n }\n } else {\n var defaultPosition = matchPositioning()\n if (defaultPosition) {\n radialType = {\n type: 'default-radial',\n at: defaultPosition,\n }\n }\n }\n }\n\n return radialType\n }\n\n function matchCircle() {\n var circle = match('shape', /^(circle)/i, 0)\n\n if (circle) {\n circle.style = matchLength() || matchExtentKeyword()\n }\n\n return circle\n }\n\n function matchEllipse() {\n var ellipse = match('shape', /^(ellipse)/i, 0)\n\n if (ellipse) {\n ellipse.style = matchDistance() || matchExtentKeyword()\n }\n\n return ellipse\n }\n\n function matchExtentKeyword() {\n return match('extent-keyword', tokens.extentKeywords, 1)\n }\n\n function matchAtPosition() {\n if (match('position', /^at/, 0)) {\n var positioning = matchPositioning()\n\n if (!positioning) {\n error('Missing positioning value')\n }\n\n return positioning\n }\n }\n\n function matchPositioning() {\n var location = matchCoordinates()\n\n if (location.x || location.y) {\n return {\n type: 'position',\n value: location,\n }\n }\n }\n\n function matchCoordinates() {\n return {\n x: matchDistance(),\n y: matchDistance(),\n }\n }\n\n function matchListing(matcher) {\n var captures = matcher(),\n result = []\n\n if (captures) {\n result.push(captures)\n while (scan(tokens.comma)) {\n captures = matcher()\n if (captures) {\n result.push(captures)\n } else {\n error('One extra comma')\n }\n }\n }\n\n return result\n }\n\n function matchColorStop() {\n var color = matchColor()\n\n if (!color) {\n error('Expected color definition')\n }\n\n color.length = matchDistance()\n return color\n }\n\n function matchColor() {\n return (\n matchHexColor() ||\n matchRGBAColor() ||\n matchRGBColor() ||\n matchLiteralColor()\n )\n }\n\n function matchLiteralColor() {\n return match('literal', tokens.literalColor, 0)\n }\n\n function matchHexColor() {\n return match('hex', tokens.hexColor, 1)\n }\n\n function matchRGBColor() {\n return matchCall(tokens.rgbColor, function () {\n return {\n type: 'rgb',\n value: matchListing(matchNumber),\n }\n })\n }\n\n function matchRGBAColor() {\n return matchCall(tokens.rgbaColor, function () {\n return {\n type: 'rgba',\n value: matchListing(matchNumber),\n }\n })\n }\n\n function matchNumber() {\n return scan(tokens.number)[1]\n }\n\n function matchDistance() {\n return (\n match('%', tokens.percentageValue, 1) ||\n matchPositionKeyword() ||\n matchLength()\n )\n }\n\n function matchPositionKeyword() {\n return match('position-keyword', tokens.positionKeywords, 1)\n }\n\n function matchLength() {\n return match('px', tokens.pixelValue, 1) || match('em', tokens.emValue, 1)\n }\n\n function match(type, pattern, captureIndex) {\n var captures = scan(pattern)\n if (captures) {\n return {\n type: type,\n value: captures[captureIndex],\n }\n }\n }\n\n function scan(regexp) {\n var captures, blankCaptures\n\n blankCaptures = /^[\\n\\r\\t\\s]+/.exec(input)\n if (blankCaptures) {\n consume(blankCaptures[0].length)\n }\n\n captures = regexp.exec(input)\n if (captures) {\n consume(captures[0].length)\n }\n\n return captures\n }\n\n function consume(size) {\n input = input.substr(size)\n }\n\n return function (code) {\n input = code.toString()\n return getAST()\n }\n})()\n\nexport default GradientParser\n","/**\n * CSS border radius to SVG path.\n */\n\nfunction resolveSize(a: number, b: number, limit: number) {\n if (limit < a + b) {\n if (limit / 2 < a && limit / 2 < b) {\n a = b = limit / 2\n } else if (limit / 2 < a) {\n a = limit - b\n } else if (limit / 2 < b) {\n b = limit - a\n }\n }\n return [a, b]\n}\n\nexport default function radius(\n {\n left,\n top,\n width,\n height,\n }: {\n left: number\n top: number\n width: number\n height: number\n },\n style: Record<string, number>\n) {\n let {\n borderTopLeftRadius,\n borderTopRightRadius,\n borderBottomLeftRadius,\n borderBottomRightRadius,\n } = style\n\n borderTopLeftRadius = Math.min(borderTopLeftRadius || 0, width, height)\n borderTopRightRadius = Math.min(borderTopRightRadius || 0, width, height)\n borderBottomLeftRadius = Math.min(borderBottomLeftRadius || 0, width, height)\n borderBottomRightRadius = Math.min(\n borderBottomRightRadius || 0,\n width,\n height\n )\n\n if (\n !borderTopLeftRadius &&\n !borderTopRightRadius &&\n !borderBottomLeftRadius &&\n !borderBottomRightRadius\n ) {\n return ''\n }\n\n // Limit the radius size.\n ;[borderTopLeftRadius, borderTopRightRadius] = resolveSize(\n borderTopLeftRadius,\n borderTopRightRadius,\n width\n )\n ;[borderTopLeftRadius, borderBottomLeftRadius] = resolveSize(\n borderTopLeftRadius,\n borderBottomLeftRadius,\n height\n )\n ;[borderTopRightRadius, borderBottomRightRadius] = resolveSize(\n borderTopRightRadius,\n borderBottomRightRadius,\n height\n )\n ;[borderBottomLeftRadius, borderBottomRightRadius] = resolveSize(\n borderBottomLeftRadius,\n borderBottomRightRadius,\n width\n )\n\n // Generate the path (GitHub Copilot wrote these for me).\n return `M${left + borderTopLeftRadius},${top} h${\n width - borderTopLeftRadius - borderTopRightRadius\n } a${borderTopRightRadius},${borderTopRightRadius} 0 0 1 ${borderTopRightRadius},${borderTopRightRadius} v${\n height - borderTopRightRadius - borderBottomRightRadius\n } a${borderBottomRightRadius},${borderBottomRightRadius} 0 0 1 ${-borderBottomRightRadius},${borderBottomRightRadius} h${\n borderBottomRightRadius + borderBottomLeftRadius - width\n } a${borderBottomLeftRadius},${borderBottomLeftRadius} 0 0 1 ${-borderBottomLeftRadius},${-borderBottomLeftRadius} v${\n borderBottomLeftRadius + borderTopLeftRadius - height\n } a${borderTopLeftRadius},${borderTopLeftRadius} 0 0 1 ${borderTopLeftRadius},${-borderTopLeftRadius}`\n}\n","// @TODO: It seems that SVG filters are pretty expensive for resvg, PNG\n// generation time 10x'd when adding this filter (WASM in browser).\n// https://drafts.fxtf.org/filter-effects/#feGaussianBlurElement\n\nexport default function shadow(\n { id, width, height }: { id: number; width: number; height: number },\n style: Record<string, any>\n) {\n if (\n !style.shadowColor ||\n !style.shadowOffset ||\n typeof style.shadowRadius === 'undefined'\n ) {\n return ''\n }\n\n const left = Math.min(style.shadowOffset.width - style.shadowRadius * 2, 0)\n const right = Math.max(\n style.shadowOffset.width + style.shadowRadius * 2 + width,\n width\n )\n const top = Math.min(style.shadowOffset.height - style.shadowRadius * 2, 0)\n const bottom = Math.max(\n style.shadowOffset.height + style.shadowRadius * 2 + height,\n height\n )\n\n return `<defs><filter id=\"satori_s-${id}\" x=\"${(left / width) * 100}%\" y=\"${\n (top / height) * 100\n }%\" width=\"${((right - left) / width) * 100}%\" height=\"${\n ((bottom - top) / height) * 100\n }%\"><feDropShadow dx=\"${style.shadowOffset.width}\" dy=\"${\n style.shadowOffset.height\n }\" stdDeviation=\"${style.shadowRadius}\" flood-color=\"${\n style.shadowColor\n }\" flood-opacity=\"1\"/></filter></defs>`\n}\n","import radius from './border-radius'\nimport shadow from './box-shadow'\n\nexport default function image(\n {\n id,\n left,\n top,\n width,\n height,\n src,\n debug,\n }: {\n id: number\n left: number\n top: number\n width: number\n height: number\n src: string\n isInheritingTransform: boolean\n debug?: boolean\n },\n style: Record<string, number | string>\n) {\n if (style.display === 'none') return ''\n\n let clip = ''\n let opacity = 1\n\n const preserveAspectRatio =\n style.objectFit === 'contain'\n ? 'xMidYMid'\n : style.objectFit === 'cover'\n ? 'xMidYMid slice'\n : 'none'\n\n const path = radius(\n { left, top, width, height },\n style as Record<string, number>\n )\n\n if (path) {\n clip = `<clipPath id=\"satori_c-${id}\"><path x=\"${left}\" y=\"${top}\" width=\"${width}\" height=\"${height}\" d=\"${path}\"></path></clipPath>`\n }\n\n if (style.opacity) {\n opacity = +style.opacity\n }\n\n const filter = shadow({ width, height, id }, style)\n\n return `${filter}${\n filter ? `<g filter=\"url(#satori_s-${id})\">` : ''\n }${clip}<image href=\"${src}\" x=\"${left}\" y=\"${top}\" width=\"${width}\" height=\"${height}\" preserveAspectRatio=\"${preserveAspectRatio}\" ${\n clip ? `clip-path=\"url(#satori_c-${id})\"` : ''\n } ${opacity !== 1 ? `opacity=\"${opacity}\"` : ''}></image>${\n filter ? '</g>' : ''\n }`\n}\n","/**\n * This class handles everything related to fonts.\n */\n\nimport opentype from 'opentype.js'\n\ntype Weight = 100 | 200 | 300 | 400 | 500 | 600 | 700 | 800 | 900\ntype WeigthName = 'normal' | 'bold'\ntype Style = 'normal' | 'italic'\n\nexport interface FontOptions {\n data: Buffer | ArrayBuffer\n name: string\n weight?: Weight\n style?: Style\n}\n\nexport default class FontLoader {\n defaultFont: opentype.Font\n fonts = new Map<string, [opentype.Font, Weight?, Style?][]>()\n constructor(fontOptions: FontOptions[]) {\n for (const fontOption of fontOptions) {\n const data = fontOption.data\n const font =\n 'buffer' in data\n ? opentype.parse(\n // Buffer to ArrayBuffer.\n data.buffer.slice(\n data.byteOffset,\n data.byteOffset + data.byteLength\n )\n )\n : opentype.parse(data)\n\n // We use the first font as the default font fallback.\n if (!this.defaultFont) this.defaultFont = font\n\n if (!this.fonts.has(fontOption.name)) {\n this.fonts.set(fontOption.name, [])\n }\n this.fonts\n .get(fontOption.name)\n .push([font, fontOption.weight, fontOption.style])\n }\n }\n\n // Get font by name and weight.\n private get({\n name,\n weight,\n style,\n }: {\n name: string\n weight: Weight | WeigthName\n style: Style\n }) {\n if (!this.fonts.has(name)) {\n return this.defaultFont\n }\n\n if (weight === 'normal') weight = 400\n if (weight === 'bold') weight = 700\n\n // Fallback to the closest weight and style according to the strategy here:\n // https://developer.mozilla.org/en-US/docs/Web/CSS/font-weight#fallback_weights\n const fonts = [...this.fonts.get(name)]\n fonts.sort(([_, weight1, style1], [__, weight2, style2]) => {\n if (weight1 !== weight2) {\n // Put the defined weight first.\n if (!weight1) return 1\n if (!weight2) return -1\n\n // Exact match.\n if (weight1 === weight) return -1\n if (weight2 === weight) return 1\n\n // 400 and 500.\n if (weight === 400 && weight1 === 500) return -1\n if (weight === 500 && weight1 === 400) return -1\n if (weight === 400 && weight2 === 500) return 1\n if (weight === 500 && weight2 === 400) return 1\n\n // Less than 400.\n if (weight < 400) {\n if (weight1 < weight && weight2 < weight) return weight2 - weight1\n if (weight1 < weight) return -1\n if (weight2 < weight) return 1\n return weight1 - weight2\n }\n\n // Greater than 500.\n if (weight < weight1 && weight < weight2) return weight1 - weight2\n if (weight < weight1) return -1\n if (weight < weight2) return 1\n return weight2 - weight1\n }\n\n if (style1 !== style2) {\n // Exact match.\n if (style1 === style) return -1\n if (style2 === style) return 1\n }\n\n return -1\n })\n return fonts[0][0]\n }\n\n public getFont({\n fontFamily,\n fontWeight = 400,\n fontStyle = 'normal',\n }: {\n fontFamily: string\n fontWeight?: Weight | WeigthName\n fontStyle?: Style\n }) {\n return this.get({\n name: fontFamily,\n weight: fontWeight,\n style: fontStyle,\n })\n }\n\n public measure(\n font: opentype.Font,\n content: string,\n {\n fontSize,\n letterSpacing = 0,\n }: {\n fontSize: number\n letterSpacing: number\n }\n ) {\n return {\n width: font.getAdvanceWidth(content, fontSize, {\n letterSpacing: letterSpacing / fontSize,\n }),\n ascent: (font.ascender / font.unitsPerEm) * fontSize,\n descent: -(font.descender / font.unitsPerEm) * fontSize,\n }\n }\n\n public getSVG(\n font: opentype.Font,\n content: string,\n {\n fontSize,\n top,\n left,\n letterSpacing = 0,\n }: {\n fontSize: number\n top: number\n left: number\n letterSpacing: number\n }\n ) {\n // Since we need to pass the baseline position, add the ascender to the top.\n top += (font.ascender / font.unitsPerEm) * fontSize\n\n return font\n .getPath(content, left, top, fontSize, {\n letterSpacing: letterSpacing / fontSize,\n })\n .toPathData(2)\n }\n\n public getAscent(\n font: opentype.Font,\n {\n fontSize,\n }: {\n fontSize: number\n }\n ) {\n return (font.ascender / font.unitsPerEm) * fontSize\n }\n}\n","export default function svg(\n {\n width,\n height,\n content,\n }: {\n width: number\n height: number\n content: string\n },\n style?: Record<string, number | string>\n) {\n return `<svg width=\"${width}\" height=\"${height}\" viewBox=\"0 0 ${width} ${height}\" xmlns=\"http://www.w3.org/2000/svg\">${content}</svg>`\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,2 @@
1
+ var xt=Object.defineProperty,$t=Object.defineProperties;var _t=Object.getOwnPropertyDescriptors;var st=Object.getOwnPropertySymbols;var St=Object.prototype.hasOwnProperty,Rt=Object.prototype.propertyIsEnumerable;var ft=(t,n,e)=>n in t?xt(t,n,{enumerable:!0,configurable:!0,writable:!0,value:e}):t[n]=e,P=(t,n)=>{for(var e in n||(n={}))St.call(n,e)&&ft(t,e,n[e]);if(st)for(var e of st(n))Rt.call(n,e)&&ft(t,e,n[e]);return t},ut=(t,n)=>$t(t,_t(n));var lt;function Tt(t){lt=t}function F(){return lt}function J(t){let n=typeof t;return!(n==="number"||n==="bigint"||n==="string"||n==="boolean")}function ct(t){return/^class\s/.test(Function.prototype.toString.call(t))}function B(t,n){return[t[0]*n[0]+t[2]*n[1],t[1]*n[0]+t[3]*n[1],t[0]*n[2]+t[2]*n[3],t[1]*n[2]+t[3]*n[3],t[0]*n[4]+t[2]*n[5]+t[4],t[1]*n[4]+t[3]*n[5]+t[5]]}function I(t,n,e){let i=n[t];return typeof i=="undefined"?e:i}var mt={p:{display:"block",marginTop:"1em",marginBottom:"1em"},div:{display:"block"},blockquote:{display:"block",marginTop:"1em",marginBottom:"1em",marginLeft:40,marginRight:40},center:{display:"block",textAlign:"center"},hr:{display:"block",marginTop:"0.5em",marginBottom:"0.5em",marginLeft:"auto",marginRight:"auto",borderWidth:1,borderStyle:"inset"},h1:{display:"block",fontSize:"2em",marginTop:"0.67em",marginBottom:"0.67em",marginLeft:0,marginRight:0,fontWeight:"bold"},h2:{display:"block",fontSize:"1.5em",marginTop:"0.83em",marginBottom:"0.83em",marginLeft:0,marginRight:0,fontWeight:"bold"},h3:{display:"block",fontSize:"1.17em",marginTop:"1em",marginBottom:"1em",marginLeft:0,marginRight:0,fontWeight:"bold"},h4:{display:"block",marginTop:"1.33em",marginBottom:"1.33em",marginLeft:0,marginRight:0,fontWeight:"bold"},h5:{display:"block",fontSize:"0.83em",marginTop:"1.67em",marginBottom:"1.67em",marginLeft:0,marginRight:0,fontWeight:"bold"},h6:{display:"block",fontSize:"0.67em",marginTop:"2.33em",marginBottom:"2.33em",marginLeft:0,marginRight:0,fontWeight:"bold"},u:{textDecoration:"underline"},strong:{fontWeight:"bold"},b:{fontWeight:"bold"},i:{fontStyle:"italic"},em:{fontStyle:"italic"},code:{fontFamily:"monospace"},kbd:{fontFamily:"monospace"},pre:{display:"block",fontFamily:"monospace",whiteSpace:"pre",marginTop:"1em",marginBottom:"1em"},mark:{backgroundColor:"yellow",color:"black"},big:{fontSize:"larger"},small:{fontSize:"smaller"},s:{textDecoration:"line-through"}};var Lt=new Set(["color","font","fontFamily","fontSize","fontStyle","fontWeight","lineHeight","textAlign","textTransform","whiteSpace","letterSpacing","transform","wordBreak","opacity"]);function j(t){let n={};for(let e in t)Lt.has(e)&&(n[e]=t[e]);return n}import{getPropertyName as pt,getStylesForProperty as It}from"css-to-react-native";import ht from"parse-css-dimension";import{parseElementStyle as At}from"css-background-parser";var Ft=new Set(["flex","flexGrow","flexShrink","flexBasis","fontWeight","lineHeight","opacity","scale","scaleX","scaleY"]),dt=[1,0,0,1,0,0];function Ct(t,n){return typeof n=="number"?Ft.has(t)?String(n):n+"px":n}function gt(t,n){if(typeof t=="number")return t;try{let e=new ht(t);if(e.type==="length")switch(e.unit){case"em":return e.value*n;case"rem":return e.value*16;default:return e.value}else if(e.type==="angle")switch(e.unit){case"deg":return e.value;case"rad":return e.value*180/Math.PI;default:return e.value}}catch{}}function U(t,n){let e=[];for(let o in t){let r=pt(o);e.push([r,Ct(r,t[o])])}let i=e.reduce((o,r)=>{let s=pt(r[0]),l=r[1];return Object.assign(o,It(s,l,!0))},{});if(i.backgroundImage){let{backgrounds:o}=At(i);i.backgroundImage=o}let a=i.fontSize||n.fontSize;if(typeof a=="string")try{let o=new ht(a);switch(o.unit){case"em":a=o.value*n.fontSize;break;case"rem":a=o.value*16;break}}catch{a=16}i.fontSize=a;for(let o in i){let r=i[o];if(typeof r=="string"){let s=gt(r,a);typeof s!="undefined"&&(i[o]=s),r=i[o]}if(o==="opacity"&&(r=i[o]=r*n.opacity),o==="transform"){let s=[...dt],l=r;for(let f of l){let p=Object.keys(f)[0],d=f[p],m=typeof d=="string"?gt(d,a):d,u=[...dt];switch(p){case"translateX":u[4]=m;break;case"translateY":u[5]=m;break;case"scaleX":u[0]=m;break;case"scaleY":u[3]=m;break;case"rotate":let h=m*Math.PI/180,S=Math.cos(h),R=Math.sin(h);u[0]=S,u[1]=R,u[2]=-R,u[3]=S;break;case"skewX":u[2]=Math.tan(m*Math.PI/180);break;case"skewY":u[1]=Math.tan(m*Math.PI/180);break}s=B(u,s)}i.transform=s}}return i}function K(t,n,e,i,a){let o=F(),r=P(P(P({},e),U(mt[n],e)),U(i,e));if(n==="img"){let s=parseInt(a.width),f=parseInt(a.height)/s;r.width||(r.width=s),r.height||(r.height=f*r.width)}return t.setDisplay(I(r.display,{flex:o.DISPLAY_FLEX,none:o.DISPLAY_NONE},o.DISPLAY_FLEX)),t.setAlignContent(I(r.alignContent,{stretch:o.ALIGN_STRETCH,center:o.ALIGN_CENTER,"flex-start":o.ALIGN_FLEX_START,"flex-end":o.ALIGN_FLEX_END,"space-between":o.ALIGN_SPACE_BETWEEN,"space-around":o.ALIGN_SPACE_AROUND,baseline:o.ALIGN_BASELINE,normal:o.ALIGN_AUTO},o.ALIGN_AUTO)),t.setAlignItems(I(r.alignItems,{stretch:o.ALIGN_STRETCH,center:o.ALIGN_CENTER,"flex-start":o.ALIGN_FLEX_START,"flex-end":o.ALIGN_FLEX_END,baseline:o.ALIGN_BASELINE,normal:o.ALIGN_AUTO},o.ALIGN_FLEX_START)),t.setAlignSelf(I(r.alignSelf,{stretch:o.ALIGN_STRETCH,center:o.ALIGN_CENTER,"flex-start":o.ALIGN_FLEX_START,"flex-end":o.ALIGN_FLEX_END,baseline:o.ALIGN_BASELINE,normal:o.ALIGN_AUTO},o.ALIGN_AUTO)),t.setJustifyContent(I(r.justifyContent,{center:o.JUSTIFY_CENTER,"flex-start":o.JUSTIFY_FLEX_START,"flex-end":o.JUSTIFY_FLEX_END,"space-between":o.JUSTIFY_SPACE_BETWEEN,"space-around":o.JUSTIFY_SPACE_AROUND},o.JUSTIFY_FLEX_START)),t.setFlexDirection(I(r.flexDirection,{row:o.FLEX_DIRECTION_ROW,column:o.FLEX_DIRECTION_COLUMN,"row-reverse":o.FLEX_DIRECTION_ROW_REVERSE,"column-reverse":o.FLEX_DIRECTION_COLUMN_REVERSE},o.FLEX_DIRECTION_ROW)),t.setFlexWrap(I(r.flexWrap,{wrap:o.WRAP_WRAP,nowrap:o.WRAP_NO_WRAP,"wrap-reverse":o.WRAP_WRAP_REVERSE},o.WRAP_WRAP)),typeof r.flexBasis!="undefined"&&t.setFlexBasis(r.flexBasis),t.setFlexGrow(typeof r.flexGrow=="undefined"?0:r.flexGrow),t.setFlexShrink(typeof r.flexShrink=="undefined"?1:r.flexShrink),typeof r.maxHeight!="undefined"&&t.setMaxHeight(r.maxHeight),typeof r.maxWidth!="undefined"&&t.setMaxWidth(r.maxWidth),typeof r.minHeight!="undefined"&&t.setMinHeight(r.minHeight),typeof r.minWidth!="undefined"&&t.setMinWidth(r.minWidth),t.setOverflow(I(r.overflow,{visible:o.OVERFLOW_VISIBLE,hidden:o.OVERFLOW_HIDDEN},o.OVERFLOW_VISIBLE)),t.setMargin(o.EDGE_TOP,r.marginTop||0),t.setMargin(o.EDGE_BOTTOM,r.marginBottom||0),t.setMargin(o.EDGE_LEFT,r.marginLeft||0),t.setMargin(o.EDGE_RIGHT,r.marginRight||0),t.setBorder(o.EDGE_TOP,r.borderWidth||0),t.setBorder(o.EDGE_BOTTOM,r.borderWidth||0),t.setBorder(o.EDGE_LEFT,r.borderWidth||0),t.setBorder(o.EDGE_RIGHT,r.borderWidth||0),t.setPadding(o.EDGE_TOP,r.paddingTop||0),t.setPadding(o.EDGE_BOTTOM,r.paddingBottom||0),t.setPadding(o.EDGE_LEFT,r.paddingLeft||0),t.setPadding(o.EDGE_RIGHT,r.paddingRight||0),t.setPositionType(I(r.position,{absolute:o.POSITION_TYPE_ABSOLUTE,relative:o.POSITION_TYPE_RELATIVE},o.POSITION_TYPE_RELATIVE)),typeof r.top!="undefined"&&t.setPosition(o.EDGE_TOP,r.top),typeof r.bottom!="undefined"&&t.setPosition(o.EDGE_BOTTOM,r.bottom),typeof r.left!="undefined"&&t.setPosition(o.EDGE_LEFT,r.left),typeof r.right!="undefined"&&t.setPosition(o.EDGE_RIGHT,r.right),typeof r.height!="undefined"?t.setHeight(r.height):t.setHeightAuto(),typeof r.width!="undefined"?t.setWidth(r.width):t.setWidthAuto(),[r,j(r)]}import{LineBreaker as Nt}from"css-line-break";function D({left:t,top:n,width:e,height:i},a,o){let r;if(o)r=a;else{let s=t+e/2,l=n+i/2;r=B([1,0,0,1,s,l],B(a,[1,0,0,1,-s,-l])),a.__parent&&(r=B(a.__parent,r)),a.splice(0,6,...r)}return`matrix(${r.map(s=>s.toFixed(2)).join(",")})`}function q({content:t,left:n,top:e,width:i,height:a,isInheritingTransform:o,path:r,debug:s},l){let f="",p=1,d="";return l.transform&&(f=D({left:n,top:e,width:i,height:a},l.transform,o)),l.opacity&&(p=+l.opacity),s&&(d=`<rect x="${n}" y="${e}" width="${i}" height="${r===null?.5:a}" fill="transparent" stroke="#575eff" stroke-width="1" ${f?`transform="${f}"`:""}></rect>`),r===null?`<text x="${n}" y="${e}" width="${i}" height="${a}" fill="${l.color}" font-weight="${l.fontWeight}" font-style="${l.fontStyle}" font-size="${l.fontSize}" font-family="${l.fontFamily}" ${l.letterSpacing?`letter-spacing="${l.letterSpacing}"`:""} ${f?`transform="${f}"`:""} ${p!==1?`opacity="${p}"`:""}>${t}</text>${d}`:`<path fill="${l.color}" ${f?`transform="${f}"`:""} ${p!==1?`opacity="${p}"`:""} d="${r}"></path>${d}`}function*Z(t,n){let e=F(),{parentStyle:i,parent:a,font:o,id:r,isInheritingTransform:s,debug:l,embedFont:f}=n,p=Nt(t,{lineBreak:"strict",wordBreak:I(i.wordBreak,{normal:"normal","break-all":"break-all","break-word":"break-word","keep-all":"keep-all"},"normal")}),d=[];for(let E;!(E=p.next()).done;)d.push(E.value.slice());let m=[];a.setAlignItems(e.ALIGN_BASELINE),i.textAlign==="left"?a.setJustifyContent(e.JUSTIFY_FLEX_START):i.textAlign==="center"?a.setJustifyContent(e.JUSTIFY_CENTER):i.textAlign==="right"?a.setJustifyContent(e.JUSTIFY_FLEX_END):i.textAlign==="justify"&&a.setJustifyContent(e.JUSTIFY_SPACE_BETWEEN);let u=o.getFont(i);for(let E of d){let _=e.Node.create();a.insertChild(_,a.getChildCount());let b=o.measure(u,E,i);_.setWidth(b.width),_.setHeight(b.ascent*1.2),_.setMargin(e.EDGE_BOTTOM,b.descent*1.2),m.push(_)}let[h,S]=yield,R="";for(let E=0;E<m.length;E++){let _=m[E],b=d[E];i.position==="absolute"&&_.calculateLayout();let{left:A,top:C,width:N,height:O}=_.getComputedLayout();A+=h,C+=S;let G=null;f?G=o.getSVG(u,b,ut(P({},i),{top:C,left:A,letterSpacing:i.letterSpacing})):C+=o.getAscent(u,i),R+=q({content:b,id:r,left:A,top:C,width:N,height:O,isInheritingTransform:s,path:G,debug:l},i)}return R}var Q=Q||{};Q.parse=function(){var t={linearGradient:/^(\-(webkit|o|ms|moz)\-)?(linear\-gradient)/i,repeatingLinearGradient:/^(\-(webkit|o|ms|moz)\-)?(repeating\-linear\-gradient)/i,radialGradient:/^(\-(webkit|o|ms|moz)\-)?(radial\-gradient)/i,repeatingRadialGradient:/^(\-(webkit|o|ms|moz)\-)?(repeating\-radial\-gradient)/i,sideOrCorner:/^to (left (top|bottom)|right (top|bottom)|top (left|right)|bottom (left|right)|left|right|top|bottom)/i,extentKeywords:/^(closest\-side|closest\-corner|farthest\-side|farthest\-corner|contain|cover)/,positionKeywords:/^(left|center|right|top|bottom)/i,pixelValue:/^(-?(([0-9]*\.[0-9]+)|([0-9]+\.?)))px/,percentageValue:/^(-?(([0-9]*\.[0-9]+)|([0-9]+\.?)))\%/,emValue:/^(-?(([0-9]*\.[0-9]+)|([0-9]+\.?)))em/,angleValue:/^(-?(([0-9]*\.[0-9]+)|([0-9]+\.?)))deg/,startCall:/^\(/,endCall:/^\)/,comma:/^,/,hexColor:/^\#([0-9a-fA-F]+)/,literalColor:/^([a-zA-Z]+)/,rgbColor:/^rgb/i,rgbaColor:/^rgba/i,number:/^(([0-9]*\.[0-9]+)|([0-9]+\.?))/},n="";function e(c){var g=new Error(n+": "+c);throw g.source=n,g}function i(){var c=a();return n.length>0&&e("Invalid input not EOF"),c}function a(){return b(o)}function o(){return r("linear-gradient",t.linearGradient,l)||r("repeating-linear-gradient",t.repeatingLinearGradient,l)||r("radial-gradient",t.radialGradient,d)||r("repeating-radial-gradient",t.repeatingRadialGradient,d)}function r(c,g,y){return s(g,function(v){var at=y();return at&&(k(t.comma)||e("Missing comma before color stops")),{type:c,orientation:at,colorStops:b(A)}})}function s(c,g){var y=k(c);if(y){k(t.startCall)||e("Missing (");var v=g(y);return k(t.endCall)||e("Missing )"),v}}function l(){return f()||p()}function f(){return L("directional",t.sideOrCorner,1)}function p(){return L("angular",t.angleValue,1)}function d(){var c,g=m(),y;return g&&(c=[],c.push(g),y=n,k(t.comma)&&(g=m(),g?c.push(g):n=y)),c}function m(){var c=u()||h();if(c)c.at=R();else{var g=S();if(g){c=g;var y=R();y&&(c.at=y)}else{var v=E();v&&(c={type:"default-radial",at:v})}}return c}function u(){var c=L("shape",/^(circle)/i,0);return c&&(c.style=ot()||S()),c}function h(){var c=L("shape",/^(ellipse)/i,0);return c&&(c.style=T()||S()),c}function S(){return L("extent-keyword",t.extentKeywords,1)}function R(){if(L("position",/^at/,0)){var c=E();return c||e("Missing positioning value"),c}}function E(){var c=_();if(c.x||c.y)return{type:"position",value:c}}function _(){return{x:T(),y:T()}}function b(c){var g=c(),y=[];if(g)for(y.push(g);k(t.comma);)g=c(),g?y.push(g):e("One extra comma");return y}function A(){var c=C();return c||e("Expected color definition"),c.length=T(),c}function C(){return O()||z()||G()||N()}function N(){return L("literal",t.literalColor,0)}function O(){return L("hex",t.hexColor,1)}function G(){return s(t.rgbColor,function(){return{type:"rgb",value:b(W)}})}function z(){return s(t.rgbaColor,function(){return{type:"rgba",value:b(W)}})}function W(){return k(t.number)[1]}function T(){return L("%",t.percentageValue,1)||w()||ot()}function w(){return L("position-keyword",t.positionKeywords,1)}function ot(){return L("px",t.pixelValue,1)||L("em",t.emValue,1)}function L(c,g,y){var v=k(g);if(v)return{type:c,value:v[y]}}function k(c){var g,y;return y=/^[\n\r\t\s]+/.exec(n),y&&it(y[0].length),g=c.exec(n),g&&it(g[0].length),g}function it(c){n=n.substr(c)}return function(c){return n=c.toString(),i()}}();var bt=Q;function Ot(t){return t.type==="literal"?t.value:t.type==="hex"?`#${t.value}`:t.type==="rgb"?`rgb(${t.value.join(",")})`:t.type==="rgba"?`rgba(${t.value.join(",")})`:"transparent"}function tt({id:t,width:n},{image:e}){if(e.startsWith("linear-gradient(")){let i=bt.parse(e)[0],a,o,r,s;if(i.orientation.type==="directional")[a,o,r,s]={top:[0,1,0,0],bottom:[0,0,0,1],left:[1,0,0,0],right:[0,0,1,0]}[i.orientation.value];else if(i.orientation.type==="angular"){let u=+i.orientation.value/180*Math.PI-Math.PI/2,h=Math.cos(u),S=Math.sin(u);a=0,o=0,r=h,s=S,r<0&&(a-=r,r=0),s<0&&(o-=s,s=0)}let l=n,f=[];for(let u of i.colorStops){let h=Ot(u);if(!f.length&&(f.push({offset:0,color:h}),typeof u.length=="undefined"||u.length.value==="0"))continue;let S=typeof u.length=="undefined"?void 0:u.length.type==="%"?u.length.value/100:u.length.value/l;f.push({offset:S,color:h})}f.length||f.push({offset:0,color:"transparent"});let p=f[f.length-1];p.offset!==1&&(typeof p.offset=="undefined"?p.offset=1:f.push({offset:1,color:p.color}));let d=0,m=1;for(let u=0;u<f.length;u++)if(typeof f[u].offset=="undefined"){for(m<u&&(m=u);typeof f[m].offset=="undefined";)m++;f[u].offset=(f[m].offset-f[d].offset)/(m-d)*(u-d)+f[d].offset}else d=u;return[`satori_bi${t}`,`<linearGradient id="satori_bi${t}" x1="${a}" y1="${o}" x2="${r}" y2="${s}">${f.map(u=>`<stop offset="${u.offset*100}%" stop-color="${u.color}"/>`).join("")}</linearGradient>`]}if(e.startsWith("url(")){let i=e.slice(4,-1);return[`satori_bi${t}`,`<pattern id="satori_bi${t}" patternContentUnits="objectBoundingBox" width="1" height="1"><image href="${i}" x="0" y="0" width="1" height="1"/></pattern>`]}}function H(t,n,e){return e<t+n&&(e/2<t&&e/2<n?t=n=e/2:e/2<t?t=e-n:e/2<n&&(n=e-t)),[t,n]}function M({left:t,top:n,width:e,height:i},a){let{borderTopLeftRadius:o,borderTopRightRadius:r,borderBottomLeftRadius:s,borderBottomRightRadius:l}=a;return o=Math.min(o||0,e,i),r=Math.min(r||0,e,i),s=Math.min(s||0,e,i),l=Math.min(l||0,e,i),!o&&!r&&!s&&!l?"":([o,r]=H(o,r,e),[o,s]=H(o,s,i),[r,l]=H(r,l,i),[s,l]=H(s,l,e),`M${t+o},${n} h${e-o-r} a${r},${r} 0 0 1 ${r},${r} v${i-r-l} a${l},${l} 0 0 1 ${-l},${l} h${l+s-e} a${s},${s} 0 0 1 ${-s},${-s} v${s+o-i} a${o},${o} 0 0 1 ${o},${-o}`)}function Y({id:t,width:n,height:e},i){if(!i.shadowColor||!i.shadowOffset||typeof i.shadowRadius=="undefined")return"";let a=Math.min(i.shadowOffset.width-i.shadowRadius*2,0),o=Math.max(i.shadowOffset.width+i.shadowRadius*2+n,n),r=Math.min(i.shadowOffset.height-i.shadowRadius*2,0),s=Math.max(i.shadowOffset.height+i.shadowRadius*2+e,e);return`<defs><filter id="satori_s-${t}" x="${a/n*100}%" y="${r/e*100}%" width="${(o-a)/n*100}%" height="${(s-r)/e*100}%"><feDropShadow dx="${i.shadowOffset.width}" dy="${i.shadowOffset.height}" stdDeviation="${i.shadowRadius}" flood-color="${i.shadowColor}" flood-opacity="1"/></filter></defs>`}function et({id:t,left:n,top:e,width:i,height:a,isInheritingTransform:o,debug:r},s){if(s.display==="none")return"";let l="rect",f="transparent",p=0,d="",m="",u=[],h=1,S="";if(s.backgroundColor&&u.push(s.backgroundColor),s.borderWidth&&(p=s.borderWidth,f=s.borderColor),s.opacity&&(h=+s.opacity),s.transform&&(d=D({left:n,top:e,width:i,height:a},s.transform,o)),s.backgroundImage){let _=s.backgroundImage.map((b,A)=>tt({id:t+"_"+A,width:i,height:a},b)).filter(Boolean);for(let b of _)m+=b[1],u.push(`url(#${b[0]})`)}let R=M({left:n,top:e,width:i,height:a},s);R&&(l="path");let E=Y({width:i,height:a,id:t},s);return u.length||u.push("transparent"),r&&(S=`<rect x="${n}" y="${e}" width="${i}" height="${a}" fill="transparent" stroke="#ff5757" stroke-width="1" ${d?`transform="${d}"`:""}></rect>`),`${m?`<defs>${m}</defs>`:""}${E?`${E}<g filter="url(#satori_s-${t})">`:""}${h!==1?`<g opacity="${h}">`:""}${u.map((_,b)=>_==="transparent"&&!(b===u.length-1&&p)?"":`<${l} x="${n}" y="${e}" width="${i}" height="${a}" fill="${_}" ${b===u.length-1&&p?`stroke="${f}" stroke-width="${p}"`:""} ${R?`d="${R}"`:""} ${d?`transform="${d}"`:""}></${l}>`).join("")}${h!==1?"</g>":""}${E?"</g>":""}${S}`}function rt({id:t,left:n,top:e,width:i,height:a,src:o,debug:r},s){if(s.display==="none")return"";let l="",f=1,p=s.objectFit==="contain"?"xMidYMid":s.objectFit==="cover"?"xMidYMid slice":"none",d=M({left:n,top:e,width:i,height:a},s);d&&(l=`<clipPath id="satori_c-${t}"><path x="${n}" y="${e}" width="${i}" height="${a}" d="${d}"></path></clipPath>`),s.opacity&&(f=+s.opacity);let m=Y({width:i,height:a,id:t},s);return`${m}${m?`<g filter="url(#satori_s-${t})">`:""}${l}<image href="${o}" x="${n}" y="${e}" width="${i}" height="${a}" preserveAspectRatio="${p}" ${l?`clip-path="url(#satori_c-${t})"`:""} ${f!==1?`opacity="${f}"`:""}></image>${m?"</g>":""}`}function*X(t,n){let e=F(),{id:i,inheritedStyle:a,parent:o,font:r,debug:s,embedFont:l=!0}=n;if(t===null||typeof t=="undefined")return yield,"";if(!J(t)||typeof t.type=="function"){let T;if(!J(t))T=Z(String(t),n);else{if(ct(t.type))throw new Error("Class component is not supported.");T=X(t.type(t.props),n)}T.next();let w=yield;return T.next(w).value}let{type:f,props:p}=t,{style:d,children:m}=p,u=e.Node.create();o.insertChild(u,o.getChildCount());let[h,S]=K(u,f,a,d,p),R=h.transform===a.transform;R||(h.transform.__parent=a.transform);let E=typeof m=="undefined"?[]:[].concat(m),_=[],b=0;for(let T of E){let w=X(T,{id:i*E.length+ ++b,parentStyle:h,inheritedStyle:S,isInheritingTransform:!0,parent:u,font:r,embedFont:l,debug:s});w.next(),_.push(w)}let[A,C]=yield;h.position==="absolute"&&u.calculateLayout();let{left:N,top:O,width:G,height:z}=u.getComputedLayout();N+=A,O+=C;let W="";f==="img"?W=rt({id:i,left:N,top:O,width:G,height:z,src:p.src,isInheritingTransform:R,debug:s},h):W=et({id:i,left:N,top:O,width:G,height:z,isInheritingTransform:R,debug:s},h);for(let T of _)W+=T.next([N,O]).value;return W}import yt from"opentype.js";var V=class{constructor(n){this.fonts=new Map;for(let e of n){let i=e.data,a="buffer"in i?yt.parse(i.buffer.slice(i.byteOffset,i.byteOffset+i.byteLength)):yt.parse(i);this.defaultFont||(this.defaultFont=a),this.fonts.has(e.name)||this.fonts.set(e.name,[]),this.fonts.get(e.name).push([a,e.weight,e.style])}}get({name:n,weight:e,style:i}){if(!this.fonts.has(n))return this.defaultFont;e==="normal"&&(e=400),e==="bold"&&(e=700);let a=[...this.fonts.get(n)];return a.sort(([o,r,s],[l,f,p])=>{if(r!==f)return r?!f||r===e?-1:f===e?1:e===400&&r===500||e===500&&r===400?-1:e===400&&f===500||e===500&&f===400?1:e<400?r<e&&f<e?f-r:r<e?-1:f<e?1:r-f:e<r&&e<f?r-f:e<r?-1:e<f?1:f-r:1;if(s!==p){if(s===i)return-1;if(p===i)return 1}return-1}),a[0][0]}getFont({fontFamily:n,fontWeight:e=400,fontStyle:i="normal"}){return this.get({name:n,weight:e,style:i})}measure(n,e,{fontSize:i,letterSpacing:a=0}){return{width:n.getAdvanceWidth(e,i,{letterSpacing:a/i}),ascent:n.ascender/n.unitsPerEm*i,descent:-(n.descender/n.unitsPerEm)*i}}getSVG(n,e,{fontSize:i,top:a,left:o,letterSpacing:r=0}){return a+=n.ascender/n.unitsPerEm*i,n.getPath(e,o,a,i,{letterSpacing:r/i}).toPathData(2)}getAscent(n,{fontSize:e}){return n.ascender/n.unitsPerEm*e}};function nt({width:t,height:n,content:e},i){return`<svg width="${t}" height="${n}" viewBox="0 0 ${t} ${n}" xmlns="http://www.w3.org/2000/svg">${e}</svg>`}function Et(t,n){let e=F();if(!e)throw new Error("Satori is not initialized.");let i=new V(n.fonts),a=e.Node.create();a.setWidth(n.width),a.setHeight(n.height),a.setFlexDirection(e.FLEX_DIRECTION_ROW),a.setFlexWrap(e.WRAP_WRAP),a.setAlignContent(e.ALIGN_AUTO),a.setAlignItems(e.ALIGN_FLEX_START),a.setJustifyContent(e.JUSTIFY_FLEX_START);let o=X(t,{id:1,parentStyle:{},inheritedStyle:{fontSize:16,fontWeight:"normal",fontFamily:"serif",fontStyle:"normal",lineHeight:1.2,color:"black",opacity:1},parent:a,font:i,embedFont:n.embedFont,debug:n.debug});o.next(),a.calculateLayout(n.width,n.height,e.DIRECTION_LTR);let r=o.next([0,0]).value;return nt({width:n.width,height:n.height,content:r})}export{Et as default,Tt as init};
2
+ //# sourceMappingURL=index.wasm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/yoga.ts","../../src/utils.ts","../../src/handler/presets.ts","../../src/handler/inheritable.ts","../../src/handler/expand.ts","../../src/handler/index.ts","../../src/text.ts","../../src/builder/transform.ts","../../src/builder/text.ts","../../deps/gradient-parser/index.js","../../src/builder/background-image.ts","../../src/builder/border-radius.ts","../../src/builder/box-shadow.ts","../../src/builder/rect.ts","../../src/builder/image.ts","../../src/layout.ts","../../src/font.ts","../../src/builder/svg.ts","../../src/satori.ts"],"sourcesContent":["let Yoga: typeof import('yoga-layout')\n\n// @ts-ignore\nif (WASM) {\n // For WASM build, we don't include the prebuilt version of Yoga but let the\n // user specify the module manually.\n} else {\n Yoga = require('./yoga-prebuilt').default\n}\n\nexport function init(yoga: typeof Yoga) {\n Yoga = yoga\n}\n\nexport default function getYoga(): typeof Yoga {\n return Yoga\n}\n","import type { ReactNode, ReactElement } from 'react'\n\nexport function isReactElement(node: ReactNode): node is ReactElement {\n const type = typeof node\n if (\n type === 'number' ||\n type === 'bigint' ||\n type === 'string' ||\n type === 'boolean'\n ) {\n return false\n }\n return true\n}\n\nexport function isClass(f: Function) {\n return /^class\\s/.test(Function.prototype.toString.call(f))\n}\n\n// Multiplies two 2d transform matrices.\nexport function multiply(m1: number[], m2: number[]) {\n return [\n m1[0] * m2[0] + m1[2] * m2[1],\n m1[1] * m2[0] + m1[3] * m2[1],\n m1[0] * m2[2] + m1[2] * m2[3],\n m1[1] * m2[2] + m1[3] * m2[3],\n m1[0] * m2[4] + m1[2] * m2[5] + m1[4],\n m1[1] * m2[4] + m1[3] * m2[5] + m1[5],\n ]\n}\n\nexport function v(\n field: string | number,\n map: Record<string, any>,\n fallback: any\n) {\n const value = map[field]\n return typeof value === 'undefined' ? fallback : value\n}\n","/**\n * Pre-defined styles for elements. Here we hand pick some from Chromium's\n * default styles:\n * https://chromium.googlesource.com/chromium/blink/+/master/Source/core/css/html.css\n *\n * We try to only include commonly used, styling elements rather than senmantic elements.\n */\n\nexport default {\n // Generic block-level elements\n p: {\n display: 'block',\n marginTop: '1em',\n marginBottom: '1em',\n },\n div: {\n display: 'block',\n },\n blockquote: {\n display: 'block',\n marginTop: '1em',\n marginBottom: '1em',\n marginLeft: 40,\n marginRight: 40,\n },\n center: {\n display: 'block',\n textAlign: 'center',\n },\n hr: {\n display: 'block',\n marginTop: '0.5em',\n marginBottom: '0.5em',\n marginLeft: 'auto',\n marginRight: 'auto',\n borderWidth: 1,\n borderStyle: 'inset',\n },\n // Heading elements\n h1: {\n display: 'block',\n fontSize: '2em',\n marginTop: '0.67em',\n marginBottom: '0.67em',\n marginLeft: 0,\n marginRight: 0,\n fontWeight: 'bold',\n },\n h2: {\n display: 'block',\n fontSize: '1.5em',\n marginTop: '0.83em',\n marginBottom: '0.83em',\n marginLeft: 0,\n marginRight: 0,\n fontWeight: 'bold',\n },\n h3: {\n display: 'block',\n fontSize: '1.17em',\n marginTop: '1em',\n marginBottom: '1em',\n marginLeft: 0,\n marginRight: 0,\n fontWeight: 'bold',\n },\n h4: {\n display: 'block',\n marginTop: '1.33em',\n marginBottom: '1.33em',\n marginLeft: 0,\n marginRight: 0,\n fontWeight: 'bold',\n },\n h5: {\n display: 'block',\n fontSize: '0.83em',\n marginTop: '1.67em',\n marginBottom: '1.67em',\n marginLeft: 0,\n marginRight: 0,\n fontWeight: 'bold',\n },\n h6: {\n display: 'block',\n fontSize: '0.67em',\n marginTop: '2.33em',\n marginBottom: '2.33em',\n marginLeft: 0,\n marginRight: 0,\n fontWeight: 'bold',\n },\n // Tables\n // Lists\n // Form elements\n // Inline elements\n u: {\n textDecoration: 'underline',\n },\n strong: {\n fontWeight: 'bold',\n },\n b: {\n fontWeight: 'bold',\n },\n i: {\n fontStyle: 'italic',\n },\n em: {\n fontStyle: 'italic',\n },\n code: {\n fontFamily: 'monospace',\n },\n kbd: {\n fontFamily: 'monospace',\n },\n pre: {\n display: 'block',\n fontFamily: 'monospace',\n whiteSpace: 'pre',\n marginTop: '1em',\n marginBottom: '1em',\n },\n mark: {\n backgroundColor: 'yellow',\n color: 'black',\n },\n big: {\n fontSize: 'larger',\n },\n small: {\n fontSize: 'smaller',\n },\n s: {\n textDecoration: 'line-through',\n },\n}\n","const list = new Set([\n 'color',\n 'font',\n 'fontFamily',\n 'fontSize',\n 'fontStyle',\n 'fontWeight',\n 'lineHeight',\n 'textAlign',\n 'textTransform',\n 'whiteSpace',\n 'letterSpacing',\n 'transform',\n 'wordBreak',\n\n // Special case: SVG doesn't apply opacity to children elements so we need to\n // make it inheritable here.\n 'opacity',\n])\n\nexport default function inheritable(style: Record<string, any>) {\n const inheritedStyle: Record<string, any> = {}\n for (const prop in style) {\n if (list.has(prop)) {\n inheritedStyle[prop] = style[prop]\n }\n }\n return inheritedStyle\n}\n","/**\n * This module expands the CSS properties to get rid of shorthands, as well as\n * cleaning up some properties.\n */\n\nimport { getPropertyName, getStylesForProperty } from 'css-to-react-native'\nimport CssDimension from 'parse-css-dimension'\nimport { parseElementStyle } from 'css-background-parser'\nimport { multiply } from '../utils'\n\n// https://react-cn.github.io/react/tips/style-props-value-px.html\nconst optOutPx = new Set([\n 'flex',\n 'flexGrow',\n 'flexShrink',\n 'flexBasis',\n 'fontWeight',\n 'lineHeight',\n 'opacity',\n 'scale',\n 'scaleX',\n 'scaleY',\n])\n\nconst baseMatrix = [1, 0, 0, 1, 0, 0]\n\nfunction purify(name: string, value?: string | number) {\n if (typeof value === 'number') {\n if (!optOutPx.has(name)) return value + 'px'\n return String(value)\n }\n // @TODO: For `transform`, we need to convert relative values to absolute\n // values here.\n return value\n}\n\nfunction lengthToNumber(\n length: string | number,\n baseFontSize: number\n): number | undefined {\n if (typeof length === 'number') return length\n\n // Convert em and rem values to number (px), convert rad to deg.\n try {\n const parsed = new CssDimension(length)\n if (parsed.type === 'length') {\n switch (parsed.unit) {\n case 'em':\n return parsed.value * baseFontSize\n case 'rem':\n return parsed.value * 16\n default:\n return parsed.value\n }\n } else if (parsed.type === 'angle') {\n switch (parsed.unit) {\n case 'deg':\n return parsed.value\n case 'rad':\n return (parsed.value * 180) / Math.PI\n default:\n return parsed.value\n }\n }\n } catch (err) {}\n}\n\nexport default function expand(\n style: Record<string, string | number>,\n inheritedStyle: Record<string, string | number>\n): Record<string, string | number> {\n const rules = []\n for (const prop in style) {\n const name = getPropertyName(prop)\n rules.push([name, purify(name, style[prop])])\n }\n const transformedStyle = rules.reduce((accum, rule) => {\n const propertyName = getPropertyName(rule[0])\n const value = rule[1]\n return Object.assign(accum, getStylesForProperty(propertyName, value, true))\n }, {})\n\n // Parse background images.\n if (transformedStyle.backgroundImage) {\n const { backgrounds } = parseElementStyle(transformedStyle)\n transformedStyle.backgroundImage = backgrounds\n }\n\n // Calculate the base font size.\n let baseFontSize: number =\n transformedStyle.fontSize || inheritedStyle.fontSize\n if (typeof baseFontSize === 'string') {\n try {\n const parsed = new CssDimension(baseFontSize)\n switch (parsed.unit) {\n case 'em':\n baseFontSize = parsed.value * (inheritedStyle.fontSize as number)\n break\n case 'rem':\n baseFontSize = parsed.value * 16\n break\n }\n } catch (err) {\n baseFontSize = 16\n }\n }\n transformedStyle.fontSize = baseFontSize\n\n for (const prop in transformedStyle) {\n let value = transformedStyle[prop]\n\n // Convert em and rem values to px (number).\n if (typeof value === 'string') {\n const len = lengthToNumber(value, baseFontSize)\n if (typeof len !== 'undefined') transformedStyle[prop] = len\n value = transformedStyle[prop]\n }\n\n // Inherit the opacity.\n if (prop === 'opacity') {\n value = transformedStyle[prop] =\n value * (inheritedStyle.opacity as number)\n }\n\n // Handle CSS transforms To make it easier, we convert different transform\n // types directly to a matrix and apply it recursively to all its children.\n // @TODO: We need to convert relative values (50%) to absolute values. This\n // is pretty tricky to support as we need an extra pass to handle them after\n // the full layout pass.\n if (prop === 'transform') {\n let matrix = [...baseMatrix]\n const transforms = value as { [type: string]: number | string }[]\n\n // Transforms are applied from right to left.\n for (const transform of transforms) {\n const type = Object.keys(transform)[0]\n const v = transform[type]\n const len = typeof v === 'string' ? lengthToNumber(v, baseFontSize) : v\n\n const transformMatrix = [...baseMatrix]\n switch (type) {\n case 'translateX':\n transformMatrix[4] = len\n break\n case 'translateY':\n transformMatrix[5] = len\n break\n case 'scaleX':\n transformMatrix[0] = len\n break\n case 'scaleY':\n transformMatrix[3] = len\n break\n case 'rotate':\n const rad = (len * Math.PI) / 180\n const c = Math.cos(rad)\n const s = Math.sin(rad)\n transformMatrix[0] = c\n transformMatrix[1] = s\n transformMatrix[2] = -s\n transformMatrix[3] = c\n break\n case 'skewX':\n transformMatrix[2] = Math.tan((len * Math.PI) / 180)\n break\n case 'skewY':\n transformMatrix[1] = Math.tan((len * Math.PI) / 180)\n break\n }\n matrix = multiply(transformMatrix, matrix)\n }\n\n transformedStyle.transform = matrix\n }\n }\n\n return transformedStyle\n}\n","/**\n * Handler to update the Yoga node properties with the given element type and\n * style. Each supported element has its own preset styles, so this function\n * also returns the inherited style for children of the element.\n */\n\nimport type { YogaNode } from 'yoga-layout'\n\nimport getYoga from '../yoga'\nimport presets from './presets'\nimport inheritable from './inheritable'\nimport expand from './expand'\nimport { v } from '../utils'\n\ntype SatoriElement = keyof typeof presets\n\nexport default function handler(\n node: YogaNode,\n type: SatoriElement | string,\n inheritedStyle: Record<string, string | number>,\n definedStyle: Record<string, string | number>,\n props: Record<string, any>\n): [Record<string, string | number>, Record<string, string | number>] {\n const Yoga = getYoga()\n\n // Extend the default style with defined and inherited styles.\n const style = {\n ...inheritedStyle,\n ...expand(presets[type], inheritedStyle),\n ...expand(definedStyle, inheritedStyle),\n }\n\n if (type === 'img') {\n const width = parseInt(props.width)\n const height = parseInt(props.height)\n const r = height / width\n if (!style.width) style.width = width\n if (!style.height) style.height = r * (style.width as number)\n }\n\n // Set properties for Yoga.\n node.setDisplay(\n v(\n style.display,\n {\n flex: Yoga.DISPLAY_FLEX,\n none: Yoga.DISPLAY_NONE,\n },\n Yoga.DISPLAY_FLEX\n )\n )\n\n // if (style.alignContent) {\n node.setAlignContent(\n v(\n style.alignContent,\n {\n stretch: Yoga.ALIGN_STRETCH,\n center: Yoga.ALIGN_CENTER,\n 'flex-start': Yoga.ALIGN_FLEX_START,\n 'flex-end': Yoga.ALIGN_FLEX_END,\n 'space-between': Yoga.ALIGN_SPACE_BETWEEN,\n 'space-around': Yoga.ALIGN_SPACE_AROUND,\n baseline: Yoga.ALIGN_BASELINE,\n normal: Yoga.ALIGN_AUTO,\n },\n Yoga.ALIGN_AUTO\n )\n )\n // }\n\n node.setAlignItems(\n v(\n style.alignItems,\n {\n stretch: Yoga.ALIGN_STRETCH,\n center: Yoga.ALIGN_CENTER,\n 'flex-start': Yoga.ALIGN_FLEX_START,\n 'flex-end': Yoga.ALIGN_FLEX_END,\n baseline: Yoga.ALIGN_BASELINE,\n normal: Yoga.ALIGN_AUTO,\n },\n Yoga.ALIGN_FLEX_START\n )\n )\n node.setAlignSelf(\n v(\n style.alignSelf,\n {\n stretch: Yoga.ALIGN_STRETCH,\n center: Yoga.ALIGN_CENTER,\n 'flex-start': Yoga.ALIGN_FLEX_START,\n 'flex-end': Yoga.ALIGN_FLEX_END,\n baseline: Yoga.ALIGN_BASELINE,\n normal: Yoga.ALIGN_AUTO,\n },\n Yoga.ALIGN_AUTO\n )\n )\n node.setJustifyContent(\n v(\n style.justifyContent,\n {\n center: Yoga.JUSTIFY_CENTER,\n 'flex-start': Yoga.JUSTIFY_FLEX_START,\n 'flex-end': Yoga.JUSTIFY_FLEX_END,\n 'space-between': Yoga.JUSTIFY_SPACE_BETWEEN,\n 'space-around': Yoga.JUSTIFY_SPACE_AROUND,\n },\n Yoga.JUSTIFY_FLEX_START\n )\n )\n // @TODO: node.setAspectRatio\n\n node.setFlexDirection(\n v(\n style.flexDirection,\n {\n row: Yoga.FLEX_DIRECTION_ROW,\n column: Yoga.FLEX_DIRECTION_COLUMN,\n 'row-reverse': Yoga.FLEX_DIRECTION_ROW_REVERSE,\n 'column-reverse': Yoga.FLEX_DIRECTION_COLUMN_REVERSE,\n },\n Yoga.FLEX_DIRECTION_ROW\n )\n )\n node.setFlexWrap(\n v(\n style.flexWrap,\n {\n wrap: Yoga.WRAP_WRAP,\n nowrap: Yoga.WRAP_NO_WRAP,\n 'wrap-reverse': Yoga.WRAP_WRAP_REVERSE,\n },\n Yoga.WRAP_WRAP\n )\n )\n\n // @TODO: node.setFlex\n\n if (typeof style.flexBasis !== 'undefined') {\n // We can't use `auto` here due to this:\n // https://github.com/facebook/yoga/pull/1112\n // @TODO: We need a fork to add this API.\n node.setFlexBasis(style.flexBasis)\n }\n node.setFlexGrow(\n typeof style.flexGrow === 'undefined' ? 0 : (style.flexGrow as number)\n )\n node.setFlexShrink(\n typeof style.flexShrink === 'undefined' ? 1 : (style.flexShrink as number)\n )\n\n if (typeof style.maxHeight !== 'undefined') {\n node.setMaxHeight(style.maxHeight)\n }\n if (typeof style.maxWidth !== 'undefined') {\n node.setMaxWidth(style.maxWidth)\n }\n if (typeof style.minHeight !== 'undefined') {\n node.setMinHeight(style.minHeight)\n }\n if (typeof style.minWidth !== 'undefined') {\n node.setMinWidth(style.minWidth)\n }\n\n node.setOverflow(\n v(\n style.overflow,\n {\n visible: Yoga.OVERFLOW_VISIBLE,\n hidden: Yoga.OVERFLOW_HIDDEN,\n },\n Yoga.OVERFLOW_VISIBLE\n )\n )\n\n node.setMargin(Yoga.EDGE_TOP, (style.marginTop as number) || 0)\n node.setMargin(Yoga.EDGE_BOTTOM, (style.marginBottom as number) || 0)\n node.setMargin(Yoga.EDGE_LEFT, (style.marginLeft as number) || 0)\n node.setMargin(Yoga.EDGE_RIGHT, (style.marginRight as number) || 0)\n\n // @TODO: Add directional border support.\n node.setBorder(Yoga.EDGE_TOP, (style.borderWidth as number) || 0)\n node.setBorder(Yoga.EDGE_BOTTOM, (style.borderWidth as number) || 0)\n node.setBorder(Yoga.EDGE_LEFT, (style.borderWidth as number) || 0)\n node.setBorder(Yoga.EDGE_RIGHT, (style.borderWidth as number) || 0)\n\n node.setPadding(Yoga.EDGE_TOP, style.paddingTop || 0)\n node.setPadding(Yoga.EDGE_BOTTOM, style.paddingBottom || 0)\n node.setPadding(Yoga.EDGE_LEFT, style.paddingLeft || 0)\n node.setPadding(Yoga.EDGE_RIGHT, style.paddingRight || 0)\n\n node.setPositionType(\n v(\n style.position,\n {\n absolute: Yoga.POSITION_TYPE_ABSOLUTE,\n relative: Yoga.POSITION_TYPE_RELATIVE,\n },\n Yoga.POSITION_TYPE_RELATIVE\n )\n )\n\n if (typeof style.top !== 'undefined') {\n node.setPosition(Yoga.EDGE_TOP, style.top)\n }\n if (typeof style.bottom !== 'undefined') {\n node.setPosition(Yoga.EDGE_BOTTOM, style.bottom)\n }\n if (typeof style.left !== 'undefined') {\n node.setPosition(Yoga.EDGE_LEFT, style.left)\n }\n if (typeof style.right !== 'undefined') {\n node.setPosition(Yoga.EDGE_RIGHT, style.right)\n }\n\n if (typeof style.height !== 'undefined') {\n node.setHeight(style.height)\n } else {\n node.setHeightAuto()\n }\n if (typeof style.width !== 'undefined') {\n node.setWidth(style.width)\n } else {\n node.setWidthAuto()\n }\n\n return [style, inheritable(style)]\n}\n","/**\n * This module calculates the layout of a text string. Currently the only\n * supported inline node is text. All other nodes are using block layout.\n */\nimport type { LayoutContext } from './layout'\n\nimport getYoga from './yoga'\nimport { LineBreaker } from 'css-line-break'\nimport text from './builder/text'\nimport { v } from './utils'\n\nexport default function* buildTextNodes(content, context: LayoutContext) {\n const Yoga = getYoga()\n const {\n parentStyle,\n parent,\n font,\n id,\n isInheritingTransform,\n debug,\n embedFont,\n } = context\n\n const breaker = LineBreaker(content, {\n lineBreak: 'strict',\n wordBreak: v(\n parentStyle.wordBreak,\n {\n normal: 'normal',\n 'break-all': 'break-all',\n 'break-word': 'break-word',\n 'keep-all': 'keep-all',\n },\n 'normal'\n ),\n })\n\n const words = []\n for (let br; !(br = breaker.next()).done; ) {\n words.push(br.value.slice())\n }\n\n const nodes = []\n\n // @TODO: Find a better way to avoid overriding the parent node.\n parent.setAlignItems(Yoga.ALIGN_BASELINE)\n if (parentStyle.textAlign === 'left') {\n parent.setJustifyContent(Yoga.JUSTIFY_FLEX_START)\n } else if (parentStyle.textAlign === 'center') {\n parent.setJustifyContent(Yoga.JUSTIFY_CENTER)\n } else if (parentStyle.textAlign === 'right') {\n parent.setJustifyContent(Yoga.JUSTIFY_FLEX_END)\n } else if (parentStyle.textAlign === 'justify') {\n parent.setJustifyContent(Yoga.JUSTIFY_SPACE_BETWEEN)\n }\n\n const resolvedFont = font.getFont(parentStyle as any)\n\n for (const word of words) {\n const node = Yoga.Node.create()\n parent.insertChild(node, parent.getChildCount())\n\n const measured = font.measure(resolvedFont, word, parentStyle as any)\n\n node.setWidth(measured.width)\n node.setHeight(measured.ascent * 1.2)\n node.setMargin(Yoga.EDGE_BOTTOM, measured.descent * 1.2)\n\n nodes.push(node)\n }\n\n const [x, y] = yield\n\n let result = ''\n\n for (let i = 0; i < nodes.length; i++) {\n const node = nodes[i]\n const word = words[i]\n if (parentStyle.position === 'absolute') {\n node.calculateLayout()\n }\n\n let { left, top, width, height } = node.getComputedLayout()\n\n // Attach offset to the current node.\n left += x\n top += y\n\n let path: string | null = null\n\n if (embedFont) {\n path = font.getSVG(resolvedFont, word, {\n ...parentStyle,\n top,\n left,\n letterSpacing: parentStyle.letterSpacing,\n } as any)\n } else {\n // We need manually add the font ascender height to ensure it starts\n // at the baseline because <text>'s alignment baseline is set to `hanging`\n // by default and supported to change in SVG 1.1.\n top += font.getAscent(resolvedFont, parentStyle as any)\n }\n\n result += text(\n {\n content: word,\n id,\n left,\n top,\n width,\n height,\n isInheritingTransform,\n path,\n debug,\n },\n parentStyle\n )\n }\n\n return result\n}\n","import { multiply } from '../utils'\n\nexport default function transform(\n {\n left,\n top,\n width,\n height,\n }: { left: number; top: number; width: number; height: number },\n matrix: number[],\n isInheritingTransform: boolean\n) {\n let result: number[]\n\n // Calculate the transform origin.\n if (isInheritingTransform) {\n result = matrix\n } else {\n // If this element is the transform target, we attach the origin coordinates\n // to this matrix.\n const x = left + width / 2\n const y = top + height / 2\n\n // Due to the different coordinate systems, we need to move the shape to the\n // origin first, then apply the matrix, then move it back.\n result = multiply(\n [1, 0, 0, 1, x, y],\n multiply(matrix, [1, 0, 0, 1, -x, -y])\n )\n\n // And we need to apply its parent transform if it has one.\n if ((matrix as any).__parent) {\n result = multiply((matrix as any).__parent, result)\n }\n\n // Mutate self.\n matrix.splice(0, 6, ...result)\n }\n\n return `matrix(${result.map((v) => v.toFixed(2)).join(',')})`\n}\n","import transform from './transform'\n\nexport default function text(\n {\n content,\n left,\n top,\n width,\n height,\n isInheritingTransform,\n path,\n debug,\n }: {\n content: string\n id: number\n left: number\n top: number\n width: number\n height: number\n isInheritingTransform: boolean\n path: string | null\n debug?: boolean\n },\n style: Record<string, number | string>\n) {\n let matrix = ''\n let opacity = 1\n let extra = ''\n\n if (style.transform) {\n matrix = transform(\n { left, top, width, height },\n style.transform as unknown as number[],\n isInheritingTransform\n )\n }\n\n if (style.opacity) {\n opacity = +style.opacity\n }\n\n if (debug) {\n extra = `<rect x=\"${left}\" y=\"${top}\" width=\"${width}\" height=\"${\n path === null ? 0.5 : height\n }\" fill=\"transparent\" stroke=\"#575eff\" stroke-width=\"1\" ${\n matrix ? `transform=\"${matrix}\"` : ''\n }></rect>`\n }\n\n // Do not embed the font, use <text> with the raw content instead.\n if (path === null) {\n return `<text x=\"${left}\" y=\"${top}\" width=\"${width}\" height=\"${height}\" fill=\"${\n style.color\n }\" font-weight=\"${style.fontWeight}\" font-style=\"${\n style.fontStyle\n }\" font-size=\"${style.fontSize}\" font-family=\"${style.fontFamily}\" ${\n style.letterSpacing ? `letter-spacing=\"${style.letterSpacing}\"` : ''\n } ${matrix ? `transform=\"${matrix}\"` : ''} ${\n opacity !== 1 ? `opacity=\"${opacity}\"` : ''\n }>${content}</text>${extra}`\n }\n\n return `<path fill=\"${style.color}\" ${\n matrix ? `transform=\"${matrix}\"` : ''\n } ${opacity !== 1 ? `opacity=\"${opacity}\"` : ''} d=\"${path}\"></path>${extra}`\n}\n","// Copyright (c) 2014 Rafael Caricio. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\nvar GradientParser = GradientParser || {}\n\nGradientParser.parse = (function () {\n var tokens = {\n linearGradient: /^(\\-(webkit|o|ms|moz)\\-)?(linear\\-gradient)/i,\n repeatingLinearGradient:\n /^(\\-(webkit|o|ms|moz)\\-)?(repeating\\-linear\\-gradient)/i,\n radialGradient: /^(\\-(webkit|o|ms|moz)\\-)?(radial\\-gradient)/i,\n repeatingRadialGradient:\n /^(\\-(webkit|o|ms|moz)\\-)?(repeating\\-radial\\-gradient)/i,\n sideOrCorner:\n /^to (left (top|bottom)|right (top|bottom)|top (left|right)|bottom (left|right)|left|right|top|bottom)/i,\n extentKeywords:\n /^(closest\\-side|closest\\-corner|farthest\\-side|farthest\\-corner|contain|cover)/,\n positionKeywords: /^(left|center|right|top|bottom)/i,\n pixelValue: /^(-?(([0-9]*\\.[0-9]+)|([0-9]+\\.?)))px/,\n percentageValue: /^(-?(([0-9]*\\.[0-9]+)|([0-9]+\\.?)))\\%/,\n emValue: /^(-?(([0-9]*\\.[0-9]+)|([0-9]+\\.?)))em/,\n angleValue: /^(-?(([0-9]*\\.[0-9]+)|([0-9]+\\.?)))deg/,\n startCall: /^\\(/,\n endCall: /^\\)/,\n comma: /^,/,\n hexColor: /^\\#([0-9a-fA-F]+)/,\n literalColor: /^([a-zA-Z]+)/,\n rgbColor: /^rgb/i,\n rgbaColor: /^rgba/i,\n number: /^(([0-9]*\\.[0-9]+)|([0-9]+\\.?))/,\n }\n\n var input = ''\n\n function error(msg) {\n var err = new Error(input + ': ' + msg)\n err.source = input\n throw err\n }\n\n function getAST() {\n var ast = matchListDefinitions()\n\n if (input.length > 0) {\n error('Invalid input not EOF')\n }\n\n return ast\n }\n\n function matchListDefinitions() {\n return matchListing(matchDefinition)\n }\n\n function matchDefinition() {\n return (\n matchGradient(\n 'linear-gradient',\n tokens.linearGradient,\n matchLinearOrientation\n ) ||\n matchGradient(\n 'repeating-linear-gradient',\n tokens.repeatingLinearGradient,\n matchLinearOrientation\n ) ||\n matchGradient(\n 'radial-gradient',\n tokens.radialGradient,\n matchListRadialOrientations\n ) ||\n matchGradient(\n 'repeating-radial-gradient',\n tokens.repeatingRadialGradient,\n matchListRadialOrientations\n )\n )\n }\n\n function matchGradient(gradientType, pattern, orientationMatcher) {\n return matchCall(pattern, function (captures) {\n var orientation = orientationMatcher()\n if (orientation) {\n if (!scan(tokens.comma)) {\n error('Missing comma before color stops')\n }\n }\n\n return {\n type: gradientType,\n orientation: orientation,\n colorStops: matchListing(matchColorStop),\n }\n })\n }\n\n function matchCall(pattern, callback) {\n var captures = scan(pattern)\n\n if (captures) {\n if (!scan(tokens.startCall)) {\n error('Missing (')\n }\n\n var result = callback(captures)\n\n if (!scan(tokens.endCall)) {\n error('Missing )')\n }\n\n return result\n }\n }\n\n function matchLinearOrientation() {\n return matchSideOrCorner() || matchAngle()\n }\n\n function matchSideOrCorner() {\n return match('directional', tokens.sideOrCorner, 1)\n }\n\n function matchAngle() {\n return match('angular', tokens.angleValue, 1)\n }\n\n function matchListRadialOrientations() {\n var radialOrientations,\n radialOrientation = matchRadialOrientation(),\n lookaheadCache\n\n if (radialOrientation) {\n radialOrientations = []\n radialOrientations.push(radialOrientation)\n\n lookaheadCache = input\n if (scan(tokens.comma)) {\n radialOrientation = matchRadialOrientation()\n if (radialOrientation) {\n radialOrientations.push(radialOrientation)\n } else {\n input = lookaheadCache\n }\n }\n }\n\n return radialOrientations\n }\n\n function matchRadialOrientation() {\n var radialType = matchCircle() || matchEllipse()\n\n if (radialType) {\n radialType.at = matchAtPosition()\n } else {\n var extent = matchExtentKeyword()\n if (extent) {\n radialType = extent\n var positionAt = matchAtPosition()\n if (positionAt) {\n radialType.at = positionAt\n }\n } else {\n var defaultPosition = matchPositioning()\n if (defaultPosition) {\n radialType = {\n type: 'default-radial',\n at: defaultPosition,\n }\n }\n }\n }\n\n return radialType\n }\n\n function matchCircle() {\n var circle = match('shape', /^(circle)/i, 0)\n\n if (circle) {\n circle.style = matchLength() || matchExtentKeyword()\n }\n\n return circle\n }\n\n function matchEllipse() {\n var ellipse = match('shape', /^(ellipse)/i, 0)\n\n if (ellipse) {\n ellipse.style = matchDistance() || matchExtentKeyword()\n }\n\n return ellipse\n }\n\n function matchExtentKeyword() {\n return match('extent-keyword', tokens.extentKeywords, 1)\n }\n\n function matchAtPosition() {\n if (match('position', /^at/, 0)) {\n var positioning = matchPositioning()\n\n if (!positioning) {\n error('Missing positioning value')\n }\n\n return positioning\n }\n }\n\n function matchPositioning() {\n var location = matchCoordinates()\n\n if (location.x || location.y) {\n return {\n type: 'position',\n value: location,\n }\n }\n }\n\n function matchCoordinates() {\n return {\n x: matchDistance(),\n y: matchDistance(),\n }\n }\n\n function matchListing(matcher) {\n var captures = matcher(),\n result = []\n\n if (captures) {\n result.push(captures)\n while (scan(tokens.comma)) {\n captures = matcher()\n if (captures) {\n result.push(captures)\n } else {\n error('One extra comma')\n }\n }\n }\n\n return result\n }\n\n function matchColorStop() {\n var color = matchColor()\n\n if (!color) {\n error('Expected color definition')\n }\n\n color.length = matchDistance()\n return color\n }\n\n function matchColor() {\n return (\n matchHexColor() ||\n matchRGBAColor() ||\n matchRGBColor() ||\n matchLiteralColor()\n )\n }\n\n function matchLiteralColor() {\n return match('literal', tokens.literalColor, 0)\n }\n\n function matchHexColor() {\n return match('hex', tokens.hexColor, 1)\n }\n\n function matchRGBColor() {\n return matchCall(tokens.rgbColor, function () {\n return {\n type: 'rgb',\n value: matchListing(matchNumber),\n }\n })\n }\n\n function matchRGBAColor() {\n return matchCall(tokens.rgbaColor, function () {\n return {\n type: 'rgba',\n value: matchListing(matchNumber),\n }\n })\n }\n\n function matchNumber() {\n return scan(tokens.number)[1]\n }\n\n function matchDistance() {\n return (\n match('%', tokens.percentageValue, 1) ||\n matchPositionKeyword() ||\n matchLength()\n )\n }\n\n function matchPositionKeyword() {\n return match('position-keyword', tokens.positionKeywords, 1)\n }\n\n function matchLength() {\n return match('px', tokens.pixelValue, 1) || match('em', tokens.emValue, 1)\n }\n\n function match(type, pattern, captureIndex) {\n var captures = scan(pattern)\n if (captures) {\n return {\n type: type,\n value: captures[captureIndex],\n }\n }\n }\n\n function scan(regexp) {\n var captures, blankCaptures\n\n blankCaptures = /^[\\n\\r\\t\\s]+/.exec(input)\n if (blankCaptures) {\n consume(blankCaptures[0].length)\n }\n\n captures = regexp.exec(input)\n if (captures) {\n consume(captures[0].length)\n }\n\n return captures\n }\n\n function consume(size) {\n input = input.substr(size)\n }\n\n return function (code) {\n input = code.toString()\n return getAST()\n }\n})()\n\nexport default GradientParser\n","import gradient from '../../deps/gradient-parser'\n\ninterface Background {\n attachment: string\n color?: string\n clip: string\n image: string\n origin: string\n position: string\n size: string\n repeat: string\n}\n\nfunction resolveColorFromStop(stop) {\n if (stop.type === 'literal') return stop.value\n if (stop.type === 'hex') return `#${stop.value}`\n if (stop.type === 'rgb') return `rgb(${stop.value.join(',')})`\n if (stop.type === 'rgba') return `rgba(${stop.value.join(',')})`\n return 'transparent'\n}\n\nexport default function backgroundImage(\n { id, width }: { id: string; width: number; height: number },\n { image }: Background\n) {\n if (image.startsWith('linear-gradient(')) {\n const parsed = gradient.parse(image)[0]\n\n // Calculate the direction.\n let x1, y1, x2, y2\n if (parsed.orientation.type === 'directional') {\n ;[x1, y1, x2, y2] = {\n top: [0, 1, 0, 0],\n bottom: [0, 0, 0, 1],\n left: [1, 0, 0, 0],\n right: [0, 0, 1, 0],\n }[parsed.orientation.value]\n } else if (parsed.orientation.type === 'angular') {\n const angle = (+parsed.orientation.value / 180) * Math.PI - Math.PI / 2\n const c = Math.cos(angle)\n const s = Math.sin(angle)\n\n x1 = 0\n y1 = 0\n x2 = c\n y2 = s\n if (x2 < 0) {\n x1 -= x2\n x2 = 0\n }\n if (y2 < 0) {\n y1 -= y2\n y2 = 0\n }\n }\n\n // @TODO\n const totalLength = width\n\n // Resolve the color stops based on the spec:\n // https://drafts.csswg.org/css-images/#color-stop-syntax\n const stops = []\n for (const stop of parsed.colorStops) {\n const color = resolveColorFromStop(stop)\n if (!stops.length) {\n // First stop, ensure it's at the start.\n stops.push({\n offset: 0,\n color,\n })\n\n if (typeof stop.length === 'undefined') continue\n if (stop.length.value === '0') continue\n }\n\n // All offsets are relative values (0-1) in SVG.\n const offset =\n typeof stop.length === 'undefined'\n ? undefined\n : stop.length.type === '%'\n ? stop.length.value / 100\n : stop.length.value / totalLength\n\n stops.push({\n offset,\n color,\n })\n }\n if (!stops.length) {\n stops.push({\n offset: 0,\n color: 'transparent',\n })\n }\n // Last stop, ensure it's at the end.\n const lastStop = stops[stops.length - 1]\n if (lastStop.offset !== 1) {\n if (typeof lastStop.offset === 'undefined') {\n lastStop.offset = 1\n } else {\n stops.push({\n offset: 1,\n color: lastStop.color,\n })\n }\n }\n\n let previousStop = 0\n let nextStop = 1\n // Evenly distribute the missing stop offsets.\n for (let i = 0; i < stops.length; i++) {\n if (typeof stops[i].offset === 'undefined') {\n // Find the next stop that has an offset.\n if (nextStop < i) nextStop = i\n while (typeof stops[nextStop].offset === 'undefined') nextStop++\n\n stops[i].offset =\n ((stops[nextStop].offset - stops[previousStop].offset) /\n (nextStop - previousStop)) *\n (i - previousStop) +\n stops[previousStop].offset\n } else {\n previousStop = i\n }\n }\n\n return [\n `satori_bi${id}`,\n `<linearGradient id=\"satori_bi${id}\" x1=\"${x1}\" y1=\"${y1}\" x2=\"${x2}\" y2=\"${y2}\">${stops\n .map(\n (stop) =>\n `<stop offset=\"${stop.offset * 100}%\" stop-color=\"${stop.color}\"/>`\n )\n .join('')}</linearGradient>`,\n ]\n }\n\n if (image.startsWith('url(')) {\n const src = image.slice(4, -1)\n return [\n `satori_bi${id}`,\n `<pattern id=\"satori_bi${id}\" patternContentUnits=\"objectBoundingBox\" width=\"1\" height=\"1\"><image href=\"${src}\" x=\"0\" y=\"0\" width=\"1\" height=\"1\"/></pattern>`,\n ]\n }\n}\n","/**\n * CSS border radius to SVG path.\n */\n\nfunction resolveSize(a: number, b: number, limit: number) {\n if (limit < a + b) {\n if (limit / 2 < a && limit / 2 < b) {\n a = b = limit / 2\n } else if (limit / 2 < a) {\n a = limit - b\n } else if (limit / 2 < b) {\n b = limit - a\n }\n }\n return [a, b]\n}\n\nexport default function radius(\n {\n left,\n top,\n width,\n height,\n }: {\n left: number\n top: number\n width: number\n height: number\n },\n style: Record<string, number>\n) {\n let {\n borderTopLeftRadius,\n borderTopRightRadius,\n borderBottomLeftRadius,\n borderBottomRightRadius,\n } = style\n\n borderTopLeftRadius = Math.min(borderTopLeftRadius || 0, width, height)\n borderTopRightRadius = Math.min(borderTopRightRadius || 0, width, height)\n borderBottomLeftRadius = Math.min(borderBottomLeftRadius || 0, width, height)\n borderBottomRightRadius = Math.min(\n borderBottomRightRadius || 0,\n width,\n height\n )\n\n if (\n !borderTopLeftRadius &&\n !borderTopRightRadius &&\n !borderBottomLeftRadius &&\n !borderBottomRightRadius\n ) {\n return ''\n }\n\n // Limit the radius size.\n ;[borderTopLeftRadius, borderTopRightRadius] = resolveSize(\n borderTopLeftRadius,\n borderTopRightRadius,\n width\n )\n ;[borderTopLeftRadius, borderBottomLeftRadius] = resolveSize(\n borderTopLeftRadius,\n borderBottomLeftRadius,\n height\n )\n ;[borderTopRightRadius, borderBottomRightRadius] = resolveSize(\n borderTopRightRadius,\n borderBottomRightRadius,\n height\n )\n ;[borderBottomLeftRadius, borderBottomRightRadius] = resolveSize(\n borderBottomLeftRadius,\n borderBottomRightRadius,\n width\n )\n\n // Generate the path (GitHub Copilot wrote these for me).\n return `M${left + borderTopLeftRadius},${top} h${\n width - borderTopLeftRadius - borderTopRightRadius\n } a${borderTopRightRadius},${borderTopRightRadius} 0 0 1 ${borderTopRightRadius},${borderTopRightRadius} v${\n height - borderTopRightRadius - borderBottomRightRadius\n } a${borderBottomRightRadius},${borderBottomRightRadius} 0 0 1 ${-borderBottomRightRadius},${borderBottomRightRadius} h${\n borderBottomRightRadius + borderBottomLeftRadius - width\n } a${borderBottomLeftRadius},${borderBottomLeftRadius} 0 0 1 ${-borderBottomLeftRadius},${-borderBottomLeftRadius} v${\n borderBottomLeftRadius + borderTopLeftRadius - height\n } a${borderTopLeftRadius},${borderTopLeftRadius} 0 0 1 ${borderTopLeftRadius},${-borderTopLeftRadius}`\n}\n","// @TODO: It seems that SVG filters are pretty expensive for resvg, PNG\n// generation time 10x'd when adding this filter (WASM in browser).\n// https://drafts.fxtf.org/filter-effects/#feGaussianBlurElement\n\nexport default function shadow(\n { id, width, height }: { id: number; width: number; height: number },\n style: Record<string, any>\n) {\n if (\n !style.shadowColor ||\n !style.shadowOffset ||\n typeof style.shadowRadius === 'undefined'\n ) {\n return ''\n }\n\n const left = Math.min(style.shadowOffset.width - style.shadowRadius * 2, 0)\n const right = Math.max(\n style.shadowOffset.width + style.shadowRadius * 2 + width,\n width\n )\n const top = Math.min(style.shadowOffset.height - style.shadowRadius * 2, 0)\n const bottom = Math.max(\n style.shadowOffset.height + style.shadowRadius * 2 + height,\n height\n )\n\n return `<defs><filter id=\"satori_s-${id}\" x=\"${(left / width) * 100}%\" y=\"${\n (top / height) * 100\n }%\" width=\"${((right - left) / width) * 100}%\" height=\"${\n ((bottom - top) / height) * 100\n }%\"><feDropShadow dx=\"${style.shadowOffset.width}\" dy=\"${\n style.shadowOffset.height\n }\" stdDeviation=\"${style.shadowRadius}\" flood-color=\"${\n style.shadowColor\n }\" flood-opacity=\"1\"/></filter></defs>`\n}\n","import backgroundImage from './background-image'\nimport radius from './border-radius'\nimport shadow from './box-shadow'\nimport transform from './transform'\n\nexport default function rect(\n {\n id,\n left,\n top,\n width,\n height,\n isInheritingTransform,\n debug,\n }: {\n id: number\n left: number\n top: number\n width: number\n height: number\n isInheritingTransform: boolean\n debug?: boolean\n },\n style: Record<string, number | string>\n) {\n if (style.display === 'none') return ''\n\n let type = 'rect'\n let stroke = 'transparent'\n let strokeWidth = 0\n let matrix = ''\n let defs = ''\n let fills: string[] = []\n let opacity = 1\n let extra = ''\n\n if (style.backgroundColor) {\n fills.push(style.backgroundColor as string)\n }\n\n if (style.borderWidth) {\n strokeWidth = style.borderWidth as number\n stroke = style.borderColor as string\n }\n\n if (style.opacity) {\n opacity = +style.opacity\n }\n\n if (style.transform) {\n matrix = transform(\n { left, top, width, height },\n style.transform as unknown as number[],\n isInheritingTransform\n )\n }\n\n if (style.backgroundImage) {\n const backgrounds = (style.backgroundImage as any)\n .map((background, index) =>\n backgroundImage({ id: id + '_' + index, width, height }, background)\n )\n .filter(Boolean)\n for (const background of backgrounds) {\n defs += background[1]\n fills.push(`url(#${background[0]})`)\n }\n }\n\n const path = radius(\n { left, top, width, height },\n style as Record<string, number>\n )\n if (path) {\n type = 'path'\n }\n\n const filter = shadow({ width, height, id }, style)\n\n if (!fills.length) fills.push('transparent')\n\n if (debug) {\n extra = `<rect x=\"${left}\" y=\"${top}\" width=\"${width}\" height=\"${height}\" fill=\"transparent\" stroke=\"#ff5757\" stroke-width=\"1\" ${\n matrix ? `transform=\"${matrix}\"` : ''\n }></rect>`\n }\n\n return `${defs ? `<defs>${defs}</defs>` : ''}${\n filter ? `${filter}<g filter=\"url(#satori_s-${id})\">` : ''\n }${opacity !== 1 ? `<g opacity=\"${opacity}\">` : ''}${\n // Each background generates a new rectangle.\n fills\n .map((fill, i) => {\n if (fill === 'transparent' && !(i === fills.length - 1 && strokeWidth))\n return ''\n\n return `<${type} x=\"${left}\" y=\"${top}\" width=\"${width}\" height=\"${height}\" fill=\"${fill}\" ${\n i === fills.length - 1 && strokeWidth\n ? `stroke=\"${stroke}\" stroke-width=\"${strokeWidth}\"`\n : ''\n } ${path ? `d=\"${path}\"` : ''} ${\n matrix ? `transform=\"${matrix}\"` : ''\n }></${type}>`\n })\n .join('')\n }${opacity !== 1 ? `</g>` : ''}${filter ? '</g>' : ''}${extra}`\n}\n","import radius from './border-radius'\nimport shadow from './box-shadow'\n\nexport default function image(\n {\n id,\n left,\n top,\n width,\n height,\n src,\n debug,\n }: {\n id: number\n left: number\n top: number\n width: number\n height: number\n src: string\n isInheritingTransform: boolean\n debug?: boolean\n },\n style: Record<string, number | string>\n) {\n if (style.display === 'none') return ''\n\n let clip = ''\n let opacity = 1\n\n const preserveAspectRatio =\n style.objectFit === 'contain'\n ? 'xMidYMid'\n : style.objectFit === 'cover'\n ? 'xMidYMid slice'\n : 'none'\n\n const path = radius(\n { left, top, width, height },\n style as Record<string, number>\n )\n\n if (path) {\n clip = `<clipPath id=\"satori_c-${id}\"><path x=\"${left}\" y=\"${top}\" width=\"${width}\" height=\"${height}\" d=\"${path}\"></path></clipPath>`\n }\n\n if (style.opacity) {\n opacity = +style.opacity\n }\n\n const filter = shadow({ width, height, id }, style)\n\n return `${filter}${\n filter ? `<g filter=\"url(#satori_s-${id})\">` : ''\n }${clip}<image href=\"${src}\" x=\"${left}\" y=\"${top}\" width=\"${width}\" height=\"${height}\" preserveAspectRatio=\"${preserveAspectRatio}\" ${\n clip ? `clip-path=\"url(#satori_c-${id})\"` : ''\n } ${opacity !== 1 ? `opacity=\"${opacity}\"` : ''}></image>${\n filter ? '</g>' : ''\n }`\n}\n","/**\n * This module is used to calculate the layout of the current sub-tree.\n */\n\nimport type { ReactNode } from 'react'\nimport type { YogaNode } from 'yoga-layout'\n\nimport getYoga from './yoga'\nimport { isReactElement, isClass } from './utils'\nimport handler from './handler'\nimport FontLoader from './font'\nimport layoutText from './text'\nimport rect from './builder/rect'\nimport image from './builder/image'\n\nexport interface LayoutContext {\n id: number\n parentStyle: Record<string, number | string>\n inheritedStyle: Record<string, number | string>\n isInheritingTransform?: boolean\n parent: YogaNode\n font: FontLoader\n embedFont: boolean\n debug?: boolean\n}\n\nexport default function* layout(\n element: ReactNode,\n context: LayoutContext\n): Generator<undefined, string, [number, number]> {\n const Yoga = getYoga()\n const { id, inheritedStyle, parent, font, debug, embedFont = true } = context\n\n // 1. Pre-process the node.\n if (element === null || typeof element === 'undefined') {\n yield\n return ''\n }\n\n // Not a normal element.\n if (!isReactElement(element) || typeof element.type === 'function') {\n let iter: ReturnType<typeof layout>\n\n if (!isReactElement(element)) {\n // Process as text node.\n iter = layoutText(String(element), context)\n } else {\n if (isClass(element.type as Function)) {\n throw new Error('Class component is not supported.')\n }\n // If it's a custom component, Satori strictly requires it to be pure,\n // stateless, and not relying on any React APIs such as hooks or suspense.\n // So we can safely evaluate it to render. Otherwise, an error will be\n // thrown by React.\n iter = layout((element.type as Function)(element.props), context)\n }\n\n iter.next()\n const offset = yield\n return iter.next(offset).value\n }\n\n // Process as element.\n const { type, props } = element\n const { style, children } = props\n\n const node = Yoga.Node.create()\n parent.insertChild(node, parent.getChildCount())\n\n const [computedStyle, newInheritableStyle] = handler(\n node,\n type,\n inheritedStyle,\n style,\n props\n )\n // If the element is inheriting the parent `transform`, or applying its own.\n // This affects the coordinate system.\n const isInheritingTransform =\n computedStyle.transform === inheritedStyle.transform\n if (!isInheritingTransform) {\n ;(computedStyle.transform as any).__parent = inheritedStyle.transform\n }\n\n // 2. Do layout recursively for its children.\n const normalizedChildren =\n typeof children === 'undefined' ? [] : [].concat(children)\n const iterators: ReturnType<typeof layout>[] = []\n\n let i = 0\n for (const child of normalizedChildren) {\n const iter = layout(child, {\n id: id * normalizedChildren.length + ++i,\n parentStyle: computedStyle,\n inheritedStyle: newInheritableStyle,\n isInheritingTransform: true,\n parent: node,\n font,\n embedFont,\n debug,\n })\n iter.next()\n iterators.push(iter)\n }\n\n // 3. Post-process the node.\n const [x, y] = yield\n\n if (computedStyle.position === 'absolute') {\n node.calculateLayout()\n }\n\n let { left, top, width, height } = node.getComputedLayout()\n\n // Attach offset to the current node.\n left += x\n top += y\n\n let result = ''\n\n if (type === 'img') {\n result = image(\n {\n id,\n left,\n top,\n width,\n height,\n src: props.src,\n isInheritingTransform,\n debug,\n },\n computedStyle\n )\n } else {\n result = rect(\n { id, left, top, width, height, isInheritingTransform, debug },\n computedStyle\n )\n }\n\n for (const iter of iterators) {\n result += iter.next([left, top]).value\n }\n\n return result\n}\n","/**\n * This class handles everything related to fonts.\n */\n\nimport opentype from 'opentype.js'\n\ntype Weight = 100 | 200 | 300 | 400 | 500 | 600 | 700 | 800 | 900\ntype WeigthName = 'normal' | 'bold'\ntype Style = 'normal' | 'italic'\n\nexport interface FontOptions {\n data: Buffer | ArrayBuffer\n name: string\n weight?: Weight\n style?: Style\n}\n\nexport default class FontLoader {\n defaultFont: opentype.Font\n fonts = new Map<string, [opentype.Font, Weight?, Style?][]>()\n constructor(fontOptions: FontOptions[]) {\n for (const fontOption of fontOptions) {\n const data = fontOption.data\n const font =\n 'buffer' in data\n ? opentype.parse(\n // Buffer to ArrayBuffer.\n data.buffer.slice(\n data.byteOffset,\n data.byteOffset + data.byteLength\n )\n )\n : opentype.parse(data)\n\n // We use the first font as the default font fallback.\n if (!this.defaultFont) this.defaultFont = font\n\n if (!this.fonts.has(fontOption.name)) {\n this.fonts.set(fontOption.name, [])\n }\n this.fonts\n .get(fontOption.name)\n .push([font, fontOption.weight, fontOption.style])\n }\n }\n\n // Get font by name and weight.\n private get({\n name,\n weight,\n style,\n }: {\n name: string\n weight: Weight | WeigthName\n style: Style\n }) {\n if (!this.fonts.has(name)) {\n return this.defaultFont\n }\n\n if (weight === 'normal') weight = 400\n if (weight === 'bold') weight = 700\n\n // Fallback to the closest weight and style according to the strategy here:\n // https://developer.mozilla.org/en-US/docs/Web/CSS/font-weight#fallback_weights\n const fonts = [...this.fonts.get(name)]\n fonts.sort(([_, weight1, style1], [__, weight2, style2]) => {\n if (weight1 !== weight2) {\n // Put the defined weight first.\n if (!weight1) return 1\n if (!weight2) return -1\n\n // Exact match.\n if (weight1 === weight) return -1\n if (weight2 === weight) return 1\n\n // 400 and 500.\n if (weight === 400 && weight1 === 500) return -1\n if (weight === 500 && weight1 === 400) return -1\n if (weight === 400 && weight2 === 500) return 1\n if (weight === 500 && weight2 === 400) return 1\n\n // Less than 400.\n if (weight < 400) {\n if (weight1 < weight && weight2 < weight) return weight2 - weight1\n if (weight1 < weight) return -1\n if (weight2 < weight) return 1\n return weight1 - weight2\n }\n\n // Greater than 500.\n if (weight < weight1 && weight < weight2) return weight1 - weight2\n if (weight < weight1) return -1\n if (weight < weight2) return 1\n return weight2 - weight1\n }\n\n if (style1 !== style2) {\n // Exact match.\n if (style1 === style) return -1\n if (style2 === style) return 1\n }\n\n return -1\n })\n return fonts[0][0]\n }\n\n public getFont({\n fontFamily,\n fontWeight = 400,\n fontStyle = 'normal',\n }: {\n fontFamily: string\n fontWeight?: Weight | WeigthName\n fontStyle?: Style\n }) {\n return this.get({\n name: fontFamily,\n weight: fontWeight,\n style: fontStyle,\n })\n }\n\n public measure(\n font: opentype.Font,\n content: string,\n {\n fontSize,\n letterSpacing = 0,\n }: {\n fontSize: number\n letterSpacing: number\n }\n ) {\n return {\n width: font.getAdvanceWidth(content, fontSize, {\n letterSpacing: letterSpacing / fontSize,\n }),\n ascent: (font.ascender / font.unitsPerEm) * fontSize,\n descent: -(font.descender / font.unitsPerEm) * fontSize,\n }\n }\n\n public getSVG(\n font: opentype.Font,\n content: string,\n {\n fontSize,\n top,\n left,\n letterSpacing = 0,\n }: {\n fontSize: number\n top: number\n left: number\n letterSpacing: number\n }\n ) {\n // Since we need to pass the baseline position, add the ascender to the top.\n top += (font.ascender / font.unitsPerEm) * fontSize\n\n return font\n .getPath(content, left, top, fontSize, {\n letterSpacing: letterSpacing / fontSize,\n })\n .toPathData(2)\n }\n\n public getAscent(\n font: opentype.Font,\n {\n fontSize,\n }: {\n fontSize: number\n }\n ) {\n return (font.ascender / font.unitsPerEm) * fontSize\n }\n}\n","export default function svg(\n {\n width,\n height,\n content,\n }: {\n width: number\n height: number\n content: string\n },\n style?: Record<string, number | string>\n) {\n return `<svg width=\"${width}\" height=\"${height}\" viewBox=\"0 0 ${width} ${height}\" xmlns=\"http://www.w3.org/2000/svg\">${content}</svg>`\n}\n","import type { ReactNode } from 'react'\n\nimport getYoga, { init } from './yoga'\nimport layout from './layout'\nimport FontLoader, { FontOptions } from './font'\nimport svg from './builder/svg'\n\nexport interface SatoriOptions {\n width: number\n height: number\n fonts: FontOptions[]\n embedFont?: boolean\n debug?: boolean\n}\n\nexport { init }\n\nexport default function satori(\n element: ReactNode,\n options: SatoriOptions\n): string {\n const Yoga = getYoga()\n if (!Yoga) throw new Error('Satori is not initialized.')\n\n const font = new FontLoader(options.fonts)\n\n const root = Yoga.Node.create()\n root.setWidth(options.width)\n root.setHeight(options.height)\n root.setFlexDirection(Yoga.FLEX_DIRECTION_ROW)\n root.setFlexWrap(Yoga.WRAP_WRAP)\n root.setAlignContent(Yoga.ALIGN_AUTO)\n root.setAlignItems(Yoga.ALIGN_FLEX_START)\n root.setJustifyContent(Yoga.JUSTIFY_FLEX_START)\n\n const handler = layout(element, {\n id: 1,\n parentStyle: {},\n inheritedStyle: {\n fontSize: 16,\n fontWeight: 'normal',\n fontFamily: 'serif',\n fontStyle: 'normal',\n lineHeight: 1.2,\n color: 'black',\n opacity: 1,\n },\n parent: root,\n font,\n embedFont: options.embedFont,\n debug: options.debug,\n })\n\n handler.next()\n root.calculateLayout(options.width, options.height, Yoga.DIRECTION_LTR)\n\n const content = handler.next([0, 0]).value\n return svg({ width: options.width, height: options.height, content })\n}\n"],"mappings":"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","names":[]}
package/dist/index.d.ts CHANGED
@@ -1,6 +1,8 @@
1
1
  import { ReactNode } from 'react';
2
+ import * as yoga_layout from 'yoga-layout';
2
3
 
3
- declare function init(wasm: any): Promise<void>;
4
+ declare let Yoga: typeof yoga_layout;
5
+ declare function init(yoga: typeof Yoga): void;
4
6
 
5
7
  /**
6
8
  * This class handles everything related to fonts.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "satori",
3
- "version": "0.0.8-beta.0",
3
+ "version": "0.0.8",
4
4
  "description": "A lightweight library to convert HTML JSX to SVG string.",
5
5
  "module": "./dist/esm/index.js",
6
6
  "types": "./dist/index.d.ts",
@@ -8,9 +8,16 @@
8
8
  "files": [
9
9
  "dist/**"
10
10
  ],
11
+ "exports": {
12
+ "./package.json": "./package.json",
13
+ ".": "./dist/esm/index.js",
14
+ "./wasm": "./dist/esm/index.wasm.js"
15
+ },
11
16
  "scripts": {
12
17
  "dev": "tsup src/index.ts --watch --format esm --legacy-output --ignore-watch playground",
13
- "build": "tsup src/index.ts --dts --minify --format esm --legacy-output",
18
+ "build": "pnpm run build:asmjs && pnpm run build:wasm",
19
+ "build:asmjs": "tsup",
20
+ "build:wasm": "WASM=1 tsup",
14
21
  "test": "vitest run",
15
22
  "dev:test": "vitest"
16
23
  },
@@ -48,6 +55,6 @@
48
55
  "gradient-parser": "^1.0.2",
49
56
  "opentype.js": "^1.3.4",
50
57
  "parse-css-dimension": "^1.1.0",
51
- "yoga-wasm-web": "^0.0.3"
58
+ "yoga-layout-prebuilt": "^1.10.0"
52
59
  }
53
60
  }