@usepagelet/runtime 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +24 -0
- package/dist/v1/capabilities.md +59 -0
- package/dist/v1/chunks/architecture-7EHR7CIX-CDRXMAVQ.js +2 -0
- package/dist/v1/chunks/architecture-7EHR7CIX-CDRXMAVQ.js.map +7 -0
- package/dist/v1/chunks/architectureDiagram-3BPJPVTR-EYIVUOEK.js +37 -0
- package/dist/v1/chunks/architectureDiagram-3BPJPVTR-EYIVUOEK.js.map +7 -0
- package/dist/v1/chunks/blockDiagram-GPEHLZMM-P7MBAWVH.js +133 -0
- package/dist/v1/chunks/blockDiagram-GPEHLZMM-P7MBAWVH.js.map +7 -0
- package/dist/v1/chunks/c4Diagram-AAUBKEIU-2XSL5LGB.js +11 -0
- package/dist/v1/chunks/c4Diagram-AAUBKEIU-2XSL5LGB.js.map +7 -0
- package/dist/v1/chunks/chunk-2STBDRRH.js +2 -0
- package/dist/v1/chunks/chunk-2STBDRRH.js.map +7 -0
- package/dist/v1/chunks/chunk-6AA7JQNC.js +71 -0
- package/dist/v1/chunks/chunk-6AA7JQNC.js.map +7 -0
- package/dist/v1/chunks/chunk-72WSJX2P.js +2 -0
- package/dist/v1/chunks/chunk-72WSJX2P.js.map +7 -0
- package/dist/v1/chunks/chunk-AUV7QZZ7.js +2 -0
- package/dist/v1/chunks/chunk-AUV7QZZ7.js.map +7 -0
- package/dist/v1/chunks/chunk-AZFF2WJO.js +2 -0
- package/dist/v1/chunks/chunk-AZFF2WJO.js.map +7 -0
- package/dist/v1/chunks/chunk-C2IUOGBD.js +2 -0
- package/dist/v1/chunks/chunk-C2IUOGBD.js.map +7 -0
- package/dist/v1/chunks/chunk-DKQVSAO3.js +2 -0
- package/dist/v1/chunks/chunk-DKQVSAO3.js.map +7 -0
- package/dist/v1/chunks/chunk-DS52DG6H.js +2 -0
- package/dist/v1/chunks/chunk-DS52DG6H.js.map +7 -0
- package/dist/v1/chunks/chunk-DXEOG5W4.js +2 -0
- package/dist/v1/chunks/chunk-DXEOG5W4.js.map +7 -0
- package/dist/v1/chunks/chunk-EHSK6IMI.js +3 -0
- package/dist/v1/chunks/chunk-EHSK6IMI.js.map +7 -0
- package/dist/v1/chunks/chunk-FWZR474D.js +2 -0
- package/dist/v1/chunks/chunk-FWZR474D.js.map +7 -0
- package/dist/v1/chunks/chunk-FYLAOHYS.js +2 -0
- package/dist/v1/chunks/chunk-FYLAOHYS.js.map +7 -0
- package/dist/v1/chunks/chunk-G6W4FKMG.js +2 -0
- package/dist/v1/chunks/chunk-G6W4FKMG.js.map +7 -0
- package/dist/v1/chunks/chunk-HLP6UJDY.js +2 -0
- package/dist/v1/chunks/chunk-HLP6UJDY.js.map +7 -0
- package/dist/v1/chunks/chunk-IGLPGT7W.js +160 -0
- package/dist/v1/chunks/chunk-IGLPGT7W.js.map +7 -0
- package/dist/v1/chunks/chunk-IQVRW6XA.js +322 -0
- package/dist/v1/chunks/chunk-IQVRW6XA.js.map +7 -0
- package/dist/v1/chunks/chunk-IY5OUPDU.js +5 -0
- package/dist/v1/chunks/chunk-IY5OUPDU.js.map +7 -0
- package/dist/v1/chunks/chunk-JOJIMF7A.js +2 -0
- package/dist/v1/chunks/chunk-JOJIMF7A.js.map +7 -0
- package/dist/v1/chunks/chunk-NWD66TP4.js +2 -0
- package/dist/v1/chunks/chunk-NWD66TP4.js.map +7 -0
- package/dist/v1/chunks/chunk-PLQZIFSO.js +2 -0
- package/dist/v1/chunks/chunk-PLQZIFSO.js.map +7 -0
- package/dist/v1/chunks/chunk-PVPXGQIV.js +2 -0
- package/dist/v1/chunks/chunk-PVPXGQIV.js.map +7 -0
- package/dist/v1/chunks/chunk-QDJGX3SU.js +16 -0
- package/dist/v1/chunks/chunk-QDJGX3SU.js.map +7 -0
- package/dist/v1/chunks/chunk-QSGUWHXF.js +2 -0
- package/dist/v1/chunks/chunk-QSGUWHXF.js.map +7 -0
- package/dist/v1/chunks/chunk-RCIRWMC7.js +2 -0
- package/dist/v1/chunks/chunk-RCIRWMC7.js.map +7 -0
- package/dist/v1/chunks/chunk-S4ACHXBI.js +2 -0
- package/dist/v1/chunks/chunk-S4ACHXBI.js.map +7 -0
- package/dist/v1/chunks/chunk-SA4K3XYV.js +2 -0
- package/dist/v1/chunks/chunk-SA4K3XYV.js.map +7 -0
- package/dist/v1/chunks/chunk-SAENYLYK.js +232 -0
- package/dist/v1/chunks/chunk-SAENYLYK.js.map +7 -0
- package/dist/v1/chunks/chunk-SN6BTAM3.js +4 -0
- package/dist/v1/chunks/chunk-SN6BTAM3.js.map +7 -0
- package/dist/v1/chunks/chunk-SWJRRCAF.js +2 -0
- package/dist/v1/chunks/chunk-SWJRRCAF.js.map +7 -0
- package/dist/v1/chunks/chunk-TGL5CWDU.js +63 -0
- package/dist/v1/chunks/chunk-TGL5CWDU.js.map +7 -0
- package/dist/v1/chunks/chunk-TVSQ2OZ6.js +11 -0
- package/dist/v1/chunks/chunk-TVSQ2OZ6.js.map +7 -0
- package/dist/v1/chunks/chunk-URGT6V7R.js +2 -0
- package/dist/v1/chunks/chunk-URGT6V7R.js.map +7 -0
- package/dist/v1/chunks/chunk-WBEUYPCI.js +123 -0
- package/dist/v1/chunks/chunk-WBEUYPCI.js.map +7 -0
- package/dist/v1/chunks/chunk-WEZ3ELJO.js +2 -0
- package/dist/v1/chunks/chunk-WEZ3ELJO.js.map +7 -0
- package/dist/v1/chunks/chunk-WIIGSS4X.js +2 -0
- package/dist/v1/chunks/chunk-WIIGSS4X.js.map +7 -0
- package/dist/v1/chunks/chunk-XUJKMBZ5.js +2 -0
- package/dist/v1/chunks/chunk-XUJKMBZ5.js.map +7 -0
- package/dist/v1/chunks/chunk-YC75LZ32.js +33 -0
- package/dist/v1/chunks/chunk-YC75LZ32.js.map +7 -0
- package/dist/v1/chunks/chunk-YK2CHHQT.js +207 -0
- package/dist/v1/chunks/chunk-YK2CHHQT.js.map +7 -0
- package/dist/v1/chunks/chunk-YYWGGXI6.js +2 -0
- package/dist/v1/chunks/chunk-YYWGGXI6.js.map +7 -0
- package/dist/v1/chunks/chunk-ZY7EQCMR.js +4 -0
- package/dist/v1/chunks/chunk-ZY7EQCMR.js.map +7 -0
- package/dist/v1/chunks/classDiagram-4FO5ZUOK-4VU3VATX.js +2 -0
- package/dist/v1/chunks/classDiagram-4FO5ZUOK-4VU3VATX.js.map +7 -0
- package/dist/v1/chunks/classDiagram-v2-Q7XG4LA2-QIBN3KO6.js +2 -0
- package/dist/v1/chunks/classDiagram-v2-Q7XG4LA2-QIBN3KO6.js.map +7 -0
- package/dist/v1/chunks/cose-bilkent-S5V4N54A-MHLDSCZY.js +2 -0
- package/dist/v1/chunks/cose-bilkent-S5V4N54A-MHLDSCZY.js.map +7 -0
- package/dist/v1/chunks/dagre-BM42HDAG-U3ECKIMS.js +5 -0
- package/dist/v1/chunks/dagre-BM42HDAG-U3ECKIMS.js.map +7 -0
- package/dist/v1/chunks/diagram-2AECGRRQ-BNRGNWOM.js +44 -0
- package/dist/v1/chunks/diagram-2AECGRRQ-BNRGNWOM.js.map +7 -0
- package/dist/v1/chunks/diagram-5GNKFQAL-CPWZIJ4M.js +11 -0
- package/dist/v1/chunks/diagram-5GNKFQAL-CPWZIJ4M.js.map +7 -0
- package/dist/v1/chunks/diagram-KO2AKTUF-7CDCIBL3.js +4 -0
- package/dist/v1/chunks/diagram-KO2AKTUF-7CDCIBL3.js.map +7 -0
- package/dist/v1/chunks/diagram-LMA3HP47-LPHFNXWX.js +25 -0
- package/dist/v1/chunks/diagram-LMA3HP47-LPHFNXWX.js.map +7 -0
- package/dist/v1/chunks/diagram-OG6HWLK6-FWJ2MCGI.js +25 -0
- package/dist/v1/chunks/diagram-OG6HWLK6-FWJ2MCGI.js.map +7 -0
- package/dist/v1/chunks/erDiagram-TEJ5UH35-OX62GPYU.js +86 -0
- package/dist/v1/chunks/erDiagram-TEJ5UH35-OX62GPYU.js.map +7 -0
- package/dist/v1/chunks/eventmodeling-FCH6USID-NRRIBZEB.js +2 -0
- package/dist/v1/chunks/eventmodeling-FCH6USID-NRRIBZEB.js.map +7 -0
- package/dist/v1/chunks/flowDiagram-I6XJVG4X-I4ULL6MS.js +163 -0
- package/dist/v1/chunks/flowDiagram-I6XJVG4X-I4ULL6MS.js.map +7 -0
- package/dist/v1/chunks/ganttDiagram-6RSMTGT7-TIDOVKXT.js +293 -0
- package/dist/v1/chunks/ganttDiagram-6RSMTGT7-TIDOVKXT.js.map +7 -0
- package/dist/v1/chunks/gitGraph-WXDBUCRP-4LEEA2GI.js +2 -0
- package/dist/v1/chunks/gitGraph-WXDBUCRP-4LEEA2GI.js.map +7 -0
- package/dist/v1/chunks/gitGraphDiagram-PVQCEYII-BPEBW2KG.js +107 -0
- package/dist/v1/chunks/gitGraphDiagram-PVQCEYII-BPEBW2KG.js.map +7 -0
- package/dist/v1/chunks/info-J43DQDTF-EI2RS372.js +2 -0
- package/dist/v1/chunks/info-J43DQDTF-EI2RS372.js.map +7 -0
- package/dist/v1/chunks/infoDiagram-5YYISTIA-5GFVQYI7.js +3 -0
- package/dist/v1/chunks/infoDiagram-5YYISTIA-5GFVQYI7.js.map +7 -0
- package/dist/v1/chunks/ishikawaDiagram-YF4QCWOH-AZ7PAHIN.js +71 -0
- package/dist/v1/chunks/ishikawaDiagram-YF4QCWOH-AZ7PAHIN.js.map +7 -0
- package/dist/v1/chunks/journeyDiagram-JHISSGLW-B4ZN6VTS.js +140 -0
- package/dist/v1/chunks/journeyDiagram-JHISSGLW-B4ZN6VTS.js.map +7 -0
- package/dist/v1/chunks/kanban-definition-UN3LZRKU-5THRXHJP.js +90 -0
- package/dist/v1/chunks/kanban-definition-UN3LZRKU-5THRXHJP.js.map +7 -0
- package/dist/v1/chunks/katex-CLI7E3QC.js +258 -0
- package/dist/v1/chunks/katex-CLI7E3QC.js.map +7 -0
- package/dist/v1/chunks/mindmap-definition-RKZ34NQL-E57QDEMN.js +97 -0
- package/dist/v1/chunks/mindmap-definition-RKZ34NQL-E57QDEMN.js.map +7 -0
- package/dist/v1/chunks/packet-YPE3B663-PKWGZRBL.js +2 -0
- package/dist/v1/chunks/packet-YPE3B663-PKWGZRBL.js.map +7 -0
- package/dist/v1/chunks/pie-LRSECV5Y-QSTOXR4H.js +2 -0
- package/dist/v1/chunks/pie-LRSECV5Y-QSTOXR4H.js.map +7 -0
- package/dist/v1/chunks/pieDiagram-4H26LBE5-CZULUIHM.js +31 -0
- package/dist/v1/chunks/pieDiagram-4H26LBE5-CZULUIHM.js.map +7 -0
- package/dist/v1/chunks/quadrantDiagram-W4KKPZXB-WRXQ2LCP.js +8 -0
- package/dist/v1/chunks/quadrantDiagram-W4KKPZXB-WRXQ2LCP.js.map +7 -0
- package/dist/v1/chunks/radar-GUYGQ44K-UJHF7VJA.js +2 -0
- package/dist/v1/chunks/radar-GUYGQ44K-UJHF7VJA.js.map +7 -0
- package/dist/v1/chunks/requirementDiagram-4Y6WPE33-LUKBHY3G.js +85 -0
- package/dist/v1/chunks/requirementDiagram-4Y6WPE33-LUKBHY3G.js.map +7 -0
- package/dist/v1/chunks/sankeyDiagram-5OEKKPKP-IHGIKQ7Q.js +41 -0
- package/dist/v1/chunks/sankeyDiagram-5OEKKPKP-IHGIKQ7Q.js.map +7 -0
- package/dist/v1/chunks/sequenceDiagram-3UESZ5HK-AZIJM7V2.js +163 -0
- package/dist/v1/chunks/sequenceDiagram-3UESZ5HK-AZIJM7V2.js.map +7 -0
- package/dist/v1/chunks/stateDiagram-AJRCARHV-7TL53ICK.js +2 -0
- package/dist/v1/chunks/stateDiagram-AJRCARHV-7TL53ICK.js.map +7 -0
- package/dist/v1/chunks/stateDiagram-v2-BHNVJYJU-TJ245A24.js +2 -0
- package/dist/v1/chunks/stateDiagram-v2-BHNVJYJU-TJ245A24.js.map +7 -0
- package/dist/v1/chunks/timeline-definition-PNZ67QCA-C5FF5CVI.js +121 -0
- package/dist/v1/chunks/timeline-definition-PNZ67QCA-C5FF5CVI.js.map +7 -0
- package/dist/v1/chunks/treeView-BLDUP644-2MCPJRE2.js +2 -0
- package/dist/v1/chunks/treeView-BLDUP644-2MCPJRE2.js.map +7 -0
- package/dist/v1/chunks/treemap-LRROVOQU-WSVRI32O.js +2 -0
- package/dist/v1/chunks/treemap-LRROVOQU-WSVRI32O.js.map +7 -0
- package/dist/v1/chunks/vennDiagram-CIIHVFJN-NQU7FBQX.js +35 -0
- package/dist/v1/chunks/vennDiagram-CIIHVFJN-NQU7FBQX.js.map +7 -0
- package/dist/v1/chunks/wardley-L42UT6IY-GONRRIFG.js +2 -0
- package/dist/v1/chunks/wardley-L42UT6IY-GONRRIFG.js.map +7 -0
- package/dist/v1/chunks/wardleyDiagram-YWT4CUSO-KNM7EB5A.js +79 -0
- package/dist/v1/chunks/wardleyDiagram-YWT4CUSO-KNM7EB5A.js.map +7 -0
- package/dist/v1/chunks/xychartDiagram-2RQKCTM6-CMGOBHPC.js +8 -0
- package/dist/v1/chunks/xychartDiagram-2RQKCTM6-CMGOBHPC.js.map +7 -0
- package/dist/v1/modules/charts.js +4 -0
- package/dist/v1/modules/charts.js.map +7 -0
- package/dist/v1/modules/code.js +26 -0
- package/dist/v1/modules/code.js.map +7 -0
- package/dist/v1/modules/markdown.js +65 -0
- package/dist/v1/modules/markdown.js.map +7 -0
- package/dist/v1/modules/math.js +258 -0
- package/dist/v1/modules/math.js.map +7 -0
- package/dist/v1/modules/mermaid.js +9 -0
- package/dist/v1/modules/mermaid.js.map +7 -0
- package/dist/v1/modules/png.js +3 -0
- package/dist/v1/modules/png.js.map +7 -0
- package/dist/v1/pagelet.js +128 -0
- package/dist/v1/pagelet.js.map +7 -0
- package/package.json +40 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../node_modules/.pnpm/html-to-image@1.11.13/node_modules/html-to-image/src/util.ts", "../../../../../node_modules/.pnpm/html-to-image@1.11.13/node_modules/html-to-image/src/clone-pseudos.ts", "../../../../../node_modules/.pnpm/html-to-image@1.11.13/node_modules/html-to-image/src/mimes.ts", "../../../../../node_modules/.pnpm/html-to-image@1.11.13/node_modules/html-to-image/src/dataurl.ts", "../../../../../node_modules/.pnpm/html-to-image@1.11.13/node_modules/html-to-image/src/clone-node.ts", "../../../../../node_modules/.pnpm/html-to-image@1.11.13/node_modules/html-to-image/src/embed-resources.ts", "../../../../../node_modules/.pnpm/html-to-image@1.11.13/node_modules/html-to-image/src/embed-images.ts", "../../../../../node_modules/.pnpm/html-to-image@1.11.13/node_modules/html-to-image/src/apply-style.ts", "../../../../../node_modules/.pnpm/html-to-image@1.11.13/node_modules/html-to-image/src/embed-webfonts.ts", "../../../../../node_modules/.pnpm/html-to-image@1.11.13/node_modules/html-to-image/src/index.ts", "../../../src/modules/png.ts"],
|
|
4
|
+
"sourcesContent": ["import type { Options } from './types'\n\nexport function resolveUrl(url: string, baseUrl: string | null): string {\n // url is absolute already\n if (url.match(/^[a-z]+:\\/\\//i)) {\n return url\n }\n\n // url is absolute already, without protocol\n if (url.match(/^\\/\\//)) {\n return window.location.protocol + url\n }\n\n // dataURI, mailto:, tel:, etc.\n if (url.match(/^[a-z]+:/i)) {\n return url\n }\n\n const doc = document.implementation.createHTMLDocument()\n const base = doc.createElement('base')\n const a = doc.createElement('a')\n\n doc.head.appendChild(base)\n doc.body.appendChild(a)\n\n if (baseUrl) {\n base.href = baseUrl\n }\n\n a.href = url\n\n return a.href\n}\n\nexport const uuid = (() => {\n // generate uuid for className of pseudo elements.\n // We should not use GUIDs, otherwise pseudo elements sometimes cannot be captured.\n let counter = 0\n\n // ref: http://stackoverflow.com/a/6248722/2519373\n const random = () =>\n // eslint-disable-next-line no-bitwise\n `0000${((Math.random() * 36 ** 4) << 0).toString(36)}`.slice(-4)\n\n return () => {\n counter += 1\n return `u${random()}${counter}`\n }\n})()\n\nexport function delay<T>(ms: number) {\n return (args: T) =>\n new Promise<T>((resolve) => {\n setTimeout(() => resolve(args), ms)\n })\n}\n\nexport function toArray<T>(arrayLike: any): T[] {\n const arr: T[] = []\n\n for (let i = 0, l = arrayLike.length; i < l; i++) {\n arr.push(arrayLike[i])\n }\n\n return arr\n}\n\nlet styleProps: string[] | null = null\nexport function getStyleProperties(options: Options = {}): string[] {\n if (styleProps) {\n return styleProps\n }\n\n if (options.includeStyleProperties) {\n styleProps = options.includeStyleProperties\n return styleProps\n }\n\n styleProps = toArray(window.getComputedStyle(document.documentElement))\n\n return styleProps\n}\n\nfunction px(node: HTMLElement, styleProperty: string) {\n const win = node.ownerDocument.defaultView || window\n const val = win.getComputedStyle(node).getPropertyValue(styleProperty)\n return val ? parseFloat(val.replace('px', '')) : 0\n}\n\nfunction getNodeWidth(node: HTMLElement) {\n const leftBorder = px(node, 'border-left-width')\n const rightBorder = px(node, 'border-right-width')\n return node.clientWidth + leftBorder + rightBorder\n}\n\nfunction getNodeHeight(node: HTMLElement) {\n const topBorder = px(node, 'border-top-width')\n const bottomBorder = px(node, 'border-bottom-width')\n return node.clientHeight + topBorder + bottomBorder\n}\n\nexport function getImageSize(targetNode: HTMLElement, options: Options = {}) {\n const width = options.width || getNodeWidth(targetNode)\n const height = options.height || getNodeHeight(targetNode)\n\n return { width, height }\n}\n\nexport function getPixelRatio() {\n let ratio\n\n let FINAL_PROCESS\n try {\n FINAL_PROCESS = process\n } catch (e) {\n // pass\n }\n\n const val =\n FINAL_PROCESS && FINAL_PROCESS.env\n ? FINAL_PROCESS.env.devicePixelRatio\n : null\n if (val) {\n ratio = parseInt(val, 10)\n if (Number.isNaN(ratio)) {\n ratio = 1\n }\n }\n return ratio || window.devicePixelRatio || 1\n}\n\n// @see https://developer.mozilla.org/en-US/docs/Web/HTML/Element/canvas#maximum_canvas_size\nconst canvasDimensionLimit = 16384\n\nexport function checkCanvasDimensions(canvas: HTMLCanvasElement) {\n if (\n canvas.width > canvasDimensionLimit ||\n canvas.height > canvasDimensionLimit\n ) {\n if (\n canvas.width > canvasDimensionLimit &&\n canvas.height > canvasDimensionLimit\n ) {\n if (canvas.width > canvas.height) {\n canvas.height *= canvasDimensionLimit / canvas.width\n canvas.width = canvasDimensionLimit\n } else {\n canvas.width *= canvasDimensionLimit / canvas.height\n canvas.height = canvasDimensionLimit\n }\n } else if (canvas.width > canvasDimensionLimit) {\n canvas.height *= canvasDimensionLimit / canvas.width\n canvas.width = canvasDimensionLimit\n } else {\n canvas.width *= canvasDimensionLimit / canvas.height\n canvas.height = canvasDimensionLimit\n }\n }\n}\n\nexport function canvasToBlob(\n canvas: HTMLCanvasElement,\n options: Options = {},\n): Promise<Blob | null> {\n if (canvas.toBlob) {\n return new Promise((resolve) => {\n canvas.toBlob(\n resolve,\n options.type ? options.type : 'image/png',\n options.quality ? options.quality : 1,\n )\n })\n }\n\n return new Promise((resolve) => {\n const binaryString = window.atob(\n canvas\n .toDataURL(\n options.type ? options.type : undefined,\n options.quality ? options.quality : undefined,\n )\n .split(',')[1],\n )\n const len = binaryString.length\n const binaryArray = new Uint8Array(len)\n\n for (let i = 0; i < len; i += 1) {\n binaryArray[i] = binaryString.charCodeAt(i)\n }\n\n resolve(\n new Blob([binaryArray], {\n type: options.type ? options.type : 'image/png',\n }),\n )\n })\n}\n\nexport function createImage(url: string): Promise<HTMLImageElement> {\n return new Promise((resolve, reject) => {\n const img = new Image()\n img.onload = () => {\n img.decode().then(() => {\n requestAnimationFrame(() => resolve(img))\n })\n }\n img.onerror = reject\n img.crossOrigin = 'anonymous'\n img.decoding = 'async'\n img.src = url\n })\n}\n\nexport async function svgToDataURL(svg: SVGElement): Promise<string> {\n return Promise.resolve()\n .then(() => new XMLSerializer().serializeToString(svg))\n .then(encodeURIComponent)\n .then((html) => `data:image/svg+xml;charset=utf-8,${html}`)\n}\n\nexport async function nodeToDataURL(\n node: HTMLElement,\n width: number,\n height: number,\n): Promise<string> {\n const xmlns = 'http://www.w3.org/2000/svg'\n const svg = document.createElementNS(xmlns, 'svg')\n const foreignObject = document.createElementNS(xmlns, 'foreignObject')\n\n svg.setAttribute('width', `${width}`)\n svg.setAttribute('height', `${height}`)\n svg.setAttribute('viewBox', `0 0 ${width} ${height}`)\n\n foreignObject.setAttribute('width', '100%')\n foreignObject.setAttribute('height', '100%')\n foreignObject.setAttribute('x', '0')\n foreignObject.setAttribute('y', '0')\n foreignObject.setAttribute('externalResourcesRequired', 'true')\n\n svg.appendChild(foreignObject)\n foreignObject.appendChild(node)\n return svgToDataURL(svg)\n}\n\nexport const isInstanceOfElement = <\n T extends typeof Element | typeof HTMLElement | typeof SVGImageElement,\n>(\n node: Element | HTMLElement | SVGImageElement,\n instance: T,\n): node is T['prototype'] => {\n if (node instanceof instance) return true\n\n const nodePrototype = Object.getPrototypeOf(node)\n\n if (nodePrototype === null) return false\n\n return (\n nodePrototype.constructor.name === instance.name ||\n isInstanceOfElement(nodePrototype, instance)\n )\n}\n", "import type { Options } from './types'\nimport { uuid, getStyleProperties } from './util'\n\ntype Pseudo = ':before' | ':after'\n\nfunction formatCSSText(style: CSSStyleDeclaration) {\n const content = style.getPropertyValue('content')\n return `${style.cssText} content: '${content.replace(/'|\"/g, '')}';`\n}\n\nfunction formatCSSProperties(style: CSSStyleDeclaration, options: Options) {\n return getStyleProperties(options)\n .map((name) => {\n const value = style.getPropertyValue(name)\n const priority = style.getPropertyPriority(name)\n\n return `${name}: ${value}${priority ? ' !important' : ''};`\n })\n .join(' ')\n}\n\nfunction getPseudoElementStyle(\n className: string,\n pseudo: Pseudo,\n style: CSSStyleDeclaration,\n options: Options,\n): Text {\n const selector = `.${className}:${pseudo}`\n const cssText = style.cssText\n ? formatCSSText(style)\n : formatCSSProperties(style, options)\n\n return document.createTextNode(`${selector}{${cssText}}`)\n}\n\nfunction clonePseudoElement<T extends HTMLElement>(\n nativeNode: T,\n clonedNode: T,\n pseudo: Pseudo,\n options: Options,\n) {\n const style = window.getComputedStyle(nativeNode, pseudo)\n const content = style.getPropertyValue('content')\n if (content === '' || content === 'none') {\n return\n }\n\n const className = uuid()\n try {\n clonedNode.className = `${clonedNode.className} ${className}`\n } catch (err) {\n return\n }\n\n const styleElement = document.createElement('style')\n styleElement.appendChild(\n getPseudoElementStyle(className, pseudo, style, options),\n )\n clonedNode.appendChild(styleElement)\n}\n\nexport function clonePseudoElements<T extends HTMLElement>(\n nativeNode: T,\n clonedNode: T,\n options: Options,\n) {\n clonePseudoElement(nativeNode, clonedNode, ':before', options)\n clonePseudoElement(nativeNode, clonedNode, ':after', options)\n}\n", "const WOFF = 'application/font-woff'\nconst JPEG = 'image/jpeg'\nconst mimes: { [key: string]: string } = {\n woff: WOFF,\n woff2: WOFF,\n ttf: 'application/font-truetype',\n eot: 'application/vnd.ms-fontobject',\n png: 'image/png',\n jpg: JPEG,\n jpeg: JPEG,\n gif: 'image/gif',\n tiff: 'image/tiff',\n svg: 'image/svg+xml',\n webp: 'image/webp',\n}\n\nfunction getExtension(url: string): string {\n const match = /\\.([^./]*?)$/g.exec(url)\n return match ? match[1] : ''\n}\n\nexport function getMimeType(url: string): string {\n const extension = getExtension(url).toLowerCase()\n return mimes[extension] || ''\n}\n", "import { Options } from './types'\n\nfunction getContentFromDataUrl(dataURL: string) {\n return dataURL.split(/,/)[1]\n}\n\nexport function isDataUrl(url: string) {\n return url.search(/^(data:)/) !== -1\n}\n\nexport function makeDataUrl(content: string, mimeType: string) {\n return `data:${mimeType};base64,${content}`\n}\n\nexport async function fetchAsDataURL<T>(\n url: string,\n init: RequestInit | undefined,\n process: (data: { result: string; res: Response }) => T,\n): Promise<T> {\n const res = await fetch(url, init)\n if (res.status === 404) {\n throw new Error(`Resource \"${res.url}\" not found`)\n }\n const blob = await res.blob()\n return new Promise<T>((resolve, reject) => {\n const reader = new FileReader()\n reader.onerror = reject\n reader.onloadend = () => {\n try {\n resolve(process({ res, result: reader.result as string }))\n } catch (error) {\n reject(error)\n }\n }\n\n reader.readAsDataURL(blob)\n })\n}\n\nconst cache: { [url: string]: string } = {}\n\nfunction getCacheKey(\n url: string,\n contentType: string | undefined,\n includeQueryParams: boolean | undefined,\n) {\n let key = url.replace(/\\?.*/, '')\n\n if (includeQueryParams) {\n key = url\n }\n\n // font resource\n if (/ttf|otf|eot|woff2?/i.test(key)) {\n key = key.replace(/.*\\//, '')\n }\n\n return contentType ? `[${contentType}]${key}` : key\n}\n\nexport async function resourceToDataURL(\n resourceUrl: string,\n contentType: string | undefined,\n options: Options,\n) {\n const cacheKey = getCacheKey(\n resourceUrl,\n contentType,\n options.includeQueryParams,\n )\n\n if (cache[cacheKey] != null) {\n return cache[cacheKey]\n }\n\n // ref: https://developer.mozilla.org/en/docs/Web/API/XMLHttpRequest/Using_XMLHttpRequest#Bypassing_the_cache\n if (options.cacheBust) {\n // eslint-disable-next-line no-param-reassign\n resourceUrl += (/\\?/.test(resourceUrl) ? '&' : '?') + new Date().getTime()\n }\n\n let dataURL: string\n try {\n const content = await fetchAsDataURL(\n resourceUrl,\n options.fetchRequestInit,\n ({ res, result }) => {\n if (!contentType) {\n // eslint-disable-next-line no-param-reassign\n contentType = res.headers.get('Content-Type') || ''\n }\n return getContentFromDataUrl(result)\n },\n )\n dataURL = makeDataUrl(content, contentType!)\n } catch (error) {\n dataURL = options.imagePlaceholder || ''\n\n let msg = `Failed to fetch resource: ${resourceUrl}`\n if (error) {\n msg = typeof error === 'string' ? error : error.message\n }\n\n if (msg) {\n console.warn(msg)\n }\n }\n\n cache[cacheKey] = dataURL\n return dataURL\n}\n", "import type { Options } from './types'\nimport { clonePseudoElements } from './clone-pseudos'\nimport {\n createImage,\n toArray,\n isInstanceOfElement,\n getStyleProperties,\n} from './util'\nimport { getMimeType } from './mimes'\nimport { resourceToDataURL } from './dataurl'\n\nasync function cloneCanvasElement(canvas: HTMLCanvasElement) {\n const dataURL = canvas.toDataURL()\n if (dataURL === 'data:,') {\n return canvas.cloneNode(false) as HTMLCanvasElement\n }\n return createImage(dataURL)\n}\n\nasync function cloneVideoElement(video: HTMLVideoElement, options: Options) {\n if (video.currentSrc) {\n const canvas = document.createElement('canvas')\n const ctx = canvas.getContext('2d')\n canvas.width = video.clientWidth\n canvas.height = video.clientHeight\n ctx?.drawImage(video, 0, 0, canvas.width, canvas.height)\n const dataURL = canvas.toDataURL()\n return createImage(dataURL)\n }\n\n const poster = video.poster\n const contentType = getMimeType(poster)\n const dataURL = await resourceToDataURL(poster, contentType, options)\n return createImage(dataURL)\n}\n\nasync function cloneIFrameElement(iframe: HTMLIFrameElement, options: Options) {\n try {\n if (iframe?.contentDocument?.body) {\n return (await cloneNode(\n iframe.contentDocument.body,\n options,\n true,\n )) as HTMLBodyElement\n }\n } catch {\n // Failed to clone iframe\n }\n\n return iframe.cloneNode(false) as HTMLIFrameElement\n}\n\nasync function cloneSingleNode<T extends HTMLElement>(\n node: T,\n options: Options,\n): Promise<HTMLElement> {\n if (isInstanceOfElement(node, HTMLCanvasElement)) {\n return cloneCanvasElement(node)\n }\n\n if (isInstanceOfElement(node, HTMLVideoElement)) {\n return cloneVideoElement(node, options)\n }\n\n if (isInstanceOfElement(node, HTMLIFrameElement)) {\n return cloneIFrameElement(node, options)\n }\n\n return node.cloneNode(isSVGElement(node)) as T\n}\n\nconst isSlotElement = (node: HTMLElement): node is HTMLSlotElement =>\n node.tagName != null && node.tagName.toUpperCase() === 'SLOT'\n\nconst isSVGElement = (node: HTMLElement): node is HTMLSlotElement =>\n node.tagName != null && node.tagName.toUpperCase() === 'SVG'\n\nasync function cloneChildren<T extends HTMLElement>(\n nativeNode: T,\n clonedNode: T,\n options: Options,\n): Promise<T> {\n if (isSVGElement(clonedNode)) {\n return clonedNode\n }\n\n let children: T[] = []\n\n if (isSlotElement(nativeNode) && nativeNode.assignedNodes) {\n children = toArray<T>(nativeNode.assignedNodes())\n } else if (\n isInstanceOfElement(nativeNode, HTMLIFrameElement) &&\n nativeNode.contentDocument?.body\n ) {\n children = toArray<T>(nativeNode.contentDocument.body.childNodes)\n } else {\n children = toArray<T>((nativeNode.shadowRoot ?? nativeNode).childNodes)\n }\n\n if (\n children.length === 0 ||\n isInstanceOfElement(nativeNode, HTMLVideoElement)\n ) {\n return clonedNode\n }\n\n await children.reduce(\n (deferred, child) =>\n deferred\n .then(() => cloneNode(child, options))\n .then((clonedChild: HTMLElement | null) => {\n if (clonedChild) {\n clonedNode.appendChild(clonedChild)\n }\n }),\n Promise.resolve(),\n )\n\n return clonedNode\n}\n\nfunction cloneCSSStyle<T extends HTMLElement>(\n nativeNode: T,\n clonedNode: T,\n options: Options,\n) {\n const targetStyle = clonedNode.style\n if (!targetStyle) {\n return\n }\n\n const sourceStyle = window.getComputedStyle(nativeNode)\n if (sourceStyle.cssText) {\n targetStyle.cssText = sourceStyle.cssText\n targetStyle.transformOrigin = sourceStyle.transformOrigin\n } else {\n getStyleProperties(options).forEach((name) => {\n let value = sourceStyle.getPropertyValue(name)\n if (name === 'font-size' && value.endsWith('px')) {\n const reducedFont =\n Math.floor(parseFloat(value.substring(0, value.length - 2))) - 0.1\n value = `${reducedFont}px`\n }\n\n if (\n isInstanceOfElement(nativeNode, HTMLIFrameElement) &&\n name === 'display' &&\n value === 'inline'\n ) {\n value = 'block'\n }\n\n if (name === 'd' && clonedNode.getAttribute('d')) {\n value = `path(${clonedNode.getAttribute('d')})`\n }\n\n targetStyle.setProperty(\n name,\n value,\n sourceStyle.getPropertyPriority(name),\n )\n })\n }\n}\n\nfunction cloneInputValue<T extends HTMLElement>(nativeNode: T, clonedNode: T) {\n if (isInstanceOfElement(nativeNode, HTMLTextAreaElement)) {\n clonedNode.innerHTML = nativeNode.value\n }\n\n if (isInstanceOfElement(nativeNode, HTMLInputElement)) {\n clonedNode.setAttribute('value', nativeNode.value)\n }\n}\n\nfunction cloneSelectValue<T extends HTMLElement>(nativeNode: T, clonedNode: T) {\n if (isInstanceOfElement(nativeNode, HTMLSelectElement)) {\n const clonedSelect = clonedNode as any as HTMLSelectElement\n const selectedOption = Array.from(clonedSelect.children).find(\n (child) => nativeNode.value === child.getAttribute('value'),\n )\n\n if (selectedOption) {\n selectedOption.setAttribute('selected', '')\n }\n }\n}\n\nfunction decorate<T extends HTMLElement>(\n nativeNode: T,\n clonedNode: T,\n options: Options,\n): T {\n if (isInstanceOfElement(clonedNode, Element)) {\n cloneCSSStyle(nativeNode, clonedNode, options)\n clonePseudoElements(nativeNode, clonedNode, options)\n cloneInputValue(nativeNode, clonedNode)\n cloneSelectValue(nativeNode, clonedNode)\n }\n\n return clonedNode\n}\n\nasync function ensureSVGSymbols<T extends HTMLElement>(\n clone: T,\n options: Options,\n) {\n const uses = clone.querySelectorAll ? clone.querySelectorAll('use') : []\n if (uses.length === 0) {\n return clone\n }\n\n const processedDefs: { [key: string]: HTMLElement } = {}\n for (let i = 0; i < uses.length; i++) {\n const use = uses[i]\n const id = use.getAttribute('xlink:href')\n if (id) {\n const exist = clone.querySelector(id)\n const definition = document.querySelector(id) as HTMLElement\n if (!exist && definition && !processedDefs[id]) {\n // eslint-disable-next-line no-await-in-loop\n processedDefs[id] = (await cloneNode(definition, options, true))!\n }\n }\n }\n\n const nodes = Object.values(processedDefs)\n if (nodes.length) {\n const ns = 'http://www.w3.org/1999/xhtml'\n const svg = document.createElementNS(ns, 'svg')\n svg.setAttribute('xmlns', ns)\n svg.style.position = 'absolute'\n svg.style.width = '0'\n svg.style.height = '0'\n svg.style.overflow = 'hidden'\n svg.style.display = 'none'\n\n const defs = document.createElementNS(ns, 'defs')\n svg.appendChild(defs)\n\n for (let i = 0; i < nodes.length; i++) {\n defs.appendChild(nodes[i])\n }\n\n clone.appendChild(svg)\n }\n\n return clone\n}\n\nexport async function cloneNode<T extends HTMLElement>(\n node: T,\n options: Options,\n isRoot?: boolean,\n): Promise<T | null> {\n if (!isRoot && options.filter && !options.filter(node)) {\n return null\n }\n\n return Promise.resolve(node)\n .then((clonedNode) => cloneSingleNode(clonedNode, options) as Promise<T>)\n .then((clonedNode) => cloneChildren(node, clonedNode, options))\n .then((clonedNode) => decorate(node, clonedNode, options))\n .then((clonedNode) => ensureSVGSymbols(clonedNode, options))\n}\n", "import { Options } from './types'\nimport { resolveUrl } from './util'\nimport { getMimeType } from './mimes'\nimport { isDataUrl, makeDataUrl, resourceToDataURL } from './dataurl'\n\nconst URL_REGEX = /url\\((['\"]?)([^'\"]+?)\\1\\)/g\nconst URL_WITH_FORMAT_REGEX = /url\\([^)]+\\)\\s*format\\(([\"']?)([^\"']+)\\1\\)/g\nconst FONT_SRC_REGEX = /src:\\s*(?:url\\([^)]+\\)\\s*format\\([^)]+\\)[,;]\\s*)+/g\n\nfunction toRegex(url: string): RegExp {\n // eslint-disable-next-line no-useless-escape\n const escaped = url.replace(/([.*+?^${}()|\\[\\]\\/\\\\])/g, '\\\\$1')\n return new RegExp(`(url\\\\(['\"]?)(${escaped})(['\"]?\\\\))`, 'g')\n}\n\nexport function parseURLs(cssText: string): string[] {\n const urls: string[] = []\n\n cssText.replace(URL_REGEX, (raw, quotation, url) => {\n urls.push(url)\n return raw\n })\n\n return urls.filter((url) => !isDataUrl(url))\n}\n\nexport async function embed(\n cssText: string,\n resourceURL: string,\n baseURL: string | null,\n options: Options,\n getContentFromUrl?: (url: string) => Promise<string>,\n): Promise<string> {\n try {\n const resolvedURL = baseURL ? resolveUrl(resourceURL, baseURL) : resourceURL\n const contentType = getMimeType(resourceURL)\n let dataURL: string\n if (getContentFromUrl) {\n const content = await getContentFromUrl(resolvedURL)\n dataURL = makeDataUrl(content, contentType)\n } else {\n dataURL = await resourceToDataURL(resolvedURL, contentType, options)\n }\n return cssText.replace(toRegex(resourceURL), `$1${dataURL}$3`)\n } catch (error) {\n // pass\n }\n return cssText\n}\n\nfunction filterPreferredFontFormat(\n str: string,\n { preferredFontFormat }: Options,\n): string {\n return !preferredFontFormat\n ? str\n : str.replace(FONT_SRC_REGEX, (match: string) => {\n // eslint-disable-next-line no-constant-condition\n while (true) {\n const [src, , format] = URL_WITH_FORMAT_REGEX.exec(match) || []\n if (!format) {\n return ''\n }\n\n if (format === preferredFontFormat) {\n return `src: ${src};`\n }\n }\n })\n}\n\nexport function shouldEmbed(url: string): boolean {\n return url.search(URL_REGEX) !== -1\n}\n\nexport async function embedResources(\n cssText: string,\n baseUrl: string | null,\n options: Options,\n): Promise<string> {\n if (!shouldEmbed(cssText)) {\n return cssText\n }\n\n const filteredCSSText = filterPreferredFontFormat(cssText, options)\n const urls = parseURLs(filteredCSSText)\n return urls.reduce(\n (deferred, url) =>\n deferred.then((css) => embed(css, url, baseUrl, options)),\n Promise.resolve(filteredCSSText),\n )\n}\n", "import { Options } from './types'\nimport { embedResources } from './embed-resources'\nimport { toArray, isInstanceOfElement } from './util'\nimport { isDataUrl, resourceToDataURL } from './dataurl'\nimport { getMimeType } from './mimes'\n\nasync function embedProp(\n propName: string,\n node: HTMLElement,\n options: Options,\n) {\n const propValue = node.style?.getPropertyValue(propName)\n if (propValue) {\n const cssString = await embedResources(propValue, null, options)\n node.style.setProperty(\n propName,\n cssString,\n node.style.getPropertyPriority(propName),\n )\n return true\n }\n return false\n}\n\nasync function embedBackground<T extends HTMLElement>(\n clonedNode: T,\n options: Options,\n) {\n ;(await embedProp('background', clonedNode, options)) ||\n (await embedProp('background-image', clonedNode, options))\n ;(await embedProp('mask', clonedNode, options)) ||\n (await embedProp('-webkit-mask', clonedNode, options)) ||\n (await embedProp('mask-image', clonedNode, options)) ||\n (await embedProp('-webkit-mask-image', clonedNode, options))\n}\n\nasync function embedImageNode<T extends HTMLElement | SVGImageElement>(\n clonedNode: T,\n options: Options,\n) {\n const isImageElement = isInstanceOfElement(clonedNode, HTMLImageElement)\n\n if (\n !(isImageElement && !isDataUrl(clonedNode.src)) &&\n !(\n isInstanceOfElement(clonedNode, SVGImageElement) &&\n !isDataUrl(clonedNode.href.baseVal)\n )\n ) {\n return\n }\n\n const url = isImageElement ? clonedNode.src : clonedNode.href.baseVal\n\n const dataURL = await resourceToDataURL(url, getMimeType(url), options)\n await new Promise((resolve, reject) => {\n clonedNode.onload = resolve\n clonedNode.onerror = options.onImageErrorHandler\n ? (...attributes) => {\n try {\n resolve(options.onImageErrorHandler!(...attributes))\n } catch (error) {\n reject(error)\n }\n }\n : reject\n\n const image = clonedNode as HTMLImageElement\n if (image.decode) {\n image.decode = resolve as any\n }\n\n if (image.loading === 'lazy') {\n image.loading = 'eager'\n }\n\n if (isImageElement) {\n clonedNode.srcset = ''\n clonedNode.src = dataURL\n } else {\n clonedNode.href.baseVal = dataURL\n }\n })\n}\n\nasync function embedChildren<T extends HTMLElement>(\n clonedNode: T,\n options: Options,\n) {\n const children = toArray<HTMLElement>(clonedNode.childNodes)\n const deferreds = children.map((child) => embedImages(child, options))\n await Promise.all(deferreds).then(() => clonedNode)\n}\n\nexport async function embedImages<T extends HTMLElement>(\n clonedNode: T,\n options: Options,\n) {\n if (isInstanceOfElement(clonedNode, Element)) {\n await embedBackground(clonedNode, options)\n await embedImageNode(clonedNode, options)\n await embedChildren(clonedNode, options)\n }\n}\n", "import type { Options } from './types'\n\nexport function applyStyle<T extends HTMLElement>(\n node: T,\n options: Options,\n): T {\n const { style } = node\n\n if (options.backgroundColor) {\n style.backgroundColor = options.backgroundColor\n }\n\n if (options.width) {\n style.width = `${options.width}px`\n }\n\n if (options.height) {\n style.height = `${options.height}px`\n }\n\n const manual = options.style\n if (manual != null) {\n Object.keys(manual).forEach((key: any) => {\n style[key] = manual[key] as string\n })\n }\n\n return node\n}\n", "import type { Options } from './types'\nimport { toArray } from './util'\nimport { fetchAsDataURL } from './dataurl'\nimport { shouldEmbed, embedResources } from './embed-resources'\n\ninterface Metadata {\n url: string\n cssText: string\n}\n\nconst cssFetchCache: { [href: string]: Metadata } = {}\n\nasync function fetchCSS(url: string) {\n let cache = cssFetchCache[url]\n if (cache != null) {\n return cache\n }\n\n const res = await fetch(url)\n const cssText = await res.text()\n cache = { url, cssText }\n\n cssFetchCache[url] = cache\n\n return cache\n}\n\nasync function embedFonts(data: Metadata, options: Options): Promise<string> {\n let cssText = data.cssText\n const regexUrl = /url\\([\"']?([^\"')]+)[\"']?\\)/g\n const fontLocs = cssText.match(/url\\([^)]+\\)/g) || []\n const loadFonts = fontLocs.map(async (loc: string) => {\n let url = loc.replace(regexUrl, '$1')\n if (!url.startsWith('https://')) {\n url = new URL(url, data.url).href\n }\n\n return fetchAsDataURL<[string, string]>(\n url,\n options.fetchRequestInit,\n ({ result }) => {\n cssText = cssText.replace(loc, `url(${result})`)\n return [loc, result]\n },\n )\n })\n\n return Promise.all(loadFonts).then(() => cssText)\n}\n\nfunction parseCSS(source: string) {\n if (source == null) {\n return []\n }\n\n const result: string[] = []\n const commentsRegex = /(\\/\\*[\\s\\S]*?\\*\\/)/gi\n // strip out comments\n let cssText = source.replace(commentsRegex, '')\n\n // eslint-disable-next-line prefer-regex-literals\n const keyframesRegex = new RegExp(\n '((@.*?keyframes [\\\\s\\\\S]*?){([\\\\s\\\\S]*?}\\\\s*?)})',\n 'gi',\n )\n\n // eslint-disable-next-line no-constant-condition\n while (true) {\n const matches = keyframesRegex.exec(cssText)\n if (matches === null) {\n break\n }\n result.push(matches[0])\n }\n cssText = cssText.replace(keyframesRegex, '')\n\n const importRegex = /@import[\\s\\S]*?url\\([^)]*\\)[\\s\\S]*?;/gi\n // to match css & media queries together\n const combinedCSSRegex =\n '((\\\\s*?(?:\\\\/\\\\*[\\\\s\\\\S]*?\\\\*\\\\/)?\\\\s*?@media[\\\\s\\\\S]' +\n '*?){([\\\\s\\\\S]*?)}\\\\s*?})|(([\\\\s\\\\S]*?){([\\\\s\\\\S]*?)})'\n // unified regex\n const unifiedRegex = new RegExp(combinedCSSRegex, 'gi')\n\n // eslint-disable-next-line no-constant-condition\n while (true) {\n let matches = importRegex.exec(cssText)\n if (matches === null) {\n matches = unifiedRegex.exec(cssText)\n if (matches === null) {\n break\n } else {\n importRegex.lastIndex = unifiedRegex.lastIndex\n }\n } else {\n unifiedRegex.lastIndex = importRegex.lastIndex\n }\n result.push(matches[0])\n }\n\n return result\n}\n\nasync function getCSSRules(\n styleSheets: CSSStyleSheet[],\n options: Options,\n): Promise<CSSStyleRule[]> {\n const ret: CSSStyleRule[] = []\n const deferreds: Promise<number | void>[] = []\n\n // First loop inlines imports\n styleSheets.forEach((sheet) => {\n if ('cssRules' in sheet) {\n try {\n toArray<CSSRule>(sheet.cssRules || []).forEach((item, index) => {\n if (item.type === CSSRule.IMPORT_RULE) {\n let importIndex = index + 1\n const url = (item as CSSImportRule).href\n const deferred = fetchCSS(url)\n .then((metadata) => embedFonts(metadata, options))\n .then((cssText) =>\n parseCSS(cssText).forEach((rule) => {\n try {\n sheet.insertRule(\n rule,\n rule.startsWith('@import')\n ? (importIndex += 1)\n : sheet.cssRules.length,\n )\n } catch (error) {\n console.error('Error inserting rule from remote css', {\n rule,\n error,\n })\n }\n }),\n )\n .catch((e) => {\n console.error('Error loading remote css', e.toString())\n })\n\n deferreds.push(deferred)\n }\n })\n } catch (e) {\n const inline =\n styleSheets.find((a) => a.href == null) || document.styleSheets[0]\n if (sheet.href != null) {\n deferreds.push(\n fetchCSS(sheet.href)\n .then((metadata) => embedFonts(metadata, options))\n .then((cssText) =>\n parseCSS(cssText).forEach((rule) => {\n inline.insertRule(rule, inline.cssRules.length)\n }),\n )\n .catch((err: unknown) => {\n console.error('Error loading remote stylesheet', err)\n }),\n )\n }\n console.error('Error inlining remote css file', e)\n }\n }\n })\n\n return Promise.all(deferreds).then(() => {\n // Second loop parses rules\n styleSheets.forEach((sheet) => {\n if ('cssRules' in sheet) {\n try {\n toArray<CSSStyleRule>(sheet.cssRules || []).forEach((item) => {\n ret.push(item)\n })\n } catch (e) {\n console.error(`Error while reading CSS rules from ${sheet.href}`, e)\n }\n }\n })\n\n return ret\n })\n}\n\nfunction getWebFontRules(cssRules: CSSStyleRule[]): CSSStyleRule[] {\n return cssRules\n .filter((rule) => rule.type === CSSRule.FONT_FACE_RULE)\n .filter((rule) => shouldEmbed(rule.style.getPropertyValue('src')))\n}\n\nasync function parseWebFontRules<T extends HTMLElement>(\n node: T,\n options: Options,\n) {\n if (node.ownerDocument == null) {\n throw new Error('Provided element is not within a Document')\n }\n\n const styleSheets = toArray<CSSStyleSheet>(node.ownerDocument.styleSheets)\n const cssRules = await getCSSRules(styleSheets, options)\n\n return getWebFontRules(cssRules)\n}\n\nfunction normalizeFontFamily(font: string) {\n return font.trim().replace(/[\"']/g, '')\n}\n\nfunction getUsedFonts(node: HTMLElement) {\n const fonts = new Set<string>()\n function traverse(node: HTMLElement) {\n const fontFamily =\n node.style.fontFamily || getComputedStyle(node).fontFamily\n fontFamily.split(',').forEach((font) => {\n fonts.add(normalizeFontFamily(font))\n })\n\n Array.from(node.children).forEach((child) => {\n if (child instanceof HTMLElement) {\n traverse(child)\n }\n })\n }\n traverse(node)\n return fonts\n}\n\nexport async function getWebFontCSS<T extends HTMLElement>(\n node: T,\n options: Options,\n): Promise<string> {\n const rules = await parseWebFontRules(node, options)\n const usedFonts = getUsedFonts(node)\n const cssTexts = await Promise.all(\n rules\n .filter((rule) =>\n usedFonts.has(normalizeFontFamily(rule.style.fontFamily)),\n )\n .map((rule) => {\n const baseUrl = rule.parentStyleSheet\n ? rule.parentStyleSheet.href\n : null\n return embedResources(rule.cssText, baseUrl, options)\n }),\n )\n\n return cssTexts.join('\\n')\n}\n\nexport async function embedWebFonts<T extends HTMLElement>(\n clonedNode: T,\n options: Options,\n) {\n const cssText =\n options.fontEmbedCSS != null\n ? options.fontEmbedCSS\n : options.skipFonts\n ? null\n : await getWebFontCSS(clonedNode, options)\n\n if (cssText) {\n const styleNode = document.createElement('style')\n const sytleContent = document.createTextNode(cssText)\n\n styleNode.appendChild(sytleContent)\n\n if (clonedNode.firstChild) {\n clonedNode.insertBefore(styleNode, clonedNode.firstChild)\n } else {\n clonedNode.appendChild(styleNode)\n }\n }\n}\n", "import { Options } from './types'\nimport { cloneNode } from './clone-node'\nimport { embedImages } from './embed-images'\nimport { applyStyle } from './apply-style'\nimport { embedWebFonts, getWebFontCSS } from './embed-webfonts'\nimport {\n getImageSize,\n getPixelRatio,\n createImage,\n canvasToBlob,\n nodeToDataURL,\n checkCanvasDimensions,\n} from './util'\n\nexport async function toSvg<T extends HTMLElement>(\n node: T,\n options: Options = {},\n): Promise<string> {\n const { width, height } = getImageSize(node, options)\n const clonedNode = (await cloneNode(node, options, true)) as HTMLElement\n await embedWebFonts(clonedNode, options)\n await embedImages(clonedNode, options)\n applyStyle(clonedNode, options)\n const datauri = await nodeToDataURL(clonedNode, width, height)\n return datauri\n}\n\nexport async function toCanvas<T extends HTMLElement>(\n node: T,\n options: Options = {},\n): Promise<HTMLCanvasElement> {\n const { width, height } = getImageSize(node, options)\n const svg = await toSvg(node, options)\n const img = await createImage(svg)\n\n const canvas = document.createElement('canvas')\n const context = canvas.getContext('2d')!\n const ratio = options.pixelRatio || getPixelRatio()\n const canvasWidth = options.canvasWidth || width\n const canvasHeight = options.canvasHeight || height\n\n canvas.width = canvasWidth * ratio\n canvas.height = canvasHeight * ratio\n\n if (!options.skipAutoScale) {\n checkCanvasDimensions(canvas)\n }\n canvas.style.width = `${canvasWidth}`\n canvas.style.height = `${canvasHeight}`\n\n if (options.backgroundColor) {\n context.fillStyle = options.backgroundColor\n context.fillRect(0, 0, canvas.width, canvas.height)\n }\n\n context.drawImage(img, 0, 0, canvas.width, canvas.height)\n\n return canvas\n}\n\nexport async function toPixelData<T extends HTMLElement>(\n node: T,\n options: Options = {},\n): Promise<Uint8ClampedArray> {\n const { width, height } = getImageSize(node, options)\n const canvas = await toCanvas(node, options)\n const ctx = canvas.getContext('2d')!\n return ctx.getImageData(0, 0, width, height).data\n}\n\nexport async function toPng<T extends HTMLElement>(\n node: T,\n options: Options = {},\n): Promise<string> {\n const canvas = await toCanvas(node, options)\n return canvas.toDataURL()\n}\n\nexport async function toJpeg<T extends HTMLElement>(\n node: T,\n options: Options = {},\n): Promise<string> {\n const canvas = await toCanvas(node, options)\n return canvas.toDataURL('image/jpeg', options.quality || 1)\n}\n\nexport async function toBlob<T extends HTMLElement>(\n node: T,\n options: Options = {},\n): Promise<Blob | null> {\n const canvas = await toCanvas(node, options)\n const blob = await canvasToBlob(canvas)\n return blob\n}\n\nexport async function getFontEmbedCSS<T extends HTMLElement>(\n node: T,\n options: Options = {},\n): Promise<string> {\n return getWebFontCSS(node, options)\n}\n", "// png capability — export the document (or main content) as a 2× PNG. Lazy-loaded by the toolbar.\nimport { toPng } from 'html-to-image'\nimport { warn } from '../util'\n\nexport async function exportPng(): Promise<void> {\n const target = (document.querySelector('.pagelet-prose') as HTMLElement) || document.body\n try {\n const dataUrl = await toPng(target, {\n pixelRatio: 2,\n backgroundColor: getComputedStyle(document.body).backgroundColor || '#ffffff',\n style: { margin: '0' },\n })\n const a = document.createElement('a')\n a.href = dataUrl\n a.download = 'pagelet.png'\n a.click()\n } catch (e) {\n warn('png', e)\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["resolveUrl", "url", "baseUrl", "doc", "base", "a", "uuid", "counter", "random", "toArray", "arrayLike", "arr", "i", "l", "styleProps", "getStyleProperties", "options", "px", "node", "styleProperty", "val", "getNodeWidth", "leftBorder", "rightBorder", "getNodeHeight", "topBorder", "bottomBorder", "getImageSize", "targetNode", "width", "height", "getPixelRatio", "ratio", "FINAL_PROCESS", "canvasDimensionLimit", "checkCanvasDimensions", "canvas", "createImage", "url", "resolve", "reject", "img", "svgToDataURL", "svg", "html", "nodeToDataURL", "node", "width", "height", "xmlns", "foreignObject", "isInstanceOfElement", "instance", "nodePrototype", "formatCSSText", "style", "content", "formatCSSProperties", "options", "getStyleProperties", "name", "value", "priority", "getPseudoElementStyle", "className", "pseudo", "selector", "cssText", "clonePseudoElement", "nativeNode", "clonedNode", "uuid", "styleElement", "clonePseudoElements", "WOFF", "JPEG", "mimes", "getExtension", "url", "match", "getMimeType", "extension", "getContentFromDataUrl", "dataURL", "isDataUrl", "url", "makeDataUrl", "content", "mimeType", "fetchAsDataURL", "init", "process", "res", "blob", "resolve", "reject", "reader", "error", "cache", "getCacheKey", "contentType", "includeQueryParams", "key", "resourceToDataURL", "resourceUrl", "options", "cacheKey", "result", "msg", "cloneCanvasElement", "canvas", "dataURL", "createImage", "cloneVideoElement", "video", "options", "ctx", "poster", "contentType", "getMimeType", "resourceToDataURL", "cloneIFrameElement", "iframe", "_a", "cloneNode", "cloneSingleNode", "node", "isInstanceOfElement", "isSVGElement", "isSlotElement", "cloneChildren", "nativeNode", "clonedNode", "children", "toArray", "_b", "deferred", "child", "clonedChild", "cloneCSSStyle", "targetStyle", "sourceStyle", "getStyleProperties", "name", "value", "cloneInputValue", "cloneSelectValue", "selectedOption", "decorate", "clonePseudoElements", "ensureSVGSymbols", "clone", "uses", "processedDefs", "i", "id", "exist", "definition", "nodes", "ns", "svg", "defs", "isRoot", "URL_REGEX", "URL_WITH_FORMAT_REGEX", "FONT_SRC_REGEX", "toRegex", "url", "escaped", "parseURLs", "cssText", "urls", "raw", "quotation", "isDataUrl", "embed", "resourceURL", "baseURL", "options", "getContentFromUrl", "resolvedURL", "resolveUrl", "contentType", "getMimeType", "dataURL", "content", "makeDataUrl", "resourceToDataURL", "filterPreferredFontFormat", "str", "preferredFontFormat", "match", "src", "format", "shouldEmbed", "embedResources", "baseUrl", "filteredCSSText", "deferred", "css", "embedProp", "propName", "node", "options", "propValue", "_a", "cssString", "embedResources", "embedBackground", "clonedNode", "embedImageNode", "isImageElement", "isInstanceOfElement", "isDataUrl", "url", "dataURL", "resourceToDataURL", "getMimeType", "resolve", "reject", "attributes", "error", "image", "embedChildren", "deferreds", "toArray", "child", "embedImages", "applyStyle", "node", "options", "style", "manual", "key", "cssFetchCache", "fetchCSS", "url", "cache", "cssText", "embedFonts", "data", "options", "regexUrl", "loadFonts", "loc", "fetchAsDataURL", "result", "parseCSS", "source", "commentsRegex", "keyframesRegex", "matches", "importRegex", "combinedCSSRegex", "unifiedRegex", "getCSSRules", "styleSheets", "ret", "deferreds", "sheet", "toArray", "item", "index", "importIndex", "deferred", "metadata", "rule", "error", "e", "inline", "a", "err", "getWebFontRules", "cssRules", "shouldEmbed", "parseWebFontRules", "node", "normalizeFontFamily", "font", "getUsedFonts", "fonts", "traverse", "child", "getWebFontCSS", "rules", "usedFonts", "baseUrl", "embedResources", "embedWebFonts", "clonedNode", "styleNode", "sytleContent", "toSvg", "node", "options", "width", "height", "getImageSize", "clonedNode", "cloneNode", "embedWebFonts", "embedImages", "applyStyle", "nodeToDataURL", "toCanvas", "svg", "img", "createImage", "canvas", "context", "ratio", "getPixelRatio", "canvasWidth", "canvasHeight", "checkCanvasDimensions", "toPng", "node", "options", "toCanvas", "exportPng", "target", "dataUrl", "toPng", "a", "warn"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
"use strict";(()=>{var h=`
|
|
2
|
+
:root{
|
|
3
|
+
--background:#ffffff; --foreground:#0a0a0a;
|
|
4
|
+
--card:#ffffff; --card-foreground:#0a0a0a;
|
|
5
|
+
--primary:#4f46e5; --primary-foreground:#ffffff;
|
|
6
|
+
--secondary:#f1f5f9; --secondary-foreground:#0f172a;
|
|
7
|
+
--muted:#f1f5f9; --muted-foreground:#64748b;
|
|
8
|
+
--accent:#eef2ff; --accent-foreground:#312e81;
|
|
9
|
+
--border:#e5e7eb; --ring:#4f46e5;
|
|
10
|
+
--radius:0.5rem;
|
|
11
|
+
--pagelet-sans:ui-sans-serif,system-ui,-apple-system,"Segoe UI",Roboto,Helvetica,Arial,sans-serif;
|
|
12
|
+
--pagelet-mono:ui-monospace,SFMono-Regular,"SF Mono",Menlo,Consolas,monospace;
|
|
13
|
+
}
|
|
14
|
+
[data-theme="dark"]{
|
|
15
|
+
--background:#0a0a0a; --foreground:#fafafa;
|
|
16
|
+
--card:#111113; --card-foreground:#fafafa;
|
|
17
|
+
--primary:#818cf8; --primary-foreground:#0a0a0a;
|
|
18
|
+
--secondary:#1e293b; --secondary-foreground:#f1f5f9;
|
|
19
|
+
--muted:#18181b; --muted-foreground:#a1a1aa;
|
|
20
|
+
--accent:#1e1b4b; --accent-foreground:#e0e7ff;
|
|
21
|
+
--border:#27272a; --ring:#818cf8;
|
|
22
|
+
}
|
|
23
|
+
html.pagelet-ready{color-scheme:light dark}
|
|
24
|
+
body{
|
|
25
|
+
margin:0; background:var(--background); color:var(--foreground);
|
|
26
|
+
font-family:var(--pagelet-sans);
|
|
27
|
+
-webkit-font-smoothing:antialiased; text-rendering:optimizeLegibility;
|
|
28
|
+
}
|
|
29
|
+
.pagelet-prose{
|
|
30
|
+
max-width:46rem; margin:0 auto; padding:2.5rem 1.25rem 5rem;
|
|
31
|
+
line-height:1.7; font-size:1.0625rem;
|
|
32
|
+
}
|
|
33
|
+
.pagelet-prose h1,.pagelet-prose h2,.pagelet-prose h3{
|
|
34
|
+
line-height:1.25; font-weight:650; letter-spacing:-0.01em; margin:2em 0 0.6em;
|
|
35
|
+
}
|
|
36
|
+
.pagelet-prose h1{font-size:2rem; margin-top:0}
|
|
37
|
+
.pagelet-prose h2{font-size:1.5rem; padding-bottom:.3em; border-bottom:1px solid var(--border)}
|
|
38
|
+
.pagelet-prose h3{font-size:1.2rem}
|
|
39
|
+
.pagelet-prose p,.pagelet-prose ul,.pagelet-prose ol{margin:0 0 1.1em}
|
|
40
|
+
.pagelet-prose a{color:var(--primary); text-underline-offset:2px}
|
|
41
|
+
.pagelet-prose code{
|
|
42
|
+
font-family:var(--pagelet-mono); font-size:.875em;
|
|
43
|
+
background:var(--muted); padding:.15em .4em; border-radius:calc(var(--radius) - 2px);
|
|
44
|
+
}
|
|
45
|
+
.pagelet-prose pre{
|
|
46
|
+
background:var(--muted); color:var(--foreground);
|
|
47
|
+
padding:1rem 1.1rem; border-radius:var(--radius); overflow:auto;
|
|
48
|
+
border:1px solid var(--border); margin:0 0 1.2em;
|
|
49
|
+
}
|
|
50
|
+
.pagelet-prose pre code{background:none; padding:0}
|
|
51
|
+
.pagelet-prose blockquote{
|
|
52
|
+
margin:0 0 1.2em; padding:.2em 1rem; border-left:3px solid var(--border);
|
|
53
|
+
color:var(--muted-foreground);
|
|
54
|
+
}
|
|
55
|
+
.pagelet-prose table{border-collapse:collapse; width:100%; margin:0 0 1.2em; font-size:.95em}
|
|
56
|
+
.pagelet-prose th,.pagelet-prose td{border:1px solid var(--border); padding:.5em .75em; text-align:left}
|
|
57
|
+
.pagelet-prose th{background:var(--muted)}
|
|
58
|
+
.pagelet-prose img{max-width:100%; border-radius:var(--radius)}
|
|
59
|
+
.pagelet-prose hr{border:none; border-top:1px solid var(--border); margin:2em 0}
|
|
60
|
+
|
|
61
|
+
#pagelet-toolbar{
|
|
62
|
+
position:fixed; bottom:1rem; right:1rem; z-index:9999;
|
|
63
|
+
display:flex; gap:.25rem; padding:.3rem;
|
|
64
|
+
background:var(--card); border:1px solid var(--border); border-radius:calc(var(--radius) + 4px);
|
|
65
|
+
box-shadow:0 4px 16px rgba(0,0,0,.12);
|
|
66
|
+
}
|
|
67
|
+
#pagelet-toolbar button{
|
|
68
|
+
all:unset; cursor:pointer; width:2rem; height:2rem; line-height:2rem; text-align:center;
|
|
69
|
+
border-radius:var(--radius); color:var(--foreground); font-size:1rem;
|
|
70
|
+
}
|
|
71
|
+
#pagelet-toolbar button:hover{background:var(--accent); color:var(--accent-foreground)}
|
|
72
|
+
|
|
73
|
+
#pagelet-offline{
|
|
74
|
+
max-width:46rem; margin:1.5rem auto; padding:.85rem 1.1rem;
|
|
75
|
+
font-family:var(--pagelet-sans); font-size:.95rem;
|
|
76
|
+
color:var(--muted-foreground); background:var(--muted);
|
|
77
|
+
border:1px solid var(--border); border-radius:var(--radius);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
#pagelet-progress{
|
|
81
|
+
position:fixed; top:0; left:0; height:3px; width:0;
|
|
82
|
+
background:var(--primary); z-index:9998; transition:width .1s linear;
|
|
83
|
+
}
|
|
84
|
+
#pagelet-toc{
|
|
85
|
+
position:fixed; top:0; left:0; bottom:0; width:15rem; padding:2.5rem 1rem; overflow:auto;
|
|
86
|
+
font-size:.85rem; display:none;
|
|
87
|
+
}
|
|
88
|
+
#pagelet-toc ul{list-style:none; margin:0; padding:0; border-left:1px solid var(--border)}
|
|
89
|
+
#pagelet-toc li{margin:0}
|
|
90
|
+
#pagelet-toc li.lvl-h3 a{padding-left:1.6rem; font-size:.95em}
|
|
91
|
+
#pagelet-toc a{
|
|
92
|
+
display:block; padding:.25rem .8rem; color:var(--muted-foreground);
|
|
93
|
+
text-decoration:none; border-left:2px solid transparent; margin-left:-1px;
|
|
94
|
+
}
|
|
95
|
+
#pagelet-toc a:hover{color:var(--foreground)}
|
|
96
|
+
#pagelet-toc a.active{color:var(--primary); border-left-color:var(--primary)}
|
|
97
|
+
@media (min-width:1180px){ #pagelet-toc{display:block} }
|
|
98
|
+
|
|
99
|
+
.pagelet-chart{max-width:46rem; margin:1.5rem auto; padding:0 1.25rem}
|
|
100
|
+
.pagelet-mermaid{
|
|
101
|
+
position:relative; max-width:46rem; margin:1.5rem auto; padding:.5rem;
|
|
102
|
+
border:1px solid var(--border); border-radius:var(--radius); background:var(--card);
|
|
103
|
+
}
|
|
104
|
+
.pagelet-mermaid svg{display:block; margin:0 auto}
|
|
105
|
+
.pagelet-mermaid:fullscreen{background:var(--background); display:flex; align-items:center; justify-content:center}
|
|
106
|
+
.pagelet-mermaid-full{
|
|
107
|
+
position:absolute; top:.5rem; right:.5rem; z-index:2;
|
|
108
|
+
all:unset; cursor:pointer; width:1.75rem; height:1.75rem; line-height:1.75rem; text-align:center;
|
|
109
|
+
color:var(--muted-foreground); background:var(--background); border:1px solid var(--border);
|
|
110
|
+
border-radius:calc(var(--radius) - 2px);
|
|
111
|
+
}
|
|
112
|
+
.pagelet-mermaid-full:hover{color:var(--foreground)}
|
|
113
|
+
|
|
114
|
+
@media print{
|
|
115
|
+
#pagelet-toolbar,#pagelet-progress,#pagelet-toc,.pagelet-copy,.pagelet-mermaid-full{display:none !important}
|
|
116
|
+
.pagelet-prose{max-width:none}
|
|
117
|
+
}
|
|
118
|
+
`;var _="[pagelet]";function d(e,t){console.warn(`${_} ${e}:`,t)}function v(e){let t=e.replace(/^\n/,"").replace(/\s+$/,"").split(`
|
|
119
|
+
`),r=1/0;for(let o of t){if(!o.trim())continue;let n=o.match(/^[ \t]*/)?.[0].length??0;n<r&&(r=n)}return!isFinite(r)||r===0?t.join(`
|
|
120
|
+
`):t.map(o=>o.slice(r)).join(`
|
|
121
|
+
`)}function g(e){return e.replace(/([a-z0-9])([A-Z])/g,"$1-$2").replace(/_/g,"-").toLowerCase()}function y(e){try{return window.localStorage.getItem(e)}catch{return null}}function x(e,t){try{window.localStorage.setItem(e,t)}catch{}}var w="pagelet-theme-vars",k="pagelet-mode";function E(){let e=document.documentElement,t=e.getAttribute("data-theme");if(t==="light"||t==="dark"){e.setAttribute("data-pagelet-mode",t);return}c(y(k)??"auto")}function f(){return document.documentElement.getAttribute("data-pagelet-mode")??"auto"}function c(e){let t=e==="auto"?window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light":e,r=document.documentElement;r.setAttribute("data-theme",t),r.setAttribute("data-pagelet-mode",e),x(k,e)}function M(){let e=document.querySelector('script[data-pagelet="theme"]');if(!e)return;let t;try{t=JSON.parse(e.textContent||"{}")}catch(a){d("theme",a);return}let r=[];for(let[a,i]of Object.entries(t.colors??{}))r.push(`--${g(a)}:${i};`);t.radius&&r.push(`--radius:${t.radius};`);let o=[];for(let[a,i]of Object.entries(t.dark??{}))o.push(`--${g(a)}:${i};`);let n=(r.length?`:root{${r.join("")}}`:"")+(o.length?`[data-theme="dark"]{${o.join("")}}`:"");if(!n)return;let l=document.getElementById(w);l||(l=document.createElement("style"),l.id=w,document.head.appendChild(l)),l.textContent=n}function u(){let e=document.querySelectorAll('script[type="text/markdown"][data-pagelet="markdown"]');return Array.from(e).map(t=>v(t.textContent||"")).join(`
|
|
122
|
+
|
|
123
|
+
`).trim()}var b=["auto","light","dark"],S={auto:"◐",light:"☀",dark:"☾"};function C(e){if(document.body.getAttribute("data-pagelet-toolbar")==="off"||document.getElementById("pagelet-toolbar"))return;let t=document.createElement("div");t.id="pagelet-toolbar",t.innerHTML=`
|
|
124
|
+
<button data-act="theme" title="Theme" aria-label="Toggle theme">${S[f()]}</button>
|
|
125
|
+
<button data-act="print" title="Print / save as PDF" aria-label="Print">⎙</button>
|
|
126
|
+
<button data-act="png" title="Save as PNG" aria-label="Save as PNG">⤓</button>
|
|
127
|
+
<button data-act="copy" title="Copy as Markdown" aria-label="Copy as Markdown">⧉</button>`,t.addEventListener("click",r=>{let o=r.target.closest("button")?.dataset.act;o==="theme"?H(t):o==="print"?window.print():o==="png"?e?.():o==="copy"&&I(t)}),document.body.appendChild(t)}function H(e){let t=b[(b.indexOf(f())+1)%b.length];c(t);let r=e.querySelector('[data-act="theme"]');r&&(r.textContent=S[t])}function I(e){let t=u(),r=e.querySelector('[data-act="copy"]'),o=()=>{if(!r)return;let n=r.textContent;r.textContent="✓",setTimeout(()=>r.textContent=n,1200)};navigator.clipboard?.writeText(t).then(o,o)}function L(){try{z()}catch(e){d("progress",e)}try{B()}catch(e){d("toc",e)}}function z(){if(document.getElementById("pagelet-progress"))return;let e=document.createElement("div");e.id="pagelet-progress",document.body.appendChild(e);let t=()=>{let r=document.documentElement,o=r.scrollHeight-r.clientHeight;e.style.width=(o>0?r.scrollTop/o*100:0)+"%"};document.addEventListener("scroll",t,{passive:!0}),t()}function B(){if(document.getElementById("pagelet-toc"))return;let e=document.querySelector(".pagelet-prose");if(!e)return;let t=Array.from(e.querySelectorAll("h2, h3"));if(t.length<3)return;let r=document.createElement("nav");r.id="pagelet-toc";let o=document.createElement("ul"),n=new Map;t.forEach((a,i)=>{a.id||(a.id=`pl-h-${i}`);let s=document.createElement("li");s.className=`lvl-${a.tagName.toLowerCase()}`;let p=document.createElement("a");p.href=`#${a.id}`,p.textContent=a.textContent||"",s.appendChild(p),o.appendChild(s),n.set(a.id,p)}),r.appendChild(o),document.body.appendChild(r);let l=new IntersectionObserver(a=>{for(let i of a)i.isIntersecting&&(r.querySelectorAll("a.active").forEach(s=>s.classList.remove("active")),n.get(i.target.id)?.classList.add("active"))},{rootMargin:"0px 0px -75% 0px"});t.forEach(a=>l.observe(a))}var q="0.1.0",T="pagelet-base-css",A=j();function j(){let e=document.currentScript?.src;try{return new URL(".",e||location.href).href}catch{return"./"}}function P(e){return import(new URL(`modules/${e}.js`,A).href)}function R(){if(document.getElementById(T))return;let e=document.createElement("style");e.id=T,e.textContent=h,document.head.appendChild(e)}function O(e){let t=e.textContent||"";return t.includes("$$")||t.includes("\\(")||t.includes("\\[")}async function m(e){try{await(await P(e)).enhance()}catch(t){d(`${e}-load`,t)}}async function $(){if(window.__pagelet__)return;window.__pagelet__={version:q,base:A,exportMarkdown:u,setTheme:c},R(),E();try{M()}catch(r){d("theme",r)}document.querySelector('script[type="text/markdown"][data-pagelet="markdown"]')&&await m("markdown");let e=document.querySelector(".pagelet-prose")||document.body,t=[];document.querySelector("pre.mermaid, .mermaid")&&t.push(m("mermaid")),document.querySelector('pre > code[class*="language-"]:not(.language-mermaid)')&&t.push(m("code")),O(e)&&t.push(m("math")),document.querySelector('script[type="application/json"][data-pagelet="chart"]')&&t.push(m("charts")),await Promise.all(t),L(),C(()=>{P("png").then(r=>r.exportPng())}),document.documentElement.classList.add("pagelet-ready"),document.getElementById("pagelet-offline")?.remove()}document.readyState==="loading"?document.addEventListener("DOMContentLoaded",()=>{$()}):$();})();
|
|
128
|
+
//# sourceMappingURL=pagelet.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/styles.ts", "../../src/util.ts", "../../src/theme.ts", "../../src/export.ts", "../../src/toolbar.ts", "../../src/toc.ts", "../../src/index.ts"],
|
|
4
|
+
"sourcesContent": ["// Base CSS injected by the runtime: shadcn-named theme variables (D12), tasteful\n// prose defaults (anti-slop), the floating toolbar, and the offline banner.\n// Variable names mirror shadcn; values are direct colors referenced via var() —\n// the current shadcn/Tailwind-4 convention.\n\nexport const BASE_CSS = `\n:root{\n --background:#ffffff; --foreground:#0a0a0a;\n --card:#ffffff; --card-foreground:#0a0a0a;\n --primary:#4f46e5; --primary-foreground:#ffffff;\n --secondary:#f1f5f9; --secondary-foreground:#0f172a;\n --muted:#f1f5f9; --muted-foreground:#64748b;\n --accent:#eef2ff; --accent-foreground:#312e81;\n --border:#e5e7eb; --ring:#4f46e5;\n --radius:0.5rem;\n --pagelet-sans:ui-sans-serif,system-ui,-apple-system,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif;\n --pagelet-mono:ui-monospace,SFMono-Regular,\"SF Mono\",Menlo,Consolas,monospace;\n}\n[data-theme=\"dark\"]{\n --background:#0a0a0a; --foreground:#fafafa;\n --card:#111113; --card-foreground:#fafafa;\n --primary:#818cf8; --primary-foreground:#0a0a0a;\n --secondary:#1e293b; --secondary-foreground:#f1f5f9;\n --muted:#18181b; --muted-foreground:#a1a1aa;\n --accent:#1e1b4b; --accent-foreground:#e0e7ff;\n --border:#27272a; --ring:#818cf8;\n}\nhtml.pagelet-ready{color-scheme:light dark}\nbody{\n margin:0; background:var(--background); color:var(--foreground);\n font-family:var(--pagelet-sans);\n -webkit-font-smoothing:antialiased; text-rendering:optimizeLegibility;\n}\n.pagelet-prose{\n max-width:46rem; margin:0 auto; padding:2.5rem 1.25rem 5rem;\n line-height:1.7; font-size:1.0625rem;\n}\n.pagelet-prose h1,.pagelet-prose h2,.pagelet-prose h3{\n line-height:1.25; font-weight:650; letter-spacing:-0.01em; margin:2em 0 0.6em;\n}\n.pagelet-prose h1{font-size:2rem; margin-top:0}\n.pagelet-prose h2{font-size:1.5rem; padding-bottom:.3em; border-bottom:1px solid var(--border)}\n.pagelet-prose h3{font-size:1.2rem}\n.pagelet-prose p,.pagelet-prose ul,.pagelet-prose ol{margin:0 0 1.1em}\n.pagelet-prose a{color:var(--primary); text-underline-offset:2px}\n.pagelet-prose code{\n font-family:var(--pagelet-mono); font-size:.875em;\n background:var(--muted); padding:.15em .4em; border-radius:calc(var(--radius) - 2px);\n}\n.pagelet-prose pre{\n background:var(--muted); color:var(--foreground);\n padding:1rem 1.1rem; border-radius:var(--radius); overflow:auto;\n border:1px solid var(--border); margin:0 0 1.2em;\n}\n.pagelet-prose pre code{background:none; padding:0}\n.pagelet-prose blockquote{\n margin:0 0 1.2em; padding:.2em 1rem; border-left:3px solid var(--border);\n color:var(--muted-foreground);\n}\n.pagelet-prose table{border-collapse:collapse; width:100%; margin:0 0 1.2em; font-size:.95em}\n.pagelet-prose th,.pagelet-prose td{border:1px solid var(--border); padding:.5em .75em; text-align:left}\n.pagelet-prose th{background:var(--muted)}\n.pagelet-prose img{max-width:100%; border-radius:var(--radius)}\n.pagelet-prose hr{border:none; border-top:1px solid var(--border); margin:2em 0}\n\n#pagelet-toolbar{\n position:fixed; bottom:1rem; right:1rem; z-index:9999;\n display:flex; gap:.25rem; padding:.3rem;\n background:var(--card); border:1px solid var(--border); border-radius:calc(var(--radius) + 4px);\n box-shadow:0 4px 16px rgba(0,0,0,.12);\n}\n#pagelet-toolbar button{\n all:unset; cursor:pointer; width:2rem; height:2rem; line-height:2rem; text-align:center;\n border-radius:var(--radius); color:var(--foreground); font-size:1rem;\n}\n#pagelet-toolbar button:hover{background:var(--accent); color:var(--accent-foreground)}\n\n#pagelet-offline{\n max-width:46rem; margin:1.5rem auto; padding:.85rem 1.1rem;\n font-family:var(--pagelet-sans); font-size:.95rem;\n color:var(--muted-foreground); background:var(--muted);\n border:1px solid var(--border); border-radius:var(--radius);\n}\n\n#pagelet-progress{\n position:fixed; top:0; left:0; height:3px; width:0;\n background:var(--primary); z-index:9998; transition:width .1s linear;\n}\n#pagelet-toc{\n position:fixed; top:0; left:0; bottom:0; width:15rem; padding:2.5rem 1rem; overflow:auto;\n font-size:.85rem; display:none;\n}\n#pagelet-toc ul{list-style:none; margin:0; padding:0; border-left:1px solid var(--border)}\n#pagelet-toc li{margin:0}\n#pagelet-toc li.lvl-h3 a{padding-left:1.6rem; font-size:.95em}\n#pagelet-toc a{\n display:block; padding:.25rem .8rem; color:var(--muted-foreground);\n text-decoration:none; border-left:2px solid transparent; margin-left:-1px;\n}\n#pagelet-toc a:hover{color:var(--foreground)}\n#pagelet-toc a.active{color:var(--primary); border-left-color:var(--primary)}\n@media (min-width:1180px){ #pagelet-toc{display:block} }\n\n.pagelet-chart{max-width:46rem; margin:1.5rem auto; padding:0 1.25rem}\n.pagelet-mermaid{\n position:relative; max-width:46rem; margin:1.5rem auto; padding:.5rem;\n border:1px solid var(--border); border-radius:var(--radius); background:var(--card);\n}\n.pagelet-mermaid svg{display:block; margin:0 auto}\n.pagelet-mermaid:fullscreen{background:var(--background); display:flex; align-items:center; justify-content:center}\n.pagelet-mermaid-full{\n position:absolute; top:.5rem; right:.5rem; z-index:2;\n all:unset; cursor:pointer; width:1.75rem; height:1.75rem; line-height:1.75rem; text-align:center;\n color:var(--muted-foreground); background:var(--background); border:1px solid var(--border);\n border-radius:calc(var(--radius) - 2px);\n}\n.pagelet-mermaid-full:hover{color:var(--foreground)}\n\n@media print{\n #pagelet-toolbar,#pagelet-progress,#pagelet-toc,.pagelet-copy,.pagelet-mermaid-full{display:none !important}\n .pagelet-prose{max-width:none}\n}\n`\n", "// Small shared helpers for the runtime.\n\nconst PREFIX = '[pagelet]'\n\nexport function warn(scope: string, err: unknown): void {\n console.warn(`${PREFIX} ${scope}:`, err)\n}\n\n/** Strip the common leading indentation from a block (markdown is indent-sensitive). */\nexport function dedent(text: string): string {\n const lines = text.replace(/^\\n/, '').replace(/\\s+$/, '').split('\\n')\n let min = Infinity\n for (const line of lines) {\n if (!line.trim()) continue\n const indent = line.match(/^[ \\t]*/)?.[0].length ?? 0\n if (indent < min) min = indent\n }\n if (!isFinite(min) || min === 0) return lines.join('\\n')\n return lines.map((l) => l.slice(min)).join('\\n')\n}\n\n/** camelCase / \"primaryForeground\" -> \"primary-foreground\" for CSS var names. */\nexport function kebab(s: string): string {\n return s.replace(/([a-z0-9])([A-Z])/g, '$1-$2').replace(/_/g, '-').toLowerCase()\n}\n\n/** localStorage may be unavailable (sandboxed iframes, Claude.ai Artifacts) — degrade silently. */\nexport function safeGet(key: string): string | null {\n try {\n return window.localStorage.getItem(key)\n } catch {\n return null\n }\n}\n\nexport function safeSet(key: string, value: string): void {\n try {\n window.localStorage.setItem(key, value)\n } catch {\n /* no-op */\n }\n}\n", "// Color mode (light/dark/auto) + compiling a shadcn-style theme JSON block to CSS vars (D12).\nimport { kebab, safeGet, safeSet, warn } from './util'\n\nexport type Mode = 'light' | 'dark' | 'auto'\n\nconst STYLE_ID = 'pagelet-theme-vars'\nconst STORE_KEY = 'pagelet-mode'\n\n/** Resolve and apply the initial color mode. Respects an explicit html[data-theme]. */\nexport function initMode(): void {\n const html = document.documentElement\n const explicit = html.getAttribute('data-theme')\n if (explicit === 'light' || explicit === 'dark') {\n html.setAttribute('data-pagelet-mode', explicit)\n return\n }\n setMode((safeGet(STORE_KEY) as Mode) ?? 'auto')\n}\n\nexport function getMode(): Mode {\n return (document.documentElement.getAttribute('data-pagelet-mode') as Mode) ?? 'auto'\n}\n\nexport function setMode(mode: Mode): void {\n const resolved =\n mode === 'auto'\n ? window.matchMedia('(prefers-color-scheme: dark)').matches\n ? 'dark'\n : 'light'\n : mode\n const html = document.documentElement\n html.setAttribute('data-theme', resolved)\n html.setAttribute('data-pagelet-mode', mode)\n safeSet(STORE_KEY, mode)\n}\n\n/** Compile a `<script data-pagelet=\"theme\">{json}</script>` block to :root / [data-theme=dark] vars. */\nexport function applyTheme(): void {\n const el = document.querySelector('script[data-pagelet=\"theme\"]')\n if (!el) return\n let theme: { colors?: Record<string, string>; dark?: Record<string, string>; radius?: string }\n try {\n theme = JSON.parse(el.textContent || '{}')\n } catch (e) {\n warn('theme', e)\n return\n }\n const root: string[] = []\n for (const [k, v] of Object.entries(theme.colors ?? {})) root.push(`--${kebab(k)}:${v};`)\n if (theme.radius) root.push(`--radius:${theme.radius};`)\n const dark: string[] = []\n for (const [k, v] of Object.entries(theme.dark ?? {})) dark.push(`--${kebab(k)}:${v};`)\n\n const css =\n (root.length ? `:root{${root.join('')}}` : '') +\n (dark.length ? `[data-theme=\"dark\"]{${dark.join('')}}` : '')\n if (!css) return\n\n let style = document.getElementById(STYLE_ID) as HTMLStyleElement | null\n if (!style) {\n style = document.createElement('style')\n style.id = STYLE_ID\n document.head.appendChild(style)\n }\n style.textContent = css\n}\n", "// Round-trip export: reconstruct the Markdown source from the retained source blocks\n// so a human's view can be copied back to the agent as a prompt.\nimport { dedent } from './util'\n\nexport function collectMarkdown(): string {\n const blocks = document.querySelectorAll<HTMLScriptElement>(\n 'script[type=\"text/markdown\"][data-pagelet=\"markdown\"]',\n )\n return Array.from(blocks)\n .map((b) => dedent(b.textContent || ''))\n .join('\\n\\n')\n .trim()\n}\n", "// The standard floating toolbar: theme toggle, print/PDF, copy-as-Markdown (round-trip).\nimport { getMode, setMode, type Mode } from './theme'\nimport { collectMarkdown } from './export'\n\nconst CYCLE: Mode[] = ['auto', 'light', 'dark']\nconst GLYPH: Record<Mode, string> = { auto: '◐', light: '☀', dark: '☾' }\n\nexport function mountToolbar(onPng?: () => void): void {\n if (document.body.getAttribute('data-pagelet-toolbar') === 'off') return\n if (document.getElementById('pagelet-toolbar')) return\n\n const bar = document.createElement('div')\n bar.id = 'pagelet-toolbar'\n bar.innerHTML = `\n <button data-act=\"theme\" title=\"Theme\" aria-label=\"Toggle theme\">${GLYPH[getMode()]}</button>\n <button data-act=\"print\" title=\"Print / save as PDF\" aria-label=\"Print\">⎙</button>\n <button data-act=\"png\" title=\"Save as PNG\" aria-label=\"Save as PNG\">⤓</button>\n <button data-act=\"copy\" title=\"Copy as Markdown\" aria-label=\"Copy as Markdown\">⧉</button>`\n\n bar.addEventListener('click', (e) => {\n const act = (e.target as HTMLElement).closest('button')?.dataset.act\n if (act === 'theme') cycleTheme(bar)\n else if (act === 'print') window.print()\n else if (act === 'png') onPng?.()\n else if (act === 'copy') copyMarkdown(bar)\n })\n\n document.body.appendChild(bar)\n}\n\nfunction cycleTheme(bar: HTMLElement): void {\n const next = CYCLE[(CYCLE.indexOf(getMode()) + 1) % CYCLE.length]!\n setMode(next)\n const btn = bar.querySelector<HTMLButtonElement>('[data-act=\"theme\"]')\n if (btn) btn.textContent = GLYPH[next]\n}\n\nfunction copyMarkdown(bar: HTMLElement): void {\n const md = collectMarkdown()\n const btn = bar.querySelector<HTMLButtonElement>('[data-act=\"copy\"]')\n const done = () => {\n if (!btn) return\n const prev = btn.textContent\n btn.textContent = '✓'\n setTimeout(() => (btn.textContent = prev), 1200)\n }\n navigator.clipboard?.writeText(md).then(done, done)\n}\n", "// Core chrome (no external deps): a scroll-progress bar + a sticky TOC with scroll-spy.\nimport { warn } from './util'\n\nexport function mountChrome(): void {\n try {\n progressBar()\n } catch (e) {\n warn('progress', e)\n }\n try {\n buildToc()\n } catch (e) {\n warn('toc', e)\n }\n}\n\nfunction progressBar(): void {\n if (document.getElementById('pagelet-progress')) return\n const bar = document.createElement('div')\n bar.id = 'pagelet-progress'\n document.body.appendChild(bar)\n const update = (): void => {\n const h = document.documentElement\n const max = h.scrollHeight - h.clientHeight\n bar.style.width = (max > 0 ? (h.scrollTop / max) * 100 : 0) + '%'\n }\n document.addEventListener('scroll', update, { passive: true })\n update()\n}\n\nfunction buildToc(): void {\n if (document.getElementById('pagelet-toc')) return\n const prose = document.querySelector('.pagelet-prose')\n if (!prose) return\n const heads = Array.from(prose.querySelectorAll<HTMLElement>('h2, h3'))\n if (heads.length < 3) return\n\n const nav = document.createElement('nav')\n nav.id = 'pagelet-toc'\n const list = document.createElement('ul')\n const links = new Map<string, HTMLElement>()\n\n heads.forEach((h, i) => {\n if (!h.id) h.id = `pl-h-${i}`\n const li = document.createElement('li')\n li.className = `lvl-${h.tagName.toLowerCase()}`\n const a = document.createElement('a')\n a.href = `#${h.id}`\n a.textContent = h.textContent || ''\n li.appendChild(a)\n list.appendChild(li)\n links.set(h.id, a)\n })\n nav.appendChild(list)\n document.body.appendChild(nav)\n\n const obs = new IntersectionObserver(\n (entries) => {\n for (const e of entries) {\n if (!e.isIntersecting) continue\n nav.querySelectorAll('a.active').forEach((x) => x.classList.remove('active'))\n links.get((e.target as HTMLElement).id)?.classList.add('active')\n }\n },\n { rootMargin: '0px 0px -75% 0px' },\n )\n heads.forEach((h) => obs.observe(h))\n}\n", "// The Pagelet runtime loader (the one tag). Classic IIFE: boots core, detects which\n// capabilities the page uses, and lazy-imports only those module bundles at runtime.\n// Online-to-render (D14): the offline banner shows until this boots successfully.\nimport { BASE_CSS } from './styles'\nimport { initMode, applyTheme, setMode } from './theme'\nimport { mountToolbar } from './toolbar'\nimport { mountChrome } from './toc'\nimport { collectMarkdown } from './export'\nimport { warn } from './util'\n\nconst VERSION = '0.1.0'\nconst STYLE_ID = 'pagelet-base-css'\n\n// Capture the loader's own base URL synchronously (currentScript is null inside later callbacks).\nconst BASE = resolveBase()\n\ninterface PageletApi {\n version: string\n base: string\n exportMarkdown(): string\n setTheme(mode: 'light' | 'dark' | 'auto'): void\n}\ndeclare global {\n interface Window {\n __pagelet__?: PageletApi\n }\n}\n\nfunction resolveBase(): string {\n const src = (document.currentScript as HTMLScriptElement | null)?.src\n try {\n return new URL('.', src || location.href).href\n } catch {\n return './'\n }\n}\n\n/** Lazy-import a capability module by name; runtime URL keeps esbuild from bundling it. */\nfunction load(name: string): Promise<Record<string, (...a: never[]) => unknown>> {\n const url = new URL(`modules/${name}.js`, BASE).href\n return import(/* @vite-ignore */ url) as Promise<Record<string, (...a: never[]) => unknown>>\n}\n\nfunction injectBaseCss(): void {\n if (document.getElementById(STYLE_ID)) return\n const style = document.createElement('style')\n style.id = STYLE_ID\n style.textContent = BASE_CSS\n document.head.appendChild(style)\n}\n\nfunction hasMath(scope: Element): boolean {\n const t = scope.textContent || ''\n return t.includes('$$') || t.includes('\\\\(') || t.includes('\\\\[')\n}\n\nasync function run(name: string): Promise<void> {\n try {\n const mod = await load(name)\n await (mod.enhance as () => Promise<void>)()\n } catch (e) {\n warn(`${name}-load`, e)\n }\n}\n\nasync function boot(): Promise<void> {\n if (window.__pagelet__) return\n window.__pagelet__ = {\n version: VERSION,\n base: BASE,\n exportMarkdown: collectMarkdown,\n setTheme: setMode,\n }\n\n injectBaseCss()\n initMode()\n try {\n applyTheme()\n } catch (e) {\n warn('theme', e)\n }\n\n // 1. Markdown first (produces .pagelet-prose; normalises ```mermaid blocks).\n if (document.querySelector('script[type=\"text/markdown\"][data-pagelet=\"markdown\"]')) {\n await run('markdown')\n }\n\n // 2. Detect what the (now-rendered) page uses; load those modules in parallel.\n const scope = (document.querySelector('.pagelet-prose') as Element) || document.body\n const jobs: Promise<void>[] = []\n if (document.querySelector('pre.mermaid, .mermaid')) jobs.push(run('mermaid'))\n if (document.querySelector('pre > code[class*=\"language-\"]:not(.language-mermaid)')) jobs.push(run('code'))\n if (hasMath(scope)) jobs.push(run('math'))\n if (document.querySelector('script[type=\"application/json\"][data-pagelet=\"chart\"]')) jobs.push(run('charts'))\n await Promise.all(jobs)\n\n // 3. Chrome + toolbar (PNG export is itself lazy-loaded).\n mountChrome()\n mountToolbar(() => {\n void load('png').then((m) => (m.exportPng as () => Promise<void>)())\n })\n\n document.documentElement.classList.add('pagelet-ready')\n document.getElementById('pagelet-offline')?.remove()\n}\n\nif (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', () => void boot())\n} else {\n void boot()\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["BASE_CSS", "PREFIX", "warn", "scope", "err", "dedent", "text", "lines", "min", "line", "indent", "l", "kebab", "s", "safeGet", "key", "safeSet", "value", "STYLE_ID", "STORE_KEY", "initMode", "html", "explicit", "setMode", "safeGet", "getMode", "mode", "resolved", "safeSet", "applyTheme", "el", "theme", "e", "warn", "root", "k", "v", "kebab", "dark", "css", "style", "collectMarkdown", "blocks", "b", "dedent", "CYCLE", "GLYPH", "mountToolbar", "onPng", "bar", "getMode", "e", "act", "cycleTheme", "copyMarkdown", "next", "setMode", "btn", "md", "collectMarkdown", "done", "prev", "mountChrome", "progressBar", "warn", "buildToc", "bar", "update", "h", "max", "prose", "heads", "nav", "list", "links", "li", "a", "obs", "entries", "e", "x", "VERSION", "STYLE_ID", "BASE", "resolveBase", "src", "load", "name", "injectBaseCss", "style", "BASE_CSS", "hasMath", "scope", "run", "e", "warn", "boot", "collectMarkdown", "setMode", "initMode", "applyTheme", "jobs", "mountChrome", "mountToolbar", "m"]
|
|
7
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@usepagelet/runtime",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"description": "The Pagelet runtime — one tag that renders self-contained HTML pagelets (Markdown, Mermaid, KaTeX, charts, toolbar).",
|
|
6
|
+
"license": "Apache-2.0",
|
|
7
|
+
"homepage": "https://pagelet.link",
|
|
8
|
+
"repository": {
|
|
9
|
+
"type": "git",
|
|
10
|
+
"url": "git+https://github.com/jontybrook/pagelet.git",
|
|
11
|
+
"directory": "packages/sdk"
|
|
12
|
+
},
|
|
13
|
+
"keywords": ["pagelet", "html", "agent", "markdown", "mermaid", "katex", "runtime"],
|
|
14
|
+
"publishConfig": {
|
|
15
|
+
"access": "public"
|
|
16
|
+
},
|
|
17
|
+
"files": [
|
|
18
|
+
"dist/v1"
|
|
19
|
+
],
|
|
20
|
+
"scripts": {
|
|
21
|
+
"build": "node build.mjs",
|
|
22
|
+
"dev": "node build.mjs --serve",
|
|
23
|
+
"typecheck": "tsc --noEmit",
|
|
24
|
+
"prepublishOnly": "node build.mjs"
|
|
25
|
+
},
|
|
26
|
+
"devDependencies": {
|
|
27
|
+
"@types/katex": "^0.16.8",
|
|
28
|
+
"@types/svg-pan-zoom": "^3.4.0",
|
|
29
|
+
"chart.js": "^4.5.1",
|
|
30
|
+
"dompurify": "^3.4.11",
|
|
31
|
+
"esbuild": "^0.28.1",
|
|
32
|
+
"highlight.js": "^11.11.1",
|
|
33
|
+
"html-to-image": "^1.11.13",
|
|
34
|
+
"katex": "^0.17.0",
|
|
35
|
+
"marked": "^18.0.5",
|
|
36
|
+
"mermaid": "^11.15.0",
|
|
37
|
+
"svg-pan-zoom": "^3.6.2",
|
|
38
|
+
"typescript": "^6.0.3"
|
|
39
|
+
}
|
|
40
|
+
}
|