@linloir/limr 0.0.0-stage → 1.0.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.en.md +123 -0
- package/README.md +122 -2
- package/benchmarks/results/browser.json +237 -0
- package/benchmarks/results/node.json +75 -0
- package/benchmarks/results/selection.json +172 -0
- package/dist/THIRD_PARTY_LICENSES.txt +117 -0
- package/dist/base.css +454 -0
- package/dist/chunk-3ILUZKDB.js +3130 -0
- package/dist/chunk-3ILUZKDB.js.map +1 -0
- package/dist/chunk-6N6TFHEN.js +83 -0
- package/dist/chunk-6N6TFHEN.js.map +1 -0
- package/dist/chunk-N77VD2YR.js +1238 -0
- package/dist/chunk-N77VD2YR.js.map +1 -0
- package/dist/chunk-TTISGBST.js +478 -0
- package/dist/chunk-TTISGBST.js.map +1 -0
- package/dist/chunk-V2OG4Y3F.js +1 -0
- package/dist/chunk-V2OG4Y3F.js.map +1 -0
- package/dist/core/index.d.ts +57 -0
- package/dist/core/index.js +39 -0
- package/dist/core/index.js.map +1 -0
- package/dist/engine-43u8B4yt.d.ts +172 -0
- package/dist/extensions/index.d.ts +130 -0
- package/dist/extensions/index.js +50 -0
- package/dist/extensions/index.js.map +1 -0
- package/dist/fonts/KaTeX_AMS-Regular.ttf +0 -0
- package/dist/fonts/KaTeX_AMS-Regular.woff +0 -0
- package/dist/fonts/KaTeX_AMS-Regular.woff2 +0 -0
- package/dist/fonts/KaTeX_Caligraphic-Bold.ttf +0 -0
- package/dist/fonts/KaTeX_Caligraphic-Bold.woff +0 -0
- package/dist/fonts/KaTeX_Caligraphic-Bold.woff2 +0 -0
- package/dist/fonts/KaTeX_Caligraphic-Regular.ttf +0 -0
- package/dist/fonts/KaTeX_Caligraphic-Regular.woff +0 -0
- package/dist/fonts/KaTeX_Caligraphic-Regular.woff2 +0 -0
- package/dist/fonts/KaTeX_Fraktur-Bold.ttf +0 -0
- package/dist/fonts/KaTeX_Fraktur-Bold.woff +0 -0
- package/dist/fonts/KaTeX_Fraktur-Bold.woff2 +0 -0
- package/dist/fonts/KaTeX_Fraktur-Regular.ttf +0 -0
- package/dist/fonts/KaTeX_Fraktur-Regular.woff +0 -0
- package/dist/fonts/KaTeX_Fraktur-Regular.woff2 +0 -0
- package/dist/fonts/KaTeX_Main-Bold.ttf +0 -0
- package/dist/fonts/KaTeX_Main-Bold.woff +0 -0
- package/dist/fonts/KaTeX_Main-Bold.woff2 +0 -0
- package/dist/fonts/KaTeX_Main-BoldItalic.ttf +0 -0
- package/dist/fonts/KaTeX_Main-BoldItalic.woff +0 -0
- package/dist/fonts/KaTeX_Main-BoldItalic.woff2 +0 -0
- package/dist/fonts/KaTeX_Main-Italic.ttf +0 -0
- package/dist/fonts/KaTeX_Main-Italic.woff +0 -0
- package/dist/fonts/KaTeX_Main-Italic.woff2 +0 -0
- package/dist/fonts/KaTeX_Main-Regular.ttf +0 -0
- package/dist/fonts/KaTeX_Main-Regular.woff +0 -0
- package/dist/fonts/KaTeX_Main-Regular.woff2 +0 -0
- package/dist/fonts/KaTeX_Math-BoldItalic.ttf +0 -0
- package/dist/fonts/KaTeX_Math-BoldItalic.woff +0 -0
- package/dist/fonts/KaTeX_Math-BoldItalic.woff2 +0 -0
- package/dist/fonts/KaTeX_Math-Italic.ttf +0 -0
- package/dist/fonts/KaTeX_Math-Italic.woff +0 -0
- package/dist/fonts/KaTeX_Math-Italic.woff2 +0 -0
- package/dist/fonts/KaTeX_SansSerif-Bold.ttf +0 -0
- package/dist/fonts/KaTeX_SansSerif-Bold.woff +0 -0
- package/dist/fonts/KaTeX_SansSerif-Bold.woff2 +0 -0
- package/dist/fonts/KaTeX_SansSerif-Italic.ttf +0 -0
- package/dist/fonts/KaTeX_SansSerif-Italic.woff +0 -0
- package/dist/fonts/KaTeX_SansSerif-Italic.woff2 +0 -0
- package/dist/fonts/KaTeX_SansSerif-Regular.ttf +0 -0
- package/dist/fonts/KaTeX_SansSerif-Regular.woff +0 -0
- package/dist/fonts/KaTeX_SansSerif-Regular.woff2 +0 -0
- package/dist/fonts/KaTeX_Script-Regular.ttf +0 -0
- package/dist/fonts/KaTeX_Script-Regular.woff +0 -0
- package/dist/fonts/KaTeX_Script-Regular.woff2 +0 -0
- package/dist/fonts/KaTeX_Size1-Regular.ttf +0 -0
- package/dist/fonts/KaTeX_Size1-Regular.woff +0 -0
- package/dist/fonts/KaTeX_Size1-Regular.woff2 +0 -0
- package/dist/fonts/KaTeX_Size2-Regular.ttf +0 -0
- package/dist/fonts/KaTeX_Size2-Regular.woff +0 -0
- package/dist/fonts/KaTeX_Size2-Regular.woff2 +0 -0
- package/dist/fonts/KaTeX_Size3-Regular.ttf +0 -0
- package/dist/fonts/KaTeX_Size3-Regular.woff +0 -0
- package/dist/fonts/KaTeX_Size3-Regular.woff2 +0 -0
- package/dist/fonts/KaTeX_Size4-Regular.ttf +0 -0
- package/dist/fonts/KaTeX_Size4-Regular.woff +0 -0
- package/dist/fonts/KaTeX_Size4-Regular.woff2 +0 -0
- package/dist/fonts/KaTeX_Typewriter-Regular.ttf +0 -0
- package/dist/fonts/KaTeX_Typewriter-Regular.woff +0 -0
- package/dist/fonts/KaTeX_Typewriter-Regular.woff2 +0 -0
- package/dist/fonts/LICENSE.txt +93 -0
- package/dist/fonts/manifest.json +2204 -0
- package/dist/fonts/maple-7.9-bold-005-5530d8c1d6.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-00f-1179d800a7.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-010-9974a942b1.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-011-9b9230baf2.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-012-c2545292b1.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-013-877b19fe05.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-014-6acf4a4e92.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-015-c889146da3.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-018-419ad5f31f.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-027-dd414483da.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-028-263744fbc7.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-029-ae3a163d8b.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-02a-515f0a82c2.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-02b-0823c5133d.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-02c-296fd5db38.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-02d-0bb4734363.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-02e-25415fed50.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-02f-19ed79a84e.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-030-21962a0327.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-031-d216fc0d68.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-032-d90ba34901.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-033-55ea37ea00.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-034-bc8649f808.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-035-03604fe40b.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-036-44fc7f77b2.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-037-8a1440f155.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-038-c65a618d5c.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-039-be05db966d.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-03a-ca3a10002d.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-03b-067b32e10b.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-03c-4da4f84530.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-03d-f0fe6a68c8.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-03e-0e97f89433.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-03f-3289a5e3bc.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-040-232dcd0d7b.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-041-e25e9a9c41.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-042-d64a2b1824.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-043-2d01cf5e52.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-044-0ab808b5f1.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-045-e41dc814b4.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-046-d5fe26344d.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-047-f322ded671.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-048-0cdcf7257f.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-049-aa280ca08a.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-04a-f51ad4d92c.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-04b-4e8c6fa3ee.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-04c-9bfdf4d743.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-04d-83ac1f5bb3.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-04e-bcec89804a.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-04f-d31e83b6ce.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-070-8a3b0fdf98.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-071-5bee0a62c4.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-072-97d891eee4.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-073-4d4c36aca0.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-074-6d3cc01e90.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-075-eab42ad657.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-076-2b1f5c4a42.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-077-1db0d50873.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-078-bc6994a28f.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-079-ad6c1757ce.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-07a-d08ed2b87d.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-07f-2f4af46cc6.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-0fc-42ed90884c.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-780-261fac1b24.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-781-377319a91b.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-782-3106f0be62.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-783-74fbfa8648.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-784-8570270664.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-785-cee8de1ded.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-786-5ab5ff7149.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-787-844b4c4373.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-788-01731198ab.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-789-f4c75fa806.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-78a-4370321ec6.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-78b-5cd412b56f.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-78c-f88e331085.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-78d-1b9b77f6e8.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-latin-3b4b2831f3.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-005-d59fef8639.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-00f-1bbda7af69.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-010-5cdd4b46a7.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-011-0d1f1ae687.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-012-4ceb000b2e.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-013-ad0a4f4313.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-014-94d54b71b3.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-015-7aede280da.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-018-f21221b1c2.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-027-d23d0e80a4.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-028-23bd6f24df.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-029-c481c0ad50.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-02a-1c134be68e.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-02b-3feb29ecfd.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-02c-de8cc5a063.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-02d-ea25c21fad.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-02e-e68d6bd335.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-02f-c88d1e92dc.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-030-f26fefe87e.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-031-f2aa1b8e22.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-032-c4fafc4aa6.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-033-288a1639ca.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-034-7c982125bc.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-035-fd1575dea2.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-036-f6bf406353.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-037-8ac1466916.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-038-e9f7fed6a6.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-039-6f90d42310.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-03a-30c9409a7e.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-03b-4f1741e9e9.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-03c-6551c74e78.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-03d-c8e2b07106.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-03e-c3e98613d4.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-03f-f1c580bad4.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-040-32e8260076.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-041-39805a0ed7.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-042-13b4d84cd3.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-043-d85780d0bd.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-044-1b5eb624d7.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-045-ad0b4f8762.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-046-9966021b3a.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-047-100d4f6f4e.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-048-a0a1e8b29c.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-049-0806f9b3cc.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-04a-28fdef78b3.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-04b-6e93ef0086.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-04c-50b8da6282.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-04d-f93277723d.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-04e-72e2644690.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-04f-4f234f1802.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-070-a3658a8a23.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-071-4987e49732.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-072-e587fa72cd.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-073-2aca01fdf6.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-074-ae89f99a60.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-075-5a77191665.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-076-4c54a87277.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-077-e47dce25ee.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-078-b0b720dab6.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-079-316ee96f6a.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-07a-b10ccb8107.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-07d-5667cb3be1.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-07f-2ac6735ff8.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-0fc-52171ca01e.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-780-3c090c5f89.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-781-ca4077b4fa.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-782-42c3d52206.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-783-d72840dd37.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-784-b9ca097e50.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-785-b81dec6af9.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-786-76c266f6f5.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-787-403bd73766.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-788-71a4b8c2c5.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-789-94527f3fa4.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-78a-81918568b8.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-78b-d0302b4bfe.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-78c-e864792049.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-78d-105ff69bf4.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-latin-96412d165b.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-005-23b09473f8.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-00f-e9bf4dd93c.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-010-22933d6d77.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-011-71b0157ddc.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-012-b751ab3752.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-013-530b1d3f8b.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-014-0e842f6749.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-015-642211b03a.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-018-0c5b0001c6.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-027-9a09afbbb1.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-028-93fea67326.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-029-7d7627d4cc.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-02a-88e76d051b.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-02b-7d9219748b.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-02c-049df19d84.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-02d-663fc73c6e.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-02e-a98ed33998.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-02f-8ef9d93d09.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-030-74885d994d.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-031-4cf66c5d65.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-032-a608b7aed4.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-033-2978f66e55.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-034-38f7a0bf87.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-035-5cc45cd3b7.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-036-ca92d327e5.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-037-f887681c7d.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-038-06150b88f8.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-039-761da333b7.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-03a-1408ddaf2c.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-03b-1542b3b67c.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-03c-479f2f5011.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-03d-0f10590b11.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-03e-8b93e0ee0e.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-03f-2bd8815e3e.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-040-b85023679a.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-041-eb881b7b92.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-042-01490a139e.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-043-ffb21b6c4c.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-044-05cd1a1b14.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-045-1270935363.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-046-857077eab1.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-047-ca57774cc3.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-048-20969d6307.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-049-4066aa1a18.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-04a-1ed360d580.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-04b-2eba62d76b.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-04c-2f4effc460.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-04d-d858c0a9c1.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-04e-a19eb0289f.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-04f-8addde15f2.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-070-f0bd641f1c.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-071-e6ac564431.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-072-e6fea65bca.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-073-71621c00dc.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-074-4bd488962a.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-075-2838d95bd6.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-076-94e02ecc03.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-077-32c536ab6b.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-078-18256447bd.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-079-7a735e61cf.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-07a-2b57a6a905.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-07d-8ba1bbfb50.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-07f-0240d80c69.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-0fc-e5b20a692e.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-780-093cc90a9b.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-781-f6ec357f6d.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-782-5ca2ef4ddd.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-783-7450baabee.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-784-14a93cc4bd.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-785-d62fb8b4d7.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-786-1d2959dc83.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-787-70ae947136.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-788-cf1f156ebf.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-789-f0b79f9680.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-78a-5a53fd7870.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-78b-40be093bfd.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-78c-3b11646f8e.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-78d-b13ed8c48b.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-latin-befeb2b610.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-005-90bff107ac.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-00f-001e503e53.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-010-374da1ebb4.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-011-8f91fcc9e7.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-012-e4ec3016ef.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-013-e779e13a12.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-014-6b833ad501.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-015-4e058c4c42.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-018-6f776bc19b.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-027-92c0be3439.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-028-154c8c3039.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-029-9d88470aca.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-02a-7a94cb26f2.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-02b-1725b841c2.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-02c-e080c435d6.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-02d-a6461c4708.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-02e-2e55d9b957.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-02f-858a76fa1f.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-030-bbbe80f8ad.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-031-cafc1258ad.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-032-0ca83ecceb.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-033-6cb995f2e7.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-034-5877222be6.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-035-988d8f2d26.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-036-e91853e3ca.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-037-3eed60f359.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-038-5681f42a4a.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-039-07036fe444.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-03a-5495eead93.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-03b-d07b1d6c1e.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-03c-6291400ee0.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-03d-3787a51772.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-03e-ce4d945844.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-03f-95e98b329c.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-040-693b769fe8.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-041-7b436d2c09.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-042-9ad884cd73.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-043-372231e8e2.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-044-9922b540b1.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-045-8a88a91c22.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-046-82859ede10.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-047-6532babd62.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-048-abfdc5d7ce.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-049-adb7fa9ed3.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-04a-f3f794b1cb.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-04b-715211b8dd.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-04c-c6f978d10d.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-04d-61019a1c8f.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-04e-806d6efe85.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-04f-99d19aa8db.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-070-e94ba9445d.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-071-057314b533.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-072-a7699beb84.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-073-ebe1bd9ef4.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-074-722db38100.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-075-150ff7187b.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-076-c14595e715.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-077-6c88302a32.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-078-549b294c78.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-079-5131c42759.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-07a-c0dad221b5.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-07f-5cf5ebe065.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-0fc-b644c0c6d9.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-780-c6000d472a.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-781-86409ab7f7.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-782-9cd950637c.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-783-105c4d02df.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-784-00c042af97.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-785-022568d0b8.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-786-90b6f3aef5.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-787-e2888596c9.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-788-3416e1fda3.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-789-9ffc917b0b.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-78a-4a921d07f6.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-78b-9d71c5327b.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-78c-9ec048314b.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-78d-46a2ebd113.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-latin-59c752ba1d.woff2 +0 -0
- package/dist/fonts/maple.css +315 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.js +136 -0
- package/dist/index.js.map +1 -0
- package/dist/math-renderer-L6DOH4RX.js +21 -0
- package/dist/math-renderer-L6DOH4RX.js.map +1 -0
- package/dist/math.css +1 -0
- package/dist/react/index.d.ts +113 -0
- package/dist/react/index.js +59 -0
- package/dist/react/index.js.map +1 -0
- package/dist/styles.css +454 -0
- package/dist/translations-DHnYMg4h.d.ts +318 -0
- package/docs/README.md +13 -0
- package/docs/api.md +8 -0
- package/docs/assets/rendered.svg +9 -0
- package/docs/assets/source.svg +9 -0
- package/docs/en/README.md +26 -0
- package/docs/en/ai-skills.md +57 -0
- package/docs/en/annotations.md +84 -0
- package/docs/en/api.md +107 -0
- package/docs/en/architecture.md +33 -0
- package/docs/en/extensions.md +159 -0
- package/docs/en/getting-started.md +67 -0
- package/docs/en/integration.md +130 -0
- package/docs/en/modules.md +80 -0
- package/docs/en/performance.md +53 -0
- package/docs/en/plugin-packages.md +68 -0
- package/docs/en/styles.md +80 -0
- package/docs/en/syntax.md +352 -0
- package/docs/extensions.md +8 -0
- package/docs/implementation.md +8 -0
- package/docs/performance.md +8 -0
- package/docs/screenshots/blocks.png +0 -0
- package/docs/screenshots/dark.png +0 -0
- package/docs/screenshots/desktop.png +0 -0
- package/docs/screenshots/plugin-mobile.png +0 -0
- package/docs/styles.md +8 -0
- package/docs/visual-upgrade.md +8 -0
- package/docs/zh-CN/README.md +26 -0
- package/docs/zh-CN/ai-skills.md +57 -0
- package/docs/zh-CN/annotations.md +84 -0
- package/docs/zh-CN/api.md +107 -0
- package/docs/zh-CN/architecture.md +33 -0
- package/docs/zh-CN/extensions.md +159 -0
- package/docs/zh-CN/getting-started.md +67 -0
- package/docs/zh-CN/integration.md +130 -0
- package/docs/zh-CN/modules.md +80 -0
- package/docs/zh-CN/performance.md +53 -0
- package/docs/zh-CN/plugin-packages.md +68 -0
- package/docs/zh-CN/styles.md +80 -0
- package/docs/zh-CN/syntax.md +352 -0
- package/examples/assistant.tsx +52 -0
- package/examples/notes.tsx +80 -0
- package/examples/packages/paper-theme/index.css +25 -0
- package/examples/packages/paper-theme/package.json +7 -0
- package/examples/packages/reading-tools/index.d.ts +2 -0
- package/examples/packages/reading-tools/index.js +25 -0
- package/examples/packages/reading-tools/package.json +16 -0
- package/package.json +114 -3
- package/skills/limr-plugin-development/SKILL.md +22 -0
- package/skills/limr-plugin-development/agents/openai.yaml +4 -0
- package/skills/limr-plugin-development/assets/plugin-template/README.md +30 -0
- package/skills/limr-plugin-development/assets/plugin-template/package.json +36 -0
- package/skills/limr-plugin-development/assets/plugin-template/src/index.tsx +50 -0
- package/skills/limr-plugin-development/assets/plugin-template/src/styles.css +9 -0
- package/skills/limr-plugin-development/assets/plugin-template/tsconfig.json +20 -0
- package/skills/limr-plugin-development/assets/plugin-template/tsup.config.ts +8 -0
- package/skills/limr-plugin-development/references/contract.md +45 -0
- package/skills/limr-use/SKILL.md +23 -0
- package/skills/limr-use/agents/openai.yaml +4 -0
- package/skills/limr-use/references/integration.md +41 -0
- package/skills/limr-use/references/syntax.md +17 -0
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
# 插件模块包
|
|
2
|
+
|
|
3
|
+
> 阅读提示:本文包含 LiMR 扩展语法和交互示例。部分内容在 GitHub 等普通 Markdown 阅读器中无法完整展示;前往 [GitHub Pages 文档](https://linloir.github.io/LiMR/#/docs/zh-CN/plugin-packages) 可获得最佳阅读体验。
|
|
4
|
+
|
|
5
|
+
[文档目录](README.md) · [English](../en/plugin-packages.md)
|
|
6
|
+
|
|
7
|
+
一个插件包导出返回 RendererExtension 的工厂,消费者安装后通过 plugins 追加。插件可同时提供语法、标注、动作和参数,CSS 独立导出。它不需要修改 LiMR 源码。
|
|
8
|
+
|
|
9
|
+
## 可复制模板
|
|
10
|
+
|
|
11
|
+
完整模板位于 [plugin-template](../../skills/limr-plugin-development/assets/plugin-template/README.md),包含 TypeScript 源码、类型构建、CSS、package.json 和 tsup 配置。它演示 reading-tip 区块、example:note 卡片和保存选区动作。
|
|
12
|
+
|
|
13
|
+
安装 LiMR 后,在应用目录执行:
|
|
14
|
+
|
|
15
|
+
```sh
|
|
16
|
+
mkdir -p packages/limr-reading-tools
|
|
17
|
+
cp -R node_modules/@linloir/limr/skills/limr-plugin-development/assets/plugin-template/. packages/limr-reading-tools/
|
|
18
|
+
cd packages/limr-reading-tools
|
|
19
|
+
npm install
|
|
20
|
+
npm run typecheck
|
|
21
|
+
npm run build
|
|
22
|
+
npm pack
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
源码仓库中的对应路径为 skills/limr-plugin-development/assets/plugin-template。替换模板的 @example 包名、扩展名、类型名和动作 ID,再实现业务数据与 UI;模板的 private: true 用于防止示例名被误发布,不影响本地打包。
|
|
26
|
+
|
|
27
|
+
## 包契约
|
|
28
|
+
|
|
29
|
+
| 字段 | 要求 |
|
|
30
|
+
| --- | --- |
|
|
31
|
+
| type | module |
|
|
32
|
+
| exports["."] | import 指向 ESM,types 指向 .d.ts |
|
|
33
|
+
| exports["./styles.css"] | 插件需要 CSS 时显式导出 |
|
|
34
|
+
| files | 包含构建输出与使用说明 |
|
|
35
|
+
| sideEffects | CSS 使用 ["**/*.css"],避免被构建工具移除 |
|
|
36
|
+
| peerDependencies | @linloir/limr、react;直接依赖 react-dom API 时再声明 react-dom |
|
|
37
|
+
| 构建 external | LiMR、React、react/jsx-runtime,以及使用到的 React DOM 入口 |
|
|
38
|
+
|
|
39
|
+
LiMR 或 React 的第二份内置副本会破坏上下文/Hook 共享。不要打包宿主依赖,不要深度导入 LiMR 内部文件。参数声明合并必须随导出的类型分发。
|
|
40
|
+
|
|
41
|
+
## 在应用中引入
|
|
42
|
+
|
|
43
|
+
下方 @example 包来自模板,并未发布到 npm。先安装本地打出的归档;生成文件名以 npm pack 输出为准:
|
|
44
|
+
|
|
45
|
+
```sh
|
|
46
|
+
npm install ./packages/limr-reading-tools/example-limr-reading-tools-0.1.0.tgz
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
```tsx
|
|
50
|
+
import { Reader } from '@linloir/limr';
|
|
51
|
+
import { readingTools } from '@example/limr-reading-tools';
|
|
52
|
+
import '@linloir/limr/styles.css';
|
|
53
|
+
import '@example/limr-reading-tools/styles.css';
|
|
54
|
+
|
|
55
|
+
const plugins = [readingTools({ label: '阅读笔记' })];
|
|
56
|
+
|
|
57
|
+
export function Article({ source }: { source: string }) {
|
|
58
|
+
return <Reader source={source} plugins={plugins} />;
|
|
59
|
+
}
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
真实第三方包使用它的包名和 peer 版本约束。改写已存在的默认模块使用 extensions + replaceExtension,不要重复注册同一标签。字体、公式样式、持久化和应用服务仍由宿主配置。
|
|
63
|
+
|
|
64
|
+
## 验证可分发性
|
|
65
|
+
|
|
66
|
+
本地类型检查通过后,还需把真实 tgz 安装到独立消费者中:检查公开导入、SSR、CSS 资源、默认模块仍可用和新增交互。支持 React 18/19 的包应分别验证两种宿主。语法插件检查流式结束与一次性解析等价;交互插件检查桌面侧栏、窄屏浮层、键盘、异步取消和两种主题。
|
|
67
|
+
|
|
68
|
+
LiMR 仓库的 [reading-tools](../../examples/packages/reading-tools/index.js) 和 [paper-theme](../../examples/packages/paper-theme/index.css) 是另一组可打包示例。AI 可使用[插件开发 Skill](ai-skills.md),其中的模板可独立复制,引用文件无需依赖本仓库路径。
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
# 样式与字体
|
|
2
|
+
|
|
3
|
+
> 阅读提示:本文包含 LiMR 扩展语法和交互示例。部分内容在 GitHub 等普通 Markdown 阅读器中无法完整展示;前往 [GitHub Pages 文档](https://linloir.github.io/LiMR/#/docs/zh-CN/styles) 可获得最佳阅读体验。
|
|
4
|
+
|
|
5
|
+
[文档目录](README.md) · [English](../en/styles.md)
|
|
6
|
+
|
|
7
|
+
## 基础样式和主题
|
|
8
|
+
|
|
9
|
+
默认 CSS 在 `@layer limr` 中,宿主普通 CSS 可覆盖。选择 styles.css(带 Maple)或 styles/base.css(不加载 Maple);公式另加 math.css。
|
|
10
|
+
|
|
11
|
+
```tsx
|
|
12
|
+
import { Reader } from '@linloir/limr';
|
|
13
|
+
import '@linloir/limr/styles/base.css';
|
|
14
|
+
import './paper.css';
|
|
15
|
+
|
|
16
|
+
export function Paper({ source }: { source: string }) {
|
|
17
|
+
return <Reader source={source} appearance="paper" theme="auto" />;
|
|
18
|
+
}
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
paper.css 示例:
|
|
22
|
+
|
|
23
|
+
```css
|
|
24
|
+
[data-limr-appearance='paper'] {
|
|
25
|
+
--limr-font-text: Georgia, 'Noto Serif SC', serif;
|
|
26
|
+
--limr-content-width: 820px;
|
|
27
|
+
--limr-accent: #8b6548;
|
|
28
|
+
}
|
|
29
|
+
[data-limr-appearance='paper'][data-limr-theme='dark'] {
|
|
30
|
+
--limr-accent: #d1ab84;
|
|
31
|
+
}
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
appearance 会传给 portal 中的浮层/工具栏;不要只用 `.limr-reader .your-selector` 匹配这些元素。theme: auto 通过系统偏好选择内置主题;自定义 auto 深色覆盖还需对应 prefers-color-scheme 媒体规则。独立 CSS 包示例见 [paper-theme](../../examples/packages/paper-theme/index.css)。
|
|
35
|
+
|
|
36
|
+
## 常用变量
|
|
37
|
+
|
|
38
|
+
| 变量 | 用途 |
|
|
39
|
+
| --- | --- |
|
|
40
|
+
| --limr-font-text / --limr-font-code | 正文 / 代码字体 |
|
|
41
|
+
| --limr-font-size / --limr-line-height | 基础排版 |
|
|
42
|
+
| --limr-font-features | 正文默认 'palt' 1,字体支持时采用比例标点 |
|
|
43
|
+
| --limr-emphasis-spacing / --limr-list-item-gap | 斜体末尾 / 列表间距 |
|
|
44
|
+
| --limr-text / --limr-heading / --limr-secondary / --limr-muted | 文字层次 |
|
|
45
|
+
| --limr-background / --limr-surface / --limr-border | 背景和边框 |
|
|
46
|
+
| --limr-link / --limr-accent / --limr-selection | 链接、激活、选区 |
|
|
47
|
+
| --limr-content-width / --limr-reader-width | 正文 / 总宽,默认 900px / 1800px |
|
|
48
|
+
| --limr-toc-width / --limr-sidebar-width / --limr-column-gap | 侧栏宽度与列间隔 |
|
|
49
|
+
| --limr-sticky-top | 吸顶偏移 |
|
|
50
|
+
| --limr-reader-bottom-space / --limr-reader-min-height | 短正文高度与底部预留 |
|
|
51
|
+
| --limr-sidebar-padding-inline / --limr-sidebar-reference-gap | 侧栏内容统一留白(10px)和关联区间隔(1px) |
|
|
52
|
+
| --limr-overlay-duration / --limr-overlay-morph-duration | 浮层进退(560ms)和预览/展开转换(480ms) |
|
|
53
|
+
| --limr-overlay-z / --limr-toolbar-z | 浮层层级 |
|
|
54
|
+
| --limr-overflow-fade-size | 溢出渐隐,默认 24px,0px 关闭 |
|
|
55
|
+
| --limr-toolbar-panel-max-height | 工具栏面板高度上限 |
|
|
56
|
+
| --limr-tool-icon-size / --limr-mark-size | 工具图标 / 正文角标尺寸 |
|
|
57
|
+
|
|
58
|
+
runtime 测量的 --limr-toolbar-available-height、--limr-toolbar-panel-height、--limr-toc-available-height 是布局输出,不应由主题覆盖。sidebar 的局部颜色通常由 AnnotationType.sidebar 配置提供,见[扩展开发](extensions.md)。
|
|
59
|
+
|
|
60
|
+
## 字体和资源体积
|
|
61
|
+
|
|
62
|
+
Maple Mono NF CN v7.9 的本地 WOFF2 子集随包分发,衍生字体名为 LiMR Maple Mono NF CN,OFL 许可证随资源提供。unicode-range 和 font-display: swap 限制运行时按需请求,但完整字体资产仍约 31MB,base.css 只避免浏览器加载,不减少 npm 安装体积。
|
|
63
|
+
|
|
64
|
+
正文不自动加载中文字体;可使用系统回退、自托管或宿主选定的字体服务。Playground 的 Noto Serif SC 是演示项目依赖。不要假定任何字体覆盖所有文字。
|
|
65
|
+
|
|
66
|
+
默认字体/公式样式不依赖外部 CDN。带哈希的字体资源可由宿主设置长期 immutable 缓存;库无法替服务器设置 HTTP 缓存头。远程图片、视频和插件请求由内容和宿主决定。
|
|
67
|
+
|
|
68
|
+
## 布局与交互约定
|
|
69
|
+
|
|
70
|
+
同步侧栏的高度由阅读区域决定,不能用所有卡片总高撑大页面。模块只控制自己的内容,骨架负责灰色关联区、摘要与卡片外壳;避免重复 padding 或空段落补偿。大卡片从预览位置过渡,减少动态效果设置会关闭动画。
|
|
71
|
+
|
|
72
|
+
密集的文末引用在静止时向上借用空余空间。悬浮或激活时优先对齐当前条目,允许邻项在边缘裁切;角标悬浮时可压缩可选摘要,为关联区和标题留出空间。展开内容受可见阅读区域高度限制,并可在卡片内滚动。侧栏条目即使被向上收拢,也会反向对齐正文。取消激活后按当前卡片高度平滑回位,使用 `--limr-motion-slow` 和 `--limr-ease`,保持卡片间距与页面高度。
|
|
73
|
+
|
|
74
|
+
选区保留原生浏览器范围与键盘行为,绘制层只计算可见片段。代码支持局部高亮,公式整体选择,图片高亮使用边框。打印隐藏绘制层并保留正文。移动端自动化检查不等于 iOS/Android 原生拖动手柄和真机验收。
|
|
75
|
+
|
|
76
|
+
## 仅 CSS 的独立主题
|
|
77
|
+
|
|
78
|
+
包可导出 CSS,files 包含 CSS,sideEffects 为 `["**/*.css"]`;不需要 React 或解析器运行时依赖。规则用独立 appearance 名隔离,覆盖浅色、深色、auto 和 portal,并在同页两个不同主题 Reader 中检查。
|
|
79
|
+
|
|
80
|
+
展开工具栏面板使用工具栏的全部可用宽度。宽度由当前操作按钮行与可用视口决定,展开内容不参与工具栏的固有宽度计算,不会反向撑大工具栏。高亮样式按钮按文字自然宽度排列,空间不足时整项换行并左对齐。多行下划线需要保持内部 span 为 inline,不把它直接作为 flex 子项。
|
|
@@ -0,0 +1,352 @@
|
|
|
1
|
+
# 默认语法
|
|
2
|
+
|
|
3
|
+
> 阅读提示:本文包含 LiMR 扩展语法和交互示例。部分内容在 GitHub 等普通 Markdown 阅读器中无法完整展示;前往 [GitHub Pages 文档](https://linloir.github.io/LiMR/#/docs/zh-CN/syntax) 可获得最佳阅读体验。
|
|
4
|
+
|
|
5
|
+
[文档目录](README.md) · [English](../en/syntax.md)
|
|
6
|
+
|
|
7
|
+
**模块**是为 LiMR 增加一组能力的配置对象,例如公式、视频或引用。下面的“创建函数”在应用代码中调用,返回模块对象;“模块名”是对象的 `name` 字段,用于替换和移除;“标签 / 指令”才是写在 Markdown 正文中的语法。完整概念和配置方式见[内置模块](modules.md)。
|
|
8
|
+
|
|
9
|
+
`@linloir/limr` 随包提供以下十个模块。`Reader`、独立 `Markdown` 和 `DocumentProvider` 默认通过 `standard()` 全部启用;纯核心 `createDocument()` 默认只有 CommonMark。下面每节给出源码和实际效果,交互示例由 LiMR 自己渲染。
|
|
10
|
+
|
|
11
|
+
## 模块清单
|
|
12
|
+
|
|
13
|
+
| 创建函数(应用代码) | 模块名(name) | 默认能力 | 注册的特殊标签 / 指令 |
|
|
14
|
+
| --- | --- | --- | --- |
|
|
15
|
+
| `gfm()` | `gfm` | 表格、删除线、任务列表、自动链接、标准脚注 | 无 |
|
|
16
|
+
| `math()` | `math` | 行内与块级公式 | `$…$`、`$$…$$` |
|
|
17
|
+
| `codeHighlight()` | `code-highlight` | Shiki 围栏代码高亮 | 标准代码围栏 |
|
|
18
|
+
| `definition()` | `definition` | 释义 | 标签 `definition`、`title`、`content`;指令 `definition` |
|
|
19
|
+
| `question()` | `question` | 练习题与答案 | 标签 `question` 及下文子标签;指令 `question` |
|
|
20
|
+
| `extras()` | `extras` | 拓展阅读 | 标签 `extras`、`extra`;指令 `extras` |
|
|
21
|
+
| `video()` | `video` | 原生视频、YouTube、Bilibili | 标签 `video`、`md-video`;指令 `video` |
|
|
22
|
+
| `figures()` | `figures` | 图组与图注 | 标签 `figures`、`figure`、`figcaption`、`caption`、`img`;指令 `figures`、`figure`、`figcaption` |
|
|
23
|
+
| `citation()` | `citation` | 引用定义与角标 | 标签 `citation`、`ref`;不注册指令 |
|
|
24
|
+
| `translations()` | `translations` | 原文、译文与对照 | 标签及指令 `translations`、`origin`、`translation` |
|
|
25
|
+
|
|
26
|
+
这些是 Markdown 中允许的静态标签,不是任意 MDX/HTML 执行环境。使用字符串属性,如 `multi="true"`、`answer="[0,2]"`;不要使用 `answer={[0,2]}`、事件函数或展开属性。未注册 HTML 按文本显示;表达式不执行并可能产生诊断。嵌套块的标签和正文之间保留空行。
|
|
27
|
+
|
|
28
|
+
## CommonMark 与 GFM
|
|
29
|
+
|
|
30
|
+
````markdown
|
|
31
|
+
# 标题
|
|
32
|
+
|
|
33
|
+
**粗体**、*斜体*、~~删除线~~、[链接](https://example.com)、`行内代码`。
|
|
34
|
+
|
|
35
|
+
> 引用块,默认界面标题为 Note / 注释。
|
|
36
|
+
|
|
37
|
+
- 普通列表
|
|
38
|
+
- [x] 已完成
|
|
39
|
+
- [ ] 未完成
|
|
40
|
+
|
|
41
|
+
| 名称 | 说明 |
|
|
42
|
+
| --- | --- |
|
|
43
|
+
| LiMR | Markdown renderer |
|
|
44
|
+
|
|
45
|
+
```typescript
|
|
46
|
+
const value = 42;
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
标准脚注[^note]。
|
|
50
|
+
|
|
51
|
+
[^note]: 出现在文末的脚注内容。
|
|
52
|
+
````
|
|
53
|
+
|
|
54
|
+
实际效果(可交互):
|
|
55
|
+
|
|
56
|
+
#### 标题示例
|
|
57
|
+
|
|
58
|
+
**粗体**、*斜体*、~~删除线~~、[链接](https://example.com)、`行内代码`。
|
|
59
|
+
|
|
60
|
+
> 引用块,默认界面标题为 Note / 注释。
|
|
61
|
+
|
|
62
|
+
- 普通列表
|
|
63
|
+
- [x] 已完成
|
|
64
|
+
- [ ] 未完成
|
|
65
|
+
|
|
66
|
+
| 名称 | 说明 |
|
|
67
|
+
| --- | --- |
|
|
68
|
+
| LiMR | Markdown renderer |
|
|
69
|
+
|
|
70
|
+
```typescript
|
|
71
|
+
const value = 42;
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
标准脚注[^syntax-note]。
|
|
75
|
+
|
|
76
|
+
[^syntax-note]: 出现在文末的脚注内容。
|
|
77
|
+
|
|
78
|
+
标准 `[^note]` 是文末脚注,`<ref>` 是标注卡片,两者不同。图片 `` 由普通 Markdown 支持。原始 HTML 不透传到 DOM;需要自定义外观时注册扩展或覆盖 `components`。
|
|
79
|
+
|
|
80
|
+
## 公式与代码
|
|
81
|
+
|
|
82
|
+
```markdown
|
|
83
|
+
行内公式:$E = mc^2$。
|
|
84
|
+
|
|
85
|
+
$$
|
|
86
|
+
\int_0^1 x^2\,dx = \frac{1}{3}
|
|
87
|
+
$$
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
实际效果(可交互):
|
|
91
|
+
|
|
92
|
+
行内公式:$E = mc^2$。
|
|
93
|
+
|
|
94
|
+
$$
|
|
95
|
+
\int_0^1 x^2\,dx = \frac{1}{3}
|
|
96
|
+
$$
|
|
97
|
+
|
|
98
|
+
公式需要导入 `@linloir/limr/math.css`;支持通过 `math({ macros, strict })` 配置。代码围栏语言用于 Shiki 高亮。默认接近视口才加载高亮,流式代码暂停更新 180ms 后尝试高亮;超过默认 100,000 字符、未支持或未在允许列表中的语言保留可读源码。`codeHighlight({ languages, lightTheme, darkTheme, eager, maxLength })` 可配置。
|
|
99
|
+
|
|
100
|
+
## 释义
|
|
101
|
+
|
|
102
|
+
```markdown
|
|
103
|
+
<definition title="熵">
|
|
104
|
+
|
|
105
|
+
表示不确定性的量:$H(X)$。
|
|
106
|
+
|
|
107
|
+
</definition>
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
实际效果(可交互):
|
|
111
|
+
|
|
112
|
+
<definition title="熵">
|
|
113
|
+
|
|
114
|
+
表示不确定性的量:$H(X)$。
|
|
115
|
+
|
|
116
|
+
</definition>
|
|
117
|
+
|
|
118
|
+
富文本标题和指定正文可以使用子标签:
|
|
119
|
+
|
|
120
|
+
```markdown
|
|
121
|
+
<definition>
|
|
122
|
+
|
|
123
|
+
<title>**Entropy** / 熵</title>
|
|
124
|
+
|
|
125
|
+
<content>
|
|
126
|
+
|
|
127
|
+
正文支持 Markdown。
|
|
128
|
+
|
|
129
|
+
</content>
|
|
130
|
+
|
|
131
|
+
</definition>
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
`title` 属性按文字渲染;富文本用子标签。也可以写 `:::definition{title="熵"}`,以 `:::` 结束。
|
|
135
|
+
|
|
136
|
+
## 练习题
|
|
137
|
+
|
|
138
|
+
```markdown
|
|
139
|
+
<question title="哪些是偶数?">
|
|
140
|
+
|
|
141
|
+
<question-content>请选择所有正确选项。</question-content>
|
|
142
|
+
|
|
143
|
+
<question-sel-grp multi="true" answer="[0,2]">
|
|
144
|
+
|
|
145
|
+
<question-sel>2</question-sel>
|
|
146
|
+
|
|
147
|
+
<question-sel>3</question-sel>
|
|
148
|
+
|
|
149
|
+
<question-sel>4</question-sel>
|
|
150
|
+
|
|
151
|
+
</question-sel-grp>
|
|
152
|
+
|
|
153
|
+
<question-hint>考虑能否被 2 整除。</question-hint>
|
|
154
|
+
|
|
155
|
+
<question-answer>2 和 4 是偶数。</question-answer>
|
|
156
|
+
|
|
157
|
+
</question>
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
实际效果(可交互):
|
|
161
|
+
|
|
162
|
+
<question title="哪些是偶数?">
|
|
163
|
+
|
|
164
|
+
<question-content>请选择所有正确选项。</question-content>
|
|
165
|
+
|
|
166
|
+
<question-sel-grp multi="true" answer="[0,2]">
|
|
167
|
+
|
|
168
|
+
<question-sel>2</question-sel>
|
|
169
|
+
|
|
170
|
+
<question-sel>3</question-sel>
|
|
171
|
+
|
|
172
|
+
<question-sel>4</question-sel>
|
|
173
|
+
|
|
174
|
+
</question-sel-grp>
|
|
175
|
+
|
|
176
|
+
<question-hint>考虑能否被 2 整除。</question-hint>
|
|
177
|
+
|
|
178
|
+
<question-answer>2 和 4 是偶数。</question-answer>
|
|
179
|
+
|
|
180
|
+
</question>
|
|
181
|
+
|
|
182
|
+
答案索引从 **0** 开始。`multi` 默认关闭;`answer` 可以是 JSON 数组或单个索引的字符串。属性优先读取选择组,其次读取 `question`。提示和答案可以单独展开,有答案索引时支持提交、判分和重试。它不连接 AI,也不创建问答标注。
|
|
183
|
+
|
|
184
|
+
## 拓展阅读
|
|
185
|
+
|
|
186
|
+
```markdown
|
|
187
|
+
<extras>
|
|
188
|
+
|
|
189
|
+
<extra title="继续阅读" url="https://example.com/article" desc="背景和补充材料。" />
|
|
190
|
+
|
|
191
|
+
</extras>
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
实际效果(可交互):
|
|
195
|
+
|
|
196
|
+
<extras>
|
|
197
|
+
|
|
198
|
+
<extra title="内置模块" url="https://linloir.github.io/LiMR/#/docs/zh-CN/modules" desc="背景和补充材料。" />
|
|
199
|
+
|
|
200
|
+
</extras>
|
|
201
|
+
|
|
202
|
+
`extra` 使用 `title`、`url`、`desc`。链接经过内置 URL 过滤。
|
|
203
|
+
|
|
204
|
+
## 引用卡片
|
|
205
|
+
|
|
206
|
+
```markdown
|
|
207
|
+
一个来源<ref id="a" />,或一组来源<ref ids='["a","b"]' />。
|
|
208
|
+
|
|
209
|
+
<ref id="a">带引用的 **原文**</ref>
|
|
210
|
+
|
|
211
|
+
<citation id="a" title="资料 A" url="https://example.com/a" description="完整的 **Markdown** 说明。" summary="收起时的简短摘要。" />
|
|
212
|
+
|
|
213
|
+
<citation cite-id="b" title="资料 B" url="https://example.com/b" desc="兼容属性名。" />
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
实际效果(可交互):
|
|
217
|
+
|
|
218
|
+
一个来源<ref id="a" />,或一组来源<ref ids='["a","b"]' />。
|
|
219
|
+
|
|
220
|
+
<ref id="a">带引用的 **原文**</ref>
|
|
221
|
+
|
|
222
|
+
<citation id="a" title="资料 A" url="https://example.com/a" description="完整的 **Markdown** 说明。" summary="收起时的简短摘要。" />
|
|
223
|
+
|
|
224
|
+
<citation cite-id="b" title="资料 B" url="https://example.com/b" desc="兼容属性名。" />
|
|
225
|
+
|
|
226
|
+
`citation` 的 ID 读取 `cite-id`,其次 `id`;说明读取 `desc`,其次 `description`。`ref` 读取 `cite-from-ids`、`ids`、`id`,支持 JSON 数组或逗号分隔字符串。定义本身不占正文位置,同一个定义可以被多个角标引用。
|
|
227
|
+
|
|
228
|
+
Citation 默认不提供展开大卡片,点击固定预览;摘要按 `summary → description → 安全 URL → title` 回退,去掉 Markdown 标记。正文显示 `description`,没有时显示 `summary`。悬浮或激活时临时高亮引用所在的最近文本块(段落、标题、列表项或表格单元格),不写入已保存高亮;外部范围标注使用绑定范围。配置与存储见[标注与选区](annotations.md)。
|
|
229
|
+
|
|
230
|
+
## 图片、图组与图注
|
|
231
|
+
|
|
232
|
+
```markdown
|
|
233
|
+
<figures columns="2" min-width="220" max-width="560" max-height="480">
|
|
234
|
+
|
|
235
|
+
<figure src="/figures/a.png" alt="实验 A" caption="(a) 实验 A" />
|
|
236
|
+
|
|
237
|
+
<figure id="experiment-b">
|
|
238
|
+
|
|
239
|
+

|
|
240
|
+
|
|
241
|
+
<figcaption>**(b)** 支持 Markdown 的图注。</figcaption>
|
|
242
|
+
|
|
243
|
+
</figure>
|
|
244
|
+
|
|
245
|
+
<figcaption>图 1 · 两个实验。</figcaption>
|
|
246
|
+
|
|
247
|
+
</figures>
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
实际效果(可交互):
|
|
251
|
+
|
|
252
|
+
<figures columns="2" min-width="220" max-width="560" max-height="480">
|
|
253
|
+
|
|
254
|
+
<figure src="../assets/source.svg" alt="实验 A" caption="(a) 实验 A" />
|
|
255
|
+
|
|
256
|
+
<figure id="experiment-b">
|
|
257
|
+
|
|
258
|
+

|
|
259
|
+
|
|
260
|
+
<figcaption>**(b)** 支持 Markdown 的图注。</figcaption>
|
|
261
|
+
|
|
262
|
+
</figure>
|
|
263
|
+
|
|
264
|
+
<figcaption>图 1 · 两个实验。</figcaption>
|
|
265
|
+
|
|
266
|
+
</figures>
|
|
267
|
+
|
|
268
|
+
`figure` 可独立使用。图片可以来自 `src` / `url` 属性、内部 Markdown 图片或 `<img src="…" alt="…" />`。每个 figure 放一张图;多张图用 figures。图注可用 `caption` 属性或 `figcaption` / `caption` 子标签,富文本使用子标签。`id` 可作为页内链接目标。
|
|
269
|
+
|
|
270
|
+
| 属性 | 默认值 | 说明 |
|
|
271
|
+
| --- | --- | --- |
|
|
272
|
+
| `min-width` / `min-height` | 220 / 120 | 决定何时增加列,窄容器优先适应宽度 |
|
|
273
|
+
| `max-width` / `max-height` | 560 / 480 | 保持比例的图片上限;`none` / `false` 取消上限 |
|
|
274
|
+
| `columns` / `cols` | 自动 | 指定列数,最多 24 |
|
|
275
|
+
| `rows` | 自动 | 未指定列数时由图数推导列数 |
|
|
276
|
+
| `responsive` | true | 容器不足时降低显式列数;false 保留列数 |
|
|
277
|
+
| `gap` | 16 | 图组间距,像素 |
|
|
278
|
+
|
|
279
|
+
尺寸接受非负数字或 `px`。图组限制由子图继承,子图可以覆盖。对应工厂参数为驼峰命名,例如 `figures({ maxHeight: 360, maxWidth: false })`。图片不变形、不裁切图注。单图复制按钮复制图片 URL;图组复制按钮复制 Markdown 源码,不下载图片二进制。
|
|
280
|
+
|
|
281
|
+
指令示例:
|
|
282
|
+
|
|
283
|
+
```markdown
|
|
284
|
+
:::figures{columns="2"}
|
|
285
|
+
::figure{src="/a.png" caption="A"}
|
|
286
|
+
::figure{src="/b.png" caption="B"}
|
|
287
|
+
:::
|
|
288
|
+
```
|
|
289
|
+
|
|
290
|
+
## 视频
|
|
291
|
+
|
|
292
|
+
```markdown
|
|
293
|
+
<video src="/demo.mp4" provider="native" title="演示" />
|
|
294
|
+
|
|
295
|
+
<md-video url="https://www.youtube.com/watch?v=dQw4w9WgXcQ" loading="click" />
|
|
296
|
+
|
|
297
|
+
<video url="https://www.bilibili.com/video/BV1xx411c7mD/?p=2" />
|
|
298
|
+
```
|
|
299
|
+
|
|
300
|
+
`url` 优先于 `src`;`provider` 默认 `auto`,还可以是 `native`、`youtube`、`bilibili`。YouTube 支持 watch、短链接、embed、shorts、live 和起始时间;Bilibili 支持 BV/av 与分 P。支持 `title` 和 `loading`。
|
|
301
|
+
|
|
302
|
+
**默认 `loading="visible"`**:在视口附近 200px 挂载播放器,不自动播放。`click` 等待点击,`eager` 立即挂载。可以用 `video({ loading: 'click' })` 设置模块默认值。平台、网络和嵌入权限仍会影响真实播放;不能把本地 iframe 测试当作远程播放保证。自定义平台通过 `video({ resolveUrl })` 接入。
|
|
303
|
+
|
|
304
|
+
点击加载的视频示例(点击前不创建播放器):
|
|
305
|
+
|
|
306
|
+
<video url="https://www.youtube.com/watch?v=dQw4w9WgXcQ" loading="click" title="视频示例" />
|
|
307
|
+
|
|
308
|
+
## 分段译文
|
|
309
|
+
|
|
310
|
+
```markdown
|
|
311
|
+
<translations default="both">
|
|
312
|
+
|
|
313
|
+
<origin>
|
|
314
|
+
|
|
315
|
+
Original **Markdown**.
|
|
316
|
+
|
|
317
|
+
</origin>
|
|
318
|
+
|
|
319
|
+
<translation>
|
|
320
|
+
|
|
321
|
+
翻译后的 **Markdown**。
|
|
322
|
+
|
|
323
|
+
</translation>
|
|
324
|
+
|
|
325
|
+
</translations>
|
|
326
|
+
```
|
|
327
|
+
|
|
328
|
+
实际效果(可交互):
|
|
329
|
+
|
|
330
|
+
<translations default="both">
|
|
331
|
+
|
|
332
|
+
<origin>
|
|
333
|
+
|
|
334
|
+
Original **Markdown**.
|
|
335
|
+
|
|
336
|
+
</origin>
|
|
337
|
+
|
|
338
|
+
<translation>
|
|
339
|
+
|
|
340
|
+
翻译后的 **Markdown**。
|
|
341
|
+
|
|
342
|
+
</translation>
|
|
343
|
+
|
|
344
|
+
</translations>
|
|
345
|
+
|
|
346
|
+
`default` 为 `origin`、`translation` 或 `both`,未指定时默认 `origin`(可用工厂 `defaultMode` 改写)。角标依次切换原文、译文、对照;对照时译文在前。流式输入只有一侧时先显示已有内容。模块不提供自动翻译服务。
|
|
347
|
+
|
|
348
|
+
全局 `parameters.translationMode` 覆盖各块;传 `onTranslationModeChange` 接受角标发出的更改请求,否则全局模式锁定。设回 `undefined` 恢复各块的本地选择。见[项目集成](integration.md)。
|
|
349
|
+
|
|
350
|
+
## 选择与替换
|
|
351
|
+
|
|
352
|
+
默认高亮存为 annotation,没有 `==高亮==` 内置语法。自定义标签需注册插件;不是所有子标签都有同名指令。使用完整清单配置或替换默认模块,见[扩展开发](extensions.md)。
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { AnnotationCard, AnnotationMarkdown, defineExtension, type AnnotationContentProps, type AnnotationOverlayCardProps, type AnnotationSidebarPreviewProps, type RendererExtension, type SelectionSnapshot } from '@linloir/limr';
|
|
2
|
+
import type { ReactNode } from 'react';
|
|
3
|
+
|
|
4
|
+
/** Your application owns transport, authentication and conversation storage. */
|
|
5
|
+
export interface AssistantAdapter {
|
|
6
|
+
answer: (request: { selection: SelectionSnapshot; question: string; signal: AbortSignal }) => AsyncIterable<string>;
|
|
7
|
+
}
|
|
8
|
+
interface AnswerData { text: string; question?: string; status: 'streaming' | 'complete' | 'error'; error?: string }
|
|
9
|
+
const assistantIcon = <svg viewBox="0 0 16 16" fill="none" aria-hidden="true"><path d="m8 2 1.8 4.2L14 8l-4.2 1.8L8 14l-1.8-4.2L2 8l4.2-1.8L8 2Z" fill="currentColor" /></svg>;
|
|
10
|
+
|
|
11
|
+
/** Example application plugin. This is deliberately not a LiMR default module. */
|
|
12
|
+
export function assistant({ adapter, type = 'assistant', label = 'Ask assistant', icon = assistantIcon, color = '#8b5cf6', prompt = selection => `Explain “${selection.text}”` }: {
|
|
13
|
+
adapter: AssistantAdapter; type?: string; label?: string; icon?: ReactNode; color?: string; prompt?: (selection: SelectionSnapshot) => string;
|
|
14
|
+
}): RendererExtension {
|
|
15
|
+
function Card(props: AnnotationOverlayCardProps<AnswerData>) {
|
|
16
|
+
return <AnnotationCard {...props} title={label} />;
|
|
17
|
+
}
|
|
18
|
+
function Answer({ data }: AnnotationContentProps<AnswerData>) {
|
|
19
|
+
return <div aria-busy={data?.status === 'streaming'}>
|
|
20
|
+
<AnnotationMarkdown source={data?.text || '…'} streaming={data?.status === 'streaming'} />
|
|
21
|
+
{data?.status === 'error' && <p role="alert">{data.error}</p>}
|
|
22
|
+
</div>;
|
|
23
|
+
}
|
|
24
|
+
function Preview({ data, referenceText }: AnnotationSidebarPreviewProps<AnswerData>) {
|
|
25
|
+
const question = data?.question || referenceText;
|
|
26
|
+
return question ? <span title={question}>{question}</span> : null;
|
|
27
|
+
}
|
|
28
|
+
return defineExtension({
|
|
29
|
+
name: type,
|
|
30
|
+
annotationTypes: [{ type, label, icon, color, Content: Answer, sidebar: { Preview }, overlay: { Card, expand: { placement: 'center', width: 680, height: '80dvh' } } }],
|
|
31
|
+
actions: [{ id: `${type}:ask`, label, icon: icon ?? assistantIcon, async run(context) {
|
|
32
|
+
const id = `${type}-${crypto.randomUUID()}`;
|
|
33
|
+
const question = prompt(context.selection);
|
|
34
|
+
let text = '';
|
|
35
|
+
context.addAnnotation({ id, type, data: { text, question, status: 'streaming' } satisfies AnswerData, anchors: context.selection.syntax.ranges.map(range => ({
|
|
36
|
+
range, documentId: context.document.id, quote: context.document.source.slice(range.start, range.end),
|
|
37
|
+
})) });
|
|
38
|
+
context.activateAnnotation(id);
|
|
39
|
+
context.clearSelection();
|
|
40
|
+
try {
|
|
41
|
+
for await (const chunk of adapter.answer({ selection: context.selection, question, signal: context.signal })) {
|
|
42
|
+
if (context.signal.aborted) return;
|
|
43
|
+
text += chunk;
|
|
44
|
+
context.updateAnnotation(id, { data: { text, question, status: 'streaming' } satisfies AnswerData });
|
|
45
|
+
}
|
|
46
|
+
if (!context.signal.aborted) context.updateAnnotation(id, { data: { text, question, status: 'complete' } satisfies AnswerData });
|
|
47
|
+
} catch (error) {
|
|
48
|
+
if (!context.signal.aborted) context.updateAnnotation(id, { data: { text, question, status: 'error', error: error instanceof Error ? error.message : String(error) } satisfies AnswerData });
|
|
49
|
+
}
|
|
50
|
+
} }],
|
|
51
|
+
});
|
|
52
|
+
}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { useEffect, useLayoutEffect, useRef } from 'react';
|
|
2
|
+
import { AnnotationMarkdown, ToolIcon, defineExtension, useLiMR, useLocale, type AnnotationContentProps, type RendererExtension } from '@linloir/limr';
|
|
3
|
+
|
|
4
|
+
interface NoteData { text: string; draft?: string }
|
|
5
|
+
const kinds = [
|
|
6
|
+
{ type: 'margin-note', label: '旁注', icon: 'comment', color: '#81B29A', hint: '在段落旁留下一个想法', labelEn: 'Margin note', hintEn: 'Leave a thought beside this passage' },
|
|
7
|
+
{ type: 'reading-note', label: '笔记', icon: 'note', color: '#6B9BD2', hint: '整理这一段的阅读笔记', labelEn: 'Note', hintEn: 'Write a reading note' },
|
|
8
|
+
{ type: 'reader-question', label: '提问', icon: 'question', color: '#E5A06E', hint: '写下还想进一步理解的问题', labelEn: 'Question', hintEn: 'What would you like to understand?' },
|
|
9
|
+
{ type: 'reader-footnote', label: '脚注', icon: 'footnote', color: '#B39DDB', hint: '补充解释或参考来源', labelEn: 'Footnote', hintEn: 'Add an explanation or a source' },
|
|
10
|
+
] as const;
|
|
11
|
+
|
|
12
|
+
function NoteContent({ annotation, data, editing, presentation }: AnnotationContentProps<NoteData>) {
|
|
13
|
+
const commands = useLiMR();
|
|
14
|
+
const locale = useLocale();
|
|
15
|
+
const zh = locale.language?.startsWith('zh') ?? false;
|
|
16
|
+
const text = data?.draft ?? data?.text ?? '';
|
|
17
|
+
const isEditing = editing || data?.draft !== undefined;
|
|
18
|
+
const input = useRef<HTMLTextAreaElement>(null);
|
|
19
|
+
const kind = kinds.find(kind => kind.type === annotation.type)!;
|
|
20
|
+
useEffect(() => {
|
|
21
|
+
if (!isEditing) return;
|
|
22
|
+
if (presentation === 'preview') return;
|
|
23
|
+
const frame = requestAnimationFrame(() => {
|
|
24
|
+
const field = input.current;
|
|
25
|
+
if (field) { field.focus({ preventScroll: true }); field.selectionStart = field.selectionEnd = field.value.length; }
|
|
26
|
+
});
|
|
27
|
+
return () => cancelAnimationFrame(frame);
|
|
28
|
+
}, [isEditing, presentation]);
|
|
29
|
+
useLayoutEffect(() => {
|
|
30
|
+
const field = input.current;
|
|
31
|
+
if (!field) return;
|
|
32
|
+
const resize = () => { field.style.height = 'auto'; field.style.height = `${field.scrollHeight}px`; };
|
|
33
|
+
resize();
|
|
34
|
+
// The same draft can move between a narrow card and the wider sidebar.
|
|
35
|
+
let width = field.clientWidth;
|
|
36
|
+
const observer = new ResizeObserver(() => { if (field.clientWidth !== width) { width = field.clientWidth; resize(); } });
|
|
37
|
+
observer.observe(field.parentElement!);
|
|
38
|
+
return () => observer.disconnect();
|
|
39
|
+
}, [isEditing, text]);
|
|
40
|
+
const save = () => {
|
|
41
|
+
if (!text.trim()) return;
|
|
42
|
+
commands.updateAnnotation(annotation.id, { data: { text } }); commands.editAnnotation(null);
|
|
43
|
+
};
|
|
44
|
+
const cancel = () => {
|
|
45
|
+
if (!data?.text.trim()) commands.removeAnnotation(annotation.id);
|
|
46
|
+
else { commands.updateAnnotation(annotation.id, { data: { text: data.text } }); commands.editAnnotation(null); }
|
|
47
|
+
};
|
|
48
|
+
return <div className="demo-note-content" data-limr-card-interactive="true">
|
|
49
|
+
{isEditing ? <form onSubmit={event => { event.preventDefault(); save(); }}>
|
|
50
|
+
<textarea className="demo-note-editor" ref={input} aria-label={zh ? `${kind.label}内容` : `${kind.labelEn} content`} rows={1} value={text} onChange={event => commands.updateAnnotation(annotation.id, { data: { text: data?.text ?? '', draft: event.target.value } })} placeholder={zh ? kind.hint : kind.hintEn} onKeyDown={event => {
|
|
51
|
+
if (event.nativeEvent.isComposing) return;
|
|
52
|
+
if (event.key === 'Escape') { event.preventDefault(); event.stopPropagation(); cancel(); }
|
|
53
|
+
else if (event.key === 'Enter' && (event.metaKey || event.ctrlKey)) { event.preventDefault(); save(); }
|
|
54
|
+
}} />
|
|
55
|
+
<div className="demo-note-actions"><button type="button" onClick={cancel}><ToolIcon name="close" /><span className="limr-underline">{zh ? '取消' : 'Cancel'}</span></button><button type="submit" className="demo-note-submit" disabled={!text.trim()}><ToolIcon name="check" /><span className="limr-underline">{locale.submit}</span></button></div>
|
|
56
|
+
</form> : <><AnnotationMarkdown source={data?.text || (zh ? '还没有内容。' : 'No content yet.')} /><div className="demo-note-actions"><button type="button" onClick={() => { commands.updateAnnotation(annotation.id, { data: { text: data?.text ?? '', draft: data?.text ?? '' } }); commands.editAnnotation(annotation.id); }}><ToolIcon name="edit" /><span className="limr-underline">{zh ? '修改' : 'Edit'}</span></button><button type="button" className="demo-note-delete" onClick={() => commands.removeAnnotation(annotation.id)}><ToolIcon name="trash" /><span className="limr-underline">{locale.deleteAnnotations}</span></button></div></>}
|
|
57
|
+
</div>;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
function NotePreview({ data }: { data?: NoteData }) {
|
|
61
|
+
const locale = useLocale();
|
|
62
|
+
return <span>{data?.text || (locale.language?.startsWith('zh') ? '正在编辑…' : 'Editing…')}</span>;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/** Modules bind every footnote/note/question through the same annotation API. */
|
|
66
|
+
export function readingNotes(): RendererExtension {
|
|
67
|
+
return defineExtension({
|
|
68
|
+
name: 'reading-notes',
|
|
69
|
+
annotationTypes: kinds.map(kind => ({ type: kind.type, label: locale => locale.language?.startsWith('zh') ? kind.label : kind.labelEn, color: kind.color, icon: <ToolIcon name={kind.icon} />, Content: NoteContent,
|
|
70
|
+
sidebar: { Preview: NotePreview },
|
|
71
|
+
overlay: { previewWidth: 300, expand: { placement: 'center' as const, width: 400, maxHeight: '75dvh' } },
|
|
72
|
+
})),
|
|
73
|
+
actions: kinds.map(kind => ({ id: `reading-notes:${kind.type}`, label: context => context.locale.language?.startsWith('zh') ? kind.label : kind.labelEn, icon: <ToolIcon name={kind.icon} />, run: context => {
|
|
74
|
+
context.addAnnotation({ id: `note-${crypto.randomUUID()}`, type: kind.type, data: { text: '', draft: '' } satisfies NoteData,
|
|
75
|
+
anchors: context.selection.syntax.ranges.map(range => ({ range, documentId: context.document.id, quote: context.document.source.slice(range.start, range.end) })),
|
|
76
|
+
}, { edit: true });
|
|
77
|
+
context.clearSelection();
|
|
78
|
+
} })),
|
|
79
|
+
});
|
|
80
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/* Unlayered application/theme CSS overrides the built-in @layer limr. */
|
|
2
|
+
[data-limr-appearance='paper'] {
|
|
3
|
+
--limr-accent: #185145;
|
|
4
|
+
--limr-link: #185145;
|
|
5
|
+
--limr-selection: #548b7440;
|
|
6
|
+
--limr-background: #fcfaf4;
|
|
7
|
+
--limr-heading: #283b34;
|
|
8
|
+
}
|
|
9
|
+
[data-limr-appearance='paper'][data-limr-theme='dark'] {
|
|
10
|
+
--limr-background: #1e2421;
|
|
11
|
+
--limr-heading: #d8e4db;
|
|
12
|
+
--limr-link: #a8cbb8;
|
|
13
|
+
}
|
|
14
|
+
[data-limr-appearance='paper'] .reading-tip {
|
|
15
|
+
border-inline-start: 3px solid var(--limr-accent);
|
|
16
|
+
padding: .8rem 1rem;
|
|
17
|
+
background: #548b7410;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/* The same appearance selector is applied to portalled toolbars. */
|
|
21
|
+
.limr-selection-toolbar[data-limr-appearance='paper'] {
|
|
22
|
+
--limr-toolbar-radius: 3px;
|
|
23
|
+
--limr-toolbar-panel-max-height: 190px;
|
|
24
|
+
--limr-toolbar-accent: var(--limr-accent);
|
|
25
|
+
}
|