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.
- package/LICENSE +21 -0
- package/README.md +57 -0
- package/package.json +57 -0
- package/src/cli.js +46 -0
- package/src/client/App.jsx +45 -0
- package/src/client/main.jsx +24 -0
- package/src/const.js +28 -0
- package/src/filesystem.js +23 -0
- package/src/public/assets/excalidraw-bundle.js +3103 -0
- package/src/public/assets/excalidraw.css +1 -0
- package/src/public/assets/fonts/Assistant/Assistant-Bold.woff2 +0 -0
- package/src/public/assets/fonts/Assistant/Assistant-Medium.woff2 +0 -0
- package/src/public/assets/fonts/Assistant/Assistant-Regular.woff2 +0 -0
- package/src/public/assets/fonts/Assistant/Assistant-SemiBold.woff2 +0 -0
- package/src/public/assets/fonts/Cascadia/CascadiaCode-Regular.woff2 +0 -0
- package/src/public/assets/fonts/ComicShanns/ComicShanns-Regular-279a7b317d12eb88de06167bd672b4b4.woff2 +0 -0
- package/src/public/assets/fonts/ComicShanns/ComicShanns-Regular-6e066e8de2ac57ea9283adb9c24d7f0c.woff2 +0 -0
- package/src/public/assets/fonts/ComicShanns/ComicShanns-Regular-dc6a8806fa96795d7b3be5026f989a17.woff2 +0 -0
- package/src/public/assets/fonts/ComicShanns/ComicShanns-Regular-fcb0fc02dcbee4c9846b3e2508668039.woff2 +0 -0
- package/src/public/assets/fonts/Excalifont/Excalifont-Regular-349fac6ca4700ffec595a7150a0d1e1d.woff2 +0 -0
- package/src/public/assets/fonts/Excalifont/Excalifont-Regular-3f2c5db56cc93c5a6873b1361d730c16.woff2 +0 -0
- package/src/public/assets/fonts/Excalifont/Excalifont-Regular-41b173a47b57366892116a575a43e2b6.woff2 +0 -0
- package/src/public/assets/fonts/Excalifont/Excalifont-Regular-623ccf21b21ef6b3a0d87738f77eb071.woff2 +0 -0
- package/src/public/assets/fonts/Excalifont/Excalifont-Regular-a88b72a24fb54c9f94e3b5fdaa7481c9.woff2 +0 -0
- package/src/public/assets/fonts/Excalifont/Excalifont-Regular-b9dcf9d2e50a1eaf42fc664b50a3fd0d.woff2 +0 -0
- package/src/public/assets/fonts/Excalifont/Excalifont-Regular-be310b9bcd4f1a43f571c46df7809174.woff2 +0 -0
- package/src/public/assets/fonts/Liberation/LiberationSans-Regular.woff2 +0 -0
- package/src/public/assets/fonts/Lilita/Lilita-Regular-i7dPIFZ9Zz-WBtRtedDbYE98RXi4EwSsbg.woff2 +0 -0
- package/src/public/assets/fonts/Lilita/Lilita-Regular-i7dPIFZ9Zz-WBtRtedDbYEF8RXi4EwQ.woff2 +0 -0
- package/src/public/assets/fonts/Nunito/Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTA3j6zbXWjgevT5.woff2 +0 -0
- package/src/public/assets/fonts/Nunito/Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTQ3j6zbXWjgeg.woff2 +0 -0
- package/src/public/assets/fonts/Nunito/Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTk3j6zbXWjgevT5.woff2 +0 -0
- package/src/public/assets/fonts/Nunito/Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTo3j6zbXWjgevT5.woff2 +0 -0
- package/src/public/assets/fonts/Nunito/Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTs3j6zbXWjgevT5.woff2 +0 -0
- package/src/public/assets/fonts/Virgil/Virgil-Regular.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-019d66dcad46dc156b162d267f981c20.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-04b718e5623574919c8b0dea5f301444.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-069e77aac84590e2e991d0a0176d34f2.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-06c77b8c66e51ed6c63ccb502dd8b8af.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-08e0dc436ad0ad61ba5558db0674d762.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-093b9ef39a46ceae95a1df18a0a3a326.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-095c169f3314805276f603a362766abd.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-09850c4077f3fffe707905872e0e2460.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-0986d134c05864f5025962eef9f994a0.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-0b5d723fdc4e249c140f0909e87d03b4.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-0f626226ba1272e832aea87bafd9720e.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-0f7fb1e0d5015bb1371343153ecf7ce3.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-0fa55a080fcd0f9dc2e0b0058b793df8.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-0facdf1ea213ba40261022f5d5ed4493.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-10a7ae9a371830a80c3d844acf1c02d7.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-112c051027b2d766c19a519f6ee1f4f7.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-11c345711937f0ba4b8f7b6b919c8440.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-12b52b58eb3df36804b9a654ec9ee194.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-13ae07ed2e272d26d59bc0691cd7117a.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-13d2887ec8ee73c43acdabc52a05af7b.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-145aa02cdd91946e67dc934e1acffe75.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-15dc6d811c9cd078f9086a740d5a1038.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-173945821411c09f70c95f98d590e697.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-1b611157cd46bb184d4fa4dae2d6a2b8.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-1e6fd68f1f3902ce48ce8c69df385622.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-1ee544f0f1dac422545c505baa788992.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-1fdc0c67ed57263a80fd108c1f6ccf24.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-203b0e569e3b14aac86a003dc3fa523e.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-20cc1bbf50e7efb442756cb605672c1f.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-20e7bf72fa05de9adf7dbcc7bf51dde6.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-21430ee05a1248901da8d0de08744d47.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-23686f7f29da6e8008c36dd3a80c83d6.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-23ad2d71b280f00b1363b95b7bea94eb.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-23f228f3999c01983860012330e4be08.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-24476a126f129212beb33f66853ea151.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-24a21c1e4449222e8d1898d69ff3a404.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-25b7f38e18f035f96cb5e547bd2bd08c.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-29cec36cd205b211da97acabaa62f055.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-2a26d20a23b00898ce82f09d2ee47c3f.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-2adbc89c11e65905393d3dfc468b9d5b.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-2b7441d46298788ac94e610ffcc709b6.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-2b77e8ebfb2367ab2662396a60e7d320.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-2cf96d082d35ea3d8106851223ad0d16.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-2d43040e86ff03ba677f6f9c04cd0805.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-2e33e8dc771ef5e1d9127d60a6b73679.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-33432927cd87d40cfe393c7482bf221f.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-353f33792a8f60dc69323ddf635a269e.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-36925dfe329a45086cbb7fc5c20d45ac.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-3717077e38f98d89eae729b6c14e56dc.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-3756e81d3e149cf6099163ee79944fec.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-395c35dd584b56b0789f58a0559beaf1.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-3c9de2ae0ea4bc91a510942dfa4be8d2.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-3cc70dbb64df5b21f1326cc24dee2195.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-3e1f8f654357353bf0e04ba5c34b5f7f.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-3e63ed8162808a9e425ed80a8bc79114.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-3eaa538115d76932653c21d8dc28f207.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-4095eb84ef3874e2600247bee0b04026.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-41521fade99856108931b4768b1b2648.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-450da755d5bcb70906e1295e559b9602.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-452225341522a7942f0f6aab1a5c91a3.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-4535823663ad81405188a528d8f2b1a2.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-4806e761d750087c2d734fc64596eaff.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-4a0fdb40036e87b40aa08dd30584cb85.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-4a38cc3e9cf104e69ba246d37f8cf135.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-4aca6a43e59aceee2166b0c7e4e85ef1.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-4bfaa8ffa64c5ee560aa2daba7c9cbd3.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-4dc6d5f188d5c96d44815cd1e81aa885.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-4ddc14ed3eb0c3e46364317dfc0144a3.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-4ee10ae43505e2e0bc62656ced49c0fa.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-4f50e5136e136527280bc902c5817561.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-51502f1206be09c565f1547c406e9558.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-51a0e808bbc8361236ac521a119758a3.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-52a84a22fd1369bffeaf21da2d6158dc.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-5330a2119a716e4e7224ed108b085dac.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-543fa46ace099a7099dad69123399400.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-544fc28abe2c5c30e62383fd4dac255f.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-54acdfc2166ad7fcbd074f75fd4a56ba.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-5572b3513ba8df57a3d5d7303ee6b11b.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-56467a5c8840c4d23a60b2f935114848.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-56a32a7689abd0326e57c10c6c069bb4.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-57862b464a55b18c7bf234ce22907d73.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-583d166e56ba0de4b77eabb47ef67839.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-5882ffa04f32584d26109137e2da4352.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-58fd02350d0bc52cf1ca3bb32ce9766e.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-5935a5775af3d5c6307ac667bd9ae74e.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-59e9ff77b0efaf684bc09274fb6908c9.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-5a1ce3117cfe90c48e8fb4a9a00f694d.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-5a45d991244d4c7140217e1e5f5ca4f4.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-5a7fac4b8b23a6e4e5ba0c9bf1756c91.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-5b0ed6971aaab9c8ad563230bd5471a7.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-5d2898fbc097a7e24c6f38d80587621e.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-603aefd23e350ba7eb124273e3c9bcf1.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-60a3089806700d379f11827ee9843b6b.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-60a41c7e1c68f22424e6d22df544bc82.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-642b26e2e5f5fb780b51b593dbc8c851.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-66493ba5a8367f2928812f446f47b56a.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-670ba603758d94268e8606f240a42e12.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-671a2c20b1eb9e4ef8a192833940e319.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-684d65f1793cac449dde5d59cb3c47fb.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-69c09cc5fa3e55c74fc4821f76909cc3.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-6ae5b42180ad70b971c91e7eefb8eba2.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-6e092f71c1e634059ada0e52abadce67.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-6f3256af8454371776bc46670d33cc65.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-6fe5c5973cc06f74b2387a631ea36b88.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-70c2eb8d64e71a42a834eb857ea9df51.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-70e811fd7994e61f408c923de6ddd078.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-7197d6fda6cba7c3874c53d6381ca239.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-72252d73220fa3cd856677888cee1635.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-72536a3d71b694a0d53dd90ddceae41e.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-726303e0774b4e678bff8c2deb6ca603.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-733171b4ffcd17ea1fe1c0ba627173bf.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-739bc1a567439c7cffcd1614644593d2.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-73e309718fd16cea44b4d54a33581811.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-7494dc504ae00ee9cd0505f990f88c5d.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-74e2263a91439c25b91d5132ce9f4d62.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-761d05e3cd968cf574166867998ef06a.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-7718fe60986d8b42b1be9c5ace5ccf25.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-774d4f764a1299da5d28ec2f2ffe0d69.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-79d494361ae093b69e74ee9dbe65bfd4.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-79f007c1c6d07557120982951ea67998.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-7a07ddc0f0c0f5f4a9bad6ee3dda66b5.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-7ab2bed91166a9dca83a5ebfbe2a7f38.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-7ccce86603f80a099ddb0cb21d4ae3e3.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-7e4bde7e9c7f84cd34d8a845e384c746.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-7e929f262f30c8ee78bf398150b1a7cd.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-7eb9fffd1aa890d07d0f88cc82e6cfe4.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-7f855356ab893b0d2b9c1c83b8116f0e.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-829615148e6357d826b9242eb7fbbd1e.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-866fa7613df6b3fd272bcfd4530c0bb9.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-87599f94b6cc129d505b375798d0d751.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-8c2f33cee3993174f7e87c28e4bf42ee.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-8d3bcabb847b56243b16afe62adaaf21.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-8de5b863cb50dfefdd07cb11c774d579.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-8e9f97f01034820170065b2921b4fb5e.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-8f476c4c99813d57cbe6eca4727388ad.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-903bb6865f3452e2fda42e3a25547bc5.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-91ddb2969bf2d31ba02ad82998d1314c.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-938d90c10ff8c20386af7f242c05d6b0.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-93fc8f28a33234bcadf1527cafabd502.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-95429962233afd82db1c27df1500a28c.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-9544732d2e62d1a429674f8ee41b5d3a.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-9592bfc861f07bcb8d75c196b370e548.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-95bfd249da4902577b4b7d76ebdd0b44.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-968cffdc8ee679da094e77ebf50f58ef.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-97f7f48ce90c9429bf32ae51469db74d.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-982b630266d87db93d2539affb1275c6.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-98f2ad84457de7f3740d9920b8fa8667.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-99a16ef6a64934d5781933dbd9c46b2e.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-9cfb2a77a4e45025105ad29a1748b90d.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-9d81066dd2b337c938df6e90380a00dc.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-9eb5a99df4e76ac3363453ac9ca288b1.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-a004ddfcb26e67bd6e678c8ed19e25ce.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-a0ca5df4258213d7fc9fce80f65ce760.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-a1f916d6039285c4ffb900cd654e418f.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-a203b91dad570bf05a58c3c3ddb529bf.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-a365e82ed54697a52f27adcea1315fe8.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-a4c34be6d42152e64b0df90bc4607f64.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-a7accba310e821da5505f71c03b76bdb.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-aa0d470430e6391eca720c7cfa44446f.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-aa5c9ca6cf4fba00433b7aa3fa10671a.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-ac9ceb44437becc3e9c4dbfebab7fc2d.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-b1220a3c61f85cc0408deedb4c5f57a2.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-b358f7a51ece39a3247942b1feabdb29.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-b57aaedfd8ebdf3931f25119dc6a5eb2.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-b5c1596551c256e0e9cf02028595b092.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-b6d128682ee29e471486354d486a1b90.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-b6fd38ca30869792244804b04bc058da.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-b7d203b051eff504ff59ddca7576b6a9.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-b96d9226ce77ec94ceca043d712182e6.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-ba3de316d63c7e339987b16f41a0b879.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-bafff7a14c27403dcc6cf1432e8ea836.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-bd77e3c7f9e0b072d96af37f73d1aa32.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-be549ab72f0719d606a5c01e2c0219b6.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-c16ed9740b85badf16e86ea782a3062f.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-c1f94158256bb1f3bf665b053d895af9.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-c40533fdf4cc57177b12803598af7e59.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-c4a687ac4f0c2766eefc9f77ed99cddf.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-c69f61a4ab18d0488c8d1fc12e7028e8.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-c8b71798409ccc126ee264a00aadcf21.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-c99eda15fc26a2941579560f76c3a5cf.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-cb17fc3db95f6d139afc9d31a8e93293.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-cbaaefaaf326668277aa24dfa93c4d28.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-cd145ce4a0ea18469358df53c207bc1b.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-cdbce89e82cc1ab53a2decbf5819278f.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-ce4884f96f11589608b76b726a755803.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-cf2cc71752631e579e35b0e423bf2638.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-cf6ff4e0f491ca0cf3038187a997b9b4.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-cfb211578629b7e8153b37240de6a9d5.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-d0cf73942fea1c74edbdf0b3011f4656.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-d2666cbed13462c5dc36fa2f15c202ca.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-d3716376641d615e2995605b29bca7b6.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-dac48066b5883d8b4551fc584f0c2a3e.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-dbea1af6dcd9860be40c3d18254338f5.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-e11567fd2accf9957cd0d3c2be937d87.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-e2ead7ea7da0437f085f42ffc05f8d13.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-e3fcf5180fd466c8915c4e8069491054.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-e480d9c614742d05f0e78f274f1e69e6.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-e4bca6cfa53e499cae0a6be4894a90e9.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-e51ef413167c6e14e0c0fdcc585f2fc9.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-e5f453bb04da18eed01675eeebd88bf8.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-e656f091b9dc4709722c9f4b84d3c797.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-ec181b795ac1fb5a50d700b6e996d745.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-ee8bae97908d5147b423f77ad0d3c1bb.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-f0f13b5c60e0af5553bd359f5513be1b.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-f2b54d4e7be0eaefe1c2c56836fa5368.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-f56414bf9bced67990def8660e306759.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-f5d079153c99a25b9be5b8583c4cc8a7.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-f6032fc06eb20480f096199713f70885.woff2 +0 -0
- package/src/public/assets/fonts/Xiaolai/Xiaolai-Regular-f8ee5d36068a42b51d0e4a1116cfcec1.woff2 +0 -0
- package/src/public/assets/locales/ar-SA-G6X2FPQ2.js +10 -0
- package/src/public/assets/locales/az-AZ-76LH7QW2.js +1 -0
- package/src/public/assets/locales/bg-BG-XCXSNQG7.js +5 -0
- package/src/public/assets/locales/bn-BD-2XOGV67Q.js +5 -0
- package/src/public/assets/locales/ca-ES-6MX7JW3Y.js +8 -0
- package/src/public/assets/locales/cs-CZ-2BRQDIVT.js +11 -0
- package/src/public/assets/locales/da-DK-5WZEPLOC.js +5 -0
- package/src/public/assets/locales/de-DE-XR44H4JA.js +8 -0
- package/src/public/assets/locales/el-GR-BZB4AONW.js +10 -0
- package/src/public/assets/locales/en-B4ZKOASM.js +1 -0
- package/src/public/assets/locales/es-ES-U4NZUMDT.js +9 -0
- package/src/public/assets/locales/eu-ES-A7QVB2H4.js +11 -0
- package/src/public/assets/locales/fa-IR-HGAKTJCU.js +8 -0
- package/src/public/assets/locales/fi-FI-Z5N7JZ37.js +6 -0
- package/src/public/assets/locales/fr-FR-RHASNOE6.js +9 -0
- package/src/public/assets/locales/gl-ES-HMX3MZ6V.js +10 -0
- package/src/public/assets/locales/he-IL-6SHJWFNN.js +10 -0
- package/src/public/assets/locales/hi-IN-IWLTKZ5I.js +4 -0
- package/src/public/assets/locales/hu-HU-A5ZG7DT2.js +7 -0
- package/src/public/assets/locales/id-ID-SAP4L64H.js +10 -0
- package/src/public/assets/locales/it-IT-JPQ66NNP.js +11 -0
- package/src/public/assets/locales/ja-JP-DBVTYXUO.js +8 -0
- package/src/public/assets/locales/kaa-6HZHGXH3.js +1 -0
- package/src/public/assets/locales/kab-KAB-ZGHBKWFO.js +8 -0
- package/src/public/assets/locales/kk-KZ-P5N5QNE5.js +1 -0
- package/src/public/assets/locales/km-KH-HSX4SM5Z.js +11 -0
- package/src/public/assets/locales/ko-KR-MTYHY66A.js +9 -0
- package/src/public/assets/locales/ku-TR-6OUDTVRD.js +9 -0
- package/src/public/assets/locales/lt-LT-XHIRWOB4.js +3 -0
- package/src/public/assets/locales/lv-LV-5QDEKY6T.js +7 -0
- package/src/public/assets/locales/mr-IN-CRQNXWMA.js +13 -0
- package/src/public/assets/locales/my-MM-5M5IBNSE.js +1 -0
- package/src/public/assets/locales/nb-NO-T6EIAALU.js +10 -0
- package/src/public/assets/locales/nl-NL-IS3SIHDZ.js +8 -0
- package/src/public/assets/locales/nn-NO-6E72VCQL.js +8 -0
- package/src/public/assets/locales/oc-FR-POXYY2M6.js +8 -0
- package/src/public/assets/locales/pa-IN-N4M65BXN.js +4 -0
- package/src/public/assets/locales/percentages-BXMCSKIN.js +1 -0
- package/src/public/assets/locales/pl-PL-T2D74RX3.js +9 -0
- package/src/public/assets/locales/pt-BR-5N22H2LF.js +9 -0
- package/src/public/assets/locales/pt-PT-UZXXM6DQ.js +9 -0
- package/src/public/assets/locales/ro-RO-JPDTUUEW.js +11 -0
- package/src/public/assets/locales/ru-RU-B4JR7IUQ.js +9 -0
- package/src/public/assets/locales/si-LK-N5RQ5JYF.js +1 -0
- package/src/public/assets/locales/sk-SK-C5VTKIMK.js +6 -0
- package/src/public/assets/locales/sl-SI-NN7IZMDC.js +6 -0
- package/src/public/assets/locales/sv-SE-XGPEYMSR.js +10 -0
- package/src/public/assets/locales/ta-IN-2NMHFXQM.js +9 -0
- package/src/public/assets/locales/th-TH-HPSO5L25.js +2 -0
- package/src/public/assets/locales/tr-TR-DEFEU3FU.js +7 -0
- package/src/public/assets/locales/uk-UA-QMV73CPH.js +6 -0
- package/src/public/assets/locales/vi-VN-M7AON7JQ.js +5 -0
- package/src/public/assets/locales/zh-CN-LNUGB5OW.js +10 -0
- package/src/public/assets/locales/zh-HK-E62DVLB3.js +1 -0
- package/src/public/assets/locales/zh-TW-RAJ6MFWO.js +9 -0
- package/src/public/favicon.ico +0 -0
- package/src/public/index.html +31 -0
- package/src/routes.js +74 -0
- 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
|
+
[](https://www.npmjs.com/package/excalidraw-edit)
|
|
6
|
+
[](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
|
+
}
|