@blocknote/xl-pdf-exporter 0.29.1 → 0.30.1

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.
@@ -1,3 +1,3 @@
1
- "use strict";var H=Object.defineProperty;var T=(e,o,n)=>o in e?H(e,o,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[o]=n;var p=(e,o,n)=>T(e,typeof o!="symbol"?o+"":o,n);Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const r=require("react/jsx-runtime"),t=require("@react-pdf/renderer"),w=require("@blocknote/core"),v=.75,S=t.StyleSheet.create({listItem:{display:"flex",flexDirection:"row",gap:8*v,paddingRight:10},bullet:{}}),P="•",M=r.jsx(t.Svg,{style:{marginTop:2},height:"12",viewBox:"0 -960 960 960",width:"12",fill:"undefined",children:r.jsx(t.Path,{d:"M200-120q-33 0-56.5-23.5T120-200v-560q0-33 23.5-56.5T200-840h560q33 0 56.5 23.5T840-760v560q0 33-23.5 56.5T760-120H200Zm0-80h560v-560H200v560Z"})}),I=r.jsx(t.Svg,{style:{marginTop:2},height:"12",viewBox:"0 -960 960 960",width:"12",fill:"undefined",children:r.jsx(t.Path,{d:"m424-312 282-282-56-56-226 226-114-114-56 56 170 170ZM200-120q-33 0-56.5-23.5T120-200v-560q0-33 23.5-56.5T200-840h560q33 0 56.5 23.5T840-760v560q0 33-23.5 56.5T760-120H200Zm0-80h560v-560H200v560Zm0-560v560-560Z"})}),m=({listMarker:e,children:o,style:n})=>r.jsxs(t.View,{style:[S.listItem,n||{}],children:[r.jsx(t.View,{style:S.bullet,children:typeof e=="string"?r.jsx(t.Text,{children:e}):e}),o]}),b=.75,h=t.StyleSheet.create({tableContainer:{},row:{flexDirection:"row",flexWrap:"wrap",display:"flex"},cell:{paddingHorizontal:5*b,paddingTop:3*b,borderLeft:"1px solid #ddd",borderTop:"1px solid #ddd",wordWrap:"break-word",whiteSpace:"pre-wrap"},headerCell:{fontWeight:"bold"},bottomCell:{borderBottom:"1px solid #ddd"},rightCell:{borderRight:"1px solid #ddd"}}),k=e=>{const o=new Array(e.data.headerRows??0).fill(!0),n=new Array(e.data.headerCols??0).fill(!0);return r.jsx(t.View,{style:h.tableContainer,wrap:!1,children:e.data.rows.map((i,l)=>r.jsx(t.View,{style:[h.row,l===e.data.rows.length-1?h.bottomCell:{}],children:i.cells.map((c,s)=>{const a=w.mapTableCell(c),u=o[l],g=n[s];return r.jsx(t.View,{style:[h.cell,u||g?h.headerCell:{},s===i.cells.length-1?h.rightCell:{},e.data.columnWidths[s]?{width:e.data.columnWidths[s]}:{flex:1},{color:a.props.textColor==="default"?void 0:e.transformer.options.colors[a.props.textColor].text,backgroundColor:a.props.backgroundColor==="default"?void 0:e.transformer.options.colors[a.props.backgroundColor].background,textAlign:a.props.textAlignment}],children:e.transformer.transformInlineContent(a.content)},s)})},l))})},d=.75,j=16,E={paragraph:(e,o)=>r.jsx(t.Text,{children:o.transformInlineContent(e.content)}),bulletListItem:(e,o)=>r.jsx(m,{listMarker:P,children:r.jsx(t.Text,{children:o.transformInlineContent(e.content)})}),numberedListItem:(e,o,n,i)=>r.jsx(m,{listMarker:`${i}.`,children:r.jsx(t.Text,{children:o.transformInlineContent(e.content)})}),checkListItem:(e,o)=>r.jsx(m,{listMarker:e.props.checked?I:M,children:r.jsx(t.Text,{children:o.transformInlineContent(e.content)})}),heading:(e,o)=>{const n=e.props.level===1?2:e.props.level===2?1.5:1.17;return r.jsx(t.Text,{style:{fontSize:n*j*d,fontWeight:700},children:o.transformInlineContent(e.content)})},quote:(e,o)=>r.jsx(t.Text,{style:{borderLeft:"#7D797A",color:"#7D797A",paddingLeft:9.5*d},children:o.transformInlineContent(e.content)}),codeBlock:e=>{var i;const n=(((i=e.content[0])==null?void 0:i.text)||"").split(`
2
- `).map((l,c)=>{var a;const s=((a=l.match(/^\s*/))==null?void 0:a[0].length)||0;return r.jsx(t.Text,{style:{marginLeft:s*9.5*d},children:l.trimStart()||r.jsx(r.Fragment,{children:" "})},`line_${c}`)});return r.jsx(t.View,{wrap:!1,style:{padding:24*d,backgroundColor:"#161616",color:"#ffffff",lineHeight:1.25,fontSize:j*d,fontFamily:"GeistMono"},children:n})},pageBreak:()=>r.jsx(t.View,{break:!0}),audio:(e,o)=>r.jsxs(t.View,{wrap:!1,children:[y(e.props,"Open audio file",r.jsx(t.Svg,{height:14,width:14,viewBox:"0 0 24 24",fill:"currentColor",children:r.jsx(t.Path,{d:"M2 16.0001H5.88889L11.1834 20.3319C11.2727 20.405 11.3846 20.4449 11.5 20.4449C11.7761 20.4449 12 20.2211 12 19.9449V4.05519C12 3.93977 11.9601 3.8279 11.887 3.73857C11.7121 3.52485 11.3971 3.49335 11.1834 3.66821L5.88889 8.00007H2C1.44772 8.00007 1 8.44778 1 9.00007V15.0001C1 15.5524 1.44772 16.0001 2 16.0001ZM23 12C23 15.292 21.5539 18.2463 19.2622 20.2622L17.8445 18.8444C19.7758 17.1937 21 14.7398 21 12C21 9.26016 19.7758 6.80629 17.8445 5.15557L19.2622 3.73779C21.5539 5.75368 23 8.70795 23 12ZM18 12C18 10.0883 17.106 8.38548 15.7133 7.28673L14.2842 8.71584C15.3213 9.43855 16 10.64 16 12C16 13.36 15.3213 14.5614 14.2842 15.2841L15.7133 16.7132C17.106 15.6145 18 13.9116 18 12Z"})})),x(e.props)]}),video:(e,o)=>r.jsxs(t.View,{wrap:!1,children:[y(e.props,"Open video file",r.jsx(t.Svg,{height:14,width:14,viewBox:"0 0 24 24",fill:"currentColor",children:r.jsx(t.Path,{d:"M2 3.9934C2 3.44476 2.45531 3 2.9918 3H21.0082C21.556 3 22 3.44495 22 3.9934V20.0066C22 20.5552 21.5447 21 21.0082 21H2.9918C2.44405 21 2 20.5551 2 20.0066V3.9934ZM8 5V19H16V5H8ZM4 5V7H6V5H4ZM18 5V7H20V5H18ZM4 9V11H6V9H4ZM18 9V11H20V9H18ZM4 13V15H6V13H4ZM18 13V15H20V13H18ZM4 17V19H6V17H4ZM18 17V19H20V17H18Z"})})),x(e.props)]}),file:(e,o)=>r.jsxs(t.View,{wrap:!1,children:[y(e.props,"Open file",r.jsx(t.Svg,{height:16,width:16,viewBox:"0 0 24 24",fill:"currentColor",children:r.jsx(t.Path,{d:"M3 8L9.00319 2H19.9978C20.5513 2 21 2.45531 21 2.9918V21.0082C21 21.556 20.5551 22 20.0066 22H3.9934C3.44476 22 3 21.5501 3 20.9932V8ZM10 4V9H5V20H19V4H10Z"})})),x(e.props)]}),image:async(e,o)=>r.jsxs(t.View,{wrap:!1,children:[r.jsx(t.Image,{src:await o.resolveFile(e.props.url),style:{width:e.props.previewWidth*d}}),x(e.props)]}),table:(e,o)=>r.jsx(k,{data:e.content,transformer:o})};function y(e,o,n,i){return r.jsx(t.Link,{src:e.url,children:r.jsxs(t.View,{style:{display:"flex",gap:8*.75,flexDirection:"row"},children:[n,r.jsx(t.Text,{children:e.name||o})]})})}function x(e,o){if(e.caption)return r.jsx(t.Text,{style:{width:e.previewWidth?e.previewWidth*d:void 0,fontSize:j*.8*d},children:e.caption})}const L={link:(e,o)=>r.jsx(t.Link,{href:e.href,children:e.content.map(n=>o.transformStyledText(n))}),text:(e,o)=>o.transformStyledText(e)},F={bold:e=>e?{fontWeight:"bold"}:{},italic:e=>e?{fontStyle:"italic"}:{},underline:e=>e?{textDecoration:"underline"}:{},strike:e=>e?{textDecoration:"line-through"}:{},backgroundColor:(e,o)=>e?{backgroundColor:o.options.colors[e].background}:{},textColor:(e,o)=>e?{color:o.options.colors[e].text}:{},code:e=>e?{fontFamily:"GeistMono"}:{}},R={blockMapping:E,inlineContentMapping:L,styleMapping:F};async function D(e){return"https://corsproxy.api.blocknotejs.org/corsproxy/?url="+encodeURIComponent(e)}async function _(e,o){return e.default}async function f(e){return _(e)}const V=16,C=.75;class Z extends w.Exporter{constructor(n,i,l){const s={...{emojiSource:{format:"png",url:"https://cdnjs.cloudflare.com/ajax/libs/twemoji/14.0.2/72x72/"},resolveFileUrl:D,colors:w.COLORS_DEFAULT},...l};super(n,i,s);p(this,"fontsRegistered",!1);p(this,"styles",t.StyleSheet.create({page:{paddingTop:35,paddingBottom:65,paddingHorizontal:35,fontFamily:"Inter",fontSize:V*C,lineHeight:1.5},block:{},blockChildren:{},header:{},footer:{position:"absolute"}}));p(this,"options");this.schema=n,this.options=s}transformStyledText(n){const i=this.mapStyles(n.styles),l=Object.assign({},...i);return r.jsx(t.Text,{style:l,children:n.text})}async transformBlocks(n,i=0){const l=[];let c=0;for(const s of n){s.type==="numberedListItem"?c++:c=0;const a=await this.transformBlocks(s.children,i+1),u=await this.mapBlock(s,i,c);if(s.type==="pageBreak"){l.push(u);continue}const g=this.blocknoteDefaultPropsToReactPDFStyle(s.props);l.push(r.jsxs(r.Fragment,{children:[r.jsx(t.View,{style:{paddingVertical:3*C,...this.styles.block,...g},children:u}),a.length>0&&r.jsx(t.View,{style:{marginLeft:V*1.5*C,...this.styles.blockChildren},children:a})]}))}return l}async registerFonts(){if(this.fontsRegistered)return;this.options.emojiSource&&t.Font.registerEmojiSource(this.options.emojiSource);let n=await f(await Promise.resolve().then(()=>require("./Inter_18pt-Regular-CCMUw8TC.cjs")));t.Font.register({family:"Inter",src:n}),n=await f(await Promise.resolve().then(()=>require("./Inter_18pt-Italic-B-14jOMa.cjs"))),t.Font.register({family:"Inter",fontStyle:"italic",src:n}),n=await f(await Promise.resolve().then(()=>require("./Inter_18pt-Bold-yKiK3cOU.cjs"))),t.Font.register({family:"Inter",src:n,fontWeight:"bold"}),n=await f(await Promise.resolve().then(()=>require("./Inter_18pt-BoldItalic-TUYlzxLL.cjs"))),t.Font.register({family:"Inter",fontStyle:"italic",src:n,fontWeight:"bold"}),n=await f(await Promise.resolve().then(()=>require("./GeistMono-Regular--NrcstcO.cjs"))),t.Font.register({family:"GeistMono",src:n}),this.fontsRegistered=!0}async toReactPDFDocument(n,i={}){return await this.registerFonts(),r.jsx(t.Document,{children:r.jsxs(t.Page,{dpi:100,size:"A4",style:this.styles.page,children:[i.header&&r.jsx(t.View,{fixed:!0,style:this.styles.header,children:i.header}),await this.transformBlocks(n),i.footer&&r.jsx(t.View,{fixed:!0,style:[{left:this.styles.page.paddingHorizontal||0,bottom:(this.styles.page.paddingBottom||0)/2,right:this.styles.page.paddingHorizontal||0},this.styles.footer],children:i.footer})]})})}blocknoteDefaultPropsToReactPDFStyle(n){return{textAlign:n.textAlignment,backgroundColor:n.backgroundColor==="default"||!n.backgroundColor?void 0:this.options.colors[n.backgroundColor].background,color:n.textColor==="default"||!n.textColor?void 0:this.options.colors[n.textColor].text,alignItems:n.textAlignment==="right"?"flex-end":n.textAlignment==="center"?"center":void 0}}}exports.PDFExporter=Z;exports.pdfDefaultSchemaMappings=R;
1
+ "use strict";var H=Object.defineProperty;var v=(e,o,n)=>o in e?H(e,o,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[o]=n;var p=(e,o,n)=>v(e,typeof o!="symbol"?o+"":o,n);Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const r=require("react/jsx-runtime"),t=require("@react-pdf/renderer"),w=require("@blocknote/core"),T=.75,S=t.StyleSheet.create({listItem:{display:"flex",flexDirection:"row",gap:8*T,paddingRight:10},bullet:{}}),P="•",M=r.jsx(t.Svg,{style:{marginTop:2},height:"12",viewBox:"0 -960 960 960",width:"12",fill:"undefined",children:r.jsx(t.Path,{d:"M200-120q-33 0-56.5-23.5T120-200v-560q0-33 23.5-56.5T200-840h560q33 0 56.5 23.5T840-760v560q0 33-23.5 56.5T760-120H200Zm0-80h560v-560H200v560Z"})}),I=r.jsx(t.Svg,{style:{marginTop:2},height:"12",viewBox:"0 -960 960 960",width:"12",fill:"undefined",children:r.jsx(t.Path,{d:"m424-312 282-282-56-56-226 226-114-114-56 56 170 170ZM200-120q-33 0-56.5-23.5T120-200v-560q0-33 23.5-56.5T200-840h560q33 0 56.5 23.5T840-760v560q0 33-23.5 56.5T760-120H200Zm0-80h560v-560H200v560Zm0-560v560-560Z"})}),m=({listMarker:e,children:o,style:n})=>r.jsxs(t.View,{style:[S.listItem,n||{}],children:[r.jsx(t.View,{style:S.bullet,children:typeof e=="string"?r.jsx(t.Text,{children:e}):e}),o]}),b=.75,h=t.StyleSheet.create({tableContainer:{},row:{flexDirection:"row",flexWrap:"wrap",display:"flex"},cell:{paddingHorizontal:5*b,paddingTop:3*b,borderLeft:"1px solid #ddd",borderTop:"1px solid #ddd",wordWrap:"break-word",whiteSpace:"pre-wrap"},headerCell:{fontWeight:"bold"},bottomCell:{borderBottom:"1px solid #ddd"},rightCell:{borderRight:"1px solid #ddd"}}),E=e=>{const o=new Array(e.data.headerRows??0).fill(!0),n=new Array(e.data.headerCols??0).fill(!0);return r.jsx(t.View,{style:h.tableContainer,wrap:!1,children:e.data.rows.map((i,l)=>r.jsx(t.View,{style:[h.row,l===e.data.rows.length-1?h.bottomCell:{}],children:i.cells.map((d,s)=>{const a=w.mapTableCell(d),u=o[l],g=n[s];return r.jsx(t.View,{style:[h.cell,u||g?h.headerCell:{},s===i.cells.length-1?h.rightCell:{},e.data.columnWidths[s]?{width:e.data.columnWidths[s]}:{flex:1},{color:a.props.textColor==="default"?void 0:e.transformer.options.colors[a.props.textColor].text,backgroundColor:a.props.backgroundColor==="default"?void 0:e.transformer.options.colors[a.props.backgroundColor].background,textAlign:a.props.textAlignment}],children:e.transformer.transformInlineContent(a.content)},s)})},l))})},c=.75,j=16,L={paragraph:(e,o)=>r.jsx(t.Text,{children:o.transformInlineContent(e.content)}),bulletListItem:(e,o)=>r.jsx(m,{listMarker:P,children:r.jsx(t.Text,{children:o.transformInlineContent(e.content)})}),numberedListItem:(e,o,n,i)=>r.jsx(m,{listMarker:`${i}.`,children:r.jsx(t.Text,{children:o.transformInlineContent(e.content)})}),checkListItem:(e,o)=>r.jsx(m,{listMarker:e.props.checked?I:M,children:r.jsx(t.Text,{children:o.transformInlineContent(e.content)})}),heading:(e,o)=>{const n=e.props.level===1?2:e.props.level===2?1.5:1.17;return r.jsx(t.Text,{style:{fontSize:n*j*c,fontWeight:700},children:o.transformInlineContent(e.content)})},quote:(e,o)=>r.jsx(t.Text,{style:{borderLeft:"#7D797A",color:"#7D797A",paddingLeft:9.5*c},children:o.transformInlineContent(e.content)}),codeBlock:e=>{var i;const n=(((i=e.content[0])==null?void 0:i.text)||"").split(`
2
+ `).map((l,d)=>{var a;const s=((a=l.match(/^\s*/))==null?void 0:a[0].length)||0;return r.jsx(t.Text,{style:{marginLeft:s*9.5*c},children:l.trimStart()||r.jsx(r.Fragment,{children:" "})},`line_${d}`)});return r.jsx(t.View,{wrap:!1,style:{padding:24*c,backgroundColor:"#161616",color:"#ffffff",lineHeight:1.25,fontSize:j*c,fontFamily:"GeistMono"},children:n})},pageBreak:()=>r.jsx(t.View,{break:!0}),audio:(e,o)=>r.jsxs(t.View,{wrap:!1,children:[y(e.props,"Open audio file",r.jsx(t.Svg,{height:14,width:14,viewBox:"0 0 24 24",fill:"currentColor",children:r.jsx(t.Path,{d:"M2 16.0001H5.88889L11.1834 20.3319C11.2727 20.405 11.3846 20.4449 11.5 20.4449C11.7761 20.4449 12 20.2211 12 19.9449V4.05519C12 3.93977 11.9601 3.8279 11.887 3.73857C11.7121 3.52485 11.3971 3.49335 11.1834 3.66821L5.88889 8.00007H2C1.44772 8.00007 1 8.44778 1 9.00007V15.0001C1 15.5524 1.44772 16.0001 2 16.0001ZM23 12C23 15.292 21.5539 18.2463 19.2622 20.2622L17.8445 18.8444C19.7758 17.1937 21 14.7398 21 12C21 9.26016 19.7758 6.80629 17.8445 5.15557L19.2622 3.73779C21.5539 5.75368 23 8.70795 23 12ZM18 12C18 10.0883 17.106 8.38548 15.7133 7.28673L14.2842 8.71584C15.3213 9.43855 16 10.64 16 12C16 13.36 15.3213 14.5614 14.2842 15.2841L15.7133 16.7132C17.106 15.6145 18 13.9116 18 12Z"})})),x(e.props)]}),video:(e,o)=>r.jsxs(t.View,{wrap:!1,children:[y(e.props,"Open video file",r.jsx(t.Svg,{height:14,width:14,viewBox:"0 0 24 24",fill:"currentColor",children:r.jsx(t.Path,{d:"M2 3.9934C2 3.44476 2.45531 3 2.9918 3H21.0082C21.556 3 22 3.44495 22 3.9934V20.0066C22 20.5552 21.5447 21 21.0082 21H2.9918C2.44405 21 2 20.5551 2 20.0066V3.9934ZM8 5V19H16V5H8ZM4 5V7H6V5H4ZM18 5V7H20V5H18ZM4 9V11H6V9H4ZM18 9V11H20V9H18ZM4 13V15H6V13H4ZM18 13V15H20V13H18ZM4 17V19H6V17H4ZM18 17V19H20V17H18Z"})})),x(e.props)]}),file:(e,o)=>r.jsxs(t.View,{wrap:!1,children:[y(e.props,"Open file",r.jsx(t.Svg,{height:16,width:16,viewBox:"0 0 24 24",fill:"currentColor",children:r.jsx(t.Path,{d:"M3 8L9.00319 2H19.9978C20.5513 2 21 2.45531 21 2.9918V21.0082C21 21.556 20.5551 22 20.0066 22H3.9934C3.44476 22 3 21.5501 3 20.9932V8ZM10 4V9H5V20H19V4H10Z"})})),x(e.props)]}),image:async(e,o)=>r.jsxs(t.View,{wrap:!1,children:[r.jsx(t.Image,{src:await o.resolveFile(e.props.url),style:{width:e.props.previewWidth?e.props.previewWidth*c:void 0}}),x(e.props)]}),table:(e,o)=>r.jsx(E,{data:e.content,transformer:o})};function y(e,o,n,i){return r.jsx(t.Link,{src:e.url,children:r.jsxs(t.View,{style:{display:"flex",gap:8*.75,flexDirection:"row"},children:[n,r.jsx(t.Text,{children:e.name||o})]})})}function x(e,o){if(e.caption)return r.jsx(t.Text,{style:{width:e.previewWidth?e.previewWidth*c:void 0,fontSize:j*.8*c},children:e.caption})}const k={link:(e,o)=>r.jsx(t.Link,{href:e.href,children:e.content.map(n=>o.transformStyledText(n))}),text:(e,o)=>o.transformStyledText(e)},F={bold:e=>e?{fontWeight:"bold"}:{},italic:e=>e?{fontStyle:"italic"}:{},underline:e=>e?{textDecoration:"underline"}:{},strike:e=>e?{textDecoration:"line-through"}:{},backgroundColor:(e,o)=>e?{backgroundColor:o.options.colors[e].background}:{},textColor:(e,o)=>e?{color:o.options.colors[e].text}:{},code:e=>e?{fontFamily:"GeistMono"}:{}},R={blockMapping:L,inlineContentMapping:k,styleMapping:F};async function D(e){return"https://corsproxy.api.blocknotejs.org/corsproxy/?url="+encodeURIComponent(e)}async function _(e,o){return e.default}async function f(e){return _(e)}const V=16,C=.75;class Z extends w.Exporter{constructor(n,i,l){const s={...{emojiSource:{format:"png",url:"https://cdnjs.cloudflare.com/ajax/libs/twemoji/14.0.2/72x72/"},resolveFileUrl:D,colors:w.COLORS_DEFAULT},...l};super(n,i,s);p(this,"fontsRegistered",!1);p(this,"styles",t.StyleSheet.create({page:{paddingTop:35,paddingBottom:65,paddingHorizontal:35,fontFamily:"Inter",fontSize:V*C,lineHeight:1.5},block:{},blockChildren:{},header:{},footer:{position:"absolute"}}));p(this,"options");this.schema=n,this.options=s}transformStyledText(n){const i=this.mapStyles(n.styles),l=Object.assign({},...i);return r.jsx(t.Text,{style:l,children:n.text})}async transformBlocks(n,i=0){const l=[];let d=0;for(const s of n){s.type==="numberedListItem"?d++:d=0;const a=await this.transformBlocks(s.children,i+1),u=await this.mapBlock(s,i,d);if(s.type==="pageBreak"){l.push(u);continue}const g=this.blocknoteDefaultPropsToReactPDFStyle(s.props);l.push(r.jsxs(r.Fragment,{children:[r.jsx(t.View,{style:{paddingVertical:3*C,...this.styles.block,...g},children:u}),a.length>0&&r.jsx(t.View,{style:{marginLeft:V*1.5*C,...this.styles.blockChildren},children:a})]}))}return l}async registerFonts(){if(this.fontsRegistered)return;this.options.emojiSource&&t.Font.registerEmojiSource(this.options.emojiSource);let n=await f(await Promise.resolve().then(()=>require("./Inter_18pt-Regular-CCMUw8TC.cjs")));t.Font.register({family:"Inter",src:n}),n=await f(await Promise.resolve().then(()=>require("./Inter_18pt-Italic-B-14jOMa.cjs"))),t.Font.register({family:"Inter",fontStyle:"italic",src:n}),n=await f(await Promise.resolve().then(()=>require("./Inter_18pt-Bold-yKiK3cOU.cjs"))),t.Font.register({family:"Inter",src:n,fontWeight:"bold"}),n=await f(await Promise.resolve().then(()=>require("./Inter_18pt-BoldItalic-TUYlzxLL.cjs"))),t.Font.register({family:"Inter",fontStyle:"italic",src:n,fontWeight:"bold"}),n=await f(await Promise.resolve().then(()=>require("./GeistMono-Regular--NrcstcO.cjs"))),t.Font.register({family:"GeistMono",src:n}),this.fontsRegistered=!0}async toReactPDFDocument(n,i={}){return await this.registerFonts(),r.jsx(t.Document,{children:r.jsxs(t.Page,{dpi:100,size:"A4",style:this.styles.page,children:[i.header&&r.jsx(t.View,{fixed:!0,style:this.styles.header,children:i.header}),await this.transformBlocks(n),i.footer&&r.jsx(t.View,{fixed:!0,style:[{left:this.styles.page.paddingHorizontal||0,bottom:(this.styles.page.paddingBottom||0)/2,right:this.styles.page.paddingHorizontal||0},this.styles.footer],children:i.footer})]})})}blocknoteDefaultPropsToReactPDFStyle(n){return{textAlign:n.textAlignment,backgroundColor:n.backgroundColor==="default"||!n.backgroundColor?void 0:this.options.colors[n.backgroundColor].background,color:n.textColor==="default"||!n.textColor?void 0:this.options.colors[n.textColor].text,alignItems:n.textAlignment==="right"?"flex-end":n.textAlignment==="center"?"center":void 0}}}exports.PDFExporter=Z;exports.pdfDefaultSchemaMappings=R;
3
3
  //# sourceMappingURL=blocknote-xl-pdf-exporter.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"blocknote-xl-pdf-exporter.cjs","sources":["../src/pdf/util/listItem.tsx","../src/pdf/util/table/Table.tsx","../src/pdf/defaultSchema/blocks.tsx","../src/pdf/defaultSchema/inlinecontent.tsx","../src/pdf/defaultSchema/styles.tsx","../src/pdf/defaultSchema/index.ts","../../../shared/api/corsProxy.ts","../../../shared/util/fileUtil.ts","../src/pdf/pdfExporter.tsx"],"sourcesContent":["import { Path, StyleSheet, Svg, Text, View } from \"@react-pdf/renderer\";\nimport { Style } from \"../types.js\";\n\n// https://github.com/diegomura/react-pdf/issues/134\n\nconst PIXELS_PER_POINT = 0.75;\n\nconst styles = StyleSheet.create({\n listItem: {\n display: \"flex\",\n flexDirection: \"row\",\n gap: 8 * PIXELS_PER_POINT,\n paddingRight: 10, // otherwise text overflows, seems like a react-pdf / yoga bug\n },\n bullet: {\n // fontFamily: \"\", // we could add symbol font if we don't want to use inter (default font) here\n },\n});\n\nexport const BULLET_MARKER = \"\\u2022\";\n\n// https://fonts.google.com/icons?selected=Material+Symbols+Outlined:check_box_outline_blank:FILL@0;wght@400;GRAD@0;opsz@24&icon.size=24&icon.color=undefined\nexport const CHECK_MARKER_UNCHECKED = (\n <Svg\n style={{ marginTop: 2 }}\n height=\"12\"\n viewBox=\"0 -960 960 960\"\n width=\"12\"\n fill=\"undefined\">\n <Path d=\"M200-120q-33 0-56.5-23.5T120-200v-560q0-33 23.5-56.5T200-840h560q33 0 56.5 23.5T840-760v560q0 33-23.5 56.5T760-120H200Zm0-80h560v-560H200v560Z\" />\n </Svg>\n);\n\n// https://fonts.google.com/icons?selected=Material+Symbols+Outlined:check_box:FILL@0;wght@400;GRAD@0;opsz@24&icon.size=24&icon.color=undefined\nexport const CHECK_MARKER_CHECKED = (\n <Svg\n style={{ marginTop: 2 }}\n height=\"12\"\n viewBox=\"0 -960 960 960\"\n width=\"12\"\n fill=\"undefined\">\n <Path d=\"m424-312 282-282-56-56-226 226-114-114-56 56 170 170ZM200-120q-33 0-56.5-23.5T120-200v-560q0-33 23.5-56.5T200-840h560q33 0 56.5 23.5T840-760v560q0 33-23.5 56.5T760-120H200Zm0-80h560v-560H200v560Zm0-560v560-560Z\" />\n </Svg>\n);\n\nexport const ListItem = ({\n listMarker,\n children,\n style,\n}: {\n listMarker: string | React.ReactNode;\n children: React.ReactNode;\n style?: Style;\n}) => {\n return (\n <View style={[styles.listItem, style || {}]}>\n <View style={styles.bullet}>\n {/* <Svg width={2} height={2}>\n <Circle cx=\"1\" cy=\"1\" r=\"2\" fill=\"black\" />\n </Svg> */}\n {typeof listMarker === \"string\" ? (\n <Text>{listMarker}</Text>\n ) : (\n listMarker\n )}\n </View>\n {children}\n </View>\n );\n};\n","import {\n Exporter,\n InlineContentSchema,\n mapTableCell,\n StyleSchema,\n TableContent,\n} from \"@blocknote/core\";\nimport { StyleSheet, View } from \"@react-pdf/renderer\";\nconst PIXELS_PER_POINT = 0.75;\n\n// ( impossible?) to make tables with flex that don't have a fixed / 100% width?\n// we'd need to measure the width of every column manually\nconst styles = StyleSheet.create({\n tableContainer: {\n // width: \"100%\",\n },\n row: {\n flexDirection: \"row\",\n flexWrap: \"wrap\",\n // width: \"100%\",\n // justifyContent: \"space-between\",\n display: \"flex\",\n },\n cell: {\n paddingHorizontal: 5 * PIXELS_PER_POINT,\n paddingTop: 3 * PIXELS_PER_POINT,\n // paddingBottom: 1 * PIXELS_PER_POINT, should be 3px but looks odd, better with no padding Bottom\n borderLeft: \"1px solid #ddd\",\n borderTop: \"1px solid #ddd\",\n wordWrap: \"break-word\",\n whiteSpace: \"pre-wrap\",\n },\n headerCell: {\n fontWeight: \"bold\",\n },\n bottomCell: {\n borderBottom: \"1px solid #ddd\",\n },\n rightCell: {\n borderRight: \"1px solid #ddd\",\n },\n});\n\nexport const Table = (props: {\n data: TableContent<InlineContentSchema>;\n transformer: Exporter<\n any,\n InlineContentSchema,\n StyleSchema,\n any,\n any,\n any,\n any\n >;\n}) => {\n // If headerRows is 1, then the first row is a header row\n const headerRows = new Array(props.data.headerRows ?? 0).fill(true);\n // If headerCols is 1, then the first column is a header column\n const headerCols = new Array(props.data.headerCols ?? 0).fill(true);\n\n return (\n <View style={styles.tableContainer} wrap={false}>\n {props.data.rows.map((row, rowIndex) => (\n <View\n style={[\n styles.row,\n rowIndex === props.data.rows.length - 1 ? styles.bottomCell : {},\n ]}\n key={rowIndex}>\n {row.cells.map((c, colIndex) => {\n const cell = mapTableCell(c);\n\n const isHeaderRow = headerRows[rowIndex];\n const isHeaderCol = headerCols[colIndex];\n\n // TODO we need to support for colspan and rowspan, but at the moment are blocked by react-pdf\n return (\n <View\n style={[\n styles.cell,\n isHeaderRow || isHeaderCol ? styles.headerCell : {},\n colIndex === row.cells.length - 1 ? styles.rightCell : {},\n props.data.columnWidths[colIndex]\n ? { width: props.data.columnWidths[colIndex] }\n : { flex: 1 },\n {\n color:\n cell.props.textColor === \"default\"\n ? undefined\n : props.transformer.options.colors[\n cell.props\n .textColor as keyof typeof props.transformer.options.colors\n ].text,\n backgroundColor:\n cell.props.backgroundColor === \"default\"\n ? undefined\n : props.transformer.options.colors[\n cell.props\n .backgroundColor as keyof typeof props.transformer.options.colors\n ].background,\n textAlign: cell.props.textAlignment,\n },\n ]}\n key={colIndex}>\n {props.transformer.transformInlineContent(cell.content)}\n </View>\n );\n })}\n </View>\n ))}\n </View>\n );\n};\n","import {\n BlockMapping,\n DefaultBlockSchema,\n DefaultProps,\n pageBreakSchema,\n StyledText,\n} from \"@blocknote/core\";\nimport { Image, Link, Path, Svg, Text, View } from \"@react-pdf/renderer\";\nimport {\n BULLET_MARKER,\n CHECK_MARKER_CHECKED,\n CHECK_MARKER_UNCHECKED,\n ListItem,\n} from \"../util/listItem.js\";\nimport { Table } from \"../util/table/Table.js\";\n\nconst PIXELS_PER_POINT = 0.75;\nconst FONT_SIZE = 16;\n\nexport const pdfBlockMappingForDefaultSchema: BlockMapping<\n DefaultBlockSchema & typeof pageBreakSchema.blockSchema,\n any,\n any,\n React.ReactElement<Text>,\n React.ReactElement<Text> | React.ReactElement<Link>\n> = {\n paragraph: (block, exporter) => {\n // const style = blocknoteDefaultPropsToReactPDFStyle(block.props);\n return <Text>{exporter.transformInlineContent(block.content)}</Text>;\n },\n bulletListItem: (block, exporter) => {\n // const style = t(block.props);\n return (\n <ListItem listMarker={BULLET_MARKER}>\n <Text>{exporter.transformInlineContent(block.content)}</Text>\n </ListItem>\n );\n },\n numberedListItem: (block, exporter, _nestingLevel, numberedListIndex) => {\n // const style = blocknoteDefaultPropsToReactPDFStyle(block.props);\n // console.log(\"NUMBERED LIST ITEM\", block.props.textAlignment, style);\n return (\n <ListItem listMarker={`${numberedListIndex}.`}>\n <Text>{exporter.transformInlineContent(block.content)}</Text>\n </ListItem>\n );\n },\n // would be nice to have pdf checkboxes:\n // https://github.com/diegomura/react-pdf/issues/2103\n checkListItem: (block, exporter) => {\n return (\n <ListItem\n listMarker={\n block.props.checked ? CHECK_MARKER_CHECKED : CHECK_MARKER_UNCHECKED\n }>\n <Text>{exporter.transformInlineContent(block.content)}</Text>\n </ListItem>\n );\n },\n heading: (block, exporter) => {\n const fontSizeEM =\n block.props.level === 1 ? 2 : block.props.level === 2 ? 1.5 : 1.17;\n return (\n <Text\n style={{\n fontSize: fontSizeEM * FONT_SIZE * PIXELS_PER_POINT,\n fontWeight: 700,\n }}>\n {exporter.transformInlineContent(block.content)}\n </Text>\n );\n },\n quote: (block, exporter) => {\n return (\n <Text\n style={{\n borderLeft: \"#7D797A\",\n color: \"#7D797A\",\n paddingLeft: 9.5 * PIXELS_PER_POINT,\n }}>\n {exporter.transformInlineContent(block.content)}\n </Text>\n );\n },\n codeBlock: (block) => {\n const textContent = (block.content as StyledText<any>[])[0]?.text || \"\";\n const lines = textContent.split(\"\\n\").map((line, index) => {\n const indent = line.match(/^\\s*/)?.[0].length || 0;\n\n return (\n <Text\n key={`line_${index}`}\n style={{\n marginLeft: indent * 9.5 * PIXELS_PER_POINT,\n }}>\n {line.trimStart() || <>&nbsp;</>}\n </Text>\n );\n });\n\n return (\n <View\n wrap={false}\n style={{\n padding: 24 * PIXELS_PER_POINT,\n backgroundColor: \"#161616\",\n color: \"#ffffff\",\n lineHeight: 1.25,\n fontSize: FONT_SIZE * PIXELS_PER_POINT,\n fontFamily: \"GeistMono\",\n }}>\n {lines}\n </View>\n );\n },\n pageBreak: () => {\n return <View break />;\n },\n audio: (block, exporter) => {\n return (\n <View wrap={false}>\n {file(\n block.props,\n \"Open audio file\",\n <Svg height={14} width={14} viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <Path d=\"M2 16.0001H5.88889L11.1834 20.3319C11.2727 20.405 11.3846 20.4449 11.5 20.4449C11.7761 20.4449 12 20.2211 12 19.9449V4.05519C12 3.93977 11.9601 3.8279 11.887 3.73857C11.7121 3.52485 11.3971 3.49335 11.1834 3.66821L5.88889 8.00007H2C1.44772 8.00007 1 8.44778 1 9.00007V15.0001C1 15.5524 1.44772 16.0001 2 16.0001ZM23 12C23 15.292 21.5539 18.2463 19.2622 20.2622L17.8445 18.8444C19.7758 17.1937 21 14.7398 21 12C21 9.26016 19.7758 6.80629 17.8445 5.15557L19.2622 3.73779C21.5539 5.75368 23 8.70795 23 12ZM18 12C18 10.0883 17.106 8.38548 15.7133 7.28673L14.2842 8.71584C15.3213 9.43855 16 10.64 16 12C16 13.36 15.3213 14.5614 14.2842 15.2841L15.7133 16.7132C17.106 15.6145 18 13.9116 18 12Z\"></Path>\n </Svg>,\n exporter\n )}\n {caption(block.props, exporter)}\n </View>\n );\n },\n video: (block, exporter) => {\n return (\n <View wrap={false}>\n {file(\n block.props,\n \"Open video file\",\n <Svg height={14} width={14} viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <Path d=\"M2 3.9934C2 3.44476 2.45531 3 2.9918 3H21.0082C21.556 3 22 3.44495 22 3.9934V20.0066C22 20.5552 21.5447 21 21.0082 21H2.9918C2.44405 21 2 20.5551 2 20.0066V3.9934ZM8 5V19H16V5H8ZM4 5V7H6V5H4ZM18 5V7H20V5H18ZM4 9V11H6V9H4ZM18 9V11H20V9H18ZM4 13V15H6V13H4ZM18 13V15H20V13H18ZM4 17V19H6V17H4ZM18 17V19H20V17H18Z\" />\n </Svg>,\n exporter\n )}\n {caption(block.props, exporter)}\n </View>\n );\n },\n file: (block, exporter) => {\n return (\n <View wrap={false}>\n {file(\n block.props,\n \"Open file\",\n <Svg height={16} width={16} viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <Path d=\"M3 8L9.00319 2H19.9978C20.5513 2 21 2.45531 21 2.9918V21.0082C21 21.556 20.5551 22 20.0066 22H3.9934C3.44476 22 3 21.5501 3 20.9932V8ZM10 4V9H5V20H19V4H10Z\" />\n </Svg>,\n exporter\n )}\n {caption(block.props, exporter)}\n </View>\n );\n },\n image: async (block, t) => {\n return (\n <View wrap={false}>\n <Image\n src={await t.resolveFile(block.props.url)}\n style={{\n width: block.props.previewWidth * PIXELS_PER_POINT,\n }}\n />\n {caption(block.props, t)}\n </View>\n );\n },\n table: (block, t) => {\n return <Table data={block.content} transformer={t} />;\n },\n};\n\nfunction file(\n props: Partial<DefaultProps & { name: string; url: string }>,\n defaultText: string,\n icon: React.ReactElement<Svg>,\n _exporter: any\n) {\n const PIXELS_PER_POINT = 0.75;\n return (\n <Link src={props.url}>\n <View\n style={{\n display: \"flex\",\n gap: 8 * PIXELS_PER_POINT,\n flexDirection: \"row\",\n }}>\n {icon}\n <Text>{props.name || defaultText}</Text>\n </View>\n </Link>\n );\n}\n\nfunction caption(\n props: Partial<DefaultProps & { caption: string; previewWidth: number }>,\n _exporter: any\n) {\n if (!props.caption) {\n return undefined;\n }\n return (\n <Text\n style={{\n width: props.previewWidth\n ? props.previewWidth * PIXELS_PER_POINT\n : undefined,\n fontSize: FONT_SIZE * 0.8 * PIXELS_PER_POINT,\n }}>\n {props.caption}\n </Text>\n );\n}\n","import {\n DefaultInlineContentSchema,\n InlineContentMapping,\n} from \"@blocknote/core\";\nimport { Link, Text } from \"@react-pdf/renderer\";\n\nexport const pdfInlineContentMappingForDefaultSchema: InlineContentMapping<\n DefaultInlineContentSchema,\n any,\n React.ReactElement<Link> | React.ReactElement<Text>,\n React.ReactElement<Text>\n> = {\n link: (ic, exporter) => {\n return (\n <Link href={ic.href}>\n {ic.content.map((content) => exporter.transformStyledText(content))}\n </Link>\n );\n },\n text: (ic, exporter) => {\n return exporter.transformStyledText(ic);\n },\n};\n","import { DefaultStyleSchema, StyleMapping } from \"@blocknote/core\";\nimport { TextProps } from \"@react-pdf/renderer\";\n\nexport const pdfStyleMappingForDefaultSchema: StyleMapping<\n DefaultStyleSchema,\n TextProps[\"style\"]\n> = {\n bold: (val) => {\n if (!val) {\n return {};\n }\n return {\n fontWeight: \"bold\",\n };\n },\n italic: (val) => {\n if (!val) {\n return {};\n }\n return {\n fontStyle: \"italic\",\n };\n },\n underline: (val) => {\n if (!val) {\n return {};\n }\n return {\n textDecoration: \"underline\", // TODO: could conflict with strike\n };\n },\n strike: (val) => {\n if (!val) {\n return {};\n }\n return {\n textDecoration: \"line-through\",\n };\n },\n backgroundColor: (val, exporter) => {\n if (!val) {\n return {};\n }\n return {\n backgroundColor:\n exporter.options.colors[val as keyof typeof exporter.options.colors]\n .background,\n };\n },\n textColor: (val, exporter) => {\n if (!val) {\n return {};\n }\n return {\n color:\n exporter.options.colors[val as keyof typeof exporter.options.colors]\n .text,\n };\n },\n code: (val) => {\n if (!val) {\n return {};\n }\n return {\n fontFamily: \"GeistMono\",\n };\n },\n};\n","import { pdfBlockMappingForDefaultSchema } from \"./blocks.js\";\nimport { pdfInlineContentMappingForDefaultSchema } from \"./inlinecontent.js\";\nimport { pdfStyleMappingForDefaultSchema } from \"./styles.js\";\n\nexport const pdfDefaultSchemaMappings: {\n blockMapping: typeof pdfBlockMappingForDefaultSchema;\n inlineContentMapping: typeof pdfInlineContentMappingForDefaultSchema;\n styleMapping: typeof pdfStyleMappingForDefaultSchema;\n} = {\n blockMapping: pdfBlockMappingForDefaultSchema,\n inlineContentMapping: pdfInlineContentMappingForDefaultSchema,\n styleMapping: pdfStyleMappingForDefaultSchema,\n};\n","export async function corsProxyResolveFileUrl(url: string) {\n return (\n \"https://corsproxy.api.blocknotejs.org/corsproxy/?url=\" +\n encodeURIComponent(url)\n );\n}\n","/**\n *\n * Helper functions so that we can import files both on vitest, browser and node\n * TODO: should find a way to test automatically in all environments\n */\n\nexport async function loadFileDataUrl(\n requireUrl: { default: string },\n mimeType: string\n) {\n if (import.meta.env.NODE_ENV === \"test\") {\n const buffer = await loadFileBuffer(requireUrl);\n const fileBase64 = buffer.toString(\"base64\");\n\n const dataUrl = `data:${mimeType};base64,${fileBase64}`;\n return dataUrl;\n } else {\n // in browser, this is already a data url\n return requireUrl.default as string;\n }\n}\n\nexport async function loadFontDataUrl(requireUrl: { default: string }) {\n return loadFileDataUrl(requireUrl, \"font/ttf\");\n}\n\nexport async function loadFileBuffer(requireUrl: {\n default: string;\n}): Promise<Buffer | ArrayBuffer> {\n if (import.meta.env.NODE_ENV === \"test\") {\n // in vitest, this is the url we need to load with readfilesync\n // eslint-disable-next-line\n const fs = require(\"fs\");\n let url = requireUrl.default;\n\n if (url.startsWith(\"/@fs/\")) {\n url = url.substring(\"/@fs\".length);\n }\n const buffer = fs.readFileSync(url);\n return buffer;\n } else {\n // in browser, this is already a data url\n const dataUrl = requireUrl.default as string;\n // convert to buffer on browser\n const response = await fetch(dataUrl);\n const arrayBuffer = await response.arrayBuffer();\n return arrayBuffer;\n }\n}\n\n/**\n * usage:\n * \n * await loadFontDataUrl(\n await import(\"../fonts/inter/Inter_18pt-Italic.ttf\")\n );\n */\n","import {\n Block,\n BlockNoteSchema,\n BlockSchema,\n COLORS_DEFAULT,\n DefaultProps,\n Exporter,\n ExporterOptions,\n InlineContentSchema,\n StyleSchema,\n StyledText,\n} from \"@blocknote/core\";\nimport {\n Document,\n Font,\n Link,\n Page,\n StyleSheet,\n Text,\n TextProps,\n View,\n} from \"@react-pdf/renderer\";\nimport { corsProxyResolveFileUrl } from \"@shared/api/corsProxy.js\";\nimport { loadFontDataUrl } from \"../../../../shared/util/fileUtil.js\";\n\nimport { Style } from \"./types.js\";\n\nconst FONT_SIZE = 16;\nconst PIXELS_PER_POINT = 0.75;\n\ntype Options = ExporterOptions & {\n /**\n *\n * @default uses the remote emoji source hosted on cloudflare (https://cdnjs.cloudflare.com/ajax/libs/twemoji/14.0.2/72x72/)\n */\n emojiSource: false | ReturnType<typeof Font.getEmojiSource>;\n};\n\n/**\n * Exports a BlockNote document to a .pdf file using the react-pdf library.\n */\nexport class PDFExporter<\n B extends BlockSchema,\n S extends StyleSchema,\n I extends InlineContentSchema\n> extends Exporter<\n B,\n I,\n S,\n React.ReactElement<Text>,\n React.ReactElement<Link> | React.ReactElement<Text>,\n TextProps[\"style\"],\n React.ReactElement<Text>\n> {\n private fontsRegistered = false;\n\n public styles = StyleSheet.create({\n page: {\n paddingTop: 35,\n paddingBottom: 65,\n paddingHorizontal: 35,\n fontFamily: \"Inter\",\n fontSize: FONT_SIZE * PIXELS_PER_POINT, // pixels\n lineHeight: 1.5,\n },\n block: {},\n blockChildren: {},\n header: {},\n footer: {\n position: \"absolute\",\n },\n });\n\n public readonly options: Options;\n\n public constructor(\n /**\n * The schema of your editor. The mappings are automatically typed checked against this schema.\n */\n protected readonly schema: BlockNoteSchema<B, I, S>,\n /**\n * The mappings that map the BlockNote schema to the react-pdf content.\n *\n * Pass {@link pdfDefaultSchemaMappings} for the default schema.\n */\n mappings: Exporter<\n NoInfer<B>,\n NoInfer<I>,\n NoInfer<S>,\n React.ReactElement<Text>, // RB\n React.ReactElement<Link> | React.ReactElement<Text>, // RI\n TextProps[\"style\"], // RS\n React.ReactElement<Text> // TS\n >[\"mappings\"],\n options?: Partial<Options>\n ) {\n const defaults = {\n emojiSource: {\n format: \"png\",\n url: \"https://cdnjs.cloudflare.com/ajax/libs/twemoji/14.0.2/72x72/\",\n },\n resolveFileUrl: corsProxyResolveFileUrl,\n colors: COLORS_DEFAULT,\n } satisfies Partial<Options>;\n\n const newOptions = {\n ...defaults,\n ...options,\n };\n super(schema, mappings, newOptions);\n this.options = newOptions;\n }\n\n /**\n * Mostly for internal use, you probably want to use `toBlob` or `toReactPDFDocument` instead.\n */\n public transformStyledText(styledText: StyledText<S>) {\n const stylesArray = this.mapStyles(styledText.styles);\n const styles = Object.assign({}, ...stylesArray);\n return <Text style={styles}>{styledText.text}</Text>;\n }\n\n /**\n * Mostly for internal use, you probably want to use `toBlob` or `toReactPDFDocument` instead.\n */\n public async transformBlocks(\n blocks: Block<B, I, S>[], // Or BlockFromConfig<B[keyof B], I, S>?\n nestingLevel = 0\n ): Promise<React.ReactElement<Text>[]> {\n const ret: React.ReactElement<Text>[] = [];\n let numberedListIndex = 0;\n\n for (const b of blocks) {\n if (b.type === \"numberedListItem\") {\n numberedListIndex++;\n } else {\n numberedListIndex = 0;\n }\n const children = await this.transformBlocks(b.children, nestingLevel + 1);\n const self = await this.mapBlock(\n b as any,\n nestingLevel,\n numberedListIndex\n ); // TODO: any\n\n if (b.type === \"pageBreak\") {\n ret.push(self);\n continue;\n }\n\n const style = this.blocknoteDefaultPropsToReactPDFStyle(b.props as any);\n ret.push(\n <>\n <View\n style={{\n paddingVertical: 3 * PIXELS_PER_POINT,\n ...this.styles.block,\n ...style,\n }}>\n {self}\n </View>\n {children.length > 0 && (\n <View\n style={{\n marginLeft: FONT_SIZE * 1.5 * PIXELS_PER_POINT,\n ...this.styles.blockChildren,\n }}>\n {children}\n </View>\n )}\n </>\n );\n }\n\n return ret;\n }\n\n protected async registerFonts() {\n if (this.fontsRegistered) {\n return;\n }\n\n if (this.options.emojiSource) {\n Font.registerEmojiSource(this.options.emojiSource);\n }\n let font = await loadFontDataUrl(\n await import(\"@shared/assets/fonts/inter/Inter_18pt-Regular.ttf\")\n );\n Font.register({\n family: \"Inter\",\n src: font,\n });\n\n font = await loadFontDataUrl(\n await import(\"@shared/assets/fonts/inter/Inter_18pt-Italic.ttf\")\n );\n Font.register({\n family: \"Inter\",\n fontStyle: \"italic\",\n src: font,\n });\n\n font = await loadFontDataUrl(\n await import(\"@shared/assets/fonts/inter/Inter_18pt-Bold.ttf\")\n );\n Font.register({\n family: \"Inter\",\n src: font,\n fontWeight: \"bold\",\n });\n\n font = await loadFontDataUrl(\n await import(\"@shared/assets/fonts/inter/Inter_18pt-BoldItalic.ttf\")\n );\n Font.register({\n family: \"Inter\",\n fontStyle: \"italic\",\n src: font,\n fontWeight: \"bold\",\n });\n\n font = await loadFontDataUrl(\n await import(\"@shared/assets/fonts/GeistMono-Regular.ttf\")\n );\n Font.register({\n family: \"GeistMono\",\n src: font,\n });\n\n this.fontsRegistered = true;\n }\n\n /**\n * Convert a document (array of Blocks) to a react-pdf Document.\n */\n public async toReactPDFDocument(\n blocks: Block<B, I, S>[],\n options: {\n /**\n * Add a header to every page.\n * The React component passed must be a React-PDF component\n */\n header?: React.ReactElement;\n /**\n * Add a footer to every page.\n * The React component passed must be a React-PDF component\n */\n footer?: React.ReactElement;\n } = {}\n ) {\n await this.registerFonts();\n\n return (\n <Document>\n <Page dpi={100} size=\"A4\" style={this.styles.page}>\n {options.header && (\n <View fixed style={this.styles.header}>\n {options.header}\n </View>\n )}\n {await this.transformBlocks(blocks)}\n {options.footer && (\n <View\n fixed\n style={[\n {\n left: this.styles.page.paddingHorizontal || 0,\n bottom: (this.styles.page.paddingBottom || 0) / 2,\n right: this.styles.page.paddingHorizontal || 0,\n },\n this.styles.footer,\n ]}>\n {options.footer}\n </View>\n )}\n </Page>\n </Document>\n );\n }\n\n protected blocknoteDefaultPropsToReactPDFStyle(\n props: Partial<DefaultProps>\n ): Style {\n return {\n textAlign: props.textAlignment,\n backgroundColor:\n props.backgroundColor === \"default\" || !props.backgroundColor\n ? undefined\n : this.options.colors[\n props.backgroundColor as keyof typeof this.options.colors\n ].background,\n color:\n props.textColor === \"default\" || !props.textColor\n ? undefined\n : this.options.colors[\n props.textColor as keyof typeof this.options.colors\n ].text,\n alignItems:\n props.textAlignment === \"right\"\n ? \"flex-end\"\n : props.textAlignment === \"center\"\n ? \"center\"\n : undefined,\n };\n }\n}\n"],"names":["PIXELS_PER_POINT","styles","StyleSheet","BULLET_MARKER","CHECK_MARKER_UNCHECKED","jsx","Svg","Path","CHECK_MARKER_CHECKED","ListItem","listMarker","children","style","jsxs","View","Text","Table","props","headerRows","headerCols","row","rowIndex","colIndex","cell","mapTableCell","isHeaderRow","isHeaderCol","FONT_SIZE","pdfBlockMappingForDefaultSchema","block","exporter","_nestingLevel","numberedListIndex","fontSizeEM","lines","_a","line","index","indent","Fragment","file","caption","t","Image","defaultText","icon","_exporter","Link","pdfInlineContentMappingForDefaultSchema","ic","content","pdfStyleMappingForDefaultSchema","val","pdfDefaultSchemaMappings","corsProxyResolveFileUrl","url","loadFileDataUrl","requireUrl","mimeType","loadFontDataUrl","PDFExporter","Exporter","schema","mappings","options","newOptions","COLORS_DEFAULT","__publicField","styledText","stylesArray","blocks","nestingLevel","ret","b","self","Font","font","Document","Page"],"mappings":"uVAKMA,EAAmB,IAEnBC,EAASC,aAAW,OAAO,CAC/B,SAAU,CACR,QAAS,OACT,cAAe,MACf,IAAK,EAAIF,EACT,aAAc,EAChB,EACA,OAAQ,CAAA,CAGV,CAAC,EAEYG,EAAgB,IAGhBC,EACXC,EAAA,IAACC,EAAA,IAAA,CACC,MAAO,CAAE,UAAW,CAAE,EACtB,OAAO,KACP,QAAQ,iBACR,MAAM,KACN,KAAK,YACL,SAAAD,EAAAA,IAACE,EAAAA,KAAK,CAAA,EAAE,gJAAiJ,CAAA,CAAA,CAC3J,EAIWC,EACXH,EAAA,IAACC,EAAA,IAAA,CACC,MAAO,CAAE,UAAW,CAAE,EACtB,OAAO,KACP,QAAQ,iBACR,MAAM,KACN,KAAK,YACL,SAAAD,EAAAA,IAACE,EAAAA,KAAK,CAAA,EAAE,oNAAqN,CAAA,CAAA,CAC/N,EAGWE,EAAW,CAAC,CACvB,WAAAC,EACA,SAAAC,EACA,MAAAC,CACF,IAMIC,EAAA,KAACC,QAAK,MAAO,CAACb,EAAO,SAAUW,GAAS,EAAE,EACxC,SAAA,CAACP,EAAA,IAAAS,EAAA,KAAA,CAAK,MAAOb,EAAO,OAIjB,SAAA,OAAOS,GAAe,SACpBL,EAAAA,IAAAU,EAAAA,KAAA,CAAM,SAAWL,CAAA,CAAA,EAElBA,EAEJ,EACCC,CAAA,EACH,EC3DEX,EAAmB,IAInBC,EAASC,aAAW,OAAO,CAC/B,eAAgB,CAEhB,EACA,IAAK,CACH,cAAe,MACf,SAAU,OAGV,QAAS,MACX,EACA,KAAM,CACJ,kBAAmB,EAAIF,EACvB,WAAY,EAAIA,EAEhB,WAAY,iBACZ,UAAW,iBACX,SAAU,aACV,WAAY,UACd,EACA,WAAY,CACV,WAAY,MACd,EACA,WAAY,CACV,aAAc,gBAChB,EACA,UAAW,CACT,YAAa,gBAAA,CAEjB,CAAC,EAEYgB,EAASC,GAWhB,CAEE,MAAAC,EAAa,IAAI,MAAMD,EAAM,KAAK,YAAc,CAAC,EAAE,KAAK,EAAI,EAE5DE,EAAa,IAAI,MAAMF,EAAM,KAAK,YAAc,CAAC,EAAE,KAAK,EAAI,EAElE,OACGZ,EAAAA,IAAAS,EAAAA,KAAA,CAAK,MAAOb,EAAO,eAAgB,KAAM,GACvC,SAAAgB,EAAM,KAAK,KAAK,IAAI,CAACG,EAAKC,IACzBhB,EAAA,IAACS,EAAA,KAAA,CACC,MAAO,CACLb,EAAO,IACPoB,IAAaJ,EAAM,KAAK,KAAK,OAAS,EAAIhB,EAAO,WAAa,CAAA,CAChE,EAEC,SAAImB,EAAA,MAAM,IAAI,CAAC,EAAGE,IAAa,CACxB,MAAAC,EAAOC,eAAa,CAAC,EAErBC,EAAcP,EAAWG,CAAQ,EACjCK,EAAcP,EAAWG,CAAQ,EAIrC,OAAAjB,EAAA,IAACS,EAAA,KAAA,CACC,MAAO,CACLb,EAAO,KACPwB,GAAeC,EAAczB,EAAO,WAAa,CAAC,EAClDqB,IAAaF,EAAI,MAAM,OAAS,EAAInB,EAAO,UAAY,CAAC,EACxDgB,EAAM,KAAK,aAAaK,CAAQ,EAC5B,CAAE,MAAOL,EAAM,KAAK,aAAaK,CAAQ,CACzC,EAAA,CAAE,KAAM,CAAE,EACd,CACE,MACEC,EAAK,MAAM,YAAc,UACrB,OACAN,EAAM,YAAY,QAAQ,OACxBM,EAAK,MACF,SACL,EAAE,KACR,gBACEA,EAAK,MAAM,kBAAoB,UAC3B,OACAN,EAAM,YAAY,QAAQ,OACxBM,EAAK,MACF,eACL,EAAE,WACR,UAAWA,EAAK,MAAM,aAAA,CAE1B,EAEC,SAAMN,EAAA,YAAY,uBAAuBM,EAAK,OAAO,CAAA,EADjDD,CAEP,CAEH,CAAA,CAAA,EAvCID,CAyCR,CAAA,EACH,CAEJ,EChGMrB,EAAmB,IACnB2B,EAAY,GAELC,EAMT,CACF,UAAW,CAACC,EAAOC,UAETf,EAAM,KAAA,CAAA,SAAAe,EAAS,uBAAuBD,EAAM,OAAO,EAAE,EAE/D,eAAgB,CAACA,EAAOC,IAGpBzB,EAAAA,IAACI,EAAS,CAAA,WAAYN,EACpB,SAAAE,MAACU,EAAAA,KAAM,CAAA,SAAAe,EAAS,uBAAuBD,EAAM,OAAO,CAAE,CAAA,EACxD,EAGJ,iBAAkB,CAACA,EAAOC,EAAUC,EAAeC,IAI9C3B,EAAAA,IAAAI,EAAA,CAAS,WAAY,GAAGuB,CAAiB,IACxC,SAAC3B,EAAA,IAAAU,OAAA,CAAM,SAASe,EAAA,uBAAuBD,EAAM,OAAO,CAAE,CAAA,EACxD,EAKJ,cAAe,CAACA,EAAOC,IAEnBzB,EAAA,IAACI,EAAA,CACC,WACEoB,EAAM,MAAM,QAAUrB,EAAuBJ,EAE/C,eAACW,EAAAA,KAAM,CAAA,SAAAe,EAAS,uBAAuBD,EAAM,OAAO,CAAE,CAAA,CAAA,CACxD,EAGJ,QAAS,CAACA,EAAOC,IAAa,CACtB,MAAAG,EACJJ,EAAM,MAAM,QAAU,EAAI,EAAIA,EAAM,MAAM,QAAU,EAAI,IAAM,KAE9D,OAAAxB,EAAA,IAACU,EAAA,KAAA,CACC,MAAO,CACL,SAAUkB,EAAaN,EAAY3B,EACnC,WAAY,GACd,EACC,SAAA8B,EAAS,uBAAuBD,EAAM,OAAO,CAAA,CAChD,CAEJ,EACA,MAAO,CAACA,EAAOC,IAEXzB,EAAA,IAACU,EAAA,KAAA,CACC,MAAO,CACL,WAAY,UACZ,MAAO,UACP,YAAa,IAAMf,CACrB,EACC,SAAA8B,EAAS,uBAAuBD,EAAM,OAAO,CAAA,CAChD,EAGJ,UAAYA,GAAU,OAEd,MAAAK,KADeC,EAAAN,EAAM,QAA8B,CAAC,IAArC,YAAAM,EAAwC,OAAQ,IAC3C,MAAM;AAAA,CAAI,EAAE,IAAI,CAACC,EAAMC,IAAU,OACzD,MAAMC,IAASH,EAAAC,EAAK,MAAM,MAAM,IAAjB,YAAAD,EAAqB,GAAG,SAAU,EAG/C,OAAA9B,EAAA,IAACU,EAAA,KAAA,CAEC,MAAO,CACL,WAAYuB,EAAS,IAAMtC,CAC7B,EACC,SAAKoC,EAAA,UAAe,GAAA/B,EAAA,IAAAkC,WAAA,CAAE,SAAM,GAAA,CAAA,CAAA,EAJxB,QAAQF,CAAK,EAKpB,CAAA,CAEH,EAGC,OAAAhC,EAAA,IAACS,EAAA,KAAA,CACC,KAAM,GACN,MAAO,CACL,QAAS,GAAKd,EACd,gBAAiB,UACjB,MAAO,UACP,WAAY,KACZ,SAAU2B,EAAY3B,EACtB,WAAY,WACd,EACC,SAAAkC,CAAA,CACH,CAEJ,EACA,UAAW,IACF7B,EAAA,IAACS,EAAK,KAAA,CAAA,MAAK,EAAC,CAAA,EAErB,MAAO,CAACe,EAAOC,IAEXjB,EAAA,KAACC,EAAK,KAAA,CAAA,KAAM,GACT,SAAA,CAAA0B,EACCX,EAAM,MACN,kBACCxB,EAAA,IAAAC,EAAA,IAAA,CAAI,OAAQ,GAAI,MAAO,GAAI,QAAQ,YAAY,KAAK,eACnD,SAAAD,EAAAA,IAACE,EAAK,KAAA,CAAA,EAAE,krBAAkrB,CAC5rB,CAAA,CAEF,EACCkC,EAAQZ,EAAM,KAAe,CAAA,EAChC,EAGJ,MAAO,CAACA,EAAOC,IAEXjB,EAAA,KAACC,EAAK,KAAA,CAAA,KAAM,GACT,SAAA,CAAA0B,EACCX,EAAM,MACN,kBACCxB,EAAA,IAAAC,EAAA,IAAA,CAAI,OAAQ,GAAI,MAAO,GAAI,QAAQ,YAAY,KAAK,eACnD,SAAAD,EAAAA,IAACE,EAAK,KAAA,CAAA,EAAE,uTAAuT,CACjU,CAAA,CAEF,EACCkC,EAAQZ,EAAM,KAAe,CAAA,EAChC,EAGJ,KAAM,CAACA,EAAOC,IAEVjB,EAAA,KAACC,EAAK,KAAA,CAAA,KAAM,GACT,SAAA,CAAA0B,EACCX,EAAM,MACN,YACCxB,EAAA,IAAAC,EAAA,IAAA,CAAI,OAAQ,GAAI,MAAO,GAAI,QAAQ,YAAY,KAAK,eACnD,SAAAD,EAAAA,IAACE,EAAK,KAAA,CAAA,EAAE,8JAA8J,CACxK,CAAA,CAEF,EACCkC,EAAQZ,EAAM,KAAe,CAAA,EAChC,EAGJ,MAAO,MAAOA,EAAOa,IAEjB7B,EAAA,KAACC,EAAK,KAAA,CAAA,KAAM,GACV,SAAA,CAAAT,EAAA,IAACsC,EAAA,MAAA,CACC,IAAK,MAAMD,EAAE,YAAYb,EAAM,MAAM,GAAG,EACxC,MAAO,CACL,MAAOA,EAAM,MAAM,aAAe7B,CAAA,CACpC,CACF,EACCyC,EAAQZ,EAAM,KAAQ,CAAA,EACzB,EAGJ,MAAO,CAACA,EAAOa,UACL1B,EAAM,CAAA,KAAMa,EAAM,QAAS,YAAaa,EAAG,CAEvD,EAEA,SAASF,EACPvB,EACA2B,EACAC,EACAC,EACA,CAEA,OACGzC,EAAAA,IAAA0C,EAAAA,KAAA,CAAK,IAAK9B,EAAM,IACf,SAAAJ,EAAA,KAACC,EAAA,KAAA,CACC,MAAO,CACL,QAAS,OACT,IAAK,EAAId,IACT,cAAe,KACjB,EACC,SAAA,CAAA6C,EACAxC,EAAA,IAAAU,EAAA,KAAA,CAAM,SAAME,EAAA,MAAQ2B,CAAY,CAAA,CAAA,CAAA,CAAA,EAErC,CAEJ,CAEA,SAASH,EACPxB,EACA6B,EACA,CACI,GAAC7B,EAAM,QAIT,OAAAZ,EAAA,IAACU,EAAA,KAAA,CACC,MAAO,CACL,MAAOE,EAAM,aACTA,EAAM,aAAejB,EACrB,OACJ,SAAU2B,EAAY,GAAM3B,CAC9B,EACC,SAAMiB,EAAA,OAAA,CACT,CAEJ,CCvNO,MAAM+B,EAKT,CACF,KAAM,CAACC,EAAInB,IAENzB,EAAAA,IAAA0C,EAAAA,KAAA,CAAK,KAAME,EAAG,KACZ,SAAGA,EAAA,QAAQ,IAAKC,GAAYpB,EAAS,oBAAoBoB,CAAO,CAAC,EACpE,EAGJ,KAAM,CAACD,EAAInB,IACFA,EAAS,oBAAoBmB,CAAE,CAE1C,ECnBaE,EAGT,CACF,KAAOC,GACAA,EAGE,CACL,WAAY,MACd,EAJS,CAAC,EAMZ,OAASA,GACFA,EAGE,CACL,UAAW,QACb,EAJS,CAAC,EAMZ,UAAYA,GACLA,EAGE,CACL,eAAgB,WAClB,EAJS,CAAC,EAMZ,OAASA,GACFA,EAGE,CACL,eAAgB,cAClB,EAJS,CAAC,EAMZ,gBAAiB,CAACA,EAAKtB,IAChBsB,EAGE,CACL,gBACEtB,EAAS,QAAQ,OAAOsB,CAA2C,EAChE,UACP,EANS,CAAC,EAQZ,UAAW,CAACA,EAAKtB,IACVsB,EAGE,CACL,MACEtB,EAAS,QAAQ,OAAOsB,CAA2C,EAChE,IACP,EANS,CAAC,EAQZ,KAAOA,GACAA,EAGE,CACL,WAAY,WACd,EAJS,CAAC,CAMd,EC/DaC,EAIT,CACF,aAAczB,EACd,qBAAsBoB,EACtB,aAAcG,CAChB,ECZA,eAAsBG,EAAwBC,EAAa,CAEvD,MAAA,wDACA,mBAAmBA,CAAG,CAE1B,CCCsB,eAAAC,EACpBC,EACAC,EACA,CASE,OAAOD,EAAW,OAEtB,CAEA,eAAsBE,EAAgBF,EAAiC,CAC9D,OAAAD,EAAgBC,CAAsB,CAC/C,CCGA,MAAM9B,EAAY,GACZ3B,EAAmB,IAalB,MAAM4D,UAIHC,EAAAA,QAQR,CAsBO,YAIcC,EAMnBC,EASAC,EACA,CAUA,MAAMC,EAAa,CACjB,GAVe,CACf,YAAa,CACX,OAAQ,MACR,IAAK,8DACP,EACA,eAAgBX,EAChB,OAAQY,EAAAA,cACV,EAIE,GAAGF,CACL,EACM,MAAAF,EAAQC,EAAUE,CAAU,EAvD5BE,EAAA,uBAAkB,IAEnBA,EAAA,cAASjE,aAAW,OAAO,CAChC,KAAM,CACJ,WAAY,GACZ,cAAe,GACf,kBAAmB,GACnB,WAAY,QACZ,SAAUyB,EAAY3B,EACtB,WAAY,GACd,EACA,MAAO,CAAC,EACR,cAAe,CAAC,EAChB,OAAQ,CAAC,EACT,OAAQ,CACN,SAAU,UAAA,CACZ,CACD,GAEemE,EAAA,gBAMK,KAAA,OAAAL,EA+BnB,KAAK,QAAUG,CAAA,CAMV,oBAAoBG,EAA2B,CACpD,MAAMC,EAAc,KAAK,UAAUD,EAAW,MAAM,EAC9CnE,EAAS,OAAO,OAAO,CAAC,EAAG,GAAGoE,CAAW,EAC/C,OAAQhE,EAAA,IAAAU,EAAA,KAAA,CAAK,MAAOd,EAAS,WAAW,KAAK,CAAA,CAM/C,MAAa,gBACXqE,EACAC,EAAe,EACsB,CACrC,MAAMC,EAAkC,CAAC,EACzC,IAAIxC,EAAoB,EAExB,UAAWyC,KAAKH,EAAQ,CAClBG,EAAE,OAAS,mBACbzC,IAEoBA,EAAA,EAEtB,MAAMrB,EAAW,MAAM,KAAK,gBAAgB8D,EAAE,SAAUF,EAAe,CAAC,EAClEG,EAAO,MAAM,KAAK,SACtBD,EACAF,EACAvC,CACF,EAEI,GAAAyC,EAAE,OAAS,YAAa,CAC1BD,EAAI,KAAKE,CAAI,EACb,QAAA,CAGF,MAAM9D,EAAQ,KAAK,qCAAqC6D,EAAE,KAAY,EAClED,EAAA,KAEA3D,OAAA0B,EAAAA,SAAA,CAAA,SAAA,CAAAlC,EAAA,IAACS,EAAA,KAAA,CACC,MAAO,CACL,gBAAiB,EAAId,EACrB,GAAG,KAAK,OAAO,MACf,GAAGY,CACL,EACC,SAAA8D,CAAA,CACH,EACC/D,EAAS,OAAS,GACjBN,EAAA,IAACS,EAAA,KAAA,CACC,MAAO,CACL,WAAYa,EAAY,IAAM3B,EAC9B,GAAG,KAAK,OAAO,aACjB,EACC,SAAAW,CAAA,CAAA,CACH,CAEJ,CAAA,CACF,CAAA,CAGK,OAAA6D,CAAA,CAGT,MAAgB,eAAgB,CAC9B,GAAI,KAAK,gBACP,OAGE,KAAK,QAAQ,aACVG,EAAAA,KAAA,oBAAoB,KAAK,QAAQ,WAAW,EAEnD,IAAIC,EAAO,MAAMjB,EACf,MAAM,mCAAO,mCAAmD,CAAA,CAClE,EACAgB,EAAAA,KAAK,SAAS,CACZ,OAAQ,QACR,IAAKC,CAAA,CACN,EAEDA,EAAO,MAAMjB,EACX,MAAM,mCAAO,kCAAkD,CAAA,CACjE,EACAgB,EAAAA,KAAK,SAAS,CACZ,OAAQ,QACR,UAAW,SACX,IAAKC,CAAA,CACN,EAEDA,EAAO,MAAMjB,EACX,MAAM,mCAAO,gCAAgD,CAAA,CAC/D,EACAgB,EAAAA,KAAK,SAAS,CACZ,OAAQ,QACR,IAAKC,EACL,WAAY,MAAA,CACb,EAEDA,EAAO,MAAMjB,EACX,MAAM,mCAAO,sCAAsD,CAAA,CACrE,EACAgB,EAAAA,KAAK,SAAS,CACZ,OAAQ,QACR,UAAW,SACX,IAAKC,EACL,WAAY,MAAA,CACb,EAEDA,EAAO,MAAMjB,EACX,MAAM,mCAAO,kCAA4C,CAAA,CAC3D,EACAgB,EAAAA,KAAK,SAAS,CACZ,OAAQ,YACR,IAAKC,CAAA,CACN,EAED,KAAK,gBAAkB,EAAA,CAMzB,MAAa,mBACXN,EACAN,EAWI,GACJ,CACA,aAAM,KAAK,cAAc,EAGvB3D,EAAAA,IAACwE,EAAAA,SACC,CAAA,SAAAhE,EAAA,KAACiE,EAAK,KAAA,CAAA,IAAK,IAAK,KAAK,KAAK,MAAO,KAAK,OAAO,KAC1C,SAAA,CAAQd,EAAA,QACN3D,EAAAA,IAAAS,EAAAA,KAAA,CAAK,MAAK,GAAC,MAAO,KAAK,OAAO,OAC5B,SAAAkD,EAAQ,MACX,CAAA,EAED,MAAM,KAAK,gBAAgBM,CAAM,EACjCN,EAAQ,QACP3D,EAAA,IAACS,EAAA,KAAA,CACC,MAAK,GACL,MAAO,CACL,CACE,KAAM,KAAK,OAAO,KAAK,mBAAqB,EAC5C,QAAS,KAAK,OAAO,KAAK,eAAiB,GAAK,EAChD,MAAO,KAAK,OAAO,KAAK,mBAAqB,CAC/C,EACA,KAAK,OAAO,MACd,EACC,SAAQkD,EAAA,MAAA,CAAA,CACX,CAAA,CAEJ,CACF,CAAA,CAAA,CAIM,qCACR/C,EACO,CACA,MAAA,CACL,UAAWA,EAAM,cACjB,gBACEA,EAAM,kBAAoB,WAAa,CAACA,EAAM,gBAC1C,OACA,KAAK,QAAQ,OACXA,EAAM,eACR,EAAE,WACR,MACEA,EAAM,YAAc,WAAa,CAACA,EAAM,UACpC,OACA,KAAK,QAAQ,OACXA,EAAM,SACR,EAAE,KACR,WACEA,EAAM,gBAAkB,QACpB,WACAA,EAAM,gBAAkB,SACxB,SACA,MACR,CAAA,CAEJ"}
1
+ {"version":3,"file":"blocknote-xl-pdf-exporter.cjs","sources":["../src/pdf/util/listItem.tsx","../src/pdf/util/table/Table.tsx","../src/pdf/defaultSchema/blocks.tsx","../src/pdf/defaultSchema/inlinecontent.tsx","../src/pdf/defaultSchema/styles.tsx","../src/pdf/defaultSchema/index.ts","../../../shared/api/corsProxy.ts","../../../shared/util/fileUtil.ts","../src/pdf/pdfExporter.tsx"],"sourcesContent":["import { Path, StyleSheet, Svg, Text, View } from \"@react-pdf/renderer\";\nimport { Style } from \"../types.js\";\n\n// https://github.com/diegomura/react-pdf/issues/134\n\nconst PIXELS_PER_POINT = 0.75;\n\nconst styles = StyleSheet.create({\n listItem: {\n display: \"flex\",\n flexDirection: \"row\",\n gap: 8 * PIXELS_PER_POINT,\n paddingRight: 10, // otherwise text overflows, seems like a react-pdf / yoga bug\n },\n bullet: {\n // fontFamily: \"\", // we could add symbol font if we don't want to use inter (default font) here\n },\n});\n\nexport const BULLET_MARKER = \"\\u2022\";\n\n// https://fonts.google.com/icons?selected=Material+Symbols+Outlined:check_box_outline_blank:FILL@0;wght@400;GRAD@0;opsz@24&icon.size=24&icon.color=undefined\nexport const CHECK_MARKER_UNCHECKED = (\n <Svg\n style={{ marginTop: 2 }}\n height=\"12\"\n viewBox=\"0 -960 960 960\"\n width=\"12\"\n fill=\"undefined\"\n >\n <Path d=\"M200-120q-33 0-56.5-23.5T120-200v-560q0-33 23.5-56.5T200-840h560q33 0 56.5 23.5T840-760v560q0 33-23.5 56.5T760-120H200Zm0-80h560v-560H200v560Z\" />\n </Svg>\n);\n\n// https://fonts.google.com/icons?selected=Material+Symbols+Outlined:check_box:FILL@0;wght@400;GRAD@0;opsz@24&icon.size=24&icon.color=undefined\nexport const CHECK_MARKER_CHECKED = (\n <Svg\n style={{ marginTop: 2 }}\n height=\"12\"\n viewBox=\"0 -960 960 960\"\n width=\"12\"\n fill=\"undefined\"\n >\n <Path d=\"m424-312 282-282-56-56-226 226-114-114-56 56 170 170ZM200-120q-33 0-56.5-23.5T120-200v-560q0-33 23.5-56.5T200-840h560q33 0 56.5 23.5T840-760v560q0 33-23.5 56.5T760-120H200Zm0-80h560v-560H200v560Zm0-560v560-560Z\" />\n </Svg>\n);\n\nexport const ListItem = ({\n listMarker,\n children,\n style,\n}: {\n listMarker: string | React.ReactNode;\n children: React.ReactNode;\n style?: Style;\n}) => {\n return (\n <View style={[styles.listItem, style || {}]}>\n <View style={styles.bullet}>\n {/* <Svg width={2} height={2}>\n <Circle cx=\"1\" cy=\"1\" r=\"2\" fill=\"black\" />\n </Svg> */}\n {typeof listMarker === \"string\" ? (\n <Text>{listMarker}</Text>\n ) : (\n listMarker\n )}\n </View>\n {children}\n </View>\n );\n};\n","import {\n Exporter,\n InlineContentSchema,\n mapTableCell,\n StyleSchema,\n TableContent,\n} from \"@blocknote/core\";\nimport { StyleSheet, View } from \"@react-pdf/renderer\";\nconst PIXELS_PER_POINT = 0.75;\n\n// ( impossible?) to make tables with flex that don't have a fixed / 100% width?\n// we'd need to measure the width of every column manually\nconst styles = StyleSheet.create({\n tableContainer: {\n // width: \"100%\",\n },\n row: {\n flexDirection: \"row\",\n flexWrap: \"wrap\",\n // width: \"100%\",\n // justifyContent: \"space-between\",\n display: \"flex\",\n },\n cell: {\n paddingHorizontal: 5 * PIXELS_PER_POINT,\n paddingTop: 3 * PIXELS_PER_POINT,\n // paddingBottom: 1 * PIXELS_PER_POINT, should be 3px but looks odd, better with no padding Bottom\n borderLeft: \"1px solid #ddd\",\n borderTop: \"1px solid #ddd\",\n wordWrap: \"break-word\",\n whiteSpace: \"pre-wrap\",\n },\n headerCell: {\n fontWeight: \"bold\",\n },\n bottomCell: {\n borderBottom: \"1px solid #ddd\",\n },\n rightCell: {\n borderRight: \"1px solid #ddd\",\n },\n});\n\nexport const Table = (props: {\n data: TableContent<InlineContentSchema>;\n transformer: Exporter<\n any,\n InlineContentSchema,\n StyleSchema,\n any,\n any,\n any,\n any\n >;\n}) => {\n // If headerRows is 1, then the first row is a header row\n const headerRows = new Array(props.data.headerRows ?? 0).fill(true);\n // If headerCols is 1, then the first column is a header column\n const headerCols = new Array(props.data.headerCols ?? 0).fill(true);\n\n return (\n <View style={styles.tableContainer} wrap={false}>\n {props.data.rows.map((row, rowIndex) => (\n <View\n style={[\n styles.row,\n rowIndex === props.data.rows.length - 1 ? styles.bottomCell : {},\n ]}\n key={rowIndex}\n >\n {row.cells.map((c, colIndex) => {\n const cell = mapTableCell(c);\n\n const isHeaderRow = headerRows[rowIndex];\n const isHeaderCol = headerCols[colIndex];\n\n // TODO we need to support for colspan and rowspan, but at the moment are blocked by react-pdf\n return (\n <View\n style={[\n styles.cell,\n isHeaderRow || isHeaderCol ? styles.headerCell : {},\n colIndex === row.cells.length - 1 ? styles.rightCell : {},\n props.data.columnWidths[colIndex]\n ? { width: props.data.columnWidths[colIndex] }\n : { flex: 1 },\n {\n color:\n cell.props.textColor === \"default\"\n ? undefined\n : props.transformer.options.colors[\n cell.props\n .textColor as keyof typeof props.transformer.options.colors\n ].text,\n backgroundColor:\n cell.props.backgroundColor === \"default\"\n ? undefined\n : props.transformer.options.colors[\n cell.props\n .backgroundColor as keyof typeof props.transformer.options.colors\n ].background,\n textAlign: cell.props.textAlignment,\n },\n ]}\n key={colIndex}\n >\n {props.transformer.transformInlineContent(cell.content)}\n </View>\n );\n })}\n </View>\n ))}\n </View>\n );\n};\n","import {\n BlockMapping,\n DefaultBlockSchema,\n DefaultProps,\n pageBreakSchema,\n StyledText,\n} from \"@blocknote/core\";\nimport { Image, Link, Path, Svg, Text, View } from \"@react-pdf/renderer\";\nimport {\n BULLET_MARKER,\n CHECK_MARKER_CHECKED,\n CHECK_MARKER_UNCHECKED,\n ListItem,\n} from \"../util/listItem.js\";\nimport { Table } from \"../util/table/Table.js\";\n\nconst PIXELS_PER_POINT = 0.75;\nconst FONT_SIZE = 16;\n\nexport const pdfBlockMappingForDefaultSchema: BlockMapping<\n DefaultBlockSchema & typeof pageBreakSchema.blockSchema,\n any,\n any,\n React.ReactElement<Text>,\n React.ReactElement<Text> | React.ReactElement<Link>\n> = {\n paragraph: (block, exporter) => {\n // const style = blocknoteDefaultPropsToReactPDFStyle(block.props);\n return <Text>{exporter.transformInlineContent(block.content)}</Text>;\n },\n bulletListItem: (block, exporter) => {\n // const style = t(block.props);\n return (\n <ListItem listMarker={BULLET_MARKER}>\n <Text>{exporter.transformInlineContent(block.content)}</Text>\n </ListItem>\n );\n },\n numberedListItem: (block, exporter, _nestingLevel, numberedListIndex) => {\n // const style = blocknoteDefaultPropsToReactPDFStyle(block.props);\n // console.log(\"NUMBERED LIST ITEM\", block.props.textAlignment, style);\n return (\n <ListItem listMarker={`${numberedListIndex}.`}>\n <Text>{exporter.transformInlineContent(block.content)}</Text>\n </ListItem>\n );\n },\n // would be nice to have pdf checkboxes:\n // https://github.com/diegomura/react-pdf/issues/2103\n checkListItem: (block, exporter) => {\n return (\n <ListItem\n listMarker={\n block.props.checked ? CHECK_MARKER_CHECKED : CHECK_MARKER_UNCHECKED\n }\n >\n <Text>{exporter.transformInlineContent(block.content)}</Text>\n </ListItem>\n );\n },\n heading: (block, exporter) => {\n const fontSizeEM =\n block.props.level === 1 ? 2 : block.props.level === 2 ? 1.5 : 1.17;\n return (\n <Text\n style={{\n fontSize: fontSizeEM * FONT_SIZE * PIXELS_PER_POINT,\n fontWeight: 700,\n }}\n >\n {exporter.transformInlineContent(block.content)}\n </Text>\n );\n },\n quote: (block, exporter) => {\n return (\n <Text\n style={{\n borderLeft: \"#7D797A\",\n color: \"#7D797A\",\n paddingLeft: 9.5 * PIXELS_PER_POINT,\n }}\n >\n {exporter.transformInlineContent(block.content)}\n </Text>\n );\n },\n codeBlock: (block) => {\n const textContent = (block.content as StyledText<any>[])[0]?.text || \"\";\n const lines = textContent.split(\"\\n\").map((line, index) => {\n const indent = line.match(/^\\s*/)?.[0].length || 0;\n\n return (\n <Text\n key={`line_${index}`}\n style={{\n marginLeft: indent * 9.5 * PIXELS_PER_POINT,\n }}\n >\n {line.trimStart() || <>&nbsp;</>}\n </Text>\n );\n });\n\n return (\n <View\n wrap={false}\n style={{\n padding: 24 * PIXELS_PER_POINT,\n backgroundColor: \"#161616\",\n color: \"#ffffff\",\n lineHeight: 1.25,\n fontSize: FONT_SIZE * PIXELS_PER_POINT,\n fontFamily: \"GeistMono\",\n }}\n >\n {lines}\n </View>\n );\n },\n pageBreak: () => {\n return <View break />;\n },\n audio: (block, exporter) => {\n return (\n <View wrap={false}>\n {file(\n block.props,\n \"Open audio file\",\n <Svg height={14} width={14} viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <Path d=\"M2 16.0001H5.88889L11.1834 20.3319C11.2727 20.405 11.3846 20.4449 11.5 20.4449C11.7761 20.4449 12 20.2211 12 19.9449V4.05519C12 3.93977 11.9601 3.8279 11.887 3.73857C11.7121 3.52485 11.3971 3.49335 11.1834 3.66821L5.88889 8.00007H2C1.44772 8.00007 1 8.44778 1 9.00007V15.0001C1 15.5524 1.44772 16.0001 2 16.0001ZM23 12C23 15.292 21.5539 18.2463 19.2622 20.2622L17.8445 18.8444C19.7758 17.1937 21 14.7398 21 12C21 9.26016 19.7758 6.80629 17.8445 5.15557L19.2622 3.73779C21.5539 5.75368 23 8.70795 23 12ZM18 12C18 10.0883 17.106 8.38548 15.7133 7.28673L14.2842 8.71584C15.3213 9.43855 16 10.64 16 12C16 13.36 15.3213 14.5614 14.2842 15.2841L15.7133 16.7132C17.106 15.6145 18 13.9116 18 12Z\"></Path>\n </Svg>,\n exporter,\n )}\n {caption(block.props, exporter)}\n </View>\n );\n },\n video: (block, exporter) => {\n return (\n <View wrap={false}>\n {file(\n block.props,\n \"Open video file\",\n <Svg height={14} width={14} viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <Path d=\"M2 3.9934C2 3.44476 2.45531 3 2.9918 3H21.0082C21.556 3 22 3.44495 22 3.9934V20.0066C22 20.5552 21.5447 21 21.0082 21H2.9918C2.44405 21 2 20.5551 2 20.0066V3.9934ZM8 5V19H16V5H8ZM4 5V7H6V5H4ZM18 5V7H20V5H18ZM4 9V11H6V9H4ZM18 9V11H20V9H18ZM4 13V15H6V13H4ZM18 13V15H20V13H18ZM4 17V19H6V17H4ZM18 17V19H20V17H18Z\" />\n </Svg>,\n exporter,\n )}\n {caption(block.props, exporter)}\n </View>\n );\n },\n file: (block, exporter) => {\n return (\n <View wrap={false}>\n {file(\n block.props,\n \"Open file\",\n <Svg height={16} width={16} viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <Path d=\"M3 8L9.00319 2H19.9978C20.5513 2 21 2.45531 21 2.9918V21.0082C21 21.556 20.5551 22 20.0066 22H3.9934C3.44476 22 3 21.5501 3 20.9932V8ZM10 4V9H5V20H19V4H10Z\" />\n </Svg>,\n exporter,\n )}\n {caption(block.props, exporter)}\n </View>\n );\n },\n image: async (block, t) => {\n return (\n <View wrap={false}>\n <Image\n src={await t.resolveFile(block.props.url)}\n style={{\n width: block.props.previewWidth\n ? block.props.previewWidth * PIXELS_PER_POINT\n : undefined,\n }}\n />\n {caption(block.props, t)}\n </View>\n );\n },\n table: (block, t) => {\n return <Table data={block.content} transformer={t} />;\n },\n};\n\nfunction file(\n props: Partial<DefaultProps & { name: string; url: string }>,\n defaultText: string,\n icon: React.ReactElement<Svg>,\n _exporter: any,\n) {\n const PIXELS_PER_POINT = 0.75;\n return (\n <Link src={props.url}>\n <View\n style={{\n display: \"flex\",\n gap: 8 * PIXELS_PER_POINT,\n flexDirection: \"row\",\n }}\n >\n {icon}\n <Text>{props.name || defaultText}</Text>\n </View>\n </Link>\n );\n}\n\nfunction caption(\n props: Partial<DefaultProps & { caption: string; previewWidth: number }>,\n _exporter: any,\n) {\n if (!props.caption) {\n return undefined;\n }\n return (\n <Text\n style={{\n width: props.previewWidth\n ? props.previewWidth * PIXELS_PER_POINT\n : undefined,\n fontSize: FONT_SIZE * 0.8 * PIXELS_PER_POINT,\n }}\n >\n {props.caption}\n </Text>\n );\n}\n","import {\n DefaultInlineContentSchema,\n InlineContentMapping,\n} from \"@blocknote/core\";\nimport { Link, Text } from \"@react-pdf/renderer\";\n\nexport const pdfInlineContentMappingForDefaultSchema: InlineContentMapping<\n DefaultInlineContentSchema,\n any,\n React.ReactElement<Link> | React.ReactElement<Text>,\n React.ReactElement<Text>\n> = {\n link: (ic, exporter) => {\n return (\n <Link href={ic.href}>\n {ic.content.map((content) => exporter.transformStyledText(content))}\n </Link>\n );\n },\n text: (ic, exporter) => {\n return exporter.transformStyledText(ic);\n },\n};\n","import { DefaultStyleSchema, StyleMapping } from \"@blocknote/core\";\nimport { TextProps } from \"@react-pdf/renderer\";\n\nexport const pdfStyleMappingForDefaultSchema: StyleMapping<\n DefaultStyleSchema,\n TextProps[\"style\"]\n> = {\n bold: (val) => {\n if (!val) {\n return {};\n }\n return {\n fontWeight: \"bold\",\n };\n },\n italic: (val) => {\n if (!val) {\n return {};\n }\n return {\n fontStyle: \"italic\",\n };\n },\n underline: (val) => {\n if (!val) {\n return {};\n }\n return {\n textDecoration: \"underline\", // TODO: could conflict with strike\n };\n },\n strike: (val) => {\n if (!val) {\n return {};\n }\n return {\n textDecoration: \"line-through\",\n };\n },\n backgroundColor: (val, exporter) => {\n if (!val) {\n return {};\n }\n return {\n backgroundColor:\n exporter.options.colors[val as keyof typeof exporter.options.colors]\n .background,\n };\n },\n textColor: (val, exporter) => {\n if (!val) {\n return {};\n }\n return {\n color:\n exporter.options.colors[val as keyof typeof exporter.options.colors]\n .text,\n };\n },\n code: (val) => {\n if (!val) {\n return {};\n }\n return {\n fontFamily: \"GeistMono\",\n };\n },\n};\n","import { pdfBlockMappingForDefaultSchema } from \"./blocks.js\";\nimport { pdfInlineContentMappingForDefaultSchema } from \"./inlinecontent.js\";\nimport { pdfStyleMappingForDefaultSchema } from \"./styles.js\";\n\nexport const pdfDefaultSchemaMappings: {\n blockMapping: typeof pdfBlockMappingForDefaultSchema;\n inlineContentMapping: typeof pdfInlineContentMappingForDefaultSchema;\n styleMapping: typeof pdfStyleMappingForDefaultSchema;\n} = {\n blockMapping: pdfBlockMappingForDefaultSchema,\n inlineContentMapping: pdfInlineContentMappingForDefaultSchema,\n styleMapping: pdfStyleMappingForDefaultSchema,\n};\n","export async function corsProxyResolveFileUrl(url: string) {\n return (\n \"https://corsproxy.api.blocknotejs.org/corsproxy/?url=\" +\n encodeURIComponent(url)\n );\n}\n","/**\n *\n * Helper functions so that we can import files both on vitest, browser and node\n * TODO: should find a way to test automatically in all environments\n */\n\nexport async function loadFileDataUrl(\n requireUrl: { default: string },\n mimeType: string,\n) {\n if (import.meta.env.NODE_ENV === \"test\") {\n const buffer = await loadFileBuffer(requireUrl);\n const fileBase64 = buffer.toString(\"base64\");\n\n const dataUrl = `data:${mimeType};base64,${fileBase64}`;\n return dataUrl;\n } else {\n // in browser, this is already a data url\n return requireUrl.default as string;\n }\n}\n\nexport async function loadFontDataUrl(requireUrl: { default: string }) {\n return loadFileDataUrl(requireUrl, \"font/ttf\");\n}\n\nexport async function loadFileBuffer(requireUrl: {\n default: string;\n}): Promise<Buffer | ArrayBuffer> {\n if (import.meta.env.NODE_ENV === \"test\") {\n // in vitest, this is the url we need to load with readfilesync\n // eslint-disable-next-line\n const fs = require(\"fs\");\n let url = requireUrl.default;\n\n if (url.startsWith(\"/@fs/\")) {\n url = url.substring(\"/@fs\".length);\n }\n const buffer = fs.readFileSync(url);\n return buffer;\n } else {\n // in browser, this is already a data url\n const dataUrl = requireUrl.default as string;\n // convert to buffer on browser\n const response = await fetch(dataUrl);\n const arrayBuffer = await response.arrayBuffer();\n return arrayBuffer;\n }\n}\n\n/**\n * usage:\n * \n * await loadFontDataUrl(\n await import(\"../fonts/inter/Inter_18pt-Italic.ttf\")\n );\n */\n","import {\n Block,\n BlockNoteSchema,\n BlockSchema,\n COLORS_DEFAULT,\n DefaultProps,\n Exporter,\n ExporterOptions,\n InlineContentSchema,\n StyleSchema,\n StyledText,\n} from \"@blocknote/core\";\nimport {\n Document,\n Font,\n Link,\n Page,\n StyleSheet,\n Text,\n TextProps,\n View,\n} from \"@react-pdf/renderer\";\nimport { corsProxyResolveFileUrl } from \"@shared/api/corsProxy.js\";\nimport { loadFontDataUrl } from \"../../../../shared/util/fileUtil.js\";\n\nimport { Style } from \"./types.js\";\n\nconst FONT_SIZE = 16;\nconst PIXELS_PER_POINT = 0.75;\n\ntype Options = ExporterOptions & {\n /**\n *\n * @default uses the remote emoji source hosted on cloudflare (https://cdnjs.cloudflare.com/ajax/libs/twemoji/14.0.2/72x72/)\n */\n emojiSource: false | ReturnType<typeof Font.getEmojiSource>;\n};\n\n/**\n * Exports a BlockNote document to a .pdf file using the react-pdf library.\n */\nexport class PDFExporter<\n B extends BlockSchema,\n S extends StyleSchema,\n I extends InlineContentSchema,\n> extends Exporter<\n B,\n I,\n S,\n React.ReactElement<Text>,\n React.ReactElement<Link> | React.ReactElement<Text>,\n TextProps[\"style\"],\n React.ReactElement<Text>\n> {\n private fontsRegistered = false;\n\n public styles = StyleSheet.create({\n page: {\n paddingTop: 35,\n paddingBottom: 65,\n paddingHorizontal: 35,\n fontFamily: \"Inter\",\n fontSize: FONT_SIZE * PIXELS_PER_POINT, // pixels\n lineHeight: 1.5,\n },\n block: {},\n blockChildren: {},\n header: {},\n footer: {\n position: \"absolute\",\n },\n });\n\n public readonly options: Options;\n\n public constructor(\n /**\n * The schema of your editor. The mappings are automatically typed checked against this schema.\n */\n protected readonly schema: BlockNoteSchema<B, I, S>,\n /**\n * The mappings that map the BlockNote schema to the react-pdf content.\n *\n * Pass {@link pdfDefaultSchemaMappings} for the default schema.\n */\n mappings: Exporter<\n NoInfer<B>,\n NoInfer<I>,\n NoInfer<S>,\n React.ReactElement<Text>, // RB\n React.ReactElement<Link> | React.ReactElement<Text>, // RI\n TextProps[\"style\"], // RS\n React.ReactElement<Text> // TS\n >[\"mappings\"],\n options?: Partial<Options>,\n ) {\n const defaults = {\n emojiSource: {\n format: \"png\",\n url: \"https://cdnjs.cloudflare.com/ajax/libs/twemoji/14.0.2/72x72/\",\n },\n resolveFileUrl: corsProxyResolveFileUrl,\n colors: COLORS_DEFAULT,\n } satisfies Partial<Options>;\n\n const newOptions = {\n ...defaults,\n ...options,\n };\n super(schema, mappings, newOptions);\n this.options = newOptions;\n }\n\n /**\n * Mostly for internal use, you probably want to use `toBlob` or `toReactPDFDocument` instead.\n */\n public transformStyledText(styledText: StyledText<S>) {\n const stylesArray = this.mapStyles(styledText.styles);\n const styles = Object.assign({}, ...stylesArray);\n return <Text style={styles}>{styledText.text}</Text>;\n }\n\n /**\n * Mostly for internal use, you probably want to use `toBlob` or `toReactPDFDocument` instead.\n */\n public async transformBlocks(\n blocks: Block<B, I, S>[], // Or BlockFromConfig<B[keyof B], I, S>?\n nestingLevel = 0,\n ): Promise<React.ReactElement<Text>[]> {\n const ret: React.ReactElement<Text>[] = [];\n let numberedListIndex = 0;\n\n for (const b of blocks) {\n if (b.type === \"numberedListItem\") {\n numberedListIndex++;\n } else {\n numberedListIndex = 0;\n }\n const children = await this.transformBlocks(b.children, nestingLevel + 1);\n const self = await this.mapBlock(\n b as any,\n nestingLevel,\n numberedListIndex,\n ); // TODO: any\n\n if (b.type === \"pageBreak\") {\n ret.push(self);\n continue;\n }\n\n const style = this.blocknoteDefaultPropsToReactPDFStyle(b.props as any);\n ret.push(\n <>\n <View\n style={{\n paddingVertical: 3 * PIXELS_PER_POINT,\n ...this.styles.block,\n ...style,\n }}\n >\n {self}\n </View>\n {children.length > 0 && (\n <View\n style={{\n marginLeft: FONT_SIZE * 1.5 * PIXELS_PER_POINT,\n ...this.styles.blockChildren,\n }}\n >\n {children}\n </View>\n )}\n </>,\n );\n }\n\n return ret;\n }\n\n protected async registerFonts() {\n if (this.fontsRegistered) {\n return;\n }\n\n if (this.options.emojiSource) {\n Font.registerEmojiSource(this.options.emojiSource);\n }\n let font = await loadFontDataUrl(\n await import(\"@shared/assets/fonts/inter/Inter_18pt-Regular.ttf\"),\n );\n Font.register({\n family: \"Inter\",\n src: font,\n });\n\n font = await loadFontDataUrl(\n await import(\"@shared/assets/fonts/inter/Inter_18pt-Italic.ttf\"),\n );\n Font.register({\n family: \"Inter\",\n fontStyle: \"italic\",\n src: font,\n });\n\n font = await loadFontDataUrl(\n await import(\"@shared/assets/fonts/inter/Inter_18pt-Bold.ttf\"),\n );\n Font.register({\n family: \"Inter\",\n src: font,\n fontWeight: \"bold\",\n });\n\n font = await loadFontDataUrl(\n await import(\"@shared/assets/fonts/inter/Inter_18pt-BoldItalic.ttf\"),\n );\n Font.register({\n family: \"Inter\",\n fontStyle: \"italic\",\n src: font,\n fontWeight: \"bold\",\n });\n\n font = await loadFontDataUrl(\n await import(\"@shared/assets/fonts/GeistMono-Regular.ttf\"),\n );\n Font.register({\n family: \"GeistMono\",\n src: font,\n });\n\n this.fontsRegistered = true;\n }\n\n /**\n * Convert a document (array of Blocks) to a react-pdf Document.\n */\n public async toReactPDFDocument(\n blocks: Block<B, I, S>[],\n options: {\n /**\n * Add a header to every page.\n * The React component passed must be a React-PDF component\n */\n header?: React.ReactElement;\n /**\n * Add a footer to every page.\n * The React component passed must be a React-PDF component\n */\n footer?: React.ReactElement;\n } = {},\n ) {\n await this.registerFonts();\n\n return (\n <Document>\n <Page dpi={100} size=\"A4\" style={this.styles.page}>\n {options.header && (\n <View fixed style={this.styles.header}>\n {options.header}\n </View>\n )}\n {await this.transformBlocks(blocks)}\n {options.footer && (\n <View\n fixed\n style={[\n {\n left: this.styles.page.paddingHorizontal || 0,\n bottom: (this.styles.page.paddingBottom || 0) / 2,\n right: this.styles.page.paddingHorizontal || 0,\n },\n this.styles.footer,\n ]}\n >\n {options.footer}\n </View>\n )}\n </Page>\n </Document>\n );\n }\n\n protected blocknoteDefaultPropsToReactPDFStyle(\n props: Partial<DefaultProps>,\n ): Style {\n return {\n textAlign: props.textAlignment,\n backgroundColor:\n props.backgroundColor === \"default\" || !props.backgroundColor\n ? undefined\n : this.options.colors[\n props.backgroundColor as keyof typeof this.options.colors\n ].background,\n color:\n props.textColor === \"default\" || !props.textColor\n ? undefined\n : this.options.colors[\n props.textColor as keyof typeof this.options.colors\n ].text,\n alignItems:\n props.textAlignment === \"right\"\n ? \"flex-end\"\n : props.textAlignment === \"center\"\n ? \"center\"\n : undefined,\n };\n }\n}\n"],"names":["PIXELS_PER_POINT","styles","StyleSheet","BULLET_MARKER","CHECK_MARKER_UNCHECKED","jsx","Svg","Path","CHECK_MARKER_CHECKED","ListItem","listMarker","children","style","jsxs","View","Text","Table","props","headerRows","headerCols","row","rowIndex","c","colIndex","cell","mapTableCell","isHeaderRow","isHeaderCol","FONT_SIZE","pdfBlockMappingForDefaultSchema","block","exporter","_nestingLevel","numberedListIndex","fontSizeEM","lines","_a","line","index","indent","Fragment","file","caption","t","Image","defaultText","icon","_exporter","Link","pdfInlineContentMappingForDefaultSchema","ic","content","pdfStyleMappingForDefaultSchema","val","pdfDefaultSchemaMappings","corsProxyResolveFileUrl","url","loadFileDataUrl","requireUrl","mimeType","loadFontDataUrl","PDFExporter","Exporter","schema","mappings","options","newOptions","COLORS_DEFAULT","__publicField","styledText","stylesArray","blocks","nestingLevel","ret","b","self","Font","font","Document","Page"],"mappings":"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"}
@@ -1,10 +1,10 @@
1
1
  var P = Object.defineProperty;
2
2
  var R = (t, r, e) => r in t ? P(t, r, { enumerable: !0, configurable: !0, writable: !0, value: e }) : t[r] = e;
3
3
  var x = (t, r, e) => R(t, typeof r != "symbol" ? r + "" : r, e);
4
- import { jsx as n, jsxs as f, Fragment as L } from "react/jsx-runtime";
5
- import { View as l, StyleSheet as T, Text as d, Svg as m, Path as C, Image as D, Link as V, Font as p, Document as _, Page as Z } from "@react-pdf/renderer";
4
+ import { jsx as n, jsxs as f, Fragment as V } from "react/jsx-runtime";
5
+ import { View as l, StyleSheet as M, Text as d, Svg as m, Path as C, Image as D, Link as k, Font as p, Document as _, Page as Z } from "@react-pdf/renderer";
6
6
  import { mapTableCell as F, Exporter as B, COLORS_DEFAULT as A } from "@blocknote/core";
7
- const O = 0.75, v = T.create({
7
+ const O = 0.75, T = M.create({
8
8
  listItem: {
9
9
  display: "flex",
10
10
  flexDirection: "row",
@@ -35,14 +35,14 @@ const O = 0.75, v = T.create({
35
35
  fill: "undefined",
36
36
  children: /* @__PURE__ */ n(C, { d: "m424-312 282-282-56-56-226 226-114-114-56 56 170 170ZM200-120q-33 0-56.5-23.5T120-200v-560q0-33 23.5-56.5T200-840h560q33 0 56.5 23.5T840-760v560q0 33-23.5 56.5T760-120H200Zm0-80h560v-560H200v560Zm0-560v560-560Z" })
37
37
  }
38
- ), H = ({
38
+ ), b = ({
39
39
  listMarker: t,
40
40
  children: r,
41
41
  style: e
42
- }) => /* @__PURE__ */ f(l, { style: [v.listItem, e || {}], children: [
43
- /* @__PURE__ */ n(l, { style: v.bullet, children: typeof t == "string" ? /* @__PURE__ */ n(d, { children: t }) : t }),
42
+ }) => /* @__PURE__ */ f(l, { style: [T.listItem, e || {}], children: [
43
+ /* @__PURE__ */ n(l, { style: T.bullet, children: typeof t == "string" ? /* @__PURE__ */ n(d, { children: t }) : t }),
44
44
  r
45
- ] }), k = 0.75, u = T.create({
45
+ ] }), E = 0.75, u = M.create({
46
46
  tableContainer: {
47
47
  // width: "100%",
48
48
  },
@@ -54,8 +54,8 @@ const O = 0.75, v = T.create({
54
54
  display: "flex"
55
55
  },
56
56
  cell: {
57
- paddingHorizontal: 5 * k,
58
- paddingTop: 3 * k,
57
+ paddingHorizontal: 5 * E,
58
+ paddingTop: 3 * E,
59
59
  // paddingBottom: 1 * PIXELS_PER_POINT, should be 3px but looks odd, better with no padding Bottom
60
60
  borderLeft: "1px solid #ddd",
61
61
  borderTop: "1px solid #ddd",
@@ -81,13 +81,13 @@ const O = 0.75, v = T.create({
81
81
  s === t.data.rows.length - 1 ? u.bottomCell : {}
82
82
  ],
83
83
  children: o.cells.map((c, i) => {
84
- const a = F(c), y = r[s], b = e[i];
84
+ const a = F(c), y = r[s], H = e[i];
85
85
  return /* @__PURE__ */ n(
86
86
  l,
87
87
  {
88
88
  style: [
89
89
  u.cell,
90
- y || b ? u.headerCell : {},
90
+ y || H ? u.headerCell : {},
91
91
  i === o.cells.length - 1 ? u.rightCell : {},
92
92
  t.data.columnWidths[i] ? { width: t.data.columnWidths[i] } : { flex: 1 },
93
93
  {
@@ -104,14 +104,14 @@ const O = 0.75, v = T.create({
104
104
  },
105
105
  s
106
106
  )) });
107
- }, h = 0.75, M = 16, N = {
107
+ }, h = 0.75, I = 16, N = {
108
108
  paragraph: (t, r) => /* @__PURE__ */ n(d, { children: r.transformInlineContent(t.content) }),
109
- bulletListItem: (t, r) => /* @__PURE__ */ n(H, { listMarker: W, children: /* @__PURE__ */ n(d, { children: r.transformInlineContent(t.content) }) }),
110
- numberedListItem: (t, r, e, o) => /* @__PURE__ */ n(H, { listMarker: `${o}.`, children: /* @__PURE__ */ n(d, { children: r.transformInlineContent(t.content) }) }),
109
+ bulletListItem: (t, r) => /* @__PURE__ */ n(b, { listMarker: W, children: /* @__PURE__ */ n(d, { children: r.transformInlineContent(t.content) }) }),
110
+ numberedListItem: (t, r, e, o) => /* @__PURE__ */ n(b, { listMarker: `${o}.`, children: /* @__PURE__ */ n(d, { children: r.transformInlineContent(t.content) }) }),
111
111
  // would be nice to have pdf checkboxes:
112
112
  // https://github.com/diegomura/react-pdf/issues/2103
113
113
  checkListItem: (t, r) => /* @__PURE__ */ n(
114
- H,
114
+ b,
115
115
  {
116
116
  listMarker: t.props.checked ? z : j,
117
117
  children: /* @__PURE__ */ n(d, { children: r.transformInlineContent(t.content) })
@@ -123,7 +123,7 @@ const O = 0.75, v = T.create({
123
123
  d,
124
124
  {
125
125
  style: {
126
- fontSize: e * M * h,
126
+ fontSize: e * I * h,
127
127
  fontWeight: 700
128
128
  },
129
129
  children: r.transformInlineContent(t.content)
@@ -153,7 +153,7 @@ const O = 0.75, v = T.create({
153
153
  style: {
154
154
  marginLeft: i * 9.5 * h
155
155
  },
156
- children: s.trimStart() || /* @__PURE__ */ n(L, { children: " " })
156
+ children: s.trimStart() || /* @__PURE__ */ n(V, { children: " " })
157
157
  },
158
158
  `line_${c}`
159
159
  );
@@ -167,7 +167,7 @@ const O = 0.75, v = T.create({
167
167
  backgroundColor: "#161616",
168
168
  color: "#ffffff",
169
169
  lineHeight: 1.25,
170
- fontSize: M * h,
170
+ fontSize: I * h,
171
171
  fontFamily: "GeistMono"
172
172
  },
173
173
  children: e
@@ -205,7 +205,7 @@ const O = 0.75, v = T.create({
205
205
  {
206
206
  src: await r.resolveFile(t.props.url),
207
207
  style: {
208
- width: t.props.previewWidth * h
208
+ width: t.props.previewWidth ? t.props.previewWidth * h : void 0
209
209
  }
210
210
  }
211
211
  ),
@@ -214,7 +214,7 @@ const O = 0.75, v = T.create({
214
214
  table: (t, r) => /* @__PURE__ */ n(q, { data: t.content, transformer: r })
215
215
  };
216
216
  function S(t, r, e, o) {
217
- return /* @__PURE__ */ n(V, { src: t.url, children: /* @__PURE__ */ f(
217
+ return /* @__PURE__ */ n(k, { src: t.url, children: /* @__PURE__ */ f(
218
218
  l,
219
219
  {
220
220
  style: {
@@ -236,14 +236,14 @@ function w(t, r) {
236
236
  {
237
237
  style: {
238
238
  width: t.previewWidth ? t.previewWidth * h : void 0,
239
- fontSize: M * 0.8 * h
239
+ fontSize: I * 0.8 * h
240
240
  },
241
241
  children: t.caption
242
242
  }
243
243
  );
244
244
  }
245
245
  const U = {
246
- link: (t, r) => /* @__PURE__ */ n(V, { href: t.href, children: t.content.map((e) => r.transformStyledText(e)) }),
246
+ link: (t, r) => /* @__PURE__ */ n(k, { href: t.href, children: t.content.map((e) => r.transformStyledText(e)) }),
247
247
  text: (t, r) => r.transformStyledText(t)
248
248
  }, K = {
249
249
  bold: (t) => t ? {
@@ -282,7 +282,7 @@ async function X(t, r) {
282
282
  async function g(t) {
283
283
  return X(t);
284
284
  }
285
- const E = 16, I = 0.75;
285
+ const L = 16, v = 0.75;
286
286
  class et extends B {
287
287
  constructor(e, o, s) {
288
288
  const i = {
@@ -298,13 +298,13 @@ class et extends B {
298
298
  };
299
299
  super(e, o, i);
300
300
  x(this, "fontsRegistered", !1);
301
- x(this, "styles", T.create({
301
+ x(this, "styles", M.create({
302
302
  page: {
303
303
  paddingTop: 35,
304
304
  paddingBottom: 65,
305
305
  paddingHorizontal: 35,
306
306
  fontFamily: "Inter",
307
- fontSize: E * I,
307
+ fontSize: L * v,
308
308
  // pixels
309
309
  lineHeight: 1.5
310
310
  },
@@ -342,16 +342,16 @@ class et extends B {
342
342
  s.push(y);
343
343
  continue;
344
344
  }
345
- const b = this.blocknoteDefaultPropsToReactPDFStyle(i.props);
345
+ const H = this.blocknoteDefaultPropsToReactPDFStyle(i.props);
346
346
  s.push(
347
- /* @__PURE__ */ f(L, { children: [
347
+ /* @__PURE__ */ f(V, { children: [
348
348
  /* @__PURE__ */ n(
349
349
  l,
350
350
  {
351
351
  style: {
352
- paddingVertical: 3 * I,
352
+ paddingVertical: 3 * v,
353
353
  ...this.styles.block,
354
- ...b
354
+ ...H
355
355
  },
356
356
  children: y
357
357
  }
@@ -360,7 +360,7 @@ class et extends B {
360
360
  l,
361
361
  {
362
362
  style: {
363
- marginLeft: E * 1.5 * I,
363
+ marginLeft: L * 1.5 * v,
364
364
  ...this.styles.blockChildren
365
365
  },
366
366
  children: a
@@ -1 +1 @@
1
- {"version":3,"file":"blocknote-xl-pdf-exporter.js","sources":["../src/pdf/util/listItem.tsx","../src/pdf/util/table/Table.tsx","../src/pdf/defaultSchema/blocks.tsx","../src/pdf/defaultSchema/inlinecontent.tsx","../src/pdf/defaultSchema/styles.tsx","../src/pdf/defaultSchema/index.ts","../../../shared/api/corsProxy.ts","../../../shared/util/fileUtil.ts","../src/pdf/pdfExporter.tsx"],"sourcesContent":["import { Path, StyleSheet, Svg, Text, View } from \"@react-pdf/renderer\";\nimport { Style } from \"../types.js\";\n\n// https://github.com/diegomura/react-pdf/issues/134\n\nconst PIXELS_PER_POINT = 0.75;\n\nconst styles = StyleSheet.create({\n listItem: {\n display: \"flex\",\n flexDirection: \"row\",\n gap: 8 * PIXELS_PER_POINT,\n paddingRight: 10, // otherwise text overflows, seems like a react-pdf / yoga bug\n },\n bullet: {\n // fontFamily: \"\", // we could add symbol font if we don't want to use inter (default font) here\n },\n});\n\nexport const BULLET_MARKER = \"\\u2022\";\n\n// https://fonts.google.com/icons?selected=Material+Symbols+Outlined:check_box_outline_blank:FILL@0;wght@400;GRAD@0;opsz@24&icon.size=24&icon.color=undefined\nexport const CHECK_MARKER_UNCHECKED = (\n <Svg\n style={{ marginTop: 2 }}\n height=\"12\"\n viewBox=\"0 -960 960 960\"\n width=\"12\"\n fill=\"undefined\">\n <Path d=\"M200-120q-33 0-56.5-23.5T120-200v-560q0-33 23.5-56.5T200-840h560q33 0 56.5 23.5T840-760v560q0 33-23.5 56.5T760-120H200Zm0-80h560v-560H200v560Z\" />\n </Svg>\n);\n\n// https://fonts.google.com/icons?selected=Material+Symbols+Outlined:check_box:FILL@0;wght@400;GRAD@0;opsz@24&icon.size=24&icon.color=undefined\nexport const CHECK_MARKER_CHECKED = (\n <Svg\n style={{ marginTop: 2 }}\n height=\"12\"\n viewBox=\"0 -960 960 960\"\n width=\"12\"\n fill=\"undefined\">\n <Path d=\"m424-312 282-282-56-56-226 226-114-114-56 56 170 170ZM200-120q-33 0-56.5-23.5T120-200v-560q0-33 23.5-56.5T200-840h560q33 0 56.5 23.5T840-760v560q0 33-23.5 56.5T760-120H200Zm0-80h560v-560H200v560Zm0-560v560-560Z\" />\n </Svg>\n);\n\nexport const ListItem = ({\n listMarker,\n children,\n style,\n}: {\n listMarker: string | React.ReactNode;\n children: React.ReactNode;\n style?: Style;\n}) => {\n return (\n <View style={[styles.listItem, style || {}]}>\n <View style={styles.bullet}>\n {/* <Svg width={2} height={2}>\n <Circle cx=\"1\" cy=\"1\" r=\"2\" fill=\"black\" />\n </Svg> */}\n {typeof listMarker === \"string\" ? (\n <Text>{listMarker}</Text>\n ) : (\n listMarker\n )}\n </View>\n {children}\n </View>\n );\n};\n","import {\n Exporter,\n InlineContentSchema,\n mapTableCell,\n StyleSchema,\n TableContent,\n} from \"@blocknote/core\";\nimport { StyleSheet, View } from \"@react-pdf/renderer\";\nconst PIXELS_PER_POINT = 0.75;\n\n// ( impossible?) to make tables with flex that don't have a fixed / 100% width?\n// we'd need to measure the width of every column manually\nconst styles = StyleSheet.create({\n tableContainer: {\n // width: \"100%\",\n },\n row: {\n flexDirection: \"row\",\n flexWrap: \"wrap\",\n // width: \"100%\",\n // justifyContent: \"space-between\",\n display: \"flex\",\n },\n cell: {\n paddingHorizontal: 5 * PIXELS_PER_POINT,\n paddingTop: 3 * PIXELS_PER_POINT,\n // paddingBottom: 1 * PIXELS_PER_POINT, should be 3px but looks odd, better with no padding Bottom\n borderLeft: \"1px solid #ddd\",\n borderTop: \"1px solid #ddd\",\n wordWrap: \"break-word\",\n whiteSpace: \"pre-wrap\",\n },\n headerCell: {\n fontWeight: \"bold\",\n },\n bottomCell: {\n borderBottom: \"1px solid #ddd\",\n },\n rightCell: {\n borderRight: \"1px solid #ddd\",\n },\n});\n\nexport const Table = (props: {\n data: TableContent<InlineContentSchema>;\n transformer: Exporter<\n any,\n InlineContentSchema,\n StyleSchema,\n any,\n any,\n any,\n any\n >;\n}) => {\n // If headerRows is 1, then the first row is a header row\n const headerRows = new Array(props.data.headerRows ?? 0).fill(true);\n // If headerCols is 1, then the first column is a header column\n const headerCols = new Array(props.data.headerCols ?? 0).fill(true);\n\n return (\n <View style={styles.tableContainer} wrap={false}>\n {props.data.rows.map((row, rowIndex) => (\n <View\n style={[\n styles.row,\n rowIndex === props.data.rows.length - 1 ? styles.bottomCell : {},\n ]}\n key={rowIndex}>\n {row.cells.map((c, colIndex) => {\n const cell = mapTableCell(c);\n\n const isHeaderRow = headerRows[rowIndex];\n const isHeaderCol = headerCols[colIndex];\n\n // TODO we need to support for colspan and rowspan, but at the moment are blocked by react-pdf\n return (\n <View\n style={[\n styles.cell,\n isHeaderRow || isHeaderCol ? styles.headerCell : {},\n colIndex === row.cells.length - 1 ? styles.rightCell : {},\n props.data.columnWidths[colIndex]\n ? { width: props.data.columnWidths[colIndex] }\n : { flex: 1 },\n {\n color:\n cell.props.textColor === \"default\"\n ? undefined\n : props.transformer.options.colors[\n cell.props\n .textColor as keyof typeof props.transformer.options.colors\n ].text,\n backgroundColor:\n cell.props.backgroundColor === \"default\"\n ? undefined\n : props.transformer.options.colors[\n cell.props\n .backgroundColor as keyof typeof props.transformer.options.colors\n ].background,\n textAlign: cell.props.textAlignment,\n },\n ]}\n key={colIndex}>\n {props.transformer.transformInlineContent(cell.content)}\n </View>\n );\n })}\n </View>\n ))}\n </View>\n );\n};\n","import {\n BlockMapping,\n DefaultBlockSchema,\n DefaultProps,\n pageBreakSchema,\n StyledText,\n} from \"@blocknote/core\";\nimport { Image, Link, Path, Svg, Text, View } from \"@react-pdf/renderer\";\nimport {\n BULLET_MARKER,\n CHECK_MARKER_CHECKED,\n CHECK_MARKER_UNCHECKED,\n ListItem,\n} from \"../util/listItem.js\";\nimport { Table } from \"../util/table/Table.js\";\n\nconst PIXELS_PER_POINT = 0.75;\nconst FONT_SIZE = 16;\n\nexport const pdfBlockMappingForDefaultSchema: BlockMapping<\n DefaultBlockSchema & typeof pageBreakSchema.blockSchema,\n any,\n any,\n React.ReactElement<Text>,\n React.ReactElement<Text> | React.ReactElement<Link>\n> = {\n paragraph: (block, exporter) => {\n // const style = blocknoteDefaultPropsToReactPDFStyle(block.props);\n return <Text>{exporter.transformInlineContent(block.content)}</Text>;\n },\n bulletListItem: (block, exporter) => {\n // const style = t(block.props);\n return (\n <ListItem listMarker={BULLET_MARKER}>\n <Text>{exporter.transformInlineContent(block.content)}</Text>\n </ListItem>\n );\n },\n numberedListItem: (block, exporter, _nestingLevel, numberedListIndex) => {\n // const style = blocknoteDefaultPropsToReactPDFStyle(block.props);\n // console.log(\"NUMBERED LIST ITEM\", block.props.textAlignment, style);\n return (\n <ListItem listMarker={`${numberedListIndex}.`}>\n <Text>{exporter.transformInlineContent(block.content)}</Text>\n </ListItem>\n );\n },\n // would be nice to have pdf checkboxes:\n // https://github.com/diegomura/react-pdf/issues/2103\n checkListItem: (block, exporter) => {\n return (\n <ListItem\n listMarker={\n block.props.checked ? CHECK_MARKER_CHECKED : CHECK_MARKER_UNCHECKED\n }>\n <Text>{exporter.transformInlineContent(block.content)}</Text>\n </ListItem>\n );\n },\n heading: (block, exporter) => {\n const fontSizeEM =\n block.props.level === 1 ? 2 : block.props.level === 2 ? 1.5 : 1.17;\n return (\n <Text\n style={{\n fontSize: fontSizeEM * FONT_SIZE * PIXELS_PER_POINT,\n fontWeight: 700,\n }}>\n {exporter.transformInlineContent(block.content)}\n </Text>\n );\n },\n quote: (block, exporter) => {\n return (\n <Text\n style={{\n borderLeft: \"#7D797A\",\n color: \"#7D797A\",\n paddingLeft: 9.5 * PIXELS_PER_POINT,\n }}>\n {exporter.transformInlineContent(block.content)}\n </Text>\n );\n },\n codeBlock: (block) => {\n const textContent = (block.content as StyledText<any>[])[0]?.text || \"\";\n const lines = textContent.split(\"\\n\").map((line, index) => {\n const indent = line.match(/^\\s*/)?.[0].length || 0;\n\n return (\n <Text\n key={`line_${index}`}\n style={{\n marginLeft: indent * 9.5 * PIXELS_PER_POINT,\n }}>\n {line.trimStart() || <>&nbsp;</>}\n </Text>\n );\n });\n\n return (\n <View\n wrap={false}\n style={{\n padding: 24 * PIXELS_PER_POINT,\n backgroundColor: \"#161616\",\n color: \"#ffffff\",\n lineHeight: 1.25,\n fontSize: FONT_SIZE * PIXELS_PER_POINT,\n fontFamily: \"GeistMono\",\n }}>\n {lines}\n </View>\n );\n },\n pageBreak: () => {\n return <View break />;\n },\n audio: (block, exporter) => {\n return (\n <View wrap={false}>\n {file(\n block.props,\n \"Open audio file\",\n <Svg height={14} width={14} viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <Path d=\"M2 16.0001H5.88889L11.1834 20.3319C11.2727 20.405 11.3846 20.4449 11.5 20.4449C11.7761 20.4449 12 20.2211 12 19.9449V4.05519C12 3.93977 11.9601 3.8279 11.887 3.73857C11.7121 3.52485 11.3971 3.49335 11.1834 3.66821L5.88889 8.00007H2C1.44772 8.00007 1 8.44778 1 9.00007V15.0001C1 15.5524 1.44772 16.0001 2 16.0001ZM23 12C23 15.292 21.5539 18.2463 19.2622 20.2622L17.8445 18.8444C19.7758 17.1937 21 14.7398 21 12C21 9.26016 19.7758 6.80629 17.8445 5.15557L19.2622 3.73779C21.5539 5.75368 23 8.70795 23 12ZM18 12C18 10.0883 17.106 8.38548 15.7133 7.28673L14.2842 8.71584C15.3213 9.43855 16 10.64 16 12C16 13.36 15.3213 14.5614 14.2842 15.2841L15.7133 16.7132C17.106 15.6145 18 13.9116 18 12Z\"></Path>\n </Svg>,\n exporter\n )}\n {caption(block.props, exporter)}\n </View>\n );\n },\n video: (block, exporter) => {\n return (\n <View wrap={false}>\n {file(\n block.props,\n \"Open video file\",\n <Svg height={14} width={14} viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <Path d=\"M2 3.9934C2 3.44476 2.45531 3 2.9918 3H21.0082C21.556 3 22 3.44495 22 3.9934V20.0066C22 20.5552 21.5447 21 21.0082 21H2.9918C2.44405 21 2 20.5551 2 20.0066V3.9934ZM8 5V19H16V5H8ZM4 5V7H6V5H4ZM18 5V7H20V5H18ZM4 9V11H6V9H4ZM18 9V11H20V9H18ZM4 13V15H6V13H4ZM18 13V15H20V13H18ZM4 17V19H6V17H4ZM18 17V19H20V17H18Z\" />\n </Svg>,\n exporter\n )}\n {caption(block.props, exporter)}\n </View>\n );\n },\n file: (block, exporter) => {\n return (\n <View wrap={false}>\n {file(\n block.props,\n \"Open file\",\n <Svg height={16} width={16} viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <Path d=\"M3 8L9.00319 2H19.9978C20.5513 2 21 2.45531 21 2.9918V21.0082C21 21.556 20.5551 22 20.0066 22H3.9934C3.44476 22 3 21.5501 3 20.9932V8ZM10 4V9H5V20H19V4H10Z\" />\n </Svg>,\n exporter\n )}\n {caption(block.props, exporter)}\n </View>\n );\n },\n image: async (block, t) => {\n return (\n <View wrap={false}>\n <Image\n src={await t.resolveFile(block.props.url)}\n style={{\n width: block.props.previewWidth * PIXELS_PER_POINT,\n }}\n />\n {caption(block.props, t)}\n </View>\n );\n },\n table: (block, t) => {\n return <Table data={block.content} transformer={t} />;\n },\n};\n\nfunction file(\n props: Partial<DefaultProps & { name: string; url: string }>,\n defaultText: string,\n icon: React.ReactElement<Svg>,\n _exporter: any\n) {\n const PIXELS_PER_POINT = 0.75;\n return (\n <Link src={props.url}>\n <View\n style={{\n display: \"flex\",\n gap: 8 * PIXELS_PER_POINT,\n flexDirection: \"row\",\n }}>\n {icon}\n <Text>{props.name || defaultText}</Text>\n </View>\n </Link>\n );\n}\n\nfunction caption(\n props: Partial<DefaultProps & { caption: string; previewWidth: number }>,\n _exporter: any\n) {\n if (!props.caption) {\n return undefined;\n }\n return (\n <Text\n style={{\n width: props.previewWidth\n ? props.previewWidth * PIXELS_PER_POINT\n : undefined,\n fontSize: FONT_SIZE * 0.8 * PIXELS_PER_POINT,\n }}>\n {props.caption}\n </Text>\n );\n}\n","import {\n DefaultInlineContentSchema,\n InlineContentMapping,\n} from \"@blocknote/core\";\nimport { Link, Text } from \"@react-pdf/renderer\";\n\nexport const pdfInlineContentMappingForDefaultSchema: InlineContentMapping<\n DefaultInlineContentSchema,\n any,\n React.ReactElement<Link> | React.ReactElement<Text>,\n React.ReactElement<Text>\n> = {\n link: (ic, exporter) => {\n return (\n <Link href={ic.href}>\n {ic.content.map((content) => exporter.transformStyledText(content))}\n </Link>\n );\n },\n text: (ic, exporter) => {\n return exporter.transformStyledText(ic);\n },\n};\n","import { DefaultStyleSchema, StyleMapping } from \"@blocknote/core\";\nimport { TextProps } from \"@react-pdf/renderer\";\n\nexport const pdfStyleMappingForDefaultSchema: StyleMapping<\n DefaultStyleSchema,\n TextProps[\"style\"]\n> = {\n bold: (val) => {\n if (!val) {\n return {};\n }\n return {\n fontWeight: \"bold\",\n };\n },\n italic: (val) => {\n if (!val) {\n return {};\n }\n return {\n fontStyle: \"italic\",\n };\n },\n underline: (val) => {\n if (!val) {\n return {};\n }\n return {\n textDecoration: \"underline\", // TODO: could conflict with strike\n };\n },\n strike: (val) => {\n if (!val) {\n return {};\n }\n return {\n textDecoration: \"line-through\",\n };\n },\n backgroundColor: (val, exporter) => {\n if (!val) {\n return {};\n }\n return {\n backgroundColor:\n exporter.options.colors[val as keyof typeof exporter.options.colors]\n .background,\n };\n },\n textColor: (val, exporter) => {\n if (!val) {\n return {};\n }\n return {\n color:\n exporter.options.colors[val as keyof typeof exporter.options.colors]\n .text,\n };\n },\n code: (val) => {\n if (!val) {\n return {};\n }\n return {\n fontFamily: \"GeistMono\",\n };\n },\n};\n","import { pdfBlockMappingForDefaultSchema } from \"./blocks.js\";\nimport { pdfInlineContentMappingForDefaultSchema } from \"./inlinecontent.js\";\nimport { pdfStyleMappingForDefaultSchema } from \"./styles.js\";\n\nexport const pdfDefaultSchemaMappings: {\n blockMapping: typeof pdfBlockMappingForDefaultSchema;\n inlineContentMapping: typeof pdfInlineContentMappingForDefaultSchema;\n styleMapping: typeof pdfStyleMappingForDefaultSchema;\n} = {\n blockMapping: pdfBlockMappingForDefaultSchema,\n inlineContentMapping: pdfInlineContentMappingForDefaultSchema,\n styleMapping: pdfStyleMappingForDefaultSchema,\n};\n","export async function corsProxyResolveFileUrl(url: string) {\n return (\n \"https://corsproxy.api.blocknotejs.org/corsproxy/?url=\" +\n encodeURIComponent(url)\n );\n}\n","/**\n *\n * Helper functions so that we can import files both on vitest, browser and node\n * TODO: should find a way to test automatically in all environments\n */\n\nexport async function loadFileDataUrl(\n requireUrl: { default: string },\n mimeType: string\n) {\n if (import.meta.env.NODE_ENV === \"test\") {\n const buffer = await loadFileBuffer(requireUrl);\n const fileBase64 = buffer.toString(\"base64\");\n\n const dataUrl = `data:${mimeType};base64,${fileBase64}`;\n return dataUrl;\n } else {\n // in browser, this is already a data url\n return requireUrl.default as string;\n }\n}\n\nexport async function loadFontDataUrl(requireUrl: { default: string }) {\n return loadFileDataUrl(requireUrl, \"font/ttf\");\n}\n\nexport async function loadFileBuffer(requireUrl: {\n default: string;\n}): Promise<Buffer | ArrayBuffer> {\n if (import.meta.env.NODE_ENV === \"test\") {\n // in vitest, this is the url we need to load with readfilesync\n // eslint-disable-next-line\n const fs = require(\"fs\");\n let url = requireUrl.default;\n\n if (url.startsWith(\"/@fs/\")) {\n url = url.substring(\"/@fs\".length);\n }\n const buffer = fs.readFileSync(url);\n return buffer;\n } else {\n // in browser, this is already a data url\n const dataUrl = requireUrl.default as string;\n // convert to buffer on browser\n const response = await fetch(dataUrl);\n const arrayBuffer = await response.arrayBuffer();\n return arrayBuffer;\n }\n}\n\n/**\n * usage:\n * \n * await loadFontDataUrl(\n await import(\"../fonts/inter/Inter_18pt-Italic.ttf\")\n );\n */\n","import {\n Block,\n BlockNoteSchema,\n BlockSchema,\n COLORS_DEFAULT,\n DefaultProps,\n Exporter,\n ExporterOptions,\n InlineContentSchema,\n StyleSchema,\n StyledText,\n} from \"@blocknote/core\";\nimport {\n Document,\n Font,\n Link,\n Page,\n StyleSheet,\n Text,\n TextProps,\n View,\n} from \"@react-pdf/renderer\";\nimport { corsProxyResolveFileUrl } from \"@shared/api/corsProxy.js\";\nimport { loadFontDataUrl } from \"../../../../shared/util/fileUtil.js\";\n\nimport { Style } from \"./types.js\";\n\nconst FONT_SIZE = 16;\nconst PIXELS_PER_POINT = 0.75;\n\ntype Options = ExporterOptions & {\n /**\n *\n * @default uses the remote emoji source hosted on cloudflare (https://cdnjs.cloudflare.com/ajax/libs/twemoji/14.0.2/72x72/)\n */\n emojiSource: false | ReturnType<typeof Font.getEmojiSource>;\n};\n\n/**\n * Exports a BlockNote document to a .pdf file using the react-pdf library.\n */\nexport class PDFExporter<\n B extends BlockSchema,\n S extends StyleSchema,\n I extends InlineContentSchema\n> extends Exporter<\n B,\n I,\n S,\n React.ReactElement<Text>,\n React.ReactElement<Link> | React.ReactElement<Text>,\n TextProps[\"style\"],\n React.ReactElement<Text>\n> {\n private fontsRegistered = false;\n\n public styles = StyleSheet.create({\n page: {\n paddingTop: 35,\n paddingBottom: 65,\n paddingHorizontal: 35,\n fontFamily: \"Inter\",\n fontSize: FONT_SIZE * PIXELS_PER_POINT, // pixels\n lineHeight: 1.5,\n },\n block: {},\n blockChildren: {},\n header: {},\n footer: {\n position: \"absolute\",\n },\n });\n\n public readonly options: Options;\n\n public constructor(\n /**\n * The schema of your editor. The mappings are automatically typed checked against this schema.\n */\n protected readonly schema: BlockNoteSchema<B, I, S>,\n /**\n * The mappings that map the BlockNote schema to the react-pdf content.\n *\n * Pass {@link pdfDefaultSchemaMappings} for the default schema.\n */\n mappings: Exporter<\n NoInfer<B>,\n NoInfer<I>,\n NoInfer<S>,\n React.ReactElement<Text>, // RB\n React.ReactElement<Link> | React.ReactElement<Text>, // RI\n TextProps[\"style\"], // RS\n React.ReactElement<Text> // TS\n >[\"mappings\"],\n options?: Partial<Options>\n ) {\n const defaults = {\n emojiSource: {\n format: \"png\",\n url: \"https://cdnjs.cloudflare.com/ajax/libs/twemoji/14.0.2/72x72/\",\n },\n resolveFileUrl: corsProxyResolveFileUrl,\n colors: COLORS_DEFAULT,\n } satisfies Partial<Options>;\n\n const newOptions = {\n ...defaults,\n ...options,\n };\n super(schema, mappings, newOptions);\n this.options = newOptions;\n }\n\n /**\n * Mostly for internal use, you probably want to use `toBlob` or `toReactPDFDocument` instead.\n */\n public transformStyledText(styledText: StyledText<S>) {\n const stylesArray = this.mapStyles(styledText.styles);\n const styles = Object.assign({}, ...stylesArray);\n return <Text style={styles}>{styledText.text}</Text>;\n }\n\n /**\n * Mostly for internal use, you probably want to use `toBlob` or `toReactPDFDocument` instead.\n */\n public async transformBlocks(\n blocks: Block<B, I, S>[], // Or BlockFromConfig<B[keyof B], I, S>?\n nestingLevel = 0\n ): Promise<React.ReactElement<Text>[]> {\n const ret: React.ReactElement<Text>[] = [];\n let numberedListIndex = 0;\n\n for (const b of blocks) {\n if (b.type === \"numberedListItem\") {\n numberedListIndex++;\n } else {\n numberedListIndex = 0;\n }\n const children = await this.transformBlocks(b.children, nestingLevel + 1);\n const self = await this.mapBlock(\n b as any,\n nestingLevel,\n numberedListIndex\n ); // TODO: any\n\n if (b.type === \"pageBreak\") {\n ret.push(self);\n continue;\n }\n\n const style = this.blocknoteDefaultPropsToReactPDFStyle(b.props as any);\n ret.push(\n <>\n <View\n style={{\n paddingVertical: 3 * PIXELS_PER_POINT,\n ...this.styles.block,\n ...style,\n }}>\n {self}\n </View>\n {children.length > 0 && (\n <View\n style={{\n marginLeft: FONT_SIZE * 1.5 * PIXELS_PER_POINT,\n ...this.styles.blockChildren,\n }}>\n {children}\n </View>\n )}\n </>\n );\n }\n\n return ret;\n }\n\n protected async registerFonts() {\n if (this.fontsRegistered) {\n return;\n }\n\n if (this.options.emojiSource) {\n Font.registerEmojiSource(this.options.emojiSource);\n }\n let font = await loadFontDataUrl(\n await import(\"@shared/assets/fonts/inter/Inter_18pt-Regular.ttf\")\n );\n Font.register({\n family: \"Inter\",\n src: font,\n });\n\n font = await loadFontDataUrl(\n await import(\"@shared/assets/fonts/inter/Inter_18pt-Italic.ttf\")\n );\n Font.register({\n family: \"Inter\",\n fontStyle: \"italic\",\n src: font,\n });\n\n font = await loadFontDataUrl(\n await import(\"@shared/assets/fonts/inter/Inter_18pt-Bold.ttf\")\n );\n Font.register({\n family: \"Inter\",\n src: font,\n fontWeight: \"bold\",\n });\n\n font = await loadFontDataUrl(\n await import(\"@shared/assets/fonts/inter/Inter_18pt-BoldItalic.ttf\")\n );\n Font.register({\n family: \"Inter\",\n fontStyle: \"italic\",\n src: font,\n fontWeight: \"bold\",\n });\n\n font = await loadFontDataUrl(\n await import(\"@shared/assets/fonts/GeistMono-Regular.ttf\")\n );\n Font.register({\n family: \"GeistMono\",\n src: font,\n });\n\n this.fontsRegistered = true;\n }\n\n /**\n * Convert a document (array of Blocks) to a react-pdf Document.\n */\n public async toReactPDFDocument(\n blocks: Block<B, I, S>[],\n options: {\n /**\n * Add a header to every page.\n * The React component passed must be a React-PDF component\n */\n header?: React.ReactElement;\n /**\n * Add a footer to every page.\n * The React component passed must be a React-PDF component\n */\n footer?: React.ReactElement;\n } = {}\n ) {\n await this.registerFonts();\n\n return (\n <Document>\n <Page dpi={100} size=\"A4\" style={this.styles.page}>\n {options.header && (\n <View fixed style={this.styles.header}>\n {options.header}\n </View>\n )}\n {await this.transformBlocks(blocks)}\n {options.footer && (\n <View\n fixed\n style={[\n {\n left: this.styles.page.paddingHorizontal || 0,\n bottom: (this.styles.page.paddingBottom || 0) / 2,\n right: this.styles.page.paddingHorizontal || 0,\n },\n this.styles.footer,\n ]}>\n {options.footer}\n </View>\n )}\n </Page>\n </Document>\n );\n }\n\n protected blocknoteDefaultPropsToReactPDFStyle(\n props: Partial<DefaultProps>\n ): Style {\n return {\n textAlign: props.textAlignment,\n backgroundColor:\n props.backgroundColor === \"default\" || !props.backgroundColor\n ? undefined\n : this.options.colors[\n props.backgroundColor as keyof typeof this.options.colors\n ].background,\n color:\n props.textColor === \"default\" || !props.textColor\n ? undefined\n : this.options.colors[\n props.textColor as keyof typeof this.options.colors\n ].text,\n alignItems:\n props.textAlignment === \"right\"\n ? \"flex-end\"\n : props.textAlignment === \"center\"\n ? \"center\"\n : undefined,\n };\n }\n}\n"],"names":["PIXELS_PER_POINT","styles","StyleSheet","BULLET_MARKER","CHECK_MARKER_UNCHECKED","jsx","Svg","Path","CHECK_MARKER_CHECKED","ListItem","listMarker","children","style","jsxs","View","Text","Table","props","headerRows","headerCols","row","rowIndex","colIndex","cell","mapTableCell","isHeaderRow","isHeaderCol","FONT_SIZE","pdfBlockMappingForDefaultSchema","block","exporter","_nestingLevel","numberedListIndex","fontSizeEM","lines","_a","line","index","indent","Fragment","file","caption","t","Image","defaultText","icon","_exporter","Link","pdfInlineContentMappingForDefaultSchema","ic","content","pdfStyleMappingForDefaultSchema","val","pdfDefaultSchemaMappings","corsProxyResolveFileUrl","url","loadFileDataUrl","requireUrl","mimeType","loadFontDataUrl","PDFExporter","Exporter","schema","mappings","options","newOptions","COLORS_DEFAULT","__publicField","styledText","stylesArray","blocks","nestingLevel","ret","b","self","Font","font","Document","Page"],"mappings":"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"}
1
+ {"version":3,"file":"blocknote-xl-pdf-exporter.js","sources":["../src/pdf/util/listItem.tsx","../src/pdf/util/table/Table.tsx","../src/pdf/defaultSchema/blocks.tsx","../src/pdf/defaultSchema/inlinecontent.tsx","../src/pdf/defaultSchema/styles.tsx","../src/pdf/defaultSchema/index.ts","../../../shared/api/corsProxy.ts","../../../shared/util/fileUtil.ts","../src/pdf/pdfExporter.tsx"],"sourcesContent":["import { Path, StyleSheet, Svg, Text, View } from \"@react-pdf/renderer\";\nimport { Style } from \"../types.js\";\n\n// https://github.com/diegomura/react-pdf/issues/134\n\nconst PIXELS_PER_POINT = 0.75;\n\nconst styles = StyleSheet.create({\n listItem: {\n display: \"flex\",\n flexDirection: \"row\",\n gap: 8 * PIXELS_PER_POINT,\n paddingRight: 10, // otherwise text overflows, seems like a react-pdf / yoga bug\n },\n bullet: {\n // fontFamily: \"\", // we could add symbol font if we don't want to use inter (default font) here\n },\n});\n\nexport const BULLET_MARKER = \"\\u2022\";\n\n// https://fonts.google.com/icons?selected=Material+Symbols+Outlined:check_box_outline_blank:FILL@0;wght@400;GRAD@0;opsz@24&icon.size=24&icon.color=undefined\nexport const CHECK_MARKER_UNCHECKED = (\n <Svg\n style={{ marginTop: 2 }}\n height=\"12\"\n viewBox=\"0 -960 960 960\"\n width=\"12\"\n fill=\"undefined\"\n >\n <Path d=\"M200-120q-33 0-56.5-23.5T120-200v-560q0-33 23.5-56.5T200-840h560q33 0 56.5 23.5T840-760v560q0 33-23.5 56.5T760-120H200Zm0-80h560v-560H200v560Z\" />\n </Svg>\n);\n\n// https://fonts.google.com/icons?selected=Material+Symbols+Outlined:check_box:FILL@0;wght@400;GRAD@0;opsz@24&icon.size=24&icon.color=undefined\nexport const CHECK_MARKER_CHECKED = (\n <Svg\n style={{ marginTop: 2 }}\n height=\"12\"\n viewBox=\"0 -960 960 960\"\n width=\"12\"\n fill=\"undefined\"\n >\n <Path d=\"m424-312 282-282-56-56-226 226-114-114-56 56 170 170ZM200-120q-33 0-56.5-23.5T120-200v-560q0-33 23.5-56.5T200-840h560q33 0 56.5 23.5T840-760v560q0 33-23.5 56.5T760-120H200Zm0-80h560v-560H200v560Zm0-560v560-560Z\" />\n </Svg>\n);\n\nexport const ListItem = ({\n listMarker,\n children,\n style,\n}: {\n listMarker: string | React.ReactNode;\n children: React.ReactNode;\n style?: Style;\n}) => {\n return (\n <View style={[styles.listItem, style || {}]}>\n <View style={styles.bullet}>\n {/* <Svg width={2} height={2}>\n <Circle cx=\"1\" cy=\"1\" r=\"2\" fill=\"black\" />\n </Svg> */}\n {typeof listMarker === \"string\" ? (\n <Text>{listMarker}</Text>\n ) : (\n listMarker\n )}\n </View>\n {children}\n </View>\n );\n};\n","import {\n Exporter,\n InlineContentSchema,\n mapTableCell,\n StyleSchema,\n TableContent,\n} from \"@blocknote/core\";\nimport { StyleSheet, View } from \"@react-pdf/renderer\";\nconst PIXELS_PER_POINT = 0.75;\n\n// ( impossible?) to make tables with flex that don't have a fixed / 100% width?\n// we'd need to measure the width of every column manually\nconst styles = StyleSheet.create({\n tableContainer: {\n // width: \"100%\",\n },\n row: {\n flexDirection: \"row\",\n flexWrap: \"wrap\",\n // width: \"100%\",\n // justifyContent: \"space-between\",\n display: \"flex\",\n },\n cell: {\n paddingHorizontal: 5 * PIXELS_PER_POINT,\n paddingTop: 3 * PIXELS_PER_POINT,\n // paddingBottom: 1 * PIXELS_PER_POINT, should be 3px but looks odd, better with no padding Bottom\n borderLeft: \"1px solid #ddd\",\n borderTop: \"1px solid #ddd\",\n wordWrap: \"break-word\",\n whiteSpace: \"pre-wrap\",\n },\n headerCell: {\n fontWeight: \"bold\",\n },\n bottomCell: {\n borderBottom: \"1px solid #ddd\",\n },\n rightCell: {\n borderRight: \"1px solid #ddd\",\n },\n});\n\nexport const Table = (props: {\n data: TableContent<InlineContentSchema>;\n transformer: Exporter<\n any,\n InlineContentSchema,\n StyleSchema,\n any,\n any,\n any,\n any\n >;\n}) => {\n // If headerRows is 1, then the first row is a header row\n const headerRows = new Array(props.data.headerRows ?? 0).fill(true);\n // If headerCols is 1, then the first column is a header column\n const headerCols = new Array(props.data.headerCols ?? 0).fill(true);\n\n return (\n <View style={styles.tableContainer} wrap={false}>\n {props.data.rows.map((row, rowIndex) => (\n <View\n style={[\n styles.row,\n rowIndex === props.data.rows.length - 1 ? styles.bottomCell : {},\n ]}\n key={rowIndex}\n >\n {row.cells.map((c, colIndex) => {\n const cell = mapTableCell(c);\n\n const isHeaderRow = headerRows[rowIndex];\n const isHeaderCol = headerCols[colIndex];\n\n // TODO we need to support for colspan and rowspan, but at the moment are blocked by react-pdf\n return (\n <View\n style={[\n styles.cell,\n isHeaderRow || isHeaderCol ? styles.headerCell : {},\n colIndex === row.cells.length - 1 ? styles.rightCell : {},\n props.data.columnWidths[colIndex]\n ? { width: props.data.columnWidths[colIndex] }\n : { flex: 1 },\n {\n color:\n cell.props.textColor === \"default\"\n ? undefined\n : props.transformer.options.colors[\n cell.props\n .textColor as keyof typeof props.transformer.options.colors\n ].text,\n backgroundColor:\n cell.props.backgroundColor === \"default\"\n ? undefined\n : props.transformer.options.colors[\n cell.props\n .backgroundColor as keyof typeof props.transformer.options.colors\n ].background,\n textAlign: cell.props.textAlignment,\n },\n ]}\n key={colIndex}\n >\n {props.transformer.transformInlineContent(cell.content)}\n </View>\n );\n })}\n </View>\n ))}\n </View>\n );\n};\n","import {\n BlockMapping,\n DefaultBlockSchema,\n DefaultProps,\n pageBreakSchema,\n StyledText,\n} from \"@blocknote/core\";\nimport { Image, Link, Path, Svg, Text, View } from \"@react-pdf/renderer\";\nimport {\n BULLET_MARKER,\n CHECK_MARKER_CHECKED,\n CHECK_MARKER_UNCHECKED,\n ListItem,\n} from \"../util/listItem.js\";\nimport { Table } from \"../util/table/Table.js\";\n\nconst PIXELS_PER_POINT = 0.75;\nconst FONT_SIZE = 16;\n\nexport const pdfBlockMappingForDefaultSchema: BlockMapping<\n DefaultBlockSchema & typeof pageBreakSchema.blockSchema,\n any,\n any,\n React.ReactElement<Text>,\n React.ReactElement<Text> | React.ReactElement<Link>\n> = {\n paragraph: (block, exporter) => {\n // const style = blocknoteDefaultPropsToReactPDFStyle(block.props);\n return <Text>{exporter.transformInlineContent(block.content)}</Text>;\n },\n bulletListItem: (block, exporter) => {\n // const style = t(block.props);\n return (\n <ListItem listMarker={BULLET_MARKER}>\n <Text>{exporter.transformInlineContent(block.content)}</Text>\n </ListItem>\n );\n },\n numberedListItem: (block, exporter, _nestingLevel, numberedListIndex) => {\n // const style = blocknoteDefaultPropsToReactPDFStyle(block.props);\n // console.log(\"NUMBERED LIST ITEM\", block.props.textAlignment, style);\n return (\n <ListItem listMarker={`${numberedListIndex}.`}>\n <Text>{exporter.transformInlineContent(block.content)}</Text>\n </ListItem>\n );\n },\n // would be nice to have pdf checkboxes:\n // https://github.com/diegomura/react-pdf/issues/2103\n checkListItem: (block, exporter) => {\n return (\n <ListItem\n listMarker={\n block.props.checked ? CHECK_MARKER_CHECKED : CHECK_MARKER_UNCHECKED\n }\n >\n <Text>{exporter.transformInlineContent(block.content)}</Text>\n </ListItem>\n );\n },\n heading: (block, exporter) => {\n const fontSizeEM =\n block.props.level === 1 ? 2 : block.props.level === 2 ? 1.5 : 1.17;\n return (\n <Text\n style={{\n fontSize: fontSizeEM * FONT_SIZE * PIXELS_PER_POINT,\n fontWeight: 700,\n }}\n >\n {exporter.transformInlineContent(block.content)}\n </Text>\n );\n },\n quote: (block, exporter) => {\n return (\n <Text\n style={{\n borderLeft: \"#7D797A\",\n color: \"#7D797A\",\n paddingLeft: 9.5 * PIXELS_PER_POINT,\n }}\n >\n {exporter.transformInlineContent(block.content)}\n </Text>\n );\n },\n codeBlock: (block) => {\n const textContent = (block.content as StyledText<any>[])[0]?.text || \"\";\n const lines = textContent.split(\"\\n\").map((line, index) => {\n const indent = line.match(/^\\s*/)?.[0].length || 0;\n\n return (\n <Text\n key={`line_${index}`}\n style={{\n marginLeft: indent * 9.5 * PIXELS_PER_POINT,\n }}\n >\n {line.trimStart() || <>&nbsp;</>}\n </Text>\n );\n });\n\n return (\n <View\n wrap={false}\n style={{\n padding: 24 * PIXELS_PER_POINT,\n backgroundColor: \"#161616\",\n color: \"#ffffff\",\n lineHeight: 1.25,\n fontSize: FONT_SIZE * PIXELS_PER_POINT,\n fontFamily: \"GeistMono\",\n }}\n >\n {lines}\n </View>\n );\n },\n pageBreak: () => {\n return <View break />;\n },\n audio: (block, exporter) => {\n return (\n <View wrap={false}>\n {file(\n block.props,\n \"Open audio file\",\n <Svg height={14} width={14} viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <Path d=\"M2 16.0001H5.88889L11.1834 20.3319C11.2727 20.405 11.3846 20.4449 11.5 20.4449C11.7761 20.4449 12 20.2211 12 19.9449V4.05519C12 3.93977 11.9601 3.8279 11.887 3.73857C11.7121 3.52485 11.3971 3.49335 11.1834 3.66821L5.88889 8.00007H2C1.44772 8.00007 1 8.44778 1 9.00007V15.0001C1 15.5524 1.44772 16.0001 2 16.0001ZM23 12C23 15.292 21.5539 18.2463 19.2622 20.2622L17.8445 18.8444C19.7758 17.1937 21 14.7398 21 12C21 9.26016 19.7758 6.80629 17.8445 5.15557L19.2622 3.73779C21.5539 5.75368 23 8.70795 23 12ZM18 12C18 10.0883 17.106 8.38548 15.7133 7.28673L14.2842 8.71584C15.3213 9.43855 16 10.64 16 12C16 13.36 15.3213 14.5614 14.2842 15.2841L15.7133 16.7132C17.106 15.6145 18 13.9116 18 12Z\"></Path>\n </Svg>,\n exporter,\n )}\n {caption(block.props, exporter)}\n </View>\n );\n },\n video: (block, exporter) => {\n return (\n <View wrap={false}>\n {file(\n block.props,\n \"Open video file\",\n <Svg height={14} width={14} viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <Path d=\"M2 3.9934C2 3.44476 2.45531 3 2.9918 3H21.0082C21.556 3 22 3.44495 22 3.9934V20.0066C22 20.5552 21.5447 21 21.0082 21H2.9918C2.44405 21 2 20.5551 2 20.0066V3.9934ZM8 5V19H16V5H8ZM4 5V7H6V5H4ZM18 5V7H20V5H18ZM4 9V11H6V9H4ZM18 9V11H20V9H18ZM4 13V15H6V13H4ZM18 13V15H20V13H18ZM4 17V19H6V17H4ZM18 17V19H20V17H18Z\" />\n </Svg>,\n exporter,\n )}\n {caption(block.props, exporter)}\n </View>\n );\n },\n file: (block, exporter) => {\n return (\n <View wrap={false}>\n {file(\n block.props,\n \"Open file\",\n <Svg height={16} width={16} viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <Path d=\"M3 8L9.00319 2H19.9978C20.5513 2 21 2.45531 21 2.9918V21.0082C21 21.556 20.5551 22 20.0066 22H3.9934C3.44476 22 3 21.5501 3 20.9932V8ZM10 4V9H5V20H19V4H10Z\" />\n </Svg>,\n exporter,\n )}\n {caption(block.props, exporter)}\n </View>\n );\n },\n image: async (block, t) => {\n return (\n <View wrap={false}>\n <Image\n src={await t.resolveFile(block.props.url)}\n style={{\n width: block.props.previewWidth\n ? block.props.previewWidth * PIXELS_PER_POINT\n : undefined,\n }}\n />\n {caption(block.props, t)}\n </View>\n );\n },\n table: (block, t) => {\n return <Table data={block.content} transformer={t} />;\n },\n};\n\nfunction file(\n props: Partial<DefaultProps & { name: string; url: string }>,\n defaultText: string,\n icon: React.ReactElement<Svg>,\n _exporter: any,\n) {\n const PIXELS_PER_POINT = 0.75;\n return (\n <Link src={props.url}>\n <View\n style={{\n display: \"flex\",\n gap: 8 * PIXELS_PER_POINT,\n flexDirection: \"row\",\n }}\n >\n {icon}\n <Text>{props.name || defaultText}</Text>\n </View>\n </Link>\n );\n}\n\nfunction caption(\n props: Partial<DefaultProps & { caption: string; previewWidth: number }>,\n _exporter: any,\n) {\n if (!props.caption) {\n return undefined;\n }\n return (\n <Text\n style={{\n width: props.previewWidth\n ? props.previewWidth * PIXELS_PER_POINT\n : undefined,\n fontSize: FONT_SIZE * 0.8 * PIXELS_PER_POINT,\n }}\n >\n {props.caption}\n </Text>\n );\n}\n","import {\n DefaultInlineContentSchema,\n InlineContentMapping,\n} from \"@blocknote/core\";\nimport { Link, Text } from \"@react-pdf/renderer\";\n\nexport const pdfInlineContentMappingForDefaultSchema: InlineContentMapping<\n DefaultInlineContentSchema,\n any,\n React.ReactElement<Link> | React.ReactElement<Text>,\n React.ReactElement<Text>\n> = {\n link: (ic, exporter) => {\n return (\n <Link href={ic.href}>\n {ic.content.map((content) => exporter.transformStyledText(content))}\n </Link>\n );\n },\n text: (ic, exporter) => {\n return exporter.transformStyledText(ic);\n },\n};\n","import { DefaultStyleSchema, StyleMapping } from \"@blocknote/core\";\nimport { TextProps } from \"@react-pdf/renderer\";\n\nexport const pdfStyleMappingForDefaultSchema: StyleMapping<\n DefaultStyleSchema,\n TextProps[\"style\"]\n> = {\n bold: (val) => {\n if (!val) {\n return {};\n }\n return {\n fontWeight: \"bold\",\n };\n },\n italic: (val) => {\n if (!val) {\n return {};\n }\n return {\n fontStyle: \"italic\",\n };\n },\n underline: (val) => {\n if (!val) {\n return {};\n }\n return {\n textDecoration: \"underline\", // TODO: could conflict with strike\n };\n },\n strike: (val) => {\n if (!val) {\n return {};\n }\n return {\n textDecoration: \"line-through\",\n };\n },\n backgroundColor: (val, exporter) => {\n if (!val) {\n return {};\n }\n return {\n backgroundColor:\n exporter.options.colors[val as keyof typeof exporter.options.colors]\n .background,\n };\n },\n textColor: (val, exporter) => {\n if (!val) {\n return {};\n }\n return {\n color:\n exporter.options.colors[val as keyof typeof exporter.options.colors]\n .text,\n };\n },\n code: (val) => {\n if (!val) {\n return {};\n }\n return {\n fontFamily: \"GeistMono\",\n };\n },\n};\n","import { pdfBlockMappingForDefaultSchema } from \"./blocks.js\";\nimport { pdfInlineContentMappingForDefaultSchema } from \"./inlinecontent.js\";\nimport { pdfStyleMappingForDefaultSchema } from \"./styles.js\";\n\nexport const pdfDefaultSchemaMappings: {\n blockMapping: typeof pdfBlockMappingForDefaultSchema;\n inlineContentMapping: typeof pdfInlineContentMappingForDefaultSchema;\n styleMapping: typeof pdfStyleMappingForDefaultSchema;\n} = {\n blockMapping: pdfBlockMappingForDefaultSchema,\n inlineContentMapping: pdfInlineContentMappingForDefaultSchema,\n styleMapping: pdfStyleMappingForDefaultSchema,\n};\n","export async function corsProxyResolveFileUrl(url: string) {\n return (\n \"https://corsproxy.api.blocknotejs.org/corsproxy/?url=\" +\n encodeURIComponent(url)\n );\n}\n","/**\n *\n * Helper functions so that we can import files both on vitest, browser and node\n * TODO: should find a way to test automatically in all environments\n */\n\nexport async function loadFileDataUrl(\n requireUrl: { default: string },\n mimeType: string,\n) {\n if (import.meta.env.NODE_ENV === \"test\") {\n const buffer = await loadFileBuffer(requireUrl);\n const fileBase64 = buffer.toString(\"base64\");\n\n const dataUrl = `data:${mimeType};base64,${fileBase64}`;\n return dataUrl;\n } else {\n // in browser, this is already a data url\n return requireUrl.default as string;\n }\n}\n\nexport async function loadFontDataUrl(requireUrl: { default: string }) {\n return loadFileDataUrl(requireUrl, \"font/ttf\");\n}\n\nexport async function loadFileBuffer(requireUrl: {\n default: string;\n}): Promise<Buffer | ArrayBuffer> {\n if (import.meta.env.NODE_ENV === \"test\") {\n // in vitest, this is the url we need to load with readfilesync\n // eslint-disable-next-line\n const fs = require(\"fs\");\n let url = requireUrl.default;\n\n if (url.startsWith(\"/@fs/\")) {\n url = url.substring(\"/@fs\".length);\n }\n const buffer = fs.readFileSync(url);\n return buffer;\n } else {\n // in browser, this is already a data url\n const dataUrl = requireUrl.default as string;\n // convert to buffer on browser\n const response = await fetch(dataUrl);\n const arrayBuffer = await response.arrayBuffer();\n return arrayBuffer;\n }\n}\n\n/**\n * usage:\n * \n * await loadFontDataUrl(\n await import(\"../fonts/inter/Inter_18pt-Italic.ttf\")\n );\n */\n","import {\n Block,\n BlockNoteSchema,\n BlockSchema,\n COLORS_DEFAULT,\n DefaultProps,\n Exporter,\n ExporterOptions,\n InlineContentSchema,\n StyleSchema,\n StyledText,\n} from \"@blocknote/core\";\nimport {\n Document,\n Font,\n Link,\n Page,\n StyleSheet,\n Text,\n TextProps,\n View,\n} from \"@react-pdf/renderer\";\nimport { corsProxyResolveFileUrl } from \"@shared/api/corsProxy.js\";\nimport { loadFontDataUrl } from \"../../../../shared/util/fileUtil.js\";\n\nimport { Style } from \"./types.js\";\n\nconst FONT_SIZE = 16;\nconst PIXELS_PER_POINT = 0.75;\n\ntype Options = ExporterOptions & {\n /**\n *\n * @default uses the remote emoji source hosted on cloudflare (https://cdnjs.cloudflare.com/ajax/libs/twemoji/14.0.2/72x72/)\n */\n emojiSource: false | ReturnType<typeof Font.getEmojiSource>;\n};\n\n/**\n * Exports a BlockNote document to a .pdf file using the react-pdf library.\n */\nexport class PDFExporter<\n B extends BlockSchema,\n S extends StyleSchema,\n I extends InlineContentSchema,\n> extends Exporter<\n B,\n I,\n S,\n React.ReactElement<Text>,\n React.ReactElement<Link> | React.ReactElement<Text>,\n TextProps[\"style\"],\n React.ReactElement<Text>\n> {\n private fontsRegistered = false;\n\n public styles = StyleSheet.create({\n page: {\n paddingTop: 35,\n paddingBottom: 65,\n paddingHorizontal: 35,\n fontFamily: \"Inter\",\n fontSize: FONT_SIZE * PIXELS_PER_POINT, // pixels\n lineHeight: 1.5,\n },\n block: {},\n blockChildren: {},\n header: {},\n footer: {\n position: \"absolute\",\n },\n });\n\n public readonly options: Options;\n\n public constructor(\n /**\n * The schema of your editor. The mappings are automatically typed checked against this schema.\n */\n protected readonly schema: BlockNoteSchema<B, I, S>,\n /**\n * The mappings that map the BlockNote schema to the react-pdf content.\n *\n * Pass {@link pdfDefaultSchemaMappings} for the default schema.\n */\n mappings: Exporter<\n NoInfer<B>,\n NoInfer<I>,\n NoInfer<S>,\n React.ReactElement<Text>, // RB\n React.ReactElement<Link> | React.ReactElement<Text>, // RI\n TextProps[\"style\"], // RS\n React.ReactElement<Text> // TS\n >[\"mappings\"],\n options?: Partial<Options>,\n ) {\n const defaults = {\n emojiSource: {\n format: \"png\",\n url: \"https://cdnjs.cloudflare.com/ajax/libs/twemoji/14.0.2/72x72/\",\n },\n resolveFileUrl: corsProxyResolveFileUrl,\n colors: COLORS_DEFAULT,\n } satisfies Partial<Options>;\n\n const newOptions = {\n ...defaults,\n ...options,\n };\n super(schema, mappings, newOptions);\n this.options = newOptions;\n }\n\n /**\n * Mostly for internal use, you probably want to use `toBlob` or `toReactPDFDocument` instead.\n */\n public transformStyledText(styledText: StyledText<S>) {\n const stylesArray = this.mapStyles(styledText.styles);\n const styles = Object.assign({}, ...stylesArray);\n return <Text style={styles}>{styledText.text}</Text>;\n }\n\n /**\n * Mostly for internal use, you probably want to use `toBlob` or `toReactPDFDocument` instead.\n */\n public async transformBlocks(\n blocks: Block<B, I, S>[], // Or BlockFromConfig<B[keyof B], I, S>?\n nestingLevel = 0,\n ): Promise<React.ReactElement<Text>[]> {\n const ret: React.ReactElement<Text>[] = [];\n let numberedListIndex = 0;\n\n for (const b of blocks) {\n if (b.type === \"numberedListItem\") {\n numberedListIndex++;\n } else {\n numberedListIndex = 0;\n }\n const children = await this.transformBlocks(b.children, nestingLevel + 1);\n const self = await this.mapBlock(\n b as any,\n nestingLevel,\n numberedListIndex,\n ); // TODO: any\n\n if (b.type === \"pageBreak\") {\n ret.push(self);\n continue;\n }\n\n const style = this.blocknoteDefaultPropsToReactPDFStyle(b.props as any);\n ret.push(\n <>\n <View\n style={{\n paddingVertical: 3 * PIXELS_PER_POINT,\n ...this.styles.block,\n ...style,\n }}\n >\n {self}\n </View>\n {children.length > 0 && (\n <View\n style={{\n marginLeft: FONT_SIZE * 1.5 * PIXELS_PER_POINT,\n ...this.styles.blockChildren,\n }}\n >\n {children}\n </View>\n )}\n </>,\n );\n }\n\n return ret;\n }\n\n protected async registerFonts() {\n if (this.fontsRegistered) {\n return;\n }\n\n if (this.options.emojiSource) {\n Font.registerEmojiSource(this.options.emojiSource);\n }\n let font = await loadFontDataUrl(\n await import(\"@shared/assets/fonts/inter/Inter_18pt-Regular.ttf\"),\n );\n Font.register({\n family: \"Inter\",\n src: font,\n });\n\n font = await loadFontDataUrl(\n await import(\"@shared/assets/fonts/inter/Inter_18pt-Italic.ttf\"),\n );\n Font.register({\n family: \"Inter\",\n fontStyle: \"italic\",\n src: font,\n });\n\n font = await loadFontDataUrl(\n await import(\"@shared/assets/fonts/inter/Inter_18pt-Bold.ttf\"),\n );\n Font.register({\n family: \"Inter\",\n src: font,\n fontWeight: \"bold\",\n });\n\n font = await loadFontDataUrl(\n await import(\"@shared/assets/fonts/inter/Inter_18pt-BoldItalic.ttf\"),\n );\n Font.register({\n family: \"Inter\",\n fontStyle: \"italic\",\n src: font,\n fontWeight: \"bold\",\n });\n\n font = await loadFontDataUrl(\n await import(\"@shared/assets/fonts/GeistMono-Regular.ttf\"),\n );\n Font.register({\n family: \"GeistMono\",\n src: font,\n });\n\n this.fontsRegistered = true;\n }\n\n /**\n * Convert a document (array of Blocks) to a react-pdf Document.\n */\n public async toReactPDFDocument(\n blocks: Block<B, I, S>[],\n options: {\n /**\n * Add a header to every page.\n * The React component passed must be a React-PDF component\n */\n header?: React.ReactElement;\n /**\n * Add a footer to every page.\n * The React component passed must be a React-PDF component\n */\n footer?: React.ReactElement;\n } = {},\n ) {\n await this.registerFonts();\n\n return (\n <Document>\n <Page dpi={100} size=\"A4\" style={this.styles.page}>\n {options.header && (\n <View fixed style={this.styles.header}>\n {options.header}\n </View>\n )}\n {await this.transformBlocks(blocks)}\n {options.footer && (\n <View\n fixed\n style={[\n {\n left: this.styles.page.paddingHorizontal || 0,\n bottom: (this.styles.page.paddingBottom || 0) / 2,\n right: this.styles.page.paddingHorizontal || 0,\n },\n this.styles.footer,\n ]}\n >\n {options.footer}\n </View>\n )}\n </Page>\n </Document>\n );\n }\n\n protected blocknoteDefaultPropsToReactPDFStyle(\n props: Partial<DefaultProps>,\n ): Style {\n return {\n textAlign: props.textAlignment,\n backgroundColor:\n props.backgroundColor === \"default\" || !props.backgroundColor\n ? undefined\n : this.options.colors[\n props.backgroundColor as keyof typeof this.options.colors\n ].background,\n color:\n props.textColor === \"default\" || !props.textColor\n ? undefined\n : this.options.colors[\n props.textColor as keyof typeof this.options.colors\n ].text,\n alignItems:\n props.textAlignment === \"right\"\n ? \"flex-end\"\n : props.textAlignment === \"center\"\n ? \"center\"\n : undefined,\n };\n }\n}\n"],"names":["PIXELS_PER_POINT","styles","StyleSheet","BULLET_MARKER","CHECK_MARKER_UNCHECKED","jsx","Svg","Path","CHECK_MARKER_CHECKED","ListItem","listMarker","children","style","jsxs","View","Text","Table","props","headerRows","headerCols","row","rowIndex","colIndex","cell","mapTableCell","isHeaderRow","isHeaderCol","FONT_SIZE","pdfBlockMappingForDefaultSchema","block","exporter","_nestingLevel","numberedListIndex","fontSizeEM","lines","_a","line","index","indent","Fragment","file","caption","t","Image","defaultText","icon","_exporter","Link","pdfInlineContentMappingForDefaultSchema","ic","content","pdfStyleMappingForDefaultSchema","val","pdfDefaultSchemaMappings","corsProxyResolveFileUrl","url","loadFileDataUrl","requireUrl","mimeType","loadFontDataUrl","PDFExporter","Exporter","schema","mappings","options","newOptions","COLORS_DEFAULT","__publicField","styledText","stylesArray","blocks","nestingLevel","ret","b","self","Font","font","Document","Page"],"mappings":"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"}
@@ -1 +1 @@
1
- {"builtAt":1744906314454,"assets":[{"name":"blocknote-xl-pdf-exporter.cjs","size":9668},{"name":"Inter_18pt-Regular-CCMUw8TC.cjs","size":457096},{"name":"Inter_18pt-Italic-B-14jOMa.cjs","size":462163},{"name":"Inter_18pt-Bold-yKiK3cOU.cjs","size":459057},{"name":"Inter_18pt-BoldItalic-TUYlzxLL.cjs","size":464431},{"name":"GeistMono-Regular--NrcstcO.cjs","size":155187},{"name":"GeistMono-Regular--NrcstcO.cjs.map","size":155239},{"name":"Inter_18pt-Bold-yKiK3cOU.cjs.map","size":459111},{"name":"Inter_18pt-Italic-B-14jOMa.cjs.map","size":462221},{"name":"Inter_18pt-Regular-CCMUw8TC.cjs.map","size":457156},{"name":"Inter_18pt-BoldItalic-TUYlzxLL.cjs.map","size":464497},{"name":"blocknote-xl-pdf-exporter.cjs.map","size":35894}],"chunks":[{"id":"a1ee98a","entry":true,"initial":true,"files":["blocknote-xl-pdf-exporter.cjs"],"names":["blocknote-xl-pdf-exporter"]},{"id":"b6f14fb","entry":false,"initial":false,"files":["Inter_18pt-Regular-CCMUw8TC.cjs"],"names":["Inter_18pt-Regular"]},{"id":"73c6ce6","entry":false,"initial":false,"files":["Inter_18pt-Italic-B-14jOMa.cjs"],"names":["Inter_18pt-Italic"]},{"id":"7793085","entry":false,"initial":false,"files":["Inter_18pt-Bold-yKiK3cOU.cjs"],"names":["Inter_18pt-Bold"]},{"id":"097c571","entry":false,"initial":false,"files":["Inter_18pt-BoldItalic-TUYlzxLL.cjs"],"names":["Inter_18pt-BoldItalic"]},{"id":"642be88","entry":false,"initial":false,"files":["GeistMono-Regular--NrcstcO.cjs"],"names":["GeistMono-Regular"]}],"modules":[{"name":"./src/pdf/util/listItem.tsx","size":1726,"chunks":["a1ee98a"]},{"name":"./src/pdf/util/table/Table.tsx","size":2365,"chunks":["a1ee98a"]},{"name":"./src/pdf/defaultSchema/blocks.tsx","size":6755,"chunks":["a1ee98a"]},{"name":"./src/pdf/defaultSchema/inlinecontent.tsx","size":317,"chunks":["a1ee98a"]},{"name":"./src/pdf/defaultSchema/styles.tsx","size":973,"chunks":["a1ee98a"]},{"name":"./src/pdf/defaultSchema/index.ts","size":199,"chunks":["a1ee98a"]},{"name":"../../shared/api/corsProxy.ts","size":139,"chunks":["a1ee98a"]},{"name":"../../shared/util/fileUtil.ts","size":180,"chunks":["a1ee98a"]},{"name":"./src/pdf/pdfExporter.tsx","size":5601,"chunks":["a1ee98a"]},{"name":"./src/index.ts","size":0,"chunks":["a1ee98a"]},{"name":"../../shared/assets/fonts/inter/Inter_18pt-Regular.ttf","size":456958,"chunks":["b6f14fb"]},{"name":"../../shared/assets/fonts/inter/Inter_18pt-Italic.ttf","size":462025,"chunks":["73c6ce6"]},{"name":"../../shared/assets/fonts/inter/Inter_18pt-Bold.ttf","size":458919,"chunks":["7793085"]},{"name":"../../shared/assets/fonts/inter/Inter_18pt-BoldItalic.ttf","size":464293,"chunks":["097c571"]},{"name":"../../shared/assets/fonts/GeistMono-Regular.ttf","size":155049,"chunks":["642be88"]}]}
1
+ {"builtAt":1747749781209,"assets":[{"name":"blocknote-xl-pdf-exporter.cjs","size":9696},{"name":"Inter_18pt-Regular-CCMUw8TC.cjs","size":457096},{"name":"Inter_18pt-Italic-B-14jOMa.cjs","size":462163},{"name":"Inter_18pt-Bold-yKiK3cOU.cjs","size":459057},{"name":"Inter_18pt-BoldItalic-TUYlzxLL.cjs","size":464431},{"name":"GeistMono-Regular--NrcstcO.cjs","size":155187},{"name":"GeistMono-Regular--NrcstcO.cjs.map","size":155239},{"name":"Inter_18pt-Italic-B-14jOMa.cjs.map","size":462221},{"name":"Inter_18pt-Bold-yKiK3cOU.cjs.map","size":459111},{"name":"Inter_18pt-BoldItalic-TUYlzxLL.cjs.map","size":464497},{"name":"Inter_18pt-Regular-CCMUw8TC.cjs.map","size":457156},{"name":"blocknote-xl-pdf-exporter.cjs.map","size":36148}],"chunks":[{"id":"a1ee98a","entry":true,"initial":true,"files":["blocknote-xl-pdf-exporter.cjs"],"names":["blocknote-xl-pdf-exporter"]},{"id":"b6f14fb","entry":false,"initial":false,"files":["Inter_18pt-Regular-CCMUw8TC.cjs"],"names":["Inter_18pt-Regular"]},{"id":"73c6ce6","entry":false,"initial":false,"files":["Inter_18pt-Italic-B-14jOMa.cjs"],"names":["Inter_18pt-Italic"]},{"id":"7793085","entry":false,"initial":false,"files":["Inter_18pt-Bold-yKiK3cOU.cjs"],"names":["Inter_18pt-Bold"]},{"id":"097c571","entry":false,"initial":false,"files":["Inter_18pt-BoldItalic-TUYlzxLL.cjs"],"names":["Inter_18pt-BoldItalic"]},{"id":"642be88","entry":false,"initial":false,"files":["GeistMono-Regular--NrcstcO.cjs"],"names":["GeistMono-Regular"]}],"modules":[{"name":"./src/pdf/util/listItem.tsx","size":1726,"chunks":["a1ee98a"]},{"name":"./src/pdf/util/table/Table.tsx","size":2365,"chunks":["a1ee98a"]},{"name":"./src/pdf/defaultSchema/blocks.tsx","size":6791,"chunks":["a1ee98a"]},{"name":"./src/pdf/defaultSchema/inlinecontent.tsx","size":317,"chunks":["a1ee98a"]},{"name":"./src/pdf/defaultSchema/styles.tsx","size":973,"chunks":["a1ee98a"]},{"name":"./src/pdf/defaultSchema/index.ts","size":199,"chunks":["a1ee98a"]},{"name":"../../shared/api/corsProxy.ts","size":139,"chunks":["a1ee98a"]},{"name":"../../shared/util/fileUtil.ts","size":180,"chunks":["a1ee98a"]},{"name":"./src/pdf/pdfExporter.tsx","size":5601,"chunks":["a1ee98a"]},{"name":"./src/index.ts","size":0,"chunks":["a1ee98a"]},{"name":"../../shared/assets/fonts/inter/Inter_18pt-Regular.ttf","size":456958,"chunks":["b6f14fb"]},{"name":"../../shared/assets/fonts/inter/Inter_18pt-Italic.ttf","size":462025,"chunks":["73c6ce6"]},{"name":"../../shared/assets/fonts/inter/Inter_18pt-Bold.ttf","size":458919,"chunks":["7793085"]},{"name":"../../shared/assets/fonts/inter/Inter_18pt-BoldItalic.ttf","size":464293,"chunks":["097c571"]},{"name":"../../shared/assets/fonts/GeistMono-Regular.ttf","size":155049,"chunks":["642be88"]}]}
package/package.json CHANGED
@@ -9,7 +9,7 @@
9
9
  "directory": "packages/xl-pdf-exporter"
10
10
  },
11
11
  "license": "AGPL-3.0 OR PROPRIETARY",
12
- "version": "0.29.1",
12
+ "version": "0.30.1",
13
13
  "files": [
14
14
  "dist",
15
15
  "types",
@@ -43,12 +43,13 @@
43
43
  },
44
44
  "./style.css": {
45
45
  "import": "./dist/style.css",
46
- "require": "./dist/style.css"
46
+ "require": "./dist/style.css",
47
+ "style": "./dist/style.css"
47
48
  }
48
49
  },
49
50
  "dependencies": {
50
- "@blocknote/core": "0.29.1",
51
- "@blocknote/react": "0.29.1",
51
+ "@blocknote/core": "0.30.1",
52
+ "@blocknote/react": "0.30.1",
52
53
  "@react-pdf/renderer": "^4.3.0",
53
54
  "buffer": "^6.0.3",
54
55
  "docx": "^9.0.2"
@@ -62,7 +63,6 @@
62
63
  "eslint": "^8.10.0",
63
64
  "jest-image-snapshot": "^6.4.0",
64
65
  "pdf-to-img": "^4.2.0",
65
- "prettier": "^2.7.1",
66
66
  "react-element-to-jsx-string": "^15.0.0",
67
67
  "rollup-plugin-webpack-stats": "^0.2.2",
68
68
  "typescript": "^5.0.4",
@@ -558,13 +558,13 @@
558
558
  <IMAGE
559
559
  src={[object Blob]}
560
560
  style={{
561
- width: 384
561
+ width: undefined
562
562
  }}
563
563
  />
564
564
  <TEXT
565
565
  style={{
566
566
  fontSize: 9.600000000000001,
567
- width: 384
567
+ width: undefined
568
568
  }}
569
569
  >
570
570
  From https://interactive-examples.mdn.mozilla.net/media/cc0-images/grapefruit-slice-332-332.jpg
@@ -627,7 +627,7 @@
627
627
  <TEXT
628
628
  style={{
629
629
  fontSize: 9.600000000000001,
630
- width: 384
630
+ width: undefined
631
631
  }}
632
632
  >
633
633
  From https://interactive-examples.mdn.mozilla.net/media/cc0-videos/flower.webm
@@ -566,13 +566,13 @@
566
566
  <IMAGE
567
567
  src={[object Blob]}
568
568
  style={{
569
- width: 384
569
+ width: undefined
570
570
  }}
571
571
  />
572
572
  <TEXT
573
573
  style={{
574
574
  fontSize: 9.600000000000001,
575
- width: 384
575
+ width: undefined
576
576
  }}
577
577
  >
578
578
  From https://interactive-examples.mdn.mozilla.net/media/cc0-images/grapefruit-slice-332-332.jpg
@@ -635,7 +635,7 @@
635
635
  <TEXT
636
636
  style={{
637
637
  fontSize: 9.600000000000001,
638
- width: 384
638
+ width: undefined
639
639
  }}
640
640
  >
641
641
  From https://interactive-examples.mdn.mozilla.net/media/cc0-videos/flower.webm
@@ -52,7 +52,8 @@ export const pdfBlockMappingForDefaultSchema: BlockMapping<
52
52
  <ListItem
53
53
  listMarker={
54
54
  block.props.checked ? CHECK_MARKER_CHECKED : CHECK_MARKER_UNCHECKED
55
- }>
55
+ }
56
+ >
56
57
  <Text>{exporter.transformInlineContent(block.content)}</Text>
57
58
  </ListItem>
58
59
  );
@@ -65,7 +66,8 @@ export const pdfBlockMappingForDefaultSchema: BlockMapping<
65
66
  style={{
66
67
  fontSize: fontSizeEM * FONT_SIZE * PIXELS_PER_POINT,
67
68
  fontWeight: 700,
68
- }}>
69
+ }}
70
+ >
69
71
  {exporter.transformInlineContent(block.content)}
70
72
  </Text>
71
73
  );
@@ -77,7 +79,8 @@ export const pdfBlockMappingForDefaultSchema: BlockMapping<
77
79
  borderLeft: "#7D797A",
78
80
  color: "#7D797A",
79
81
  paddingLeft: 9.5 * PIXELS_PER_POINT,
80
- }}>
82
+ }}
83
+ >
81
84
  {exporter.transformInlineContent(block.content)}
82
85
  </Text>
83
86
  );
@@ -92,7 +95,8 @@ export const pdfBlockMappingForDefaultSchema: BlockMapping<
92
95
  key={`line_${index}`}
93
96
  style={{
94
97
  marginLeft: indent * 9.5 * PIXELS_PER_POINT,
95
- }}>
98
+ }}
99
+ >
96
100
  {line.trimStart() || <>&nbsp;</>}
97
101
  </Text>
98
102
  );
@@ -108,7 +112,8 @@ export const pdfBlockMappingForDefaultSchema: BlockMapping<
108
112
  lineHeight: 1.25,
109
113
  fontSize: FONT_SIZE * PIXELS_PER_POINT,
110
114
  fontFamily: "GeistMono",
111
- }}>
115
+ }}
116
+ >
112
117
  {lines}
113
118
  </View>
114
119
  );
@@ -125,7 +130,7 @@ export const pdfBlockMappingForDefaultSchema: BlockMapping<
125
130
  <Svg height={14} width={14} viewBox="0 0 24 24" fill="currentColor">
126
131
  <Path d="M2 16.0001H5.88889L11.1834 20.3319C11.2727 20.405 11.3846 20.4449 11.5 20.4449C11.7761 20.4449 12 20.2211 12 19.9449V4.05519C12 3.93977 11.9601 3.8279 11.887 3.73857C11.7121 3.52485 11.3971 3.49335 11.1834 3.66821L5.88889 8.00007H2C1.44772 8.00007 1 8.44778 1 9.00007V15.0001C1 15.5524 1.44772 16.0001 2 16.0001ZM23 12C23 15.292 21.5539 18.2463 19.2622 20.2622L17.8445 18.8444C19.7758 17.1937 21 14.7398 21 12C21 9.26016 19.7758 6.80629 17.8445 5.15557L19.2622 3.73779C21.5539 5.75368 23 8.70795 23 12ZM18 12C18 10.0883 17.106 8.38548 15.7133 7.28673L14.2842 8.71584C15.3213 9.43855 16 10.64 16 12C16 13.36 15.3213 14.5614 14.2842 15.2841L15.7133 16.7132C17.106 15.6145 18 13.9116 18 12Z"></Path>
127
132
  </Svg>,
128
- exporter
133
+ exporter,
129
134
  )}
130
135
  {caption(block.props, exporter)}
131
136
  </View>
@@ -140,7 +145,7 @@ export const pdfBlockMappingForDefaultSchema: BlockMapping<
140
145
  <Svg height={14} width={14} viewBox="0 0 24 24" fill="currentColor">
141
146
  <Path d="M2 3.9934C2 3.44476 2.45531 3 2.9918 3H21.0082C21.556 3 22 3.44495 22 3.9934V20.0066C22 20.5552 21.5447 21 21.0082 21H2.9918C2.44405 21 2 20.5551 2 20.0066V3.9934ZM8 5V19H16V5H8ZM4 5V7H6V5H4ZM18 5V7H20V5H18ZM4 9V11H6V9H4ZM18 9V11H20V9H18ZM4 13V15H6V13H4ZM18 13V15H20V13H18ZM4 17V19H6V17H4ZM18 17V19H20V17H18Z" />
142
147
  </Svg>,
143
- exporter
148
+ exporter,
144
149
  )}
145
150
  {caption(block.props, exporter)}
146
151
  </View>
@@ -155,7 +160,7 @@ export const pdfBlockMappingForDefaultSchema: BlockMapping<
155
160
  <Svg height={16} width={16} viewBox="0 0 24 24" fill="currentColor">
156
161
  <Path d="M3 8L9.00319 2H19.9978C20.5513 2 21 2.45531 21 2.9918V21.0082C21 21.556 20.5551 22 20.0066 22H3.9934C3.44476 22 3 21.5501 3 20.9932V8ZM10 4V9H5V20H19V4H10Z" />
157
162
  </Svg>,
158
- exporter
163
+ exporter,
159
164
  )}
160
165
  {caption(block.props, exporter)}
161
166
  </View>
@@ -167,7 +172,9 @@ export const pdfBlockMappingForDefaultSchema: BlockMapping<
167
172
  <Image
168
173
  src={await t.resolveFile(block.props.url)}
169
174
  style={{
170
- width: block.props.previewWidth * PIXELS_PER_POINT,
175
+ width: block.props.previewWidth
176
+ ? block.props.previewWidth * PIXELS_PER_POINT
177
+ : undefined,
171
178
  }}
172
179
  />
173
180
  {caption(block.props, t)}
@@ -183,7 +190,7 @@ function file(
183
190
  props: Partial<DefaultProps & { name: string; url: string }>,
184
191
  defaultText: string,
185
192
  icon: React.ReactElement<Svg>,
186
- _exporter: any
193
+ _exporter: any,
187
194
  ) {
188
195
  const PIXELS_PER_POINT = 0.75;
189
196
  return (
@@ -193,7 +200,8 @@ function file(
193
200
  display: "flex",
194
201
  gap: 8 * PIXELS_PER_POINT,
195
202
  flexDirection: "row",
196
- }}>
203
+ }}
204
+ >
197
205
  {icon}
198
206
  <Text>{props.name || defaultText}</Text>
199
207
  </View>
@@ -203,7 +211,7 @@ function file(
203
211
 
204
212
  function caption(
205
213
  props: Partial<DefaultProps & { caption: string; previewWidth: number }>,
206
- _exporter: any
214
+ _exporter: any,
207
215
  ) {
208
216
  if (!props.caption) {
209
217
  return undefined;
@@ -215,7 +223,8 @@ function caption(
215
223
  ? props.previewWidth * PIXELS_PER_POINT
216
224
  : undefined,
217
225
  fontSize: FONT_SIZE * 0.8 * PIXELS_PER_POINT,
218
- }}>
226
+ }}
227
+ >
219
228
  {props.caption}
220
229
  </Text>
221
230
  );
@@ -34,7 +34,7 @@ describe("exporter", () => {
34
34
  type: "extraBlock",
35
35
  propSchema: {},
36
36
  },
37
- {} as any
37
+ {} as any,
38
38
  ),
39
39
  },
40
40
  });
@@ -42,7 +42,7 @@ describe("exporter", () => {
42
42
  new PDFExporter(
43
43
  schema,
44
44
  // @ts-expect-error
45
- pdfDefaultSchemaMappings
45
+ pdfDefaultSchemaMappings,
46
46
  );
47
47
 
48
48
  new PDFExporter(schema, {
@@ -74,7 +74,7 @@ describe("exporter", () => {
74
74
  content: "styled",
75
75
  propSchema: {},
76
76
  },
77
- {} as any
77
+ {} as any,
78
78
  ),
79
79
  },
80
80
  });
@@ -82,7 +82,7 @@ describe("exporter", () => {
82
82
  new PDFExporter(
83
83
  schema,
84
84
  // @ts-expect-error
85
- pdfDefaultSchemaMappings
85
+ pdfDefaultSchemaMappings,
86
86
  );
87
87
 
88
88
  new PDFExporter(schema, {
@@ -114,7 +114,7 @@ describe("exporter", () => {
114
114
  type: "extraStyle",
115
115
  propSchema: "boolean",
116
116
  },
117
- {} as any
117
+ {} as any,
118
118
  ),
119
119
  },
120
120
  });
@@ -122,7 +122,7 @@ describe("exporter", () => {
122
122
  new PDFExporter(
123
123
  schema,
124
124
  // @ts-expect-error
125
- pdfDefaultSchemaMappings
125
+ pdfDefaultSchemaMappings,
126
126
  );
127
127
 
128
128
  new PDFExporter(schema, {
@@ -160,7 +160,7 @@ describe("exporter", () => {
160
160
  BlockNoteSchema.create({
161
161
  blockSpecs: { ...defaultBlockSpecs, pageBreak: PageBreak },
162
162
  }),
163
- pdfDefaultSchemaMappings
163
+ pdfDefaultSchemaMappings,
164
164
  );
165
165
 
166
166
  const transformed = await exporter.toReactPDFDocument(testDocument);
@@ -193,7 +193,7 @@ describe("exporter", () => {
193
193
  BlockNoteSchema.create({
194
194
  blockSpecs: { ...defaultBlockSpecs, pageBreak: PageBreak },
195
195
  }),
196
- pdfDefaultSchemaMappings
196
+ pdfDefaultSchemaMappings,
197
197
  );
198
198
 
199
199
  const transformed = await exporter.toReactPDFDocument(testDocument, {
@@ -202,7 +202,7 @@ describe("exporter", () => {
202
202
  });
203
203
  const str = reactElementToJSXString(transformed);
204
204
  await expect(str).toMatchFileSnapshot(
205
- "__snapshots__/exampleWithHeaderAndFooter.jsx"
205
+ "__snapshots__/exampleWithHeaderAndFooter.jsx",
206
206
  );
207
207
 
208
208
  // await ReactPDF.render(
@@ -42,7 +42,7 @@ type Options = ExporterOptions & {
42
42
  export class PDFExporter<
43
43
  B extends BlockSchema,
44
44
  S extends StyleSchema,
45
- I extends InlineContentSchema
45
+ I extends InlineContentSchema,
46
46
  > extends Exporter<
47
47
  B,
48
48
  I,
@@ -92,7 +92,7 @@ export class PDFExporter<
92
92
  TextProps["style"], // RS
93
93
  React.ReactElement<Text> // TS
94
94
  >["mappings"],
95
- options?: Partial<Options>
95
+ options?: Partial<Options>,
96
96
  ) {
97
97
  const defaults = {
98
98
  emojiSource: {
@@ -125,7 +125,7 @@ export class PDFExporter<
125
125
  */
126
126
  public async transformBlocks(
127
127
  blocks: Block<B, I, S>[], // Or BlockFromConfig<B[keyof B], I, S>?
128
- nestingLevel = 0
128
+ nestingLevel = 0,
129
129
  ): Promise<React.ReactElement<Text>[]> {
130
130
  const ret: React.ReactElement<Text>[] = [];
131
131
  let numberedListIndex = 0;
@@ -140,7 +140,7 @@ export class PDFExporter<
140
140
  const self = await this.mapBlock(
141
141
  b as any,
142
142
  nestingLevel,
143
- numberedListIndex
143
+ numberedListIndex,
144
144
  ); // TODO: any
145
145
 
146
146
  if (b.type === "pageBreak") {
@@ -156,7 +156,8 @@ export class PDFExporter<
156
156
  paddingVertical: 3 * PIXELS_PER_POINT,
157
157
  ...this.styles.block,
158
158
  ...style,
159
- }}>
159
+ }}
160
+ >
160
161
  {self}
161
162
  </View>
162
163
  {children.length > 0 && (
@@ -164,11 +165,12 @@ export class PDFExporter<
164
165
  style={{
165
166
  marginLeft: FONT_SIZE * 1.5 * PIXELS_PER_POINT,
166
167
  ...this.styles.blockChildren,
167
- }}>
168
+ }}
169
+ >
168
170
  {children}
169
171
  </View>
170
172
  )}
171
- </>
173
+ </>,
172
174
  );
173
175
  }
174
176
 
@@ -184,7 +186,7 @@ export class PDFExporter<
184
186
  Font.registerEmojiSource(this.options.emojiSource);
185
187
  }
186
188
  let font = await loadFontDataUrl(
187
- await import("@shared/assets/fonts/inter/Inter_18pt-Regular.ttf")
189
+ await import("@shared/assets/fonts/inter/Inter_18pt-Regular.ttf"),
188
190
  );
189
191
  Font.register({
190
192
  family: "Inter",
@@ -192,7 +194,7 @@ export class PDFExporter<
192
194
  });
193
195
 
194
196
  font = await loadFontDataUrl(
195
- await import("@shared/assets/fonts/inter/Inter_18pt-Italic.ttf")
197
+ await import("@shared/assets/fonts/inter/Inter_18pt-Italic.ttf"),
196
198
  );
197
199
  Font.register({
198
200
  family: "Inter",
@@ -201,7 +203,7 @@ export class PDFExporter<
201
203
  });
202
204
 
203
205
  font = await loadFontDataUrl(
204
- await import("@shared/assets/fonts/inter/Inter_18pt-Bold.ttf")
206
+ await import("@shared/assets/fonts/inter/Inter_18pt-Bold.ttf"),
205
207
  );
206
208
  Font.register({
207
209
  family: "Inter",
@@ -210,7 +212,7 @@ export class PDFExporter<
210
212
  });
211
213
 
212
214
  font = await loadFontDataUrl(
213
- await import("@shared/assets/fonts/inter/Inter_18pt-BoldItalic.ttf")
215
+ await import("@shared/assets/fonts/inter/Inter_18pt-BoldItalic.ttf"),
214
216
  );
215
217
  Font.register({
216
218
  family: "Inter",
@@ -220,7 +222,7 @@ export class PDFExporter<
220
222
  });
221
223
 
222
224
  font = await loadFontDataUrl(
223
- await import("@shared/assets/fonts/GeistMono-Regular.ttf")
225
+ await import("@shared/assets/fonts/GeistMono-Regular.ttf"),
224
226
  );
225
227
  Font.register({
226
228
  family: "GeistMono",
@@ -246,7 +248,7 @@ export class PDFExporter<
246
248
  * The React component passed must be a React-PDF component
247
249
  */
248
250
  footer?: React.ReactElement;
249
- } = {}
251
+ } = {},
250
252
  ) {
251
253
  await this.registerFonts();
252
254
 
@@ -269,7 +271,8 @@ export class PDFExporter<
269
271
  right: this.styles.page.paddingHorizontal || 0,
270
272
  },
271
273
  this.styles.footer,
272
- ]}>
274
+ ]}
275
+ >
273
276
  {options.footer}
274
277
  </View>
275
278
  )}
@@ -279,7 +282,7 @@ export class PDFExporter<
279
282
  }
280
283
 
281
284
  protected blocknoteDefaultPropsToReactPDFStyle(
282
- props: Partial<DefaultProps>
285
+ props: Partial<DefaultProps>,
283
286
  ): Style {
284
287
  return {
285
288
  textAlign: props.textAlignment,
@@ -299,8 +302,8 @@ export class PDFExporter<
299
302
  props.textAlignment === "right"
300
303
  ? "flex-end"
301
304
  : props.textAlignment === "center"
302
- ? "center"
303
- : undefined,
305
+ ? "center"
306
+ : undefined,
304
307
  };
305
308
  }
306
309
  }
@@ -26,7 +26,8 @@ export const CHECK_MARKER_UNCHECKED = (
26
26
  height="12"
27
27
  viewBox="0 -960 960 960"
28
28
  width="12"
29
- fill="undefined">
29
+ fill="undefined"
30
+ >
30
31
  <Path d="M200-120q-33 0-56.5-23.5T120-200v-560q0-33 23.5-56.5T200-840h560q33 0 56.5 23.5T840-760v560q0 33-23.5 56.5T760-120H200Zm0-80h560v-560H200v560Z" />
31
32
  </Svg>
32
33
  );
@@ -38,7 +39,8 @@ export const CHECK_MARKER_CHECKED = (
38
39
  height="12"
39
40
  viewBox="0 -960 960 960"
40
41
  width="12"
41
- fill="undefined">
42
+ fill="undefined"
43
+ >
42
44
  <Path d="m424-312 282-282-56-56-226 226-114-114-56 56 170 170ZM200-120q-33 0-56.5-23.5T120-200v-560q0-33 23.5-56.5T200-840h560q33 0 56.5 23.5T840-760v560q0 33-23.5 56.5T760-120H200Zm0-80h560v-560H200v560Zm0-560v560-560Z" />
43
45
  </Svg>
44
46
  );
@@ -66,7 +66,8 @@ export const Table = (props: {
66
66
  styles.row,
67
67
  rowIndex === props.data.rows.length - 1 ? styles.bottomCell : {},
68
68
  ]}
69
- key={rowIndex}>
69
+ key={rowIndex}
70
+ >
70
71
  {row.cells.map((c, colIndex) => {
71
72
  const cell = mapTableCell(c);
72
73
 
@@ -101,7 +102,8 @@ export const Table = (props: {
101
102
  textAlign: cell.props.textAlignment,
102
103
  },
103
104
  ]}
104
- key={colIndex}>
105
+ key={colIndex}
106
+ >
105
107
  {props.transformer.transformInlineContent(cell.content)}
106
108
  </View>
107
109
  );