mirror of
https://codeberg.org/uzu/strudel
synced 2026-07-22 13:13:10 -04:00
Compare commits
1103 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| bb347badbd | |||
| b135d3dc63 | |||
| 297712e7ef | |||
| b15843f3a7 | |||
| 86333ab6f6 | |||
| 003e3b790d | |||
| 4048ced7e6 | |||
| 64b99f5a8c | |||
| b4af840240 | |||
| 8a502e886e | |||
| c7ee90922f | |||
| 530339ed8f | |||
| fece4e8b57 | |||
| afdcd42039 | |||
| 690b8648a8 | |||
| 7c1e968d41 | |||
| c0b3187029 | |||
| af1f7658c7 | |||
| b531962b1f | |||
| 8867a843ac | |||
| 6e972f4380 | |||
| 65282bf5ea | |||
| 3df9744d79 | |||
| 5a5bbfc8da | |||
| f66478b9da | |||
| 904c213d03 | |||
| d9c3f051b9 | |||
| 470a345296 | |||
| 0925ea56dd | |||
| 1f233b9e7d | |||
| 5c5d411588 | |||
| bbb88a2302 | |||
| 64c94b3623 | |||
| 42c2262576 | |||
| 4959bff060 | |||
| 1ded398468 | |||
| b664bd3d1f | |||
| dfb7d7bb7f | |||
| 3e6a45cf8b | |||
| f47f5c1344 | |||
| 47f65da621 | |||
| c210ea3f89 | |||
| 50f076084f | |||
| 5cd98880ca | |||
| aabc82bedd | |||
| 84581b22aa | |||
| 3575fc3cc8 | |||
| cf8203a4db | |||
| cda79f3e5c | |||
| 07b0a2e0f0 | |||
| 5e81b542dc | |||
| 8bde61fa27 | |||
| efd4071637 | |||
| 981ad1e242 | |||
| 49e9b84962 | |||
| 848edb1f69 | |||
| 88fb0b3b75 | |||
| dc8becc610 | |||
| e99f229b57 | |||
| c810a02a79 | |||
| 018d1ccd31 | |||
| d86df33b8c | |||
| b74d5becd5 | |||
| b87b2aff9a | |||
| 95b1548e5f | |||
| 0b1bc74c3b | |||
| ce9d23049a | |||
| 0338c5b222 | |||
| 1bf74024d4 | |||
| 63ee218d53 | |||
| 3d37478577 | |||
| f558b4b8f6 | |||
| f26a2af38e | |||
| 75f5f45652 | |||
| 5cef1a8cf9 | |||
| bcb1da826e | |||
| 1f5f1a63a6 | |||
| 44828e2047 | |||
| bcef67e5a1 | |||
| b4ef786108 | |||
| d03fc43f03 | |||
| ca00f7c5d0 | |||
| dbbe2d7c98 | |||
| 1058c272a4 | |||
| 81e97a5643 | |||
| f105ea6677 | |||
| 6307f755f7 | |||
| fac698e39c | |||
| d54022a65a | |||
| 892a686462 | |||
| fbf9d06d84 | |||
| 06415d7f14 | |||
| d353eff1f6 | |||
| ce5add4a56 | |||
| 212a478161 | |||
| 33b31fb434 | |||
| b51dacb11c | |||
| 1e59b4efa4 | |||
| e31a9965d5 | |||
| 6c537cb134 | |||
| 6062a2e757 | |||
| ac83ff8817 | |||
| b55661b21e | |||
| 638e247a5f | |||
| ff4d4357b2 | |||
| 1460defa42 | |||
| 1053c7eb38 | |||
| c09b590cf6 | |||
| 63f9f6cba0 | |||
| 9112a0c4f5 | |||
| e754070a59 | |||
| afa202e2a8 | |||
| fc3d7ade11 | |||
| d192201e07 | |||
| c9bdfe57dd | |||
| 7e1c6c1c22 | |||
| 5d3778fb27 | |||
| f362f1c9f6 | |||
| fd68ad9bde | |||
| 7222c29c55 | |||
| 234beff00e | |||
| 90fe4d3816 | |||
| 5a188f7461 | |||
| 5d98fd2ab3 | |||
| 46400effb7 | |||
| 710da1d28d | |||
| f4b8753171 | |||
| aa1efcc7ea | |||
| 3e721d91a5 | |||
| badbcdcf25 | |||
| 4f35027d9f | |||
| de7c652706 | |||
| 0e59a233ed | |||
| b3e0f180b3 | |||
| a2c896f765 | |||
| c7cd03a2aa | |||
| e6604491a9 | |||
| 1d7f755b89 | |||
| 4f6e38f714 | |||
| 35911f3082 | |||
| 024f424bf5 | |||
| 1b8ccc05e1 | |||
| 77267a80e3 | |||
| 0ca540b671 | |||
| 5731ae0cdc | |||
| 5d562e8cd6 | |||
| 9432f780f2 | |||
| 52ebfa1d09 | |||
| 6cde970e0d | |||
| 188d318125 | |||
| 8d28317d0e | |||
| fc41bd1a70 | |||
| 773420fd65 | |||
| 45fffa514a | |||
| cdf50cbaab | |||
| f61916fffa | |||
| 00b0341839 | |||
| d5ab391a98 | |||
| d2a9b9b750 | |||
| 2348023b22 | |||
| 6e5d8eed19 | |||
| c33c8b5469 | |||
| 7b6074ccef | |||
| 55c226cda6 | |||
| c5de21ef61 | |||
| 36374fb3fb | |||
| 570c7a0d6b | |||
| c3be21e6e5 | |||
| 7410ac5cec | |||
| f5127147de | |||
| 1d144faed7 | |||
| 7b914e7f22 | |||
| 052addd67e | |||
| 3d162536aa | |||
| 2443aad01b | |||
| 08f6c1ad5e | |||
| 974376d404 | |||
| 1da80db048 | |||
| 42519581c1 | |||
| 1e3bbc57cc | |||
| 9bf0f624f5 | |||
| c6418789c4 | |||
| 62d6ef2287 | |||
| 8b909c54db | |||
| 9d029ac914 | |||
| 8644b3d163 | |||
| 426c5edf25 | |||
| d30623dad4 | |||
| 49d4fb499f | |||
| e4f89f072e | |||
| e12dadb33f | |||
| 991d8e4717 | |||
| 26cc7e2920 | |||
| 04eac3e7c5 | |||
| 7cf7575e6d | |||
| b7d8593a4d | |||
| a5b05d211e | |||
| 111cea2381 | |||
| 896a3828f6 | |||
| eb02997836 | |||
| 8a33c171f5 | |||
| f87f279198 | |||
| 4cc019f038 | |||
| 34f4afad01 | |||
| 947b263b9c | |||
| 0a408e464a | |||
| 0d660277f6 | |||
| 33fef379ad | |||
| 0531369613 | |||
| c66f19108c | |||
| ef53367ba9 | |||
| f33ec0e2af | |||
| 726abf76ce | |||
| a7d74ed6d6 | |||
| 648fbf99fa | |||
| b913e1c50d | |||
| ae335ac40c | |||
| 9ecad810b1 | |||
| f18cf76dde | |||
| 08c918f13e | |||
| 2e72c7f4ed | |||
| 614f393a5d | |||
| 75f7f4deac | |||
| 2a67698616 | |||
| 801879bddf | |||
| 7d8984b706 | |||
| 1a2847d953 | |||
| e71db24073 | |||
| f61de0c47c | |||
| 53b8bbb732 | |||
| aeaf447142 | |||
| 1e6e0a61b3 | |||
| dd696ba663 | |||
| be4c8cbdce | |||
| b6b54a8553 | |||
| 1d05051fd6 | |||
| 6bca8e2a2f | |||
| 630ba62cc3 | |||
| 8ac98262bc | |||
| 6057e9ada1 | |||
| 94e8b18ffa | |||
| 2ec20c4ed4 | |||
| c4fe2c7497 | |||
| df2d28f0e5 | |||
| d9bd6f9e7d | |||
| 1e0cc2ab17 | |||
| 835c7b6879 | |||
| 721e7f06b8 | |||
| a46bbeaa10 | |||
| e3a3c0c5f9 | |||
| 67964c7e23 | |||
| 9e5f9d37ef | |||
| 0c1234a35f | |||
| c6cc487fc6 | |||
| dd171f8320 | |||
| c22c786cf2 | |||
| c191471e1e | |||
| 0d0cb3fd93 | |||
| bb4b7dc533 | |||
| 8440fa42ea | |||
| 61f070744a | |||
| 2e6a561184 | |||
| 8703d684c4 | |||
| b0d2115f43 | |||
| 96802a271c | |||
| a91f4576f3 | |||
| ad080d02b3 | |||
| e9e7e02547 | |||
| 2ffc6c9601 | |||
| 3a9349d9f5 | |||
| bd3f2845f8 | |||
| 2d320c459b | |||
| ff9f4a8a0d | |||
| d7b94807cb | |||
| 2c16a37a68 | |||
| 717e4a2c1d | |||
| c225b4719f | |||
| 25f762c393 | |||
| b75561e3c7 | |||
| abaab89061 | |||
| e409086b34 | |||
| 532f1435d9 | |||
| 6cb61ade03 | |||
| a40219ba06 | |||
| 9c99f5ada2 | |||
| 2d72c8faa0 | |||
| b188fc6b6d | |||
| bfb22228cc | |||
| 9714d88d61 | |||
| bdddb91510 | |||
| 07bcaa65a9 | |||
| 5bf1805534 | |||
| 202685e8c4 | |||
| aba633e16e | |||
| da45ce689c | |||
| acea7e435e | |||
| cb4810cbbc | |||
| 5ec205b383 | |||
| ebc0b293a9 | |||
| 4608c321bd | |||
| c4243f41c6 | |||
| d95b8bc667 | |||
| 263c13c36e | |||
| ddceb36613 | |||
| ff8ec628be | |||
| 11a07df120 | |||
| 8befa4382b | |||
| 39006e4d71 | |||
| 812ed6b60d | |||
| 8b6c8eb35d | |||
| dcda9a5753 | |||
| d3733d4209 | |||
| ef6af96947 | |||
| d86ff0a536 | |||
| 2c9ea03fde | |||
| 4eae366bee | |||
| 117f7fa4b5 | |||
| 73ee84a1fb | |||
| 9c899d5308 | |||
| b60beaf508 | |||
| 796f741a92 | |||
| 8da1d9fbf3 | |||
| 5345986b5b | |||
| 3945abd7e9 | |||
| 053e4ee54b | |||
| 25d61a2e31 | |||
| 5e6131af24 | |||
| 2899ee5aef | |||
| 9d1674b13c | |||
| bfead58212 | |||
| 926c893c4f | |||
| 3cd31e4841 | |||
| c2be2ed76a | |||
| ac0dc7a8de | |||
| cba9169b2f | |||
| e9a0a06b77 | |||
| d80c06cd55 | |||
| d850726910 | |||
| 1b01f41ffd | |||
| ad00fa65f8 | |||
| 814babbf7a | |||
| 28334ec94d | |||
| 7d2110d75f | |||
| 94ccfa631e | |||
| c7c56a1357 | |||
| d40e4dac2f | |||
| 686247f0cb | |||
| dffeac41af | |||
| 6e496b7a4a | |||
| 71e843e1a3 | |||
| 61ba33043e | |||
| 943d78f268 | |||
| 5ac59e95dd | |||
| 03bbc0bc27 | |||
| 4c3457438d | |||
| 85bccdcc19 | |||
| 94c07b6b7a | |||
| 42000a7628 | |||
| f514cd85b1 | |||
| d53929cf68 | |||
| a4bd0ae100 | |||
| 283a071c86 | |||
| b5fbcd108f | |||
| 6350cfdb9c | |||
| 5e9da78e64 | |||
| f3b83b41f5 | |||
| 1d95da7a3a | |||
| 2a2ddf205a | |||
| 6c9e0aaa1a | |||
| d23038d386 | |||
| 248f67d1ab | |||
| f3fa1483d7 | |||
| 11102adb75 | |||
| 9f958abb08 | |||
| b72e71b0bd | |||
| 065b24a2ee | |||
| 758b94776d | |||
| e6f3b1f1ef | |||
| e62d5759e7 | |||
| c403a92542 | |||
| 269d6dde31 | |||
| 666c695c63 | |||
| 771eb31d3f | |||
| c05bbf3422 | |||
| 364f511a7c | |||
| 300022d8ac | |||
| 357fbf8c82 | |||
| 1acb675f5a | |||
| ab1086318c | |||
| 8c73ad088a | |||
| 25981092b1 | |||
| e6b55baed0 | |||
| 6adf1ff977 | |||
| b6e277f1ea | |||
| d0510f862a | |||
| 4a87df6426 | |||
| bf90867685 | |||
| 3dc5fd0e7e | |||
| a7650f1af3 | |||
| aadb2fee84 | |||
| bf391ad6ce | |||
| faba4a4e4e | |||
| 94e411aa7a | |||
| ffa21ddf0d | |||
| 6b2d080afc | |||
| 321a888921 | |||
| bf7fe2bf75 | |||
| 1fd9ba5dbf | |||
| 1fca6f25b8 | |||
| 0e6a17fc77 | |||
| 375c68775c | |||
| 827993a8c9 | |||
| 2aa1acfd95 | |||
| 2febbaf40b | |||
| e29876e7f6 | |||
| 3ce32438d6 | |||
| a17351e11e | |||
| 94f5886466 | |||
| 1a72b9e526 | |||
| 1eef2c2511 | |||
| 05289b171b | |||
| 33322be948 | |||
| 6f7f415747 | |||
| 7a4902862d | |||
| c20e84773b | |||
| 5c9a16bc88 | |||
| 07f58c023f | |||
| 08f0825561 | |||
| 2cda78d2db | |||
| ff85f2307f | |||
| af3d32a493 | |||
| c0c54c21e3 | |||
| 8be5e9d2eb | |||
| 589dfaf8cc | |||
| 3cd31b2290 | |||
| 65856409b6 | |||
| e408fedaf6 | |||
| d424b118ff | |||
| 492878754a | |||
| d86a183194 | |||
| 6325d726a5 | |||
| 553045e666 | |||
| 4733264fb3 | |||
| 0efac42d92 | |||
| be6634f919 | |||
| 2901369471 | |||
| 61d795af31 | |||
| 2bae6e06c0 | |||
| d9214b91b6 | |||
| 5348a6b2d8 | |||
| 35e9385f59 | |||
| bf5e66d69a | |||
| 3cacafff90 | |||
| e2ce5ea001 | |||
| 8f7194144d | |||
| 12cb5b0939 | |||
| 1ad118d877 | |||
| bf73610b0a | |||
| 8f1496cebe | |||
| 7efbee0646 | |||
| aec7417c14 | |||
| 026cbe050c | |||
| 8710cd446b | |||
| cad27301db | |||
| 98cb128fa2 | |||
| 9bb1039bbd | |||
| 7952dfa5e9 | |||
| 1666fc5649 | |||
| b19c737c82 | |||
| 2d3a9b800f | |||
| e60e9b2fdd | |||
| 94529549a9 | |||
| 90dfa5170c | |||
| c797fea1f7 | |||
| 841d897d0a | |||
| 9774e9627b | |||
| 888e0d4751 | |||
| 1595a4ece3 | |||
| 1cebfd1835 | |||
| 8ea50fbe7d | |||
| 349f902dc0 | |||
| 8b1df7ce85 | |||
| 892a0abe78 | |||
| a214b1b224 | |||
| eed4a83b71 | |||
| 17e2ee4a3b | |||
| b8085e9dc3 | |||
| 1952e4d49a | |||
| be65a10925 | |||
| 255c283ae4 | |||
| 84a8ca9d19 | |||
| 25064b427d | |||
| 1761fa0346 | |||
| dd29c5b09e | |||
| ef331f25e0 | |||
| 1bc1346f54 | |||
| 373b63c700 | |||
| 41444ccd58 | |||
| fe1e10297c | |||
| e483f4c3d3 | |||
| 574c5285b9 | |||
| 5e4eefa553 | |||
| 8ac409f03c | |||
| c4b3d48498 | |||
| 8f86bbc6ba | |||
| 97568300cb | |||
| bce24980cb | |||
| 33ca43a234 | |||
| d0ecf15f77 | |||
| e87055d583 | |||
| 9b52807c7e | |||
| a8eafbc309 | |||
| b0edf74aee | |||
| a8dce19902 | |||
| dcd828a117 | |||
| aa2466b2cc | |||
| a94ddc7947 | |||
| e6f272dd0c | |||
| 4160639d88 | |||
| 5fb3aadad9 | |||
| 3b4ae44fb3 | |||
| 2499c4057c | |||
| 71f8c0745c | |||
| d132344d11 | |||
| b4f1cedc20 | |||
| 5b89500acd | |||
| a35e9aef0e | |||
| fd950d4476 | |||
| d108de40d0 | |||
| 5f8da04cd8 | |||
| def5bc858f | |||
| a9fa6f14fb | |||
| 846c12806e | |||
| 70e938b767 | |||
| f54f80e698 | |||
| 8c480807d2 | |||
| bbeb243cea | |||
| 0123f4e5f3 | |||
| c232fb7dd5 | |||
| 69a5d62027 | |||
| ed506cabb5 | |||
| d49c9dce4f | |||
| 16ad27406d | |||
| 803b5e56fc | |||
| 29598d1744 | |||
| eba7dec1a5 | |||
| 09e455e17e | |||
| 2aac085bb8 | |||
| 733d6ec673 | |||
| 179931be88 | |||
| 9d5acc0f32 | |||
| 226cf356d6 | |||
| 4ade86f75c | |||
| 73d49f152a | |||
| 83e46037d2 | |||
| 95ae5191ce | |||
| e268802f3c | |||
| 55c7f2b575 | |||
| a69563cb9b | |||
| 33ebf08e81 | |||
| 02ea4d1116 | |||
| 27d8bae671 | |||
| 5dc2ecd741 | |||
| 6e6a2439c3 | |||
| 6249631a72 | |||
| b69b9c37cd | |||
| 7f22040a0c | |||
| 956ceb8aa4 | |||
| e47d67a9da | |||
| 8e2d883e86 | |||
| 8db443ba26 | |||
| 34e9d73908 | |||
| deed379dba | |||
| 5b4322c964 | |||
| 91bb0a1d36 | |||
| 47b65846e9 | |||
| 55eafaf4d8 | |||
| 2e3869c0e0 | |||
| 4015a11bd2 | |||
| 15f16006d0 | |||
| ce79a44848 | |||
| d253e35b6c | |||
| 19ef941c9d | |||
| ac7658d0a0 | |||
| 635a6c62b0 | |||
| acc100da5c | |||
| 69f8498d4b | |||
| 975eb684b9 | |||
| 6b919132aa | |||
| 5c4ad57309 | |||
| 0be5f77247 | |||
| bbf8577f85 | |||
| d8eb186ee4 | |||
| 54829bd28c | |||
| 5c01760b28 | |||
| a189626e8b | |||
| 6a1fa7e67f | |||
| 267f58b7be | |||
| 9348a8015a | |||
| 57ad278137 | |||
| 5d8eea7299 | |||
| 0a3694fb82 | |||
| a194180130 | |||
| 64cc8caeec | |||
| f427b56062 | |||
| 93d151b943 | |||
| 5ca9afa9e8 | |||
| e0c4997f1e | |||
| 07791001dd | |||
| 936d6fdafb | |||
| 81b33afcdb | |||
| 0190604a7f | |||
| 8494353ace | |||
| 971d497e81 | |||
| ca36a31f79 | |||
| 559f31792f | |||
| 83eedcb2f5 | |||
| a3bd04732c | |||
| e8ed57f588 | |||
| ebeefc0ac4 | |||
| 3d06528393 | |||
| 558e9e36ff | |||
| 0a6373f64c | |||
| 0f24e97855 | |||
| cbfa09a2da | |||
| 3805195109 | |||
| 183d3ea4a1 | |||
| 8e4549d6d3 | |||
| 506989b0d7 | |||
| 8f475515e9 | |||
| df23ea6cdf | |||
| bea25a28cb | |||
| a4897adb83 | |||
| 0ba4be0571 | |||
| ca8707f32a | |||
| 18abcaccbb | |||
| 6ff7697cfd | |||
| 915a4d2149 | |||
| 3a4ffb13ad | |||
| 610c848ff4 | |||
| d06b70c28d | |||
| fde0da3b19 | |||
| 97d292adbb | |||
| e242e82b3f | |||
| 6479c60387 | |||
| c7f811e14d | |||
| 539160630d | |||
| 8a3e9171a4 | |||
| 010329dcfc | |||
| cdba9efb59 | |||
| 16851cf8f8 | |||
| 8f06bc4b57 | |||
| 7839d6b4bf | |||
| eb3e6d60b9 | |||
| fd08b25388 | |||
| ff923a6b6e | |||
| 30a15cb4b7 | |||
| 7d8cb59a7a | |||
| 1aca5db447 | |||
| 2fbd9a3d54 | |||
| 934a3cdec4 | |||
| f987633498 | |||
| 1a209c8b82 | |||
| 3e66e1ee93 | |||
| e39cd2c9cd | |||
| 8a8f6a66a4 | |||
| b6171600c2 | |||
| 3a60f63fd2 | |||
| 422a9ad525 | |||
| 29fe4fd907 | |||
| 22774596ca | |||
| 8f355dcf96 | |||
| abe775c3fd | |||
| 95e0496d51 | |||
| bd9a80827e | |||
| 39204ad94d | |||
| 1e8a3c2918 | |||
| 1af55c0d19 | |||
| a1e07f3079 | |||
| 4e7f5e9cda | |||
| 12d8cdff92 | |||
| 9c66d9f1a7 | |||
| e2b4f6f5ac | |||
| 50ed466895 | |||
| 126556634a | |||
| aa25265cc2 | |||
| 73558eb49c | |||
| cc49e0f78e | |||
| 6c07feb312 | |||
| a8c2586da6 | |||
| c400deac74 | |||
| 6a2486d9f2 | |||
| b5720355f9 | |||
| ab015ff48a | |||
| eb8ac29136 | |||
| 14b1a1203f | |||
| 060d2cfe2b | |||
| 04a0952a22 | |||
| 1a0dff4081 | |||
| 2fd2bdba60 | |||
| 2e8ae38d33 | |||
| bbfdd2cc32 | |||
| 4086df95b7 | |||
| aba4e72d29 | |||
| 8b96e3a6d1 | |||
| 731d545a3f | |||
| e6eb6c19a8 | |||
| af35a1af09 | |||
| fc4c70c94f | |||
| 064bff6e40 | |||
| 69211b8701 | |||
| 33f4f5fccc | |||
| af740c3abb | |||
| 8e2407cfa9 | |||
| 86c945114d | |||
| bd16b403e3 | |||
| f00a08ef9e | |||
| 31067d5cb5 | |||
| bc917dcf8b | |||
| 619ca5385d | |||
| aa36d25b9a | |||
| fe1fc81f42 | |||
| 34373a9d73 | |||
| 16210e121f | |||
| 53af147ede | |||
| fc32981886 | |||
| aede6e4b26 | |||
| ac36423f85 | |||
| 4071c1af18 | |||
| 49e381f258 | |||
| 21f5d639a3 | |||
| 0eccbae048 | |||
| a629c5c931 | |||
| f83a156317 | |||
| 2857e816d2 | |||
| c2ef90d67c | |||
| 2cc92a2b93 | |||
| 13d56b6b28 | |||
| d036635915 | |||
| 5537652497 | |||
| f1d491d52e | |||
| d299e76c82 | |||
| 52d3ee0f85 | |||
| 4f0f388ca2 | |||
| df03e9a379 | |||
| 52a311aae6 | |||
| 6365e1626c | |||
| 8d96a071d6 | |||
| e8f6124a07 | |||
| 14a5e7dcb6 | |||
| 7889017434 | |||
| ba8f996103 | |||
| 8d8c843ccf | |||
| a46bd9b36e | |||
| 96a977990a | |||
| 41a40c74ef | |||
| 837dfcaba4 | |||
| ac441b4340 | |||
| 4362cb9317 | |||
| dc977b292d | |||
| 10bd668033 | |||
| 5d0abe4151 | |||
| 89ec87d32a | |||
| 1d48d5d5ef | |||
| 0565558e21 | |||
| 6320d3c08c | |||
| 4511732252 | |||
| f5c087fc2a | |||
| d2fc784060 | |||
| be2ec969c4 | |||
| 456250a176 | |||
| cbe7e69e13 | |||
| d3a17891f8 | |||
| e32c965a4b | |||
| 5982e3ebea | |||
| ea58238453 | |||
| 1e1dbd6085 | |||
| 6b98e414c6 | |||
| 29cb6195b3 | |||
| d99af7c4ad | |||
| 48e4051310 | |||
| 95446a76ef | |||
| 6d874af45f | |||
| dad18a24fb | |||
| 8b9a2e1d84 | |||
| dd16a1cbf4 | |||
| 2900401d3e | |||
| b5312c27dc | |||
| 4319c43ceb | |||
| be77882d70 | |||
| 78f816978c | |||
| 076b6f1c82 | |||
| 0978fbb15e | |||
| 2de18846b0 | |||
| a71a167133 | |||
| 6359bbe139 | |||
| d1c713fa29 | |||
| 16506c5ae2 | |||
| 398533877c | |||
| cdc200e1da | |||
| dd78dc9606 | |||
| ef284e9d13 | |||
| f4032dad22 | |||
| 5d55b9c9ef | |||
| d9d05e21c0 | |||
| 1043baf08a | |||
| dfd22b5e44 | |||
| 4a95bf67da | |||
| 8742d50bad | |||
| 6dce9d5deb | |||
| a8712fd8ce | |||
| 8f291b0f80 | |||
| 7f9cc7cd2d | |||
| d102e1dbbc | |||
| 83ea3bb138 | |||
| 1f39e1c04d | |||
| 48e0691eec | |||
| fd946107df | |||
| 094b30cd26 | |||
| 708675077f | |||
| 82c4926f19 | |||
| 29dab578e7 | |||
| 1e75f045b7 | |||
| cfdd4ac36c | |||
| f2e16f946c | |||
| 0a1da6f651 | |||
| 062e45ee6a | |||
| 83145784d7 | |||
| 486e6457a9 | |||
| 7efea5726b | |||
| 7eb2f7659e | |||
| 112ca1875a | |||
| bc641d8e4c | |||
| d0c68e91dc | |||
| c373a0473b | |||
| 708fea637c | |||
| c5a4184437 | |||
| 446cf8c694 | |||
| 3df776d062 | |||
| ae7807643b | |||
| 5ebaa3e1ce | |||
| 4a25eab01a | |||
| e885e05a7a | |||
| 012b19c79e | |||
| 0875e805b4 | |||
| f1700d5e47 | |||
| 30a5176090 | |||
| 43c40f7bb0 | |||
| 9b3509c062 | |||
| 85fee0cc01 | |||
| 0f07bfc9d7 | |||
| 75098adbdb | |||
| 8dba865ca7 | |||
| 2fcbffeaf9 | |||
| 619ffdd5e1 | |||
| 1af2da0063 | |||
| 9d1231ce0a | |||
| 4d1110b3f3 | |||
| 6a5bf521c2 | |||
| 3410c332d5 | |||
| 8e41332dfa | |||
| 9f56a335b7 | |||
| 8db8307c9e | |||
| 641d9f5ebd | |||
| 05887967e0 | |||
| 232b9c13d7 | |||
| c0b00339c5 | |||
| bfcb2070d1 | |||
| 1e3a23e017 | |||
| 524109056f | |||
| c2df8aa6b9 | |||
| 1666b50857 | |||
| e839c271cd | |||
| 823c208c71 | |||
| ee01b4a3a0 | |||
| d5ed065011 | |||
| 78a6ec2f98 | |||
| 7f60a9e52b | |||
| 7383dca9ee | |||
| 8a7d72bf24 | |||
| 4af7262f45 | |||
| daa62202fa | |||
| f911fceb9e | |||
| e9e5fac610 | |||
| 5017ac6f74 | |||
| 1d92ee76b9 | |||
| 7d01764a30 | |||
| 62d8955da9 | |||
| 4f94de86db | |||
| a6f7c57d19 | |||
| 1690030b1d | |||
| bf343eb499 | |||
| 4f55144232 | |||
| c9b18f6fa4 | |||
| 416a03aea1 | |||
| f62b268f1d | |||
| 6ce8a3feba | |||
| 94dd547a74 | |||
| f5c7b58b3a | |||
| fa7c16dbe7 | |||
| 6a43eb6755 | |||
| c524ebc7f3 | |||
| 0deb905cdf | |||
| 4cadbcbbdf | |||
| 96eef75f74 | |||
| 51d9e02e07 | |||
| c4c21c4f0c | |||
| c00ed14bc3 | |||
| 8f39a5eeac | |||
| 305715277c | |||
| d4eebf1a77 | |||
| fcb247b62a | |||
| 7556da7839 | |||
| eb93a6c149 | |||
| b870ab204a | |||
| fba2422a64 | |||
| da674d3e05 | |||
| 57e1c1bd89 | |||
| e3463b3c3d | |||
| a3898c7589 | |||
| 1221c6144c | |||
| c77b0098a7 | |||
| f779e81993 | |||
| 5c71bb95a0 | |||
| 1525992d73 | |||
| a227c69408 | |||
| 972bfa3319 | |||
| 360b920935 | |||
| 1416a0de53 | |||
| abe25be05e | |||
| 664a19a5c4 | |||
| 8efadd2547 | |||
| ed1f3e1e8c | |||
| 4aaf9eaed4 | |||
| 0416e4d212 | |||
| b9247db001 | |||
| 74ef157fa1 | |||
| d4724b0e12 | |||
| dbfdbcf2b7 | |||
| 0986b14508 | |||
| 325152c782 | |||
| c136d12194 | |||
| 7557952155 | |||
| b0b41e6718 | |||
| 22e3067b8c | |||
| e54b2fb207 | |||
| e9ab01ab06 | |||
| 058e554b0f | |||
| 6d9327aebc | |||
| c23d7850c7 | |||
| 2854f0cf34 | |||
| a89e87ca2e | |||
| 5419ca431b | |||
| e8b674badd | |||
| 8af40a9c61 | |||
| f54aa3d823 | |||
| d544bf4665 | |||
| e5570a6017 | |||
| 5e91287e3e | |||
| 4e3d4a7060 | |||
| 3d80da9816 | |||
| bf63b716af | |||
| 38d389b838 | |||
| ebdca32c80 | |||
| 751a825616 | |||
| c06a3710c1 | |||
| d5e67fe13f | |||
| 00c7da45c0 | |||
| 3347817350 | |||
| 88ece92a78 | |||
| 03a73fb95e | |||
| 23c55c9636 | |||
| 12c6f4e95f | |||
| a468ddb85b | |||
| 051bdaccc7 | |||
| 5dc04d9574 | |||
| 60129413d3 | |||
| 15df20d22d | |||
| b37c560ea5 | |||
| 5a3272fe29 | |||
| 0baa8383f2 | |||
| d2bf9370ea | |||
| fd11aa5eec | |||
| cea33783a2 | |||
| 0d3eaf7f9a | |||
| c761cd54b4 | |||
| a8a055d32c | |||
| cc323d0d61 | |||
| fc87a6776a | |||
| f5ac57f87b | |||
| 90624abf2e | |||
| e5ec62695c | |||
| fb7c2b61d3 | |||
| dd64bf0fc9 | |||
| 434eb3b256 | |||
| 6da98a5f31 | |||
| 8fef75385a | |||
| c66b9219a8 | |||
| 2a1f8823e8 | |||
| 3da65f90e3 | |||
| a36cc24087 | |||
| 1829d8cadf | |||
| 02efc090ef | |||
| b184348f55 | |||
| 06743cb072 | |||
| 6fa66fb1d0 | |||
| 23c0ab9648 | |||
| 6422047cff | |||
| 46c2c72637 | |||
| c088590244 | |||
| 192ba69682 | |||
| 2cc428e968 | |||
| 15c451a6d9 | |||
| b46e8c07be | |||
| 961e931c31 | |||
| b1d49552ae | |||
| d31d154841 | |||
| d03892bbcf | |||
| 0cf0c1c585 | |||
| 0695b4bee9 | |||
| 0cfec3a7bd | |||
| 6224cd40d4 | |||
| 18ae82174d | |||
| aa1b9d11dc | |||
| 0a82471112 | |||
| 8052e10f0c | |||
| 1146f6ba52 | |||
| 738cea0025 | |||
| 6c28398d20 | |||
| 4fe75143d0 | |||
| 3cd59cdea5 | |||
| 9dca7eb878 | |||
| b45fd5ce3a | |||
| 229b1470f7 | |||
| 0a349e1707 | |||
| d176e9ccf0 | |||
| 710c3acb5d | |||
| a7f5d0e0c1 | |||
| 9928526dda | |||
| 2f8111be0e | |||
| 68113937ff | |||
| c598fa026b | |||
| 491c99c348 | |||
| d49aa8242a | |||
| 9ffbc06cf9 | |||
| af52ac30ba | |||
| 7aea1b5fc8 | |||
| 500ddf3946 | |||
| 3431eaf309 | |||
| 9a13c58583 | |||
| 77a48e8351 | |||
| 6cb156d876 | |||
| d8677c6261 | |||
| 6ef9ca18e9 | |||
| 6667738dc9 | |||
| 4f7415b0ec | |||
| c6f3a8b7c7 | |||
| 4229d673c9 | |||
| 98b7859605 | |||
| a8db707440 | |||
| 873a412179 | |||
| 0778b4809e | |||
| f85fb35c66 | |||
| 5ada0daf40 | |||
| 2ed5f5aa65 | |||
| ae5e6e3ab8 | |||
| 9ba7b9b4d4 | |||
| a45f1fba45 | |||
| e6b47d2cf2 | |||
| b04a262433 | |||
| 96bafa7f0b | |||
| 7adfe6f2df | |||
| 45df7bfea3 | |||
| 106772e480 | |||
| e7e60d3ed8 | |||
| ccb42c831c | |||
| 2386782280 | |||
| 4d92922263 | |||
| 721f707c94 | |||
| 0c7b731fa6 | |||
| f1eaa83af5 | |||
| d329ccc4e3 | |||
| 19f2434694 | |||
| 0006f6483d | |||
| 6eec4277c1 | |||
| 78f6fdf169 | |||
| e01c6dc18d | |||
| 51dd408733 | |||
| 1ff7548b52 | |||
| f7fe44063a | |||
| 0355c358b8 | |||
| 4e0a60db00 | |||
| 3604d3940c | |||
| 02b9bd82cf | |||
| 1bc86c359e | |||
| 1e2c26123b | |||
| eefd8b37b1 | |||
| 89ae241bf7 | |||
| a39b4c1637 | |||
| 4d332cd544 | |||
| 64dbdd97ba | |||
| 756f37e265 | |||
| 9e1ba442a9 |
@@ -1,24 +0,0 @@
|
|||||||
krill-parser.js
|
|
||||||
krill.pegjs
|
|
||||||
.eslintrc.json
|
|
||||||
server.js
|
|
||||||
tidal-sniffer.js
|
|
||||||
*.jsx
|
|
||||||
tunejs.js
|
|
||||||
out/**
|
|
||||||
postcss.config.js
|
|
||||||
postcss.config.cjs
|
|
||||||
tailwind.config.js
|
|
||||||
tailwind.config.cjs
|
|
||||||
vite.config.js
|
|
||||||
/**/dist/**/*
|
|
||||||
!**/*.mjs
|
|
||||||
**/*.tsx
|
|
||||||
**/*.ts
|
|
||||||
**/*.json
|
|
||||||
**/dev-dist
|
|
||||||
**/dist
|
|
||||||
/src-tauri/target/**/*
|
|
||||||
reverbGen.mjs
|
|
||||||
hydra.mjs
|
|
||||||
jsdoc-synonyms.js
|
|
||||||
+3
-1
@@ -1,5 +1,6 @@
|
|||||||
{
|
{
|
||||||
"env": {
|
"env": {
|
||||||
|
"node": true,
|
||||||
"browser": true,
|
"browser": true,
|
||||||
"es2021": true
|
"es2021": true
|
||||||
},
|
},
|
||||||
@@ -13,5 +14,6 @@
|
|||||||
"rules": {
|
"rules": {
|
||||||
"no-unused-vars": ["warn", { "destructuredArrayIgnorePattern": ".", "ignoreRestSiblings": false }],
|
"no-unused-vars": ["warn", { "destructuredArrayIgnorePattern": ".", "ignoreRestSiblings": false }],
|
||||||
"import/no-extraneous-dependencies": ["error", {"devDependencies": true}]
|
"import/no-extraneous-dependencies": ["error", {"devDependencies": true}]
|
||||||
}
|
},
|
||||||
|
"files": ["**/*.mjs", "**/*.js"]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -22,10 +22,10 @@ jobs:
|
|||||||
url: ${{ steps.deployment.outputs.page_url }}
|
url: ${{ steps.deployment.outputs.page_url }}
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
- uses: pnpm/action-setup@v2
|
- uses: pnpm/action-setup@v4
|
||||||
with:
|
with:
|
||||||
version: 8.11.0
|
version: 9.12.2
|
||||||
- uses: actions/setup-node@v3
|
- uses: actions/setup-node@v4
|
||||||
with:
|
with:
|
||||||
node-version: 20
|
node-version: 20
|
||||||
cache: "pnpm"
|
cache: "pnpm"
|
||||||
@@ -39,11 +39,11 @@ jobs:
|
|||||||
uses: actions/configure-pages@v2
|
uses: actions/configure-pages@v2
|
||||||
|
|
||||||
- name: Upload artifact
|
- name: Upload artifact
|
||||||
uses: actions/upload-pages-artifact@v1
|
uses: actions/upload-pages-artifact@v3
|
||||||
with:
|
with:
|
||||||
# Upload entire repository
|
# Upload entire repository
|
||||||
path: "./website/dist"
|
path: "./website/dist"
|
||||||
|
|
||||||
- name: Deploy to GitHub Pages
|
- name: Deploy to GitHub Pages
|
||||||
id: deployment
|
id: deployment
|
||||||
uses: actions/deploy-pages@v1
|
uses: actions/deploy-pages@v4
|
||||||
|
|||||||
@@ -11,10 +11,10 @@ jobs:
|
|||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
- uses: pnpm/action-setup@v2
|
- uses: pnpm/action-setup@v4
|
||||||
with:
|
with:
|
||||||
version: 8.11.0
|
version: 9.12.2
|
||||||
- uses: actions/setup-node@v3
|
- uses: actions/setup-node@v4
|
||||||
with:
|
with:
|
||||||
node-version: ${{ matrix.node-version }}
|
node-version: ${{ matrix.node-version }}
|
||||||
cache: 'pnpm'
|
cache: 'pnpm'
|
||||||
|
|||||||
@@ -127,3 +127,6 @@ fabric.properties
|
|||||||
.idea/caches/build_file_checksums.ser
|
.idea/caches/build_file_checksums.ser
|
||||||
|
|
||||||
# END JetBrains -> BEGIN JetBrains
|
# END JetBrains -> BEGIN JetBrains
|
||||||
|
|
||||||
|
samples/*
|
||||||
|
!samples/README.md
|
||||||
|
|||||||
@@ -11,3 +11,5 @@ pnpm-lock.yaml
|
|||||||
pnpm-workspace.yaml
|
pnpm-workspace.yaml
|
||||||
**/dev-dist
|
**/dev-dist
|
||||||
website/.astro
|
website/.astro
|
||||||
|
!tidal-drum-machines.json
|
||||||
|
!tidal-drum-machines-alias.json
|
||||||
|
|||||||
+13
-7
@@ -114,7 +114,7 @@ You can run the same check with `pnpm check`
|
|||||||
## Package Workflow
|
## Package Workflow
|
||||||
|
|
||||||
The project is split into multiple [packages](https://github.com/tidalcycles/strudel/tree/main/packages) with independent versioning.
|
The project is split into multiple [packages](https://github.com/tidalcycles/strudel/tree/main/packages) with independent versioning.
|
||||||
When you run `pnpm i` on the root folder, [pnpm workspaces](https://pnpm.io/workspaces) will install all dependencies of all subpackages. This will allow any js file to import `@strudel.cycles/<package-name>` to get the local version,
|
When you run `pnpm i` on the root folder, [pnpm workspaces](https://pnpm.io/workspaces) will install all dependencies of all subpackages. This will allow any js file to import `@strudel/<package-name>` to get the local version,
|
||||||
allowing to develop multiple packages at the same time.
|
allowing to develop multiple packages at the same time.
|
||||||
|
|
||||||
## Package Publishing
|
## Package Publishing
|
||||||
@@ -130,20 +130,26 @@ npx lerna version --no-private
|
|||||||
# publish all packages inside /packages using pnpm! don't use lerna to publish!!
|
# publish all packages inside /packages using pnpm! don't use lerna to publish!!
|
||||||
pnpm --filter "./packages/**" publish --dry-run
|
pnpm --filter "./packages/**" publish --dry-run
|
||||||
|
|
||||||
# the last command was only a dry-run, make sure everything looks ok, if yes, run the same command without flag
|
# the last command was only a dry-run. if everything looks ok, run this:
|
||||||
|
|
||||||
|
pnpm --filter "./packages/**" publish --access public
|
||||||
```
|
```
|
||||||
|
|
||||||
To manually publish a single package, increase the version in the `package.json`, then run `pnpm publish`.
|
To manually publish a single package, increase the version in the `package.json`, then run `pnpm publish`.
|
||||||
Important: Always publish with `pnpm`, as `npm` does not support overriding main files in `publishConfig`, which is done in all the packages.
|
Important: Always publish with `pnpm`, as `npm` does not support overriding main files in `publishConfig`, which is done in all the packages.
|
||||||
|
|
||||||
### New Packages
|
|
||||||
|
|
||||||
To add a new package, you have to publish it manually the first time, using:
|
|
||||||
|
|
||||||
|
## useful commands
|
||||||
```sh
|
```sh
|
||||||
cd packages/<package-name> && pnpm publish --access public
|
#regenerate the test snapshots (ex: when updating or creating new pattern functions)
|
||||||
```
|
pnpm snapshot
|
||||||
|
|
||||||
|
#start the OSC server
|
||||||
|
pnpm run osc
|
||||||
|
|
||||||
|
#build the standalone version
|
||||||
|
pnpm tauri build
|
||||||
|
```
|
||||||
## Have Fun
|
## Have Fun
|
||||||
|
|
||||||
Remember to have fun, and that this project is driven by the passion of volunteers!
|
Remember to have fun, and that this project is driven by the passion of volunteers!
|
||||||
|
|||||||
@@ -1,38 +1,39 @@
|
|||||||
# strudel
|
# strudel
|
||||||
|
|
||||||
[](https://github.com/tidalcycles/strudel/actions)
|
[](https://github.com/tidalcycles/strudel/actions) [](https://doi.org/10.5281/zenodo.6659278)
|
||||||
|
|
||||||
An experiment in making a [Tidal](https://github.com/tidalcycles/tidal/) using web technologies. This software is slowly stabilising, but please continue to tread carefully.
|
An experiment in making a [Tidal](https://github.com/tidalcycles/tidal/) using web technologies. This software is a bit more stable now, but please continue to tread carefully.
|
||||||
|
|
||||||
- Try it here: <https://strudel.cc>
|
- Try it here: <https://strudel.cc>
|
||||||
- Docs: <https://strudel.cc/learn>
|
- Docs: <https://strudel.cc/learn>
|
||||||
- Technical Blog Post: <https://loophole-letters.vercel.app/strudel>
|
- Technical Blog Post: <https://loophole-letters.vercel.app/strudel>
|
||||||
- 1 Year of Strudel Blog Post: <https://loophole-letters.vercel.app/strudel1year>
|
- 1 Year of Strudel Blog Post: <https://loophole-letters.vercel.app/strudel1year>
|
||||||
|
- 2 Years of Strudel Blog Post: <https://strudel.cc/blog/#year-2>
|
||||||
|
|
||||||
## Running Locally
|
## Running Locally
|
||||||
|
|
||||||
After cloning the project, you can run the REPL locally:
|
After cloning the project, you can run the REPL locally:
|
||||||
|
|
||||||
|
1. Install [Node.js](https://nodejs.org/)
|
||||||
|
2. Install [pnpm](https://pnpm.io/installation)
|
||||||
|
3. Install dependencies by running the following command:
|
||||||
```bash
|
```bash
|
||||||
pnpm run setup
|
pnpm i
|
||||||
pnpm run repl
|
```
|
||||||
|
4. Run the development server:
|
||||||
|
```bash
|
||||||
|
pnpm dev
|
||||||
```
|
```
|
||||||
|
|
||||||
## Using Strudel In Your Project
|
## Using Strudel In Your Project
|
||||||
|
|
||||||
There are multiple npm packages you can use to use strudel, or only parts of it, in your project:
|
This project is organized into many [packages](./packages), which are also available on [npm](https://www.npmjs.com/search?q=%40strudel).
|
||||||
|
|
||||||
- [`core`](./packages/core/): tidal pattern engine
|
Read more about how to use these in your own project [here](https://strudel.cc/technical-manual/project-start).
|
||||||
- [`mini`](./packages/mini): mini notation parser + core binding
|
|
||||||
- [`transpiler`](./packages/transpiler): user code transpiler
|
|
||||||
- [`webaudio`](./packages/webaudio): webaudio output
|
|
||||||
- [`osc`](./packages/osc): bindings to communicate via OSC
|
|
||||||
- [`midi`](./packages/midi): webmidi bindings
|
|
||||||
- [`serial`](./packages/serial): webserial bindings
|
|
||||||
- [`tonal`](./packages/tonal): tonal functions
|
|
||||||
- ... [and there are more](./packages/)
|
|
||||||
|
|
||||||
Click on the package names to find out more about each one.
|
You will need to abide by the terms of the [GNU Affero Public Licence v3](LICENSE.md). As such, Strudel code can only be shared within free/open source projects under the same license -- see the license for details.
|
||||||
|
|
||||||
|
Licensing info for the default sound banks can be found over on the [dough-samples](https://github.com/felixroos/dough-samples/blob/main/README.md) repository.
|
||||||
|
|
||||||
## Contributing
|
## Contributing
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,22 @@
|
|||||||
|
import { queryCode, testCycles } from '../test/runtime.mjs';
|
||||||
|
import * as tunes from '../website/src/repl/tunes.mjs';
|
||||||
|
import { describe, bench } from 'vitest';
|
||||||
|
import { calculateSteps } from '../packages/core/index.mjs';
|
||||||
|
|
||||||
|
const tuneKeys = Object.keys(tunes);
|
||||||
|
|
||||||
|
describe('renders tunes', () => {
|
||||||
|
tuneKeys.forEach((key) => {
|
||||||
|
describe(key, () => {
|
||||||
|
calculateSteps(true);
|
||||||
|
bench(`+steps`, async () => {
|
||||||
|
await queryCode(tunes[key], testCycles[key] || 1);
|
||||||
|
});
|
||||||
|
calculateSteps(false);
|
||||||
|
bench(`-steps`, async () => {
|
||||||
|
await queryCode(tunes[key], testCycles[key] || 1);
|
||||||
|
});
|
||||||
|
calculateSteps(true);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
@@ -0,0 +1,86 @@
|
|||||||
|
import _import from 'eslint-plugin-import';
|
||||||
|
import { fixupPluginRules } from '@eslint/compat';
|
||||||
|
import globals from 'globals';
|
||||||
|
import path from 'node:path';
|
||||||
|
import { fileURLToPath } from 'node:url';
|
||||||
|
import js from '@eslint/js';
|
||||||
|
import { FlatCompat } from '@eslint/eslintrc';
|
||||||
|
|
||||||
|
const __filename = fileURLToPath(import.meta.url);
|
||||||
|
const __dirname = path.dirname(__filename);
|
||||||
|
const compat = new FlatCompat({
|
||||||
|
baseDirectory: __dirname,
|
||||||
|
recommendedConfig: js.configs.recommended,
|
||||||
|
allConfig: js.configs.all,
|
||||||
|
});
|
||||||
|
|
||||||
|
export default [
|
||||||
|
{
|
||||||
|
ignores: [
|
||||||
|
'**/krill-parser.js',
|
||||||
|
'**/krill.pegjs',
|
||||||
|
'**/.eslintrc.json',
|
||||||
|
'**/server.js',
|
||||||
|
'**/tidal-sniffer.js',
|
||||||
|
'**/*.jsx',
|
||||||
|
'**/tunejs.js',
|
||||||
|
'out/**/*',
|
||||||
|
'**/postcss.config.js',
|
||||||
|
'**/postcss.config.cjs',
|
||||||
|
'**/tailwind.config.js',
|
||||||
|
'**/tailwind.config.cjs',
|
||||||
|
'**/vite.config.js',
|
||||||
|
'**/dist/**/*',
|
||||||
|
'!**/*.mjs',
|
||||||
|
'**/*.tsx',
|
||||||
|
'**/*.ts',
|
||||||
|
'**/*.json',
|
||||||
|
'**/dev-dist',
|
||||||
|
'**/dist',
|
||||||
|
'src-tauri/target/**/*',
|
||||||
|
'**/reverbGen.mjs',
|
||||||
|
'**/hydra.mjs',
|
||||||
|
'**/jsdoc-synonyms.js',
|
||||||
|
'packages/hs2js/src/hs2js.mjs',
|
||||||
|
'**/samples',
|
||||||
|
],
|
||||||
|
},
|
||||||
|
...compat.extends('eslint:recommended').map((config) => ({
|
||||||
|
...config,
|
||||||
|
files: ['**/*.mjs', '**/*.js'],
|
||||||
|
})),
|
||||||
|
{
|
||||||
|
files: ['**/*.mjs', '**/*.js'],
|
||||||
|
|
||||||
|
plugins: {
|
||||||
|
import: fixupPluginRules(_import),
|
||||||
|
},
|
||||||
|
|
||||||
|
languageOptions: {
|
||||||
|
globals: {
|
||||||
|
...globals.node,
|
||||||
|
...globals.browser,
|
||||||
|
},
|
||||||
|
|
||||||
|
ecmaVersion: 'latest',
|
||||||
|
sourceType: 'module',
|
||||||
|
},
|
||||||
|
|
||||||
|
rules: {
|
||||||
|
'no-unused-vars': [
|
||||||
|
'warn',
|
||||||
|
{
|
||||||
|
destructuredArrayIgnorePattern: '.',
|
||||||
|
ignoreRestSiblings: false,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
|
||||||
|
'import/no-extraneous-dependencies': [
|
||||||
|
'error',
|
||||||
|
{
|
||||||
|
devDependencies: true,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
];
|
||||||
@@ -7,7 +7,7 @@
|
|||||||
/>
|
/>
|
||||||
<div id="output"></div>
|
<div id="output"></div>
|
||||||
<script type="module">
|
<script type="module">
|
||||||
const strudel = await import('https://cdn.skypack.dev/@strudel.cycles/core@0.6.8');
|
const strudel = await import('https://cdn.skypack.dev/@strudel/core@0.6.8');
|
||||||
Object.assign(window, strudel); // assign all strudel functions to global scope to use with eval
|
Object.assign(window, strudel); // assign all strudel functions to global scope to use with eval
|
||||||
const input = document.getElementById('text');
|
const input = document.getElementById('text');
|
||||||
const getEvents = () => {
|
const getEvents = () => {
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
/>
|
/>
|
||||||
<canvas id="canvas"></canvas>
|
<canvas id="canvas"></canvas>
|
||||||
<script type="module">
|
<script type="module">
|
||||||
const strudel = await import('https://cdn.skypack.dev/@strudel.cycles/core@0.6.8');
|
const strudel = await import('https://cdn.skypack.dev/@strudel/core@0.6.8');
|
||||||
// this adds all strudel functions to the global scope, to be used by eval
|
// this adds all strudel functions to the global scope, to be used by eval
|
||||||
Object.assign(window, strudel);
|
Object.assign(window, strudel);
|
||||||
// setup elements
|
// setup elements
|
||||||
|
|||||||
@@ -1,10 +1,31 @@
|
|||||||
<!doctype html>
|
<!doctype html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8" />
|
||||||
|
<!-- <script src="../../packages/web/dist/index.js"></script> -->
|
||||||
|
<script src="https://unpkg.com/@strudel/web@1.0.3"></script>
|
||||||
|
</head>
|
||||||
|
<body style="background: #222">
|
||||||
<button id="play">play</button>
|
<button id="play">play</button>
|
||||||
<button id="stop">stop</button>
|
<button id="stop">stop</button>
|
||||||
<script type="module">
|
<script>
|
||||||
import { initStrudel } from 'https://cdn.skypack.dev/@strudel/web@0.8.2';
|
strudel.initStrudel();
|
||||||
|
document.getElementById('play').addEventListener('click', () =>
|
||||||
|
evaluate(`
|
||||||
|
//@title washover @by Switch Angel
|
||||||
|
//@social https://www.instagram.com/_switch_angel/
|
||||||
|
|
||||||
initStrudel();
|
n("{0 1 3 5 2 }%16")
|
||||||
document.getElementById('play').addEventListener('click', () => evaluate('note("c a f e").jux(rev)'));
|
.add(n(tri.range(0, 6).slow(3)))
|
||||||
document.getElementById('play').addEventListener('stop', () => hush());
|
.scale("C4:pentatonic")
|
||||||
|
.sound("sawtooth").att(saw.range(0, 0.05).fast(6))
|
||||||
|
.release(3).pan(rand).decay(rand.range(0.1, 0.3))
|
||||||
|
.lpf(tri.range(200, 8000).slow(5)).lpq(0)
|
||||||
|
.gain(.4).vib(1).vibmod(.1)
|
||||||
|
.scope({pos:.5})
|
||||||
|
`),
|
||||||
|
);
|
||||||
|
document.getElementById('stop').addEventListener('click', () => strudel.hush());
|
||||||
</script>
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
|||||||
@@ -1,12 +1,18 @@
|
|||||||
<!doctype html>
|
<!doctype html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8" />
|
||||||
|
<!-- <script src="../../packages/web/dist/index.js"></script> -->
|
||||||
|
<script src="https://unpkg.com/@strudel/web@1.0.3"></script>
|
||||||
|
</head>
|
||||||
|
<body style="background: #222">
|
||||||
<button id="a">A</button>
|
<button id="a">A</button>
|
||||||
<button id="b">B</button>
|
<button id="b">B</button>
|
||||||
<button id="c">C</button>
|
<button id="c">C</button>
|
||||||
<button id="stop">stop</button>
|
<button id="stop">stop</button>
|
||||||
<script type="module">
|
<script>
|
||||||
import { initStrudel } from 'https://cdn.skypack.dev/@strudel/web@0.8.2';
|
|
||||||
initStrudel({
|
initStrudel({
|
||||||
prebake: () => samples('github:tidalcycles/Dirt-Samples/master'),
|
prebake: () => samples('github:tidalcycles/dirt-samples'),
|
||||||
});
|
});
|
||||||
const click = (id, action) => document.getElementById(id).addEventListener('click', action);
|
const click = (id, action) => document.getElementById(id).addEventListener('click', action);
|
||||||
click('a', () => evaluate(`s('bd,jvbass(3,8)').jux(rev)`));
|
click('a', () => evaluate(`s('bd,jvbass(3,8)').jux(rev)`));
|
||||||
@@ -14,3 +20,5 @@
|
|||||||
click('c', () => s('bd*2,hh(3,4),jvbass:[0 4](5,8,1)').jux(rev).stack(s('~ sd')).play());
|
click('c', () => s('bd*2,hh(3,4),jvbass:[0 4](5,8,1)').jux(rev).stack(s('~ sd')).play());
|
||||||
click('stop', () => hush());
|
click('stop', () => hush());
|
||||||
</script>
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
|||||||
@@ -0,0 +1,9 @@
|
|||||||
|
<script src="https://unpkg.com/hs2js@0.0.4"></script>
|
||||||
|
<button id="hello">hello</button>
|
||||||
|
<script>
|
||||||
|
hs2js.setBase('https://unpkg.com/hs2js@0.0.4/dist/');
|
||||||
|
hs2js.loadParser();
|
||||||
|
document.getElementById('hello').addEventListener('click', () => {
|
||||||
|
hs2js.evaluate('alert "hello from haskell!"');
|
||||||
|
});
|
||||||
|
</script>
|
||||||
@@ -16,38 +16,45 @@
|
|||||||
</div>
|
</div>
|
||||||
<div id="output"></div>
|
<div id="output"></div>
|
||||||
<script type="module">
|
<script type="module">
|
||||||
import { controls, repl, evalScope } from 'https://cdn.skypack.dev/@strudel.cycles/core@0.6.8';
|
// TODO: refactor to use newer version without controls import
|
||||||
import { mini } from 'https://cdn.skypack.dev/@strudel.cycles/mini@0.6.0';
|
import { controls, repl, evalScope } from 'https://cdn.skypack.dev/@strudel/core@0.11.0';
|
||||||
import { transpiler } from 'https://cdn.skypack.dev/@strudel.cycles/transpiler@0.6.0';
|
import { mini } from 'https://cdn.skypack.dev/@strudel/mini@0.11.0';
|
||||||
|
import { transpiler } from 'https://cdn.skypack.dev/@strudel/transpiler@0.11.0';
|
||||||
import {
|
import {
|
||||||
getAudioContext,
|
getAudioContext,
|
||||||
webaudioOutput,
|
webaudioOutput,
|
||||||
initAudioOnFirstClick,
|
initAudioOnFirstClick,
|
||||||
} from 'https://cdn.skypack.dev/@strudel.cycles/webaudio@0.6.0';
|
registerSynthSounds,
|
||||||
|
} from 'https://cdn.skypack.dev/@strudel/webaudio@0.11.0';
|
||||||
|
|
||||||
initAudioOnFirstClick();
|
|
||||||
const ctx = getAudioContext();
|
const ctx = getAudioContext();
|
||||||
const input = document.getElementById('text');
|
const input = document.getElementById('text');
|
||||||
input.innerHTML = getTune();
|
input.innerHTML = getTune();
|
||||||
|
|
||||||
evalScope(
|
const loadModules = evalScope(
|
||||||
controls,
|
controls,
|
||||||
import('https://cdn.skypack.dev/@strudel.cycles/core@0.6.8'),
|
import('https://cdn.skypack.dev/@strudel/core@0.11.0'),
|
||||||
import('https://cdn.skypack.dev/@strudel.cycles/mini@0.6.0'),
|
import('https://cdn.skypack.dev/@strudel/mini@0.11.0'),
|
||||||
import('https://cdn.skypack.dev/@strudel.cycles/tonal@0.6.0'),
|
import('https://cdn.skypack.dev/@strudel/tonal@0.11.0'),
|
||||||
import('https://cdn.skypack.dev/@strudel.cycles/webaudio@0.6.0'),
|
import('https://cdn.skypack.dev/@strudel/webaudio@0.11.0'),
|
||||||
);
|
);
|
||||||
|
|
||||||
|
const initAudio = Promise.all([initAudioOnFirstClick(), registerSynthSounds()]);
|
||||||
|
|
||||||
const { evaluate } = repl({
|
const { evaluate } = repl({
|
||||||
defaultOutput: webaudioOutput,
|
defaultOutput: webaudioOutput,
|
||||||
getTime: () => ctx.currentTime,
|
getTime: () => ctx.currentTime,
|
||||||
transpiler,
|
transpiler,
|
||||||
});
|
});
|
||||||
document.getElementById('start').addEventListener('click', () => evaluate(input.value));
|
document.getElementById('start').addEventListener('click', async () => {
|
||||||
|
await loadModules;
|
||||||
|
await initAudio;
|
||||||
|
evaluate(input.value);
|
||||||
|
});
|
||||||
|
|
||||||
function getTune() {
|
function getTune() {
|
||||||
return `await samples('github:tidalcycles/Dirt-Samples/master')
|
return `samples('github:tidalcycles/dirt-samples')
|
||||||
|
setcps(1);
|
||||||
stack(
|
stack(
|
||||||
// amen
|
// amen
|
||||||
n("0 1 2 3 4 5 6 7")
|
n("0 1 2 3 4 5 6 7")
|
||||||
|
|||||||
@@ -0,0 +1,98 @@
|
|||||||
|
<!doctype html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8" />
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
|
<title>tidal.html</title>
|
||||||
|
</head>
|
||||||
|
<body style="margin: 0; padding: 0">
|
||||||
|
<textarea id="code" style="width: 100%; height: 200px"></textarea>
|
||||||
|
<pre id="result"></pre>
|
||||||
|
<script src="https://unpkg.com/hs2js@0.0.8"></script>
|
||||||
|
<script src="https://unpkg.com/@strudel/web@1.0.3"></script>
|
||||||
|
<script>
|
||||||
|
const { initStrudel } = strudel;
|
||||||
|
const { run, parse, setBase, loadParser } = hs2js;
|
||||||
|
setBase('https://unpkg.com/hs2js@0.0.4/dist/');
|
||||||
|
const ready = loadParser();
|
||||||
|
initStrudel({
|
||||||
|
prebake: () => samples('github:tidalcycles/dirt-samples'),
|
||||||
|
});
|
||||||
|
|
||||||
|
const textarea = document.getElementById('code');
|
||||||
|
if (window.location.hash) {
|
||||||
|
textarea.value = atob(window.location.hash.slice(1));
|
||||||
|
} else {
|
||||||
|
textarea.value = 'd1 $ s "jvbass(3,8)"';
|
||||||
|
}
|
||||||
|
textarea.addEventListener('input', (e) => {
|
||||||
|
window.location.hash = btoa(e.target.value);
|
||||||
|
update();
|
||||||
|
});
|
||||||
|
update();
|
||||||
|
|
||||||
|
function getInfixOperators() {
|
||||||
|
let operators = {
|
||||||
|
'>': 'set',
|
||||||
|
'#': 'set',
|
||||||
|
'+': 'add',
|
||||||
|
'-': 'sub',
|
||||||
|
'*': 'mul',
|
||||||
|
'/': 'div',
|
||||||
|
};
|
||||||
|
let alignments = {
|
||||||
|
in: (s) => '|' + s,
|
||||||
|
out: (s) => s + '|',
|
||||||
|
mix: (s) => '|' + s + '|',
|
||||||
|
};
|
||||||
|
let ops = {};
|
||||||
|
Object.entries(operators).forEach(([o, name]) => {
|
||||||
|
// operator without alignment
|
||||||
|
ops[o] = (l, r) => reify(l)[name](reify(r));
|
||||||
|
Object.entries(alignments).forEach(([a, getSymbol]) => {
|
||||||
|
// get symbol with alignment
|
||||||
|
let symbol = getSymbol(o);
|
||||||
|
ops[symbol] = (l, r) => reify(l)[name][a](reify(r));
|
||||||
|
});
|
||||||
|
});
|
||||||
|
ops['~>'] = (l, r) => reify(l).late(reify(r));
|
||||||
|
ops['<~'] = (l, r) => reify(l).early(reify(r));
|
||||||
|
ops['<$>'] = (l, r) => reify(r).fmap(l).outerJoin(); // is this right?
|
||||||
|
return ops;
|
||||||
|
}
|
||||||
|
const ops = getInfixOperators();
|
||||||
|
|
||||||
|
async function update() {
|
||||||
|
let result, tree;
|
||||||
|
await ready;
|
||||||
|
try {
|
||||||
|
tree = parse(textarea.value);
|
||||||
|
} catch (err) {
|
||||||
|
console.warn('parse error');
|
||||||
|
console.error(err);
|
||||||
|
}
|
||||||
|
console.log('parsed tree');
|
||||||
|
console.log(tree.rootNode.toString());
|
||||||
|
try {
|
||||||
|
let patterns = {};
|
||||||
|
window.p = (name, pattern) => {
|
||||||
|
patterns[name] = pattern;
|
||||||
|
};
|
||||||
|
window.d1 = (pat) => window.p(1, pat);
|
||||||
|
window.d2 = (pat) => window.p(2, pat);
|
||||||
|
window.d3 = (pat) => window.p(3, pat);
|
||||||
|
window.rot = late;
|
||||||
|
result = run(tree.rootNode, window, ops);
|
||||||
|
if (Object.values(patterns).length) {
|
||||||
|
stack(...Object.values(patterns)).play();
|
||||||
|
}
|
||||||
|
} catch (err) {
|
||||||
|
console.warn('eval error');
|
||||||
|
console.error(err);
|
||||||
|
result = 'ERROR: ' + err.message;
|
||||||
|
}
|
||||||
|
document.getElementById('result').innerHTML = 'Result: ' + result;
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
<script src="https://unpkg.com/@strudel.cycles/embed@latest"></script>
|
<script src="https://unpkg.com/@strudel/embed@0.11.0"></script>
|
||||||
<!-- <script src="./embed.js"></script> -->
|
<!-- <script src="./embed.js"></script> -->
|
||||||
<strudel-repl>
|
<strudel-repl>
|
||||||
<!--
|
<!--
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
<script src="https://unpkg.com/@strudel/repl@0.9.4"></script>
|
<script src="https://unpkg.com/@strudel/repl@1.0.2"></script>
|
||||||
<strudel-editor>
|
<strudel-editor>
|
||||||
<!--
|
<!--
|
||||||
// @date 23-08-15
|
// @date 23-08-15
|
||||||
|
|||||||
@@ -0,0 +1,8 @@
|
|||||||
|
<script src="https://unpkg.com/@strudel/web@1.0.3"></script>
|
||||||
|
<button id="play">PLAY</button>
|
||||||
|
<script>
|
||||||
|
initStrudel({
|
||||||
|
prebake: () => samples('github:tidalcycles/dirt-samples'),
|
||||||
|
});
|
||||||
|
document.getElementById('play').addEventListener('click', () => s('bd sd').play());
|
||||||
|
</script>
|
||||||
@@ -1,11 +1,12 @@
|
|||||||
import { StrudelMirror } from '@strudel/codemirror';
|
import { StrudelMirror } from '@strudel/codemirror';
|
||||||
import { funk42 } from './tunes';
|
import { funk42 } from './tunes';
|
||||||
import { drawPianoroll, evalScope, controls } from '@strudel.cycles/core';
|
import { evalScope } from '@strudel/core';
|
||||||
|
import { drawPianoroll } from '@strudel/draw';
|
||||||
import './style.css';
|
import './style.css';
|
||||||
import { initAudioOnFirstClick } from '@strudel.cycles/webaudio';
|
import { initAudioOnFirstClick } from '@strudel/webaudio';
|
||||||
import { transpiler } from '@strudel.cycles/transpiler';
|
import { transpiler } from '@strudel/transpiler';
|
||||||
import { getAudioContext, webaudioOutput, registerSynthSounds } from '@strudel.cycles/webaudio';
|
import { getAudioContext, webaudioOutput, registerSynthSounds } from '@strudel/webaudio';
|
||||||
import { registerSoundfonts } from '@strudel.cycles/soundfonts';
|
import { registerSoundfonts } from '@strudel/soundfonts';
|
||||||
|
|
||||||
// init canvas
|
// init canvas
|
||||||
const canvas = document.getElementById('roll');
|
const canvas = document.getElementById('roll');
|
||||||
@@ -25,11 +26,11 @@ const editor = new StrudelMirror({
|
|||||||
prebake: async () => {
|
prebake: async () => {
|
||||||
initAudioOnFirstClick(); // needed to make the browser happy (don't await this here..)
|
initAudioOnFirstClick(); // needed to make the browser happy (don't await this here..)
|
||||||
const loadModules = evalScope(
|
const loadModules = evalScope(
|
||||||
controls,
|
import('@strudel/core'),
|
||||||
import('@strudel.cycles/core'),
|
import('@strudel/draw'),
|
||||||
import('@strudel.cycles/mini'),
|
import('@strudel/mini'),
|
||||||
import('@strudel.cycles/tonal'),
|
import('@strudel/tonal'),
|
||||||
import('@strudel.cycles/webaudio'),
|
import('@strudel/webaudio'),
|
||||||
);
|
);
|
||||||
await Promise.all([loadModules, registerSynthSounds(), registerSoundfonts()]);
|
await Promise.all([loadModules, registerSynthSounds(), registerSoundfonts()]);
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -9,15 +9,16 @@
|
|||||||
"preview": "vite preview"
|
"preview": "vite preview"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"vite": "^5.0.10"
|
"vite": "^6.0.11"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@strudel/codemirror": "workspace:*",
|
"@strudel/codemirror": "workspace:*",
|
||||||
"@strudel.cycles/core": "workspace:*",
|
"@strudel/core": "workspace:*",
|
||||||
"@strudel.cycles/mini": "workspace:*",
|
"@strudel/draw": "workspace:*",
|
||||||
"@strudel.cycles/soundfonts": "workspace:*",
|
"@strudel/mini": "workspace:*",
|
||||||
"@strudel.cycles/tonal": "workspace:*",
|
"@strudel/soundfonts": "workspace:*",
|
||||||
"@strudel.cycles/transpiler": "workspace:*",
|
"@strudel/tonal": "workspace:*",
|
||||||
"@strudel.cycles/webaudio": "workspace:*"
|
"@strudel/transpiler": "workspace:*",
|
||||||
|
"@strudel/webaudio": "workspace:*"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
export const bumpStreet = `// froos - "22 bump street", licensed with CC BY-NC-SA 4.0
|
export const bumpStreet = `// froos - "22 bump street", licensed with CC BY-NC-SA 4.0
|
||||||
await samples('github:felixroos/samples/main')
|
samples('github:felixroos/samples')
|
||||||
await samples('https://strudel.cc/tidal-drum-machines.json', 'github:ritchse/tidal-drum-machines/main/machines/')
|
samples('https://strudel.cc/tidal-drum-machines.json', 'github:ritchse/tidal-drum-machines/main/machines/')
|
||||||
|
|
||||||
"<[0,<6 7 9>,13,<17 20 22 26>]!2>/2"
|
"<[0,<6 7 9>,13,<17 20 22 26>]!2>/2"
|
||||||
// make it 22 edo
|
// make it 22 edo
|
||||||
@@ -33,8 +33,8 @@ await samples('https://strudel.cc/tidal-drum-machines.json', 'github:ritchse/tid
|
|||||||
|
|
||||||
export const trafficFlam = `// froos - "traffic flam", licensed with CC BY-NC-SA 4.0
|
export const trafficFlam = `// froos - "traffic flam", licensed with CC BY-NC-SA 4.0
|
||||||
|
|
||||||
await samples('github:felixroos/samples/main')
|
samples('github:felixroos/samples')
|
||||||
await samples('https://strudel.cc/tidal-drum-machines.json', 'github:ritchse/tidal-drum-machines/main/machines/')
|
samples('https://strudel.cc/tidal-drum-machines.json', 'github:ritchse/tidal-drum-machines/main/machines/')
|
||||||
|
|
||||||
addVoicings('hip', {
|
addVoicings('hip', {
|
||||||
m11: ['2M 3m 4P 7m'],
|
m11: ['2M 3m 4P 7m'],
|
||||||
@@ -69,8 +69,8 @@ export const funk42 = `// froos - how to funk in 42 lines of code
|
|||||||
// adapted from "how to funk in two minutes" by marc rebillet https://www.youtube.com/watch?v=3vBwRfQbXkg
|
// adapted from "how to funk in two minutes" by marc rebillet https://www.youtube.com/watch?v=3vBwRfQbXkg
|
||||||
// thanks to peach for the transcription: https://www.youtube.com/watch?v=8eiPXvIgda4
|
// thanks to peach for the transcription: https://www.youtube.com/watch?v=8eiPXvIgda4
|
||||||
|
|
||||||
await samples('github:felixroos/samples/main')
|
samples('github:felixroos/samples')
|
||||||
await samples('https://strudel.cc/tidal-drum-machines.json', 'github:ritchse/tidal-drum-machines/main/machines/')
|
samples('https://strudel.cc/tidal-drum-machines.json', 'github:ritchse/tidal-drum-machines/main/machines/')
|
||||||
|
|
||||||
setcps(.5)
|
setcps(.5)
|
||||||
|
|
||||||
|
|||||||
@@ -15,7 +15,7 @@
|
|||||||
<script type="module">
|
<script type="module">
|
||||||
import { initStrudel } from '@strudel/web';
|
import { initStrudel } from '@strudel/web';
|
||||||
initStrudel({
|
initStrudel({
|
||||||
prebake: () => samples('github:tidalcycles/Dirt-Samples/master'),
|
prebake: () => samples('github:tidalcycles/dirt-samples'),
|
||||||
});
|
});
|
||||||
|
|
||||||
const click = (id, action) => document.getElementById(id).addEventListener('click', action);
|
const click = (id, action) => document.getElementById(id).addEventListener('click', action);
|
||||||
|
|||||||
@@ -10,7 +10,7 @@
|
|||||||
"preview": "vite preview"
|
"preview": "vite preview"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"vite": "^5.0.10"
|
"vite": "^6.0.11"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@strudel/web": "workspace:*"
|
"@strudel/web": "workspace:*"
|
||||||
|
|||||||
@@ -1,20 +1,15 @@
|
|||||||
import { controls, repl, evalScope } from '@strudel.cycles/core';
|
import { repl, evalScope } from '@strudel/core';
|
||||||
import { getAudioContext, webaudioOutput, initAudioOnFirstClick } from '@strudel.cycles/webaudio';
|
import { getAudioContext, webaudioOutput, initAudioOnFirstClick, registerSynthSounds } from '@strudel/webaudio';
|
||||||
import { transpiler } from '@strudel.cycles/transpiler';
|
import { transpiler } from '@strudel/transpiler';
|
||||||
import tune from './tune.mjs';
|
import tune from './tune.mjs';
|
||||||
|
|
||||||
const ctx = getAudioContext();
|
const ctx = getAudioContext();
|
||||||
const input = document.getElementById('text');
|
const input = document.getElementById('text');
|
||||||
input.innerHTML = tune;
|
input.innerHTML = tune;
|
||||||
initAudioOnFirstClick();
|
initAudioOnFirstClick();
|
||||||
|
registerSynthSounds();
|
||||||
|
|
||||||
evalScope(
|
evalScope(import('@strudel/core'), import('@strudel/mini'), import('@strudel/webaudio'), import('@strudel/tonal'));
|
||||||
controls,
|
|
||||||
import('@strudel.cycles/core'),
|
|
||||||
import('@strudel.cycles/mini'),
|
|
||||||
import('@strudel.cycles/webaudio'),
|
|
||||||
import('@strudel.cycles/tonal'),
|
|
||||||
);
|
|
||||||
|
|
||||||
const { evaluate } = repl({
|
const { evaluate } = repl({
|
||||||
defaultOutput: webaudioOutput,
|
defaultOutput: webaudioOutput,
|
||||||
|
|||||||
@@ -10,13 +10,13 @@
|
|||||||
"preview": "vite preview"
|
"preview": "vite preview"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"vite": "^5.0.10"
|
"vite": "^6.0.11"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@strudel.cycles/core": "workspace:*",
|
"@strudel/core": "workspace:*",
|
||||||
"@strudel.cycles/mini": "workspace:*",
|
"@strudel/mini": "workspace:*",
|
||||||
"@strudel.cycles/transpiler": "workspace:*",
|
"@strudel/transpiler": "workspace:*",
|
||||||
"@strudel.cycles/webaudio": "workspace:*",
|
"@strudel/webaudio": "workspace:*",
|
||||||
"@strudel.cycles/tonal": "workspace:*"
|
"@strudel/tonal": "workspace:*"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
export default `await samples('github:tidalcycles/Dirt-Samples/master')
|
export default `samples('github:tidalcycles/dirt-samples')
|
||||||
|
setcps(1)
|
||||||
stack(
|
stack(
|
||||||
// amen
|
// amen
|
||||||
n("0 1 2 3 4 5 6 7")
|
n("0 1 2 3 4 5 6 7")
|
||||||
|
|||||||
@@ -12,7 +12,7 @@
|
|||||||
|
|
||||||
const init = Promise.all([
|
const init = Promise.all([
|
||||||
initAudioOnFirstClick(),
|
initAudioOnFirstClick(),
|
||||||
samples('github:tidalcycles/Dirt-Samples/master'),
|
samples('github:tidalcycles/dirt-samples'),
|
||||||
registerSynthSounds(),
|
registerSynthSounds(),
|
||||||
]);
|
]);
|
||||||
|
|
||||||
|
|||||||
@@ -12,6 +12,6 @@
|
|||||||
"superdough": "workspace:*"
|
"superdough": "workspace:*"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"vite": "^5.0.10"
|
"vite": "^6.0.11"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,27 @@
|
|||||||
|
# Logs
|
||||||
|
logs
|
||||||
|
*.log
|
||||||
|
npm-debug.log*
|
||||||
|
yarn-debug.log*
|
||||||
|
yarn-error.log*
|
||||||
|
pnpm-debug.log*
|
||||||
|
lerna-debug.log*
|
||||||
|
|
||||||
|
node_modules
|
||||||
|
dist
|
||||||
|
dist-ssr
|
||||||
|
*.local
|
||||||
|
|
||||||
|
# Editor directories and files
|
||||||
|
.vscode/*
|
||||||
|
!.vscode/extensions.json
|
||||||
|
.idea
|
||||||
|
.DS_Store
|
||||||
|
*.suo
|
||||||
|
*.ntvs*
|
||||||
|
*.njsproj
|
||||||
|
*.sln
|
||||||
|
*.sw?
|
||||||
|
|
||||||
|
public/tree-sitter.wasm
|
||||||
|
public/tree-sitter-haskell.wasm
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
# @strudel/tidal
|
||||||
|
|
||||||
|
This is an experiment in implementing tree-sitter for parsing haskell.
|
||||||
|
|
||||||
|
```sh
|
||||||
|
pnpm i
|
||||||
|
cd haskell
|
||||||
|
pnpm copy-wasm
|
||||||
|
pnpm dev
|
||||||
|
```
|
||||||
@@ -0,0 +1,32 @@
|
|||||||
|
<!doctype html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8" />
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
|
<title>Tree sitter test</title>
|
||||||
|
<style>
|
||||||
|
body {
|
||||||
|
background-color: #121213;
|
||||||
|
color: white;
|
||||||
|
}
|
||||||
|
textarea {
|
||||||
|
padding: 10px;
|
||||||
|
color: white;
|
||||||
|
background-color: transparent;
|
||||||
|
outline: none;
|
||||||
|
}
|
||||||
|
a {
|
||||||
|
color: white;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body style="margin: 0; padding: 0">
|
||||||
|
<textarea id="code" style="width: 100%; height: 200px"></textarea>
|
||||||
|
<pre id="result"></pre>
|
||||||
|
<script
|
||||||
|
type="module"
|
||||||
|
src="/main.js
|
||||||
|
"
|
||||||
|
></script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
@@ -0,0 +1,83 @@
|
|||||||
|
import { run, parse, loadParser } from 'hs2js';
|
||||||
|
import { initStrudel, reify, late, samples, stack } from '@strudel/web';
|
||||||
|
|
||||||
|
initStrudel({
|
||||||
|
prebake: () => samples('github:tidalcycles/dirt-samples'),
|
||||||
|
});
|
||||||
|
|
||||||
|
const ready = loadParser();
|
||||||
|
|
||||||
|
const textarea = document.getElementById('code');
|
||||||
|
if (window.location.hash) {
|
||||||
|
textarea.value = atob(window.location.hash.slice(1));
|
||||||
|
} else {
|
||||||
|
textarea.value = 'd1 $ s "jvbass(3,8)"';
|
||||||
|
}
|
||||||
|
textarea.addEventListener('input', (e) => {
|
||||||
|
window.location.hash = btoa(e.target.value);
|
||||||
|
update();
|
||||||
|
});
|
||||||
|
update();
|
||||||
|
|
||||||
|
function getInfixOperators() {
|
||||||
|
let operators = {
|
||||||
|
'>': 'set',
|
||||||
|
'#': 'set',
|
||||||
|
'+': 'add',
|
||||||
|
'-': 'sub',
|
||||||
|
'*': 'mul',
|
||||||
|
'/': 'div',
|
||||||
|
};
|
||||||
|
let alignments = {
|
||||||
|
in: (s) => '|' + s,
|
||||||
|
out: (s) => s + '|',
|
||||||
|
mix: (s) => '|' + s + '|',
|
||||||
|
};
|
||||||
|
let ops = {};
|
||||||
|
Object.entries(operators).forEach(([o, name]) => {
|
||||||
|
// operator without alignment
|
||||||
|
ops[o] = (l, r) => reify(l)[name](reify(r));
|
||||||
|
Object.entries(alignments).forEach(([a, getSymbol]) => {
|
||||||
|
// get symbol with alignment
|
||||||
|
let symbol = getSymbol(o);
|
||||||
|
ops[symbol] = (l, r) => reify(l)[name][a](reify(r));
|
||||||
|
});
|
||||||
|
});
|
||||||
|
ops['~>'] = (l, r) => reify(l).late(reify(r));
|
||||||
|
ops['<~'] = (l, r) => reify(l).early(reify(r));
|
||||||
|
ops['<$>'] = (l, r) => reify(r).fmap(l).outerJoin(); // is this right?
|
||||||
|
return ops;
|
||||||
|
}
|
||||||
|
const ops = getInfixOperators();
|
||||||
|
|
||||||
|
async function update() {
|
||||||
|
let result, tree;
|
||||||
|
await ready;
|
||||||
|
try {
|
||||||
|
tree = parse(textarea.value);
|
||||||
|
} catch (err) {
|
||||||
|
console.warn('parse error');
|
||||||
|
console.error(err);
|
||||||
|
}
|
||||||
|
console.log('parsed tree');
|
||||||
|
console.log(tree.rootNode.toString());
|
||||||
|
try {
|
||||||
|
let patterns = {};
|
||||||
|
window.p = (name, pattern) => {
|
||||||
|
patterns[name] = pattern;
|
||||||
|
};
|
||||||
|
window.d1 = (pat) => window.p(1, pat);
|
||||||
|
window.d2 = (pat) => window.p(2, pat);
|
||||||
|
window.d3 = (pat) => window.p(3, pat);
|
||||||
|
window.rot = late;
|
||||||
|
result = run(tree.rootNode, window, ops);
|
||||||
|
if (Object.values(patterns).length) {
|
||||||
|
stack(...Object.values(patterns)).play();
|
||||||
|
}
|
||||||
|
} catch (err) {
|
||||||
|
console.warn('eval error');
|
||||||
|
console.error(err);
|
||||||
|
result = 'ERROR: ' + err.message;
|
||||||
|
}
|
||||||
|
document.getElementById('result').innerHTML = 'Result: ' + result;
|
||||||
|
}
|
||||||
@@ -0,0 +1,36 @@
|
|||||||
|
{
|
||||||
|
"name": "tidal-repl",
|
||||||
|
"private": true,
|
||||||
|
"version": "0.0.1",
|
||||||
|
"type": "module",
|
||||||
|
"scripts": {
|
||||||
|
"dev": "vite",
|
||||||
|
"build": "pnpm copy-wasm && vite build",
|
||||||
|
"preview": "vite preview",
|
||||||
|
"copy-wasm": "cp node_modules/hs2js/dist/tree-sitter.wasm public && cp node_modules/hs2js/dist/tree-sitter-haskell.wasm public"
|
||||||
|
},
|
||||||
|
"repository": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "git+https://github.com/tidalcycles/strudel.git"
|
||||||
|
},
|
||||||
|
"keywords": [
|
||||||
|
"titdalcycles",
|
||||||
|
"strudel",
|
||||||
|
"pattern",
|
||||||
|
"livecoding",
|
||||||
|
"algorave"
|
||||||
|
],
|
||||||
|
"author": "Felix Roos <flix91@gmail.com>",
|
||||||
|
"license": "AGPL-3.0-or-later",
|
||||||
|
"bugs": {
|
||||||
|
"url": "https://github.com/tidalcycles/strudel/issues"
|
||||||
|
},
|
||||||
|
"homepage": "https://github.com/tidalcycles/strudel#readme",
|
||||||
|
"dependencies": {
|
||||||
|
"@strudel/web": "workspace:*",
|
||||||
|
"hs2js": "workspace:*"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"vite": "^6.0.11"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
# public
|
||||||
|
|
||||||
|
this file is just here to make sure the public folder exists
|
||||||
@@ -1,15 +1,20 @@
|
|||||||
// this barrel export is currently only used to find undocumented exports
|
// this barrel export is currently only used to find undocumented exports
|
||||||
|
export * from './packages/codemirror/index.mjs';
|
||||||
export * from './packages/core/index.mjs';
|
export * from './packages/core/index.mjs';
|
||||||
export * from './packages/csound/index.mjs';
|
export * from './packages/csound/index.mjs';
|
||||||
export * from './packages/embed/index.mjs';
|
|
||||||
export * from './packages/desktopbridge/index.mjs';
|
export * from './packages/desktopbridge/index.mjs';
|
||||||
|
export * from './packages/draw/index.mjs';
|
||||||
|
export * from './packages/embed/index.mjs';
|
||||||
|
export * from './packages/hydra/index.mjs';
|
||||||
export * from './packages/midi/index.mjs';
|
export * from './packages/midi/index.mjs';
|
||||||
export * from './packages/mini/index.mjs';
|
export * from './packages/mini/index.mjs';
|
||||||
export * from './packages/osc/index.mjs';
|
export * from './packages/osc/index.mjs';
|
||||||
export * from './packages/react/index.mjs';
|
export * from './packages/repl/index.mjs';
|
||||||
export * from './packages/serial/index.mjs';
|
export * from './packages/serial/index.mjs';
|
||||||
export * from './packages/soundfonts/index.mjs';
|
export * from './packages/soundfonts/index.mjs';
|
||||||
|
export * from './packages/superdough/index.mjs';
|
||||||
export * from './packages/tonal/index.mjs';
|
export * from './packages/tonal/index.mjs';
|
||||||
export * from './packages/transpiler/index.mjs';
|
export * from './packages/transpiler/index.mjs';
|
||||||
|
export * from './packages/web/index.mjs';
|
||||||
export * from './packages/webaudio/index.mjs';
|
export * from './packages/webaudio/index.mjs';
|
||||||
export * from './packages/xen/index.mjs';
|
export * from './packages/xen/index.mjs';
|
||||||
|
|||||||
+25
-20
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"name": "@strudel.cycles/monorepo",
|
"name": "@strudel/monorepo",
|
||||||
"version": "0.5.0",
|
"version": "0.5.0",
|
||||||
"private": true,
|
"private": true,
|
||||||
"description": "Port of tidalcycles to javascript",
|
"description": "Port of tidalcycles to javascript",
|
||||||
@@ -11,6 +11,7 @@
|
|||||||
"test": "npm run pretest && vitest run --version",
|
"test": "npm run pretest && vitest run --version",
|
||||||
"test-ui": "npm run pretest && vitest --ui",
|
"test-ui": "npm run pretest && vitest --ui",
|
||||||
"test-coverage": "npm run pretest && vitest --coverage",
|
"test-coverage": "npm run pretest && vitest --coverage",
|
||||||
|
"bench": "npm run pretest && vitest bench",
|
||||||
"snapshot": "npm run pretest && vitest run -u --silent",
|
"snapshot": "npm run pretest && vitest run -u --silent",
|
||||||
"repl": "npm run prestart && cd website && npm run dev",
|
"repl": "npm run prestart && cd website && npm run dev",
|
||||||
"start": "npm run prestart && cd website && npm run dev",
|
"start": "npm run prestart && cd website && npm run dev",
|
||||||
@@ -20,11 +21,12 @@
|
|||||||
"osc": "cd packages/osc && npm run server",
|
"osc": "cd packages/osc && npm run server",
|
||||||
"jsdoc": "jsdoc packages/ -c jsdoc/jsdoc.config.json",
|
"jsdoc": "jsdoc packages/ -c jsdoc/jsdoc.config.json",
|
||||||
"jsdoc-json": "jsdoc packages/ --template ./node_modules/jsdoc-json --destination doc.json -c jsdoc/jsdoc.config.json",
|
"jsdoc-json": "jsdoc packages/ --template ./node_modules/jsdoc-json --destination doc.json -c jsdoc/jsdoc.config.json",
|
||||||
"lint": "eslint . --ext mjs,js --quiet",
|
"lint": "eslint . --quiet",
|
||||||
"codeformat": "prettier --write .",
|
"codeformat": "prettier --write .",
|
||||||
"format-check": "prettier --check .",
|
"format-check": "prettier --check .",
|
||||||
"report-undocumented": "npm run jsdoc-json && node jsdoc/undocumented.mjs > undocumented.json",
|
"report-undocumented": "npm run jsdoc-json && node jsdoc/undocumented.mjs > undocumented.json",
|
||||||
"check": "npm run format-check && npm run lint && npm run test",
|
"check": "npm run format-check && npm run lint && npm run test",
|
||||||
|
"sampler": "cd samples && node ../packages/sampler/sample-server.mjs",
|
||||||
"iclc": "cd paper && pandoc --template=pandoc/iclc.html --citeproc --number-sections iclc2023.md -o iclc2023.html && pandoc --template=pandoc/iclc.latex --citeproc --number-sections iclc2023.md -o iclc2023.pdf"
|
"iclc": "cd paper && pandoc --template=pandoc/iclc.html --citeproc --number-sections iclc2023.md -o iclc2023.html && pandoc --template=pandoc/iclc.latex --citeproc --number-sections iclc2023.md -o iclc2023.pdf"
|
||||||
},
|
},
|
||||||
"repository": {
|
"repository": {
|
||||||
@@ -45,27 +47,30 @@
|
|||||||
},
|
},
|
||||||
"homepage": "https://strudel.cc",
|
"homepage": "https://strudel.cc",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@strudel.cycles/core": "workspace:*",
|
"@strudel/core": "workspace:*",
|
||||||
"@strudel.cycles/mini": "workspace:*",
|
"@strudel/mini": "workspace:*",
|
||||||
"@strudel.cycles/tonal": "workspace:*",
|
"@strudel/tonal": "workspace:*",
|
||||||
"@strudel.cycles/transpiler": "workspace:*",
|
"@strudel/transpiler": "workspace:*",
|
||||||
"@strudel.cycles/webaudio": "workspace:*",
|
"@strudel/webaudio": "workspace:*",
|
||||||
"@strudel.cycles/xen": "workspace:*"
|
"@strudel/xen": "workspace:*"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"dependency-tree": "^10.0.9",
|
"@eslint/compat": "^1.2.5",
|
||||||
"@tauri-apps/cli": "^1.5.9",
|
"@eslint/eslintrc": "^3.2.0",
|
||||||
"@vitest/ui": "^1.1.0",
|
"@eslint/js": "^9.19.0",
|
||||||
"canvas": "^2.11.2",
|
"@tauri-apps/cli": "^2.2.7",
|
||||||
"eslint": "^8.56.0",
|
"@vitest/coverage-v8": "3.0.4",
|
||||||
"eslint-plugin-import": "^2.29.1",
|
"@vitest/ui": "^3.0.4",
|
||||||
|
"acorn": "^8.14.0",
|
||||||
|
"dependency-tree": "^11.0.1",
|
||||||
|
"eslint": "^9.19.0",
|
||||||
|
"eslint-plugin-import": "^2.31.0",
|
||||||
"events": "^3.3.0",
|
"events": "^3.3.0",
|
||||||
"jsdoc": "^4.0.2",
|
"globals": "^15.14.0",
|
||||||
|
"jsdoc": "^4.0.4",
|
||||||
"jsdoc-json": "^2.0.2",
|
"jsdoc-json": "^2.0.2",
|
||||||
"jsdoc-to-markdown": "^8.0.0",
|
"lerna": "^8.1.9",
|
||||||
"lerna": "^8.0.1",
|
"prettier": "^3.4.2",
|
||||||
"prettier": "^3.1.1",
|
"vitest": "^3.0.4"
|
||||||
"rollup-plugin-visualizer": "^5.12.0",
|
|
||||||
"vitest": "^1.1.0"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -1,5 +1,5 @@
|
|||||||
# Packages
|
# Packages
|
||||||
|
|
||||||
Each folder represents one of the @strudel.cycles/* packages [published to npm](https://www.npmjs.com/org/strudel.cycles).
|
Each folder represents one of the @strudel/* packages [published to npm](https://www.npmjs.com/org/strudel).
|
||||||
|
|
||||||
To understand how those pieces connect, refer to the [Technical Manual](https://github.com/tidalcycles/strudel/wiki/Technical-Manual) or the individual READMEs.
|
To understand how those pieces connect, refer to the [Technical Manual](https://github.com/tidalcycles/strudel/wiki/Technical-Manual) or the individual READMEs.
|
||||||
|
|||||||
@@ -1,8 +1,9 @@
|
|||||||
import { closeBrackets } from '@codemirror/autocomplete';
|
import { closeBrackets } from '@codemirror/autocomplete';
|
||||||
|
export { toggleComment, toggleBlockComment, toggleLineComment, toggleBlockCommentByLine } from '@codemirror/commands';
|
||||||
// import { search, highlightSelectionMatches } from '@codemirror/search';
|
// import { search, highlightSelectionMatches } from '@codemirror/search';
|
||||||
import { history } from '@codemirror/commands';
|
import { history } from '@codemirror/commands';
|
||||||
import { javascript } from '@codemirror/lang-javascript';
|
import { javascript } from '@codemirror/lang-javascript';
|
||||||
import { defaultHighlightStyle, syntaxHighlighting } from '@codemirror/language';
|
import { defaultHighlightStyle, syntaxHighlighting, bracketMatching } from '@codemirror/language';
|
||||||
import { Compartment, EditorState, Prec } from '@codemirror/state';
|
import { Compartment, EditorState, Prec } from '@codemirror/state';
|
||||||
import {
|
import {
|
||||||
EditorView,
|
EditorView,
|
||||||
@@ -12,18 +13,22 @@ import {
|
|||||||
lineNumbers,
|
lineNumbers,
|
||||||
drawSelection,
|
drawSelection,
|
||||||
} from '@codemirror/view';
|
} from '@codemirror/view';
|
||||||
import { Pattern, Drawer, repl, cleanupDraw } from '@strudel.cycles/core';
|
import { repl, registerControl } from '@strudel/core';
|
||||||
|
import { Drawer, cleanupDraw } from '@strudel/draw';
|
||||||
import { isAutoCompletionEnabled } from './autocomplete.mjs';
|
import { isAutoCompletionEnabled } from './autocomplete.mjs';
|
||||||
import { isTooltipEnabled } from './tooltip.mjs';
|
import { isTooltipEnabled } from './tooltip.mjs';
|
||||||
import { flash, isFlashEnabled } from './flash.mjs';
|
import { flash, isFlashEnabled } from './flash.mjs';
|
||||||
import { highlightMiniLocations, isPatternHighlightingEnabled, updateMiniLocations } from './highlight.mjs';
|
import { highlightMiniLocations, isPatternHighlightingEnabled, updateMiniLocations } from './highlight.mjs';
|
||||||
import { keybindings } from './keybindings.mjs';
|
import { keybindings } from './keybindings.mjs';
|
||||||
import { initTheme, activateTheme, theme } from './themes.mjs';
|
import { initTheme, activateTheme, theme } from './themes.mjs';
|
||||||
import { updateWidgets, sliderPlugin } from './slider.mjs';
|
import { sliderPlugin, updateSliderWidgets } from './slider.mjs';
|
||||||
|
import { widgetPlugin, updateWidgets } from './widget.mjs';
|
||||||
import { persistentAtom } from '@nanostores/persistent';
|
import { persistentAtom } from '@nanostores/persistent';
|
||||||
|
|
||||||
const extensions = {
|
const extensions = {
|
||||||
isLineWrappingEnabled: (on) => (on ? EditorView.lineWrapping : []),
|
isLineWrappingEnabled: (on) => (on ? EditorView.lineWrapping : []),
|
||||||
|
isBracketMatchingEnabled: (on) => (on ? bracketMatching({ brackets: '()[]{}<>' }) : []),
|
||||||
|
isBracketClosingEnabled: (on) => (on ? closeBrackets() : []),
|
||||||
isLineNumbersDisplayed: (on) => (on ? lineNumbers() : []),
|
isLineNumbersDisplayed: (on) => (on ? lineNumbers() : []),
|
||||||
theme,
|
theme,
|
||||||
isAutoCompletionEnabled,
|
isAutoCompletionEnabled,
|
||||||
@@ -37,6 +42,8 @@ const compartments = Object.fromEntries(Object.keys(extensions).map((key) => [ke
|
|||||||
|
|
||||||
export const defaultSettings = {
|
export const defaultSettings = {
|
||||||
keybindings: 'codemirror',
|
keybindings: 'codemirror',
|
||||||
|
isBracketMatchingEnabled: false,
|
||||||
|
isBracketClosingEnabled: true,
|
||||||
isLineNumbersDisplayed: true,
|
isLineNumbersDisplayed: true,
|
||||||
isActiveLineHighlighted: false,
|
isActiveLineHighlighted: false,
|
||||||
isAutoCompletionEnabled: false,
|
isAutoCompletionEnabled: false,
|
||||||
@@ -60,6 +67,7 @@ export function initEditor({ initialCode = '', onChange, onEvaluate, onStop, roo
|
|||||||
const initialSettings = Object.keys(compartments).map((key) =>
|
const initialSettings = Object.keys(compartments).map((key) =>
|
||||||
compartments[key].of(extensions[key](parseBooleans(settings[key]))),
|
compartments[key].of(extensions[key](parseBooleans(settings[key]))),
|
||||||
);
|
);
|
||||||
|
|
||||||
initTheme(settings.theme);
|
initTheme(settings.theme);
|
||||||
let state = EditorState.create({
|
let state = EditorState.create({
|
||||||
doc: initialCode,
|
doc: initialCode,
|
||||||
@@ -69,9 +77,9 @@ export function initEditor({ initialCode = '', onChange, onEvaluate, onStop, roo
|
|||||||
...initialSettings,
|
...initialSettings,
|
||||||
javascript(),
|
javascript(),
|
||||||
sliderPlugin,
|
sliderPlugin,
|
||||||
|
widgetPlugin,
|
||||||
// indentOnInput(), // works without. already brought with javascript extension?
|
// indentOnInput(), // works without. already brought with javascript extension?
|
||||||
// bracketMatching(), // does not do anything
|
// bracketMatching(), // does not do anything
|
||||||
closeBrackets(),
|
|
||||||
syntaxHighlighting(defaultHighlightStyle),
|
syntaxHighlighting(defaultHighlightStyle),
|
||||||
history(),
|
history(),
|
||||||
EditorView.updateListener.of((v) => onChange(v)),
|
EditorView.updateListener.of((v) => onChange(v)),
|
||||||
@@ -92,10 +100,8 @@ export function initEditor({ initialCode = '', onChange, onEvaluate, onStop, roo
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
key: 'Alt-.',
|
key: 'Alt-.',
|
||||||
run: (_, e) => {
|
preventDefault: true,
|
||||||
e.preventDefault();
|
run: () => onStop?.(),
|
||||||
onStop?.();
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
/* {
|
/* {
|
||||||
key: 'Ctrl-Shift-.',
|
key: 'Ctrl-Shift-.',
|
||||||
@@ -123,60 +129,55 @@ export class StrudelMirror {
|
|||||||
id,
|
id,
|
||||||
initialCode = '',
|
initialCode = '',
|
||||||
onDraw,
|
onDraw,
|
||||||
|
drawContext,
|
||||||
drawTime = [0, 0],
|
drawTime = [0, 0],
|
||||||
autodraw,
|
autodraw,
|
||||||
prebake,
|
prebake,
|
||||||
bgFill = true,
|
bgFill = true,
|
||||||
|
solo = true,
|
||||||
...replOptions
|
...replOptions
|
||||||
} = options;
|
} = options;
|
||||||
this.code = initialCode;
|
this.code = initialCode;
|
||||||
this.root = root;
|
this.root = root;
|
||||||
this.miniLocations = [];
|
this.miniLocations = [];
|
||||||
this.widgets = [];
|
this.widgets = [];
|
||||||
this.painters = [];
|
|
||||||
this.drawTime = drawTime;
|
this.drawTime = drawTime;
|
||||||
this.onDraw = onDraw;
|
this.drawContext = drawContext;
|
||||||
const self = this;
|
this.onDraw = onDraw || this.draw;
|
||||||
this.id = id || s4();
|
this.id = id || s4();
|
||||||
|
this.solo = solo;
|
||||||
|
|
||||||
this.drawer = new Drawer((haps, time) => {
|
this.drawer = new Drawer((haps, time, _, painters) => {
|
||||||
const currentFrame = haps.filter((hap) => time >= hap.whole.begin && time <= hap.endClipped);
|
const currentFrame = haps.filter((hap) => hap.isActive(time));
|
||||||
this.highlight(currentFrame, time);
|
this.highlight(currentFrame, time);
|
||||||
this.onDraw?.(haps, time, currentFrame, this.painters);
|
this.onDraw(haps, time, painters);
|
||||||
}, drawTime);
|
}, drawTime);
|
||||||
|
|
||||||
// this approach does not work with multiple repls on screen
|
|
||||||
// TODO: refactor onPaint usages + find fix, maybe remove painters here?
|
|
||||||
Pattern.prototype.onPaint = function (onPaint) {
|
|
||||||
self.painters.push(onPaint);
|
|
||||||
return this;
|
|
||||||
};
|
|
||||||
|
|
||||||
this.prebaked = prebake();
|
this.prebaked = prebake();
|
||||||
autodraw && this.drawFirstFrame();
|
autodraw && this.drawFirstFrame();
|
||||||
|
|
||||||
this.repl = repl({
|
this.repl = repl({
|
||||||
...replOptions,
|
...replOptions,
|
||||||
|
id,
|
||||||
onToggle: (started) => {
|
onToggle: (started) => {
|
||||||
replOptions?.onToggle?.(started);
|
replOptions?.onToggle?.(started);
|
||||||
if (started) {
|
if (started) {
|
||||||
this.adjustDrawTime();
|
|
||||||
this.drawer.start(this.repl.scheduler);
|
this.drawer.start(this.repl.scheduler);
|
||||||
|
if (this.solo) {
|
||||||
// stop other repls when this one is started
|
// stop other repls when this one is started
|
||||||
document.dispatchEvent(
|
document.dispatchEvent(
|
||||||
new CustomEvent('start-repl', {
|
new CustomEvent('start-repl', {
|
||||||
detail: this.id,
|
detail: this.id,
|
||||||
}),
|
}),
|
||||||
);
|
);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
this.drawer.stop();
|
this.drawer.stop();
|
||||||
updateMiniLocations(this.editor, []);
|
updateMiniLocations(this.editor, []);
|
||||||
cleanupDraw(false);
|
cleanupDraw(true, id);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
beforeEval: async () => {
|
beforeEval: async () => {
|
||||||
cleanupDraw();
|
cleanupDraw(true, id);
|
||||||
this.painters = [];
|
|
||||||
await this.prebaked;
|
await this.prebaked;
|
||||||
await replOptions?.beforeEval?.();
|
await replOptions?.beforeEval?.();
|
||||||
},
|
},
|
||||||
@@ -184,11 +185,17 @@ export class StrudelMirror {
|
|||||||
// remember for when highlighting is toggled on
|
// remember for when highlighting is toggled on
|
||||||
this.miniLocations = options.meta?.miniLocations;
|
this.miniLocations = options.meta?.miniLocations;
|
||||||
this.widgets = options.meta?.widgets;
|
this.widgets = options.meta?.widgets;
|
||||||
updateWidgets(this.editor, this.widgets);
|
const sliders = this.widgets.filter((w) => w.type === 'slider');
|
||||||
|
updateSliderWidgets(this.editor, sliders);
|
||||||
|
const widgets = this.widgets.filter((w) => w.type !== 'slider');
|
||||||
|
updateWidgets(this.editor, widgets);
|
||||||
updateMiniLocations(this.editor, this.miniLocations);
|
updateMiniLocations(this.editor, this.miniLocations);
|
||||||
replOptions?.afterEval?.(options);
|
replOptions?.afterEval?.(options);
|
||||||
this.adjustDrawTime();
|
// if no painters are set (.onPaint was not called), then we only need the present moment (for highlighting)
|
||||||
this.drawer.invalidate();
|
const drawTime = options.pattern.getPainters().length ? this.drawTime : [0, 0];
|
||||||
|
this.drawer.setDrawTime(drawTime);
|
||||||
|
// invalidate drawer after we've set the appropriate drawTime
|
||||||
|
this.drawer.invalidate(this.repl.scheduler);
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
this.editor = initEditor({
|
this.editor = initEditor({
|
||||||
@@ -217,16 +224,14 @@ export class StrudelMirror {
|
|||||||
|
|
||||||
// stop this repl when another repl is started
|
// stop this repl when another repl is started
|
||||||
this.onStartRepl = (e) => {
|
this.onStartRepl = (e) => {
|
||||||
if (e.detail !== this.id) {
|
if (this.solo && e.detail !== this.id) {
|
||||||
this.stop();
|
this.stop();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
document.addEventListener('start-repl', this.onStartRepl);
|
document.addEventListener('start-repl', this.onStartRepl);
|
||||||
}
|
}
|
||||||
// adjusts draw time depending on if there are painters
|
draw(haps, time, painters) {
|
||||||
adjustDrawTime() {
|
painters?.forEach((painter) => painter(this.drawContext, time, haps, this.drawTime));
|
||||||
// when no painters are set, [0,0] is enough (just highlighting)
|
|
||||||
this.drawer.setDrawTime(this.painters.length ? this.drawTime : [0, 0]);
|
|
||||||
}
|
}
|
||||||
async drawFirstFrame() {
|
async drawFirstFrame() {
|
||||||
if (!this.onDraw) {
|
if (!this.onDraw) {
|
||||||
@@ -238,7 +243,7 @@ export class StrudelMirror {
|
|||||||
await this.repl.evaluate(this.code, false);
|
await this.repl.evaluate(this.code, false);
|
||||||
this.drawer.invalidate(this.repl.scheduler, -0.001);
|
this.drawer.invalidate(this.repl.scheduler, -0.001);
|
||||||
// draw at -0.001 to avoid haps at 0 to be visualized as active
|
// draw at -0.001 to avoid haps at 0 to be visualized as active
|
||||||
this.onDraw?.(this.drawer.visibleHaps, -0.001, [], this.painters);
|
this.onDraw?.(this.drawer.visibleHaps, -0.001, this.drawer.painters);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
console.warn('first frame could not be painted');
|
console.warn('first frame could not be painted');
|
||||||
}
|
}
|
||||||
@@ -290,9 +295,15 @@ export class StrudelMirror {
|
|||||||
setLineWrappingEnabled(enabled) {
|
setLineWrappingEnabled(enabled) {
|
||||||
this.reconfigureExtension('isLineWrappingEnabled', enabled);
|
this.reconfigureExtension('isLineWrappingEnabled', enabled);
|
||||||
}
|
}
|
||||||
|
setBracketMatchingEnabled(enabled) {
|
||||||
|
this.reconfigureExtension('isBracketMatchingEnabled', enabled);
|
||||||
|
}
|
||||||
setLineNumbersDisplayed(enabled) {
|
setLineNumbersDisplayed(enabled) {
|
||||||
this.reconfigureExtension('isLineNumbersDisplayed', enabled);
|
this.reconfigureExtension('isLineNumbersDisplayed', enabled);
|
||||||
}
|
}
|
||||||
|
setBracketClosingEnabled(enabled) {
|
||||||
|
this.reconfigureExtension('isBracketClosingEnabled', enabled);
|
||||||
|
}
|
||||||
setTheme(theme) {
|
setTheme(theme) {
|
||||||
this.reconfigureExtension('theme', theme);
|
this.reconfigureExtension('theme', theme);
|
||||||
}
|
}
|
||||||
@@ -325,6 +336,17 @@ export class StrudelMirror {
|
|||||||
clear() {
|
clear() {
|
||||||
this.onStartRepl && document.removeEventListener('start-repl', this.onStartRepl);
|
this.onStartRepl && document.removeEventListener('start-repl', this.onStartRepl);
|
||||||
}
|
}
|
||||||
|
getCursorLocation() {
|
||||||
|
return this.editor.state.selection.main.head;
|
||||||
|
}
|
||||||
|
setCursorLocation(col) {
|
||||||
|
return this.editor.dispatch({ selection: { anchor: col } });
|
||||||
|
}
|
||||||
|
appendCode(code) {
|
||||||
|
const cursor = this.getCursorLocation();
|
||||||
|
this.setCode(this.code + code);
|
||||||
|
this.setCursorLocation(cursor);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function parseBooleans(value) {
|
function parseBooleans(value) {
|
||||||
@@ -337,3 +359,12 @@ function s4() {
|
|||||||
.toString(16)
|
.toString(16)
|
||||||
.substring(1);
|
.substring(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Overrides the css of highlighted events. Make sure to use single quotes!
|
||||||
|
* @name markcss
|
||||||
|
* @example
|
||||||
|
* note("c a f e")
|
||||||
|
* .markcss('text-decoration:underline')
|
||||||
|
*/
|
||||||
|
export const markcss = registerControl('markcss');
|
||||||
|
|||||||
@@ -57,6 +57,9 @@ const visibleMiniLocations = StateField.define({
|
|||||||
// this is why we need to find a way to update the existing decorations, showing the ones that have an active range
|
// this is why we need to find a way to update the existing decorations, showing the ones that have an active range
|
||||||
const haps = new Map();
|
const haps = new Map();
|
||||||
for (let hap of e.value.haps) {
|
for (let hap of e.value.haps) {
|
||||||
|
if (!hap.context?.locations || !hap.whole) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
for (let { start, end } of hap.context.locations) {
|
for (let { start, end } of hap.context.locations) {
|
||||||
let id = `${start}:${end}`;
|
let id = `${start}:${end}`;
|
||||||
if (!haps.has(id) || haps.get(id).whole.begin.lt(hap.whole.begin)) {
|
if (!haps.has(id) || haps.get(id).whole.begin.lt(hap.whole.begin)) {
|
||||||
@@ -64,7 +67,6 @@ const visibleMiniLocations = StateField.define({
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
visible = { atTime: e.value.atTime, haps };
|
visible = { atTime: e.value.atTime, haps };
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -90,7 +92,8 @@ const miniLocationHighlights = EditorView.decorations.compute([miniLocations, vi
|
|||||||
|
|
||||||
if (haps.has(id)) {
|
if (haps.has(id)) {
|
||||||
const hap = haps.get(id);
|
const hap = haps.get(id);
|
||||||
const color = hap.context.color ?? 'var(--foreground)';
|
const color = hap.value?.color ?? 'var(--foreground)';
|
||||||
|
const style = hap.value?.markcss || `outline: solid 2px ${color}`;
|
||||||
// Get explicit channels for color values
|
// Get explicit channels for color values
|
||||||
/*
|
/*
|
||||||
const swatch = document.createElement('div');
|
const swatch = document.createElement('div');
|
||||||
@@ -112,7 +115,7 @@ const miniLocationHighlights = EditorView.decorations.compute([miniLocations, vi
|
|||||||
to,
|
to,
|
||||||
Decoration.mark({
|
Decoration.mark({
|
||||||
// attributes: { style: `outline: solid 2px rgba(${channels.join(', ')})` },
|
// attributes: { style: `outline: solid 2px rgba(${channels.join(', ')})` },
|
||||||
attributes: { style: `outline: solid 2px ${color}` },
|
attributes: { style },
|
||||||
}),
|
}),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,3 +3,4 @@ export * from './highlight.mjs';
|
|||||||
export * from './flash.mjs';
|
export * from './flash.mjs';
|
||||||
export * from './slider.mjs';
|
export * from './slider.mjs';
|
||||||
export * from './themes.mjs';
|
export * from './themes.mjs';
|
||||||
|
export * from './widget.mjs';
|
||||||
|
|||||||
@@ -1,11 +1,10 @@
|
|||||||
{
|
{
|
||||||
"name": "@strudel/codemirror",
|
"name": "@strudel/codemirror",
|
||||||
"version": "0.10.0",
|
"version": "1.1.0",
|
||||||
"description": "Codemirror Extensions for Strudel",
|
"description": "Codemirror Extensions for Strudel",
|
||||||
"main": "index.mjs",
|
"main": "index.mjs",
|
||||||
"publishConfig": {
|
"publishConfig": {
|
||||||
"main": "dist/index.js",
|
"main": "dist/index.mjs"
|
||||||
"module": "dist/index.mjs"
|
|
||||||
},
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"build": "vite build",
|
"build": "vite build",
|
||||||
@@ -33,24 +32,24 @@
|
|||||||
},
|
},
|
||||||
"homepage": "https://github.com/tidalcycles/strudel#readme",
|
"homepage": "https://github.com/tidalcycles/strudel#readme",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@codemirror/autocomplete": "^6.11.1",
|
"@codemirror/autocomplete": "^6.18.4",
|
||||||
"@codemirror/commands": "^6.3.3",
|
"@codemirror/commands": "^6.8.0",
|
||||||
"@codemirror/lang-javascript": "^6.2.1",
|
"@codemirror/lang-javascript": "^6.2.2",
|
||||||
"@codemirror/language": "^6.10.0",
|
"@codemirror/language": "^6.10.8",
|
||||||
"@codemirror/search": "^6.5.5",
|
"@codemirror/search": "^6.5.8",
|
||||||
"@codemirror/state": "^6.4.0",
|
"@codemirror/state": "^6.5.1",
|
||||||
"@codemirror/view": "^6.23.0",
|
"@codemirror/view": "^6.36.2",
|
||||||
"@lezer/highlight": "^1.2.0",
|
"@lezer/highlight": "^1.2.1",
|
||||||
"@nanostores/persistent": "^0.9.1",
|
"@nanostores/persistent": "^0.10.2",
|
||||||
"@replit/codemirror-emacs": "^6.0.1",
|
"@replit/codemirror-emacs": "^6.1.0",
|
||||||
"@replit/codemirror-vim": "^6.1.0",
|
"@replit/codemirror-vim": "^6.2.1",
|
||||||
"@replit/codemirror-vscode-keymap": "^6.0.2",
|
"@replit/codemirror-vscode-keymap": "^6.0.2",
|
||||||
"@strudel.cycles/core": "workspace:*",
|
"@strudel/core": "workspace:*",
|
||||||
"@uiw/codemirror-themes": "^4.21.21",
|
"@strudel/draw": "workspace:*",
|
||||||
"@uiw/codemirror-themes-all": "^4.21.21",
|
"@strudel/transpiler": "workspace:*",
|
||||||
"nanostores": "^0.9.5"
|
"nanostores": "^0.11.3"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"vite": "^5.0.10"
|
"vite": "^6.0.11"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import { ref, pure } from '@strudel.cycles/core';
|
import { ref, pure } from '@strudel/core';
|
||||||
import { WidgetType, ViewPlugin, Decoration } from '@codemirror/view';
|
import { WidgetType, ViewPlugin, Decoration } from '@codemirror/view';
|
||||||
import { StateEffect, StateField } from '@codemirror/state';
|
import { StateEffect } from '@codemirror/state';
|
||||||
|
|
||||||
export let sliderValues = {};
|
export let sliderValues = {};
|
||||||
const getSliderID = (from) => `slider_${from}`;
|
const getSliderID = (from) => `slider_${from}`;
|
||||||
@@ -60,14 +60,16 @@ export class SliderWidget extends WidgetType {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export const setWidgets = StateEffect.define();
|
export const setSliderWidgets = StateEffect.define();
|
||||||
|
|
||||||
export const updateWidgets = (view, widgets) => {
|
export const updateSliderWidgets = (view, widgets) => {
|
||||||
view.dispatch({ effects: setWidgets.of(widgets) });
|
view.dispatch({ effects: setSliderWidgets.of(widgets) });
|
||||||
};
|
};
|
||||||
|
|
||||||
function getWidgets(widgetConfigs, view) {
|
function getSliders(widgetConfigs, view) {
|
||||||
return widgetConfigs.map(({ from, to, value, min, max, step }) => {
|
return widgetConfigs
|
||||||
|
.filter((w) => w.type === 'slider')
|
||||||
|
.map(({ from, to, value, min, max, step }) => {
|
||||||
return Decoration.widget({
|
return Decoration.widget({
|
||||||
widget: new SliderWidget(value, min, max, from, to, step, view),
|
widget: new SliderWidget(value, min, max, from, to, step, view),
|
||||||
side: 0,
|
side: 0,
|
||||||
@@ -99,8 +101,8 @@ export const sliderPlugin = ViewPlugin.fromClass(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (let e of tr.effects) {
|
for (let e of tr.effects) {
|
||||||
if (e.is(setWidgets)) {
|
if (e.is(setSliderWidgets)) {
|
||||||
this.decorations = Decoration.set(getWidgets(e.value, update.view));
|
this.decorations = Decoration.set(getSliders(e.value, update.view));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
Vendored
+83
-396
@@ -1,42 +1,43 @@
|
|||||||
import {
|
import strudelTheme, { settings as strudelThemeSettings } from './themes/strudel-theme.mjs';
|
||||||
abcdef,
|
import bluescreen, { settings as bluescreenSettings } from './themes/bluescreen.mjs';
|
||||||
androidstudio,
|
import blackscreen, { settings as blackscreenSettings } from './themes/blackscreen.mjs';
|
||||||
atomone,
|
import whitescreen, { settings as whitescreenSettings } from './themes/whitescreen.mjs';
|
||||||
aura,
|
import teletext, { settings as teletextSettings } from './themes/teletext.mjs';
|
||||||
bespin,
|
import algoboy, { settings as algoboySettings } from './themes/algoboy.mjs';
|
||||||
darcula,
|
import CutiePi, { settings as CutiePiSettings } from './themes/CutiePi.mjs';
|
||||||
dracula,
|
import terminal, { settings as terminalSettings } from './themes/terminal.mjs';
|
||||||
duotoneDark,
|
import abcdef, { settings as abcdefSettings } from './themes/abcdef.mjs';
|
||||||
eclipse,
|
import androidstudio, { settings as androidstudioSettings } from './themes/androidstudio.mjs';
|
||||||
githubDark,
|
import atomone, { settings as atomOneSettings } from './themes/atomone.mjs';
|
||||||
gruvboxDark,
|
import aura, { settings as auraSettings } from './themes/aura.mjs';
|
||||||
materialDark,
|
import bespin, { settings as bespinSettings } from './themes/bespin.mjs';
|
||||||
nord,
|
import darcula, { settings as darculaSettings } from './themes/darcula.mjs';
|
||||||
okaidia,
|
import dracula, { settings as draculaSettings } from './themes/dracula.mjs';
|
||||||
solarizedDark,
|
import duotoneDark, { settings as duotoneDarkSettings } from './themes/duotoneDark.mjs';
|
||||||
sublime,
|
import duotoneLight, { settings as duotoneLightSettings } from './themes/duotoneLight.mjs';
|
||||||
tokyoNight,
|
import eclipse, { settings as eclipseSettings } from './themes/eclipse.mjs';
|
||||||
tokyoNightStorm,
|
import githubDark, { settings as githubDarkSettings } from './themes/githubDark.mjs';
|
||||||
vscodeDark,
|
import githubLight, { settings as githubLightSettings } from './themes/githubLight.mjs';
|
||||||
xcodeDark,
|
import gruvboxDark, { settings as gruvboxDarkSettings } from './themes/gruvboxDark.mjs';
|
||||||
bbedit,
|
import gruvboxLight, { settings as gruvboxLightSettings } from './themes/gruvboxLight.mjs';
|
||||||
duotoneLight,
|
import materialDark, { settings as materialDarkSettings } from './themes/materialDark.mjs';
|
||||||
githubLight,
|
import materialLight, { settings as materialLightSettings } from './themes/materialLight.mjs';
|
||||||
gruvboxLight,
|
import nord, { settings as nordSettings } from './themes/nord.mjs';
|
||||||
materialLight,
|
import monokai, { settings as monokaiSettings } from './themes/monokai.mjs';
|
||||||
noctisLilac,
|
import solarizedDark, { settings as solarizedDarkSettings } from './themes/solarizedDark.mjs';
|
||||||
solarizedLight,
|
import solarizedLight, { settings as solarizedLightSettings } from './themes/solarizedLight.mjs';
|
||||||
tokyoNightDay,
|
import sublime, { settings as sublimeSettings } from './themes/sublime.mjs';
|
||||||
xcodeLight,
|
import tokyoNight, { settings as tokyoNightSettings } from './themes/tokyoNight.mjs';
|
||||||
} from '@uiw/codemirror-themes-all';
|
import tokyoNightStorm, { settings as tokyoNightStormSettings } from './themes/tokioNightStorm.mjs';
|
||||||
|
import tokyoNightDay, { settings as tokyoNightDaySettings } from './themes/tokyoNightDay.mjs';
|
||||||
|
import vscodeDark, { settings as vscodeDarkSettings } from './themes/vscodeDark.mjs';
|
||||||
|
import vscodeLight, { settings as vscodeLightSettings } from './themes/vscodeLight.mjs';
|
||||||
|
// import xcodeDark, { settings as xcodeDarkSettings } from './themes/xcodeDark.mjs';
|
||||||
|
import xcodeLight, { settings as xcodeLightSettings } from './themes/xcodeLight.mjs';
|
||||||
|
import bbedit, { settings as bbeditSettings } from './themes/bbedit.mjs';
|
||||||
|
import noctisLilac, { settings as noctisLilacSettings } from './themes/noctisLilac.mjs';
|
||||||
|
|
||||||
import strudelTheme from './themes/strudel-theme';
|
import { setTheme } from '@strudel/draw';
|
||||||
import bluescreen, { settings as bluescreenSettings } from './themes/bluescreen';
|
|
||||||
import blackscreen, { settings as blackscreenSettings } from './themes/blackscreen';
|
|
||||||
import whitescreen, { settings as whitescreenSettings } from './themes/whitescreen';
|
|
||||||
import teletext, { settings as teletextSettings } from './themes/teletext';
|
|
||||||
import algoboy, { settings as algoboySettings } from './themes/algoboy';
|
|
||||||
import terminal, { settings as terminalSettings } from './themes/terminal';
|
|
||||||
|
|
||||||
export const themes = {
|
export const themes = {
|
||||||
strudelTheme,
|
strudelTheme,
|
||||||
@@ -45,395 +46,80 @@ export const themes = {
|
|||||||
whitescreen,
|
whitescreen,
|
||||||
teletext,
|
teletext,
|
||||||
algoboy,
|
algoboy,
|
||||||
terminal,
|
|
||||||
abcdef,
|
|
||||||
androidstudio,
|
|
||||||
atomone,
|
atomone,
|
||||||
aura,
|
aura,
|
||||||
bespin,
|
|
||||||
darcula,
|
darcula,
|
||||||
dracula,
|
dracula,
|
||||||
|
// todo: optimize
|
||||||
|
// bespin,
|
||||||
|
//abcdef,
|
||||||
|
androidstudio,
|
||||||
duotoneDark,
|
duotoneDark,
|
||||||
eclipse,
|
|
||||||
githubDark,
|
githubDark,
|
||||||
|
CutiePi,
|
||||||
gruvboxDark,
|
gruvboxDark,
|
||||||
materialDark,
|
materialDark,
|
||||||
nord,
|
nord,
|
||||||
okaidia,
|
monokai,
|
||||||
solarizedDark,
|
solarizedDark,
|
||||||
sublime,
|
sublime,
|
||||||
tokyoNight,
|
tokyoNight,
|
||||||
tokyoNightStorm,
|
tokyoNightStorm,
|
||||||
vscodeDark,
|
vscodeDark,
|
||||||
xcodeDark,
|
//xcodeDark,
|
||||||
|
// LIGHT
|
||||||
bbedit,
|
bbedit,
|
||||||
duotoneLight,
|
//duotoneLight,
|
||||||
|
eclipse,
|
||||||
githubLight,
|
githubLight,
|
||||||
gruvboxLight,
|
gruvboxLight,
|
||||||
materialLight,
|
materialLight,
|
||||||
|
vscodeLight,
|
||||||
noctisLilac,
|
noctisLilac,
|
||||||
solarizedLight,
|
solarizedLight,
|
||||||
tokyoNightDay,
|
tokyoNightDay,
|
||||||
xcodeLight,
|
xcodeLight,
|
||||||
};
|
};
|
||||||
|
|
||||||
// lineBackground is background with 50% opacity, to make sure the selection below is visible
|
|
||||||
|
|
||||||
export const settings = {
|
export const settings = {
|
||||||
strudelTheme: {
|
strudelTheme: strudelThemeSettings,
|
||||||
background: '#222',
|
|
||||||
lineBackground: '#22222299',
|
|
||||||
foreground: '#fff',
|
|
||||||
// foreground: '#75baff',
|
|
||||||
caret: '#ffcc00',
|
|
||||||
selection: 'rgba(128, 203, 196, 0.5)',
|
|
||||||
selectionMatch: '#036dd626',
|
|
||||||
// lineHighlight: '#8a91991a', // original
|
|
||||||
lineHighlight: '#00000050',
|
|
||||||
gutterBackground: 'transparent',
|
|
||||||
// gutterForeground: '#8a919966',
|
|
||||||
gutterForeground: '#8a919966',
|
|
||||||
},
|
|
||||||
bluescreen: bluescreenSettings,
|
bluescreen: bluescreenSettings,
|
||||||
blackscreen: blackscreenSettings,
|
blackscreen: blackscreenSettings,
|
||||||
whitescreen: whitescreenSettings,
|
whitescreen: whitescreenSettings,
|
||||||
teletext: teletextSettings,
|
teletext: teletextSettings,
|
||||||
algoboy: algoboySettings,
|
algoboy: algoboySettings,
|
||||||
terminal: terminalSettings,
|
terminal: terminalSettings,
|
||||||
abcdef: {
|
abcdef: abcdefSettings,
|
||||||
background: '#0f0f0f',
|
androidstudio: androidstudioSettings,
|
||||||
lineBackground: '#0f0f0f99',
|
atomone: atomOneSettings,
|
||||||
foreground: '#defdef',
|
aura: auraSettings,
|
||||||
caret: '#00FF00',
|
bbedit: bbeditSettings,
|
||||||
selection: '#515151',
|
bespin: bespinSettings,
|
||||||
selectionMatch: '#515151',
|
darcula: darculaSettings,
|
||||||
gutterBackground: '#555',
|
dracula: draculaSettings,
|
||||||
gutterForeground: '#FFFFFF',
|
duotoneLight: duotoneLightSettings,
|
||||||
lineHighlight: '#314151',
|
duotoneDark: duotoneDarkSettings,
|
||||||
},
|
eclipse: eclipseSettings,
|
||||||
androidstudio: {
|
CutiePi: CutiePiSettings,
|
||||||
background: '#282b2e',
|
githubLight: githubLightSettings,
|
||||||
lineBackground: '#282b2e99',
|
githubDark: githubDarkSettings,
|
||||||
foreground: '#a9b7c6',
|
gruvboxDark: gruvboxDarkSettings,
|
||||||
caret: '#00FF00',
|
gruvboxLight: gruvboxLightSettings,
|
||||||
selection: '#343739',
|
materialDark: materialDarkSettings,
|
||||||
selectionMatch: '#343739',
|
materialLight: materialLightSettings,
|
||||||
lineHighlight: '#343739',
|
noctisLilac: noctisLilacSettings,
|
||||||
},
|
nord: nordSettings,
|
||||||
atomone: {
|
monokai: monokaiSettings,
|
||||||
background: '#272C35',
|
solarizedLight: solarizedLightSettings,
|
||||||
lineBackground: '#272C3599',
|
solarizedDark: solarizedDarkSettings,
|
||||||
foreground: '#9d9b97',
|
sublime: sublimeSettings,
|
||||||
caret: '#797977',
|
tokyoNight: tokyoNightSettings,
|
||||||
selection: '#ffffff30',
|
tokyoNightStorm: tokyoNightStormSettings,
|
||||||
selectionMatch: '#2B323D',
|
vscodeDark: vscodeDarkSettings,
|
||||||
gutterBackground: '#272C35',
|
vscodeLight: vscodeLightSettings,
|
||||||
gutterForeground: '#465063',
|
xcodeLight: xcodeLightSettings,
|
||||||
gutterBorder: 'transparent',
|
//xcodeDark: xcodeDarkSettings,
|
||||||
lineHighlight: '#2B323D',
|
tokyoNightDay: tokyoNightDaySettings,
|
||||||
},
|
|
||||||
aura: {
|
|
||||||
background: '#21202e',
|
|
||||||
lineBackground: '#21202e99',
|
|
||||||
foreground: '#edecee',
|
|
||||||
caret: '#a277ff',
|
|
||||||
selection: '#3d375e7f',
|
|
||||||
selectionMatch: '#3d375e7f',
|
|
||||||
gutterBackground: '#21202e',
|
|
||||||
gutterForeground: '#edecee',
|
|
||||||
gutterBorder: 'transparent',
|
|
||||||
lineHighlight: '#a394f033',
|
|
||||||
},
|
|
||||||
bbedit: {
|
|
||||||
light: true,
|
|
||||||
background: '#FFFFFF',
|
|
||||||
lineBackground: '#FFFFFF99',
|
|
||||||
foreground: '#000000',
|
|
||||||
caret: '#FBAC52',
|
|
||||||
selection: '#FFD420',
|
|
||||||
selectionMatch: '#FFD420',
|
|
||||||
gutterBackground: '#f5f5f5',
|
|
||||||
gutterForeground: '#4D4D4C',
|
|
||||||
gutterBorder: 'transparent',
|
|
||||||
lineHighlight: '#00000012',
|
|
||||||
},
|
|
||||||
bespin: {
|
|
||||||
background: '#28211c',
|
|
||||||
lineBackground: '#28211c99',
|
|
||||||
foreground: '#9d9b97',
|
|
||||||
caret: '#797977',
|
|
||||||
selection: '#36312e',
|
|
||||||
selectionMatch: '#4f382b',
|
|
||||||
gutterBackground: '#28211c',
|
|
||||||
gutterForeground: '#666666',
|
|
||||||
lineHighlight: 'rgba(255, 255, 255, 0.1)',
|
|
||||||
},
|
|
||||||
darcula: {
|
|
||||||
background: '#2B2B2B',
|
|
||||||
lineBackground: '#2B2B2B99',
|
|
||||||
foreground: '#f8f8f2',
|
|
||||||
caret: '#FFFFFF',
|
|
||||||
selection: 'rgba(255, 255, 255, 0.1)',
|
|
||||||
selectionMatch: 'rgba(255, 255, 255, 0.2)',
|
|
||||||
gutterBackground: 'rgba(255, 255, 255, 0.1)',
|
|
||||||
gutterForeground: '#999',
|
|
||||||
gutterBorder: 'transparent',
|
|
||||||
lineHighlight: 'rgba(255, 255, 255, 0.1)',
|
|
||||||
},
|
|
||||||
dracula: {
|
|
||||||
background: '#282a36',
|
|
||||||
lineBackground: '#282a3699',
|
|
||||||
foreground: '#f8f8f2',
|
|
||||||
caret: '#f8f8f0',
|
|
||||||
selection: 'rgba(255, 255, 255, 0.1)',
|
|
||||||
selectionMatch: 'rgba(255, 255, 255, 0.2)',
|
|
||||||
gutterBackground: '#282a36',
|
|
||||||
gutterForeground: '#6D8A88',
|
|
||||||
gutterBorder: 'transparent',
|
|
||||||
lineHighlight: 'rgba(255, 255, 255, 0.1)',
|
|
||||||
},
|
|
||||||
duotoneLight: {
|
|
||||||
light: true,
|
|
||||||
background: '#faf8f5',
|
|
||||||
lineBackground: '#faf8f599',
|
|
||||||
foreground: '#b29762',
|
|
||||||
caret: '#93abdc',
|
|
||||||
selection: '#e3dcce',
|
|
||||||
selectionMatch: '#e3dcce',
|
|
||||||
gutterBackground: '#faf8f5',
|
|
||||||
gutterForeground: '#cdc4b1',
|
|
||||||
gutterBorder: 'transparent',
|
|
||||||
lineHighlight: '#EFEFEF',
|
|
||||||
},
|
|
||||||
duotoneDark: {
|
|
||||||
background: '#2a2734',
|
|
||||||
lineBackground: '#2a273499',
|
|
||||||
foreground: '#6c6783',
|
|
||||||
caret: '#ffad5c',
|
|
||||||
selection: 'rgba(255, 255, 255, 0.1)',
|
|
||||||
gutterBackground: '#2a2734',
|
|
||||||
gutterForeground: '#545167',
|
|
||||||
lineHighlight: '#36334280',
|
|
||||||
},
|
|
||||||
eclipse: {
|
|
||||||
light: true,
|
|
||||||
background: '#fff',
|
|
||||||
lineBackground: '#ffffff99',
|
|
||||||
foreground: '#000',
|
|
||||||
caret: '#FFFFFF',
|
|
||||||
selection: '#d7d4f0',
|
|
||||||
selectionMatch: '#d7d4f0',
|
|
||||||
gutterBackground: '#f7f7f7',
|
|
||||||
gutterForeground: '#999',
|
|
||||||
lineHighlight: '#e8f2ff',
|
|
||||||
gutterBorder: 'transparent',
|
|
||||||
},
|
|
||||||
githubLight: {
|
|
||||||
light: true,
|
|
||||||
background: '#fff',
|
|
||||||
lineBackground: '#ffffff99',
|
|
||||||
foreground: '#24292e',
|
|
||||||
selection: '#BBDFFF',
|
|
||||||
selectionMatch: '#BBDFFF',
|
|
||||||
gutterBackground: '#fff',
|
|
||||||
gutterForeground: '#6e7781',
|
|
||||||
},
|
|
||||||
githubDark: {
|
|
||||||
background: '#0d1117',
|
|
||||||
lineBackground: '#0d111799',
|
|
||||||
foreground: '#c9d1d9',
|
|
||||||
caret: '#c9d1d9',
|
|
||||||
selection: '#003d73',
|
|
||||||
selectionMatch: '#003d73',
|
|
||||||
lineHighlight: '#36334280',
|
|
||||||
},
|
|
||||||
gruvboxDark: {
|
|
||||||
background: '#282828',
|
|
||||||
lineBackground: '#28282899',
|
|
||||||
foreground: '#ebdbb2',
|
|
||||||
caret: '#ebdbb2',
|
|
||||||
selection: '#bdae93',
|
|
||||||
selectionMatch: '#bdae93',
|
|
||||||
lineHighlight: '#3c3836',
|
|
||||||
gutterBackground: '#282828',
|
|
||||||
gutterForeground: '#7c6f64',
|
|
||||||
},
|
|
||||||
gruvboxLight: {
|
|
||||||
light: true,
|
|
||||||
background: '#fbf1c7',
|
|
||||||
lineBackground: '#fbf1c799',
|
|
||||||
foreground: '#3c3836',
|
|
||||||
caret: '#af3a03',
|
|
||||||
selection: '#ebdbb2',
|
|
||||||
selectionMatch: '#bdae93',
|
|
||||||
lineHighlight: '#ebdbb2',
|
|
||||||
gutterBackground: '#ebdbb2',
|
|
||||||
gutterForeground: '#665c54',
|
|
||||||
gutterBorder: 'transparent',
|
|
||||||
},
|
|
||||||
materialDark: {
|
|
||||||
background: '#2e3235',
|
|
||||||
lineBackground: '#2e323599',
|
|
||||||
foreground: '#bdbdbd',
|
|
||||||
caret: '#a0a4ae',
|
|
||||||
selection: '#d7d4f0',
|
|
||||||
selectionMatch: '#d7d4f0',
|
|
||||||
gutterBackground: '#2e3235',
|
|
||||||
gutterForeground: '#999',
|
|
||||||
gutterActiveForeground: '#4f5b66',
|
|
||||||
lineHighlight: '#545b61',
|
|
||||||
},
|
|
||||||
materialLight: {
|
|
||||||
light: true,
|
|
||||||
background: '#FAFAFA',
|
|
||||||
lineBackground: '#FAFAFA99',
|
|
||||||
foreground: '#90A4AE',
|
|
||||||
caret: '#272727',
|
|
||||||
selection: '#80CBC440',
|
|
||||||
selectionMatch: '#FAFAFA',
|
|
||||||
gutterBackground: '#FAFAFA',
|
|
||||||
gutterForeground: '#90A4AE',
|
|
||||||
gutterBorder: 'transparent',
|
|
||||||
lineHighlight: '#CCD7DA50',
|
|
||||||
},
|
|
||||||
noctisLilac: {
|
|
||||||
light: true,
|
|
||||||
background: '#f2f1f8',
|
|
||||||
lineBackground: '#f2f1f899',
|
|
||||||
foreground: '#0c006b',
|
|
||||||
caret: '#5c49e9',
|
|
||||||
selection: '#d5d1f2',
|
|
||||||
selectionMatch: '#d5d1f2',
|
|
||||||
gutterBackground: '#f2f1f8',
|
|
||||||
gutterForeground: '#0c006b70',
|
|
||||||
lineHighlight: '#e1def3',
|
|
||||||
},
|
|
||||||
nord: {
|
|
||||||
background: '#2e3440',
|
|
||||||
lineBackground: '#2e344099',
|
|
||||||
foreground: '#FFFFFF',
|
|
||||||
caret: '#FFFFFF',
|
|
||||||
selection: '#3b4252',
|
|
||||||
selectionMatch: '#e5e9f0',
|
|
||||||
gutterBackground: '#2e3440',
|
|
||||||
gutterForeground: '#4c566a',
|
|
||||||
gutterActiveForeground: '#d8dee9',
|
|
||||||
lineHighlight: '#4c566a',
|
|
||||||
},
|
|
||||||
okaidia: {
|
|
||||||
background: '#272822',
|
|
||||||
lineBackground: '#27282299',
|
|
||||||
foreground: '#FFFFFF',
|
|
||||||
caret: '#FFFFFF',
|
|
||||||
selection: '#49483E',
|
|
||||||
selectionMatch: '#49483E',
|
|
||||||
gutterBackground: '#272822',
|
|
||||||
gutterForeground: '#FFFFFF70',
|
|
||||||
lineHighlight: '#00000059',
|
|
||||||
},
|
|
||||||
solarizedLight: {
|
|
||||||
light: true,
|
|
||||||
background: '#fdf6e3',
|
|
||||||
lineBackground: '#fdf6e399',
|
|
||||||
foreground: '#657b83',
|
|
||||||
caret: '#586e75',
|
|
||||||
selection: '#dfd9c8',
|
|
||||||
selectionMatch: '#dfd9c8',
|
|
||||||
gutterBackground: '#00000010',
|
|
||||||
gutterForeground: '#657b83',
|
|
||||||
lineHighlight: '#dfd9c8',
|
|
||||||
},
|
|
||||||
solarizedDark: {
|
|
||||||
background: '#002b36',
|
|
||||||
lineBackground: '#002b3699',
|
|
||||||
foreground: '#93a1a1',
|
|
||||||
caret: '#839496',
|
|
||||||
selection: '#173541',
|
|
||||||
selectionMatch: '#aafe661a',
|
|
||||||
gutterBackground: '#00252f',
|
|
||||||
gutterForeground: '#839496',
|
|
||||||
lineHighlight: '#173541',
|
|
||||||
},
|
|
||||||
sublime: {
|
|
||||||
background: '#303841',
|
|
||||||
lineBackground: '#30384199',
|
|
||||||
foreground: '#FFFFFF',
|
|
||||||
caret: '#FBAC52',
|
|
||||||
selection: '#4C5964',
|
|
||||||
selectionMatch: '#3A546E',
|
|
||||||
gutterBackground: '#303841',
|
|
||||||
gutterForeground: '#FFFFFF70',
|
|
||||||
lineHighlight: '#00000059',
|
|
||||||
},
|
|
||||||
tokyoNightDay: {
|
|
||||||
light: true,
|
|
||||||
background: '#e1e2e7',
|
|
||||||
lineBackground: '#e1e2e799',
|
|
||||||
foreground: '#3760bf',
|
|
||||||
caret: '#3760bf',
|
|
||||||
selection: '#99a7df',
|
|
||||||
selectionMatch: '#99a7df',
|
|
||||||
gutterBackground: '#e1e2e7',
|
|
||||||
gutterForeground: '#3760bf',
|
|
||||||
gutterBorder: 'transparent',
|
|
||||||
lineHighlight: '#5f5faf11',
|
|
||||||
},
|
|
||||||
tokyoNightStorm: {
|
|
||||||
background: '#24283b',
|
|
||||||
lineBackground: '#24283b99',
|
|
||||||
foreground: '#7982a9',
|
|
||||||
caret: '#c0caf5',
|
|
||||||
selection: '#6f7bb630',
|
|
||||||
selectionMatch: '#1f2335',
|
|
||||||
gutterBackground: '#24283b',
|
|
||||||
gutterForeground: '#7982a9',
|
|
||||||
gutterBorder: 'transparent',
|
|
||||||
lineHighlight: '#292e42',
|
|
||||||
},
|
|
||||||
tokyoNight: {
|
|
||||||
background: '#1a1b26',
|
|
||||||
lineBackground: '#1a1b2699',
|
|
||||||
foreground: '#787c99',
|
|
||||||
caret: '#c0caf5',
|
|
||||||
selection: '#515c7e40',
|
|
||||||
selectionMatch: '#16161e',
|
|
||||||
gutterBackground: '#1a1b26',
|
|
||||||
gutterForeground: '#787c99',
|
|
||||||
gutterBorder: 'transparent',
|
|
||||||
lineHighlight: '#1e202e',
|
|
||||||
},
|
|
||||||
vscodeDark: {
|
|
||||||
background: '#1e1e1e',
|
|
||||||
lineBackground: '#1e1e1e99',
|
|
||||||
foreground: '#9cdcfe',
|
|
||||||
caret: '#c6c6c6',
|
|
||||||
selection: '#6199ff2f',
|
|
||||||
selectionMatch: '#72a1ff59',
|
|
||||||
lineHighlight: '#ffffff0f',
|
|
||||||
gutterBackground: '#1e1e1e',
|
|
||||||
gutterForeground: '#838383',
|
|
||||||
gutterActiveForeground: '#fff',
|
|
||||||
},
|
|
||||||
xcodeLight: {
|
|
||||||
light: true,
|
|
||||||
background: '#fff',
|
|
||||||
lineBackground: '#ffffff99',
|
|
||||||
foreground: '#3D3D3D',
|
|
||||||
selection: '#BBDFFF',
|
|
||||||
selectionMatch: '#BBDFFF',
|
|
||||||
gutterBackground: '#fff',
|
|
||||||
gutterForeground: '#AFAFAF',
|
|
||||||
lineHighlight: '#EDF4FF',
|
|
||||||
},
|
|
||||||
xcodeDark: {
|
|
||||||
background: '#292A30',
|
|
||||||
lineBackground: '#292A3099',
|
|
||||||
foreground: '#CECFD0',
|
|
||||||
caret: '#fff',
|
|
||||||
selection: '#727377',
|
|
||||||
selectionMatch: '#727377',
|
|
||||||
lineHighlight: '#2F3239',
|
|
||||||
},
|
|
||||||
};
|
};
|
||||||
|
|
||||||
function getColors(str) {
|
function getColors(str) {
|
||||||
@@ -513,6 +199,7 @@ export function activateTheme(name) {
|
|||||||
.map(([key, value]) => `--${key}: ${value} !important;`)
|
.map(([key, value]) => `--${key}: ${value} !important;`)
|
||||||
.join('\n')}
|
.join('\n')}
|
||||||
}`;
|
}`;
|
||||||
|
setTheme(themeSettings);
|
||||||
// tailwind dark mode
|
// tailwind dark mode
|
||||||
if (themeSettings.light) {
|
if (themeSettings.light) {
|
||||||
document.documentElement.classList.remove('dark');
|
document.documentElement.classList.remove('dark');
|
||||||
|
|||||||
+45
@@ -0,0 +1,45 @@
|
|||||||
|
/**
|
||||||
|
* @name Cutie Pi
|
||||||
|
* by Switch Angel
|
||||||
|
*/
|
||||||
|
import { tags as t } from '@lezer/highlight';
|
||||||
|
import { createTheme } from './theme-helper.mjs';
|
||||||
|
const deepPurple = '#5c019a';
|
||||||
|
const yellowPink = '#fbeffc';
|
||||||
|
const grey = '#272C35';
|
||||||
|
const pinkAccent = '#fee1ff';
|
||||||
|
const lightGrey = '#465063';
|
||||||
|
const bratGreen = '#9acd3f';
|
||||||
|
const lighterGrey = '#97a1b7';
|
||||||
|
const pink = '#f6a6fd';
|
||||||
|
|
||||||
|
export const settings = {
|
||||||
|
background: 'white',
|
||||||
|
lineBackground: 'transparent',
|
||||||
|
foreground: deepPurple,
|
||||||
|
caret: '#797977',
|
||||||
|
selection: yellowPink,
|
||||||
|
selectionMatch: '#2B323D',
|
||||||
|
gutterBackground: grey,
|
||||||
|
gutterForeground: lightGrey,
|
||||||
|
gutterBorder: 'transparent',
|
||||||
|
lineHighlight: pinkAccent,
|
||||||
|
};
|
||||||
|
|
||||||
|
export default createTheme({
|
||||||
|
theme: 'light',
|
||||||
|
settings,
|
||||||
|
styles: [
|
||||||
|
{
|
||||||
|
tag: [t.function(t.variableName), t.function(t.propertyName), t.url, t.processingInstruction],
|
||||||
|
color: deepPurple,
|
||||||
|
},
|
||||||
|
{ tag: [t.tagName, t.heading], color: settings.foreground },
|
||||||
|
{ tag: t.comment, color: lighterGrey },
|
||||||
|
{ tag: [t.variableName, t.propertyName, t.labelName], color: pink },
|
||||||
|
{ tag: [t.attributeName, t.number], color: '#d19a66' },
|
||||||
|
{ tag: t.className, color: grey },
|
||||||
|
{ tag: t.keyword, color: deepPurple },
|
||||||
|
{ tag: [t.string, t.regexp, t.special(t.propertyName)], color: bratGreen },
|
||||||
|
],
|
||||||
|
});
|
||||||
+55
@@ -0,0 +1,55 @@
|
|||||||
|
/**
|
||||||
|
* @name abcdef
|
||||||
|
* @author codemirror.net
|
||||||
|
* https://codemirror.net/5/theme/abcdef.css
|
||||||
|
*/
|
||||||
|
import { tags as t } from '@lezer/highlight';
|
||||||
|
import { createTheme } from './theme-helper.mjs';
|
||||||
|
|
||||||
|
export const settings = {
|
||||||
|
background: '#0f0f0f',
|
||||||
|
lineBackground: '#0f0f0f99',
|
||||||
|
foreground: '#defdef',
|
||||||
|
caret: '#00FF00',
|
||||||
|
selection: '#515151',
|
||||||
|
selectionMatch: '#515151',
|
||||||
|
gutterBackground: '#555',
|
||||||
|
gutterForeground: '#FFFFFF',
|
||||||
|
lineHighlight: '#314151',
|
||||||
|
};
|
||||||
|
|
||||||
|
export default createTheme({
|
||||||
|
theme: 'dark',
|
||||||
|
settings: {
|
||||||
|
background: '#0f0f0f',
|
||||||
|
foreground: '#defdef',
|
||||||
|
caret: '#00FF00',
|
||||||
|
selection: '#515151',
|
||||||
|
selectionMatch: '#515151',
|
||||||
|
// gutterBackground: '#555',
|
||||||
|
gutterBackground: 'transparent',
|
||||||
|
/* gutterForeground: '#FFFFFF', */
|
||||||
|
gutterForeground: '#7a7b7c',
|
||||||
|
lineHighlight: '#0a6bcb3d',
|
||||||
|
},
|
||||||
|
styles: [
|
||||||
|
{ tag: t.labelName, color: 'inherit' },
|
||||||
|
{ tag: t.keyword, color: 'darkgoldenrod', fontWeight: 'bold' },
|
||||||
|
{ tag: t.atom, color: '#77F' },
|
||||||
|
{ tag: t.comment, color: '#7a7b7c', fontStyle: 'italic' },
|
||||||
|
{ tag: t.number, color: 'violet' },
|
||||||
|
{ tag: t.definition(t.variableName), color: '#fffabc' },
|
||||||
|
{ tag: t.variableName, color: '#abcdef' },
|
||||||
|
{ tag: t.function(t.variableName), color: '#fffabc' },
|
||||||
|
{ tag: t.typeName, color: '#FFDD44' },
|
||||||
|
{ tag: t.tagName, color: '#def' },
|
||||||
|
{ tag: t.string, color: '#2b4' },
|
||||||
|
{ tag: t.meta, color: '#C9F' },
|
||||||
|
// { tag: t.qualifier, color: '#FFF700' },
|
||||||
|
// { tag: t.builtin, color: '#30aabc' },
|
||||||
|
{ tag: t.bracket, color: '#8a8a8a' },
|
||||||
|
{ tag: t.attributeName, color: '#DDFF00' },
|
||||||
|
{ tag: t.heading, color: 'aquamarine', fontWeight: 'bold' },
|
||||||
|
{ tag: t.link, color: 'blueviolet', fontWeight: 'bold' },
|
||||||
|
],
|
||||||
|
});
|
||||||
+50
-31
@@ -1,41 +1,60 @@
|
|||||||
import { tags as t } from '@lezer/highlight';
|
import { tags as t } from '@lezer/highlight';
|
||||||
import { createTheme } from '@uiw/codemirror-themes';
|
import { createTheme } from './theme-helper.mjs';
|
||||||
|
|
||||||
|
const palettes = {
|
||||||
|
// https://www.deviantart.com/advancedfan2020/art/Game-Boy-Palette-Set-Color-HEX-Part-09-920495662
|
||||||
|
'Central Florida A': ['#FFF630', '#B3AC22', '#666213', '#191905'],
|
||||||
|
'Central Florida B': ['#38CEBA', '#279082', '#16524A', '#061513'],
|
||||||
|
'Central Florida C': ['#FF8836', '#B35F26', '#663616', '#190E05'],
|
||||||
|
'Central Florida D': ['#E07070', '#9D4E4E', '#5A2D2D', '#160B0B'],
|
||||||
|
'Central Florida E': ['#7AA4CB', '#55738E', '#314251', '#0C1014'],
|
||||||
|
'Feminine Energy A': ['#DC5686', '#9A415E', '#582536', '#16090D'],
|
||||||
|
'Feminine Energy B': ['#D0463C', '#92312A', '#531c18', '#150706'],
|
||||||
|
'Feminine Energy C': ['#D86918', '#974A11', '#562A0A', '#160A02'],
|
||||||
|
'Feminine Energy D': ['#EFC54F', '#A78A36', '#604F20', '#181408'],
|
||||||
|
'Feminine Energy E': ['#866399', '#5e456b', '#36283d', '#0d0a0f'],
|
||||||
|
'Sour Watermelon A': ['#993366', '#6B2447', '#3D1429', '#0F050A'],
|
||||||
|
'Sour Watermelon B': ['#996666', '#6B4747', '#3D2929', '#0F0A0A'],
|
||||||
|
'Sour Watermelon C': ['#999966', '#686B47', '#3d3d29', '#0f0f0A'],
|
||||||
|
'Sour Watermelon D': ['#99cc66', '#6b8f47', '#3d5229', '#0f140a'],
|
||||||
|
'Sour Watermelon E': ['#99ff66', '#6bb347', '#3d6629', '#0f190a'],
|
||||||
|
//https://www.deviantart.com/advancedfan2020/art/Game-Boy-Palette-Set-Color-HEX-Part-02-920073260
|
||||||
|
'Peri Peaceful A': ['#909BE9', '#656DA3', '#3A3E5D', '#0e0f17'],
|
||||||
|
'Peri Peaceful B': ['#68628d', '#494563', '#2a2738', '#0a0a0e'], // pretty dim
|
||||||
|
'Peri Peaceful E': ['#b5a0a9', '#7f7076', '#484044', '#121011'],
|
||||||
|
'Hichem Palette B': ['#4fa3a5', '#377273', '#204142', '#081010'],
|
||||||
|
'Hichem Palette C': ['#Fe6f9b', '#b24e6d', '#662c3e', '#190b0f'],
|
||||||
|
'Hichem Palette D': ['#ffbb5a', '#b3833f', '#664b24', '#191309'],
|
||||||
|
'JSR2 A': ['#E0EFC0', '#9da786', '#5a604d', '#161813'],
|
||||||
|
};
|
||||||
|
const palette = palettes['Sour Watermelon B'];
|
||||||
export const settings = {
|
export const settings = {
|
||||||
background: '#9bbc0f',
|
background: palette[3],
|
||||||
foreground: '#0f380f', // whats that?
|
foreground: palette[1],
|
||||||
caret: '#0f380f',
|
caret: palette[0],
|
||||||
selection: '#306230',
|
selection: palette[0],
|
||||||
selectionMatch: '#ffffff26',
|
selectionMatch: palette[1],
|
||||||
lineHighlight: '#8bac0f',
|
lineHighlight: palette[3],
|
||||||
lineBackground: '#9bbc0f50',
|
lineBackground: palette[3] + '90',
|
||||||
//lineBackground: 'transparent',
|
//lineBackground: 'transparent',
|
||||||
gutterBackground: 'transparent',
|
gutterBackground: 'transparent',
|
||||||
gutterForeground: '#0f380f',
|
gutterForeground: palette[0],
|
||||||
light: true,
|
light: false,
|
||||||
customStyle: '.cm-line { line-height: 1 }',
|
// customStyle: '.cm-line { line-height: 1 }',
|
||||||
};
|
};
|
||||||
export default createTheme({
|
export default createTheme({
|
||||||
theme: 'light',
|
theme: 'dark',
|
||||||
settings,
|
settings,
|
||||||
styles: [
|
styles: [
|
||||||
{ tag: t.keyword, color: '#0f380f' },
|
{ tag: t.comment, color: palette[2] },
|
||||||
{ tag: t.operator, color: '#0f380f' },
|
{ tag: t.string, color: palette[1] },
|
||||||
{ tag: t.special(t.variableName), color: '#0f380f' },
|
{ tag: [t.atom, t.number], color: palette[1] },
|
||||||
{ tag: t.typeName, color: '#0f380f' },
|
{ tag: [t.meta, t.labelName, t.variableName], color: palette[0] },
|
||||||
{ tag: t.atom, color: '#0f380f' },
|
{
|
||||||
{ tag: t.number, color: '#0f380f' },
|
tag: [t.keyword, t.tagName, t.arithmeticOperator],
|
||||||
{ tag: t.definition(t.variableName), color: '#0f380f' },
|
color: palette[1],
|
||||||
{ tag: t.string, color: '#0f380f' },
|
},
|
||||||
{ tag: t.special(t.string), color: '#0f380f' },
|
{ tag: [t.function(t.variableName), t.propertyName], color: palette[0] },
|
||||||
{ tag: t.comment, color: '#0f380f' },
|
{ tag: t.atom, color: palette[1] },
|
||||||
{ tag: t.variableName, color: '#0f380f' },
|
|
||||||
{ tag: t.tagName, color: '#0f380f' },
|
|
||||||
{ tag: t.bracket, color: '#0f380f' },
|
|
||||||
{ tag: t.meta, color: '#0f380f' },
|
|
||||||
{ tag: t.attributeName, color: '#0f380f' },
|
|
||||||
{ tag: t.propertyName, color: '#0f380f' },
|
|
||||||
{ tag: t.className, color: '#0f380f' },
|
|
||||||
{ tag: t.invalid, color: '#0f380f' },
|
|
||||||
{ tag: [t.unit, t.punctuation], color: '#0f380f' },
|
|
||||||
],
|
],
|
||||||
});
|
});
|
||||||
|
|||||||
+43
@@ -0,0 +1,43 @@
|
|||||||
|
/**
|
||||||
|
* @name androidstudio
|
||||||
|
*/
|
||||||
|
import { tags as t } from '@lezer/highlight';
|
||||||
|
import { createTheme } from './theme-helper.mjs';
|
||||||
|
|
||||||
|
export const settings = {
|
||||||
|
background: '#282b2e',
|
||||||
|
lineBackground: '#282b2e99',
|
||||||
|
foreground: '#a9b7c6',
|
||||||
|
caret: '#00FF00',
|
||||||
|
selection: '#343739',
|
||||||
|
selectionMatch: '#343739',
|
||||||
|
lineHighlight: '#343739',
|
||||||
|
};
|
||||||
|
|
||||||
|
export default createTheme({
|
||||||
|
theme: 'dark',
|
||||||
|
settings: {
|
||||||
|
background: '#282b2e',
|
||||||
|
foreground: '#a9b7c6',
|
||||||
|
caret: '#00FF00',
|
||||||
|
selection: '#4e5254',
|
||||||
|
selectionMatch: '#4e5254',
|
||||||
|
gutterForeground: '#cccccc50',
|
||||||
|
lineHighlight: '#7f85891f',
|
||||||
|
},
|
||||||
|
styles: [
|
||||||
|
{ tag: t.labelName, color: 'inherit' },
|
||||||
|
{ tag: [t.keyword, t.deleted, t.className], color: '#a9b7c6' },
|
||||||
|
{ tag: [t.number, t.literal], color: '#6897bb' },
|
||||||
|
//{ tag: [t.link, t.variableName], color: '#629755' },
|
||||||
|
{ tag: [t.link, t.variableName], color: '#a9b7c6' },
|
||||||
|
{ tag: [t.comment, t.quote], color: 'grey' },
|
||||||
|
{ tag: [t.meta, t.documentMeta], color: '#bbb529' },
|
||||||
|
//{ tag: [t.string, t.propertyName, t.attributeValue], color: '#6a8759' },
|
||||||
|
{ tag: [t.propertyName, t.attributeValue], color: '#a9b7c6' },
|
||||||
|
{ tag: [t.string], color: '#6a8759' },
|
||||||
|
{ tag: [t.heading, t.typeName], color: '#ffc66d' },
|
||||||
|
{ tag: [t.attributeName], color: '#a9b7c6' },
|
||||||
|
{ tag: [t.emphasis], fontStyle: 'italic' },
|
||||||
|
],
|
||||||
|
});
|
||||||
+49
@@ -0,0 +1,49 @@
|
|||||||
|
/**
|
||||||
|
* @name Atom One
|
||||||
|
* Atom One dark syntax theme
|
||||||
|
*
|
||||||
|
* https://github.com/atom/one-dark-syntax
|
||||||
|
*/
|
||||||
|
import { tags as t } from '@lezer/highlight';
|
||||||
|
import { createTheme } from './theme-helper.mjs';
|
||||||
|
|
||||||
|
export const settings = {
|
||||||
|
background: '#272C35',
|
||||||
|
lineBackground: '#272C3599',
|
||||||
|
foreground: 'hsl(220, 14%, 71%)',
|
||||||
|
caret: '#797977',
|
||||||
|
selection: '#ffffff30',
|
||||||
|
selectionMatch: '#2B323D',
|
||||||
|
gutterBackground: '#272C35',
|
||||||
|
gutterForeground: '#465063',
|
||||||
|
gutterBorder: 'transparent',
|
||||||
|
lineHighlight: '#2B323D',
|
||||||
|
};
|
||||||
|
|
||||||
|
export default createTheme({
|
||||||
|
theme: 'dark',
|
||||||
|
settings: {
|
||||||
|
background: '#272C35',
|
||||||
|
foreground: '#9d9b97',
|
||||||
|
caret: '#797977',
|
||||||
|
selection: '#3d4c64',
|
||||||
|
selectionMatch: '#3d4c64',
|
||||||
|
gutterBackground: '#272C35',
|
||||||
|
gutterForeground: '#465063',
|
||||||
|
gutterBorder: 'transparent',
|
||||||
|
lineHighlight: '#2e3f5940',
|
||||||
|
},
|
||||||
|
styles: [
|
||||||
|
{
|
||||||
|
tag: [t.function(t.variableName), t.function(t.propertyName), t.url, t.processingInstruction],
|
||||||
|
color: 'hsl(207, 82%, 66%)',
|
||||||
|
},
|
||||||
|
{ tag: [t.tagName, t.heading], color: '#e06c75' },
|
||||||
|
{ tag: t.comment, color: '#54636D' },
|
||||||
|
{ tag: [t.variableName, t.propertyName, t.labelName], color: 'hsl(220, 14%, 71%)' },
|
||||||
|
{ tag: [t.attributeName, t.number], color: 'hsl( 29, 54%, 61%)' },
|
||||||
|
{ tag: t.className, color: 'hsl( 39, 67%, 69%)' },
|
||||||
|
{ tag: t.keyword, color: 'hsl(286, 60%, 67%)' },
|
||||||
|
{ tag: [t.string, t.regexp, t.special(t.propertyName)], color: '#98c379' },
|
||||||
|
],
|
||||||
|
});
|
||||||
Vendored
+51
@@ -0,0 +1,51 @@
|
|||||||
|
import { tags as t } from '@lezer/highlight';
|
||||||
|
import { createTheme } from './theme-helper.mjs';
|
||||||
|
|
||||||
|
export const settings = {
|
||||||
|
background: '#21202e',
|
||||||
|
lineBackground: '#21202e99',
|
||||||
|
foreground: '#edecee',
|
||||||
|
caret: '#a277ff',
|
||||||
|
selection: '#3d375e7f',
|
||||||
|
selectionMatch: '#3d375e7f',
|
||||||
|
gutterBackground: '#21202e',
|
||||||
|
gutterForeground: '#edecee',
|
||||||
|
gutterBorder: 'transparent',
|
||||||
|
lineHighlight: '#a394f033',
|
||||||
|
};
|
||||||
|
export default createTheme({
|
||||||
|
theme: 'dark',
|
||||||
|
settings: {
|
||||||
|
background: '#21202e',
|
||||||
|
foreground: '#edecee',
|
||||||
|
caret: '#a277ff',
|
||||||
|
selection: '#5a51898f',
|
||||||
|
selectionMatch: '#5a51898f',
|
||||||
|
gutterBackground: '#21202e',
|
||||||
|
gutterForeground: '#edecee',
|
||||||
|
gutterBorder: 'transparent',
|
||||||
|
lineHighlight: '#a394f033',
|
||||||
|
},
|
||||||
|
styles: [
|
||||||
|
{ tag: t.keyword, color: '#a277ff' },
|
||||||
|
{ tag: [t.name, t.deleted, t.character, t.macroName], color: '#edecee' },
|
||||||
|
{ tag: [t.propertyName], color: '#ffca85' },
|
||||||
|
{ tag: [t.processingInstruction, t.string, t.inserted, t.special(t.string)], color: '#61ffca' },
|
||||||
|
{ tag: [t.function(t.variableName), t.labelName], color: '#ffca85' },
|
||||||
|
{ tag: [t.color, t.constant(t.name), t.standard(t.name)], color: '#61ffca' },
|
||||||
|
{ tag: [t.definition(t.name), t.separator], color: '#edecee' },
|
||||||
|
{ tag: [t.className], color: '#82e2ff' },
|
||||||
|
{ tag: [t.number, t.changed, t.annotation, t.modifier, t.self, t.namespace], color: '#61ffca' },
|
||||||
|
{ tag: [t.typeName], color: '#82e2ff' },
|
||||||
|
{ tag: [t.operator, t.operatorKeyword], color: '#a277ff' },
|
||||||
|
{ tag: [t.url, t.escape, t.regexp, t.link], color: '#61ffca' },
|
||||||
|
{ tag: [t.meta, t.comment], color: '#6d6d6d' },
|
||||||
|
{ tag: t.strong, fontWeight: 'bold' },
|
||||||
|
{ tag: t.emphasis, fontStyle: 'italic' },
|
||||||
|
{ tag: t.link, textDecoration: 'underline' },
|
||||||
|
{ tag: t.heading, fontWeight: 'bold', color: '#a277ff' },
|
||||||
|
{ tag: [t.atom, t.bool, t.special(t.variableName)], color: '#edecee' },
|
||||||
|
{ tag: t.invalid, color: '#ff6767' },
|
||||||
|
{ tag: t.strikethrough, textDecoration: 'line-through' },
|
||||||
|
],
|
||||||
|
});
|
||||||
+46
@@ -0,0 +1,46 @@
|
|||||||
|
import { tags as t } from '@lezer/highlight';
|
||||||
|
import { createTheme } from './theme-helper.mjs';
|
||||||
|
|
||||||
|
export const settings = {
|
||||||
|
light: true,
|
||||||
|
background: '#FFFFFF',
|
||||||
|
lineBackground: '#FFFFFF99',
|
||||||
|
foreground: '#000000',
|
||||||
|
caret: '#FBAC52',
|
||||||
|
selection: '#FFD420',
|
||||||
|
selectionMatch: '#FFD420',
|
||||||
|
gutterBackground: '#f5f5f5',
|
||||||
|
gutterForeground: '#4D4D4C',
|
||||||
|
gutterBorder: 'transparent',
|
||||||
|
lineHighlight: '#00000012',
|
||||||
|
};
|
||||||
|
|
||||||
|
export default createTheme({
|
||||||
|
theme: 'light',
|
||||||
|
settings: {
|
||||||
|
background: '#FFFFFF',
|
||||||
|
foreground: '#000000',
|
||||||
|
caret: '#FBAC52',
|
||||||
|
selection: '#FFD420',
|
||||||
|
selectionMatch: '#FFD420',
|
||||||
|
gutterBackground: '#f5f5f5',
|
||||||
|
gutterForeground: '#4D4D4C',
|
||||||
|
gutterBorder: 'transparent',
|
||||||
|
lineHighlight: '#00000012',
|
||||||
|
},
|
||||||
|
styles: [
|
||||||
|
{ tag: [t.meta, t.comment], color: '#804000' },
|
||||||
|
{ tag: [t.keyword, t.strong], color: '#0000FF' },
|
||||||
|
{ tag: [t.number], color: '#FF0080' },
|
||||||
|
{ tag: [t.string], color: '#FF0080' },
|
||||||
|
{ tag: [t.variableName], color: '#006600' },
|
||||||
|
{ tag: [t.escape], color: '#33CC33' },
|
||||||
|
{ tag: [t.tagName], color: '#1C02FF' },
|
||||||
|
{ tag: [t.heading], color: '#0C07FF' },
|
||||||
|
{ tag: [t.quote], color: '#000000' },
|
||||||
|
{ tag: [t.list], color: '#B90690' },
|
||||||
|
{ tag: [t.documentMeta], color: '#888888' },
|
||||||
|
{ tag: [t.function(t.variableName)], color: '#0000A2' },
|
||||||
|
{ tag: [t.definition(t.typeName), t.typeName], color: '#6D79DE' },
|
||||||
|
],
|
||||||
|
});
|
||||||
+39
@@ -0,0 +1,39 @@
|
|||||||
|
// this is different from https://thememirror.net/bespin
|
||||||
|
import { tags as t } from '@lezer/highlight';
|
||||||
|
import { createTheme } from './theme-helper.mjs';
|
||||||
|
|
||||||
|
export const settings = {
|
||||||
|
background: '#28211c',
|
||||||
|
lineBackground: '#28211c99',
|
||||||
|
foreground: '#9d9b97',
|
||||||
|
caret: '#797977',
|
||||||
|
selection: '#36312e',
|
||||||
|
selectionMatch: '#4f382b',
|
||||||
|
gutterBackground: '#28211c',
|
||||||
|
gutterForeground: '#666666',
|
||||||
|
lineHighlight: 'rgba(255, 255, 255, 0.1)',
|
||||||
|
};
|
||||||
|
export default createTheme({
|
||||||
|
theme: 'dark',
|
||||||
|
settings: {
|
||||||
|
background: '#28211c',
|
||||||
|
foreground: '#9d9b97',
|
||||||
|
caret: '#797977',
|
||||||
|
selection: '#4f382b',
|
||||||
|
selectionMatch: '#4f382b',
|
||||||
|
gutterBackground: '#28211c',
|
||||||
|
gutterForeground: '#666666',
|
||||||
|
lineHighlight: '#ffffff1a',
|
||||||
|
},
|
||||||
|
styles: [
|
||||||
|
{ tag: [t.atom, t.number, t.link, t.bool], color: '#9b859d' },
|
||||||
|
{ tag: t.comment, color: '#937121' },
|
||||||
|
{ tag: [t.keyword, t.tagName], color: '#cf6a4c' },
|
||||||
|
{ tag: t.string, color: '#f9ee98' },
|
||||||
|
{ tag: t.bracket, color: '#9d9b97' },
|
||||||
|
{ tag: [t.variableName], color: '#5ea6ea' },
|
||||||
|
{ tag: t.definition(t.variableName), color: '#cf7d34' },
|
||||||
|
{ tag: [t.function(t.variableName), t.className], color: '#cf7d34' },
|
||||||
|
{ tag: [t.propertyName, t.attributeName], color: '#54be0d' },
|
||||||
|
],
|
||||||
|
});
|
||||||
+21
-20
@@ -1,5 +1,5 @@
|
|||||||
import { tags as t } from '@lezer/highlight';
|
import { tags as t } from '@lezer/highlight';
|
||||||
import { createTheme } from '@uiw/codemirror-themes';
|
import { createTheme } from './theme-helper.mjs';
|
||||||
export const settings = {
|
export const settings = {
|
||||||
background: 'black',
|
background: 'black',
|
||||||
foreground: 'white', // whats that?
|
foreground: 'white', // whats that?
|
||||||
@@ -15,24 +15,25 @@ export default createTheme({
|
|||||||
theme: 'dark',
|
theme: 'dark',
|
||||||
settings,
|
settings,
|
||||||
styles: [
|
styles: [
|
||||||
{ tag: t.keyword, color: 'white' },
|
{ tag: t.labelName, color: 'inherit' },
|
||||||
{ tag: t.operator, color: 'white' },
|
{ tag: t.keyword, color: 'inherit' },
|
||||||
{ tag: t.special(t.variableName), color: 'white' },
|
{ tag: t.operator, color: 'inherit' },
|
||||||
{ tag: t.typeName, color: 'white' },
|
{ tag: t.special(t.variableName), color: 'inherit' },
|
||||||
{ tag: t.atom, color: 'white' },
|
{ tag: t.typeName, color: 'inherit' },
|
||||||
{ tag: t.number, color: 'white' },
|
{ tag: t.atom, color: 'inherit' },
|
||||||
{ tag: t.definition(t.variableName), color: 'white' },
|
{ tag: t.number, color: 'inherit' },
|
||||||
{ tag: t.string, color: 'white' },
|
{ tag: t.definition(t.variableName), color: 'inherit' },
|
||||||
{ tag: t.special(t.string), color: 'white' },
|
{ tag: t.string, color: 'inherit' },
|
||||||
{ tag: t.comment, color: 'white' },
|
{ tag: t.special(t.string), color: 'inherit' },
|
||||||
{ tag: t.variableName, color: 'white' },
|
{ tag: t.comment, color: 'inherit' },
|
||||||
{ tag: t.tagName, color: 'white' },
|
{ tag: t.variableName, color: 'inherit' },
|
||||||
{ tag: t.bracket, color: 'white' },
|
{ tag: t.tagName, color: 'inherit' },
|
||||||
{ tag: t.meta, color: 'white' },
|
{ tag: t.bracket, color: 'inherit' },
|
||||||
{ tag: t.attributeName, color: 'white' },
|
{ tag: t.meta, color: 'inherit' },
|
||||||
{ tag: t.propertyName, color: 'white' },
|
{ tag: t.attributeName, color: 'inherit' },
|
||||||
{ tag: t.className, color: 'white' },
|
{ tag: t.propertyName, color: 'inherit' },
|
||||||
{ tag: t.invalid, color: 'white' },
|
{ tag: t.className, color: 'inherit' },
|
||||||
{ tag: [t.unit, t.punctuation], color: 'white' },
|
{ tag: t.invalid, color: 'inherit' },
|
||||||
|
{ tag: [t.unit, t.punctuation], color: 'inherit' },
|
||||||
],
|
],
|
||||||
});
|
});
|
||||||
|
|||||||
+21
-20
@@ -1,5 +1,5 @@
|
|||||||
import { tags as t } from '@lezer/highlight';
|
import { tags as t } from '@lezer/highlight';
|
||||||
import { createTheme } from '@uiw/codemirror-themes';
|
import { createTheme } from './theme-helper.mjs';
|
||||||
export const settings = {
|
export const settings = {
|
||||||
background: '#051DB5',
|
background: '#051DB5',
|
||||||
lineBackground: '#051DB550',
|
lineBackground: '#051DB550',
|
||||||
@@ -18,24 +18,25 @@ export default createTheme({
|
|||||||
theme: 'dark',
|
theme: 'dark',
|
||||||
settings,
|
settings,
|
||||||
styles: [
|
styles: [
|
||||||
{ tag: t.keyword, color: 'white' },
|
{ tag: t.labelName, color: 'inherit' },
|
||||||
{ tag: t.operator, color: 'white' },
|
{ tag: t.keyword, color: 'inherit' },
|
||||||
{ tag: t.special(t.variableName), color: 'white' },
|
{ tag: t.operator, color: 'inherit' },
|
||||||
{ tag: t.typeName, color: 'white' },
|
{ tag: t.special(t.variableName), color: 'inherit' },
|
||||||
{ tag: t.atom, color: 'white' },
|
{ tag: t.typeName, color: 'inherit' },
|
||||||
{ tag: t.number, color: 'white' },
|
{ tag: t.atom, color: 'inherit' },
|
||||||
{ tag: t.definition(t.variableName), color: 'white' },
|
{ tag: t.number, color: 'inherit' },
|
||||||
{ tag: t.string, color: 'white' },
|
{ tag: t.definition(t.variableName), color: 'inherit' },
|
||||||
{ tag: t.special(t.string), color: 'white' },
|
{ tag: t.string, color: 'inherit' },
|
||||||
{ tag: t.comment, color: 'white' },
|
{ tag: t.special(t.string), color: 'inherit' },
|
||||||
{ tag: t.variableName, color: 'white' },
|
{ tag: t.comment, color: 'inherit' },
|
||||||
{ tag: t.tagName, color: 'white' },
|
{ tag: t.variableName, color: 'inherit' },
|
||||||
{ tag: t.bracket, color: 'white' },
|
{ tag: t.tagName, color: 'inherit' },
|
||||||
{ tag: t.meta, color: 'white' },
|
{ tag: t.bracket, color: 'inherit' },
|
||||||
{ tag: t.attributeName, color: 'white' },
|
{ tag: t.meta, color: 'inherit' },
|
||||||
{ tag: t.propertyName, color: 'white' },
|
{ tag: t.attributeName, color: 'inherit' },
|
||||||
{ tag: t.className, color: 'white' },
|
{ tag: t.propertyName, color: 'inherit' },
|
||||||
{ tag: t.invalid, color: 'white' },
|
{ tag: t.className, color: 'inherit' },
|
||||||
{ tag: [t.unit, t.punctuation], color: 'white' },
|
{ tag: t.invalid, color: 'inherit' },
|
||||||
|
{ tag: [t.unit, t.punctuation], color: 'inherit' },
|
||||||
],
|
],
|
||||||
});
|
});
|
||||||
|
|||||||
+48
@@ -0,0 +1,48 @@
|
|||||||
|
/**
|
||||||
|
* @name darcula
|
||||||
|
* @author darcula
|
||||||
|
* Name: IntelliJ IDEA darcula theme
|
||||||
|
* From IntelliJ IDEA by JetBrains
|
||||||
|
*/
|
||||||
|
import { tags as t } from '@lezer/highlight';
|
||||||
|
import { createTheme } from './theme-helper.mjs';
|
||||||
|
export const settings = {
|
||||||
|
background: '#242424',
|
||||||
|
lineBackground: '#24242499',
|
||||||
|
foreground: '#f8f8f2',
|
||||||
|
caret: '#FFFFFF',
|
||||||
|
selection: 'rgba(255, 255, 255, 0.1)',
|
||||||
|
selectionMatch: 'rgba(255, 255, 255, 0.2)',
|
||||||
|
gutterBackground: 'rgba(255, 255, 255, 0.1)',
|
||||||
|
gutterForeground: '#999',
|
||||||
|
gutterBorder: 'transparent',
|
||||||
|
lineHighlight: 'rgba(255, 255, 255, 0.1)',
|
||||||
|
};
|
||||||
|
|
||||||
|
export default createTheme({
|
||||||
|
theme: 'dark',
|
||||||
|
settings: {
|
||||||
|
background: '#242424',
|
||||||
|
foreground: '#f8f8f2',
|
||||||
|
caret: '#FFFFFF',
|
||||||
|
selection: 'rgba(255, 255, 255, 0.1)',
|
||||||
|
selectionMatch: 'rgba(255, 255, 255, 0.2)',
|
||||||
|
gutterBackground: 'transparent',
|
||||||
|
gutterForeground: '#999',
|
||||||
|
gutterBorder: 'transparent',
|
||||||
|
lineHighlight: 'rgba(255, 255, 255, 0.1)',
|
||||||
|
},
|
||||||
|
styles: [
|
||||||
|
{ tag: t.labelName, color: '#CCCCCC' },
|
||||||
|
{ tag: [t.atom, t.number], color: '#7A9EC2' },
|
||||||
|
{ tag: [t.comment], color: '#707070' },
|
||||||
|
{ tag: [t.string], color: '#6A8759' },
|
||||||
|
{ tag: [t.variableName, t.operator], color: '#CCCCCC' },
|
||||||
|
{ tag: [t.function(t.variableName), t.propertyName], color: '#FFC66D' },
|
||||||
|
{ tag: [t.meta, t.className], color: '#FFC66D' },
|
||||||
|
{ tag: [t.propertyName], color: '#FFC66D' },
|
||||||
|
{ tag: [t.keyword], color: '#CC7832' },
|
||||||
|
{ tag: [t.tagName], color: '#ff79c6' },
|
||||||
|
{ tag: [t.typeName], color: '#ffb86c' },
|
||||||
|
],
|
||||||
|
});
|
||||||
+51
@@ -0,0 +1,51 @@
|
|||||||
|
/**
|
||||||
|
* @name dracula
|
||||||
|
* @author dracula
|
||||||
|
* Michael Kaminsky (http://github.com/mkaminsky11)
|
||||||
|
* Original dracula color scheme by Zeno Rocha (https://github.com/zenorocha/dracula-theme)
|
||||||
|
*/
|
||||||
|
// this is different from https://thememirror.net/dracula
|
||||||
|
import { tags as t } from '@lezer/highlight';
|
||||||
|
import { createTheme } from './theme-helper.mjs';
|
||||||
|
|
||||||
|
export const settings = {
|
||||||
|
background: '#282a36',
|
||||||
|
lineBackground: '#282a3699',
|
||||||
|
foreground: '#f8f8f2',
|
||||||
|
caret: '#f8f8f0',
|
||||||
|
selection: 'rgba(255, 255, 255, 0.1)',
|
||||||
|
selectionMatch: 'rgba(255, 255, 255, 0.2)',
|
||||||
|
gutterBackground: '#282a36',
|
||||||
|
gutterForeground: '#6272a4',
|
||||||
|
gutterBorder: 'transparent',
|
||||||
|
lineHighlight: 'rgba(255, 255, 255, 0.1)',
|
||||||
|
};
|
||||||
|
|
||||||
|
const purple = '#BD93F9';
|
||||||
|
|
||||||
|
export default createTheme({
|
||||||
|
theme: 'dark',
|
||||||
|
settings: {
|
||||||
|
background: '#282a36',
|
||||||
|
foreground: '#f8f8f2',
|
||||||
|
caret: '#f8f8f0',
|
||||||
|
selection: 'rgba(255, 255, 255, 0.1)',
|
||||||
|
selectionMatch: 'rgba(255, 255, 255, 0.2)',
|
||||||
|
gutterBackground: '#282a36',
|
||||||
|
gutterForeground: '#6272a4',
|
||||||
|
gutterBorder: 'transparent',
|
||||||
|
lineHighlight: 'rgba(255, 255, 255, 0.1)',
|
||||||
|
},
|
||||||
|
styles: [
|
||||||
|
{ tag: t.comment, color: '#6272a4' },
|
||||||
|
{ tag: t.string, color: '#f1fa8c' },
|
||||||
|
{ tag: [t.atom, t.number], color: purple },
|
||||||
|
{ tag: [t.meta, t.labelName, t.variableName], color: '#f8f8f2' },
|
||||||
|
{
|
||||||
|
tag: [t.keyword, t.tagName, t.arithmeticOperator],
|
||||||
|
color: '#ff79c6',
|
||||||
|
},
|
||||||
|
{ tag: [t.function(t.variableName), t.propertyName], color: '#50fa7b' },
|
||||||
|
{ tag: t.atom, color: '#bd93f9' },
|
||||||
|
],
|
||||||
|
});
|
||||||
+42
@@ -0,0 +1,42 @@
|
|||||||
|
/**
|
||||||
|
* @name duotone
|
||||||
|
* @author Bram de Haan
|
||||||
|
* by Bram de Haan, adapted from DuoTone themes by Simurai (http://simurai.com/projects/2016/01/01/duotone-themes)
|
||||||
|
*/
|
||||||
|
import { tags as t } from '@lezer/highlight';
|
||||||
|
import { createTheme } from './theme-helper.mjs';
|
||||||
|
|
||||||
|
export const settings = {
|
||||||
|
background: '#2a2734',
|
||||||
|
lineBackground: '#2a273499',
|
||||||
|
foreground: '#eeebff',
|
||||||
|
caret: '#ffad5c',
|
||||||
|
selection: 'rgba(255, 255, 255, 0.1)',
|
||||||
|
gutterBackground: '#2a2734',
|
||||||
|
gutterForeground: '#545167',
|
||||||
|
lineHighlight: '#36334280',
|
||||||
|
};
|
||||||
|
|
||||||
|
export default createTheme({
|
||||||
|
theme: 'dark',
|
||||||
|
settings: {
|
||||||
|
background: '#2a2734',
|
||||||
|
foreground: '#6c6783',
|
||||||
|
caret: '#ffad5c',
|
||||||
|
selection: '#9a86fd',
|
||||||
|
selectionMatch: '#9a86fd',
|
||||||
|
gutterBackground: '#2a2734',
|
||||||
|
gutterForeground: '#545167',
|
||||||
|
lineHighlight: '#36334280',
|
||||||
|
},
|
||||||
|
styles: [
|
||||||
|
{ tag: [t.comment, t.bracket, t.operator], color: '#6c6783' },
|
||||||
|
{ tag: [t.atom, t.number, t.keyword, t.link, t.attributeName, t.quote], color: '#ffcc99' },
|
||||||
|
{ tag: [t.emphasis, t.heading, t.tagName, t.propertyName, t.className, t.variableName], color: '#eeebff' },
|
||||||
|
{ tag: [t.typeName, t.url], color: '#eeebff' },
|
||||||
|
{ tag: t.string, color: '#ffb870' },
|
||||||
|
/* { tag: [t.propertyName], color: '#9a86fd' }, */
|
||||||
|
{ tag: [t.propertyName], color: '#eeebff' },
|
||||||
|
{ tag: t.labelName, color: '#eeebff' },
|
||||||
|
],
|
||||||
|
});
|
||||||
+45
@@ -0,0 +1,45 @@
|
|||||||
|
/**
|
||||||
|
* @name duotone
|
||||||
|
* @author Bram de Haan
|
||||||
|
* by Bram de Haan, adapted from DuoTone themes by Simurai (http://simurai.com/projects/2016/01/01/duotone-themes)
|
||||||
|
*/
|
||||||
|
import { tags as t } from '@lezer/highlight';
|
||||||
|
import { createTheme } from './theme-helper.mjs';
|
||||||
|
|
||||||
|
export const settings = {
|
||||||
|
light: true,
|
||||||
|
background: '#faf8f5',
|
||||||
|
lineBackground: '#faf8f599',
|
||||||
|
foreground: '#b29762',
|
||||||
|
caret: '#93abdc',
|
||||||
|
selection: '#e3dcce',
|
||||||
|
selectionMatch: '#e3dcce',
|
||||||
|
gutterBackground: '#faf8f5',
|
||||||
|
gutterForeground: '#cdc4b1',
|
||||||
|
gutterBorder: 'transparent',
|
||||||
|
lineHighlight: '#EFEFEF',
|
||||||
|
};
|
||||||
|
|
||||||
|
export default createTheme({
|
||||||
|
theme: 'light',
|
||||||
|
settings: {
|
||||||
|
background: '#faf8f5',
|
||||||
|
foreground: '#b29762',
|
||||||
|
caret: '#93abdc',
|
||||||
|
selection: '#e3dcce',
|
||||||
|
selectionMatch: '#e3dcce',
|
||||||
|
gutterBackground: '#faf8f5',
|
||||||
|
gutterForeground: '#cdc4b1',
|
||||||
|
gutterBorder: 'transparent',
|
||||||
|
lineHighlight: '#ddceb154',
|
||||||
|
},
|
||||||
|
styles: [
|
||||||
|
{ tag: [t.comment, t.bracket], color: '#b6ad9a' },
|
||||||
|
{ tag: [t.atom, t.number, t.keyword, t.link, t.attributeName, t.quote], color: '#063289' },
|
||||||
|
{ tag: [t.emphasis, t.heading, t.tagName, t.propertyName, t.variableName], color: '#2d2006' },
|
||||||
|
{ tag: [t.typeName, t.url, t.string], color: '#896724' },
|
||||||
|
{ tag: [t.operator, t.string], color: '#1659df' },
|
||||||
|
{ tag: [t.propertyName], color: '#b29762' },
|
||||||
|
{ tag: [t.unit, t.punctuation], color: '#063289' },
|
||||||
|
],
|
||||||
|
});
|
||||||
+46
@@ -0,0 +1,46 @@
|
|||||||
|
import { tags as t } from '@lezer/highlight';
|
||||||
|
import { createTheme } from './theme-helper.mjs';
|
||||||
|
|
||||||
|
export const settings = {
|
||||||
|
light: true,
|
||||||
|
background: '#fff',
|
||||||
|
lineBackground: '#ffffff99',
|
||||||
|
foreground: '#000',
|
||||||
|
caret: '#FFFFFF',
|
||||||
|
selection: '#d7d4f0',
|
||||||
|
selectionMatch: '#d7d4f0',
|
||||||
|
gutterBackground: '#f7f7f7',
|
||||||
|
gutterForeground: '#999',
|
||||||
|
lineHighlight: '#e8f2ff',
|
||||||
|
gutterBorder: 'transparent',
|
||||||
|
};
|
||||||
|
|
||||||
|
export default createTheme({
|
||||||
|
theme: 'light',
|
||||||
|
settings: {
|
||||||
|
background: '#fff',
|
||||||
|
foreground: '#000',
|
||||||
|
caret: '#FFFFFF',
|
||||||
|
selection: '#d7d4f0',
|
||||||
|
selectionMatch: '#d7d4f0',
|
||||||
|
gutterBackground: '#f7f7f7',
|
||||||
|
gutterForeground: '#999',
|
||||||
|
lineHighlight: '#006fff1c',
|
||||||
|
gutterBorder: 'transparent',
|
||||||
|
},
|
||||||
|
styles: [
|
||||||
|
{ tag: [t.comment], color: '#3F7F5F' },
|
||||||
|
{ tag: [t.documentMeta], color: '#FF1717' },
|
||||||
|
{ tag: t.keyword, color: '#7F0055', fontWeight: 'bold' },
|
||||||
|
{ tag: t.atom, color: '#00f' },
|
||||||
|
{ tag: t.number, color: '#164' },
|
||||||
|
{ tag: t.propertyName, color: '#164' },
|
||||||
|
{ tag: [t.variableName, t.definition(t.variableName)], color: '#0000C0' },
|
||||||
|
{ tag: t.function(t.variableName), color: '#0000C0' },
|
||||||
|
{ tag: t.string, color: '#2A00FF' },
|
||||||
|
{ tag: t.operator, color: 'black' },
|
||||||
|
{ tag: t.tagName, color: '#170' },
|
||||||
|
{ tag: t.attributeName, color: '#00c' },
|
||||||
|
{ tag: t.link, color: '#219' },
|
||||||
|
],
|
||||||
|
});
|
||||||
+45
@@ -0,0 +1,45 @@
|
|||||||
|
/**
|
||||||
|
* @name github
|
||||||
|
*/
|
||||||
|
import { tags as t } from '@lezer/highlight';
|
||||||
|
import { createTheme } from './theme-helper.mjs';
|
||||||
|
|
||||||
|
export const settings = {
|
||||||
|
background: '#0d1117',
|
||||||
|
lineBackground: '#0d111799',
|
||||||
|
foreground: '#c9d1d9',
|
||||||
|
caret: '#c9d1d9',
|
||||||
|
selection: '#003d73',
|
||||||
|
selectionMatch: '#003d73',
|
||||||
|
lineHighlight: '#36334280',
|
||||||
|
};
|
||||||
|
|
||||||
|
export default createTheme({
|
||||||
|
theme: 'dark',
|
||||||
|
settings: {
|
||||||
|
background: '#0d1117',
|
||||||
|
foreground: '#c9d1d9',
|
||||||
|
caret: '#c9d1d9',
|
||||||
|
selection: '#003d73',
|
||||||
|
selectionMatch: '#003d73',
|
||||||
|
lineHighlight: '#36334280',
|
||||||
|
},
|
||||||
|
styles: [
|
||||||
|
{ tag: t.labelName, color: '#d2a8ff' },
|
||||||
|
{ tag: [t.standard(t.tagName), t.tagName], color: '#7ee787' },
|
||||||
|
{ tag: [t.comment, t.bracket], color: '#8b949e' },
|
||||||
|
{ tag: [t.className, t.propertyName], color: '#d2a8ff' },
|
||||||
|
{ tag: [t.variableName, t.attributeName], color: '#d2a8ff' },
|
||||||
|
{ tag: [t.number, t.operator], color: '#79c0ff' },
|
||||||
|
{ tag: [t.keyword, t.typeName, t.typeOperator, t.typeName], color: '#ff7b72' },
|
||||||
|
{ tag: [t.string, t.meta, t.regexp], color: '#a5d6ff' },
|
||||||
|
{ tag: [t.name, t.quote], color: '#7ee787' },
|
||||||
|
{ tag: [t.heading, t.strong], color: '#d2a8ff', fontWeight: 'bold' },
|
||||||
|
{ tag: [t.emphasis], color: '#d2a8ff', fontStyle: 'italic' },
|
||||||
|
{ tag: [t.deleted], color: '#ffdcd7', backgroundColor: 'ffeef0' },
|
||||||
|
{ tag: [t.atom, t.bool, t.special(t.variableName)], color: '#ffab70' },
|
||||||
|
{ tag: t.link, textDecoration: 'underline' },
|
||||||
|
{ tag: t.strikethrough, textDecoration: 'line-through' },
|
||||||
|
{ tag: t.invalid, color: '#f97583' },
|
||||||
|
],
|
||||||
|
});
|
||||||
+45
@@ -0,0 +1,45 @@
|
|||||||
|
/**
|
||||||
|
* @name github
|
||||||
|
*/
|
||||||
|
import { tags as t } from '@lezer/highlight';
|
||||||
|
import { createTheme } from './theme-helper.mjs';
|
||||||
|
|
||||||
|
export const settings = {
|
||||||
|
light: true,
|
||||||
|
background: '#fff',
|
||||||
|
lineBackground: '#ffffff99',
|
||||||
|
foreground: '#24292e',
|
||||||
|
selection: '#BBDFFF',
|
||||||
|
selectionMatch: '#BBDFFF',
|
||||||
|
gutterBackground: '#fff',
|
||||||
|
gutterForeground: '#6e7781',
|
||||||
|
};
|
||||||
|
|
||||||
|
export default createTheme({
|
||||||
|
theme: 'light',
|
||||||
|
settings: {
|
||||||
|
background: '#fff',
|
||||||
|
foreground: '#24292e',
|
||||||
|
selection: '#BBDFFF',
|
||||||
|
selectionMatch: '#BBDFFF',
|
||||||
|
gutterBackground: '#fff',
|
||||||
|
gutterForeground: '#6e7781',
|
||||||
|
},
|
||||||
|
styles: [
|
||||||
|
{ tag: [t.standard(t.tagName), t.tagName], color: '#116329' },
|
||||||
|
{ tag: [t.comment, t.bracket], color: '#6a737d' },
|
||||||
|
{ tag: [t.className, t.propertyName], color: '#6f42c1' },
|
||||||
|
{ tag: [t.variableName, t.attributeName, t.number, t.operator], color: '#005cc5' },
|
||||||
|
{ tag: [t.keyword, t.typeName, t.typeOperator, t.typeName], color: '#d73a49' },
|
||||||
|
{ tag: [t.string, t.meta, t.regexp], color: '#032f62' },
|
||||||
|
{ tag: [t.name, t.quote], color: '#22863a' },
|
||||||
|
{ tag: [t.heading, t.strong], color: '#24292e', fontWeight: 'bold' },
|
||||||
|
{ tag: [t.emphasis], color: '#24292e', fontStyle: 'italic' },
|
||||||
|
{ tag: [t.deleted], color: '#b31d28', backgroundColor: 'ffeef0' },
|
||||||
|
{ tag: [t.atom, t.bool, t.special(t.variableName)], color: '#e36209' },
|
||||||
|
{ tag: [t.url, t.escape, t.regexp, t.link], color: '#032f62' },
|
||||||
|
{ tag: t.link, textDecoration: 'underline' },
|
||||||
|
{ tag: t.strikethrough, textDecoration: 'line-through' },
|
||||||
|
{ tag: t.invalid, color: '#cb2431' },
|
||||||
|
],
|
||||||
|
});
|
||||||
+83
@@ -0,0 +1,83 @@
|
|||||||
|
/**
|
||||||
|
* @name gruvbox-dark
|
||||||
|
* @author morhetz
|
||||||
|
* Name: Gruvbox
|
||||||
|
* From github.com/codemirror/codemirror5/blob/master/theme/gruvbox-dark.css
|
||||||
|
*/
|
||||||
|
import { tags as t } from '@lezer/highlight';
|
||||||
|
import { createTheme } from './theme-helper.mjs';
|
||||||
|
|
||||||
|
export const settings = {
|
||||||
|
background: '#282828',
|
||||||
|
lineBackground: '#28282899',
|
||||||
|
foreground: '#ebdbb2',
|
||||||
|
caret: '#ebdbb2',
|
||||||
|
selection: '#bdae93',
|
||||||
|
selectionMatch: '#bdae93',
|
||||||
|
lineHighlight: '#3c3836',
|
||||||
|
gutterBackground: '#282828',
|
||||||
|
gutterForeground: '#7c6f64',
|
||||||
|
};
|
||||||
|
|
||||||
|
export default createTheme({
|
||||||
|
theme: 'dark',
|
||||||
|
settings: {
|
||||||
|
background: '#282828',
|
||||||
|
foreground: '#ebdbb2',
|
||||||
|
caret: '#ebdbb2',
|
||||||
|
selection: '#b99d555c',
|
||||||
|
selectionMatch: '#b99d555c',
|
||||||
|
lineHighlight: '#baa1602b',
|
||||||
|
gutterBackground: '#282828',
|
||||||
|
gutterForeground: '#7c6f64',
|
||||||
|
},
|
||||||
|
styles: [
|
||||||
|
{ tag: t.keyword, color: '#fb4934' },
|
||||||
|
{ tag: [t.name, t.deleted, t.character, t.propertyName, t.macroName], color: '#8ec07c' },
|
||||||
|
{ tag: [t.variableName], color: '#83a598' },
|
||||||
|
{ tag: [t.function(t.variableName)], color: '#8ec07c', fontStyle: 'bold' },
|
||||||
|
{ tag: [t.labelName], color: '#ebdbb2' },
|
||||||
|
{ tag: [t.color, t.constant(t.name), t.standard(t.name)], color: '#d3869b' },
|
||||||
|
{ tag: [t.definition(t.name), t.separator], color: '#ebdbb2' },
|
||||||
|
{ tag: [t.brace], color: '#ebdbb2' },
|
||||||
|
{ tag: [t.annotation], color: '#fb4934d' },
|
||||||
|
{ tag: [t.number, t.changed, t.annotation, t.modifier, t.self, t.namespace], color: '#d3869b' },
|
||||||
|
{ tag: [t.typeName, t.className], color: '#fabd2f' },
|
||||||
|
{ tag: [t.operatorKeyword], color: '#fb4934' },
|
||||||
|
{
|
||||||
|
tag: [t.tagName],
|
||||||
|
color: '#8ec07c',
|
||||||
|
fontStyle: 'bold',
|
||||||
|
},
|
||||||
|
{ tag: [t.squareBracket], color: '#fe8019' },
|
||||||
|
{ tag: [t.angleBracket], color: '#83a598' },
|
||||||
|
{ tag: [t.attributeName], color: '#8ec07c' },
|
||||||
|
{ tag: [t.regexp], color: '#8ec07c' },
|
||||||
|
{ tag: [t.quote], color: '#928374' },
|
||||||
|
{ tag: [t.string], color: '#ebdbb2' },
|
||||||
|
{
|
||||||
|
tag: t.link,
|
||||||
|
color: '#a89984',
|
||||||
|
textDecoration: 'underline',
|
||||||
|
textUnderlinePosition: 'under',
|
||||||
|
},
|
||||||
|
{ tag: [t.url, t.escape, t.special(t.string)], color: '#d3869b' },
|
||||||
|
{ tag: [t.meta], color: '#fabd2f' },
|
||||||
|
{ tag: [t.comment], color: '#928374', fontStyle: 'italic' },
|
||||||
|
{ tag: t.strong, fontWeight: 'bold', color: '#fe8019' },
|
||||||
|
{ tag: t.emphasis, fontStyle: 'italic', color: '#b8bb26' },
|
||||||
|
{ tag: t.strikethrough, textDecoration: 'line-through' },
|
||||||
|
{ tag: t.heading, fontWeight: 'bold', color: '#b8bb26' },
|
||||||
|
{ tag: [t.heading1, t.heading2], fontWeight: 'bold', color: '#b8bb26' },
|
||||||
|
{
|
||||||
|
tag: [t.heading3, t.heading4],
|
||||||
|
fontWeight: 'bold',
|
||||||
|
color: '#fabd2f',
|
||||||
|
},
|
||||||
|
{ tag: [t.heading5, t.heading6], color: '#fabd2f' },
|
||||||
|
{ tag: [t.atom, t.bool, t.special(t.variableName)], color: '#d3869b' },
|
||||||
|
{ tag: [t.processingInstruction, t.inserted], color: '#83a598' },
|
||||||
|
{ tag: [t.contentSeparator], color: '#fb4934' },
|
||||||
|
{ tag: t.invalid, color: '#fe8019', borderBottom: `1px dotted #fb4934d` },
|
||||||
|
],
|
||||||
|
});
|
||||||
+131
@@ -0,0 +1,131 @@
|
|||||||
|
/**
|
||||||
|
* @name gruvbox-light
|
||||||
|
* @author morhetz
|
||||||
|
* Name: Gruvbox
|
||||||
|
* From github.com/codemirror/codemirror5/blob/master/theme/gruvbox-light.css
|
||||||
|
*/
|
||||||
|
import { tags as t } from '@lezer/highlight';
|
||||||
|
import { createTheme } from './theme-helper.mjs';
|
||||||
|
|
||||||
|
export const settings = {
|
||||||
|
light: true,
|
||||||
|
background: '#fbf1c7',
|
||||||
|
lineBackground: '#fbf1c799',
|
||||||
|
foreground: '#3c3836',
|
||||||
|
caret: '#af3a03',
|
||||||
|
selection: '#ebdbb2',
|
||||||
|
selectionMatch: '#bdae93',
|
||||||
|
lineHighlight: '#ebdbb2',
|
||||||
|
gutterBackground: '#ebdbb2',
|
||||||
|
gutterForeground: '#665c54',
|
||||||
|
gutterBorder: 'transparent',
|
||||||
|
};
|
||||||
|
|
||||||
|
export default createTheme({
|
||||||
|
theme: 'light',
|
||||||
|
settings: {
|
||||||
|
background: '#fbf1c7',
|
||||||
|
foreground: '#3c3836',
|
||||||
|
caret: '#af3a03',
|
||||||
|
selection: '#bdae9391',
|
||||||
|
selectionMatch: '#bdae9391',
|
||||||
|
lineHighlight: '#a37f2238',
|
||||||
|
gutterBackground: '#ebdbb2',
|
||||||
|
gutterForeground: '#665c54',
|
||||||
|
gutterBorder: 'transparent',
|
||||||
|
},
|
||||||
|
styles: [
|
||||||
|
{ tag: t.keyword, color: '#9d0006' },
|
||||||
|
{
|
||||||
|
tag: [t.name, t.deleted, t.character, t.propertyName, t.macroName],
|
||||||
|
color: '#427b58',
|
||||||
|
},
|
||||||
|
{ tag: [t.variableName], color: '#076678' },
|
||||||
|
{ tag: [t.function(t.variableName)], color: '#79740e', fontStyle: 'bold' },
|
||||||
|
{ tag: [t.labelName], color: '#3c3836' },
|
||||||
|
{
|
||||||
|
tag: [t.color, t.constant(t.name), t.standard(t.name)],
|
||||||
|
color: '#8f3f71',
|
||||||
|
},
|
||||||
|
{ tag: [t.definition(t.name), t.separator], color: '#3c3836' },
|
||||||
|
{ tag: [t.brace], color: '#3c3836' },
|
||||||
|
{
|
||||||
|
tag: [t.annotation],
|
||||||
|
color: '#9d0006',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
tag: [t.number, t.changed, t.annotation, t.modifier, t.self, t.namespace],
|
||||||
|
color: '#8f3f71',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
tag: [t.typeName, t.className],
|
||||||
|
color: '#b57614',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
tag: [t.operator, t.operatorKeyword],
|
||||||
|
color: '#9d0006',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
tag: [t.tagName],
|
||||||
|
color: '#427b58',
|
||||||
|
fontStyle: 'bold',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
tag: [t.squareBracket],
|
||||||
|
color: '#af3a03',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
tag: [t.angleBracket],
|
||||||
|
color: '#076678',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
tag: [t.attributeName],
|
||||||
|
color: '#427b58',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
tag: [t.regexp],
|
||||||
|
color: '#427b58',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
tag: [t.quote],
|
||||||
|
color: '#928374',
|
||||||
|
},
|
||||||
|
{ tag: [t.string], color: '#3c3836' },
|
||||||
|
{
|
||||||
|
tag: t.link,
|
||||||
|
color: '#7c6f64',
|
||||||
|
textDecoration: 'underline',
|
||||||
|
textUnderlinePosition: 'under',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
tag: [t.url, t.escape, t.special(t.string)],
|
||||||
|
color: '#8f3f71',
|
||||||
|
},
|
||||||
|
{ tag: [t.meta], color: '#b57614' },
|
||||||
|
{ tag: [t.comment], color: '#928374', fontStyle: 'italic' },
|
||||||
|
{ tag: t.strong, fontWeight: 'bold', color: '#af3a03' },
|
||||||
|
{ tag: t.emphasis, fontStyle: 'italic', color: '#79740e' },
|
||||||
|
{ tag: t.strikethrough, textDecoration: 'line-through' },
|
||||||
|
{ tag: t.heading, fontWeight: 'bold', color: '#79740e' },
|
||||||
|
{ tag: [t.heading1, t.heading2], fontWeight: 'bold', color: '#79740e' },
|
||||||
|
{
|
||||||
|
tag: [t.heading3, t.heading4],
|
||||||
|
fontWeight: 'bold',
|
||||||
|
color: '#b57614',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
tag: [t.heading5, t.heading6],
|
||||||
|
color: '#b57614',
|
||||||
|
},
|
||||||
|
{ tag: [t.atom, t.bool, t.special(t.variableName)], color: '#8f3f71' },
|
||||||
|
{
|
||||||
|
tag: [t.processingInstruction, t.inserted],
|
||||||
|
color: '#076678',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
tag: [t.contentSeparator],
|
||||||
|
color: '#9d0006',
|
||||||
|
},
|
||||||
|
{ tag: t.invalid, color: '#af3a03', borderBottom: `1px dotted #9d0006` },
|
||||||
|
],
|
||||||
|
});
|
||||||
+77
@@ -0,0 +1,77 @@
|
|||||||
|
import { tags as t } from '@lezer/highlight';
|
||||||
|
import { createTheme } from './theme-helper.mjs';
|
||||||
|
|
||||||
|
export const settings = {
|
||||||
|
background: '#212121',
|
||||||
|
lineBackground: '#21212199',
|
||||||
|
foreground: '#bdbdbd',
|
||||||
|
caret: '#a0a4ae',
|
||||||
|
selection: '#d7d4f0',
|
||||||
|
selectionMatch: '#d7d4f0',
|
||||||
|
gutterBackground: '#212121',
|
||||||
|
gutterForeground: '#999',
|
||||||
|
gutterActiveForeground: '#4f5b66',
|
||||||
|
lineHighlight: '#111111',
|
||||||
|
};
|
||||||
|
|
||||||
|
export default createTheme({
|
||||||
|
theme: 'dark',
|
||||||
|
settings: {
|
||||||
|
background: '#212121',
|
||||||
|
foreground: '#bdbdbd',
|
||||||
|
caret: '#a0a4ae',
|
||||||
|
selection: '#d7d4f063',
|
||||||
|
selectionMatch: '#d7d4f063',
|
||||||
|
gutterBackground: '#212121',
|
||||||
|
gutterForeground: '#999',
|
||||||
|
gutterActiveForeground: '#4f5b66',
|
||||||
|
lineHighlight: '#333333',
|
||||||
|
},
|
||||||
|
styles: [
|
||||||
|
{ tag: t.keyword, color: '#cf6edf' },
|
||||||
|
{ tag: [t.name, t.deleted, t.character, t.macroName], color: '#56c8d8' },
|
||||||
|
{ tag: [t.propertyName], color: '#82AAFF' },
|
||||||
|
{ tag: [t.variableName], color: '#bdbdbd' },
|
||||||
|
{ tag: [t.function(t.variableName)], color: '#82AAFF' },
|
||||||
|
{ tag: [t.labelName], color: '#cf6edf' },
|
||||||
|
{ tag: [t.color, t.constant(t.name), t.standard(t.name)], color: '#facf4e' },
|
||||||
|
{ tag: [t.definition(t.name), t.separator], color: '#56c8d8' },
|
||||||
|
{ tag: [t.brace], color: '#cf6edf' },
|
||||||
|
{ tag: [t.annotation], color: '#f07178' },
|
||||||
|
{ tag: [t.number, t.changed, t.annotation, t.modifier, t.self, t.namespace], color: '#f07178' },
|
||||||
|
{ tag: [t.typeName, t.className], color: '#f07178' },
|
||||||
|
{ tag: [t.operator, t.operatorKeyword], color: '#82AAFF' },
|
||||||
|
{ tag: [t.tagName], color: '#99d066' },
|
||||||
|
{ tag: [t.squareBracket], color: '#f07178' },
|
||||||
|
{ tag: [t.angleBracket], color: '#606f7a' },
|
||||||
|
{ tag: [t.attributeName], color: '#bdbdbd' },
|
||||||
|
{ tag: [t.regexp], color: '#f07178' },
|
||||||
|
{ tag: [t.quote], color: '#6abf69' },
|
||||||
|
{ tag: [t.string], color: '#99d066' },
|
||||||
|
{
|
||||||
|
tag: t.link,
|
||||||
|
color: '#56c8d8',
|
||||||
|
textDecoration: 'underline',
|
||||||
|
textUnderlinePosition: 'under',
|
||||||
|
},
|
||||||
|
{ tag: [t.url, t.escape, t.special(t.string)], color: '#facf4e' },
|
||||||
|
{ tag: [t.meta], color: '#707d8b' },
|
||||||
|
{ tag: [t.comment], color: '#707d8b', fontStyle: 'italic' },
|
||||||
|
{ tag: t.monospace, color: '#bdbdbd' },
|
||||||
|
{ tag: t.strong, fontWeight: 'bold', color: '#f07178' },
|
||||||
|
{ tag: t.emphasis, fontStyle: 'italic', color: '#99d066' },
|
||||||
|
{ tag: t.strikethrough, textDecoration: 'line-through' },
|
||||||
|
{ tag: t.heading, fontWeight: 'bold', color: '#facf4e' },
|
||||||
|
{ tag: t.heading1, fontWeight: 'bold', color: '#facf4e' },
|
||||||
|
{
|
||||||
|
tag: [t.heading2, t.heading3, t.heading4],
|
||||||
|
fontWeight: 'bold',
|
||||||
|
color: '#facf4e',
|
||||||
|
},
|
||||||
|
{ tag: [t.heading5, t.heading6], color: '#facf4e' },
|
||||||
|
{ tag: [t.atom, t.bool, t.special(t.variableName)], color: '#56c8d8' },
|
||||||
|
{ tag: [t.processingInstruction, t.inserted], color: '#f07178' },
|
||||||
|
{ tag: [t.contentSeparator], color: '#56c8d8' },
|
||||||
|
{ tag: t.invalid, color: '#606f7a', borderBottom: `1px dotted #f07178` },
|
||||||
|
],
|
||||||
|
});
|
||||||
+52
@@ -0,0 +1,52 @@
|
|||||||
|
import { tags as t } from '@lezer/highlight';
|
||||||
|
import { createTheme } from './theme-helper.mjs';
|
||||||
|
|
||||||
|
export const settings = {
|
||||||
|
light: true,
|
||||||
|
background: '#FAFAFA',
|
||||||
|
lineBackground: '#FAFAFA99',
|
||||||
|
foreground: '#90A4AE',
|
||||||
|
caret: '#272727',
|
||||||
|
selection: '#80CBC440',
|
||||||
|
selectionMatch: '#FAFAFA',
|
||||||
|
gutterBackground: '#FAFAFA',
|
||||||
|
gutterForeground: '#90A4AE',
|
||||||
|
gutterBorder: 'transparent',
|
||||||
|
lineHighlight: '#CCD7DA50',
|
||||||
|
};
|
||||||
|
export default createTheme({
|
||||||
|
theme: 'light',
|
||||||
|
settings: {
|
||||||
|
background: '#FAFAFA',
|
||||||
|
foreground: '#90A4AE',
|
||||||
|
caret: '#272727',
|
||||||
|
selection: '#80CBC440',
|
||||||
|
selectionMatch: '#80CBC440',
|
||||||
|
gutterBackground: '#FAFAFA',
|
||||||
|
gutterForeground: '#90A4AE',
|
||||||
|
gutterBorder: 'transparent',
|
||||||
|
lineHighlight: '#CCD7DA50',
|
||||||
|
},
|
||||||
|
styles: [
|
||||||
|
{ tag: t.keyword, color: '#39ADB5' },
|
||||||
|
{ tag: [t.name, t.deleted, t.character, t.macroName], color: '#90A4AE' },
|
||||||
|
{ tag: [t.propertyName], color: '#6182B8' },
|
||||||
|
{ tag: [t.processingInstruction, t.string, t.inserted, t.special(t.string)], color: '#91B859' },
|
||||||
|
{ tag: [t.function(t.variableName), t.labelName], color: '#6182B8' },
|
||||||
|
{ tag: [t.color, t.constant(t.name), t.standard(t.name)], color: '#39ADB5' },
|
||||||
|
{ tag: [t.definition(t.name), t.separator], color: '#90A4AE' },
|
||||||
|
{ tag: [t.className], color: '#E2931D' },
|
||||||
|
{ tag: [t.number, t.changed, t.annotation, t.modifier, t.self, t.namespace], color: '#F76D47' },
|
||||||
|
{ tag: [t.typeName], color: '#E2931D', fontStyle: '#E2931D' },
|
||||||
|
{ tag: [t.operator, t.operatorKeyword], color: '#39ADB5' },
|
||||||
|
{ tag: [t.url, t.escape, t.regexp, t.link], color: '#91B859' },
|
||||||
|
{ tag: [t.meta, t.comment], color: '#90A4AE' },
|
||||||
|
{ tag: t.strong, fontWeight: 'bold' },
|
||||||
|
{ tag: t.emphasis, fontStyle: 'italic' },
|
||||||
|
{ tag: t.link, textDecoration: 'underline' },
|
||||||
|
{ tag: t.heading, fontWeight: 'bold', color: '#39ADB5' },
|
||||||
|
{ tag: [t.atom, t.bool, t.special(t.variableName)], color: '#90A4AE' },
|
||||||
|
{ tag: t.invalid, color: '#E5393570' },
|
||||||
|
{ tag: t.strikethrough, textDecoration: 'line-through' },
|
||||||
|
],
|
||||||
|
});
|
||||||
+45
@@ -0,0 +1,45 @@
|
|||||||
|
import { tags as t } from '@lezer/highlight';
|
||||||
|
import { createTheme } from './theme-helper.mjs';
|
||||||
|
|
||||||
|
export const settings = {
|
||||||
|
background: '#272822',
|
||||||
|
lineBackground: '#27282299',
|
||||||
|
foreground: '#FFFFFF',
|
||||||
|
caret: '#FFFFFF',
|
||||||
|
selection: '#49483E',
|
||||||
|
selectionMatch: '#49483E',
|
||||||
|
gutterBackground: '#272822',
|
||||||
|
gutterForeground: '#FFFFFF70',
|
||||||
|
lineHighlight: '#00000059',
|
||||||
|
};
|
||||||
|
|
||||||
|
export default createTheme({
|
||||||
|
theme: 'dark',
|
||||||
|
settings: {
|
||||||
|
background: '#272822',
|
||||||
|
foreground: '#FFFFFF',
|
||||||
|
caret: '#FFFFFF',
|
||||||
|
selection: '#49483E',
|
||||||
|
selectionMatch: '#49483E',
|
||||||
|
gutterBackground: '#272822',
|
||||||
|
gutterForeground: '#FFFFFF70',
|
||||||
|
lineHighlight: '#0000003b',
|
||||||
|
},
|
||||||
|
styles: [
|
||||||
|
{ tag: t.labelName, color: '#bababa' },
|
||||||
|
{ tag: [t.comment, t.documentMeta], color: '#8292a2' },
|
||||||
|
{ tag: [t.number, t.bool, t.null, t.atom], color: '#ae81ff' },
|
||||||
|
{ tag: [t.attributeValue, t.className, t.name], color: '#e6db74' },
|
||||||
|
{ tag: [t.propertyName, t.attributeName], color: '#a6e22e' },
|
||||||
|
{ tag: [t.variableName], color: '#9effff' },
|
||||||
|
{ tag: [t.squareBracket], color: '#bababa' },
|
||||||
|
{ tag: [t.string, t.special(t.brace)], color: '#e6db74' },
|
||||||
|
{ tag: [t.regexp, t.className, t.typeName, t.definition(t.typeName)], color: '#66d9ef' },
|
||||||
|
{
|
||||||
|
tag: [t.definition(t.variableName), t.definition(t.propertyName), t.function(t.variableName)],
|
||||||
|
color: '#a6e22e',
|
||||||
|
},
|
||||||
|
// { tag: t.keyword, color: '#f92672' },
|
||||||
|
{ tag: [t.keyword, t.definitionKeyword, t.modifier, t.tagName, t.angleBracket], color: '#f92672' },
|
||||||
|
],
|
||||||
|
});
|
||||||
+50
@@ -0,0 +1,50 @@
|
|||||||
|
import { tags as t } from '@lezer/highlight';
|
||||||
|
import { createTheme } from './theme-helper.mjs';
|
||||||
|
|
||||||
|
export const settings = {
|
||||||
|
light: true,
|
||||||
|
background: '#f2f1f8',
|
||||||
|
lineBackground: '#f2f1f899',
|
||||||
|
foreground: '#0c006b',
|
||||||
|
caret: '#5c49e9',
|
||||||
|
selection: '#d5d1f2',
|
||||||
|
selectionMatch: '#d5d1f2',
|
||||||
|
gutterBackground: '#f2f1f8',
|
||||||
|
gutterForeground: '#0c006b70',
|
||||||
|
lineHighlight: '#e1def3',
|
||||||
|
};
|
||||||
|
|
||||||
|
export default createTheme({
|
||||||
|
theme: 'light',
|
||||||
|
settings: {
|
||||||
|
background: '#f2f1f8',
|
||||||
|
foreground: '#0c006b',
|
||||||
|
caret: '#5c49e9',
|
||||||
|
selection: '#d5d1f2',
|
||||||
|
selectionMatch: '#d5d1f2',
|
||||||
|
gutterBackground: '#f2f1f8',
|
||||||
|
gutterForeground: '#0c006b70',
|
||||||
|
lineHighlight: '#16067911',
|
||||||
|
},
|
||||||
|
styles: [
|
||||||
|
{ tag: t.comment, color: '#9995b7' },
|
||||||
|
{
|
||||||
|
tag: t.keyword,
|
||||||
|
color: '#ff5792',
|
||||||
|
fontWeight: 'bold',
|
||||||
|
},
|
||||||
|
{ tag: [t.definitionKeyword, t.modifier], color: '#ff5792' },
|
||||||
|
{ tag: [t.className, t.tagName, t.definition(t.typeName)], color: '#0094f0' },
|
||||||
|
{ tag: [t.number, t.bool, t.null, t.special(t.brace)], color: '#5842ff' },
|
||||||
|
{ tag: [t.definition(t.propertyName), t.function(t.variableName)], color: '#0095a8' },
|
||||||
|
{ tag: t.typeName, color: '#b3694d' },
|
||||||
|
{ tag: [t.propertyName, t.variableName], color: '#fa8900' },
|
||||||
|
{ tag: t.operator, color: '#ff5792' },
|
||||||
|
{ tag: t.self, color: '#e64100' },
|
||||||
|
{ tag: [t.string, t.regexp], color: '#00b368' },
|
||||||
|
{ tag: [t.paren, t.bracket], color: '#0431fa' },
|
||||||
|
{ tag: t.labelName, color: '#00bdd6' },
|
||||||
|
{ tag: t.attributeName, color: '#e64100' },
|
||||||
|
{ tag: t.angleBracket, color: '#9995b7' },
|
||||||
|
],
|
||||||
|
});
|
||||||
Vendored
+78
@@ -0,0 +1,78 @@
|
|||||||
|
import { tags as t } from '@lezer/highlight';
|
||||||
|
import { createTheme } from './theme-helper.mjs';
|
||||||
|
|
||||||
|
export const settings = {
|
||||||
|
background: '#2e3440',
|
||||||
|
lineBackground: '#2e344099',
|
||||||
|
foreground: '#FFFFFF',
|
||||||
|
caret: '#FFFFFF',
|
||||||
|
selection: '#3b4252',
|
||||||
|
selectionMatch: '#e5e9f0',
|
||||||
|
gutterBackground: '#2e3440',
|
||||||
|
gutterForeground: '#4c566a',
|
||||||
|
gutterActiveForeground: '#d8dee9',
|
||||||
|
lineHighlight: '#4c566a',
|
||||||
|
};
|
||||||
|
|
||||||
|
// Colors from https://www.nordtheme.com/docs/colors-and-palettes
|
||||||
|
export default createTheme({
|
||||||
|
theme: 'dark',
|
||||||
|
settings: {
|
||||||
|
background: '#2e3440',
|
||||||
|
foreground: '#FFFFFF',
|
||||||
|
caret: '#FFFFFF',
|
||||||
|
selection: '#00000073',
|
||||||
|
selectionMatch: '#00000073',
|
||||||
|
gutterBackground: '#2e3440',
|
||||||
|
gutterForeground: '#4c566a',
|
||||||
|
gutterActiveForeground: '#d8dee9',
|
||||||
|
lineHighlight: '#4c566a29',
|
||||||
|
},
|
||||||
|
styles: [
|
||||||
|
{ tag: t.keyword, color: '#5e81ac' },
|
||||||
|
{ tag: [t.name, t.deleted, t.character, t.propertyName, t.macroName], color: '#88c0d0' },
|
||||||
|
{ tag: [t.variableName], color: '#8fbcbb' },
|
||||||
|
{ tag: [t.function(t.variableName)], color: '#8fbcbb' },
|
||||||
|
{ tag: [t.labelName], color: '#81a1c1' },
|
||||||
|
{ tag: [t.color, t.constant(t.name), t.standard(t.name)], color: '#5e81ac' },
|
||||||
|
{ tag: [t.definition(t.name), t.separator], color: '#a3be8c' },
|
||||||
|
{ tag: [t.brace], color: '#8fbcbb' },
|
||||||
|
{ tag: [t.annotation], color: '#d30102' },
|
||||||
|
{ tag: [t.number, t.changed, t.annotation, t.modifier, t.self, t.namespace], color: '#b48ead' },
|
||||||
|
{ tag: [t.typeName, t.className], color: '#ebcb8b' },
|
||||||
|
{ tag: [t.operator, t.operatorKeyword], color: '#a3be8c' },
|
||||||
|
{ tag: [t.tagName], color: '#b48ead' },
|
||||||
|
{ tag: [t.squareBracket], color: '#bf616a' },
|
||||||
|
{ tag: [t.angleBracket], color: '#d08770' },
|
||||||
|
{ tag: [t.attributeName], color: '#ebcb8b' },
|
||||||
|
{ tag: [t.regexp], color: '#5e81ac' },
|
||||||
|
{ tag: [t.quote], color: '#b48ead' },
|
||||||
|
{ tag: [t.string], color: '#a3be8c' },
|
||||||
|
{
|
||||||
|
tag: t.link,
|
||||||
|
color: '#a3be8c',
|
||||||
|
textDecoration: 'underline',
|
||||||
|
textUnderlinePosition: 'under',
|
||||||
|
},
|
||||||
|
{ tag: [t.url, t.escape, t.special(t.string)], color: '#8fbcbb' },
|
||||||
|
{ tag: [t.meta], color: '#88c0d0' },
|
||||||
|
{ tag: [t.monospace], color: '#d8dee9', fontStyle: 'italic' },
|
||||||
|
{ tag: [t.comment], color: '#4c566a', fontStyle: 'italic' },
|
||||||
|
{ tag: t.strong, fontWeight: 'bold', color: '#5e81ac' },
|
||||||
|
{ tag: t.emphasis, fontStyle: 'italic', color: '#5e81ac' },
|
||||||
|
{ tag: t.strikethrough, textDecoration: 'line-through' },
|
||||||
|
{ tag: t.heading, fontWeight: 'bold', color: '#5e81ac' },
|
||||||
|
{ tag: t.special(t.heading1), fontWeight: 'bold', color: '#5e81ac' },
|
||||||
|
{ tag: t.heading1, fontWeight: 'bold', color: '#5e81ac' },
|
||||||
|
{
|
||||||
|
tag: [t.heading2, t.heading3, t.heading4],
|
||||||
|
fontWeight: 'bold',
|
||||||
|
color: '#5e81ac',
|
||||||
|
},
|
||||||
|
{ tag: [t.heading5, t.heading6], color: '#5e81ac' },
|
||||||
|
{ tag: [t.atom, t.bool, t.special(t.variableName)], color: '#d08770' },
|
||||||
|
{ tag: [t.processingInstruction, t.inserted], color: '#8fbcbb' },
|
||||||
|
{ tag: [t.contentSeparator], color: '#ebcb8b' },
|
||||||
|
{ tag: t.invalid, color: '#434c5e', borderBottom: `1px dotted #d30102` },
|
||||||
|
],
|
||||||
|
});
|
||||||
+79
@@ -0,0 +1,79 @@
|
|||||||
|
import { tags as t } from '@lezer/highlight';
|
||||||
|
import { createTheme } from './theme-helper.mjs';
|
||||||
|
|
||||||
|
export const settings = {
|
||||||
|
background: '#002b36',
|
||||||
|
lineBackground: '#002b3699',
|
||||||
|
foreground: '#93a1a1',
|
||||||
|
caret: '#839496',
|
||||||
|
selection: '#173541',
|
||||||
|
selectionMatch: '#aafe661a',
|
||||||
|
gutterBackground: '#00252f',
|
||||||
|
gutterForeground: '#839496',
|
||||||
|
lineHighlight: '#173541',
|
||||||
|
};
|
||||||
|
|
||||||
|
const c = {
|
||||||
|
background: '#002B36',
|
||||||
|
foreground: '#839496',
|
||||||
|
selection: '#004454AA',
|
||||||
|
selectionMatch: '#005A6FAA',
|
||||||
|
cursor: '#D30102',
|
||||||
|
dropdownBackground: '#00212B',
|
||||||
|
dropdownBorder: '#2AA19899',
|
||||||
|
activeLine: '#00cafe11',
|
||||||
|
matchingBracket: '#073642',
|
||||||
|
keyword: '#859900',
|
||||||
|
storage: '#93A1A1',
|
||||||
|
variable: '#268BD2',
|
||||||
|
parameter: '#268BD2',
|
||||||
|
function: '#268BD2',
|
||||||
|
string: '#2AA198',
|
||||||
|
constant: '#CB4B16',
|
||||||
|
type: '#859900',
|
||||||
|
class: '#268BD2',
|
||||||
|
number: '#D33682',
|
||||||
|
comment: '#586E75',
|
||||||
|
heading: '#268BD2',
|
||||||
|
invalid: '#DC322F',
|
||||||
|
regexp: '#DC322F',
|
||||||
|
tag: '#268BD2',
|
||||||
|
};
|
||||||
|
|
||||||
|
export default createTheme({
|
||||||
|
theme: 'dark',
|
||||||
|
settings: {
|
||||||
|
background: c.background,
|
||||||
|
foreground: c.foreground,
|
||||||
|
caret: c.cursor,
|
||||||
|
selection: c.selection,
|
||||||
|
selectionMatch: c.selection,
|
||||||
|
gutterBackground: c.background,
|
||||||
|
gutterForeground: c.foreground,
|
||||||
|
gutterBorder: 'transparent',
|
||||||
|
lineHighlight: c.activeLine,
|
||||||
|
},
|
||||||
|
styles: [
|
||||||
|
{ tag: t.keyword, color: c.keyword },
|
||||||
|
{ tag: [t.name, t.deleted, t.character, t.macroName], color: c.variable },
|
||||||
|
{ tag: [t.propertyName], color: c.function },
|
||||||
|
{ tag: [t.processingInstruction, t.string, t.inserted, t.special(t.string)], color: c.string },
|
||||||
|
{ tag: [t.function(t.variableName), t.labelName], color: c.function },
|
||||||
|
{ tag: [t.color, t.constant(t.name), t.standard(t.name)], color: c.constant },
|
||||||
|
{ tag: [t.definition(t.name), t.separator], color: c.variable },
|
||||||
|
{ tag: [t.className], color: c.class },
|
||||||
|
{ tag: [t.number, t.changed, t.annotation, t.modifier, t.self, t.namespace], color: c.number },
|
||||||
|
{ tag: [t.typeName], color: c.type, fontStyle: c.type },
|
||||||
|
{ tag: [t.operator, t.operatorKeyword], color: c.keyword },
|
||||||
|
{ tag: [t.url, t.escape, t.regexp, t.link], color: c.regexp },
|
||||||
|
{ tag: [t.meta, t.comment], color: c.comment },
|
||||||
|
{ tag: t.tagName, color: c.tag },
|
||||||
|
{ tag: t.strong, fontWeight: 'bold' },
|
||||||
|
{ tag: t.emphasis, fontStyle: 'italic' },
|
||||||
|
{ tag: t.link, textDecoration: 'underline' },
|
||||||
|
{ tag: t.heading, fontWeight: 'bold', color: c.heading },
|
||||||
|
{ tag: [t.atom, t.bool, t.special(t.variableName)], color: c.variable },
|
||||||
|
{ tag: t.invalid, color: c.invalid },
|
||||||
|
{ tag: t.strikethrough, textDecoration: 'line-through' },
|
||||||
|
],
|
||||||
|
});
|
||||||
+82
@@ -0,0 +1,82 @@
|
|||||||
|
import { tags as t } from '@lezer/highlight';
|
||||||
|
import { createTheme } from './theme-helper.mjs';
|
||||||
|
|
||||||
|
// this is slightly different from https://thememirror.net/solarized-light
|
||||||
|
|
||||||
|
export const settings = {
|
||||||
|
light: true,
|
||||||
|
background: '#fdf6e3',
|
||||||
|
lineBackground: '#fdf6e399',
|
||||||
|
foreground: '#657b83',
|
||||||
|
caret: '#586e75',
|
||||||
|
selection: '#dfd9c8',
|
||||||
|
selectionMatch: '#dfd9c8',
|
||||||
|
gutterBackground: '#00000010',
|
||||||
|
gutterForeground: '#657b83',
|
||||||
|
lineHighlight: '#dfd9c8',
|
||||||
|
};
|
||||||
|
|
||||||
|
const c = {
|
||||||
|
background: '#FDF6E3',
|
||||||
|
foreground: '#657B83',
|
||||||
|
selection: '#EEE8D5',
|
||||||
|
selectionMatch: '#EEE8D5',
|
||||||
|
cursor: '#657B83',
|
||||||
|
dropdownBackground: '#EEE8D5',
|
||||||
|
dropdownBorder: '#D3AF86',
|
||||||
|
activeLine: '#3d392d11',
|
||||||
|
matchingBracket: '#EEE8D5',
|
||||||
|
keyword: '#859900',
|
||||||
|
storage: '#586E75',
|
||||||
|
variable: '#268BD2',
|
||||||
|
parameter: '#268BD2',
|
||||||
|
function: '#268BD2',
|
||||||
|
string: '#2AA198',
|
||||||
|
constant: '#CB4B16',
|
||||||
|
type: '#859900',
|
||||||
|
class: '#268BD2',
|
||||||
|
number: '#D33682',
|
||||||
|
comment: '#93A1A1',
|
||||||
|
heading: '#268BD2',
|
||||||
|
invalid: '#DC322F',
|
||||||
|
regexp: '#DC322F',
|
||||||
|
tag: '#268BD2',
|
||||||
|
};
|
||||||
|
|
||||||
|
export default createTheme({
|
||||||
|
theme: 'light',
|
||||||
|
settings: {
|
||||||
|
background: c.background,
|
||||||
|
foreground: c.foreground,
|
||||||
|
caret: c.cursor,
|
||||||
|
selection: c.selection,
|
||||||
|
selectionMatch: c.selectionMatch,
|
||||||
|
gutterBackground: c.background,
|
||||||
|
gutterForeground: c.foreground,
|
||||||
|
gutterBorder: 'transparent',
|
||||||
|
lineHighlight: c.activeLine,
|
||||||
|
},
|
||||||
|
styles: [
|
||||||
|
{ tag: t.keyword, color: c.keyword },
|
||||||
|
{ tag: [t.name, t.deleted, t.character, t.macroName], color: c.variable },
|
||||||
|
{ tag: [t.propertyName], color: c.function },
|
||||||
|
{ tag: [t.processingInstruction, t.string, t.inserted, t.special(t.string)], color: c.string },
|
||||||
|
{ tag: [t.function(t.variableName), t.labelName], color: c.function },
|
||||||
|
{ tag: [t.color, t.constant(t.name), t.standard(t.name)], color: c.constant },
|
||||||
|
{ tag: [t.definition(t.name), t.separator], color: c.variable },
|
||||||
|
{ tag: [t.className], color: c.class },
|
||||||
|
{ tag: [t.number, t.changed, t.annotation, t.modifier, t.self, t.namespace], color: c.number },
|
||||||
|
{ tag: [t.typeName], color: c.type, fontStyle: c.type },
|
||||||
|
{ tag: [t.operator, t.operatorKeyword], color: c.keyword },
|
||||||
|
{ tag: [t.url, t.escape, t.regexp, t.link], color: c.regexp },
|
||||||
|
{ tag: [t.meta, t.comment], color: c.comment },
|
||||||
|
{ tag: t.tagName, color: c.tag },
|
||||||
|
{ tag: t.strong, fontWeight: 'bold' },
|
||||||
|
{ tag: t.emphasis, fontStyle: 'italic' },
|
||||||
|
{ tag: t.link, textDecoration: 'underline' },
|
||||||
|
{ tag: t.heading, fontWeight: 'bold', color: c.heading },
|
||||||
|
{ tag: [t.atom, t.bool, t.special(t.variableName)], color: c.variable },
|
||||||
|
{ tag: t.invalid, color: c.invalid },
|
||||||
|
{ tag: t.strikethrough, textDecoration: 'line-through' },
|
||||||
|
],
|
||||||
|
});
|
||||||
+12
-6
@@ -1,10 +1,11 @@
|
|||||||
import { tags as t } from '@lezer/highlight';
|
import { tags as t } from '@lezer/highlight';
|
||||||
import { createTheme } from '@uiw/codemirror-themes';
|
import { createTheme } from './theme-helper.mjs';
|
||||||
export default createTheme({
|
|
||||||
theme: 'dark',
|
export const settings = {
|
||||||
settings: {
|
|
||||||
background: '#222',
|
background: '#222',
|
||||||
foreground: '#75baff', // whats that?
|
lineBackground: '#22222299',
|
||||||
|
foreground: '#fff',
|
||||||
|
// foreground: '#75baff',
|
||||||
caret: '#ffcc00',
|
caret: '#ffcc00',
|
||||||
selection: 'rgba(128, 203, 196, 0.5)',
|
selection: 'rgba(128, 203, 196, 0.5)',
|
||||||
selectionMatch: '#036dd626',
|
selectionMatch: '#036dd626',
|
||||||
@@ -13,8 +14,13 @@ export default createTheme({
|
|||||||
gutterBackground: 'transparent',
|
gutterBackground: 'transparent',
|
||||||
// gutterForeground: '#8a919966',
|
// gutterForeground: '#8a919966',
|
||||||
gutterForeground: '#8a919966',
|
gutterForeground: '#8a919966',
|
||||||
},
|
};
|
||||||
|
|
||||||
|
export default createTheme({
|
||||||
|
theme: 'dark',
|
||||||
|
settings,
|
||||||
styles: [
|
styles: [
|
||||||
|
{ tag: t.labelName, color: '#89ddff' },
|
||||||
{ tag: t.keyword, color: '#c792ea' },
|
{ tag: t.keyword, color: '#c792ea' },
|
||||||
{ tag: t.operator, color: '#89ddff' },
|
{ tag: t.operator, color: '#89ddff' },
|
||||||
{ tag: t.special(t.variableName), color: '#eeffff' },
|
{ tag: t.special(t.variableName), color: '#eeffff' },
|
||||||
|
|||||||
+43
@@ -0,0 +1,43 @@
|
|||||||
|
import { tags as t } from '@lezer/highlight';
|
||||||
|
import { createTheme } from './theme-helper.mjs';
|
||||||
|
|
||||||
|
export const settings = {
|
||||||
|
background: '#303841',
|
||||||
|
lineBackground: '#30384199',
|
||||||
|
foreground: '#FFFFFF',
|
||||||
|
caret: '#FBAC52',
|
||||||
|
selection: '#4C5964',
|
||||||
|
selectionMatch: '#3A546E',
|
||||||
|
gutterBackground: '#303841',
|
||||||
|
gutterForeground: '#FFFFFF70',
|
||||||
|
lineHighlight: '#00000059',
|
||||||
|
};
|
||||||
|
|
||||||
|
export default createTheme({
|
||||||
|
theme: 'dark',
|
||||||
|
settings: {
|
||||||
|
background: '#303841',
|
||||||
|
foreground: '#FFFFFF',
|
||||||
|
caret: '#FBAC52',
|
||||||
|
selection: '#4C5964',
|
||||||
|
selectionMatch: '#3A546E',
|
||||||
|
gutterBackground: '#303841',
|
||||||
|
gutterForeground: '#FFFFFF70',
|
||||||
|
lineHighlight: '#00000059',
|
||||||
|
},
|
||||||
|
styles: [
|
||||||
|
{ tag: t.labelName, color: '#A2A9B5' },
|
||||||
|
{ tag: [t.meta, t.comment], color: '#A2A9B5' },
|
||||||
|
{ tag: [t.attributeName, t.keyword], color: '#B78FBA' },
|
||||||
|
{ tag: t.function(t.variableName), color: '#5AB0B0' },
|
||||||
|
{ tag: [t.string, t.regexp, t.attributeValue], color: '#99C592' },
|
||||||
|
{ tag: t.operator, color: '#f47954' },
|
||||||
|
// { tag: t.moduleKeyword, color: 'red' },
|
||||||
|
{ tag: [t.tagName, t.modifier], color: '#E35F63' },
|
||||||
|
{ tag: [t.number, t.definition(t.tagName), t.className, t.definition(t.variableName)], color: '#fbac52' },
|
||||||
|
{ tag: [t.atom, t.bool, t.special(t.variableName)], color: '#E35F63' },
|
||||||
|
{ tag: t.variableName, color: '#539ac4' },
|
||||||
|
{ tag: [t.propertyName, t.typeName], color: '#629ccd' },
|
||||||
|
{ tag: t.propertyName, color: '#36b7b5' },
|
||||||
|
],
|
||||||
|
});
|
||||||
+3
-2
@@ -1,5 +1,5 @@
|
|||||||
import { tags as t } from '@lezer/highlight';
|
import { tags as t } from '@lezer/highlight';
|
||||||
import { createTheme } from '@uiw/codemirror-themes';
|
import { createTheme } from './theme-helper.mjs';
|
||||||
|
|
||||||
let colorA = '#6edee4';
|
let colorA = '#6edee4';
|
||||||
//let colorB = 'magenta';
|
//let colorB = 'magenta';
|
||||||
@@ -17,7 +17,7 @@ export const settings = {
|
|||||||
lineBackground: '#00000040',
|
lineBackground: '#00000040',
|
||||||
gutterBackground: 'transparent',
|
gutterBackground: 'transparent',
|
||||||
gutterForeground: '#8a919966',
|
gutterForeground: '#8a919966',
|
||||||
customStyle: '.cm-line { line-height: 1 }',
|
// customStyle: '.cm-line { line-height: 1 }',
|
||||||
};
|
};
|
||||||
|
|
||||||
let punctuation = colorD;
|
let punctuation = colorD;
|
||||||
@@ -27,6 +27,7 @@ export default createTheme({
|
|||||||
theme: 'dark',
|
theme: 'dark',
|
||||||
settings,
|
settings,
|
||||||
styles: [
|
styles: [
|
||||||
|
{ tag: t.labelName, color: colorB },
|
||||||
{ tag: t.keyword, color: colorA },
|
{ tag: t.keyword, color: colorA },
|
||||||
{ tag: t.operator, color: mini },
|
{ tag: t.operator, color: mini },
|
||||||
{ tag: t.special(t.variableName), color: colorA },
|
{ tag: t.special(t.variableName), color: colorA },
|
||||||
|
|||||||
+20
-19
@@ -1,5 +1,5 @@
|
|||||||
import { tags as t } from '@lezer/highlight';
|
import { tags as t } from '@lezer/highlight';
|
||||||
import { createTheme } from '@uiw/codemirror-themes';
|
import { createTheme } from './theme-helper.mjs';
|
||||||
export const settings = {
|
export const settings = {
|
||||||
background: 'black',
|
background: 'black',
|
||||||
foreground: '#41FF00', // whats that?
|
foreground: '#41FF00', // whats that?
|
||||||
@@ -14,23 +14,24 @@ export default createTheme({
|
|||||||
theme: 'dark',
|
theme: 'dark',
|
||||||
settings,
|
settings,
|
||||||
styles: [
|
styles: [
|
||||||
{ tag: t.keyword, color: '#41FF00' },
|
{ tag: t.labelName, color: 'inherit' },
|
||||||
{ tag: t.operator, color: '#41FF00' },
|
{ tag: t.keyword, color: 'inherit' },
|
||||||
{ tag: t.special(t.variableName), color: '#41FF00' },
|
{ tag: t.operator, color: 'inherit' },
|
||||||
{ tag: t.typeName, color: '#41FF00' },
|
{ tag: t.special(t.variableName), color: 'inherit' },
|
||||||
{ tag: t.atom, color: '#41FF00' },
|
{ tag: t.typeName, color: 'inherit' },
|
||||||
{ tag: t.number, color: '#41FF00' },
|
{ tag: t.atom, color: 'inherit' },
|
||||||
{ tag: t.definition(t.variableName), color: '#41FF00' },
|
{ tag: t.number, color: 'inherit' },
|
||||||
{ tag: t.string, color: '#41FF00' },
|
{ tag: t.definition(t.variableName), color: 'inherit' },
|
||||||
{ tag: t.special(t.string), color: '#41FF00' },
|
{ tag: t.string, color: 'inherit' },
|
||||||
{ tag: t.comment, color: '#41FF00' },
|
{ tag: t.special(t.string), color: 'inherit' },
|
||||||
{ tag: t.variableName, color: '#41FF00' },
|
{ tag: t.comment, color: 'inherit' },
|
||||||
{ tag: t.tagName, color: '#41FF00' },
|
{ tag: t.variableName, color: 'inherit' },
|
||||||
{ tag: t.bracket, color: '#41FF00' },
|
{ tag: t.tagName, color: 'inherit' },
|
||||||
{ tag: t.meta, color: '#41FF00' },
|
{ tag: t.bracket, color: 'inherit' },
|
||||||
{ tag: t.attributeName, color: '#41FF00' },
|
{ tag: t.meta, color: 'inherit' },
|
||||||
{ tag: t.propertyName, color: '#41FF00' },
|
{ tag: t.attributeName, color: 'inherit' },
|
||||||
{ tag: t.className, color: '#41FF00' },
|
{ tag: t.propertyName, color: 'inherit' },
|
||||||
{ tag: t.invalid, color: '#41FF00' },
|
{ tag: t.className, color: 'inherit' },
|
||||||
|
{ tag: t.invalid, color: 'inherit' },
|
||||||
],
|
],
|
||||||
});
|
});
|
||||||
|
|||||||
+42
@@ -0,0 +1,42 @@
|
|||||||
|
import { EditorView } from '@codemirror/view';
|
||||||
|
import { syntaxHighlighting } from '@codemirror/language';
|
||||||
|
import { HighlightStyle } from '@codemirror/language';
|
||||||
|
|
||||||
|
export const createTheme = ({ theme, settings, styles }) => {
|
||||||
|
const _theme = EditorView.theme(
|
||||||
|
{
|
||||||
|
'&': {
|
||||||
|
color: settings.foreground,
|
||||||
|
backgroundColor: settings.background,
|
||||||
|
},
|
||||||
|
'.cm-gutters': {
|
||||||
|
backgroundColor: settings.gutterBackground,
|
||||||
|
color: settings.gutterForeground,
|
||||||
|
//borderRightColor: settings.gutterBorder
|
||||||
|
},
|
||||||
|
'.cm-content': {
|
||||||
|
caretColor: settings.caret,
|
||||||
|
},
|
||||||
|
'.cm-cursor, .cm-dropCursor': {
|
||||||
|
borderLeftColor: settings.caret,
|
||||||
|
},
|
||||||
|
'.cm-activeLineGutter': {
|
||||||
|
// color: settings.gutterActiveForeground
|
||||||
|
backgroundColor: settings.lineHighlight,
|
||||||
|
},
|
||||||
|
'.cm-activeLine': {
|
||||||
|
backgroundColor: settings.lineHighlight,
|
||||||
|
},
|
||||||
|
'&.cm-focused .cm-selectionBackground, & .cm-line::selection, & .cm-selectionLayer .cm-selectionBackground, .cm-content ::selection':
|
||||||
|
{
|
||||||
|
background: settings.selection + ' !important',
|
||||||
|
},
|
||||||
|
'& .cm-selectionMatch': {
|
||||||
|
backgroundColor: settings.selectionMatch,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{ dark: theme === 'dark' },
|
||||||
|
);
|
||||||
|
const highlightStyle = HighlightStyle.define(styles);
|
||||||
|
return [_theme, syntaxHighlighting(highlightStyle)];
|
||||||
|
};
|
||||||
+52
@@ -0,0 +1,52 @@
|
|||||||
|
import { tags as t } from '@lezer/highlight';
|
||||||
|
import { createTheme } from './theme-helper.mjs';
|
||||||
|
|
||||||
|
export const settings = {
|
||||||
|
background: '#24283b',
|
||||||
|
lineBackground: '#24283b99',
|
||||||
|
foreground: '#7982a9',
|
||||||
|
caret: '#c0caf5',
|
||||||
|
selection: '#6f7bb630',
|
||||||
|
selectionMatch: '#1f2335',
|
||||||
|
gutterBackground: '#24283b',
|
||||||
|
gutterForeground: '#7982a9',
|
||||||
|
gutterBorder: 'transparent',
|
||||||
|
lineHighlight: '#292e42',
|
||||||
|
};
|
||||||
|
|
||||||
|
export default createTheme({
|
||||||
|
theme: 'dark',
|
||||||
|
settings: {
|
||||||
|
background: '#24283b',
|
||||||
|
foreground: '#7982a9',
|
||||||
|
caret: '#c0caf5',
|
||||||
|
selection: '#6f7bb630',
|
||||||
|
selectionMatch: '#343b5f',
|
||||||
|
gutterBackground: '#24283b',
|
||||||
|
gutterForeground: '#7982a9',
|
||||||
|
gutterBorder: 'transparent',
|
||||||
|
lineHighlight: '#292e427a',
|
||||||
|
},
|
||||||
|
styles: [
|
||||||
|
{ tag: t.keyword, color: '#bb9af7' },
|
||||||
|
{ tag: [t.name, t.deleted, t.character, t.macroName], color: '#c0caf5' },
|
||||||
|
{ tag: [t.propertyName], color: '#7aa2f7' },
|
||||||
|
{ tag: [t.processingInstruction, t.string, t.inserted, t.special(t.string)], color: '#9ece6a' },
|
||||||
|
{ tag: [t.function(t.variableName), t.labelName], color: '#7aa2f7' },
|
||||||
|
{ tag: [t.color, t.constant(t.name), t.standard(t.name)], color: '#bb9af7' },
|
||||||
|
{ tag: [t.definition(t.name), t.separator], color: '#c0caf5' },
|
||||||
|
{ tag: [t.className], color: '#c0caf5' },
|
||||||
|
{ tag: [t.number, t.changed, t.annotation, t.modifier, t.self, t.namespace], color: '#ff9e64' },
|
||||||
|
{ tag: [t.typeName], color: '#2ac3de', fontStyle: '#2ac3de' },
|
||||||
|
{ tag: [t.operator, t.operatorKeyword], color: '#bb9af7' },
|
||||||
|
{ tag: [t.url, t.escape, t.regexp, t.link], color: '#b4f9f8' },
|
||||||
|
{ tag: [t.meta, t.comment], color: '#565f89' },
|
||||||
|
{ tag: t.strong, fontWeight: 'bold' },
|
||||||
|
{ tag: t.emphasis, fontStyle: 'italic' },
|
||||||
|
{ tag: t.link, textDecoration: 'underline' },
|
||||||
|
{ tag: t.heading, fontWeight: 'bold', color: '#89ddff' },
|
||||||
|
{ tag: [t.atom, t.bool, t.special(t.variableName)], color: '#c0caf5' },
|
||||||
|
{ tag: t.invalid, color: '#ff5370' },
|
||||||
|
{ tag: t.strikethrough, textDecoration: 'line-through' },
|
||||||
|
],
|
||||||
|
});
|
||||||
+52
@@ -0,0 +1,52 @@
|
|||||||
|
import { tags as t } from '@lezer/highlight';
|
||||||
|
import { createTheme } from './theme-helper.mjs';
|
||||||
|
|
||||||
|
export const settings = {
|
||||||
|
background: '#1a1b26',
|
||||||
|
lineBackground: '#1a1b2699',
|
||||||
|
foreground: '#787c99',
|
||||||
|
caret: '#c0caf5',
|
||||||
|
selection: '#515c7e40',
|
||||||
|
selectionMatch: '#16161e',
|
||||||
|
gutterBackground: '#1a1b26',
|
||||||
|
gutterForeground: '#787c99',
|
||||||
|
gutterBorder: 'transparent',
|
||||||
|
lineHighlight: '#1e202e',
|
||||||
|
};
|
||||||
|
|
||||||
|
export default createTheme({
|
||||||
|
theme: 'dark',
|
||||||
|
settings: {
|
||||||
|
background: '#1a1b26',
|
||||||
|
foreground: '#787c99',
|
||||||
|
caret: '#c0caf5',
|
||||||
|
selection: '#515c7e40',
|
||||||
|
selectionMatch: '#16161e',
|
||||||
|
gutterBackground: '#1a1b26',
|
||||||
|
gutterForeground: '#787c99',
|
||||||
|
gutterBorder: 'transparent',
|
||||||
|
lineHighlight: '#474b6611',
|
||||||
|
},
|
||||||
|
styles: [
|
||||||
|
{ tag: t.keyword, color: '#bb9af7' },
|
||||||
|
{ tag: [t.name, t.deleted, t.character, t.macroName], color: '#c0caf5' },
|
||||||
|
{ tag: [t.propertyName], color: '#7aa2f7' },
|
||||||
|
{ tag: [t.processingInstruction, t.string, t.inserted, t.special(t.string)], color: '#9ece6a' },
|
||||||
|
{ tag: [t.function(t.variableName), t.labelName], color: '#7aa2f7' },
|
||||||
|
{ tag: [t.color, t.constant(t.name), t.standard(t.name)], color: '#bb9af7' },
|
||||||
|
{ tag: [t.definition(t.name), t.separator], color: '#c0caf5' },
|
||||||
|
{ tag: [t.className], color: '#c0caf5' },
|
||||||
|
{ tag: [t.number, t.changed, t.annotation, t.modifier, t.self, t.namespace], color: '#ff9e64' },
|
||||||
|
{ tag: [t.typeName], color: '#0db9d7' },
|
||||||
|
{ tag: [t.operator, t.operatorKeyword], color: '#bb9af7' },
|
||||||
|
{ tag: [t.url, t.escape, t.regexp, t.link], color: '#b4f9f8' },
|
||||||
|
{ tag: [t.meta, t.comment], color: '#444b6a' },
|
||||||
|
{ tag: t.strong, fontWeight: 'bold' },
|
||||||
|
{ tag: t.emphasis, fontStyle: 'italic' },
|
||||||
|
{ tag: t.link, textDecoration: 'underline' },
|
||||||
|
{ tag: t.heading, fontWeight: 'bold', color: '#89ddff' },
|
||||||
|
{ tag: [t.atom, t.bool, t.special(t.variableName)], color: '#c0caf5' },
|
||||||
|
{ tag: t.invalid, color: '#ff5370' },
|
||||||
|
{ tag: t.strikethrough, textDecoration: 'line-through' },
|
||||||
|
],
|
||||||
|
});
|
||||||
+53
@@ -0,0 +1,53 @@
|
|||||||
|
import { tags as t } from '@lezer/highlight';
|
||||||
|
import { createTheme } from './theme-helper.mjs';
|
||||||
|
|
||||||
|
export const settings = {
|
||||||
|
light: true,
|
||||||
|
background: '#e1e2e7',
|
||||||
|
lineBackground: '#e1e2e799',
|
||||||
|
foreground: '#3760bf',
|
||||||
|
caret: '#3760bf',
|
||||||
|
selection: '#99a7df',
|
||||||
|
selectionMatch: '#99a7df',
|
||||||
|
gutterBackground: '#e1e2e7',
|
||||||
|
gutterForeground: '#3760bf',
|
||||||
|
gutterBorder: 'transparent',
|
||||||
|
lineHighlight: '#5f5faf11',
|
||||||
|
};
|
||||||
|
|
||||||
|
export default createTheme({
|
||||||
|
theme: 'light',
|
||||||
|
settings: {
|
||||||
|
background: '#e1e2e7',
|
||||||
|
foreground: '#3760bf',
|
||||||
|
caret: '#3760bf',
|
||||||
|
selection: '#99a7df',
|
||||||
|
selectionMatch: '#99a7df',
|
||||||
|
gutterBackground: '#e1e2e7',
|
||||||
|
gutterForeground: '#3760bf',
|
||||||
|
gutterBorder: 'transparent',
|
||||||
|
lineHighlight: '#5f5faf11',
|
||||||
|
},
|
||||||
|
styles: [
|
||||||
|
{ tag: t.keyword, color: '#007197' },
|
||||||
|
{ tag: [t.name, t.deleted, t.character, t.macroName], color: '#3760bf' },
|
||||||
|
{ tag: [t.propertyName], color: '#3760bf' },
|
||||||
|
{ tag: [t.processingInstruction, t.string, t.inserted, t.special(t.string)], color: '#587539' },
|
||||||
|
{ tag: [t.function(t.variableName), t.labelName], color: '#3760bf' },
|
||||||
|
{ tag: [t.color, t.constant(t.name), t.standard(t.name)], color: '#3760bf' },
|
||||||
|
{ tag: [t.definition(t.name), t.separator], color: '#3760bf' },
|
||||||
|
{ tag: [t.className], color: '#3760bf' },
|
||||||
|
{ tag: [t.number, t.changed, t.annotation, t.modifier, t.self, t.namespace], color: '#b15c00' },
|
||||||
|
{ tag: [t.typeName], color: '#007197', fontStyle: '#007197' },
|
||||||
|
{ tag: [t.operator, t.operatorKeyword], color: '#007197' },
|
||||||
|
{ tag: [t.url, t.escape, t.regexp, t.link], color: '#587539' },
|
||||||
|
{ tag: [t.meta, t.comment], color: '#848cb5' },
|
||||||
|
{ tag: t.strong, fontWeight: 'bold' },
|
||||||
|
{ tag: t.emphasis, fontStyle: 'italic' },
|
||||||
|
{ tag: t.link, textDecoration: 'underline' },
|
||||||
|
{ tag: t.heading, fontWeight: 'bold', color: '#b15c00' },
|
||||||
|
{ tag: [t.atom, t.bool, t.special(t.variableName)], color: '#3760bf' },
|
||||||
|
{ tag: t.invalid, color: '#f52a65' },
|
||||||
|
{ tag: t.strikethrough, textDecoration: 'line-through' },
|
||||||
|
],
|
||||||
|
});
|
||||||
+80
@@ -0,0 +1,80 @@
|
|||||||
|
import { tags as t } from '@lezer/highlight';
|
||||||
|
import { createTheme } from './theme-helper.mjs';
|
||||||
|
|
||||||
|
export const settings = {
|
||||||
|
background: '#1e1e1e',
|
||||||
|
lineBackground: '#1e1e1e99',
|
||||||
|
foreground: '#fff',
|
||||||
|
caret: '#c6c6c6',
|
||||||
|
selection: '#6199ff2f',
|
||||||
|
selectionMatch: '#72a1ff59',
|
||||||
|
lineHighlight: '#ffffff0f',
|
||||||
|
gutterBackground: '#1e1e1e',
|
||||||
|
gutterForeground: '#838383',
|
||||||
|
gutterActiveForeground: '#fff',
|
||||||
|
};
|
||||||
|
|
||||||
|
export default createTheme({
|
||||||
|
theme: 'dark',
|
||||||
|
settings: {
|
||||||
|
background: '#1e1e1e',
|
||||||
|
foreground: '#fff',
|
||||||
|
caret: '#c6c6c6',
|
||||||
|
selection: '#6199ff2f',
|
||||||
|
selectionMatch: '#72a1ff59',
|
||||||
|
lineHighlight: '#ffffff0f',
|
||||||
|
gutterBackground: '#1e1e1e',
|
||||||
|
gutterForeground: '#838383',
|
||||||
|
gutterActiveForeground: '#fff',
|
||||||
|
fontFamily: 'Menlo, Monaco, Consolas, "Andale Mono", "Ubuntu Mono", "Courier New", monospace',
|
||||||
|
},
|
||||||
|
styles: [
|
||||||
|
{
|
||||||
|
tag: [
|
||||||
|
t.keyword,
|
||||||
|
t.operatorKeyword,
|
||||||
|
t.modifier,
|
||||||
|
t.color,
|
||||||
|
t.constant(t.name),
|
||||||
|
t.standard(t.name),
|
||||||
|
t.standard(t.tagName),
|
||||||
|
t.special(t.brace),
|
||||||
|
t.atom,
|
||||||
|
t.bool,
|
||||||
|
t.special(t.variableName),
|
||||||
|
],
|
||||||
|
color: '#569cd6',
|
||||||
|
},
|
||||||
|
{ tag: [t.controlKeyword, t.moduleKeyword], color: '#c586c0' },
|
||||||
|
{
|
||||||
|
tag: [
|
||||||
|
t.name,
|
||||||
|
t.deleted,
|
||||||
|
t.character,
|
||||||
|
t.macroName,
|
||||||
|
t.propertyName,
|
||||||
|
t.variableName,
|
||||||
|
t.labelName,
|
||||||
|
t.definition(t.name),
|
||||||
|
],
|
||||||
|
color: '#9cdcfe',
|
||||||
|
},
|
||||||
|
{ tag: t.heading, fontWeight: 'bold', color: '#9cdcfe' },
|
||||||
|
{
|
||||||
|
tag: [t.typeName, t.className, t.tagName, t.number, t.changed, t.annotation, t.self, t.namespace],
|
||||||
|
color: '#4ec9b0',
|
||||||
|
},
|
||||||
|
{ tag: [t.function(t.variableName), t.function(t.propertyName)], color: '#dcdcaa' },
|
||||||
|
{ tag: [t.number], color: '#b5cea8' },
|
||||||
|
{ tag: [t.operator, t.punctuation, t.separator, t.url, t.escape, t.regexp], color: '#d4d4d4' },
|
||||||
|
{ tag: [t.regexp], color: '#d16969' },
|
||||||
|
{ tag: [t.special(t.string), t.processingInstruction, t.string, t.inserted], color: '#ce9178' },
|
||||||
|
{ tag: [t.angleBracket], color: '#808080' },
|
||||||
|
{ tag: t.strong, fontWeight: 'bold' },
|
||||||
|
{ tag: t.emphasis, fontStyle: 'italic' },
|
||||||
|
{ tag: t.strikethrough, textDecoration: 'line-through' },
|
||||||
|
{ tag: [t.meta, t.comment], color: '#6a9955' },
|
||||||
|
{ tag: t.link, color: '#6a9955', textDecoration: 'underline' },
|
||||||
|
{ tag: t.invalid, color: '#ff0000' },
|
||||||
|
],
|
||||||
|
});
|
||||||
+81
@@ -0,0 +1,81 @@
|
|||||||
|
import { tags as t } from '@lezer/highlight';
|
||||||
|
import { createTheme } from './theme-helper.mjs';
|
||||||
|
|
||||||
|
export const settings = {
|
||||||
|
background: '#ffffff',
|
||||||
|
lineBackground: '#ffffff50',
|
||||||
|
foreground: '#383a42',
|
||||||
|
caret: '#000',
|
||||||
|
selection: '#add6ff',
|
||||||
|
selectionMatch: '#a8ac94',
|
||||||
|
lineHighlight: '#99999926',
|
||||||
|
gutterBackground: '#fff',
|
||||||
|
gutterForeground: '#237893',
|
||||||
|
gutterActiveForeground: '#0b216f',
|
||||||
|
fontFamily: 'Menlo, Monaco, Consolas, "Andale Mono", "Ubuntu Mono", "Courier New", monospace',
|
||||||
|
};
|
||||||
|
|
||||||
|
export default createTheme({
|
||||||
|
theme: 'light',
|
||||||
|
settings: {
|
||||||
|
background: '#ffffff',
|
||||||
|
foreground: '#383a42',
|
||||||
|
caret: '#000',
|
||||||
|
selection: '#add6ff',
|
||||||
|
selectionMatch: '#a8ac94',
|
||||||
|
lineHighlight: '#99999926',
|
||||||
|
gutterBackground: '#fff',
|
||||||
|
gutterForeground: '#237893',
|
||||||
|
gutterActiveForeground: '#0b216f',
|
||||||
|
fontFamily: 'Menlo, Monaco, Consolas, "Andale Mono", "Ubuntu Mono", "Courier New", monospace',
|
||||||
|
},
|
||||||
|
styles: [
|
||||||
|
{
|
||||||
|
tag: [
|
||||||
|
t.keyword,
|
||||||
|
t.operatorKeyword,
|
||||||
|
t.modifier,
|
||||||
|
t.color,
|
||||||
|
t.constant(t.name),
|
||||||
|
t.standard(t.name),
|
||||||
|
t.standard(t.tagName),
|
||||||
|
t.special(t.brace),
|
||||||
|
t.atom,
|
||||||
|
t.bool,
|
||||||
|
t.special(t.variableName),
|
||||||
|
],
|
||||||
|
color: '#0000ff',
|
||||||
|
},
|
||||||
|
{ tag: [t.moduleKeyword, t.controlKeyword], color: '#af00db' },
|
||||||
|
{
|
||||||
|
tag: [
|
||||||
|
t.name,
|
||||||
|
t.deleted,
|
||||||
|
t.character,
|
||||||
|
t.macroName,
|
||||||
|
t.propertyName,
|
||||||
|
t.variableName,
|
||||||
|
t.labelName,
|
||||||
|
t.definition(t.name),
|
||||||
|
],
|
||||||
|
color: '#0070c1',
|
||||||
|
},
|
||||||
|
{ tag: t.heading, fontWeight: 'bold', color: '#0070c1' },
|
||||||
|
{
|
||||||
|
tag: [t.typeName, t.className, t.tagName, t.number, t.changed, t.annotation, t.self, t.namespace],
|
||||||
|
color: '#267f99',
|
||||||
|
},
|
||||||
|
{ tag: [t.function(t.variableName), t.function(t.propertyName)], color: '#795e26' },
|
||||||
|
{ tag: [t.number], color: '#098658' },
|
||||||
|
{ tag: [t.operator, t.punctuation, t.separator, t.url, t.escape, t.regexp], color: '#383a42' },
|
||||||
|
{ tag: [t.regexp], color: '#af00db' },
|
||||||
|
{ tag: [t.special(t.string), t.processingInstruction, t.string, t.inserted], color: '#a31515' },
|
||||||
|
{ tag: [t.angleBracket], color: '#383a42' },
|
||||||
|
{ tag: t.strong, fontWeight: 'bold' },
|
||||||
|
{ tag: t.emphasis, fontStyle: 'italic' },
|
||||||
|
{ tag: t.strikethrough, textDecoration: 'line-through' },
|
||||||
|
{ tag: [t.meta, t.comment], color: '#008000' },
|
||||||
|
{ tag: t.link, color: '#4078f2', textDecoration: 'underline' },
|
||||||
|
{ tag: t.invalid, color: '#e45649' },
|
||||||
|
],
|
||||||
|
});
|
||||||
+20
-19
@@ -1,5 +1,5 @@
|
|||||||
import { tags as t } from '@lezer/highlight';
|
import { tags as t } from '@lezer/highlight';
|
||||||
import { createTheme } from '@uiw/codemirror-themes';
|
import { createTheme } from './theme-helper.mjs';
|
||||||
export const settings = {
|
export const settings = {
|
||||||
background: 'white',
|
background: 'white',
|
||||||
foreground: 'black', // whats that?
|
foreground: 'black', // whats that?
|
||||||
@@ -16,23 +16,24 @@ export default createTheme({
|
|||||||
theme: 'light',
|
theme: 'light',
|
||||||
settings,
|
settings,
|
||||||
styles: [
|
styles: [
|
||||||
{ tag: t.keyword, color: 'black' },
|
{ tag: t.labelName, color: 'inherit' },
|
||||||
{ tag: t.operator, color: 'black' },
|
{ tag: t.keyword, color: 'inherit' },
|
||||||
{ tag: t.special(t.variableName), color: 'black' },
|
{ tag: t.operator, color: 'inherit' },
|
||||||
{ tag: t.typeName, color: 'black' },
|
{ tag: t.special(t.variableName), color: 'inherit' },
|
||||||
{ tag: t.atom, color: 'black' },
|
{ tag: t.typeName, color: 'inherit' },
|
||||||
{ tag: t.number, color: 'black' },
|
{ tag: t.atom, color: 'inherit' },
|
||||||
{ tag: t.definition(t.variableName), color: 'black' },
|
{ tag: t.number, color: 'inherit' },
|
||||||
{ tag: t.string, color: 'black' },
|
{ tag: t.definition(t.variableName), color: 'inherit' },
|
||||||
{ tag: t.special(t.string), color: 'black' },
|
{ tag: t.string, color: 'inherit' },
|
||||||
{ tag: t.comment, color: 'black' },
|
{ tag: t.special(t.string), color: 'inherit' },
|
||||||
{ tag: t.variableName, color: 'black' },
|
{ tag: t.comment, color: 'inherit' },
|
||||||
{ tag: t.tagName, color: 'black' },
|
{ tag: t.variableName, color: 'inherit' },
|
||||||
{ tag: t.bracket, color: 'black' },
|
{ tag: t.tagName, color: 'inherit' },
|
||||||
{ tag: t.meta, color: 'black' },
|
{ tag: t.bracket, color: 'inherit' },
|
||||||
{ tag: t.attributeName, color: 'black' },
|
{ tag: t.meta, color: 'inherit' },
|
||||||
{ tag: t.propertyName, color: 'black' },
|
{ tag: t.attributeName, color: 'inherit' },
|
||||||
{ tag: t.className, color: 'black' },
|
{ tag: t.propertyName, color: 'inherit' },
|
||||||
{ tag: t.invalid, color: 'black' },
|
{ tag: t.className, color: 'inherit' },
|
||||||
|
{ tag: t.invalid, color: 'inherit' },
|
||||||
],
|
],
|
||||||
});
|
});
|
||||||
|
|||||||
+34
@@ -0,0 +1,34 @@
|
|||||||
|
import { tags as t } from '@lezer/highlight';
|
||||||
|
import { createTheme } from './theme-helper.mjs';
|
||||||
|
|
||||||
|
export const settings = {
|
||||||
|
background: '#292A30',
|
||||||
|
lineBackground: '#292A3099',
|
||||||
|
foreground: '#CECFD0',
|
||||||
|
caret: '#fff',
|
||||||
|
selection: '#727377',
|
||||||
|
selectionMatch: '#727377',
|
||||||
|
lineHighlight: '#2F3239',
|
||||||
|
};
|
||||||
|
|
||||||
|
export default createTheme({
|
||||||
|
theme: 'dark',
|
||||||
|
settings: {
|
||||||
|
background: '#292A30',
|
||||||
|
foreground: '#CECFD0',
|
||||||
|
caret: '#fff',
|
||||||
|
selection: '#727377',
|
||||||
|
selectionMatch: '#727377',
|
||||||
|
lineHighlight: '#ffffff0f',
|
||||||
|
},
|
||||||
|
styles: [
|
||||||
|
{ tag: [t.comment, t.quote], color: '#7F8C98' },
|
||||||
|
{ tag: [t.keyword], color: '#FF7AB2', fontWeight: 'bold' },
|
||||||
|
{ tag: [t.string, t.meta], color: '#FF8170' },
|
||||||
|
{ tag: [t.typeName], color: '#DABAFF' },
|
||||||
|
{ tag: [t.definition(t.variableName)], color: '#6BDFFF' },
|
||||||
|
{ tag: [t.name], color: '#6BAA9F' },
|
||||||
|
{ tag: [t.variableName], color: '#ACF2E4' },
|
||||||
|
{ tag: [t.regexp, t.link], color: '#FF8170' },
|
||||||
|
],
|
||||||
|
});
|
||||||
+38
@@ -0,0 +1,38 @@
|
|||||||
|
import { tags as t } from '@lezer/highlight';
|
||||||
|
import { createTheme } from './theme-helper.mjs';
|
||||||
|
|
||||||
|
export const settings = {
|
||||||
|
light: true,
|
||||||
|
background: '#fff',
|
||||||
|
lineBackground: '#ffffff99',
|
||||||
|
foreground: '#3D3D3D',
|
||||||
|
selection: '#BBDFFF',
|
||||||
|
selectionMatch: '#BBDFFF',
|
||||||
|
gutterBackground: '#fff',
|
||||||
|
gutterForeground: '#AFAFAF',
|
||||||
|
lineHighlight: '#EDF4FF',
|
||||||
|
};
|
||||||
|
|
||||||
|
export default createTheme({
|
||||||
|
theme: 'light',
|
||||||
|
settings: {
|
||||||
|
background: '#fff',
|
||||||
|
foreground: '#3D3D3D',
|
||||||
|
selection: '#BBDFFF',
|
||||||
|
selectionMatch: '#BBDFFF',
|
||||||
|
gutterBackground: '#fff',
|
||||||
|
gutterForeground: '#AFAFAF',
|
||||||
|
lineHighlight: '#d5e6ff69',
|
||||||
|
},
|
||||||
|
styles: [
|
||||||
|
{ tag: [t.comment, t.quote], color: '#707F8D' },
|
||||||
|
{ tag: [t.typeName, t.typeOperator], color: '#aa0d91' },
|
||||||
|
{ tag: [t.keyword], color: '#aa0d91', fontWeight: 'bold' },
|
||||||
|
{ tag: [t.string, t.meta], color: '#D23423' },
|
||||||
|
{ tag: [t.name], color: '#032f62' },
|
||||||
|
{ tag: [t.typeName], color: '#522BB2' },
|
||||||
|
{ tag: [t.variableName], color: '#23575C' },
|
||||||
|
{ tag: [t.definition(t.variableName)], color: '#327A9E' },
|
||||||
|
{ tag: [t.regexp, t.link], color: '#0e0eff' },
|
||||||
|
],
|
||||||
|
});
|
||||||
@@ -8,8 +8,8 @@ export default defineConfig({
|
|||||||
build: {
|
build: {
|
||||||
lib: {
|
lib: {
|
||||||
entry: resolve(__dirname, 'index.mjs'),
|
entry: resolve(__dirname, 'index.mjs'),
|
||||||
formats: ['es', 'cjs'],
|
formats: ['es'],
|
||||||
fileName: (ext) => ({ es: 'index.mjs', cjs: 'index.js' })[ext],
|
fileName: (ext) => ({ es: 'index.mjs' })[ext],
|
||||||
},
|
},
|
||||||
rollupOptions: {
|
rollupOptions: {
|
||||||
external: [...Object.keys(dependencies)],
|
external: [...Object.keys(dependencies)],
|
||||||
|
|||||||
@@ -0,0 +1,142 @@
|
|||||||
|
import { StateEffect, StateField } from '@codemirror/state';
|
||||||
|
import { Decoration, EditorView, WidgetType } from '@codemirror/view';
|
||||||
|
import { getWidgetID, registerWidgetType } from '@strudel/transpiler';
|
||||||
|
import { Pattern } from '@strudel/core';
|
||||||
|
|
||||||
|
export const addWidget = StateEffect.define({
|
||||||
|
map: ({ from, to }, change) => {
|
||||||
|
return { from: change.mapPos(from), to: change.mapPos(to) };
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
export const updateWidgets = (view, widgets) => {
|
||||||
|
view.dispatch({ effects: addWidget.of(widgets) });
|
||||||
|
};
|
||||||
|
|
||||||
|
function getWidgets(widgetConfigs) {
|
||||||
|
return (
|
||||||
|
widgetConfigs
|
||||||
|
// codemirror throws an error if we don't sort
|
||||||
|
.sort((a, b) => a.to - b.to)
|
||||||
|
.map((widgetConfig) => {
|
||||||
|
return Decoration.widget({
|
||||||
|
widget: new BlockWidget(widgetConfig),
|
||||||
|
side: 0,
|
||||||
|
block: true,
|
||||||
|
}).range(widgetConfig.to);
|
||||||
|
})
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
const widgetField = StateField.define(
|
||||||
|
/* <DecorationSet> */ {
|
||||||
|
create() {
|
||||||
|
return Decoration.none;
|
||||||
|
},
|
||||||
|
update(widgets, tr) {
|
||||||
|
widgets = widgets.map(tr.changes);
|
||||||
|
for (let e of tr.effects) {
|
||||||
|
if (e.is(addWidget)) {
|
||||||
|
try {
|
||||||
|
widgets = widgets.update({
|
||||||
|
filter: () => false,
|
||||||
|
add: getWidgets(e.value),
|
||||||
|
});
|
||||||
|
} catch (error) {
|
||||||
|
console.log('err', error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return widgets;
|
||||||
|
},
|
||||||
|
provide: (f) => EditorView.decorations.from(f),
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
const widgetElements = {};
|
||||||
|
export function setWidget(id, el) {
|
||||||
|
widgetElements[id] = el;
|
||||||
|
el.id = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
export class BlockWidget extends WidgetType {
|
||||||
|
constructor(widgetConfig) {
|
||||||
|
super();
|
||||||
|
this.widgetConfig = widgetConfig;
|
||||||
|
}
|
||||||
|
eq() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
toDOM() {
|
||||||
|
const id = getWidgetID(this.widgetConfig);
|
||||||
|
const el = widgetElements[id];
|
||||||
|
return el;
|
||||||
|
}
|
||||||
|
ignoreEvent(e) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export const widgetPlugin = [widgetField];
|
||||||
|
|
||||||
|
// widget implementer API to create a new widget type
|
||||||
|
export function registerWidget(type, fn) {
|
||||||
|
registerWidgetType(type);
|
||||||
|
if (fn) {
|
||||||
|
Pattern.prototype[type] = function (id, options = { fold: 1 }) {
|
||||||
|
// fn is expected to create a dom element and call setWidget(id, el);
|
||||||
|
// fn should also return the pattern
|
||||||
|
return fn(id, options, this);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// wire up @strudel/draw functions
|
||||||
|
|
||||||
|
function getCanvasWidget(id, options = {}) {
|
||||||
|
const { width = 500, height = 60, pixelRatio = window.devicePixelRatio } = options;
|
||||||
|
let canvas = document.getElementById(id) || document.createElement('canvas');
|
||||||
|
canvas.width = width * pixelRatio;
|
||||||
|
canvas.height = height * pixelRatio;
|
||||||
|
canvas.style.width = width + 'px';
|
||||||
|
canvas.style.height = height + 'px';
|
||||||
|
setWidget(id, canvas);
|
||||||
|
return canvas;
|
||||||
|
}
|
||||||
|
|
||||||
|
registerWidget('_pianoroll', (id, options = {}, pat) => {
|
||||||
|
const ctx = getCanvasWidget(id, options).getContext('2d');
|
||||||
|
return pat.tag(id).pianoroll({ fold: 1, ...options, ctx, id });
|
||||||
|
});
|
||||||
|
|
||||||
|
registerWidget('_punchcard', (id, options = {}, pat) => {
|
||||||
|
const ctx = getCanvasWidget(id, options).getContext('2d');
|
||||||
|
return pat.tag(id).punchcard({ fold: 1, ...options, ctx, id });
|
||||||
|
});
|
||||||
|
|
||||||
|
registerWidget('_spiral', (id, options = {}, pat) => {
|
||||||
|
let _size = options.size || 275;
|
||||||
|
options = { width: _size, height: _size, ...options, size: _size / 5 };
|
||||||
|
const ctx = getCanvasWidget(id, options).getContext('2d');
|
||||||
|
return pat.tag(id).spiral({ ...options, ctx, id });
|
||||||
|
});
|
||||||
|
|
||||||
|
registerWidget('_scope', (id, options = {}, pat) => {
|
||||||
|
options = { width: 500, height: 60, pos: 0.5, scale: 1, ...options };
|
||||||
|
const ctx = getCanvasWidget(id, options).getContext('2d');
|
||||||
|
return pat.tag(id).scope({ ...options, ctx, id });
|
||||||
|
});
|
||||||
|
|
||||||
|
registerWidget('_pitchwheel', (id, options = {}, pat) => {
|
||||||
|
let _size = options.size || 200;
|
||||||
|
options = { width: _size, height: _size, ...options, size: _size / 5 };
|
||||||
|
const ctx = getCanvasWidget(id, options).getContext('2d');
|
||||||
|
return pat.pitchwheel({ ...options, ctx, id });
|
||||||
|
});
|
||||||
|
|
||||||
|
registerWidget('_spectrum', (id, options = {}, pat) => {
|
||||||
|
let _size = options.size || 200;
|
||||||
|
options = { width: _size, height: _size, ...options, size: _size / 5 };
|
||||||
|
const ctx = getCanvasWidget(id, options).getContext('2d');
|
||||||
|
return pat.spectrum({ ...options, ctx, id });
|
||||||
|
});
|
||||||
@@ -1,19 +1,17 @@
|
|||||||
# @strudel.cycles/core
|
# @strudel/core
|
||||||
|
|
||||||
**DEPRECATION NOTE**: This package is old and won't get any updates! The newer version goes by the name of [@strudel/core](https://www.npmjs.com/package/@strudel/core).
|
|
||||||
|
|
||||||
This package contains the bare essence of strudel.
|
This package contains the bare essence of strudel.
|
||||||
|
|
||||||
## Install
|
## Install
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
npm i @strudel.cycles/core --save
|
npm i @strudel/core --save
|
||||||
```
|
```
|
||||||
|
|
||||||
## Example
|
## Example
|
||||||
|
|
||||||
```js
|
```js
|
||||||
import { sequence } from '@strudel.cycles/core';
|
import { sequence } from '@strudel/core';
|
||||||
|
|
||||||
const pattern = sequence('a', ['b', 'c']);
|
const pattern = sequence('a', ['b', 'c']);
|
||||||
|
|
||||||
@@ -35,7 +33,7 @@ b: 3/2 - 7/4
|
|||||||
c: 7/4 - 2
|
c: 7/4 - 2
|
||||||
```
|
```
|
||||||
|
|
||||||
- [play with @strudel.cycles/core on codesandbox](https://codesandbox.io/s/strudel-core-test-forked-9ywhv7?file=/src/index.js).
|
- [play with @strudel/core on codesandbox](https://codesandbox.io/s/strudel-core-test-forked-9ywhv7?file=/src/index.js).
|
||||||
- [open color pattern example](https://raw.githack.com/tidalcycles/strudel/main/packages/core/examples/canvas.html)
|
- [open color pattern example](https://raw.githack.com/tidalcycles/strudel/main/packages/core/examples/canvas.html)
|
||||||
- [open minimal repl example](https://raw.githack.com/tidalcycles/strudel/main/packages/core/examples/vanilla.html)
|
- [open minimal repl example](https://raw.githack.com/tidalcycles/strudel/main/packages/core/examples/vanilla.html)
|
||||||
- [open minimal vite example](./examples/vite-vanilla-repl/)
|
- [open minimal vite example](./examples/vite-vanilla-repl/)
|
||||||
@@ -0,0 +1,46 @@
|
|||||||
|
import { describe, bench } from 'vitest';
|
||||||
|
|
||||||
|
import { calculateTactus, sequence, stack } from '../index.mjs';
|
||||||
|
|
||||||
|
const pat64 = sequence(...Array(64).keys());
|
||||||
|
|
||||||
|
describe('steps', () => {
|
||||||
|
calculateTactus(true);
|
||||||
|
bench(
|
||||||
|
'+tactus',
|
||||||
|
() => {
|
||||||
|
pat64.iter(64).fast(64).firstCycle();
|
||||||
|
},
|
||||||
|
{ time: 1000 },
|
||||||
|
);
|
||||||
|
|
||||||
|
calculateTactus(false);
|
||||||
|
bench(
|
||||||
|
'-tactus',
|
||||||
|
() => {
|
||||||
|
pat64.iter(64).fast(64).firstCycle();
|
||||||
|
},
|
||||||
|
{ time: 1000 },
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('stack', () => {
|
||||||
|
calculateTactus(true);
|
||||||
|
bench(
|
||||||
|
'+tactus',
|
||||||
|
() => {
|
||||||
|
stack(pat64, pat64, pat64, pat64, pat64, pat64, pat64, pat64).fast(64).firstCycle();
|
||||||
|
},
|
||||||
|
{ time: 1000 },
|
||||||
|
);
|
||||||
|
|
||||||
|
calculateTactus(false);
|
||||||
|
bench(
|
||||||
|
'-tactus',
|
||||||
|
() => {
|
||||||
|
stack(pat64, pat64, pat64, pat64, pat64, pat64, pat64, pat64).fast(64).firstCycle();
|
||||||
|
},
|
||||||
|
{ time: 1000 },
|
||||||
|
);
|
||||||
|
});
|
||||||
|
calculateTactus(true);
|
||||||
@@ -0,0 +1,161 @@
|
|||||||
|
// eslint-disable-next-line no-undef
|
||||||
|
// TODO: swap below line with above one when firefox supports esm imports in service workers
|
||||||
|
// see https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorker?retiredLocale=de#browser_compatibility
|
||||||
|
// import createClock from './zyklus.mjs';
|
||||||
|
|
||||||
|
function getTime() {
|
||||||
|
const seconds = performance.now() * 0.001;
|
||||||
|
return seconds;
|
||||||
|
// return Math.round(seconds * precision) / precision;
|
||||||
|
}
|
||||||
|
|
||||||
|
let num_cycles_at_cps_change = 0;
|
||||||
|
let num_ticks_since_cps_change = 0;
|
||||||
|
let num_seconds_at_cps_change = 0;
|
||||||
|
let cps = 0.5;
|
||||||
|
// {id: {started: boolean}}
|
||||||
|
const clients = new Map();
|
||||||
|
const duration = 0.1;
|
||||||
|
const channel = new BroadcastChannel('strudeltick');
|
||||||
|
|
||||||
|
const sendMessage = (type, payload) => {
|
||||||
|
channel.postMessage({ type, payload });
|
||||||
|
};
|
||||||
|
|
||||||
|
const sendTick = (phase, duration, tick, time) => {
|
||||||
|
const num_seconds_since_cps_change = num_ticks_since_cps_change * duration;
|
||||||
|
const tickdeadline = phase - time;
|
||||||
|
const lastTick = time + tickdeadline;
|
||||||
|
const num_cycles_since_cps_change = num_seconds_since_cps_change * cps;
|
||||||
|
const begin = num_cycles_at_cps_change + num_cycles_since_cps_change;
|
||||||
|
const secondsSinceLastTick = time - lastTick - duration;
|
||||||
|
const eventLength = duration * cps;
|
||||||
|
const end = begin + eventLength;
|
||||||
|
const cycle = begin + secondsSinceLastTick * cps;
|
||||||
|
|
||||||
|
sendMessage('tick', {
|
||||||
|
begin,
|
||||||
|
end,
|
||||||
|
cps,
|
||||||
|
time,
|
||||||
|
cycle,
|
||||||
|
});
|
||||||
|
num_ticks_since_cps_change++;
|
||||||
|
};
|
||||||
|
|
||||||
|
//create clock method from zyklus
|
||||||
|
const clock = createClock(getTime, sendTick, duration);
|
||||||
|
let started = false;
|
||||||
|
|
||||||
|
const startClock = (id) => {
|
||||||
|
clients.set(id, { started: true });
|
||||||
|
if (started) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
clock.start();
|
||||||
|
started = true;
|
||||||
|
};
|
||||||
|
const stopClock = async (id) => {
|
||||||
|
clients.set(id, { started: false });
|
||||||
|
|
||||||
|
const otherClientStarted = Array.from(clients.values()).some((c) => c.started);
|
||||||
|
//dont stop the clock if other instances are running...
|
||||||
|
if (!started || otherClientStarted) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
clock.stop();
|
||||||
|
setCycle(0);
|
||||||
|
started = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
const setCycle = (cycle) => {
|
||||||
|
num_ticks_since_cps_change = 0;
|
||||||
|
num_cycles_at_cps_change = cycle;
|
||||||
|
};
|
||||||
|
|
||||||
|
const processMessage = (message) => {
|
||||||
|
const { type, payload } = message;
|
||||||
|
|
||||||
|
switch (type) {
|
||||||
|
case 'cpschange': {
|
||||||
|
if (payload.cps !== cps) {
|
||||||
|
const num_seconds_since_cps_change = num_ticks_since_cps_change * duration;
|
||||||
|
num_cycles_at_cps_change = num_cycles_at_cps_change + num_seconds_since_cps_change * cps;
|
||||||
|
num_seconds_at_cps_change = num_seconds_at_cps_change + num_seconds_since_cps_change;
|
||||||
|
cps = payload.cps;
|
||||||
|
num_ticks_since_cps_change = 0;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 'setcycle': {
|
||||||
|
setCycle(payload.cycle);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 'toggle': {
|
||||||
|
if (payload.started) {
|
||||||
|
startClock(message.id);
|
||||||
|
} else {
|
||||||
|
stopClock(message.id);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
self.onconnect = function (e) {
|
||||||
|
// the incoming port
|
||||||
|
const port = e.ports[0];
|
||||||
|
|
||||||
|
port.addEventListener('message', function (e) {
|
||||||
|
processMessage(e.data);
|
||||||
|
});
|
||||||
|
port.start(); // Required when using addEventListener. Otherwise called implicitly by onmessage setter.
|
||||||
|
};
|
||||||
|
|
||||||
|
// used to consistently schedule events, for use in a service worker - see <https://github.com/tidalcycles/strudel/blob/main/packages/core/clockworker.mjs>
|
||||||
|
function createClock(
|
||||||
|
getTime,
|
||||||
|
callback, // called slightly before each cycle
|
||||||
|
duration = 0.05, // duration of each cycle
|
||||||
|
interval = 0.1, // interval between callbacks
|
||||||
|
overlap = 0.1, // overlap between callbacks
|
||||||
|
) {
|
||||||
|
let tick = 0; // counts callbacks
|
||||||
|
let phase = 0; // next callback time
|
||||||
|
let precision = 10 ** 4; // used to round phase
|
||||||
|
let minLatency = 0.01;
|
||||||
|
const setDuration = (setter) => (duration = setter(duration));
|
||||||
|
overlap = overlap || interval / 2;
|
||||||
|
const onTick = () => {
|
||||||
|
const t = getTime();
|
||||||
|
const lookahead = t + interval + overlap; // the time window for this tick
|
||||||
|
if (phase === 0) {
|
||||||
|
phase = t + minLatency;
|
||||||
|
}
|
||||||
|
// callback as long as we're inside the lookahead
|
||||||
|
while (phase < lookahead) {
|
||||||
|
phase = Math.round(phase * precision) / precision;
|
||||||
|
phase >= t && callback(phase, duration, tick, t);
|
||||||
|
phase < t && console.log('TOO LATE', phase); // what if latency is added from outside?
|
||||||
|
phase += duration; // increment phase by duration
|
||||||
|
tick++;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
let intervalID;
|
||||||
|
const start = () => {
|
||||||
|
clear(); // just in case start was called more than once
|
||||||
|
onTick();
|
||||||
|
intervalID = setInterval(onTick, interval * 1000);
|
||||||
|
};
|
||||||
|
const clear = () => intervalID !== undefined && clearInterval(intervalID);
|
||||||
|
const pause = () => clear();
|
||||||
|
const stop = () => {
|
||||||
|
tick = 0;
|
||||||
|
phase = 0;
|
||||||
|
clear();
|
||||||
|
};
|
||||||
|
const getPhase = () => phase;
|
||||||
|
// setCallback
|
||||||
|
return { setDuration, start, stop, pause, duration, interval, getPhase, minLatency };
|
||||||
|
}
|
||||||
+530
-374
File diff suppressed because it is too large
Load Diff
+55
-26
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
cyclist.mjs - <short description TODO>
|
cyclist.mjs - event scheduler for a single strudel instance. for multi-instance scheduler, see - see <https://github.com/tidalcycles/strudel/blob/main/packages/core/neocyclist.mjs>
|
||||||
Copyright (C) 2022 Strudel contributors - see <https://github.com/tidalcycles/strudel/blob/main/packages/core/cyclist.mjs>
|
Copyright (C) 2022 Strudel contributors - see <https://github.com/tidalcycles/strudel/blob/main/packages/core/cyclist.mjs>
|
||||||
This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
|
This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
@@ -8,49 +8,70 @@ import createClock from './zyklus.mjs';
|
|||||||
import { logger } from './logger.mjs';
|
import { logger } from './logger.mjs';
|
||||||
|
|
||||||
export class Cyclist {
|
export class Cyclist {
|
||||||
constructor({ interval, onTrigger, onToggle, onError, getTime, latency = 0.1 }) {
|
constructor({
|
||||||
|
interval,
|
||||||
|
onTrigger,
|
||||||
|
onToggle,
|
||||||
|
onError,
|
||||||
|
getTime,
|
||||||
|
latency = 0.1,
|
||||||
|
setInterval,
|
||||||
|
clearInterval,
|
||||||
|
beforeStart,
|
||||||
|
}) {
|
||||||
this.started = false;
|
this.started = false;
|
||||||
this.cps = 1;
|
this.beforeStart = beforeStart;
|
||||||
|
this.cps = 0.5;
|
||||||
this.num_ticks_since_cps_change = 0;
|
this.num_ticks_since_cps_change = 0;
|
||||||
this.lastTick = 0; // absolute time when last tick (clock callback) happened
|
this.lastTick = 0; // absolute time when last tick (clock callback) happened
|
||||||
this.lastBegin = 0; // query begin of last tick
|
this.lastBegin = 0; // query begin of last tick
|
||||||
this.lastEnd = 0; // query end of last tick
|
this.lastEnd = 0; // query end of last tick
|
||||||
this.getTime = getTime; // get absolute time
|
this.getTime = getTime; // get absolute time
|
||||||
this.num_cycles_since_last_cps_change = 0;
|
this.num_cycles_at_cps_change = 0;
|
||||||
|
this.seconds_at_cps_change; // clock phase when cps was changed
|
||||||
this.onToggle = onToggle;
|
this.onToggle = onToggle;
|
||||||
this.latency = latency; // fixed trigger time offset
|
this.latency = latency; // fixed trigger time offset
|
||||||
this.clock = createClock(
|
this.clock = createClock(
|
||||||
getTime,
|
getTime,
|
||||||
// called slightly before each cycle
|
// called slightly before each cycle
|
||||||
(phase, duration, tick) => {
|
(phase, duration, _, t) => {
|
||||||
if (tick === 0) {
|
|
||||||
this.origin = phase;
|
|
||||||
}
|
|
||||||
if (this.num_ticks_since_cps_change === 0) {
|
if (this.num_ticks_since_cps_change === 0) {
|
||||||
this.num_cycles_since_last_cps_change = this.lastEnd;
|
this.num_cycles_at_cps_change = this.lastEnd;
|
||||||
|
this.seconds_at_cps_change = phase;
|
||||||
}
|
}
|
||||||
this.num_ticks_since_cps_change++;
|
this.num_ticks_since_cps_change++;
|
||||||
|
const seconds_since_cps_change = this.num_ticks_since_cps_change * duration;
|
||||||
|
const num_cycles_since_cps_change = seconds_since_cps_change * this.cps;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const time = getTime();
|
|
||||||
const begin = this.lastEnd;
|
const begin = this.lastEnd;
|
||||||
this.lastBegin = begin;
|
this.lastBegin = begin;
|
||||||
|
const end = this.num_cycles_at_cps_change + num_cycles_since_cps_change;
|
||||||
//convert ticks to cycles, so you can query the pattern for events
|
|
||||||
const eventLength = duration * this.cps;
|
|
||||||
const end = this.num_cycles_since_last_cps_change + this.num_ticks_since_cps_change * eventLength;
|
|
||||||
this.lastEnd = end;
|
this.lastEnd = end;
|
||||||
|
this.lastTick = phase;
|
||||||
|
|
||||||
|
if (phase < t) {
|
||||||
|
// avoid querying haps that are in the past anyway
|
||||||
|
console.log(`skip query: too late`);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// query the pattern for events
|
// query the pattern for events
|
||||||
const haps = this.pattern.queryArc(begin, end);
|
const haps = this.pattern.queryArc(begin, end, { _cps: this.cps });
|
||||||
|
|
||||||
const tickdeadline = phase - time; // time left until the phase is a whole number
|
|
||||||
this.lastTick = time + tickdeadline;
|
|
||||||
|
|
||||||
haps.forEach((hap) => {
|
haps.forEach((hap) => {
|
||||||
if (hap.part.begin.equals(hap.whole.begin)) {
|
if (hap.hasOnset()) {
|
||||||
const deadline = (hap.whole.begin - begin) / this.cps + tickdeadline + latency;
|
const targetTime =
|
||||||
|
(hap.whole.begin - this.num_cycles_at_cps_change) / this.cps + this.seconds_at_cps_change + latency;
|
||||||
const duration = hap.duration / this.cps;
|
const duration = hap.duration / this.cps;
|
||||||
onTrigger?.(hap, deadline, duration, this.cps);
|
// the following line is dumb and only here for backwards compatibility
|
||||||
|
// see https://github.com/tidalcycles/strudel/pull/1004
|
||||||
|
const deadline = targetTime - phase;
|
||||||
|
onTrigger?.(hap, deadline, duration, this.cps, targetTime);
|
||||||
|
if (hap.value.cps !== undefined && this.cps != hap.value.cps) {
|
||||||
|
this.cps = hap.value.cps;
|
||||||
|
this.num_ticks_since_cps_change = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
@@ -59,9 +80,16 @@ export class Cyclist {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
interval, // duration of each cycle
|
interval, // duration of each cycle
|
||||||
|
0.1,
|
||||||
|
0.1,
|
||||||
|
setInterval,
|
||||||
|
clearInterval,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
now() {
|
now() {
|
||||||
|
if (!this.started) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
const secondsSinceLastTick = this.getTime() - this.lastTick - this.clock.duration;
|
const secondsSinceLastTick = this.getTime() - this.lastTick - this.clock.duration;
|
||||||
return this.lastBegin + secondsSinceLastTick * this.cps; // + this.clock.minLatency;
|
return this.lastBegin + secondsSinceLastTick * this.cps; // + this.clock.minLatency;
|
||||||
}
|
}
|
||||||
@@ -69,9 +97,10 @@ export class Cyclist {
|
|||||||
this.started = v;
|
this.started = v;
|
||||||
this.onToggle?.(v);
|
this.onToggle?.(v);
|
||||||
}
|
}
|
||||||
start() {
|
async start() {
|
||||||
|
await this.beforeStart?.();
|
||||||
this.num_ticks_since_cps_change = 0;
|
this.num_ticks_since_cps_change = 0;
|
||||||
this.num_cycles_since_last_cps_change = 0;
|
this.num_cycles_at_cps_change = 0;
|
||||||
if (!this.pattern) {
|
if (!this.pattern) {
|
||||||
throw new Error('Scheduler: no pattern set! call .setPattern first.');
|
throw new Error('Scheduler: no pattern set! call .setPattern first.');
|
||||||
}
|
}
|
||||||
@@ -90,13 +119,13 @@ export class Cyclist {
|
|||||||
this.lastEnd = 0;
|
this.lastEnd = 0;
|
||||||
this.setStarted(false);
|
this.setStarted(false);
|
||||||
}
|
}
|
||||||
setPattern(pat, autostart = false) {
|
async setPattern(pat, autostart = false) {
|
||||||
this.pattern = pat;
|
this.pattern = pat;
|
||||||
if (autostart && !this.started) {
|
if (autostart && !this.started) {
|
||||||
this.start();
|
await this.start();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
setCps(cps = 1) {
|
setCps(cps = 0.5) {
|
||||||
if (this.cps === cps) {
|
if (this.cps === cps) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -41,11 +41,17 @@ const _bjork = function (n, x) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
export const bjork = function (ons, steps) {
|
export const bjork = function (ons, steps) {
|
||||||
|
const inverted = ons < 0;
|
||||||
|
ons = Math.abs(ons);
|
||||||
const offs = steps - ons;
|
const offs = steps - ons;
|
||||||
const x = Array(ons).fill([1]);
|
const x = Array(ons).fill([1]);
|
||||||
const y = Array(offs).fill([0]);
|
const y = Array(offs).fill([0]);
|
||||||
const result = _bjork([ons, offs], [x, y]);
|
const result = _bjork([ons, offs], [x, y]);
|
||||||
return flatten(result[1][0]).concat(flatten(result[1][1]));
|
const p = flatten(result[1][0]).concat(flatten(result[1][1]));
|
||||||
|
if (inverted) {
|
||||||
|
return p.map((x) => (x === 0 ? 1 : 0));
|
||||||
|
}
|
||||||
|
return p;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -148,7 +154,7 @@ export const { euclidrot, euclidRot } = register(['euclidrot', 'euclidRot'], fun
|
|||||||
* @param {number} pulses the number of onsets / beats
|
* @param {number} pulses the number of onsets / beats
|
||||||
* @param {number} steps the number of steps to fill
|
* @param {number} steps the number of steps to fill
|
||||||
* @example
|
* @example
|
||||||
* n("g2").decay(.1).sustain(.3).euclidLegato(3,8)
|
* note("c3").euclidLegato(3,8)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
const _euclidLegato = function (pulses, steps, rotation, pat) {
|
const _euclidLegato = function (pulses, steps, rotation, pat) {
|
||||||
|
|||||||
@@ -4,8 +4,6 @@ Copyright (C) 2022 Strudel contributors - see <https://github.com/tidalcycles/st
|
|||||||
This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
|
This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import { isPattern } from './index.mjs';
|
|
||||||
|
|
||||||
export const evalScope = async (...args) => {
|
export const evalScope = async (...args) => {
|
||||||
const results = await Promise.allSettled(args);
|
const results = await Promise.allSettled(args);
|
||||||
const modules = results.filter((result) => result.status === 'fulfilled').map((r) => r.value);
|
const modules = results.filter((result) => result.status === 'fulfilled').map((r) => r.value);
|
||||||
@@ -22,6 +20,7 @@ export const evalScope = async (...args) => {
|
|||||||
globalThis[name] = value;
|
globalThis[name] = value;
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
return modules;
|
||||||
};
|
};
|
||||||
|
|
||||||
function safeEval(str, options = {}) {
|
function safeEval(str, options = {}) {
|
||||||
@@ -36,11 +35,12 @@ function safeEval(str, options = {}) {
|
|||||||
return Function(body)();
|
return Function(body)();
|
||||||
}
|
}
|
||||||
|
|
||||||
export const evaluate = async (code, transpiler) => {
|
export const evaluate = async (code, transpiler, transpilerOptions) => {
|
||||||
let meta = {};
|
let meta = {};
|
||||||
|
|
||||||
if (transpiler) {
|
if (transpiler) {
|
||||||
// transform syntactically correct js code to semantically usable code
|
// transform syntactically correct js code to semantically usable code
|
||||||
const transpiled = transpiler(code);
|
const transpiled = transpiler(code, transpilerOptions);
|
||||||
code = transpiled.output;
|
code = transpiled.output;
|
||||||
meta = transpiled;
|
meta = transpiled;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ This program is free software: you can redistribute it and/or modify it under th
|
|||||||
|
|
||||||
import Fraction from 'fraction.js';
|
import Fraction from 'fraction.js';
|
||||||
import { TimeSpan } from './timespan.mjs';
|
import { TimeSpan } from './timespan.mjs';
|
||||||
|
import { removeUndefineds } from './util.mjs';
|
||||||
|
|
||||||
// Returns the start of the cycle.
|
// Returns the start of the cycle.
|
||||||
Fraction.prototype.sam = function () {
|
Fraction.prototype.sam = function () {
|
||||||
@@ -47,14 +48,39 @@ Fraction.prototype.eq = function (other) {
|
|||||||
return this.compare(other) == 0;
|
return this.compare(other) == 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Fraction.prototype.ne = function (other) {
|
||||||
|
return this.compare(other) != 0;
|
||||||
|
};
|
||||||
|
|
||||||
Fraction.prototype.max = function (other) {
|
Fraction.prototype.max = function (other) {
|
||||||
return this.gt(other) ? this : other;
|
return this.gt(other) ? this : other;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Fraction.prototype.maximum = function (...others) {
|
||||||
|
others = others.map((x) => new Fraction(x));
|
||||||
|
return others.reduce((max, other) => other.max(max), this);
|
||||||
|
};
|
||||||
|
|
||||||
Fraction.prototype.min = function (other) {
|
Fraction.prototype.min = function (other) {
|
||||||
return this.lt(other) ? this : other;
|
return this.lt(other) ? this : other;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Fraction.prototype.mulmaybe = function (other) {
|
||||||
|
return other !== undefined ? this.mul(other) : undefined;
|
||||||
|
};
|
||||||
|
|
||||||
|
Fraction.prototype.divmaybe = function (other) {
|
||||||
|
return other !== undefined ? this.div(other) : undefined;
|
||||||
|
};
|
||||||
|
|
||||||
|
Fraction.prototype.addmaybe = function (other) {
|
||||||
|
return other !== undefined ? this.add(other) : undefined;
|
||||||
|
};
|
||||||
|
|
||||||
|
Fraction.prototype.submaybe = function (other) {
|
||||||
|
return other !== undefined ? this.sub(other) : undefined;
|
||||||
|
};
|
||||||
|
|
||||||
Fraction.prototype.show = function (/* excludeWhole = false */) {
|
Fraction.prototype.show = function (/* excludeWhole = false */) {
|
||||||
// return this.toFraction(excludeWhole);
|
// return this.toFraction(excludeWhole);
|
||||||
return this.s * this.n + '/' + this.d;
|
return this.s * this.n + '/' + this.d;
|
||||||
@@ -80,9 +106,26 @@ const fraction = (n) => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
export const gcd = (...fractions) => {
|
export const gcd = (...fractions) => {
|
||||||
|
fractions = removeUndefineds(fractions);
|
||||||
|
if (fractions.length === 0) {
|
||||||
|
return undefined;
|
||||||
|
}
|
||||||
|
|
||||||
return fractions.reduce((gcd, fraction) => gcd.gcd(fraction), fraction(1));
|
return fractions.reduce((gcd, fraction) => gcd.gcd(fraction), fraction(1));
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export const lcm = (...fractions) => {
|
||||||
|
fractions = removeUndefineds(fractions);
|
||||||
|
if (fractions.length === 0) {
|
||||||
|
return undefined;
|
||||||
|
}
|
||||||
|
const x = fractions.pop();
|
||||||
|
return fractions.reduce(
|
||||||
|
(lcm, fraction) => (lcm === undefined || fraction === undefined ? undefined : lcm.lcm(fraction)),
|
||||||
|
x,
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
fraction._original = Fraction;
|
fraction._original = Fraction;
|
||||||
|
|
||||||
export default fraction;
|
export default fraction;
|
||||||
|
|||||||
+36
-1
@@ -3,6 +3,7 @@ hap.mjs - <short description TODO>
|
|||||||
Copyright (C) 2022 Strudel contributors - see <https://github.com/tidalcycles/strudel/blob/main/packages/core/hap.mjs>
|
Copyright (C) 2022 Strudel contributors - see <https://github.com/tidalcycles/strudel/blob/main/packages/core/hap.mjs>
|
||||||
This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
|
This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
import Fraction from './fraction.mjs';
|
||||||
|
|
||||||
export class Hap {
|
export class Hap {
|
||||||
/*
|
/*
|
||||||
@@ -32,13 +33,43 @@ export class Hap {
|
|||||||
}
|
}
|
||||||
|
|
||||||
get duration() {
|
get duration() {
|
||||||
return this.whole.end.sub(this.whole.begin).mul(typeof this.value?.clip === 'number' ? this.value?.clip : 1);
|
let duration;
|
||||||
|
if (typeof this.value?.duration === 'number') {
|
||||||
|
duration = Fraction(this.value.duration);
|
||||||
|
} else {
|
||||||
|
duration = this.whole.end.sub(this.whole.begin);
|
||||||
|
}
|
||||||
|
if (typeof this.value?.clip === 'number') {
|
||||||
|
return duration.mul(this.value.clip);
|
||||||
|
}
|
||||||
|
return duration;
|
||||||
}
|
}
|
||||||
|
|
||||||
get endClipped() {
|
get endClipped() {
|
||||||
return this.whole.begin.add(this.duration);
|
return this.whole.begin.add(this.duration);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
isActive(currentTime) {
|
||||||
|
return this.whole.begin <= currentTime && this.endClipped >= currentTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
isInPast(currentTime) {
|
||||||
|
return currentTime > this.endClipped;
|
||||||
|
}
|
||||||
|
isInNearPast(margin, currentTime) {
|
||||||
|
return currentTime - margin <= this.endClipped;
|
||||||
|
}
|
||||||
|
|
||||||
|
isInFuture(currentTime) {
|
||||||
|
return currentTime < this.whole.begin;
|
||||||
|
}
|
||||||
|
isInNearFuture(margin, currentTime) {
|
||||||
|
return currentTime < this.whole.begin && currentTime > this.whole.begin - margin;
|
||||||
|
}
|
||||||
|
isWithinTime(min, max) {
|
||||||
|
return this.whole.begin <= max && this.endClipped >= min;
|
||||||
|
}
|
||||||
|
|
||||||
wholeOrPart() {
|
wholeOrPart() {
|
||||||
return this.whole ? this.whole : this.part;
|
return this.whole ? this.whole : this.part;
|
||||||
}
|
}
|
||||||
@@ -60,6 +91,10 @@ export class Hap {
|
|||||||
return this.whole != undefined && this.whole.begin.equals(this.part.begin);
|
return this.whole != undefined && this.whole.begin.equals(this.part.begin);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
hasTag(tag) {
|
||||||
|
return this.context.tags?.includes(tag);
|
||||||
|
}
|
||||||
|
|
||||||
resolveState(state) {
|
resolveState(state) {
|
||||||
if (this.stateful && this.hasOnset()) {
|
if (this.stateful && this.hasOnset()) {
|
||||||
console.log('stateful');
|
console.log('stateful');
|
||||||
|
|||||||
@@ -4,14 +4,17 @@ Copyright (C) 2022 Strudel contributors - see <https://github.com/tidalcycles/st
|
|||||||
This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
|
This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import controls from './controls.mjs';
|
import * as controls from './controls.mjs'; // legacy
|
||||||
export * from './euclid.mjs';
|
export * from './euclid.mjs';
|
||||||
import Fraction from './fraction.mjs';
|
import Fraction from './fraction.mjs';
|
||||||
|
import createClock from './zyklus.mjs';
|
||||||
import { logger } from './logger.mjs';
|
import { logger } from './logger.mjs';
|
||||||
export { Fraction, controls };
|
export { Fraction, controls, createClock };
|
||||||
|
export * from './controls.mjs';
|
||||||
export * from './hap.mjs';
|
export * from './hap.mjs';
|
||||||
export * from './pattern.mjs';
|
export * from './pattern.mjs';
|
||||||
export * from './signal.mjs';
|
export * from './signal.mjs';
|
||||||
|
export * from './pick.mjs';
|
||||||
export * from './state.mjs';
|
export * from './state.mjs';
|
||||||
export * from './timespan.mjs';
|
export * from './timespan.mjs';
|
||||||
export * from './util.mjs';
|
export * from './util.mjs';
|
||||||
@@ -21,21 +24,17 @@ export * from './repl.mjs';
|
|||||||
export * from './cyclist.mjs';
|
export * from './cyclist.mjs';
|
||||||
export * from './logger.mjs';
|
export * from './logger.mjs';
|
||||||
export * from './time.mjs';
|
export * from './time.mjs';
|
||||||
export * from './draw.mjs';
|
|
||||||
export * from './animate.mjs';
|
|
||||||
export * from './pianoroll.mjs';
|
|
||||||
export * from './spiral.mjs';
|
|
||||||
export * from './ui.mjs';
|
export * from './ui.mjs';
|
||||||
export { default as drawLine } from './drawLine.mjs';
|
export { default as drawLine } from './drawLine.mjs';
|
||||||
// below won't work with runtime.mjs (json import fails)
|
// below won't work with runtime.mjs (json import fails)
|
||||||
/* import * as p from './package.json';
|
/* import * as p from './package.json';
|
||||||
export const version = p.version; */
|
export const version = p.version; */
|
||||||
logger('🌀 @strudel.cycles/core loaded 🌀');
|
logger('🌀 @strudel/core loaded 🌀');
|
||||||
if (globalThis._strudelLoaded) {
|
if (globalThis._strudelLoaded) {
|
||||||
console.warn(
|
console.warn(
|
||||||
`@strudel.cycles/core was loaded more than once...
|
`@strudel/core was loaded more than once...
|
||||||
This might happen when you have multiple versions of strudel installed.
|
This might happen when you have multiple versions of strudel installed.
|
||||||
Please check with "npm ls @strudel.cycles/core".`,
|
Please check with "npm ls @strudel/core".`,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
globalThis._strudelLoaded = true;
|
globalThis._strudelLoaded = true;
|
||||||
|
|||||||
@@ -1,6 +1,16 @@
|
|||||||
export const logKey = 'strudel.log';
|
export const logKey = 'strudel.log';
|
||||||
|
|
||||||
|
let debounce = 1000,
|
||||||
|
lastMessage,
|
||||||
|
lastTime;
|
||||||
|
|
||||||
export function logger(message, type, data = {}) {
|
export function logger(message, type, data = {}) {
|
||||||
|
let t = performance.now();
|
||||||
|
if (lastMessage === message && t - lastTime < debounce) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
lastMessage = message;
|
||||||
|
lastTime = t;
|
||||||
console.log(`%c${message}`, 'background-color: black;color:white;border-radius:15px');
|
console.log(`%c${message}`, 'background-color: black;color:white;border-radius:15px');
|
||||||
if (typeof document !== 'undefined' && typeof CustomEvent !== 'undefined') {
|
if (typeof document !== 'undefined' && typeof CustomEvent !== 'undefined') {
|
||||||
document.dispatchEvent(
|
document.dispatchEvent(
|
||||||
|
|||||||
@@ -0,0 +1,107 @@
|
|||||||
|
/*
|
||||||
|
neocyclist.mjs - event scheduler like cyclist, except recieves clock pulses from clockworker in order to sync across multiple instances.
|
||||||
|
Copyright (C) 2022 Strudel contributors - see <https://github.com/tidalcycles/strudel/blob/main/packages/core/neocyclist.mjs>
|
||||||
|
This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { logger } from './logger.mjs';
|
||||||
|
import { ClockCollator, cycleToSeconds } from './util.mjs';
|
||||||
|
|
||||||
|
export class NeoCyclist {
|
||||||
|
constructor({ onTrigger, onToggle, getTime }) {
|
||||||
|
this.started = false;
|
||||||
|
this.cps = 0.5;
|
||||||
|
this.lastTick = 0; // absolute time when last tick (clock callback) happened
|
||||||
|
this.getTime = getTime; // get absolute time
|
||||||
|
this.time_at_last_tick_message = 0;
|
||||||
|
// the clock of the worker and the audio context clock can drift apart over time
|
||||||
|
// aditionally, the message time of the worker pinging the callback to process haps can be inconsistent.
|
||||||
|
// we need to keep a rolling average of the time difference between the worker clock and audio context clock
|
||||||
|
// in order to schedule events consistently.
|
||||||
|
this.collator = new ClockCollator({ getTargetClockTime: getTime });
|
||||||
|
this.onToggle = onToggle;
|
||||||
|
this.latency = 0.1; // fixed trigger time offset
|
||||||
|
this.cycle = 0;
|
||||||
|
this.id = Math.round(Date.now() * Math.random());
|
||||||
|
this.worker = new SharedWorker(new URL('./clockworker.js', import.meta.url));
|
||||||
|
this.worker.port.start();
|
||||||
|
this.channel = new BroadcastChannel('strudeltick');
|
||||||
|
const tickCallback = (payload) => {
|
||||||
|
const { cps, begin, end, cycle, time } = payload;
|
||||||
|
this.cps = cps;
|
||||||
|
this.cycle = cycle;
|
||||||
|
const currentTime = this.collator.calculateOffset(time) + time;
|
||||||
|
processHaps(begin, end, currentTime);
|
||||||
|
this.time_at_last_tick_message = currentTime;
|
||||||
|
};
|
||||||
|
|
||||||
|
const processHaps = (begin, end, currentTime) => {
|
||||||
|
if (this.started === false) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const haps = this.pattern.queryArc(begin, end, { _cps: this.cps });
|
||||||
|
haps.forEach((hap) => {
|
||||||
|
if (hap.hasOnset()) {
|
||||||
|
const timeUntilTrigger = cycleToSeconds(hap.whole.begin - this.cycle, this.cps);
|
||||||
|
const targetTime = timeUntilTrigger + currentTime + this.latency;
|
||||||
|
const duration = cycleToSeconds(hap.duration, this.cps);
|
||||||
|
onTrigger?.(hap, 0, duration, this.cps, targetTime);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
// receive messages from worker clock and process them
|
||||||
|
this.channel.onmessage = (message) => {
|
||||||
|
if (!this.started) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const { payload, type } = message.data;
|
||||||
|
|
||||||
|
switch (type) {
|
||||||
|
case 'tick': {
|
||||||
|
tickCallback(payload);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
sendMessage(type, payload) {
|
||||||
|
this.worker.port.postMessage({ type, payload, id: this.id });
|
||||||
|
}
|
||||||
|
|
||||||
|
now() {
|
||||||
|
const gap = (this.getTime() - this.time_at_last_tick_message) * this.cps;
|
||||||
|
return this.cycle + gap;
|
||||||
|
}
|
||||||
|
setCps(cps = 1) {
|
||||||
|
this.sendMessage('cpschange', { cps });
|
||||||
|
}
|
||||||
|
setCycle(cycle) {
|
||||||
|
this.sendMessage('setcycle', { cycle });
|
||||||
|
}
|
||||||
|
setStarted(started) {
|
||||||
|
this.sendMessage('toggle', { started });
|
||||||
|
this.started = started;
|
||||||
|
this.onToggle?.(started);
|
||||||
|
}
|
||||||
|
start() {
|
||||||
|
logger('[cyclist] start');
|
||||||
|
this.setStarted(true);
|
||||||
|
}
|
||||||
|
stop() {
|
||||||
|
logger('[cyclist] stop');
|
||||||
|
this.collator.reset();
|
||||||
|
this.setStarted(false);
|
||||||
|
}
|
||||||
|
setPattern(pat, autostart = false) {
|
||||||
|
this.pattern = pat;
|
||||||
|
if (autostart && !this.started) {
|
||||||
|
this.start();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
log(begin, end, haps) {
|
||||||
|
const onsets = haps.filter((h) => h.hasOnset());
|
||||||
|
console.log(`${begin.toFixed(4)} - ${end.toFixed(4)} ${Array(onsets.length).fill('I').join('')}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,15 +1,15 @@
|
|||||||
{
|
{
|
||||||
"name": "@strudel.cycles/core",
|
"name": "@strudel/core",
|
||||||
"version": "0.10.0",
|
"version": "1.1.0",
|
||||||
"description": "Port of Tidal Cycles to JavaScript",
|
"description": "Port of Tidal Cycles to JavaScript",
|
||||||
"main": "index.mjs",
|
"main": "index.mjs",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"publishConfig": {
|
"publishConfig": {
|
||||||
"main": "dist/index.js",
|
"main": "dist/index.mjs"
|
||||||
"module": "dist/index.mjs"
|
|
||||||
},
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"test": "vitest run",
|
"test": "vitest run",
|
||||||
|
"bench": "vitest bench",
|
||||||
"build": "vite build",
|
"build": "vite build",
|
||||||
"prepublishOnly": "pnpm build"
|
"prepublishOnly": "pnpm build"
|
||||||
},
|
},
|
||||||
@@ -31,11 +31,11 @@
|
|||||||
},
|
},
|
||||||
"homepage": "https://strudel.cc",
|
"homepage": "https://strudel.cc",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"fraction.js": "^4.3.7"
|
"fraction.js": "^5.2.1"
|
||||||
},
|
},
|
||||||
"gitHead": "0e26d4e741500f5bae35b023608f062a794905c2",
|
"gitHead": "0e26d4e741500f5bae35b023608f062a794905c2",
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"vite": "^5.0.10",
|
"vite": "^6.0.11",
|
||||||
"vitest": "^1.1.0"
|
"vitest": "^3.0.4"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+1188
-321
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user