excalidraw-edit 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 (303) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +57 -0
  3. package/package.json +57 -0
  4. package/src/cli.js +46 -0
  5. package/src/client/App.jsx +45 -0
  6. package/src/client/main.jsx +24 -0
  7. package/src/const.js +28 -0
  8. package/src/filesystem.js +23 -0
  9. package/src/public/assets/excalidraw-bundle.js +3103 -0
  10. package/src/public/assets/excalidraw.css +1 -0
  11. package/src/public/assets/fonts/Assistant/Assistant-Bold.woff2 +0 -0
  12. package/src/public/assets/fonts/Assistant/Assistant-Medium.woff2 +0 -0
  13. package/src/public/assets/fonts/Assistant/Assistant-Regular.woff2 +0 -0
  14. package/src/public/assets/fonts/Assistant/Assistant-SemiBold.woff2 +0 -0
  15. package/src/public/assets/fonts/Cascadia/CascadiaCode-Regular.woff2 +0 -0
  16. package/src/public/assets/fonts/ComicShanns/ComicShanns-Regular-279a7b317d12eb88de06167bd672b4b4.woff2 +0 -0
  17. package/src/public/assets/fonts/ComicShanns/ComicShanns-Regular-6e066e8de2ac57ea9283adb9c24d7f0c.woff2 +0 -0
  18. package/src/public/assets/fonts/ComicShanns/ComicShanns-Regular-dc6a8806fa96795d7b3be5026f989a17.woff2 +0 -0
  19. package/src/public/assets/fonts/ComicShanns/ComicShanns-Regular-fcb0fc02dcbee4c9846b3e2508668039.woff2 +0 -0
  20. package/src/public/assets/fonts/Excalifont/Excalifont-Regular-349fac6ca4700ffec595a7150a0d1e1d.woff2 +0 -0
  21. package/src/public/assets/fonts/Excalifont/Excalifont-Regular-3f2c5db56cc93c5a6873b1361d730c16.woff2 +0 -0
  22. package/src/public/assets/fonts/Excalifont/Excalifont-Regular-41b173a47b57366892116a575a43e2b6.woff2 +0 -0
  23. package/src/public/assets/fonts/Excalifont/Excalifont-Regular-623ccf21b21ef6b3a0d87738f77eb071.woff2 +0 -0
  24. package/src/public/assets/fonts/Excalifont/Excalifont-Regular-a88b72a24fb54c9f94e3b5fdaa7481c9.woff2 +0 -0
  25. package/src/public/assets/fonts/Excalifont/Excalifont-Regular-b9dcf9d2e50a1eaf42fc664b50a3fd0d.woff2 +0 -0
  26. package/src/public/assets/fonts/Excalifont/Excalifont-Regular-be310b9bcd4f1a43f571c46df7809174.woff2 +0 -0
  27. package/src/public/assets/fonts/Liberation/LiberationSans-Regular.woff2 +0 -0
  28. package/src/public/assets/fonts/Lilita/Lilita-Regular-i7dPIFZ9Zz-WBtRtedDbYE98RXi4EwSsbg.woff2 +0 -0
  29. package/src/public/assets/fonts/Lilita/Lilita-Regular-i7dPIFZ9Zz-WBtRtedDbYEF8RXi4EwQ.woff2 +0 -0
  30. package/src/public/assets/fonts/Nunito/Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTA3j6zbXWjgevT5.woff2 +0 -0
  31. package/src/public/assets/fonts/Nunito/Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTQ3j6zbXWjgeg.woff2 +0 -0
  32. package/src/public/assets/fonts/Nunito/Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTk3j6zbXWjgevT5.woff2 +0 -0
  33. package/src/public/assets/fonts/Nunito/Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTo3j6zbXWjgevT5.woff2 +0 -0
  34. package/src/public/assets/fonts/Nunito/Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTs3j6zbXWjgevT5.woff2 +0 -0
  35. package/src/public/assets/fonts/Virgil/Virgil-Regular.woff2 +0 -0
  36. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-019d66dcad46dc156b162d267f981c20.woff2 +0 -0
  37. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-04b718e5623574919c8b0dea5f301444.woff2 +0 -0
  38. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-069e77aac84590e2e991d0a0176d34f2.woff2 +0 -0
  39. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-06c77b8c66e51ed6c63ccb502dd8b8af.woff2 +0 -0
  40. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-08e0dc436ad0ad61ba5558db0674d762.woff2 +0 -0
  41. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-093b9ef39a46ceae95a1df18a0a3a326.woff2 +0 -0
  42. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-095c169f3314805276f603a362766abd.woff2 +0 -0
  43. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-09850c4077f3fffe707905872e0e2460.woff2 +0 -0
  44. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-0986d134c05864f5025962eef9f994a0.woff2 +0 -0
  45. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-0b5d723fdc4e249c140f0909e87d03b4.woff2 +0 -0
  46. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-0f626226ba1272e832aea87bafd9720e.woff2 +0 -0
  47. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-0f7fb1e0d5015bb1371343153ecf7ce3.woff2 +0 -0
  48. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-0fa55a080fcd0f9dc2e0b0058b793df8.woff2 +0 -0
  49. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-0facdf1ea213ba40261022f5d5ed4493.woff2 +0 -0
  50. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-10a7ae9a371830a80c3d844acf1c02d7.woff2 +0 -0
  51. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-112c051027b2d766c19a519f6ee1f4f7.woff2 +0 -0
  52. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-11c345711937f0ba4b8f7b6b919c8440.woff2 +0 -0
  53. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-12b52b58eb3df36804b9a654ec9ee194.woff2 +0 -0
  54. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-13ae07ed2e272d26d59bc0691cd7117a.woff2 +0 -0
  55. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-13d2887ec8ee73c43acdabc52a05af7b.woff2 +0 -0
  56. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-145aa02cdd91946e67dc934e1acffe75.woff2 +0 -0
  57. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-15dc6d811c9cd078f9086a740d5a1038.woff2 +0 -0
  58. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-173945821411c09f70c95f98d590e697.woff2 +0 -0
  59. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-1b611157cd46bb184d4fa4dae2d6a2b8.woff2 +0 -0
  60. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-1e6fd68f1f3902ce48ce8c69df385622.woff2 +0 -0
  61. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-1ee544f0f1dac422545c505baa788992.woff2 +0 -0
  62. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-1fdc0c67ed57263a80fd108c1f6ccf24.woff2 +0 -0
  63. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-203b0e569e3b14aac86a003dc3fa523e.woff2 +0 -0
  64. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-20cc1bbf50e7efb442756cb605672c1f.woff2 +0 -0
  65. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-20e7bf72fa05de9adf7dbcc7bf51dde6.woff2 +0 -0
  66. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-21430ee05a1248901da8d0de08744d47.woff2 +0 -0
  67. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-23686f7f29da6e8008c36dd3a80c83d6.woff2 +0 -0
  68. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-23ad2d71b280f00b1363b95b7bea94eb.woff2 +0 -0
  69. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-23f228f3999c01983860012330e4be08.woff2 +0 -0
  70. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-24476a126f129212beb33f66853ea151.woff2 +0 -0
  71. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-24a21c1e4449222e8d1898d69ff3a404.woff2 +0 -0
  72. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-25b7f38e18f035f96cb5e547bd2bd08c.woff2 +0 -0
  73. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-29cec36cd205b211da97acabaa62f055.woff2 +0 -0
  74. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-2a26d20a23b00898ce82f09d2ee47c3f.woff2 +0 -0
  75. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-2adbc89c11e65905393d3dfc468b9d5b.woff2 +0 -0
  76. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-2b7441d46298788ac94e610ffcc709b6.woff2 +0 -0
  77. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-2b77e8ebfb2367ab2662396a60e7d320.woff2 +0 -0
  78. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-2cf96d082d35ea3d8106851223ad0d16.woff2 +0 -0
  79. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-2d43040e86ff03ba677f6f9c04cd0805.woff2 +0 -0
  80. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-2e33e8dc771ef5e1d9127d60a6b73679.woff2 +0 -0
  81. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-33432927cd87d40cfe393c7482bf221f.woff2 +0 -0
  82. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-353f33792a8f60dc69323ddf635a269e.woff2 +0 -0
  83. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-36925dfe329a45086cbb7fc5c20d45ac.woff2 +0 -0
  84. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-3717077e38f98d89eae729b6c14e56dc.woff2 +0 -0
  85. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-3756e81d3e149cf6099163ee79944fec.woff2 +0 -0
  86. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-395c35dd584b56b0789f58a0559beaf1.woff2 +0 -0
  87. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-3c9de2ae0ea4bc91a510942dfa4be8d2.woff2 +0 -0
  88. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-3cc70dbb64df5b21f1326cc24dee2195.woff2 +0 -0
  89. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-3e1f8f654357353bf0e04ba5c34b5f7f.woff2 +0 -0
  90. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-3e63ed8162808a9e425ed80a8bc79114.woff2 +0 -0
  91. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-3eaa538115d76932653c21d8dc28f207.woff2 +0 -0
  92. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-4095eb84ef3874e2600247bee0b04026.woff2 +0 -0
  93. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-41521fade99856108931b4768b1b2648.woff2 +0 -0
  94. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-450da755d5bcb70906e1295e559b9602.woff2 +0 -0
  95. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-452225341522a7942f0f6aab1a5c91a3.woff2 +0 -0
  96. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-4535823663ad81405188a528d8f2b1a2.woff2 +0 -0
  97. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-4806e761d750087c2d734fc64596eaff.woff2 +0 -0
  98. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-4a0fdb40036e87b40aa08dd30584cb85.woff2 +0 -0
  99. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-4a38cc3e9cf104e69ba246d37f8cf135.woff2 +0 -0
  100. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-4aca6a43e59aceee2166b0c7e4e85ef1.woff2 +0 -0
  101. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-4bfaa8ffa64c5ee560aa2daba7c9cbd3.woff2 +0 -0
  102. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-4dc6d5f188d5c96d44815cd1e81aa885.woff2 +0 -0
  103. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-4ddc14ed3eb0c3e46364317dfc0144a3.woff2 +0 -0
  104. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-4ee10ae43505e2e0bc62656ced49c0fa.woff2 +0 -0
  105. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-4f50e5136e136527280bc902c5817561.woff2 +0 -0
  106. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-51502f1206be09c565f1547c406e9558.woff2 +0 -0
  107. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-51a0e808bbc8361236ac521a119758a3.woff2 +0 -0
  108. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-52a84a22fd1369bffeaf21da2d6158dc.woff2 +0 -0
  109. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-5330a2119a716e4e7224ed108b085dac.woff2 +0 -0
  110. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-543fa46ace099a7099dad69123399400.woff2 +0 -0
  111. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-544fc28abe2c5c30e62383fd4dac255f.woff2 +0 -0
  112. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-54acdfc2166ad7fcbd074f75fd4a56ba.woff2 +0 -0
  113. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-5572b3513ba8df57a3d5d7303ee6b11b.woff2 +0 -0
  114. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-56467a5c8840c4d23a60b2f935114848.woff2 +0 -0
  115. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-56a32a7689abd0326e57c10c6c069bb4.woff2 +0 -0
  116. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-57862b464a55b18c7bf234ce22907d73.woff2 +0 -0
  117. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-583d166e56ba0de4b77eabb47ef67839.woff2 +0 -0
  118. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-5882ffa04f32584d26109137e2da4352.woff2 +0 -0
  119. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-58fd02350d0bc52cf1ca3bb32ce9766e.woff2 +0 -0
  120. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-5935a5775af3d5c6307ac667bd9ae74e.woff2 +0 -0
  121. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-59e9ff77b0efaf684bc09274fb6908c9.woff2 +0 -0
  122. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-5a1ce3117cfe90c48e8fb4a9a00f694d.woff2 +0 -0
  123. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-5a45d991244d4c7140217e1e5f5ca4f4.woff2 +0 -0
  124. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-5a7fac4b8b23a6e4e5ba0c9bf1756c91.woff2 +0 -0
  125. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-5b0ed6971aaab9c8ad563230bd5471a7.woff2 +0 -0
  126. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-5d2898fbc097a7e24c6f38d80587621e.woff2 +0 -0
  127. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-603aefd23e350ba7eb124273e3c9bcf1.woff2 +0 -0
  128. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-60a3089806700d379f11827ee9843b6b.woff2 +0 -0
  129. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-60a41c7e1c68f22424e6d22df544bc82.woff2 +0 -0
  130. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-642b26e2e5f5fb780b51b593dbc8c851.woff2 +0 -0
  131. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-66493ba5a8367f2928812f446f47b56a.woff2 +0 -0
  132. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-670ba603758d94268e8606f240a42e12.woff2 +0 -0
  133. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-671a2c20b1eb9e4ef8a192833940e319.woff2 +0 -0
  134. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-684d65f1793cac449dde5d59cb3c47fb.woff2 +0 -0
  135. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-69c09cc5fa3e55c74fc4821f76909cc3.woff2 +0 -0
  136. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-6ae5b42180ad70b971c91e7eefb8eba2.woff2 +0 -0
  137. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-6e092f71c1e634059ada0e52abadce67.woff2 +0 -0
  138. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-6f3256af8454371776bc46670d33cc65.woff2 +0 -0
  139. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-6fe5c5973cc06f74b2387a631ea36b88.woff2 +0 -0
  140. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-70c2eb8d64e71a42a834eb857ea9df51.woff2 +0 -0
  141. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-70e811fd7994e61f408c923de6ddd078.woff2 +0 -0
  142. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-7197d6fda6cba7c3874c53d6381ca239.woff2 +0 -0
  143. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-72252d73220fa3cd856677888cee1635.woff2 +0 -0
  144. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-72536a3d71b694a0d53dd90ddceae41e.woff2 +0 -0
  145. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-726303e0774b4e678bff8c2deb6ca603.woff2 +0 -0
  146. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-733171b4ffcd17ea1fe1c0ba627173bf.woff2 +0 -0
  147. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-739bc1a567439c7cffcd1614644593d2.woff2 +0 -0
  148. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-73e309718fd16cea44b4d54a33581811.woff2 +0 -0
  149. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-7494dc504ae00ee9cd0505f990f88c5d.woff2 +0 -0
  150. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-74e2263a91439c25b91d5132ce9f4d62.woff2 +0 -0
  151. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-761d05e3cd968cf574166867998ef06a.woff2 +0 -0
  152. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-7718fe60986d8b42b1be9c5ace5ccf25.woff2 +0 -0
  153. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-774d4f764a1299da5d28ec2f2ffe0d69.woff2 +0 -0
  154. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-79d494361ae093b69e74ee9dbe65bfd4.woff2 +0 -0
  155. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-79f007c1c6d07557120982951ea67998.woff2 +0 -0
  156. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-7a07ddc0f0c0f5f4a9bad6ee3dda66b5.woff2 +0 -0
  157. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-7ab2bed91166a9dca83a5ebfbe2a7f38.woff2 +0 -0
  158. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-7ccce86603f80a099ddb0cb21d4ae3e3.woff2 +0 -0
  159. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-7e4bde7e9c7f84cd34d8a845e384c746.woff2 +0 -0
  160. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-7e929f262f30c8ee78bf398150b1a7cd.woff2 +0 -0
  161. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-7eb9fffd1aa890d07d0f88cc82e6cfe4.woff2 +0 -0
  162. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-7f855356ab893b0d2b9c1c83b8116f0e.woff2 +0 -0
  163. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-829615148e6357d826b9242eb7fbbd1e.woff2 +0 -0
  164. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-866fa7613df6b3fd272bcfd4530c0bb9.woff2 +0 -0
  165. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-87599f94b6cc129d505b375798d0d751.woff2 +0 -0
  166. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-8c2f33cee3993174f7e87c28e4bf42ee.woff2 +0 -0
  167. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-8d3bcabb847b56243b16afe62adaaf21.woff2 +0 -0
  168. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-8de5b863cb50dfefdd07cb11c774d579.woff2 +0 -0
  169. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-8e9f97f01034820170065b2921b4fb5e.woff2 +0 -0
  170. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-8f476c4c99813d57cbe6eca4727388ad.woff2 +0 -0
  171. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-903bb6865f3452e2fda42e3a25547bc5.woff2 +0 -0
  172. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-91ddb2969bf2d31ba02ad82998d1314c.woff2 +0 -0
  173. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-938d90c10ff8c20386af7f242c05d6b0.woff2 +0 -0
  174. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-93fc8f28a33234bcadf1527cafabd502.woff2 +0 -0
  175. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-95429962233afd82db1c27df1500a28c.woff2 +0 -0
  176. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-9544732d2e62d1a429674f8ee41b5d3a.woff2 +0 -0
  177. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-9592bfc861f07bcb8d75c196b370e548.woff2 +0 -0
  178. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-95bfd249da4902577b4b7d76ebdd0b44.woff2 +0 -0
  179. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-968cffdc8ee679da094e77ebf50f58ef.woff2 +0 -0
  180. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-97f7f48ce90c9429bf32ae51469db74d.woff2 +0 -0
  181. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-982b630266d87db93d2539affb1275c6.woff2 +0 -0
  182. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-98f2ad84457de7f3740d9920b8fa8667.woff2 +0 -0
  183. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-99a16ef6a64934d5781933dbd9c46b2e.woff2 +0 -0
  184. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-9cfb2a77a4e45025105ad29a1748b90d.woff2 +0 -0
  185. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-9d81066dd2b337c938df6e90380a00dc.woff2 +0 -0
  186. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-9eb5a99df4e76ac3363453ac9ca288b1.woff2 +0 -0
  187. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-a004ddfcb26e67bd6e678c8ed19e25ce.woff2 +0 -0
  188. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-a0ca5df4258213d7fc9fce80f65ce760.woff2 +0 -0
  189. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-a1f916d6039285c4ffb900cd654e418f.woff2 +0 -0
  190. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-a203b91dad570bf05a58c3c3ddb529bf.woff2 +0 -0
  191. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-a365e82ed54697a52f27adcea1315fe8.woff2 +0 -0
  192. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-a4c34be6d42152e64b0df90bc4607f64.woff2 +0 -0
  193. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-a7accba310e821da5505f71c03b76bdb.woff2 +0 -0
  194. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-aa0d470430e6391eca720c7cfa44446f.woff2 +0 -0
  195. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-aa5c9ca6cf4fba00433b7aa3fa10671a.woff2 +0 -0
  196. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-ac9ceb44437becc3e9c4dbfebab7fc2d.woff2 +0 -0
  197. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-b1220a3c61f85cc0408deedb4c5f57a2.woff2 +0 -0
  198. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-b358f7a51ece39a3247942b1feabdb29.woff2 +0 -0
  199. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-b57aaedfd8ebdf3931f25119dc6a5eb2.woff2 +0 -0
  200. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-b5c1596551c256e0e9cf02028595b092.woff2 +0 -0
  201. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-b6d128682ee29e471486354d486a1b90.woff2 +0 -0
  202. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-b6fd38ca30869792244804b04bc058da.woff2 +0 -0
  203. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-b7d203b051eff504ff59ddca7576b6a9.woff2 +0 -0
  204. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-b96d9226ce77ec94ceca043d712182e6.woff2 +0 -0
  205. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-ba3de316d63c7e339987b16f41a0b879.woff2 +0 -0
  206. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-bafff7a14c27403dcc6cf1432e8ea836.woff2 +0 -0
  207. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-bd77e3c7f9e0b072d96af37f73d1aa32.woff2 +0 -0
  208. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-be549ab72f0719d606a5c01e2c0219b6.woff2 +0 -0
  209. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-c16ed9740b85badf16e86ea782a3062f.woff2 +0 -0
  210. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-c1f94158256bb1f3bf665b053d895af9.woff2 +0 -0
  211. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-c40533fdf4cc57177b12803598af7e59.woff2 +0 -0
  212. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-c4a687ac4f0c2766eefc9f77ed99cddf.woff2 +0 -0
  213. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-c69f61a4ab18d0488c8d1fc12e7028e8.woff2 +0 -0
  214. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-c8b71798409ccc126ee264a00aadcf21.woff2 +0 -0
  215. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-c99eda15fc26a2941579560f76c3a5cf.woff2 +0 -0
  216. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-cb17fc3db95f6d139afc9d31a8e93293.woff2 +0 -0
  217. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-cbaaefaaf326668277aa24dfa93c4d28.woff2 +0 -0
  218. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-cd145ce4a0ea18469358df53c207bc1b.woff2 +0 -0
  219. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-cdbce89e82cc1ab53a2decbf5819278f.woff2 +0 -0
  220. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-ce4884f96f11589608b76b726a755803.woff2 +0 -0
  221. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-cf2cc71752631e579e35b0e423bf2638.woff2 +0 -0
  222. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-cf6ff4e0f491ca0cf3038187a997b9b4.woff2 +0 -0
  223. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-cfb211578629b7e8153b37240de6a9d5.woff2 +0 -0
  224. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-d0cf73942fea1c74edbdf0b3011f4656.woff2 +0 -0
  225. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-d2666cbed13462c5dc36fa2f15c202ca.woff2 +0 -0
  226. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-d3716376641d615e2995605b29bca7b6.woff2 +0 -0
  227. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-dac48066b5883d8b4551fc584f0c2a3e.woff2 +0 -0
  228. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-dbea1af6dcd9860be40c3d18254338f5.woff2 +0 -0
  229. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-e11567fd2accf9957cd0d3c2be937d87.woff2 +0 -0
  230. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-e2ead7ea7da0437f085f42ffc05f8d13.woff2 +0 -0
  231. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-e3fcf5180fd466c8915c4e8069491054.woff2 +0 -0
  232. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-e480d9c614742d05f0e78f274f1e69e6.woff2 +0 -0
  233. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-e4bca6cfa53e499cae0a6be4894a90e9.woff2 +0 -0
  234. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-e51ef413167c6e14e0c0fdcc585f2fc9.woff2 +0 -0
  235. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-e5f453bb04da18eed01675eeebd88bf8.woff2 +0 -0
  236. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-e656f091b9dc4709722c9f4b84d3c797.woff2 +0 -0
  237. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-ec181b795ac1fb5a50d700b6e996d745.woff2 +0 -0
  238. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-ee8bae97908d5147b423f77ad0d3c1bb.woff2 +0 -0
  239. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-f0f13b5c60e0af5553bd359f5513be1b.woff2 +0 -0
  240. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-f2b54d4e7be0eaefe1c2c56836fa5368.woff2 +0 -0
  241. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-f56414bf9bced67990def8660e306759.woff2 +0 -0
  242. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-f5d079153c99a25b9be5b8583c4cc8a7.woff2 +0 -0
  243. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-f6032fc06eb20480f096199713f70885.woff2 +0 -0
  244. package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-f8ee5d36068a42b51d0e4a1116cfcec1.woff2 +0 -0
  245. package/src/public/assets/locales/ar-SA-G6X2FPQ2.js +10 -0
  246. package/src/public/assets/locales/az-AZ-76LH7QW2.js +1 -0
  247. package/src/public/assets/locales/bg-BG-XCXSNQG7.js +5 -0
  248. package/src/public/assets/locales/bn-BD-2XOGV67Q.js +5 -0
  249. package/src/public/assets/locales/ca-ES-6MX7JW3Y.js +8 -0
  250. package/src/public/assets/locales/cs-CZ-2BRQDIVT.js +11 -0
  251. package/src/public/assets/locales/da-DK-5WZEPLOC.js +5 -0
  252. package/src/public/assets/locales/de-DE-XR44H4JA.js +8 -0
  253. package/src/public/assets/locales/el-GR-BZB4AONW.js +10 -0
  254. package/src/public/assets/locales/en-B4ZKOASM.js +1 -0
  255. package/src/public/assets/locales/es-ES-U4NZUMDT.js +9 -0
  256. package/src/public/assets/locales/eu-ES-A7QVB2H4.js +11 -0
  257. package/src/public/assets/locales/fa-IR-HGAKTJCU.js +8 -0
  258. package/src/public/assets/locales/fi-FI-Z5N7JZ37.js +6 -0
  259. package/src/public/assets/locales/fr-FR-RHASNOE6.js +9 -0
  260. package/src/public/assets/locales/gl-ES-HMX3MZ6V.js +10 -0
  261. package/src/public/assets/locales/he-IL-6SHJWFNN.js +10 -0
  262. package/src/public/assets/locales/hi-IN-IWLTKZ5I.js +4 -0
  263. package/src/public/assets/locales/hu-HU-A5ZG7DT2.js +7 -0
  264. package/src/public/assets/locales/id-ID-SAP4L64H.js +10 -0
  265. package/src/public/assets/locales/it-IT-JPQ66NNP.js +11 -0
  266. package/src/public/assets/locales/ja-JP-DBVTYXUO.js +8 -0
  267. package/src/public/assets/locales/kaa-6HZHGXH3.js +1 -0
  268. package/src/public/assets/locales/kab-KAB-ZGHBKWFO.js +8 -0
  269. package/src/public/assets/locales/kk-KZ-P5N5QNE5.js +1 -0
  270. package/src/public/assets/locales/km-KH-HSX4SM5Z.js +11 -0
  271. package/src/public/assets/locales/ko-KR-MTYHY66A.js +9 -0
  272. package/src/public/assets/locales/ku-TR-6OUDTVRD.js +9 -0
  273. package/src/public/assets/locales/lt-LT-XHIRWOB4.js +3 -0
  274. package/src/public/assets/locales/lv-LV-5QDEKY6T.js +7 -0
  275. package/src/public/assets/locales/mr-IN-CRQNXWMA.js +13 -0
  276. package/src/public/assets/locales/my-MM-5M5IBNSE.js +1 -0
  277. package/src/public/assets/locales/nb-NO-T6EIAALU.js +10 -0
  278. package/src/public/assets/locales/nl-NL-IS3SIHDZ.js +8 -0
  279. package/src/public/assets/locales/nn-NO-6E72VCQL.js +8 -0
  280. package/src/public/assets/locales/oc-FR-POXYY2M6.js +8 -0
  281. package/src/public/assets/locales/pa-IN-N4M65BXN.js +4 -0
  282. package/src/public/assets/locales/percentages-BXMCSKIN.js +1 -0
  283. package/src/public/assets/locales/pl-PL-T2D74RX3.js +9 -0
  284. package/src/public/assets/locales/pt-BR-5N22H2LF.js +9 -0
  285. package/src/public/assets/locales/pt-PT-UZXXM6DQ.js +9 -0
  286. package/src/public/assets/locales/ro-RO-JPDTUUEW.js +11 -0
  287. package/src/public/assets/locales/ru-RU-B4JR7IUQ.js +9 -0
  288. package/src/public/assets/locales/si-LK-N5RQ5JYF.js +1 -0
  289. package/src/public/assets/locales/sk-SK-C5VTKIMK.js +6 -0
  290. package/src/public/assets/locales/sl-SI-NN7IZMDC.js +6 -0
  291. package/src/public/assets/locales/sv-SE-XGPEYMSR.js +10 -0
  292. package/src/public/assets/locales/ta-IN-2NMHFXQM.js +9 -0
  293. package/src/public/assets/locales/th-TH-HPSO5L25.js +2 -0
  294. package/src/public/assets/locales/tr-TR-DEFEU3FU.js +7 -0
  295. package/src/public/assets/locales/uk-UA-QMV73CPH.js +6 -0
  296. package/src/public/assets/locales/vi-VN-M7AON7JQ.js +5 -0
  297. package/src/public/assets/locales/zh-CN-LNUGB5OW.js +10 -0
  298. package/src/public/assets/locales/zh-HK-E62DVLB3.js +1 -0
  299. package/src/public/assets/locales/zh-TW-RAJ6MFWO.js +9 -0
  300. package/src/public/favicon.ico +0 -0
  301. package/src/public/index.html +31 -0
  302. package/src/routes.js +74 -0
  303. package/src/server.js +34 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 wh1le
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,57 @@
1
+ # excalidraw-edit
2
+
3
+ > Edit any `.excalidraw` file straight from the terminal.
4
+
5
+ [![npm version](https://img.shields.io/npm/v/excalidraw-edit)](https://www.npmjs.com/package/excalidraw-edit)
6
+ [![license](https://img.shields.io/npm/l/excalidraw-edit)](LICENSE)
7
+
8
+ ## About
9
+
10
+ Opens a local server, loads [Excalidraw](https://excalidraw.com) in your browser, auto-saves to disk. Works offline.
11
+
12
+ ## Install
13
+
14
+ ```bash
15
+ npm i -g excalidraw-edit
16
+ ```
17
+
18
+ ## Usage
19
+
20
+ ```bash
21
+ excalidraw-edit drawing.excalidraw
22
+ ```
23
+
24
+ File is created if it doesn't exist. Extension is added automatically if omitted.
25
+
26
+ ```bash
27
+ excalidraw-edit mydiagram # opens mydiagram.excalidraw
28
+ excalidraw-edit --theme dark sketch.excalidraw # dark mode
29
+ excalidraw-edit --port 3000 --no-open notes # custom port, no browser
30
+ ```
31
+
32
+ ### Options
33
+
34
+ | Option | Description | Default |
35
+ | --------------------- | ---------------------------- | -------- |
36
+ | `-p, --port <port>` | Port to listen on | `6417` |
37
+ | `-t, --theme <theme>` | `dark`, `light`, or `system` | `system` |
38
+ | `--no-open` | Don't open browser | |
39
+ | `-V, --version` | Output version | |
40
+ | `-h, --help` | Display help | |
41
+
42
+ ## Development
43
+
44
+ ```bash
45
+ make install # pnpm install && build
46
+ make test # run tests
47
+ make start # start dev server
48
+ ```
49
+
50
+ ## References
51
+
52
+ - [Excalidraw](https://excalidraw.com) — the drawing tool this project wraps
53
+ - [go-grip](https://github.com/chrishrb/go-grip) — inspiration for the CLI approach
54
+
55
+ ## License
56
+
57
+ [MIT](LICENSE)
package/package.json ADDED
@@ -0,0 +1,57 @@
1
+ {
2
+ "name": "excalidraw-edit",
3
+ "version": "0.1.0",
4
+ "type": "module",
5
+ "packageManager": "pnpm@10.33.0",
6
+ "description": "Edit .excalidraw files locally in your browser. Like grip for Excalidraw.",
7
+ "license": "MIT",
8
+ "author": "wh1le (https://github.com/wh1le)",
9
+ "homepage": "https://github.com/wh1le/excalidraw-edit",
10
+ "bugs": "https://github.com/wh1le/excalidraw-edit/issues",
11
+ "bin": {
12
+ "excalidraw-edit": "./src/cli.js"
13
+ },
14
+ "scripts": {
15
+ "build": "node scripts/build.js",
16
+ "prepublishOnly": "pnpm run build",
17
+ "test": "node --test test/*.test.js",
18
+ "fmt": "prettier --write .",
19
+ "fmt:check": "prettier --check .",
20
+ "lint": "eslint .",
21
+ "lint:fix": "eslint --fix ."
22
+ },
23
+ "keywords": [
24
+ "excalidraw",
25
+ "cli",
26
+ "editor",
27
+ "diagram",
28
+ "whiteboard",
29
+ "local",
30
+ "drawing"
31
+ ],
32
+ "files": [
33
+ "src/"
34
+ ],
35
+ "repository": {
36
+ "type": "git",
37
+ "url": "https://github.com/wh1le/excalidraw-edit"
38
+ },
39
+ "engines": {
40
+ "node": ">=18"
41
+ },
42
+ "dependencies": {
43
+ "commander": "^13.0.0",
44
+ "open": "^10.1.0"
45
+ },
46
+ "devDependencies": {
47
+ "@eslint/js": "^9.39.4",
48
+ "@excalidraw/excalidraw": "^0.18.0",
49
+ "esbuild": "^0.28.0",
50
+ "eslint": "^9.39.4",
51
+ "eslint-config-prettier": "^10.1.8",
52
+ "globals": "^17.4.0",
53
+ "prettier": "^3.5.0",
54
+ "react": "^19.0.0",
55
+ "react-dom": "^19.0.0"
56
+ }
57
+ }
package/src/cli.js ADDED
@@ -0,0 +1,46 @@
1
+ #!/usr/bin/env node
2
+
3
+ import { program } from 'commander';
4
+ import { resolve, basename } from 'node:path';
5
+ import { createInterface } from 'node:readline';
6
+ import { VERSION } from './const.js';
7
+ import { addExtension, fileExists, createScene } from './filesystem.js';
8
+ import { startServer } from './server.js';
9
+
10
+ function confirm(question) {
11
+ const rl = createInterface({ input: process.stdin, output: process.stdout });
12
+ return new Promise((resolve) => {
13
+ rl.question(question, (answer) => {
14
+ rl.close();
15
+ resolve(answer.toLowerCase() !== 'n');
16
+ });
17
+ });
18
+ }
19
+
20
+ program
21
+ .name('excalidraw-edit')
22
+ .description('Edit .excalidraw files locally in your browser')
23
+ .version(VERSION)
24
+ .argument('<file>', '.excalidraw file to edit')
25
+ .option('-p, --port <port>', 'port to listen on', '6417')
26
+ .option('--no-open', "don't open browser automatically")
27
+ .option(
28
+ '-t, --theme <theme>',
29
+ 'theme: dark, light, or system (default)',
30
+ 'system'
31
+ )
32
+ .action(async (file, opts) => {
33
+ const filePath = addExtension(resolve(file));
34
+ const port = parseInt(opts.port, 10);
35
+
36
+ if (!(await fileExists(filePath))) {
37
+ const ok = await confirm(`Create ${basename(filePath)}? [Y/n] `);
38
+ if (!ok) process.exit(0);
39
+ await createScene(filePath);
40
+ console.log(`Created ${basename(filePath)}`);
41
+ }
42
+
43
+ await startServer({ filePath, port, open: opts.open, theme: opts.theme });
44
+ });
45
+
46
+ program.parse();
@@ -0,0 +1,45 @@
1
+ import { Excalidraw } from '@excalidraw/excalidraw';
2
+
3
+ let saveTimeout = null;
4
+
5
+ function save(elements, appState, files) {
6
+ clearTimeout(saveTimeout);
7
+ saveTimeout = setTimeout(() => {
8
+ const data = JSON.stringify(
9
+ {
10
+ type: 'excalidraw',
11
+ version: 2,
12
+ elements: elements.filter((el) => !el.isDeleted),
13
+ appState: {
14
+ viewBackgroundColor: appState.viewBackgroundColor,
15
+ gridSize: appState.gridSize,
16
+ theme: appState.theme,
17
+ },
18
+ files: files || {},
19
+ },
20
+ null,
21
+ 2
22
+ );
23
+
24
+ fetch('/save', {
25
+ method: 'POST',
26
+ headers: { 'Content-Type': 'application/json' },
27
+ body: data,
28
+ }).catch((err) => console.error('Save failed:', err));
29
+ }, 500);
30
+ }
31
+
32
+ export default function App({ scene, theme }) {
33
+ return (
34
+ <div style={{ width: '100vw', height: '100vh' }}>
35
+ <Excalidraw
36
+ initialData={{
37
+ elements: scene.elements || [],
38
+ appState: { ...scene.appState, theme },
39
+ files: scene.files || {},
40
+ }}
41
+ onChange={save}
42
+ />
43
+ </div>
44
+ );
45
+ }
@@ -0,0 +1,24 @@
1
+ import { createRoot } from 'react-dom/client';
2
+ import App from './App.jsx';
3
+
4
+ async function main() {
5
+ const [metaRes, dataRes] = await Promise.all([
6
+ fetch('/meta'),
7
+ fetch('/data'),
8
+ ]);
9
+ const meta = await metaRes.json();
10
+ const scene = await dataRes.json();
11
+
12
+ const name = meta.fileName.replace(/\.excalidraw$/, '');
13
+ document.title = `${name} - excalidraw-edit`;
14
+
15
+ const prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches;
16
+ const systemTheme = prefersDark ? 'dark' : 'light';
17
+ const theme =
18
+ meta.theme !== 'system' ? meta.theme : scene.appState?.theme || systemTheme;
19
+
20
+ const root = createRoot(document.getElementById('app'));
21
+ root.render(<App scene={scene} theme={theme} />);
22
+ }
23
+
24
+ main().catch(console.error);
package/src/const.js ADDED
@@ -0,0 +1,28 @@
1
+ import { dirname, join } from 'node:path';
2
+ import { fileURLToPath } from 'node:url';
3
+
4
+ const __dirname = dirname(fileURLToPath(import.meta.url));
5
+
6
+ export const VERSION = '0.1.0';
7
+ export const PUBLIC_DIR = join(__dirname, 'public');
8
+ export const INDEX_HTML_PATH = join(PUBLIC_DIR, 'index.html');
9
+
10
+ export const EMPTY_SCENE = {
11
+ type: 'excalidraw',
12
+ version: 2,
13
+ elements: [],
14
+ appState: {},
15
+ files: {},
16
+ };
17
+
18
+ export const MIME_TYPES = {
19
+ '.html': 'text/html',
20
+ '.js': 'application/javascript',
21
+ '.css': 'text/css',
22
+ '.json': 'application/json',
23
+ '.svg': 'image/svg+xml',
24
+ '.woff2': 'font/woff2',
25
+ '.woff': 'font/woff',
26
+ '.ttf': 'font/ttf',
27
+ '.png': 'image/png',
28
+ };
@@ -0,0 +1,23 @@
1
+ import { writeFile, access } from 'node:fs/promises';
2
+ import { extname } from 'node:path';
3
+ import { EMPTY_SCENE } from './const.js';
4
+
5
+ export function addExtension(filePath) {
6
+ if (extname(filePath) === '') {
7
+ return filePath + '.excalidraw';
8
+ }
9
+ return filePath;
10
+ }
11
+
12
+ export async function fileExists(filePath) {
13
+ try {
14
+ await access(filePath);
15
+ return true;
16
+ } catch {
17
+ return false;
18
+ }
19
+ }
20
+
21
+ export async function createScene(filePath) {
22
+ await writeFile(filePath, JSON.stringify(EMPTY_SCENE, null, 2));
23
+ }