rendercv-ts 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.
Files changed (77) hide show
  1. package/LICENSE +26 -0
  2. package/README.md +112 -0
  3. package/assets/fonts/EB Garamond/EBGaramond-Bold.ttf +0 -0
  4. package/assets/fonts/EB Garamond/EBGaramond-BoldItalic.ttf +0 -0
  5. package/assets/fonts/EB Garamond/EBGaramond-Italic.ttf +0 -0
  6. package/assets/fonts/EB Garamond/EBGaramond-Regular.ttf +0 -0
  7. package/assets/fonts/Fontin/Fontin-Bold.otf +0 -0
  8. package/assets/fonts/Fontin/Fontin-Italic.otf +0 -0
  9. package/assets/fonts/Fontin/Fontin-Regular.otf +0 -0
  10. package/assets/fonts/Gentium Book Plus/GentiumBookPlus-Bold.ttf +0 -0
  11. package/assets/fonts/Gentium Book Plus/GentiumBookPlus-BoldItalic.ttf +0 -0
  12. package/assets/fonts/Gentium Book Plus/GentiumBookPlus-Italic.ttf +0 -0
  13. package/assets/fonts/Gentium Book Plus/GentiumBookPlus-Regular.ttf +0 -0
  14. package/assets/fonts/Lato/Lato-Bold.ttf +0 -0
  15. package/assets/fonts/Lato/Lato-BoldItalic.ttf +0 -0
  16. package/assets/fonts/Lato/Lato-Italic.ttf +0 -0
  17. package/assets/fonts/Lato/Lato-Regular.ttf +0 -0
  18. package/assets/fonts/Raleway/Raleway-Bold.ttf +0 -0
  19. package/assets/fonts/Raleway/Raleway-BoldItalic.ttf +0 -0
  20. package/assets/fonts/Raleway/Raleway-Italic.ttf +0 -0
  21. package/assets/fonts/Raleway/Raleway-Regular.ttf +0 -0
  22. package/assets/fonts/Source Sans 3/SourceSans3-Bold.ttf +0 -0
  23. package/assets/fonts/Source Sans 3/SourceSans3-BoldItalic.ttf +0 -0
  24. package/assets/fonts/Source Sans 3/SourceSans3-Italic.ttf +0 -0
  25. package/assets/fonts/Source Sans 3/SourceSans3-Regular.ttf +0 -0
  26. package/assets/fonts/Ubuntu/Ubuntu-Bold.ttf +0 -0
  27. package/assets/fonts/Ubuntu/Ubuntu-BoldItalic.ttf +0 -0
  28. package/assets/fonts/Ubuntu/Ubuntu-Italic.ttf +0 -0
  29. package/assets/fonts/Ubuntu/Ubuntu-Regular.ttf +0 -0
  30. package/assets/fonts/Vazirmatn/Vazirmatn-Black.ttf +0 -0
  31. package/assets/fonts/Vazirmatn/Vazirmatn-Bold.ttf +0 -0
  32. package/assets/fonts/Vazirmatn/Vazirmatn-ExtraBold.ttf +0 -0
  33. package/assets/fonts/Vazirmatn/Vazirmatn-ExtraLight.ttf +0 -0
  34. package/assets/fonts/Vazirmatn/Vazirmatn-Light.ttf +0 -0
  35. package/assets/fonts/Vazirmatn/Vazirmatn-Medium.ttf +0 -0
  36. package/assets/fonts/Vazirmatn/Vazirmatn-Regular.ttf +0 -0
  37. package/assets/fonts/Vazirmatn/Vazirmatn-SemiBold.ttf +0 -0
  38. package/assets/fonts/Vazirmatn/Vazirmatn-Thin.ttf +0 -0
  39. package/assets/fonts/XCharter/XCharter-Bold.otf +0 -0
  40. package/assets/fonts/XCharter/XCharter-BoldItalic.otf +0 -0
  41. package/assets/fonts/XCharter/XCharter-Italic.otf +0 -0
  42. package/assets/fonts/XCharter/XCharter-Regular.otf +0 -0
  43. package/assets/wasm/typst_ts_renderer_bg.wasm +0 -0
  44. package/assets/wasm/typst_ts_web_compiler_bg.wasm +0 -0
  45. package/dist/asset_paths-Q3SHUESH.js +12 -0
  46. package/dist/asset_paths-Q3SHUESH.js.map +1 -0
  47. package/dist/chunk-CJBTP63L.js +94 -0
  48. package/dist/chunk-CJBTP63L.js.map +1 -0
  49. package/dist/chunk-EVM6BVMO.js +16 -0
  50. package/dist/chunk-EVM6BVMO.js.map +1 -0
  51. package/dist/chunk-QZVXUQ72.js +91 -0
  52. package/dist/chunk-QZVXUQ72.js.map +1 -0
  53. package/dist/chunk-VZSMPOAA.js +1012 -0
  54. package/dist/chunk-VZSMPOAA.js.map +1 -0
  55. package/dist/font_cache-BZENGUJA.js +84 -0
  56. package/dist/font_cache-BZENGUJA.js.map +1 -0
  57. package/dist/font_registry-TJ7PJJTJ.js +183 -0
  58. package/dist/font_registry-TJ7PJJTJ.js.map +1 -0
  59. package/dist/index.cjs +9979 -0
  60. package/dist/index.cjs.map +1 -0
  61. package/dist/index.d.cts +195 -0
  62. package/dist/index.d.ts +195 -0
  63. package/dist/index.js +8396 -0
  64. package/dist/index.js.map +1 -0
  65. package/dist/renderer/worker/pdf_worker.cjs +1518 -0
  66. package/dist/renderer/worker/pdf_worker.cjs.map +1 -0
  67. package/dist/renderer/worker/pdf_worker.d.cts +24 -0
  68. package/dist/renderer/worker/pdf_worker.d.ts +24 -0
  69. package/dist/renderer/worker/pdf_worker.js +51 -0
  70. package/dist/renderer/worker/pdf_worker.js.map +1 -0
  71. package/dist/typst_font_cache-LYHXH5UA.js +60 -0
  72. package/dist/typst_font_cache-LYHXH5UA.js.map +1 -0
  73. package/dist/typst_setup-SW3GQFSL.js +30 -0
  74. package/dist/typst_setup-SW3GQFSL.js.map +1 -0
  75. package/dist/typst_setup-WebjDI32.d.cts +266 -0
  76. package/dist/typst_setup-WebjDI32.d.ts +266 -0
  77. package/package.json +80 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/renderer/assets/rendercv_typst/icons.typ","../../../src/renderer/assets/rendercv_typst/lib.typ","../../../src/renderer/assets/rendercv_typst/typst.toml","../../../src/renderer/fonts/load_bundled_font.ts","../../../src/renderer/asset_paths.ts","../../../src/renderer/assets/font_manifest.ts","../../../src/renderer/fonts/typst_font_cache.ts","../../../src/renderer/fonts/font_registry.ts","../../../src/renderer/typst_setup.ts","../../../src/renderer/worker/pdf_worker.ts"],"sourcesContent":["// Auto-generated by scripts/generate-connection-icons.mjs — do not edit.\n\n#let rendercv-icon-map = (\n \"envelope\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\"><path fill=\\\"__FILL__\\\" d=\\\"M2 4h20v16H2V4zm2 2v.01L12 13l8-6.99V6H4zm16 10V8.5l-8 5.5-8-5.5V16h16z\\\"/></svg>\",\n \"phone\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\"><path fill=\\\"__FILL__\\\" d=\\\"M6.6 10.8c1.4 2.8 3.8 5.1 6.6 6.6l2.2-2.2c.3-.3.7-.4 1-.2 1.1.4 2.3.6 3.6.6.6 0 1 .4 1 1V20c0 .6-.4 1-1 1C10.6 21 3 13.4 3 4c0-.6.4-1 1-1h3.5c.6 0 1 .4 1 1 0 1.3.2 2.5.6 3.6.1.3 0 .7-.2 1L6.6 10.8z\\\"/></svg>\",\n \"link\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\"><path fill=\\\"__FILL__\\\" d=\\\"M3.9 12c0-1.7 1.3-3 3-3h4V7H6.9C4.2 7 2 9.2 2 11.9c0 2.7 2.2 4.9 4.9 4.9H11v-2H6.9c-1.7 0-3-1.3-3-3zm16.2-5H13v2h4.1c1.7 0 3 1.3 3 3s-1.3 3-3 3H13v2h7.1c2.7 0 4.9-2.2 4.9-4.9 0-2.7-2.2-4.9-4.8-4.9zM8 11h8v2H8v-2z\\\"/></svg>\",\n \"location-dot\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\"><path fill=\\\"__FILL__\\\" d=\\\"M12 2C8.1 2 5 5.1 5 9c0 5.2 7 13 7 13s7-7.8 7-13c0-3.9-3.1-7-7-7zm0 9.5A2.5 2.5 0 1 1 12 6a2.5 2.5 0 0 1 0 5.5z\\\"/></svg>\",\n \"linkedin\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\"><path fill=\\\"__FILL__\\\" d=\\\"M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433a2.062 2.062 0 1 1 0-4.124 2.062 2.062 0 0 1 0 4.124zM7.119 20.452H3.555V9h3.564v11.452z\\\"/></svg>\",\n \"github\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\"><path fill=\\\"__FILL__\\\" d=\\\"M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12\\\"/></svg>\",\n \"gitlab\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\"><path fill=\\\"__FILL__\\\" d=\\\"m23.6004 9.5927-.0337-.0862L20.3.9814a.851.851 0 0 0-.3362-.405.8748.8748 0 0 0-.9997.0539.8748.8748 0 0 0-.29.4399l-2.2055 6.748H7.5375l-2.2057-6.748a.8573.8573 0 0 0-.29-.4412.8748.8748 0 0 0-.9997-.0537.8585.8585 0 0 0-.3362.4049L.4332 9.5015l-.0325.0862a6.0657 6.0657 0 0 0 2.0119 7.0105l.0113.0087.03.0213 4.976 3.7264 2.462 1.8633 1.4995 1.1321a1.0085 1.0085 0 0 0 1.2197 0l1.4995-1.1321 2.4619-1.8633 5.006-3.7489.0125-.01a6.0682 6.0682 0 0 0 2.0094-7.003z\\\"/></svg>\",\n \"imdb\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\"><path fill=\\\"__FILL__\\\" d=\\\"M22.3781 0H1.6218C.7411.0583.0587.7437.0018 1.5953l-.001 20.783c.0585.8761.7125 1.543 1.5559 1.6191A.337.337 0 0 0 1.6016 24h20.7971a.4579.4579 0 0 0 .0437-.002c.8727-.0768 1.5568-.8271 1.5568-1.7085V1.7098c0-.8914-.696-1.6416-1.584-1.7078A.3294.3294 0 0 0 22.3781 0zm0 .496a1.2144 1.2144 0 0 1 1.1252 1.2139v20.5797c0 .6377-.4875 1.1602-1.1045 1.2145H1.6016c-.5967-.0543-1.0645-.5297-1.1053-1.1258V1.6284C.5371 1.0185 1.0184.5364 1.6217.496h20.7564zM4.7954 8.2603v7.3636H2.8899V8.2603h1.9055zm6.5367 0v7.3636H9.6707v-4.9704l-.6711 4.9704H7.813l-.6986-4.8618-.0066 4.8618h-1.668V8.2603h2.468c.0748.4476.1492.9694.2307 1.5734l.2712 1.8713.4407-3.4447h2.4817zm2.9772 1.3289c.0742.0404.122.108.1417.2034.0279.0953.0345.3118.0345.6442v2.8548c0 .4881-.0345.7867-.0955.8954-.0609.1152-.2304.1695-.5018.1695V9.5211c.204 0 .3457.0205.4211.0681zm-.0211 6.0347c.4543 0 .8006-.0265 1.0245-.0742.2304-.0477.4204-.1357.5694-.2648.1556-.1218.2642-.298.3251-.5219.0611-.2238.1021-.6648.1021-1.3224v-2.5832c0-.6986-.0271-1.1668-.0742-1.4039-.041-.237-.1431-.4543-.3126-.6437-.1695-.1973-.4198-.3324-.7456-.421-.3191-.0808-.8542-.1285-1.7694-.1285h-1.4244v7.3636h2.3051zm5.14-1.7827c0 .3523-.0199.5762-.0544.6708-.033.0947-.1894.1424-.3046.1424-.1086 0-.19-.0477-.2238-.1351-.041-.0887-.0609-.2986-.0609-.6238v-1.9469c0-.3324.0199-.5423.0543-.6237.0338-.0808.1086-.122.2171-.122.1153 0 .2709.0412.3114.1425.041.0947.0609.2986.0609.6032v1.8926zm-2.4747-5.5809v7.3636h1.7157l.1152-.4675c.1556.1894.3251.3324.5152.4271.1828.0881.4608.1357.678.1357.3047 0 .5629-.0748.7802-.237.2165-.1562.3589-.3462.4198-.5628.0543-.2173.0887-.543.0887-.9841v-2.0675c0-.4409-.0139-.7324-.0344-.8681-.0199-.1357-.0742-.2781-.1695-.4204-.1021-.1425-.2437-.251-.4272-.3325-.1834-.0742-.3999-.1152-.6576-.1152-.2172 0-.4952.0477-.6846.1285-.1835.0887-.353.2238-.5086.4007V8.2603h-1.8309z\\\"/></svg>\",\n \"instagram\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\"><path fill=\\\"__FILL__\\\" d=\\\"M7.0301.084c-1.2768.0602-2.1487.264-2.911.5634-.7888.3075-1.4575.72-2.1228 1.3877-.6652.6677-1.075 1.3368-1.3802 2.127-.2954.7638-.4956 1.6365-.552 2.914-.0564 1.2775-.0689 1.6882-.0626 4.947.0062 3.2586.0206 3.6671.0825 4.9473.061 1.2765.264 2.1482.5635 2.9107.308.7889.72 1.4573 1.388 2.1228.6679.6655 1.3365 1.0743 2.1285 1.38.7632.295 1.6361.4961 2.9134.552 1.2773.056 1.6884.069 4.9462.0627 3.2578-.0062 3.668-.0207 4.9478-.0814 1.28-.0607 2.147-.2652 2.9098-.5633.7889-.3086 1.4578-.72 2.1228-1.3881.665-.6682 1.0745-1.3378 1.3795-2.1284.2957-.7632.4966-1.636.552-2.9124.056-1.2809.0692-1.6898.063-4.948-.0063-3.2583-.021-3.6668-.0817-4.9465-.0607-1.2797-.264-2.1487-.5633-2.9117-.3084-.7889-.72-1.4568-1.3876-2.1228C21.2982 1.33 20.628.9208 19.8378.6165 19.074.321 18.2017.1197 16.9244.0645 15.6471.0093 15.236-.005 11.977.0014 8.718.0076 8.31.0215 7.0301.0839m.1402 21.6932c-1.17-.0509-1.8053-.2453-2.2287-.408-.5606-.216-.96-.4771-1.3819-.895-.422-.4178-.6811-.8186-.9-1.378-.1644-.4234-.3624-1.058-.4171-2.228-.0595-1.2645-.072-1.6442-.079-4.848-.007-3.2037.0053-3.583.0607-4.848.05-1.169.2456-1.805.408-2.2282.216-.5613.4762-.96.895-1.3816.4188-.4217.8184-.6814 1.3783-.9003.423-.1651 1.0575-.3614 2.227-.4171 1.2655-.06 1.6447-.072 4.848-.079 3.2033-.007 3.5835.005 4.8495.0608 1.169.0508 1.8053.2445 2.228.408.5608.216.96.4754 1.3816.895.4217.4194.6816.8176.9005 1.3787.1653.4217.3617 1.056.4169 2.2263.0602 1.2655.0739 1.645.0796 4.848.0058 3.203-.0055 3.5834-.061 4.848-.051 1.17-.245 1.8055-.408 2.2294-.216.5604-.4763.96-.8954 1.3814-.419.4215-.8181.6811-1.3783.9-.4224.1649-1.0577.3617-2.2262.4174-1.2656.0595-1.6448.072-4.8493.079-3.2045.007-3.5825-.006-4.848-.0608M16.953 5.5864A1.44 1.44 0 1 0 18.39 4.144a1.44 1.44 0 0 0-1.437 1.4424M5.8385 12.012c.0067 3.4032 2.7706 6.1557 6.173 6.1493 3.4026-.0065 6.157-2.7701 6.1506-6.1733-.0065-3.4032-2.771-6.1565-6.174-6.1498-3.403.0067-6.156 2.771-6.1496 6.1738M8 12.0077a4 4 0 1 1 4.008 3.9921A3.9996 3.9996 0 0 1 8 12.0077\\\"/></svg>\",\n \"mastodon\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\"><path fill=\\\"__FILL__\\\" d=\\\"M23.268 5.313c-.35-2.578-2.617-4.61-5.304-5.004C17.51.242 15.792 0 11.813 0h-.03c-3.98 0-4.835.242-5.288.309C3.882.692 1.496 2.518.917 5.127.64 6.412.61 7.837.661 9.143c.074 1.874.088 3.745.26 5.611.118 1.24.325 2.47.62 3.68.55 2.237 2.777 4.098 4.96 4.857 2.336.792 4.849.923 7.256.38.265-.061.527-.132.786-.213.585-.184 1.27-.39 1.774-.753a.057.057 0 0 0 .023-.043v-1.809a.052.052 0 0 0-.02-.041.053.053 0 0 0-.046-.01 20.282 20.282 0 0 1-4.709.545c-2.73 0-3.463-1.284-3.674-1.818a5.593 5.593 0 0 1-.319-1.433.053.053 0 0 1 .066-.054c1.517.363 3.072.546 4.632.546.376 0 .75 0 1.125-.01 1.57-.044 3.224-.124 4.768-.422.038-.008.077-.015.11-.024 2.435-.464 4.753-1.92 4.989-5.604.008-.145.03-1.52.03-1.67.002-.512.167-3.63-.024-5.545zm-3.748 9.195h-2.561V8.29c0-1.309-.55-1.976-1.67-1.976-1.23 0-1.846.79-1.846 2.35v3.403h-2.546V8.663c0-1.56-.617-2.35-1.848-2.35-1.112 0-1.668.668-1.67 1.977v6.218H4.822V8.102c0-1.31.337-2.35 1.011-3.12.696-.77 1.608-1.164 2.74-1.164 1.311 0 2.302.5 2.962 1.498l.638 1.06.638-1.06c.66-.999 1.65-1.498 2.96-1.498 1.13 0 2.043.395 2.74 1.164.675.77 1.012 1.81 1.012 3.12z\\\"/></svg>\",\n \"orcid\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\"><path fill=\\\"__FILL__\\\" d=\\\"M12 0C5.372 0 0 5.372 0 12s5.372 12 12 12 12-5.372 12-12S18.628 0 12 0zM7.369 4.378c.525 0 .947.431.947.947s-.422.947-.947.947a.95.95 0 0 1-.947-.947c0-.525.422-.947.947-.947zm-.722 3.038h1.444v10.041H6.647V7.416zm3.562 0h3.9c3.712 0 5.344 2.653 5.344 5.025 0 2.578-2.016 5.025-5.325 5.025h-3.919V7.416zm1.444 1.303v7.444h2.297c3.272 0 4.022-2.484 4.022-3.722 0-2.016-1.284-3.722-4.097-3.722h-2.222z\\\"/></svg>\",\n \"stack-overflow\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\"><path fill=\\\"__FILL__\\\" d=\\\"M15.725 0l-1.72 1.277 6.39 8.588 1.716-1.277L15.725 0zm-3.94 3.418l-1.369 1.644 8.225 6.85 1.369-1.644-8.225-6.85zm-3.15 4.465l-.905 1.94 9.702 4.517.904-1.94-9.701-4.517zm-1.85 4.86l-.44 2.093 10.473 2.201.44-2.092-10.473-2.203zM1.89 15.47V24h19.19v-8.53h-2.133v6.397H4.021v-6.396H1.89zm4.265 2.133v2.13h10.66v-2.13H6.154Z\\\"/></svg>\",\n \"researchgate\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\"><path fill=\\\"__FILL__\\\" d=\\\"M19.586 0c-.818 0-1.508.19-2.073.565-.563.377-.97.936-1.213 1.68a3.193 3.193 0 0 0-.112.437 8.365 8.365 0 0 0-.078.53 9 9 0 0 0-.05.727c-.01.282-.013.621-.013 1.016a31.121 31.123 0 0 0 .014 1.017 9 9 0 0 0 .05.727 7.946 7.946 0 0 0 .077.53h-.005a3.334 3.334 0 0 0 .113.438c.245.743.65 1.303 1.214 1.68.565.376 1.256.564 2.075.564.8 0 1.536-.213 2.105-.603.57-.39.94-.916 1.175-1.65.076-.235.135-.558.177-.93a10.9 10.9 0 0 0 .043-1.207v-.82c0-.095-.047-.142-.14-.142h-3.064c-.094 0-.14.047-.14.141v.956c0 .094.046.14.14.14h1.666c.056 0 .084.03.084.086 0 .36 0 .62-.036.865-.038.244-.1.447-.147.606-.108.385-.348.664-.638.876-.29.212-.738.35-1.227.35-.545 0-.901-.15-1.21-.353-.306-.203-.517-.454-.67-.915a3.136 3.136 0 0 1-.147-.762 17.366 17.367 0 0 1-.034-.656c-.01-.26-.014-.572-.014-.939a26.401 26.403 0 0 1 .014-.938 15.821 15.822 0 0 1 .035-.656 3.19 3.19 0 0 1 .148-.76 1.89 1.89 0 0 1 .742-1.01c.344-.244.593-.352 1.137-.352.508 0 .815.096 1.144.303.33.207.528.492.764.925.047.094.111.118.198.07l1.044-.43c.075-.048.09-.115.042-.199a3.549 3.549 0 0 0-.466-.742 3 3 0 0 0-.679-.607 3.313 3.313 0 0 0-.903-.41A4.068 4.068 0 0 0 19.586 0zM8.217 5.836c-1.69 0-3.036.086-4.297.086-1.146 0-2.291 0-3.007-.029v.831l1.088.2c.744.144 1.174.488 1.174 2.264v11.288c0 1.777-.43 2.12-1.174 2.263l-1.088.2v.832c.773-.029 2.12-.086 3.465-.086 1.29 0 2.951.057 3.667.086v-.831l-1.49-.2c-.773-.115-1.174-.487-1.174-2.264v-4.784c.688.057 1.29.057 2.206.057 1.748 3.123 3.41 5.472 4.355 6.56.86 1.032 2.177 1.691 3.839 1.691.487 0 1.003-.086 1.318-.23v-.744c-1.031 0-2.063-.716-2.808-1.518-1.26-1.376-2.95-3.582-4.355-6.074 2.32-.545 4.04-2.722 4.04-4.9 0-3.208-2.492-4.698-5.758-4.698zm-.515 1.29c2.406 0 3.839 1.26 3.839 3.552 0 2.263-1.547 3.782-4.097 3.782-.974 0-1.404-.03-2.063-.086v-7.19c.66-.059 1.547-.059 2.32-.059z\\\"/></svg>\",\n \"youtube\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\"><path fill=\\\"__FILL__\\\" d=\\\"M23.498 6.186a3.016 3.016 0 0 0-2.122-2.136C19.505 3.545 12 3.545 12 3.545s-7.505 0-9.377.505A3.017 3.017 0 0 0 .502 6.186C0 8.07 0 12 0 12s0 3.93.502 5.814a3.016 3.016 0 0 0 2.122 2.136c1.871.505 9.376.505 9.376.505s7.505 0 9.377-.505a3.015 3.015 0 0 0 2.122-2.136C24 15.93 24 12 24 12s0-3.93-.502-5.814zM9.545 15.568V8.432L15.818 12l-6.273 3.568z\\\"/></svg>\",\n \"graduation-cap\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\"><path fill=\\\"__FILL__\\\" d=\\\"M12 3 1 9l4 2.2V17c0 .6.4 1 1 1h12c.6 0 1-.4 1-1v-5.8L23 9 12 3zm0 2.2 6.5 3.6L12 12.4 5.5 8.8 12 5.2zM7 17v-4.8l5 2.8 5-2.8V17H7z\\\"/></svg>\",\n \"telegram\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\"><path fill=\\\"__FILL__\\\" d=\\\"M11.944 0A12 12 0 0 0 0 12a12 12 0 0 0 12 12 12 12 0 0 0 12-12A12 12 0 0 0 12 0a12 12 0 0 0-.056 0zm4.962 7.224c.1-.002.321.023.465.14a.506.506 0 0 1 .171.325c.016.093.036.306.02.472-.18 1.898-.962 6.502-1.36 8.627-.168.9-.499 1.201-.82 1.23-.696.065-1.225-.46-1.9-.902-1.056-.693-1.653-1.124-2.678-1.8-1.185-.78-.417-1.21.258-1.91.177-.184 3.247-2.977 3.307-3.23.007-.032.014-.15-.056-.212s-.174-.041-.249-.024c-.106.024-1.793 1.14-5.061 3.345-.48.33-.913.49-1.302.48-.428-.008-1.252-.241-1.865-.44-.752-.245-1.349-.374-1.297-.789.027-.216.325-.437.893-.663 3.498-1.524 5.83-2.529 6.998-3.014 3.332-1.386 4.025-1.627 4.476-1.635z\\\"/></svg>\",\n \"whatsapp\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\"><path fill=\\\"__FILL__\\\" d=\\\"M17.472 14.382c-.297-.149-1.758-.867-2.03-.967-.273-.099-.471-.148-.67.15-.197.297-.767.966-.94 1.164-.173.199-.347.223-.644.075-.297-.15-1.255-.463-2.39-1.475-.883-.788-1.48-1.761-1.653-2.059-.173-.297-.018-.458.13-.606.134-.133.298-.347.446-.52.149-.174.198-.298.298-.497.099-.198.05-.371-.025-.52-.075-.149-.669-1.612-.916-2.207-.242-.579-.487-.5-.669-.51-.173-.008-.371-.01-.57-.01-.198 0-.52.074-.792.372-.272.297-1.04 1.016-1.04 2.479 0 1.462 1.065 2.875 1.213 3.074.149.198 2.096 3.2 5.077 4.487.709.306 1.262.489 1.694.625.712.227 1.36.195 1.871.118.571-.085 1.758-.719 2.006-1.413.248-.694.248-1.289.173-1.413-.074-.124-.272-.198-.57-.347m-5.421 7.403h-.004a9.87 9.87 0 01-5.031-1.378l-.361-.214-3.741.982.998-3.648-.235-.374a9.86 9.86 0 01-1.51-5.26c.001-5.45 4.436-9.884 9.888-9.884 2.64 0 5.122 1.03 6.988 2.898a9.825 9.825 0 012.893 6.994c-.003 5.45-4.437 9.884-9.885 9.884m8.413-18.297A11.815 11.815 0 0012.05 0C5.495 0 .16 5.335.157 11.892c0 2.096.547 4.142 1.588 5.945L.057 24l6.305-1.654a11.882 11.882 0 005.683 1.448h.005c6.554 0 11.89-5.335 11.893-11.893a11.821 11.821 0 00-3.48-8.413Z\\\"/></svg>\",\n \"code\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\"><path fill=\\\"__FILL__\\\" d=\\\"M8.7 15.9 4.8 12l3.9-3.9L7 6.3 2.3 11 7 15.7l1.7-1.8zm6.6 0 1.7 1.8L21.7 12l-4.7-4.7-1.7 1.8L19.2 12l-3.9 3.9z\\\"/></svg>\",\n \"x-twitter\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\"><path fill=\\\"__FILL__\\\" d=\\\"M14.234 10.162 22.977 0h-2.072l-7.591 8.824L7.251 0H.258l9.168 13.343L.258 24H2.33l8.016-9.318L16.749 24h6.993zm-2.837 3.299-.929-1.329L3.076 1.56h3.182l5.965 8.532.929 1.329 7.754 11.09h-3.182z\\\"/></svg>\",\n \"bluesky\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\"><path fill=\\\"__FILL__\\\" d=\\\"M5.202 2.857C7.954 4.922 10.913 9.11 12 11.358c1.087-2.247 4.046-6.436 6.798-8.501C20.783 1.366 24 .213 24 3.883c0 .732-.42 6.156-.667 7.037-.856 3.061-3.978 3.842-6.755 3.37 4.854.826 6.089 3.562 3.422 6.299-5.065 5.196-7.28-1.304-7.847-2.97-.104-.305-.152-.448-.153-.327 0-.121-.05.022-.153.327-.568 1.666-2.782 8.166-7.847 2.97-2.667-2.737-1.432-5.473 3.422-6.3-2.777.473-5.899-.308-6.755-3.369C.42 10.04 0 4.615 0 3.883c0-3.67 3.217-2.517 5.202-1.026\\\"/></svg>\",\n \"reddit\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\"><path fill=\\\"__FILL__\\\" d=\\\"M12 0C5.373 0 0 5.373 0 12c0 3.314 1.343 6.314 3.515 8.485l-2.286 2.286C.775 23.225 1.097 24 1.738 24H12c6.627 0 12-5.373 12-12S18.627 0 12 0Zm4.388 3.199c1.104 0 1.999.895 1.999 1.999 0 1.105-.895 2-1.999 2-.946 0-1.739-.657-1.947-1.539v.002c-1.147.162-2.032 1.15-2.032 2.341v.007c1.776.067 3.4.567 4.686 1.363.473-.363 1.064-.58 1.707-.58 1.547 0 2.802 1.254 2.802 2.802 0 1.117-.655 2.081-1.601 2.531-.088 3.256-3.637 5.876-7.997 5.876-4.361 0-7.905-2.617-7.998-5.87-.954-.447-1.614-1.415-1.614-2.538 0-1.548 1.255-2.802 2.803-2.802.645 0 1.239.218 1.712.585 1.275-.79 2.881-1.291 4.64-1.365v-.01c0-1.663 1.263-3.034 2.88-3.207.188-.911.993-1.595 1.959-1.595Zm-8.085 8.376c-.784 0-1.459.78-1.506 1.797-.047 1.016.64 1.429 1.426 1.429.786 0 1.371-.369 1.418-1.385.047-1.017-.553-1.841-1.338-1.841Zm7.406 0c-.786 0-1.385.824-1.338 1.841.047 1.017.634 1.385 1.418 1.385.785 0 1.473-.413 1.426-1.429-.046-1.017-.721-1.797-1.506-1.797Zm-3.703 4.013c-.974 0-1.907.048-2.77.135-.147.015-.241.168-.183.305.483 1.154 1.622 1.964 2.953 1.964 1.33 0 2.47-.81 2.953-1.964.057-.137-.037-.29-.184-.305-.863-.087-1.795-.135-2.769-.135Z\\\"/></svg>\",\n \"external-link\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\"><path fill=\\\"__FILL__\\\" d=\\\"M14 3h7v7h-2V6.4l-9.2 9.2-1.4-1.4L17.6 5H14V3zM5 5h6v2H7v10h10v-4h2v6H5V5z\\\"/></svg>\",\n)\n\n#let rendercv-icon(name, size: 0.9em, fill: rgb(0, 0, 0)) = {\n let svg-template = rendercv-icon-map.at(name, default: rendercv-icon-map.at(\"link\"))\n let svg = svg-template.replace(\"__FILL__\", fill.to-hex())\n box(\n image(bytes(svg), format: \"svg\", width: size, height: size, alt: \"\"),\n width: size,\n height: size,\n baseline: 22%,\n )\n}\n","#import \"icons.typ\": rendercv-icon\n\n// State to hold rendercv configuration for use by components\n#let rendercv-config = state(\"rendercv-config\", (:))\n\n// Direction-aware inset: maps logical start/end to physical left/right.\n// Must be called from within a `context` scope.\n#let directional-inset(start: 0cm, end: 0cm) = {\n let is-rtl = rendercv-config.get().at(\"is-rtl\")\n if is-rtl {\n (left: end, right: start)\n } else {\n (left: start, right: end)\n }\n}\n\n#let headline(headline) = {\n metadata(\"skip-content-area\")\n context {\n let config = rendercv-config.get()\n let typography-font-size-headline = config.at(\"typography-font-size-headline\")\n let typography-font-family-headline = config.at(\"typography-font-family-headline\")\n let typography-bold-headline = config.at(\"typography-bold-headline\")\n let colors-headline = config.at(\"colors-headline\")\n let typography-small-caps-headline = config.at(\"typography-small-caps-headline\")\n let header-alignment = config.at(\"header-alignment\")\n let header-space-below-headline = config.at(\"header-space-below-headline\")\n set text(\n fill: colors-headline,\n font: typography-font-family-headline,\n size: typography-font-size-headline,\n weight: if typography-bold-headline { 700 } else { 400 },\n )\n set align(header-alignment)\n block(\n if typography-small-caps-headline { smallcaps(headline) } else { headline },\n width: 100%,\n height: auto,\n )\n v(header-space-below-headline, weak: true)\n }\n}\n\n#let connections(..connections) = {\n metadata(\"skip-content-area\")\n\n context {\n let config = rendercv-config.get()\n let typography-line-spacing = config.at(\"typography-line-spacing\")\n let header-connections-space-between-connections = config.at(\"header-connections-space-between-connections\")\n let header-connections-separator = config.at(\"header-connections-separator\")\n let page-left-margin = config.at(\"page-left-margin\")\n let page-right-margin = config.at(\"page-right-margin\")\n let header-space-below-connections = config.at(\"header-space-below-connections\")\n let section-titles-space-above = config.at(\"section-titles-space-above\")\n let colors-connections = config.at(\"colors-connections\")\n let typography-font-family-connections = config.at(\"typography-font-family-connections\")\n let typography-font-size-connections = config.at(\"typography-font-size-connections\")\n let typography-small-caps-connections = config.at(\"typography-small-caps-connections\")\n let typography-bold-connections = config.at(\"typography-bold-connections\")\n let header-alignment = config.at(\"header-alignment\")\n\n set par(spacing: 0pt, leading: typography-line-spacing * 1.7, justify: false)\n set text(\n fill: colors-connections,\n font: typography-font-family-connections,\n size: typography-font-size-connections,\n weight: if typography-bold-connections { 700 } else { 400 },\n )\n\n let separator = (\n h(header-connections-space-between-connections / 2, weak: true)\n + header-connections-separator\n + h(header-connections-space-between-connections / 2, weak: true)\n )\n let separator-width = (\n measure(header-connections-separator).width + header-connections-space-between-connections\n )\n if connections.pos().len() > 0 {\n set align(header-alignment)\n box(\n {\n layout(size => {\n let line-width = 0cm\n for (i, connection) in connections.pos().enumerate() {\n let connection-body = if typography-small-caps-connections { smallcaps(connection) } else { connection }\n let connection-width = measure(connection-body).width\n let is-last = i == connections.pos().len() - 1\n\n // Check if adding this connection + separator would exceed the line\n if (\n line-width + connection-width + separator-width > size.width and line-width > 0cm\n ) {\n linebreak()\n line-width = 0cm\n }\n\n // Add separator only if we're not at the start of a line\n if line-width > 0cm {\n separator\n }\n\n box(connection-body, width: auto)\n line-width = line-width + connection-width + (if line-width > 0cm { separator-width } else { 0cm })\n }\n })\n },\n width: 100%,\n height: auto,\n )\n }\n v(header-space-below-connections - section-titles-space-above)\n }\n}\n\n#let original-link = link\n#let link(dest, body, icon: none, if-underline: none, if-color: none) = context {\n let config = rendercv-config.get()\n let links-underline = config.at(\"links-underline\")\n let links-show-external-link-icon = config.at(\"links-show-external-link-icon\")\n let typography-font-size-body = config.at(\"typography-font-size-body\")\n let colors-links = config.at(\"colors-links\")\n\n let icon = icon\n if icon == none {\n if links-show-external-link-icon {\n icon = true\n } else {\n icon = false\n }\n }\n let if-underline = if-underline\n if if-underline == none {\n if links-underline {\n if-underline = true\n } else {\n if-underline = false\n }\n }\n let if-color = if-color\n if if-color == none {\n if-color = true\n }\n\n let body = [#if if-underline [#underline(body)] else [#body]]\n if icon {\n let ext-icon-content = rendercv-icon(\"external-link\", size: 0.65em)\n let icon-width = measure(ext-icon-content).width\n // Zero-height box reserves horizontal space but doesn't affect line height\n // or baseline. place() renders the icon out of flow, positioned above the\n // baseline to align visually with text.\n let ext-icon = box(\n width: icon-width,\n height: 0pt,\n baseline: 0pt,\n place(dy: -0.75em, ext-icon-content),\n )\n // Wrap body in box to create BiDi isolation — the box becomes a neutral\n // atomic inline, so the paragraph direction controls the icon's placement.\n body = [#box[#body]#h(typography-font-size-body / 4)#ext-icon]\n }\n body = [#if if-color [#set text(fill: colors-links);#body] else [#body]]\n original-link(dest, body)\n}\n\n// Box around body creates BiDi isolation — the icon and body are both neutral\n// atomic inlines, so the paragraph direction controls their relative order.\n#let connection-with-icon(icon-name, body) = context {\n let config = rendercv-config.get()\n let colors-connections = config.at(\"colors-connections\")\n let typography-font-size-connections = config.at(\"typography-font-size-connections\")\n let icon-size = typography-font-size-connections * 0.85\n\n box(width: auto, baseline: 18%)[\n #rendercv-icon(icon-name, size: icon-size, fill: colors-connections)\n #h(0.1em, weak: true)\n #box(baseline: 0pt)[#body]\n ]\n}\n\n#let content-area(content) = context {\n let config = rendercv-config.get()\n let entries-side-space = config.at(\"entries-side-space\")\n let entries-date-and-location-width = config.at(\"entries-date-and-location-width\")\n let entries-space-between-columns = config.at(\"entries-space-between-columns\")\n let entries-allow-page-break = config.at(\"entries-allow-page-break\")\n let sections-space-between-text-based-entries = config.at(\"sections-space-between-text-based-entries\")\n let section-titles-type = config.at(\"section-titles-type\")\n let typography-line-spacing = config.at(\"typography-line-spacing\")\n let justify = config.at(\"justify\")\n let entries-highlights-bullet = config.at(\"entries-highlights-bullet\")\n let entries-highlights-nested-bullet = config.at(\"entries-highlights-nested-bullet\")\n let entries-highlights-space-between-bullet-and-text = config.at(\n \"entries-highlights-space-between-bullet-and-text\",\n )\n let start-align = config.at(\"start-align\")\n\n let start-space = entries-side-space\n if section-titles-type == \"moderncv\" {\n start-space = (\n start-space + entries-date-and-location-width + entries-space-between-columns\n )\n }\n\n set par(\n spacing: sections-space-between-text-based-entries + typography-line-spacing,\n leading: typography-line-spacing,\n justify: justify,\n )\n set align(start-align)\n set enum(\n spacing: sections-space-between-text-based-entries + typography-line-spacing,\n )\n set list(\n marker: (entries-highlights-bullet, entries-highlights-nested-bullet),\n indent: 0cm,\n spacing: sections-space-between-text-based-entries + typography-line-spacing,\n body-indent: entries-highlights-space-between-bullet-and-text,\n )\n\n block(\n content,\n breakable: entries-allow-page-break,\n below: sections-space-between-text-based-entries + typography-line-spacing,\n inset: directional-inset(start: start-space, end: entries-side-space),\n width: 100%,\n )\n}\n\n#let summary(summary) = {\n context {\n let config = rendercv-config.get()\n let entries-summary-space-left = config.at(\"entries-summary-space-left\")\n let entries-summary-space-above = config.at(\"entries-summary-space-above\")\n let typography-line-spacing = config.at(\"typography-line-spacing\")\n block(\n summary,\n inset: directional-inset(start: entries-summary-space-left),\n above: entries-summary-space-above + typography-line-spacing,\n )\n }\n}\n\n#let regular-entry(main-column, date-and-location-column, main-column-second-row: none) = {\n metadata(\"skip-content-area\")\n\n context {\n let config = rendercv-config.get()\n let section-titles-type = config.at(\"section-titles-type\")\n let entries-date-and-location-width = config.at(\"entries-date-and-location-width\")\n let entries-space-between-columns = config.at(\"entries-space-between-columns\")\n let entries-highlights-bullet = config.at(\"entries-highlights-bullet\")\n let entries-highlights-nested-bullet = config.at(\"entries-highlights-nested-bullet\")\n let entries-highlights-space-between-items = config.at(\n \"entries-highlights-space-between-items\",\n )\n let entries-highlights-space-between-bullet-and-text = config.at(\n \"entries-highlights-space-between-bullet-and-text\",\n )\n let entries-highlights-space-above = config.at(\"entries-highlights-space-above\")\n let typography-line-spacing = config.at(\"typography-line-spacing\")\n let entries-allow-page-break = config.at(\"entries-allow-page-break\")\n let sections-space-between-regular-entries = config.at(\"sections-space-between-regular-entries\")\n let entries-side-space = config.at(\"entries-side-space\")\n let justify = config.at(\"justify\")\n let typography-date-and-location-column-alignment = config.at(\"typography-date-and-location-column-alignment\")\n let entries-highlights-space-left = config.at(\"entries-highlights-space-left\")\n let start-align = config.at(\"start-align\")\n\n set list(\n marker: (entries-highlights-bullet, entries-highlights-nested-bullet),\n indent: entries-highlights-space-left,\n spacing: entries-highlights-space-between-items + typography-line-spacing,\n body-indent: entries-highlights-space-between-bullet-and-text,\n )\n let list-depth = state(\"list-depth\", 0)\n show list.item: i => {\n list-depth.update(d => d + 1)\n i\n list-depth.update(d => d - 1)\n }\n show list: l => {\n context if list-depth.get() == 1 {\n v(entries-highlights-space-above)\n }\n context if list-depth.get() == 2 {\n v(entries-highlights-space-between-items)\n }\n l\n }\n set par(\n spacing: typography-line-spacing,\n leading: typography-line-spacing,\n justify: justify,\n )\n block(\n {\n if section-titles-type == \"moderncv\" {\n grid(\n columns: (entries-date-and-location-width, 1fr),\n column-gutter: entries-space-between-columns,\n align: (typography-date-and-location-column-alignment, start-align),\n [\n #date-and-location-column\n ],\n [\n #main-column\n\n #main-column-second-row\n ],\n )\n } else {\n if repr(main-column) != \"[ ]\" or repr(date-and-location-column) != \"[ ]\" {\n grid(\n columns: (1fr, entries-date-and-location-width),\n column-gutter: entries-space-between-columns,\n align: (start-align, typography-date-and-location-column-alignment),\n main-column, date-and-location-column,\n )\n }\n set align(start-align)\n main-column-second-row\n }\n },\n breakable: entries-allow-page-break,\n below: sections-space-between-regular-entries + typography-line-spacing,\n inset: (\n left: entries-side-space,\n right: entries-side-space,\n ),\n width: 100%,\n )\n }\n}\n\n#let education-entry(main-column, date-and-location-column, degree-column: none, main-column-second-row: none) = {\n metadata(\"skip-content-area\")\n\n context {\n let config = rendercv-config.get()\n let entries-space-between-columns = config.at(\"entries-space-between-columns\")\n let entries-degree-width = config.at(\"entries-degree-width\")\n let start-align = config.at(\"start-align\")\n\n regular-entry(\n if degree-column != none {\n grid(\n columns: (entries-degree-width, 1fr),\n column-gutter: entries-space-between-columns,\n align: (start-align, auto),\n [\n #degree-column\n ],\n [\n #main-column\n ],\n )\n } else {\n main-column\n },\n date-and-location-column,\n main-column-second-row: if main-column-second-row != none and repr(main-column-second-row) != \"[ ]\" {\n [\n #block(\n main-column-second-row,\n inset: directional-inset(\n start: if degree-column != none { entries-degree-width + entries-space-between-columns } else { 0cm },\n ),\n )\n ]\n } else { none },\n )\n }\n}\n\n#let reversed-numbered-entries(entries) = {\n set enum(reversed: true)\n entries\n}\n\n#let rendercv(\n doc,\n name: \"John Doe\",\n title: \"John Doe's CV\",\n footer: context { \"Page \" + str(here().page()) + \" of \" + str(counter(page).final().first()) + \"\" },\n top-note: \"Last updated in \" + datetime.today().display(),\n locale-catalog-language: \"en\",\n text-direction: ltr,\n page-size: \"us-letter\",\n page-top-margin: 0.7in,\n page-bottom-margin: 0.7in,\n page-left-margin: 0.7in,\n page-right-margin: 0.7in,\n page-show-footer: true,\n page-show-top-note: true,\n colors-body: rgb(0, 0, 0),\n colors-name: rgb(0, 79, 144),\n colors-headline: rgb(0, 79, 144),\n colors-connections: rgb(0, 79, 144),\n colors-section-titles: rgb(0, 79, 144),\n colors-links: rgb(0, 79, 144),\n colors-footer: rgb(128, 128, 128),\n colors-top-note: rgb(128, 128, 128),\n typography-line-spacing: 0.6em,\n typography-alignment: \"justified\",\n typography-date-and-location-column-alignment: right,\n typography-font-family-body: \"Raleway\",\n typography-font-family-name: \"Raleway\",\n typography-font-family-headline: \"Raleway\",\n typography-font-family-connections: \"Raleway\",\n typography-font-family-section-titles: \"Raleway\",\n typography-font-size-body: 10pt,\n typography-font-size-name: 30pt,\n typography-font-size-headline: 10pt,\n typography-font-size-connections: 10pt,\n typography-font-size-section-titles: 1.4em,\n typography-small-caps-name: false,\n typography-small-caps-headline: false,\n typography-small-caps-connections: false,\n typography-small-caps-section-titles: false,\n typography-bold-name: false,\n typography-bold-headline: false,\n typography-bold-connections: false,\n typography-bold-section-titles: false,\n links-underline: false,\n links-show-external-link-icon: false,\n header-alignment: left,\n header-photo-width: 3.5cm,\n header-space-below-name: 0.7cm,\n header-space-below-headline: 0.7cm,\n header-space-below-connections: 0.7cm,\n header-connections-hyperlink: true,\n header-connections-show-icons: true,\n header-connections-display-urls-instead-of-usernames: false,\n header-connections-separator: \"\",\n header-connections-space-between-connections: 0.5cm,\n section-titles-type: \"with_full_line\",\n section-titles-line-thickness: 0.5pt,\n section-titles-space-above: 0.5cm,\n section-titles-space-below: 0.3cm,\n sections-allow-page-break: true,\n sections-space-between-text-based-entries: 0.3em,\n sections-space-between-regular-entries: 1.2em,\n entries-date-and-location-width: 4.15cm,\n entries-side-space: 0.2cm,\n entries-space-between-columns: 0.1cm,\n entries-allow-page-break: false,\n entries-short-second-row: false,\n entries-degree-width: 1cm,\n entries-summary-space-left: 0cm,\n entries-summary-space-above: 0.12cm,\n entries-highlights-bullet: \"•\",\n entries-highlights-nested-bullet: \"•\",\n entries-highlights-space-left: 0cm,\n entries-highlights-space-above: 0.12cm,\n entries-highlights-space-between-items: 0.12cm,\n entries-highlights-space-between-bullet-and-text: 0.5em,\n date: datetime(\n year: 2025,\n month: 12,\n day: 5,\n ),\n) = [\n #let (justify, hyphenate) = (\n \"justified\": (true, true),\n \"left\": (false, false),\n \"justified-with-no-hyphenation\": (true, false),\n ).at(typography-alignment)\n\n #let is-rtl = text-direction == rtl\n #let start-align = if is-rtl { right } else { left }\n #let end-align = if is-rtl { left } else { right }\n\n // Initialize state with all configuration parameters\n #rendercv-config.update((\n // Direction\n text-direction: text-direction,\n is-rtl: is-rtl,\n start-align: start-align,\n // Page\n page-left-margin: page-left-margin,\n page-right-margin: page-right-margin,\n // Colors\n colors-body: colors-body,\n colors-name: colors-name,\n colors-headline: colors-headline,\n colors-connections: colors-connections,\n colors-section-titles: colors-section-titles,\n colors-links: colors-links,\n colors-footer: colors-footer,\n colors-top-note: colors-top-note,\n // Typography\n typography-line-spacing: typography-line-spacing,\n typography-alignment: typography-alignment,\n typography-date-and-location-column-alignment: typography-date-and-location-column-alignment,\n typography-font-family-body: typography-font-family-body,\n typography-font-family-name: typography-font-family-name,\n typography-font-family-headline: typography-font-family-headline,\n typography-font-family-connections: typography-font-family-connections,\n typography-font-family-section-titles: typography-font-family-section-titles,\n typography-font-size-body: typography-font-size-body,\n typography-font-size-name: typography-font-size-name,\n typography-font-size-headline: typography-font-size-headline,\n typography-font-size-connections: typography-font-size-connections,\n typography-font-size-section-titles: typography-font-size-section-titles,\n typography-small-caps-name: typography-small-caps-name,\n typography-small-caps-headline: typography-small-caps-headline,\n typography-small-caps-connections: typography-small-caps-connections,\n typography-small-caps-section-titles: typography-small-caps-section-titles,\n typography-bold-name: typography-bold-name,\n typography-bold-headline: typography-bold-headline,\n typography-bold-connections: typography-bold-connections,\n typography-bold-section-titles: typography-bold-section-titles,\n // Links\n links-underline: links-underline,\n links-show-external-link-icon: links-show-external-link-icon,\n // Header\n header-alignment: header-alignment,\n header-photo-width: header-photo-width,\n header-space-below-name: header-space-below-name,\n header-space-below-headline: header-space-below-headline,\n header-space-below-connections: header-space-below-connections,\n header-connections-hyperlink: header-connections-hyperlink,\n header-connections-show-icons: header-connections-show-icons,\n header-connections-display-urls-instead-of-usernames: header-connections-display-urls-instead-of-usernames,\n header-connections-separator: header-connections-separator,\n header-connections-space-between-connections: header-connections-space-between-connections,\n // Section titles\n section-titles-type: section-titles-type,\n section-titles-line-thickness: section-titles-line-thickness,\n section-titles-space-above: section-titles-space-above,\n section-titles-space-below: section-titles-space-below,\n // Sections\n sections-allow-page-break: sections-allow-page-break,\n sections-space-between-regular-entries: sections-space-between-regular-entries,\n sections-space-between-text-based-entries: sections-space-between-text-based-entries,\n // Entries\n entries-date-and-location-width: entries-date-and-location-width,\n entries-side-space: entries-side-space,\n entries-space-between-columns: entries-space-between-columns,\n entries-allow-page-break: entries-allow-page-break,\n entries-summary-space-left: entries-summary-space-left,\n entries-summary-space-above: entries-summary-space-above,\n entries-highlights-bullet: entries-highlights-bullet,\n entries-highlights-nested-bullet: entries-highlights-nested-bullet,\n entries-highlights-space-left: entries-highlights-space-left,\n entries-highlights-space-above: entries-highlights-space-above,\n entries-highlights-space-between-items: entries-highlights-space-between-items,\n entries-highlights-space-between-bullet-and-text: entries-highlights-space-between-bullet-and-text,\n entries-degree-width: entries-degree-width,\n // Internal computed values\n justify: justify,\n ))\n\n // Metadata:\n #set document(author: name, title: title, date: date)\n\n // Page:\n #set page(\n margin: (\n top: page-top-margin,\n bottom: page-bottom-margin,\n left: page-left-margin,\n right: page-right-margin,\n ),\n paper: page-size,\n footer: if page-show-footer and footer != none and footer != \"\" {\n text(\n fill: colors-footer,\n align(center, [#footer]),\n size: 0.9em,\n )\n } else {\n none\n },\n footer-descent: 0% - 0.6em + page-bottom-margin / 2,\n )\n\n // Text:\n #set text(\n font: typography-font-family-body,\n size: typography-font-size-body,\n lang: locale-catalog-language,\n dir: text-direction,\n hyphenate: hyphenate,\n fill: colors-body,\n // Disable ligatures for better ATS compatibility:\n ligatures: true,\n )\n\n // Main heading (name):\n #show heading.where(level: 1): it => [\n #set par(spacing: 0pt)\n #set align(header-alignment)\n #set text(\n font: typography-font-family-name,\n size: typography-font-size-name,\n fill: colors-name,\n weight: if typography-bold-name { 700 } else { 400 },\n )\n #let body\n #if typography-small-caps-name {\n body = [#smallcaps(it.body)]\n } else {\n body = [#it.body]\n }\n #body\n // Vertical space after the name\n #v(header-space-below-name, weak: true)\n ]\n\n // Section titles:\n #show heading.where(level: 2): it => [\n #let is-centered = section-titles-type in (\"centered_without_line\", \"centered_with_partial_line\", \"centered_with_centered_partial_line\", \"centered_with_full_line\")\n #set align(if is-centered { center } else { start-align })\n #set text(size: (1em / 1.2)) // reset\n #set text(\n font: typography-font-family-section-titles,\n size: (typography-font-size-section-titles),\n weight: if typography-bold-section-titles { 700 } else { 400 },\n fill: colors-section-titles,\n )\n #let section-title = (\n if typography-small-caps-section-titles [\n #smallcaps(it.body)\n ] else [\n #it.body\n ]\n )\n // Vertical space above the section title\n #v(section-titles-space-above, weak: true)\n\n #block(\n breakable: false,\n width: 100%,\n [\n #if section-titles-type == \"moderncv\" [\n #grid(\n columns: (entries-date-and-location-width + entries-side-space, 1fr),\n column-gutter: entries-space-between-columns,\n align: (end-align, start-align),\n [\n #align(horizon, box(\n width: 1fr,\n height: section-titles-line-thickness,\n fill: colors-section-titles,\n ))\n ],\n [\n #section-title\n ],\n )\n ] else if section-titles-type == \"centered_without_line\" [\n #section-title\n ] else if section-titles-type == \"centered_with_partial_line\" [\n #grid(\n columns: (1fr, auto, 1fr),\n align: (bottom, center + bottom, bottom),\n column-gutter: 0.3em,\n [#box(width: 1fr, height: section-titles-line-thickness, fill: colors-section-titles)],\n [#section-title],\n [#box(width: 1fr, height: section-titles-line-thickness, fill: colors-section-titles)],\n )\n ] else if section-titles-type == \"centered_with_centered_partial_line\" [\n #grid(\n columns: (1fr, auto, 1fr),\n align: (horizon, center, horizon),\n column-gutter: 0.3em,\n [#box(width: 1fr, height: section-titles-line-thickness, fill: colors-section-titles)],\n [#section-title],\n [#box(width: 1fr, height: section-titles-line-thickness, fill: colors-section-titles)],\n )\n ] else if section-titles-type == \"centered_with_full_line\" [\n #section-title\n #v(typography-font-size-body * 0.3)\n #box(width: 1fr, height: section-titles-line-thickness, fill: colors-section-titles)\n ] else [\n #section-title\n #if section-titles-type == \"with_partial_line\" [\n #box(width: 1fr, height: section-titles-line-thickness, fill: colors-section-titles)\n ] else if section-titles-type == \"with_full_line\" [\n\n #v(typography-font-size-body * 0.3)\n #box(width: 1fr, height: section-titles-line-thickness, fill: colors-section-titles)\n ]\n ]\n ],\n )\n\n // Vertical space after the section title\n #v(section-titles-space-below - 0.5em)\n ]\n\n // Top note:\n #if page-show-top-note and top-note != none and top-note != \"\" {\n let dx = if is-rtl { entries-side-space } else { -entries-side-space }\n place(\n top + end-align,\n dy: -page-top-margin / 2,\n dx: dx,\n text(\n [#top-note],\n fill: colors-top-note,\n size: 0.9em,\n ),\n )\n }\n\n // From: https://github.com/typst/typst/issues/2666\n #let group-sections(content) = {\n let sections = ()\n let preamble = () // Content before any heading\n\n for element in content.children {\n if element.func() == heading {\n // Push a new section\n sections.push((element, ()))\n } else if sections.len() > 0 {\n // Add to current section\n sections.last().at(1).push(element)\n } else {\n // No heading yet - this is preamble content\n preamble.push(element)\n }\n }\n\n // Join the content in each section\n let result = sections.map(it => {\n let (title, content) = it\n (title, content.join())\n })\n\n // Return both preamble and sections\n (preamble: preamble.join(), sections: result)\n }\n\n #set par(spacing: 0cm)\n\n #let grouped = group-sections(doc)\n\n // Render preamble content (before any heading)\n #if grouped.preamble != none and grouped.preamble.func() != parbreak [\n #block(breakable: sections-allow-page-break)[\n #grouped.preamble\n ]\n ]\n\n // Render sections as before\n #for (section-title, section-content) in grouped.sections [\n #section-title\n #let should-skip = {\n let skip = false\n if section-content != none and section-content.has(\"children\") {\n for child in section-content.children {\n if child.func() == metadata and child.value == \"skip-content-area\" {\n skip = true\n break\n }\n }\n }\n skip\n }\n #if section-content != none and section-content.func() != parbreak [\n #block(breakable: sections-allow-page-break)[\n #if should-skip [\n #section-content\n ] else [\n #content-area(section-content)\n ]\n ]\n ]\n ]\n]\n","[package]\nname = \"rendercv\"\nversion = \"0.3.0\"\nentrypoint = \"lib.typ\"\nauthors = [\"Sina Atalay <dev@atalay.biz>\"]\nlicense = \"MIT\"\ndescription = \"Resume builder for academics and engineers\"\nrepository = \"https://github.com/rendercv/rendercv\"\nkeywords = [\"rendercv\", \"cv\", \"resume\", \"curriculum-vitae\"]\ncategories = [\"cv\"]\ndisciplines = []\ncompiler = \"0.14.0\"\nexclude = [\"examples/*.pdf\"]\n\n[template]\npath = \"template\"\nentrypoint = \"main.typ\"\nthumbnail = \"thumbnail.png\"\n","/**\n * Load a single bundled font file with in-memory cache.\n * Node: reads from src/renderer/assets/fonts on disk (fast, no bundler chunks).\n * Browser: dynamic import of the binary asset.\n */\nconst fontFileCache = new Map<string, Uint8Array>();\nlet nodeFontsRoot: string | null | undefined;\nlet browserFontsBaseUrl = '/fonts';\nlet fontsUrlConfigured = false;\n\nexport function configureBrowserFonts(baseUrl = '/fonts'): void {\n fontsUrlConfigured = true;\n browserFontsBaseUrl = baseUrl.replace(/\\/$/, '');\n}\n\nexport function isFontsUrlConfigured(): boolean {\n return fontsUrlConfigured;\n}\n\nfunction isNodeRuntime(): boolean {\n return typeof process !== 'undefined' && Boolean(process.versions?.node);\n}\n\nasync function resolveNodeFontsRoot(): Promise<string | null> {\n if (nodeFontsRoot !== undefined) {\n return nodeFontsRoot;\n }\n if (!isNodeRuntime()) {\n nodeFontsRoot = null;\n return null;\n }\n\n const [{ existsSync }, path, { fileURLToPath }] = await Promise.all([\n import('node:fs'),\n import('node:path'),\n import('node:url'),\n ]);\n\n const cwd = process.cwd();\n const moduleDir = path.dirname(fileURLToPath(import.meta.url));\n const candidates = [\n path.resolve(moduleDir, '../assets/fonts'),\n path.resolve(moduleDir, '../../assets/fonts'),\n path.resolve(moduleDir, '../../../assets/fonts'),\n path.join(cwd, 'assets/fonts'),\n path.join(cwd, 'node_modules/rendercv-ts/assets/fonts'),\n path.join(cwd, 'rendercv-ts/assets/fonts'),\n path.join(cwd, 'src/renderer/assets/fonts'),\n path.join(cwd, 'rendercv-ts/src/renderer/assets/fonts'),\n ];\n\n for (const candidate of candidates) {\n if (existsSync(candidate)) {\n nodeFontsRoot = candidate;\n return candidate;\n }\n }\n\n nodeFontsRoot = null;\n return null;\n}\n\nasync function loadBundledFontPath(relativePath: string): Promise<Uint8Array> {\n const cached = fontFileCache.get(relativePath);\n if (cached) {\n return cached;\n }\n\n const fontsRoot = await resolveNodeFontsRoot();\n let bytes: Uint8Array;\n\n if (fontsRoot) {\n const [{ readFile }, path] = await Promise.all([\n import('node:fs/promises'),\n import('node:path'),\n ]);\n bytes = new Uint8Array(await readFile(path.join(fontsRoot, relativePath)));\n } else if (typeof window !== 'undefined') {\n const response = await fetch(\n `${browserFontsBaseUrl}/${relativePath.split('/').map(encodeURIComponent).join('/')}`,\n );\n if (!response.ok) {\n throw new Error(`Failed to load font: ${relativePath} (${response.status})`);\n }\n bytes = new Uint8Array(await response.arrayBuffer());\n } else {\n const mod = await import(`../assets/fonts/${relativePath}?binary`);\n bytes = mod.default as Uint8Array;\n }\n\n fontFileCache.set(relativePath, bytes);\n return bytes;\n}\n\nexport async function loadBundledFontPaths(paths: readonly string[]): Promise<Uint8Array[]> {\n return Promise.all(paths.map((relativePath) => loadBundledFontPath(relativePath)));\n}\n","/**\n * Resolve bundled runtime asset locations (fonts + Typst WASM).\n */\nimport { configureBrowserFonts, isFontsUrlConfigured } from './fonts/load_bundled_font';\nimport { configureBrowserWasm, isWasmUrlConfigured, setBrowserWasmBytes } from './typst_setup';\n\nexport interface RendercvAssetPaths {\n wasmBaseUrl: string;\n fontsBaseUrl: string;\n}\n\nlet assetsConfigured = false;\n\n/** Default browser URLs when assets are served from the app origin (e.g. /wasm, /fonts). */\nexport function resolveBundledAssetPaths(origin = ''): RendercvAssetPaths {\n const base = origin.replace(/\\/$/, '');\n return {\n wasmBaseUrl: `${base}/wasm`,\n fontsBaseUrl: `${base}/fonts`,\n };\n}\n\nfunction isNodeRuntime(): boolean {\n return typeof process !== 'undefined' && Boolean(process.versions?.node);\n}\n\nasync function resolvePublishAssetsRoot(): Promise<string | null> {\n if (!isNodeRuntime()) {\n return null;\n }\n\n const [{ existsSync }, path, { fileURLToPath }] = await Promise.all([\n import('node:fs'),\n import('node:path'),\n import('node:url'),\n ]);\n\n const moduleDir = path.dirname(fileURLToPath(import.meta.url));\n const cwd = process.cwd();\n const candidates = [\n path.resolve(moduleDir, '../../assets'),\n path.resolve(moduleDir, '../assets'),\n path.join(cwd, 'assets'),\n path.join(cwd, 'node_modules/rendercv-ts/assets'),\n path.join(cwd, 'rendercv-ts/assets'),\n ];\n\n for (const candidate of candidates) {\n if (existsSync(path.join(candidate, 'wasm')) && existsSync(path.join(candidate, 'fonts'))) {\n return candidate;\n }\n }\n\n return null;\n}\n\nasync function injectWasmFromDisk(assetsRoot: string): Promise<void> {\n const [{ readFile }, path] = await Promise.all([import('node:fs/promises'), import('node:path')]);\n const wasmDir = path.join(assetsRoot, 'wasm');\n const [compiler, renderer] = await Promise.all([\n readFile(path.join(wasmDir, 'typst_ts_web_compiler_bg.wasm')),\n readFile(path.join(wasmDir, 'typst_ts_renderer_bg.wasm')),\n ]);\n setBrowserWasmBytes(compiler.buffer, renderer.buffer);\n}\n\n/**\n * Configure font/WASM loading. In the browser, defaults to `{origin}/wasm` and `{origin}/fonts`.\n * In Node (tests), loads WASM bytes from the bundled assets/ directory on disk.\n */\nexport async function configureDefaultAssets(options?: {\n origin?: string;\n}): Promise<RendercvAssetPaths> {\n if (assetsConfigured) {\n return resolveBundledAssetPaths(options?.origin ?? getBrowserOrigin());\n }\n\n const assetsRoot = await resolvePublishAssetsRoot();\n let wasmLoadedFromDisk = false;\n\n if (assetsRoot && isNodeRuntime()) {\n await injectWasmFromDisk(assetsRoot);\n wasmLoadedFromDisk = true;\n }\n\n const origin = options?.origin ?? getBrowserOrigin();\n const paths = resolveBundledAssetPaths(origin);\n\n if (typeof window !== 'undefined' && origin) {\n if (!isWasmUrlConfigured() && !wasmLoadedFromDisk) {\n configureBrowserWasm(paths.wasmBaseUrl);\n }\n if (!isFontsUrlConfigured() && !assetsRoot) {\n configureBrowserFonts(paths.fontsBaseUrl);\n }\n }\n\n assetsConfigured = true;\n return paths;\n}\n\nfunction getBrowserOrigin(): string {\n if (typeof window === 'undefined') {\n return '';\n }\n return window.location?.origin ?? '';\n}\n","/** Auto-generated by scripts/generate-font-manifest.mjs — do not edit. */\n\nimport { loadBundledFontPaths as loadFontPaths } from '../fonts/load_bundled_font.js';\n\nexport const FONT_FAMILY_ALIASES: Readonly<Record<string, string>> = {\n 'Vazirmatn Variable': 'Vazirmatn',\n};\n\nexport const bundledFontsByFamily: Readonly<Record<string, readonly string[]>> = {\n 'EB Garamond': [\n 'EB Garamond/EBGaramond-Bold.ttf',\n 'EB Garamond/EBGaramond-BoldItalic.ttf',\n 'EB Garamond/EBGaramond-Italic.ttf',\n 'EB Garamond/EBGaramond-Regular.ttf',\n ],\n 'Fontin': [\n 'Fontin/Fontin-Bold.otf',\n 'Fontin/Fontin-Italic.otf',\n 'Fontin/Fontin-Regular.otf',\n ],\n 'Gentium Book Plus': [\n 'Gentium Book Plus/GentiumBookPlus-Bold.ttf',\n 'Gentium Book Plus/GentiumBookPlus-BoldItalic.ttf',\n 'Gentium Book Plus/GentiumBookPlus-Italic.ttf',\n 'Gentium Book Plus/GentiumBookPlus-Regular.ttf',\n ],\n 'Lato': [\n 'Lato/Lato-Bold.ttf',\n 'Lato/Lato-BoldItalic.ttf',\n 'Lato/Lato-Italic.ttf',\n 'Lato/Lato-Regular.ttf',\n ],\n 'Raleway': [\n 'Raleway/Raleway-Bold.ttf',\n 'Raleway/Raleway-BoldItalic.ttf',\n 'Raleway/Raleway-Italic.ttf',\n 'Raleway/Raleway-Regular.ttf',\n ],\n 'Source Sans 3': [\n 'Source Sans 3/SourceSans3-Bold.ttf',\n 'Source Sans 3/SourceSans3-BoldItalic.ttf',\n 'Source Sans 3/SourceSans3-Italic.ttf',\n 'Source Sans 3/SourceSans3-Regular.ttf',\n ],\n 'Ubuntu': [\n 'Ubuntu/Ubuntu-Bold.ttf',\n 'Ubuntu/Ubuntu-BoldItalic.ttf',\n 'Ubuntu/Ubuntu-Italic.ttf',\n 'Ubuntu/Ubuntu-Regular.ttf',\n ],\n 'Vazirmatn': [\n 'Vazirmatn/Vazirmatn-Black.ttf',\n 'Vazirmatn/Vazirmatn-Bold.ttf',\n 'Vazirmatn/Vazirmatn-ExtraBold.ttf',\n 'Vazirmatn/Vazirmatn-ExtraLight.ttf',\n 'Vazirmatn/Vazirmatn-Light.ttf',\n 'Vazirmatn/Vazirmatn-Medium.ttf',\n 'Vazirmatn/Vazirmatn-Regular.ttf',\n 'Vazirmatn/Vazirmatn-SemiBold.ttf',\n 'Vazirmatn/Vazirmatn-Thin.ttf',\n ],\n 'XCharter': [\n 'XCharter/XCharter-Bold.otf',\n 'XCharter/XCharter-BoldItalic.otf',\n 'XCharter/XCharter-Italic.otf',\n 'XCharter/XCharter-Regular.otf',\n ],\n};\n\nexport const bundledFontPaths: readonly string[] = [\n 'EB Garamond/EBGaramond-Bold.ttf',\n 'EB Garamond/EBGaramond-BoldItalic.ttf',\n 'EB Garamond/EBGaramond-Italic.ttf',\n 'EB Garamond/EBGaramond-Regular.ttf',\n 'Fontin/Fontin-Bold.otf',\n 'Fontin/Fontin-Italic.otf',\n 'Fontin/Fontin-Regular.otf',\n 'Gentium Book Plus/GentiumBookPlus-Bold.ttf',\n 'Gentium Book Plus/GentiumBookPlus-BoldItalic.ttf',\n 'Gentium Book Plus/GentiumBookPlus-Italic.ttf',\n 'Gentium Book Plus/GentiumBookPlus-Regular.ttf',\n 'Lato/Lato-Bold.ttf',\n 'Lato/Lato-BoldItalic.ttf',\n 'Lato/Lato-Italic.ttf',\n 'Lato/Lato-Regular.ttf',\n 'Raleway/Raleway-Bold.ttf',\n 'Raleway/Raleway-BoldItalic.ttf',\n 'Raleway/Raleway-Italic.ttf',\n 'Raleway/Raleway-Regular.ttf',\n 'Source Sans 3/SourceSans3-Bold.ttf',\n 'Source Sans 3/SourceSans3-BoldItalic.ttf',\n 'Source Sans 3/SourceSans3-Italic.ttf',\n 'Source Sans 3/SourceSans3-Regular.ttf',\n 'Ubuntu/Ubuntu-Bold.ttf',\n 'Ubuntu/Ubuntu-BoldItalic.ttf',\n 'Ubuntu/Ubuntu-Italic.ttf',\n 'Ubuntu/Ubuntu-Regular.ttf',\n 'Vazirmatn/Vazirmatn-Black.ttf',\n 'Vazirmatn/Vazirmatn-Bold.ttf',\n 'Vazirmatn/Vazirmatn-ExtraBold.ttf',\n 'Vazirmatn/Vazirmatn-ExtraLight.ttf',\n 'Vazirmatn/Vazirmatn-Light.ttf',\n 'Vazirmatn/Vazirmatn-Medium.ttf',\n 'Vazirmatn/Vazirmatn-Regular.ttf',\n 'Vazirmatn/Vazirmatn-SemiBold.ttf',\n 'Vazirmatn/Vazirmatn-Thin.ttf',\n 'XCharter/XCharter-Bold.otf',\n 'XCharter/XCharter-BoldItalic.otf',\n 'XCharter/XCharter-Italic.otf',\n 'XCharter/XCharter-Regular.otf',\n];\n\nexport async function loadBundledFontPaths(paths: readonly string[]): Promise<Uint8Array[]> {\n return loadFontPaths(paths);\n}\n\n/** @deprecated Use loadBundledFontPaths with model-specific paths instead. */\nexport async function loadBundledFonts(): Promise<Uint8Array[]> {\n return loadBundledFontPaths(bundledFontPaths);\n}\n\n","/**\n * Disk cache for Typst base fonts in Node (avoids re-downloading on every CLI run).\n */\nimport { createHash } from 'node:crypto';\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';\nimport path from 'node:path';\n\nconst CACHE_VERSION = 'v1';\nlet cacheDir: string | null | undefined;\n\nfunction isNodeRuntime(): boolean {\n return typeof process !== 'undefined' && Boolean(process.versions?.node);\n}\n\nfunction getCacheDir(): string | null {\n if (cacheDir !== undefined) {\n return cacheDir;\n }\n if (!isNodeRuntime()) {\n cacheDir = null;\n return null;\n }\n const dir = path.join(process.cwd(), '.rendercv-cache', 'typst-fonts', CACHE_VERSION);\n try {\n mkdirSync(dir, { recursive: true });\n cacheDir = dir;\n return dir;\n } catch {\n cacheDir = null;\n return null;\n }\n}\n\nfunction cacheFilePath(url: string): string | null {\n const dir = getCacheDir();\n if (!dir) {\n return null;\n }\n const hash = createHash('sha256').update(url).digest('hex').slice(0, 16);\n const base = path.basename(url);\n return path.join(dir, `${hash}-${base}`);\n}\n\nexport async function fetchTypstFontBytes(url: string): Promise<Uint8Array> {\n const cachedPath = cacheFilePath(url);\n if (cachedPath && existsSync(cachedPath)) {\n return new Uint8Array(readFileSync(cachedPath));\n }\n\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`Font file fetch failed (${response.status}): ${url}`);\n }\n const bytes = new Uint8Array(await response.arrayBuffer());\n\n if (cachedPath) {\n try {\n writeFileSync(cachedPath, bytes);\n } catch {\n // ignore cache write failures\n }\n }\n\n return bytes;\n}\n","/**\n * Bundled font loading for Typst WASM — no network theme-font fetching.\n * Loads only the font families required by the current model.\n */\nimport type { RenderCVModel } from '../../schema/models/rendercv_model';\nimport {\n FONT_FAMILY_ALIASES,\n bundledFontsByFamily,\n loadBundledFontPaths,\n} from '../assets/font_manifest';\n\nconst TYPST_TEXT_FONT_PREFIX =\n 'https://cdn.jsdelivr.net/gh/typst/typst-assets@v0.13.1/files/fonts/';\nconst TYPST_TEXT_FONTS = [\n 'DejaVuSansMono-Bold.ttf',\n 'DejaVuSansMono-BoldOblique.ttf',\n 'DejaVuSansMono-Oblique.ttf',\n 'DejaVuSansMono.ttf',\n 'LibertinusSerif-Bold.otf',\n 'LibertinusSerif-BoldItalic.otf',\n 'LibertinusSerif-Italic.otf',\n 'LibertinusSerif-Regular.otf',\n 'LibertinusSerif-Semibold.otf',\n 'LibertinusSerif-SemiboldItalic.otf',\n 'NewCM10-Bold.otf',\n 'NewCM10-BoldItalic.otf',\n 'NewCM10-Italic.otf',\n 'NewCM10-Regular.otf',\n 'NewCMMath-Bold.otf',\n 'NewCMMath-Book.otf',\n 'NewCMMath-Regular.otf',\n] as const;\n\nlet typstTextFontBytesPromise: Promise<Uint8Array[]> | null = null;\nconst bundledFontBytesByKey = new Map<string, Promise<Uint8Array[]>>();\n\nfunction normalizeFamilyName(family: string): string {\n return family.trim();\n}\n\nfunction collectFontFamilies(model: RenderCVModel): string[] {\n const typography = model.design.typography;\n const families = new Set<string>();\n const add = (value: string | null | undefined) => {\n if (value) {\n families.add(normalizeFamilyName(value));\n }\n };\n\n add(typography.font_family.body);\n add(typography.font_family.name);\n add(typography.font_family.headline);\n add(typography.font_family.connections);\n add(typography.font_family.section_titles);\n\n return [...families];\n}\n\nexport function modelFontCacheKey(model: RenderCVModel): string {\n return collectFontFamilies(model).sort().join(';');\n}\n\nfunction resolveBundledFolder(family: string): string {\n return FONT_FAMILY_ALIASES[family] ?? family;\n}\n\nfunction bundledPathsForFamilies(families: readonly string[]): string[] {\n const paths = new Set<string>();\n for (const family of families) {\n const folder = resolveBundledFolder(family);\n for (const path of bundledFontsByFamily[folder] ?? []) {\n paths.add(path);\n }\n }\n return [...paths].sort();\n}\n\nasync function fetchRemoteFontBytes(url: string): Promise<Uint8Array> {\n if (typeof process !== 'undefined' && process.versions?.node) {\n const { fetchTypstFontBytes } = await import('./typst_font_cache.js');\n return fetchTypstFontBytes(url);\n }\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`Font file fetch failed (${response.status}): ${url}`);\n }\n return new Uint8Array(await response.arrayBuffer());\n}\n\nasync function loadTypstTextFontBytes(): Promise<Uint8Array[]> {\n if (!typstTextFontBytesPromise) {\n typstTextFontBytesPromise = Promise.all(\n TYPST_TEXT_FONTS.map((fileName) =>\n fetchRemoteFontBytes(`${TYPST_TEXT_FONT_PREFIX}${fileName}`),\n ),\n );\n }\n return typstTextFontBytesPromise;\n}\n\nasync function loadBundledFontBytesForFamilies(families: readonly string[]): Promise<Uint8Array[]> {\n const paths = bundledPathsForFamilies(families);\n if (paths.length === 0) {\n return [];\n }\n return loadBundledFontPaths(paths);\n}\n\nexport async function loadBaseFontsForTypst(): Promise<Uint8Array[]> {\n return loadTypstTextFontBytes();\n}\n\n/** Typst base fonts + bundled CV fonts needed by the model only. */\nexport async function loadFontsForTypst(model: RenderCVModel): Promise<Uint8Array[]> {\n const key = modelFontCacheKey(model);\n let promise = bundledFontBytesByKey.get(key);\n if (!promise) {\n promise = (async () => {\n const families = collectFontFamilies(model);\n const [typstTextFonts, themeFonts] = await Promise.all([\n loadTypstTextFontBytes(),\n loadBundledFontBytesForFamilies(families),\n ]);\n return [...typstTextFonts, ...themeFonts];\n })();\n bundledFontBytesByKey.set(key, promise);\n }\n return promise;\n}\n","/**\n * Bundled Typst package + font setup for the WASM compiler.\n */\nimport {\n type TypstCompiler,\n type TypstRenderer,\n createTypstCompiler,\n createTypstFontBuilder,\n createTypstRenderer,\n initOptions,\n} from '@myriaddreamin/typst.ts';\nimport type { RenderCVModel } from '../schema/models/rendercv_model';\nimport rendercvIconsTyp from './assets/rendercv_typst/icons.typ?raw';\nimport rendercvLibTyp from './assets/rendercv_typst/lib.typ?raw';\nimport rendercvTypstToml from './assets/rendercv_typst/typst.toml?raw';\n\nexport const RENDERCV_PACKAGE_VERSION = readPackageVersion(rendercvTypstToml);\n\nconst MAIN_TYP_PATH = '/main.typ';\nconst TYPST_ROOT = '/';\n\ninterface TypstRuntime {\n compiler: TypstCompiler;\n renderer: TypstRenderer;\n}\n\nlet runtimePromise: Promise<TypstRuntime> | null = null;\nlet cachedFontBytes: Uint8Array[] | null = null;\nlet cachedFontModelKey: string | null = null;\n\nlet browserWasmBaseUrl = '/wasm';\nlet browserWasmBytes: {\n compiler: ArrayBuffer;\n renderer: ArrayBuffer;\n} | null = null;\nlet browserWasmPromise: Promise<void> | null = null;\nlet wasmUrlConfigured = false;\n\nexport function configureBrowserWasm(baseUrl = '/wasm'): void {\n wasmUrlConfigured = true;\n browserWasmBaseUrl = baseUrl.replace(/\\/$/, '');\n browserWasmBytes = null;\n browserWasmPromise = null;\n}\n\nexport function isWasmUrlConfigured(): boolean {\n return wasmUrlConfigured;\n}\n\n/** Inject WASM modules directly (used in Node tests and when assets are read from disk). */\nexport function setBrowserWasmBytes(compiler: ArrayBuffer, renderer: ArrayBuffer): void {\n browserWasmBytes = { compiler, renderer };\n browserWasmPromise = Promise.resolve();\n}\n\nasync function ensureBrowserWasm(): Promise<void> {\n if (typeof window === 'undefined') {\n return;\n }\n if (browserWasmBytes) {\n return;\n }\n if (!browserWasmPromise) {\n browserWasmPromise = (async () => {\n const fetchWasm = async (name: string): Promise<ArrayBuffer> => {\n const response = await fetch(`${browserWasmBaseUrl}/${name}`);\n if (!response.ok) {\n throw new Error(`Failed to load Typst WASM: ${name} (${response.status})`);\n }\n return response.arrayBuffer();\n };\n const [compiler, renderer] = await Promise.all([\n fetchWasm('typst_ts_web_compiler_bg.wasm'),\n fetchWasm('typst_ts_renderer_bg.wasm'),\n ]);\n browserWasmBytes = { compiler, renderer };\n })();\n }\n await browserWasmPromise;\n}\n\nfunction browserCompilerInitOptions(): { getModule?: () => ArrayBuffer } {\n if (!browserWasmBytes) {\n return {};\n }\n return { getModule: () => browserWasmBytes!.compiler };\n}\n\nfunction browserRendererInitOptions(): { getModule?: () => ArrayBuffer } {\n if (!browserWasmBytes) {\n return {};\n }\n return { getModule: () => browserWasmBytes!.renderer };\n}\n\nclass BundledPackageRegistry {\n private readonly packages = new Set<string>();\n\n register(name: string, version: string): void {\n this.packages.add(`${name}/${version}`);\n }\n\n resolve(\n spec: { namespace: string; name: string; version: string },\n _context: unknown,\n ): string | undefined {\n if (spec.namespace !== 'preview') {\n return undefined;\n }\n const key = `${spec.name}/${spec.version}`;\n if (!this.packages.has(key)) {\n return undefined;\n }\n return `/preview/${spec.name}/${spec.version}`;\n }\n}\n\nfunction createBundledPackageRegistry(): BundledPackageRegistry {\n const registry = new BundledPackageRegistry();\n registry.register('rendercv', RENDERCV_PACKAGE_VERSION);\n return registry;\n}\n\nfunction readPackageVersion(typstToml: string): string {\n const match = typstToml.match(/^\\s*version\\s*=\\s*\"([^\"]+)\"/m);\n if (!match) {\n throw new Error('Could not find version in bundled typst.toml');\n }\n return match[1]!;\n}\n\nfunction encodeText(text: string): Uint8Array {\n return new TextEncoder().encode(text);\n}\n\nfunction packageFilePath(name: string, version: string, file: string): string {\n return `/preview/${name}/${version}/${file}`;\n}\n\nfunction registerPackage(\n compiler: TypstCompiler,\n name: string,\n version: string,\n files: Record<string, string>,\n): void {\n for (const [file, content] of Object.entries(files)) {\n compiler.mapShadow(packageFilePath(name, version, file), encodeText(content));\n }\n}\n\nconst RENDERCV_PACKAGE_FILES = {\n 'typst.toml': rendercvTypstToml,\n 'lib.typ': rendercvLibTyp,\n 'icons.typ': rendercvIconsTyp,\n};\n\nfunction registerRendercvPackage(compiler: TypstCompiler): void {\n registerPackage(compiler, 'rendercv', RENDERCV_PACKAGE_VERSION, RENDERCV_PACKAGE_FILES);\n}\n\nasync function createRuntime(): Promise<TypstRuntime> {\n await ensureBrowserWasm();\n const compilerWasmOptions = browserCompilerInitOptions();\n const rendererWasmOptions = browserRendererInitOptions();\n\n const compiler = createTypstCompiler();\n await compiler.init({\n ...compilerWasmOptions,\n beforeBuild: [\n initOptions.disableDefaultFontAssets(),\n initOptions.withPackageRegistry(createBundledPackageRegistry()),\n ],\n });\n\n registerRendercvPackage(compiler);\n\n const renderer = createTypstRenderer();\n await renderer.init(rendererWasmOptions);\n\n return { compiler, renderer };\n}\n\nasync function applyFontBytesToCompiler(\n compiler: TypstCompiler,\n fontBytes: Uint8Array[],\n): Promise<void> {\n await ensureBrowserWasm();\n const fontBuilder = createTypstFontBuilder();\n await fontBuilder.init(browserCompilerInitOptions());\n for (const bytes of fontBytes) {\n if (bytes.length > 0) {\n await fontBuilder.addFontData(bytes);\n }\n }\n await fontBuilder.build(async (resolver) => {\n compiler.setFonts(resolver);\n });\n}\n\nexport async function getTypstRuntime(): Promise<TypstRuntime> {\n if (!runtimePromise) {\n runtimePromise = (async () => {\n const { configureDefaultAssets } = await import('./asset_paths.js');\n await configureDefaultAssets();\n return createRuntime();\n })();\n }\n return runtimePromise;\n}\n\nexport async function preloadTypst(): Promise<void> {\n const { configureDefaultAssets } = await import('./asset_paths.js');\n await configureDefaultAssets();\n await getTypstRuntime();\n}\n\nexport function decodeAssetBytes(value: string): Uint8Array {\n if (value.startsWith('data:')) {\n const base64 = value.split(',')[1] ?? '';\n const binary = atob(base64);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n return bytes;\n }\n return encodeText(value);\n}\n\nasync function resolveFontBytesForModel(model: RenderCVModel): Promise<Uint8Array[]> {\n const { loadFontsForTypst, modelFontCacheKey } = await import('./fonts/font_registry.js');\n const key = modelFontCacheKey(model);\n if (cachedFontModelKey === key && cachedFontBytes) {\n return cachedFontBytes;\n }\n\n cachedFontBytes = await loadFontsForTypst(model);\n cachedFontModelKey = key;\n return cachedFontBytes;\n}\n\nexport async function ensureFontsForModel(model: RenderCVModel): Promise<void> {\n const runtime = await getTypstRuntime();\n const fontBytes = await resolveFontBytesForModel(model);\n await applyFontBytesToCompiler(runtime.compiler, fontBytes);\n}\n\nexport async function prepareTypstCompilation(\n typstSource: string,\n options?: {\n photoName?: string | null;\n photoBytes?: Uint8Array | null;\n model?: RenderCVModel;\n },\n): Promise<{ compiler: TypstCompiler; mainFilePath: string }> {\n const runtime = await getTypstRuntime();\n await runtime.compiler.resetShadow();\n registerRendercvPackage(runtime.compiler);\n\n if (options?.model) {\n await ensureFontsForModel(options.model);\n } else if (cachedFontBytes === null) {\n const { loadBaseFontsForTypst } = await import('./fonts/font_registry.js');\n cachedFontBytes = await loadBaseFontsForTypst();\n cachedFontModelKey = 'bundled-only';\n await applyFontBytesToCompiler(runtime.compiler, cachedFontBytes);\n } else {\n await applyFontBytesToCompiler(runtime.compiler, cachedFontBytes);\n }\n\n runtime.compiler.addSource(MAIN_TYP_PATH, typstSource);\n\n if (options?.photoName && options.photoBytes) {\n runtime.compiler.mapShadow(`/${options.photoName}`, options.photoBytes);\n }\n\n return { compiler: runtime.compiler, mainFilePath: MAIN_TYP_PATH };\n}\n\nexport async function clearFontCache(): Promise<void> {\n const { clearFontCache: clearCache } = await import('./fonts/font_cache.js');\n await clearCache();\n cachedFontBytes = null;\n cachedFontModelKey = null;\n}\n\nexport { MAIN_TYP_PATH, TYPST_ROOT };\n","import type { RenderCVModel } from '../../schema/models/rendercv_model';\n/**\n * PDF Web Worker — runs Typst WASM compile off the main thread.\n */\nimport { MAIN_TYP_PATH, TYPST_ROOT, prepareTypstCompilation } from '../typst_setup';\n\nexport type PdfWorkerRequest = {\n type: 'compile-pdf';\n id: number;\n typstSource: string;\n model: RenderCVModel;\n photoName: string | null;\n photoBytes: Uint8Array | null;\n};\n\nexport type PdfWorkerResponse =\n | { type: 'compile-pdf-result'; id: number; pdf: Uint8Array }\n | { type: 'compile-pdf-error'; id: number; message: string };\n\nasync function compilePdfInWorker(request: PdfWorkerRequest): Promise<Uint8Array> {\n const { compiler, mainFilePath } = await prepareTypstCompilation(request.typstSource, {\n photoName: request.photoName,\n photoBytes: request.photoBytes,\n model: request.model,\n });\n\n return compiler.runWithWorld({ mainFilePath, root: TYPST_ROOT }, async (world) => {\n const pdfResult = await world.pdf({ diagnostics: 'full' });\n if (!pdfResult.result?.length) {\n const message =\n pdfResult.diagnostics?.map((d) => ('message' in d ? d.message : String(d))).join('\\n') ??\n 'Typst compiler returned empty PDF bytes';\n throw new Error(message);\n }\n return pdfResult.result;\n });\n}\n\nself.onmessage = (event: MessageEvent<PdfWorkerRequest>) => {\n const request = event.data;\n if (request.type !== 'compile-pdf') {\n return;\n }\n void (async () => {\n try {\n const pdf = await compilePdfInWorker(request);\n const response: PdfWorkerResponse = {\n type: 'compile-pdf-result',\n id: request.id,\n pdf,\n };\n self.postMessage(response, { transfer: [pdf.buffer] });\n } catch (error) {\n const response: PdfWorkerResponse = {\n type: 'compile-pdf-error',\n id: request.id,\n message: error instanceof Error ? error.message : String(error),\n };\n self.postMessage(response);\n }\n })();\n};\n\nexport { MAIN_TYP_PATH };\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;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","names":["existsSync","path","isNodeRuntime","existsSync","path","import_meta","loadBundledFontPaths","isNodeRuntime","path","path","fetchTypstFontBytes","loadBundledFontPaths","configureDefaultAssets","loadFontsForTypst","modelFontCacheKey","loadBaseFontsForTypst"]}
@@ -0,0 +1,24 @@
1
+ import { R as RenderCVModel } from '../../typst_setup-WebjDI32.cjs';
2
+ export { M as MAIN_TYP_PATH } from '../../typst_setup-WebjDI32.cjs';
3
+ import 'zod';
4
+ import 'yaml';
5
+
6
+ type PdfWorkerRequest = {
7
+ type: 'compile-pdf';
8
+ id: number;
9
+ typstSource: string;
10
+ model: RenderCVModel;
11
+ photoName: string | null;
12
+ photoBytes: Uint8Array | null;
13
+ };
14
+ type PdfWorkerResponse = {
15
+ type: 'compile-pdf-result';
16
+ id: number;
17
+ pdf: Uint8Array;
18
+ } | {
19
+ type: 'compile-pdf-error';
20
+ id: number;
21
+ message: string;
22
+ };
23
+
24
+ export type { PdfWorkerRequest, PdfWorkerResponse };
@@ -0,0 +1,24 @@
1
+ import { R as RenderCVModel } from '../../typst_setup-WebjDI32.js';
2
+ export { M as MAIN_TYP_PATH } from '../../typst_setup-WebjDI32.js';
3
+ import 'zod';
4
+ import 'yaml';
5
+
6
+ type PdfWorkerRequest = {
7
+ type: 'compile-pdf';
8
+ id: number;
9
+ typstSource: string;
10
+ model: RenderCVModel;
11
+ photoName: string | null;
12
+ photoBytes: Uint8Array | null;
13
+ };
14
+ type PdfWorkerResponse = {
15
+ type: 'compile-pdf-result';
16
+ id: number;
17
+ pdf: Uint8Array;
18
+ } | {
19
+ type: 'compile-pdf-error';
20
+ id: number;
21
+ message: string;
22
+ };
23
+
24
+ export type { PdfWorkerRequest, PdfWorkerResponse };
@@ -0,0 +1,51 @@
1
+ import {
2
+ MAIN_TYP_PATH,
3
+ TYPST_ROOT,
4
+ prepareTypstCompilation
5
+ } from "../../chunk-VZSMPOAA.js";
6
+ import "../../chunk-EVM6BVMO.js";
7
+
8
+ // src/renderer/worker/pdf_worker.ts
9
+ async function compilePdfInWorker(request) {
10
+ const { compiler, mainFilePath } = await prepareTypstCompilation(request.typstSource, {
11
+ photoName: request.photoName,
12
+ photoBytes: request.photoBytes,
13
+ model: request.model
14
+ });
15
+ return compiler.runWithWorld({ mainFilePath, root: TYPST_ROOT }, async (world) => {
16
+ const pdfResult = await world.pdf({ diagnostics: "full" });
17
+ if (!pdfResult.result?.length) {
18
+ const message = pdfResult.diagnostics?.map((d) => "message" in d ? d.message : String(d)).join("\n") ?? "Typst compiler returned empty PDF bytes";
19
+ throw new Error(message);
20
+ }
21
+ return pdfResult.result;
22
+ });
23
+ }
24
+ self.onmessage = (event) => {
25
+ const request = event.data;
26
+ if (request.type !== "compile-pdf") {
27
+ return;
28
+ }
29
+ void (async () => {
30
+ try {
31
+ const pdf = await compilePdfInWorker(request);
32
+ const response = {
33
+ type: "compile-pdf-result",
34
+ id: request.id,
35
+ pdf
36
+ };
37
+ self.postMessage(response, { transfer: [pdf.buffer] });
38
+ } catch (error) {
39
+ const response = {
40
+ type: "compile-pdf-error",
41
+ id: request.id,
42
+ message: error instanceof Error ? error.message : String(error)
43
+ };
44
+ self.postMessage(response);
45
+ }
46
+ })();
47
+ };
48
+ export {
49
+ MAIN_TYP_PATH
50
+ };
51
+ //# sourceMappingURL=pdf_worker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/renderer/worker/pdf_worker.ts"],"sourcesContent":["import type { RenderCVModel } from '../../schema/models/rendercv_model';\n/**\n * PDF Web Worker — runs Typst WASM compile off the main thread.\n */\nimport { MAIN_TYP_PATH, TYPST_ROOT, prepareTypstCompilation } from '../typst_setup';\n\nexport type PdfWorkerRequest = {\n type: 'compile-pdf';\n id: number;\n typstSource: string;\n model: RenderCVModel;\n photoName: string | null;\n photoBytes: Uint8Array | null;\n};\n\nexport type PdfWorkerResponse =\n | { type: 'compile-pdf-result'; id: number; pdf: Uint8Array }\n | { type: 'compile-pdf-error'; id: number; message: string };\n\nasync function compilePdfInWorker(request: PdfWorkerRequest): Promise<Uint8Array> {\n const { compiler, mainFilePath } = await prepareTypstCompilation(request.typstSource, {\n photoName: request.photoName,\n photoBytes: request.photoBytes,\n model: request.model,\n });\n\n return compiler.runWithWorld({ mainFilePath, root: TYPST_ROOT }, async (world) => {\n const pdfResult = await world.pdf({ diagnostics: 'full' });\n if (!pdfResult.result?.length) {\n const message =\n pdfResult.diagnostics?.map((d) => ('message' in d ? d.message : String(d))).join('\\n') ??\n 'Typst compiler returned empty PDF bytes';\n throw new Error(message);\n }\n return pdfResult.result;\n });\n}\n\nself.onmessage = (event: MessageEvent<PdfWorkerRequest>) => {\n const request = event.data;\n if (request.type !== 'compile-pdf') {\n return;\n }\n void (async () => {\n try {\n const pdf = await compilePdfInWorker(request);\n const response: PdfWorkerResponse = {\n type: 'compile-pdf-result',\n id: request.id,\n pdf,\n };\n self.postMessage(response, { transfer: [pdf.buffer] });\n } catch (error) {\n const response: PdfWorkerResponse = {\n type: 'compile-pdf-error',\n id: request.id,\n message: error instanceof Error ? error.message : String(error),\n };\n self.postMessage(response);\n }\n })();\n};\n\nexport { MAIN_TYP_PATH };\n"],"mappings":";;;;;;;;AAmBA,eAAe,mBAAmB,SAAgD;AAChF,QAAM,EAAE,UAAU,aAAa,IAAI,MAAM,wBAAwB,QAAQ,aAAa;AAAA,IACpF,WAAW,QAAQ;AAAA,IACnB,YAAY,QAAQ;AAAA,IACpB,OAAO,QAAQ;AAAA,EACjB,CAAC;AAED,SAAO,SAAS,aAAa,EAAE,cAAc,MAAM,WAAW,GAAG,OAAO,UAAU;AAChF,UAAM,YAAY,MAAM,MAAM,IAAI,EAAE,aAAa,OAAO,CAAC;AACzD,QAAI,CAAC,UAAU,QAAQ,QAAQ;AAC7B,YAAM,UACJ,UAAU,aAAa,IAAI,CAAC,MAAO,aAAa,IAAI,EAAE,UAAU,OAAO,CAAC,CAAE,EAAE,KAAK,IAAI,KACrF;AACF,YAAM,IAAI,MAAM,OAAO;AAAA,IACzB;AACA,WAAO,UAAU;AAAA,EACnB,CAAC;AACH;AAEA,KAAK,YAAY,CAAC,UAA0C;AAC1D,QAAM,UAAU,MAAM;AACtB,MAAI,QAAQ,SAAS,eAAe;AAClC;AAAA,EACF;AACA,QAAM,YAAY;AAChB,QAAI;AACF,YAAM,MAAM,MAAM,mBAAmB,OAAO;AAC5C,YAAM,WAA8B;AAAA,QAClC,MAAM;AAAA,QACN,IAAI,QAAQ;AAAA,QACZ;AAAA,MACF;AACA,WAAK,YAAY,UAAU,EAAE,UAAU,CAAC,IAAI,MAAM,EAAE,CAAC;AAAA,IACvD,SAAS,OAAO;AACd,YAAM,WAA8B;AAAA,QAClC,MAAM;AAAA,QACN,IAAI,QAAQ;AAAA,QACZ,SAAS,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,MAChE;AACA,WAAK,YAAY,QAAQ;AAAA,IAC3B;AAAA,EACF,GAAG;AACL;","names":[]}
@@ -0,0 +1,60 @@
1
+ import "./chunk-EVM6BVMO.js";
2
+
3
+ // src/renderer/fonts/typst_font_cache.ts
4
+ import { createHash } from "crypto";
5
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from "fs";
6
+ import path from "path";
7
+ var CACHE_VERSION = "v1";
8
+ var cacheDir;
9
+ function isNodeRuntime() {
10
+ return typeof process !== "undefined" && Boolean(process.versions?.node);
11
+ }
12
+ function getCacheDir() {
13
+ if (cacheDir !== void 0) {
14
+ return cacheDir;
15
+ }
16
+ if (!isNodeRuntime()) {
17
+ cacheDir = null;
18
+ return null;
19
+ }
20
+ const dir = path.join(process.cwd(), ".rendercv-cache", "typst-fonts", CACHE_VERSION);
21
+ try {
22
+ mkdirSync(dir, { recursive: true });
23
+ cacheDir = dir;
24
+ return dir;
25
+ } catch {
26
+ cacheDir = null;
27
+ return null;
28
+ }
29
+ }
30
+ function cacheFilePath(url) {
31
+ const dir = getCacheDir();
32
+ if (!dir) {
33
+ return null;
34
+ }
35
+ const hash = createHash("sha256").update(url).digest("hex").slice(0, 16);
36
+ const base = path.basename(url);
37
+ return path.join(dir, `${hash}-${base}`);
38
+ }
39
+ async function fetchTypstFontBytes(url) {
40
+ const cachedPath = cacheFilePath(url);
41
+ if (cachedPath && existsSync(cachedPath)) {
42
+ return new Uint8Array(readFileSync(cachedPath));
43
+ }
44
+ const response = await fetch(url);
45
+ if (!response.ok) {
46
+ throw new Error(`Font file fetch failed (${response.status}): ${url}`);
47
+ }
48
+ const bytes = new Uint8Array(await response.arrayBuffer());
49
+ if (cachedPath) {
50
+ try {
51
+ writeFileSync(cachedPath, bytes);
52
+ } catch {
53
+ }
54
+ }
55
+ return bytes;
56
+ }
57
+ export {
58
+ fetchTypstFontBytes
59
+ };
60
+ //# sourceMappingURL=typst_font_cache-LYHXH5UA.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/renderer/fonts/typst_font_cache.ts"],"sourcesContent":["/**\n * Disk cache for Typst base fonts in Node (avoids re-downloading on every CLI run).\n */\nimport { createHash } from 'node:crypto';\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';\nimport path from 'node:path';\n\nconst CACHE_VERSION = 'v1';\nlet cacheDir: string | null | undefined;\n\nfunction isNodeRuntime(): boolean {\n return typeof process !== 'undefined' && Boolean(process.versions?.node);\n}\n\nfunction getCacheDir(): string | null {\n if (cacheDir !== undefined) {\n return cacheDir;\n }\n if (!isNodeRuntime()) {\n cacheDir = null;\n return null;\n }\n const dir = path.join(process.cwd(), '.rendercv-cache', 'typst-fonts', CACHE_VERSION);\n try {\n mkdirSync(dir, { recursive: true });\n cacheDir = dir;\n return dir;\n } catch {\n cacheDir = null;\n return null;\n }\n}\n\nfunction cacheFilePath(url: string): string | null {\n const dir = getCacheDir();\n if (!dir) {\n return null;\n }\n const hash = createHash('sha256').update(url).digest('hex').slice(0, 16);\n const base = path.basename(url);\n return path.join(dir, `${hash}-${base}`);\n}\n\nexport async function fetchTypstFontBytes(url: string): Promise<Uint8Array> {\n const cachedPath = cacheFilePath(url);\n if (cachedPath && existsSync(cachedPath)) {\n return new Uint8Array(readFileSync(cachedPath));\n }\n\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`Font file fetch failed (${response.status}): ${url}`);\n }\n const bytes = new Uint8Array(await response.arrayBuffer());\n\n if (cachedPath) {\n try {\n writeFileSync(cachedPath, bytes);\n } catch {\n // ignore cache write failures\n }\n }\n\n return bytes;\n}\n"],"mappings":";;;AAGA,SAAS,kBAAkB;AAC3B,SAAS,YAAY,WAAW,cAAc,qBAAqB;AACnE,OAAO,UAAU;AAEjB,IAAM,gBAAgB;AACtB,IAAI;AAEJ,SAAS,gBAAyB;AAChC,SAAO,OAAO,YAAY,eAAe,QAAQ,QAAQ,UAAU,IAAI;AACzE;AAEA,SAAS,cAA6B;AACpC,MAAI,aAAa,QAAW;AAC1B,WAAO;AAAA,EACT;AACA,MAAI,CAAC,cAAc,GAAG;AACpB,eAAW;AACX,WAAO;AAAA,EACT;AACA,QAAM,MAAM,KAAK,KAAK,QAAQ,IAAI,GAAG,mBAAmB,eAAe,aAAa;AACpF,MAAI;AACF,cAAU,KAAK,EAAE,WAAW,KAAK,CAAC;AAClC,eAAW;AACX,WAAO;AAAA,EACT,QAAQ;AACN,eAAW;AACX,WAAO;AAAA,EACT;AACF;AAEA,SAAS,cAAc,KAA4B;AACjD,QAAM,MAAM,YAAY;AACxB,MAAI,CAAC,KAAK;AACR,WAAO;AAAA,EACT;AACA,QAAM,OAAO,WAAW,QAAQ,EAAE,OAAO,GAAG,EAAE,OAAO,KAAK,EAAE,MAAM,GAAG,EAAE;AACvE,QAAM,OAAO,KAAK,SAAS,GAAG;AAC9B,SAAO,KAAK,KAAK,KAAK,GAAG,IAAI,IAAI,IAAI,EAAE;AACzC;AAEA,eAAsB,oBAAoB,KAAkC;AAC1E,QAAM,aAAa,cAAc,GAAG;AACpC,MAAI,cAAc,WAAW,UAAU,GAAG;AACxC,WAAO,IAAI,WAAW,aAAa,UAAU,CAAC;AAAA,EAChD;AAEA,QAAM,WAAW,MAAM,MAAM,GAAG;AAChC,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,IAAI,MAAM,2BAA2B,SAAS,MAAM,MAAM,GAAG,EAAE;AAAA,EACvE;AACA,QAAM,QAAQ,IAAI,WAAW,MAAM,SAAS,YAAY,CAAC;AAEzD,MAAI,YAAY;AACd,QAAI;AACF,oBAAc,YAAY,KAAK;AAAA,IACjC,QAAQ;AAAA,IAER;AAAA,EACF;AAEA,SAAO;AACT;","names":[]}
@@ -0,0 +1,30 @@
1
+ import {
2
+ MAIN_TYP_PATH,
3
+ RENDERCV_PACKAGE_VERSION,
4
+ TYPST_ROOT,
5
+ clearFontCache,
6
+ configureBrowserWasm,
7
+ decodeAssetBytes,
8
+ ensureFontsForModel,
9
+ getTypstRuntime,
10
+ isWasmUrlConfigured,
11
+ preloadTypst,
12
+ prepareTypstCompilation,
13
+ setBrowserWasmBytes
14
+ } from "./chunk-VZSMPOAA.js";
15
+ import "./chunk-EVM6BVMO.js";
16
+ export {
17
+ MAIN_TYP_PATH,
18
+ RENDERCV_PACKAGE_VERSION,
19
+ TYPST_ROOT,
20
+ clearFontCache,
21
+ configureBrowserWasm,
22
+ decodeAssetBytes,
23
+ ensureFontsForModel,
24
+ getTypstRuntime,
25
+ isWasmUrlConfigured,
26
+ preloadTypst,
27
+ prepareTypstCompilation,
28
+ setBrowserWasmBytes
29
+ };
30
+ //# sourceMappingURL=typst_setup-SW3GQFSL.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}