commit f137bd53b577e20a6d8a6f5871de2cdbf44437b1 Author: Spxg Date: Sat Apr 26 22:13:23 2025 +0800 sqlight: sqlite playground diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..15b9afb --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +/target +node_modules +.DS_Store +dist diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..28fcee3 --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,2335 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "accessory" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28e416a3ab45838bac2ab2d81b1088d738d7b2d2c5272a54d39366565a29bd80" +dependencies = [ + "macroific", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "aceditor" +version = "0.1.0" +dependencies = [ + "js-sys", + "serde", + "serde-wasm-bindgen", + "thiserror 2.0.12", + "tokio", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "addr2line" +version = "0.24.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler2" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" + +[[package]] +name = "aho-corasick" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +dependencies = [ + "memchr", +] + +[[package]] +name = "any_spawner" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1384d3fe1eecb464229fcf6eebb72306591c56bf27b373561489458a7c73027d" +dependencies = [ + "futures", + "thiserror 2.0.12", + "wasm-bindgen-futures", +] + +[[package]] +name = "anyhow" +version = "1.0.98" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487" + +[[package]] +name = "async-lock" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff6e472cdea888a4bd64f342f09b3f50e1886d32afe8df3d663c01140b811b18" +dependencies = [ + "event-listener", + "event-listener-strategy", + "pin-project-lite", +] + +[[package]] +name = "async-trait" +version = "0.1.88" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e539d3fca749fcee5236ab05e93a52867dd549cc157c8cb7f99595f3cedffdb5" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "attribute-derive" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0053e96dd3bec5b4879c23a138d6ef26f2cb936c9cdc96274ac2b9ed44b5bb54" +dependencies = [ + "attribute-derive-macro", + "derive-where", + "manyhow", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "attribute-derive-macro" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "463b53ad0fd5b460af4b1915fe045ff4d946d025fb6c4dc3337752eaa980f71b" +dependencies = [ + "collection_literals", + "interpolator", + "manyhow", + "proc-macro-utils", + "proc-macro2", + "quote", + "quote-use", + "syn", +] + +[[package]] +name = "autocfg" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" + +[[package]] +name = "backtrace" +version = "0.3.75" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6806a6321ec58106fea15becdad98371e28d92ccbc7c8f1b3b6dd724fe8f1002" +dependencies = [ + "addr2line", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", + "windows-targets", +] + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "bitflags" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd" + +[[package]] +name = "bumpalo" +version = "3.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" + +[[package]] +name = "bytes" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" + +[[package]] +name = "camino" +version = "1.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b96ec4966b5813e2c0507c1f86115c8c5abaadc3980879c3424042a02fd1ad3" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "codee" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f18d705321923b1a9358e3fc3c57c3b50171196827fc7f5f10b053242aca627" +dependencies = [ + "serde", + "serde_json", + "thiserror 2.0.12", +] + +[[package]] +name = "collection_literals" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "186dce98367766de751c42c4f03970fc60fc012296e706ccbb9d5df9b6c1e271" + +[[package]] +name = "concurrent-queue" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "config" +version = "0.15.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "595aae20e65c3be792d05818e8c63025294ac3cb7e200f11459063a352a6ef80" +dependencies = [ + "convert_case 0.6.0", + "pathdiff", + "serde", + "toml", + "winnow", +] + +[[package]] +name = "console_error_panic_hook" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a06aeb73f470f66dcdbf7223caeebb85984942f22f1adb2a088cf9668146bbbc" +dependencies = [ + "cfg-if", + "wasm-bindgen", +] + +[[package]] +name = "console_log" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be8aed40e4edbf4d3b4431ab260b63fdc40f5780a4766824329ea0f1eefe3c0f" +dependencies = [ + "log", + "web-sys", +] + +[[package]] +name = "const-str" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e991226a70654b49d34de5ed064885f0bef0348a8e70018b8ff1ac80aa984a2" + +[[package]] +name = "const_format" +version = "0.2.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "126f97965c8ad46d6d9163268ff28432e8f6a1196a55578867832e3049df63dd" +dependencies = [ + "const_format_proc_macros", +] + +[[package]] +name = "const_format_proc_macros" +version = "0.2.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d57c2eccfb16dbac1f4e61e206105db5820c9d26c3c472bc17c774259ef7744" +dependencies = [ + "proc-macro2", + "quote", + "unicode-xid", +] + +[[package]] +name = "const_str_slice_concat" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f67855af358fcb20fac58f9d714c94e2b228fe5694c1c9b4ead4a366343eda1b" + +[[package]] +name = "convert_case" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec182b0ca2f35d8fc196cf3404988fd8b8c739a4d270ff118a398feb0cbec1ca" +dependencies = [ + "unicode-segmentation", +] + +[[package]] +name = "convert_case" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baaaa0ecca5b51987b9423ccdc971514dd8b0bb7b4060b983d3664dad3f1f89f" +dependencies = [ + "unicode-segmentation", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" + +[[package]] +name = "dashmap" +version = "6.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5041cc499144891f3790297212f32a74fb938e5136a14943f338ef9e0ae276cf" +dependencies = [ + "cfg-if", + "crossbeam-utils", + "hashbrown 0.14.5", + "lock_api", + "once_cell", + "parking_lot_core", +] + +[[package]] +name = "delegate-display" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9926686c832494164c33a36bf65118f4bd6e704000b58c94681bf62e9ad67a74" +dependencies = [ + "impartial-ord", + "itoa", + "macroific", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "derive-where" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e73f2692d4bd3cac41dca28934a39894200c9fabf49586d77d0e5954af1d7902" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "derive_more" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "093242cf7570c207c83073cf82f79706fe7b8317e98620a47d5be7c3d8497678" +dependencies = [ + "derive_more-impl", +] + +[[package]] +name = "derive_more-impl" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bda628edc44c4bb645fbe0f758797143e4e07926f7ebf4e9bdfbd3d2ce621df3" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "unicode-xid", +] + +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "drain_filter_polyfill" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "669a445ee724c5c69b1b06fe0b63e70a1c84bc9bb7d9696cd4f4e3ec45050408" + +[[package]] +name = "either" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" + +[[package]] +name = "either_of" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "216d23e0ec69759a17f05e1c553f3a6870e5ec73420fbb07807a6f34d5d1d5a4" +dependencies = [ + "paste", + "pin-project-lite", +] + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "erased" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1731451909bde27714eacba19c2566362a7f35224f52b153d3f42cf60f72472" + +[[package]] +name = "event-listener" +version = "5.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3492acde4c3fc54c845eaab3eed8bd00c7a7d881f78bfc801e43a93dec1331ae" +dependencies = [ + "concurrent-queue", + "parking", + "pin-project-lite", +] + +[[package]] +name = "event-listener-strategy" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93" +dependencies = [ + "event-listener", + "pin-project-lite", +] + +[[package]] +name = "fancy_constructor" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fac0fd7f4636276b4bd7b3148d0ba2c1c3fbede2b5214e47e7fedb70b02cde44" +dependencies = [ + "macroific", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "floating-ui" +version = "0.1.0" +dependencies = [ + "serde", + "serde-wasm-bindgen", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "form_urlencoded" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "fragile" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28dd6caf6059519a65843af8fe2a3ae298b14b80179855aeb4adc2c1934ee619" + +[[package]] +name = "futures" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" + +[[package]] +name = "futures-executor" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", + "num_cpus", +] + +[[package]] +name = "futures-io" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" + +[[package]] +name = "futures-macro" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "futures-sink" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" + +[[package]] +name = "futures-task" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" + +[[package]] +name = "futures-util" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "getrandom" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "wasi 0.11.0+wasi-snapshot-preview1", + "wasm-bindgen", +] + +[[package]] +name = "getrandom" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73fea8450eea4bac3940448fb7ae50d91f034f941199fcd9d909a5a07aa455f0" +dependencies = [ + "cfg-if", + "libc", + "r-efi", + "wasi 0.14.2+wasi-0.2.4", +] + +[[package]] +name = "gimli" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" + +[[package]] +name = "gloo-net" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c06f627b1a58ca3d42b45d6104bf1e1a03799df472df00988b6ba21accc10580" +dependencies = [ + "futures-channel", + "futures-core", + "futures-sink", + "gloo-utils", + "http", + "js-sys", + "pin-project", + "serde", + "serde_json", + "thiserror 1.0.69", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "gloo-utils" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b5555354113b18c547c1d3a98fbf7fb32a9ff4f6fa112ce823a21641a0ba3aa" +dependencies = [ + "js-sys", + "serde", + "serde_json", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "guardian" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17e2ac29387b1aa07a1e448f7bb4f35b500787971e965b02842b900afa5c8f6f" + +[[package]] +name = "hashbrown" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" + +[[package]] +name = "hashbrown" +version = "0.15.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84b26c544d002229e640969970a2e74021aadf6e2f96372b9c58eff97de08eb3" + +[[package]] +name = "hermit-abi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" + +[[package]] +name = "html-escape" +version = "0.2.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d1ad449764d627e22bfd7cd5e8868264fc9236e07c752972b4080cd351cb476" +dependencies = [ + "utf8-width", +] + +[[package]] +name = "http" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "hydration_context" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8714ae4adeaa846d838f380fbd72f049197de629948f91bf045329e0cf0a283" +dependencies = [ + "futures", + "once_cell", + "or_poisoned", + "pin-project-lite", + "serde", + "throw_error", +] + +[[package]] +name = "icu_collections" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locid" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_locid_transform" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_locid_transform_data", + "icu_provider", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_locid_transform_data" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7515e6d781098bf9f7205ab3fc7e9709d34554ae0b21ddbcb5febfa4bc7df11d" + +[[package]] +name = "icu_normalizer" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "utf16_iter", + "utf8_iter", + "write16", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5e8338228bdc8ab83303f16b797e177953730f601a96c25d10cb3ab0daa0cb7" + +[[package]] +name = "icu_properties" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_locid_transform", + "icu_properties_data", + "icu_provider", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85fb8799753b75aee8d2a21d7c14d9f38921b54b3dbda10f5a3c7a7b82dba5e2" + +[[package]] +name = "icu_provider" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_provider_macros", + "stable_deref_trait", + "tinystr", + "writeable", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_provider_macros" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "idna" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" +dependencies = [ + "icu_normalizer", + "icu_properties", +] + +[[package]] +name = "impartial-ord" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ab604ee7085efba6efc65e4ebca0e9533e3aff6cb501d7d77b211e3a781c6d5" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "indexed_db_futures" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fc9c8bc34f6d3486832b25d036b9a3dfea8d214e9ae1cf25c2a150963a5b8dd" +dependencies = [ + "accessory", + "cfg-if", + "delegate-display", + "derive_more", + "fancy_constructor", + "indexed_db_futures_macros_internal", + "js-sys", + "sealed", + "smallvec", + "thiserror 2.0.12", + "tokio", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "indexed_db_futures_macros_internal" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "caeba94923b68f254abef921cea7e7698bf4675fdd89d7c58bf1ed885b49a27d" +dependencies = [ + "macroific", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "indexmap" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e" +dependencies = [ + "equivalent", + "hashbrown 0.15.3", +] + +[[package]] +name = "interpolator" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71dd52191aae121e8611f1e8dc3e324dd0dd1dee1e6dd91d10ee07a3cfb4d9d8" + +[[package]] +name = "istyles" +version = "0.1.0" +dependencies = [ + "proc-macro2", + "quote", + "serde_json", + "syn", +] + +[[package]] +name = "itertools" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" + +[[package]] +name = "js-sys" +version = "0.3.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" +dependencies = [ + "once_cell", + "wasm-bindgen", +] + +[[package]] +name = "leptos" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f1819eec875169e4686cd21d212d8878ed7d2c5dbd2b6e35f40b7ad95ee260a" +dependencies = [ + "any_spawner", + "cfg-if", + "either_of", + "futures", + "getrandom 0.2.16", + "hydration_context", + "leptos_config", + "leptos_dom", + "leptos_hot_reload", + "leptos_macro", + "leptos_server", + "oco_ref", + "or_poisoned", + "paste", + "reactive_graph", + "rustc-hash", + "rustc_version", + "send_wrapper", + "serde", + "serde_qs", + "server_fn", + "slotmap", + "tachys", + "thiserror 2.0.12", + "throw_error", + "typed-builder", + "typed-builder-macro", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "leptos_config" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "419998a7004aa46d782c73364766827aeb1f7bd6208183822ac1c5012b6e3565" +dependencies = [ + "config", + "regex", + "serde", + "thiserror 2.0.12", + "typed-builder", +] + +[[package]] +name = "leptos_dom" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6493304626bd4e0ad384c2c568bd21d82ad71a54a9d679dd3807535c28654844" +dependencies = [ + "js-sys", + "or_poisoned", + "reactive_graph", + "send_wrapper", + "tachys", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "leptos_hot_reload" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8962a6a06c1f9d7e29013060f838c69270984dd066fc31587a1eec428d7b03be" +dependencies = [ + "anyhow", + "camino", + "indexmap", + "parking_lot", + "proc-macro2", + "quote", + "rstml", + "serde", + "syn", + "walkdir", +] + +[[package]] +name = "leptos_macro" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "494449c0eaaede38c4b5382bbcf4bf38e295507df3341f6094c7829da8c8f443" +dependencies = [ + "attribute-derive", + "cfg-if", + "convert_case 0.8.0", + "html-escape", + "itertools", + "leptos_hot_reload", + "prettyplease", + "proc-macro-error2", + "proc-macro2", + "quote", + "rstml", + "rustc_version", + "server_fn_macro", + "syn", + "uuid", +] + +[[package]] +name = "leptos_server" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee74dc2f754034a01018c7d9403f042b247ddc12387acf0ed87b464f7bddf111" +dependencies = [ + "any_spawner", + "base64", + "codee", + "futures", + "hydration_context", + "or_poisoned", + "reactive_graph", + "send_wrapper", + "serde", + "serde_json", + "server_fn", + "tachys", +] + +[[package]] +name = "libc" +version = "0.2.172" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa" + +[[package]] +name = "linear-map" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfae20f6b19ad527b550c223fddc3077a547fc70cda94b9b566575423fd303ee" + +[[package]] +name = "litemap" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23fb14cb19457329c82206317a5663005a4d404783dc74f4252769b0d5f42856" + +[[package]] +name = "lock_api" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" + +[[package]] +name = "macroific" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89f276537b4b8f981bf1c13d79470980f71134b7bdcc5e6e911e910e556b0285" +dependencies = [ + "macroific_attr_parse", + "macroific_core", + "macroific_macro", +] + +[[package]] +name = "macroific_attr_parse" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad4023761b45fcd36abed8fb7ae6a80456b0a38102d55e89a57d9a594a236be9" +dependencies = [ + "proc-macro2", + "quote", + "sealed", + "syn", +] + +[[package]] +name = "macroific_core" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0a7594d3c14916fa55bef7e9d18c5daa9ed410dd37504251e4b75bbdeec33e3" +dependencies = [ + "proc-macro2", + "quote", + "sealed", + "syn", +] + +[[package]] +name = "macroific_macro" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4da6f2ed796261b0a74e2b52b42c693bb6dee1effba3a482c49592659f824b3b" +dependencies = [ + "macroific_attr_parse", + "macroific_core", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "manyhow" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b33efb3ca6d3b07393750d4030418d594ab1139cee518f0dc88db70fec873587" +dependencies = [ + "manyhow-macros", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "manyhow-macros" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46fce34d199b78b6e6073abf984c9cf5fd3e9330145a93ee0738a7443e371495" +dependencies = [ + "proc-macro-utils", + "proc-macro2", + "quote", +] + +[[package]] +name = "memchr" +version = "2.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" + +[[package]] +name = "miniz_oxide" +version = "0.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3be647b768db090acb35d5ec5db2b0e1f1de11133ca123b9eacf5137868f892a" +dependencies = [ + "adler2", +] + +[[package]] +name = "next_tuple" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60993920e071b0c9b66f14e2b32740a4e27ffc82854dcd72035887f336a09a28" + +[[package]] +name = "num_cpus" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" +dependencies = [ + "hermit-abi", + "libc", +] + +[[package]] +name = "object" +version = "0.36.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" +dependencies = [ + "memchr", +] + +[[package]] +name = "oco_ref" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64b94982fe39a861561cf67ff17a7849f2cedadbbad960a797634032b7abb998" +dependencies = [ + "serde", + "thiserror 1.0.69", +] + +[[package]] +name = "once_cell" +version = "1.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" + +[[package]] +name = "or_poisoned" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c04f5d74368e4d0dfe06c45c8627c81bd7c317d52762d118fb9b3076f6420fd" + +[[package]] +name = "parking" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" + +[[package]] +name = "parking_lot" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-targets", +] + +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + +[[package]] +name = "pathdiff" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df94ce210e5bc13cb6651479fa48d14f601d9858cfe0467f43ae157023b938d3" + +[[package]] +name = "percent-encoding" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" + +[[package]] +name = "pin-project" +version = "1.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677f1add503faace112b9f1373e43e9e054bfdd22ff1a63c1bc485eaec6a6a8a" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "prettyplease" +version = "0.2.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "664ec5419c51e34154eec046ebcba56312d5a2fc3b09a06da188e1ad21afadf6" +dependencies = [ + "proc-macro2", + "syn", +] + +[[package]] +name = "proc-macro-error-attr2" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96de42df36bb9bba5542fe9f1a054b8cc87e172759a1868aa05c1f3acc89dfc5" +dependencies = [ + "proc-macro2", + "quote", +] + +[[package]] +name = "proc-macro-error2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11ec05c52be0a07b08061f7dd003e7d7092e0472bc731b4af7bb1ef876109802" +dependencies = [ + "proc-macro-error-attr2", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "proc-macro-utils" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eeaf08a13de400bc215877b5bdc088f241b12eb42f0a548d3390dc1c56bb7071" +dependencies = [ + "proc-macro2", + "quote", + "smallvec", +] + +[[package]] +name = "proc-macro2" +version = "1.0.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "proc-macro2-diagnostics" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af066a9c399a26e020ada66a034357a868728e72cd426f3adcd35f80d88d88c8" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "version_check", + "yansi", +] + +[[package]] +name = "quote" +version = "1.0.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "quote-use" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9619db1197b497a36178cfc736dc96b271fe918875fbf1344c436a7e93d0321e" +dependencies = [ + "quote", + "quote-use-macros", +] + +[[package]] +name = "quote-use-macros" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82ebfb7faafadc06a7ab141a6f67bcfb24cb8beb158c6fe933f2f035afa99f35" +dependencies = [ + "proc-macro-utils", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "r-efi" +version = "5.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5" + +[[package]] +name = "reactive_graph" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "872005cef4e53daa2c0e23f26a25d429ebbabe2300acaa3dab20c83620cbb8c4" +dependencies = [ + "any_spawner", + "async-lock", + "futures", + "guardian", + "hydration_context", + "or_poisoned", + "pin-project-lite", + "rustc-hash", + "rustc_version", + "send_wrapper", + "serde", + "slotmap", + "thiserror 2.0.12", + "web-sys", +] + +[[package]] +name = "reactive_stores" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23e02f30b9cc6645e330e926dd778d4bcbd0e5770bdf4ec3d422dc0fe3c52a41" +dependencies = [ + "dashmap", + "guardian", + "itertools", + "or_poisoned", + "paste", + "reactive_graph", + "reactive_stores_macro", + "rustc-hash", + "send_wrapper", +] + +[[package]] +name = "reactive_stores_macro" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3473c4fa1abece8f3ddcd05f11e33008fb91a585fa9aefa18268a585282842ff" +dependencies = [ + "convert_case 0.8.0", + "proc-macro-error2", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "redox_syscall" +version = "0.5.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "928fca9cf2aa042393a8325b9ead81d2f0df4cb12e1e24cef072922ccd99c5af" +dependencies = [ + "bitflags", +] + +[[package]] +name = "regex" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" + +[[package]] +name = "rstml" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61cf4616de7499fc5164570d40ca4e1b24d231c6833a88bff0fe00725080fd56" +dependencies = [ + "derive-where", + "proc-macro2", + "proc-macro2-diagnostics", + "quote", + "syn", + "syn_derive", + "thiserror 2.0.12", +] + +[[package]] +name = "rustc-demangle" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" + +[[package]] +name = "rustc-hash" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" + +[[package]] +name = "rustc_version" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver", +] + +[[package]] +name = "rustversion" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eded382c5f5f786b989652c49544c4877d9f015cc22e145a5ea8ea66c2921cd2" + +[[package]] +name = "ryu" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "sealed" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22f968c5ea23d555e670b449c1c5e7b2fc399fdaec1d304a17cd48e288abc107" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "semver" +version = "1.0.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0" + +[[package]] +name = "send_wrapper" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd0b0ec5f1c1ca621c432a25813d8d60c88abe6d3e08a3eb9cf37d97a0fe3d73" +dependencies = [ + "futures-core", +] + +[[package]] +name = "serde" +version = "1.0.219" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde-wasm-bindgen" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8302e169f0eddcc139c70f139d19d6467353af16f9fce27e8c30158036a1e16b" +dependencies = [ + "js-sys", + "serde", + "wasm-bindgen", +] + +[[package]] +name = "serde_derive" +version = "1.0.219" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.140" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" +dependencies = [ + "itoa", + "memchr", + "ryu", + "serde", +] + +[[package]] +name = "serde_qs" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b417bedc008acbdf6d6b4bc482d29859924114bbe2650b7921fb68a261d0aa6" +dependencies = [ + "percent-encoding", + "serde", + "thiserror 2.0.12", +] + +[[package]] +name = "serde_spanned" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" +dependencies = [ + "serde", +] + +[[package]] +name = "server_fn" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a44f68021821254ab4a28c44ab1a42ea5563a36797afdae90b1a4dc14de98156" +dependencies = [ + "base64", + "bytes", + "const-str", + "const_format", + "dashmap", + "futures", + "gloo-net", + "http", + "js-sys", + "once_cell", + "pin-project-lite", + "rustc_version", + "rustversion", + "send_wrapper", + "serde", + "serde_json", + "serde_qs", + "server_fn_macro_default", + "thiserror 2.0.12", + "throw_error", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm-streams", + "web-sys", + "xxhash-rust", +] + +[[package]] +name = "server_fn_macro" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a20c322c5695f689d30e9ee32f331acc93fd0447a18aa004d96882f5007f368" +dependencies = [ + "const_format", + "convert_case 0.8.0", + "proc-macro2", + "quote", + "rustc_version", + "syn", + "xxhash-rust", +] + +[[package]] +name = "server_fn_macro_default" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5e5f79c534735feb3ac913d2507aa630a25610d26f4f526e55a4def216de744" +dependencies = [ + "server_fn_macro", + "syn", +] + +[[package]] +name = "slab" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +dependencies = [ + "autocfg", +] + +[[package]] +name = "slotmap" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbff4acf519f630b3a3ddcfaea6c06b42174d9a44bc70c620e9ed1649d58b82a" +dependencies = [ + "version_check", +] + +[[package]] +name = "smallvec" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8917285742e9f3e1683f0a9c4e6b57960b7314d0b08d30d1ecd426713ee2eee9" + +[[package]] +name = "split-grid" +version = "0.1.0" +dependencies = [ + "serde", + "serde-wasm-bindgen", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "sqlight" +version = "0.1.0" +dependencies = [ + "aceditor", + "console_error_panic_hook", + "console_log", + "floating-ui", + "fragile", + "istyles", + "js-sys", + "leptos", + "log", + "once_cell", + "parking_lot", + "reactive_stores", + "serde", + "serde-wasm-bindgen", + "serde_json", + "split-grid", + "sqlite-wasm-rs", + "thiserror 2.0.12", + "tokio", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "sqlite-wasm-rs" +version = "0.3.4" +source = "git+https://github.com/Spxg/sqlite-wasm-rs.git#9a52071cd4f9d542fa7d999be95a8909d60bffa5" +dependencies = [ + "fragile", + "indexed_db_futures", + "js-sys", + "once_cell", + "parking_lot", + "thiserror 2.0.12", + "tokio", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + +[[package]] +name = "syn" +version = "2.0.101" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ce2b7fc941b3a24138a0a7cf8e858bfc6a992e7978a068a5c760deb0ed43caf" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn_derive" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdb066a04799e45f5d582e8fc6ec8e6d6896040d00898eb4e6a835196815b219" +dependencies = [ + "proc-macro-error2", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "synstructure" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tachys" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b0669efb17a4477a4442726f00e4a689597069b8967a03a2b4b13b7f415e6b8" +dependencies = [ + "any_spawner", + "async-trait", + "const_str_slice_concat", + "drain_filter_polyfill", + "either_of", + "erased", + "futures", + "html-escape", + "indexmap", + "itertools", + "js-sys", + "linear-map", + "next_tuple", + "oco_ref", + "once_cell", + "or_poisoned", + "parking_lot", + "paste", + "reactive_graph", + "reactive_stores", + "rustc-hash", + "rustc_version", + "send_wrapper", + "slotmap", + "throw_error", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "thiserror" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl 1.0.69", +] + +[[package]] +name = "thiserror" +version = "2.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" +dependencies = [ + "thiserror-impl 2.0.12", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "throw_error" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41e42a6afdde94f3e656fae18f837cb9bbe500a5ac5de325b09f3ec05b9c28e3" +dependencies = [ + "pin-project-lite", +] + +[[package]] +name = "tinystr" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" +dependencies = [ + "displaydoc", + "zerovec", +] + +[[package]] +name = "tokio" +version = "1.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2513ca694ef9ede0fb23fe71a4ee4107cb102b9dc1930f6d0fd77aae068ae165" +dependencies = [ + "backtrace", + "pin-project-lite", +] + +[[package]] +name = "toml" +version = "0.8.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05ae329d1f08c4d17a59bed7ff5b5a769d062e64a62d34a3261b219e62cd5aae" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit", +] + +[[package]] +name = "toml_datetime" +version = "0.6.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3da5db5a963e24bc68be8b17b6fa82814bb22ee8660f192bb182771d498f09a3" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_edit" +version = "0.22.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "310068873db2c5b3e7659d2cc35d21855dbafa50d1ce336397c666e3cb08137e" +dependencies = [ + "indexmap", + "serde", + "serde_spanned", + "toml_datetime", + "winnow", +] + +[[package]] +name = "typed-builder" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce63bcaf7e9806c206f7d7b9c1f38e0dce8bb165a80af0898161058b19248534" +dependencies = [ + "typed-builder-macro", +] + +[[package]] +name = "typed-builder-macro" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60d8d828da2a3d759d3519cdf29a5bac49c77d039ad36d0782edadbf9cd5415b" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "unicode-ident" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" + +[[package]] +name = "unicode-segmentation" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" + +[[package]] +name = "unicode-xid" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" + +[[package]] +name = "url" +version = "2.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", +] + +[[package]] +name = "utf16_iter" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" + +[[package]] +name = "utf8-width" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86bd8d4e895da8537e5315b8254664e6b769c4ff3db18321b297a1e7004392e3" + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + +[[package]] +name = "uuid" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "458f7a779bf54acc9f347480ac654f68407d3aab21269a6e3c9f922acd9e2da9" +dependencies = [ + "getrandom 0.3.2", +] + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "wasi" +version = "0.14.2+wasi-0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" +dependencies = [ + "wit-bindgen-rt", +] + +[[package]] +name = "wasm-bindgen" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" +dependencies = [ + "bumpalo", + "log", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.50" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" +dependencies = [ + "cfg-if", + "js-sys", + "once_cell", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "wasm-streams" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15053d8d85c7eccdbefef60f06769760a563c7f0a9d6902a13d35c7800b0ad65" +dependencies = [ + "futures-util", + "js-sys", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "web-sys" +version = "0.3.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "winapi-util" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" +dependencies = [ + "windows-sys", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_gnullvm", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "winnow" +version = "0.7.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9fb597c990f03753e08d3c29efbfcf2019a003b4bf4ba19225c158e1549f0f3" +dependencies = [ + "memchr", +] + +[[package]] +name = "wit-bindgen-rt" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" +dependencies = [ + "bitflags", +] + +[[package]] +name = "write16" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" + +[[package]] +name = "writeable" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" + +[[package]] +name = "xxhash-rust" +version = "0.8.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdd20c5420375476fbd4394763288da7eb0cc0b8c11deed431a91562af7335d3" + +[[package]] +name = "yansi" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049" + +[[package]] +name = "yoke" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" +dependencies = [ + "serde", + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + +[[package]] +name = "zerofrom" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + +[[package]] +name = "zerovec" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..8dc427f --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,37 @@ +[package] +name = "sqlight" +version = "0.1.0" +edition = "2024" + +[workspace] +resolver = "2" +members = [ + "crates/aceditor", + "crates/floating-ui", + "crates/istyles", + "crates/split-grid" +] + +[dependencies] +console_error_panic_hook = "0.1.7" +leptos = { version = "0.8.1", features = ["csr", "nightly"] } +sqlite-wasm-rs = { git = "https://github.com/Spxg/sqlite-wasm-rs.git", default-features = false, features = ["precompiled"] } +istyles = { path = "crates/istyles" } +aceditor = { path = "crates/aceditor" } +split-grid = { path = "crates/split-grid" } +floating-ui = { path = "crates/floating-ui" } +reactive_stores = "0.2.2" +thiserror = "2.0.12" +serde = "1.0.219" +serde_json = "1.0.140" +web-sys = { version = "0.3.77", features = ["Clipboard", "DedicatedWorkerGlobalScope", "File", "FileList", "HtmlSelectElement", "MediaQueryList", "Navigator", "Storage", "Worker", "WorkerOptions", "WorkerType"] } +serde-wasm-bindgen = "0.6.5" +parking_lot = "0.12.3" +once_cell = "1.21.3" +tokio = { version = "1.45.0", features = ["sync"] } +wasm-bindgen = "0.2.100" +js-sys = "0.3.77" +wasm-bindgen-futures = "0.4.50" +console_log = "1.0.0" +log = "0.4.27" +fragile = "2.0.1" diff --git a/assets/module.css/button_set.module.css b/assets/module.css/button_set.module.css new file mode 100644 index 0000000..9410750 --- /dev/null +++ b/assets/module.css/button_set.module.css @@ -0,0 +1,135 @@ +$width: 1px; +$radius: 4px; + +.-buttonReset { + color: var(--font-color); + border: none; + background: inherit; + background-color: transparent; /* IE 11 */ + padding: 0; + font: inherit; + line-height: inherit; + text-align: inherit; +} + +.set { + display: flex; +} + +.-border { + border-width: $width 0; + border-style: solid; + + &:first-child { + border-top-left-radius: $radius; + border-bottom-left-radius: $radius; + border-left-width: $width; + } + + &:last-child { + border-top-right-radius: $radius; + border-bottom-right-radius: $radius; + border-right-width: $width; + } +} + +.-button { + --button-gap: 0.5em; + --button-side-padding: 1.25em; + --button-height: 3em; + --button-side-icon-nudge: 0.25em; + + composes: -buttonReset; + display: grid; + grid-auto-flow: column; + gap: var(--button-gap); + align-content: center; + align-items: center; + padding: 0 var(--button-side-padding); + height: var(--button-height); + font-weight: 600; + text-decoration: none; + text-transform: uppercase; + white-space: nowrap; + + &:enabled { + cursor: pointer; + } +} + +.small { + --button-gap: 0.25em; + --button-side-padding: 0.75em; + --button-height: 2.5em; + --button-side-icon-nudge: 0.125em; +} + +.primary { + composes: -border -button; + background-color: var(--button-primary-bg-color); + border-color: var(--button-primary-border-color); + color: var(--button-primary-color); + font-weight: 700; + + &:disabled { + background-color: var(--button-primary-bg-color-light); + border-color: var(--button-primary-border-color-light); + } + + &:hover:enabled { + background-color: var(--button-primary-border-color); + } + + &:active:enabled { + box-shadow: inset 0 0 5px var(--button-primary-active-color); + } +} + +.secondary { + composes: -border -button; + background: var(--button-secondary-bg-color); + border-color: var(--button-secondary-border-color); + color: var(--button-secondary-color); + + &:disabled { + background: inherit; + background-color: var(--button-secondary-bg-color-light); + border-color: var(--button-secondary-border-color-light); + color: var(--button-secondary-color-light); + } + + &:visited { + color: var(--button-secondary-color); + } + + &:hover:enabled { + background: inherit; + background-color: var(--button-secondary-border-color); + } + + &:active:enabled { + box-shadow: inset 0 0 5px var(--button-secondary-active-color); + } +} + +.iconLeft { + transform: translate(calc(-1 * var(--button-side-icon-nudge)), 0); +} + +.iconRight { + transform: translate(var(--button-side-icon-nudge), 0); +} + +.rule { + composes: -border; + background-color: var(--button-secondary-border-color); + width: 1px; + border-color: var(--button-secondary-border-color); +} + +.icon { + composes: secondary; + padding: 0; + aspect-ratio: 1/1; + justify-items: center; +} diff --git a/assets/module.css/config_element.module.css b/assets/module.css/config_element.module.css new file mode 100644 index 0000000..9107316 --- /dev/null +++ b/assets/module.css/config_element.module.css @@ -0,0 +1,75 @@ +.container { + display: flex; + align-items: center; +} + +.name { + flex: 1; +} + +.notDefault { + composes: name; + color: var(--header-tint); + font-weight: 600; +} + +.value { + flex: 1; +} + +.select { + width: 100%; + background: var(--button-secondary-bg-color); + border-color: var(--button-secondary-border-color); + color: var(--button-secondary-color); + + & option { + background-color: var(--button-secondary-bg-color-top); + border-color: var(--button-secondary-border-color); + color: var(--button-secondary-color); + } +} + +.toggle { + display: flex; + + & label { + $border: 1px solid #bbb; + + flex: 1; + cursor: pointer; + border: $border; + border-right-width: 0; + border-top-left-radius: var(--header-border-radius); + border-bottom-left-radius: var(--header-border-radius); + padding: 0 1em; + color: #777; + font-weight: 600; + text-align: center; + text-transform: uppercase; + + & ~ label { + border-left: $border; + border-right-width: 1px; + border-radius: 0 var(--header-border-radius) var(--header-border-radius) 0; + } + + &:hover { + background: hsl(208deg 100% 43% / 10%); + } + } + + & input { + display: none; + + &:checked + label { + border-color: var(--header-tint); + background: var(--header-tint); + color: #fff; + + & ~ label { + border-left-width: 0; + } + } + } +} diff --git a/assets/module.css/editor.module.css b/assets/module.css/editor.module.css new file mode 100644 index 0000000..3d72377 --- /dev/null +++ b/assets/module.css/editor.module.css @@ -0,0 +1,42 @@ +.-autoSize { + width: 100%; + min-width: 0; + height: 100%; + min-height: 0; +} + +.-bodyMonospace { + font-size: inherit; + line-height: 1.25; + + /* http://code.stephenmorley.org/html-and-css/fixing-browsers-broken-monospace-font-handling/ + * ACE uses Monaco, Menlo, "Ubuntu Mono", Consolas, source-code-pro, monospace; + */ + font-family: 'Source Code Pro', monospace; + font-optical-sizing: auto; +} + +.container { + composes: -autoSize; + position: relative; +} + +.-advanced { + composes: -bodyMonospace -autoSize; + position: absolute; +} + +.ace { + composes: -advanced; +} + +.monaco { + composes: -advanced; +} + +.simple { + composes: -advanced; + border: none; + color: inherit; + background-color: inherit; +} diff --git a/assets/module.css/header.module.css b/assets/module.css/header.module.css new file mode 100644 index 0000000..e119259 --- /dev/null +++ b/assets/module.css/header.module.css @@ -0,0 +1,12 @@ +.container, +.left, +.right { + display: flex; + gap: 0.5em; +} + +.container { + font-size: var(--secondary-font-size); + padding: 1.25em 0; + justify-content: space-between; +} diff --git a/assets/module.css/icon.module.css b/assets/module.css/icon.module.css new file mode 100644 index 0000000..fece517 --- /dev/null +++ b/assets/module.css/icon.module.css @@ -0,0 +1,4 @@ +.icon { + fill: currentcolor; + display: block; +} diff --git a/assets/module.css/index.module.css b/assets/module.css/index.module.css new file mode 100644 index 0000000..fdd6e2b --- /dev/null +++ b/assets/module.css/index.module.css @@ -0,0 +1,231 @@ +/* Non-theme variables */ +:root { + /* Fonts */ + --primary-font: 'Open Sans', sans-serif; + --primary-font-size: 18px; + --secondary-font-size: calc(0.75 * var(--primary-font-size)); + + /* Header */ + --header-transition: 0.2s ease-in-out; + --header-border-radius: 4px; + + /* Border */ + --border: 1px solid var(--border-color); +} + +@define-mixin light-theme-vars { + --positive-luminance: white; + --negative-luminance: black; + + /* Fonts */ + --font-color: #444; + --font-color-high-contrast: var(--negative-luminance); + + /* Links */ + --link-color: #00e; + --link-color-visited: #551a8b; + + /* Background */ + --background-color: #e1e1db; + --background-color-high-contrast: var(--positive-luminance); + + /* Code */ + --code-background-color: #eee; + + /* Border */ + --border-color: #bbb; + + /* Header */ + --header-link-color: var(--negative-luminance); + --header-main-border: #dedede; + --header-tint: #428bca; + --header-accent-border: #bdbdbd; + + /* The big red button */ + --button-primary-color: var(--positive-luminance); + --button-primary-bg-color: #a42; + --button-primary-border-color: #80331a; + --button-primary-bg-color-light: color-mix( + in hsl, + var(--button-primary-bg-color), + var(--positive-luminance) + ); + --button-primary-border-color-light: color-mix( + in hsl, + var(--button-primary-border-color), + var(--positive-luminance) + ); + + /* Clicked */ + --button-primary-active-color: color-mix( + in hsl, + var(--positive-luminance), + var(--negative-luminance) 30% + ); + + /* Not the big red button */ + --button-secondary-color: #444; + --button-secondary-bg-color-top: #fff; + --button-secondary-bg-color-bottom: #f9f9f9; + --button-secondary-bg-color: linear-gradient( + to bottom, + var(--button-secondary-bg-color-top), + var(--button-secondary-bg-color-bottom) + ); + --button-secondary-border-color: color-mix( + in hsl, + var(--button-secondary-bg-color-bottom), + var(--negative-luminance) 20% + ); + + /* Disabled */ + --button-secondary-bg-color-light: color-mix( + in hsl, + var(--button-secondary-bg-color-bottom), + var(--positive-luminance) + ); + --button-secondary-border-color-light: color-mix( + in hsl, + var(--button-secondary-border-color), + var(--positive-luminance) + ); + --button-secondary-color-light: color-mix( + in hsl, + var(--button-secondary-color), + var(--positive-luminance) + ); + + /* Clicked */ + --button-secondary-active-color: color-mix( + in hsl, + var(--negative-luminance), + var(--positive-luminance) 30% + ); + + /* Output tabs */ + --output-background-tab: #fcfcfc; + --output-current-tab: #f9ffff; + + /* Output compiler highlighting */ + --output-highlight-warning-color: #f79a06; + --output-highlight-warning-bg-color: inherit; + --output-highlight-error-color: #bf1b1b; + --output-highlight-error-bg-color: inherit; +} + +@define-mixin dark-theme-vars { + --positive-luminance: black; + --negative-luminance: white; + + /* Fonts */ + --font-color: #dcdbd8; + --font-color-high-contrast: #dcdbd8; + + /* Links */ + --link-color: #b2dcff; + --link-color-visited: #eecaff; + + /* Background */ + --background-color: #444; + --background-color-high-contrast: #181818; + + /* Code */ + --code-background-color: #3c3c3c; + + /* Border */ + --border-color: #5e5e5e; + + /* Header */ + --header-main-border: #363b3d; + --header-accent-border: #bdbdbd; + + /* The big red button */ + --button-primary-color: #dcdbd8; + --button-primary-bg-color: #5d2310; + --button-primary-border-color: #612714; + + /* Not the big red button */ + --button-secondary-color: #dcdbd8; + --button-secondary-bg-color-top: #17191a; + --button-secondary-bg-color-bottom: #1a1c1d; + --button-secondary-border-color: color-mix( + in hsl, + var(--button-secondary-bg-color-bottom), + var(--negative-luminance) 40% + ); + + /* Output tabs */ + --output-background-tab: #343434; + --output-current-tab: #191b1c; + + /* Output compiler highlighting */ + --output-highlight-warning-color: #ffe800; + --output-highlight-warning-bg-color: #330; + --output-highlight-error-color: #f5f5f5; + --output-highlight-error-bg-color: #820000; +} + +:root, +[data-theme='light']:root { + @mixin light-theme-vars; +} + +@media (prefers-color-scheme: dark) { + :root { + @mixin dark-theme-vars; + } +} + +[data-theme='dark']:root { + @mixin dark-theme-vars; +} + +/* Modify normalized styles */ +button, +input, +optgroup, +select, +textarea { + font-family: var(--primary-font); + font-optical-sizing: auto; +} + +html { + box-sizing: border-box; +} + +a { + color: var(--link-color); +} + +a:visited { + color: var(--link-color-visited); +} + +*, +*::before, +*::after { + box-sizing: inherit; +} + +body { + color: var(--font-color); + background-color: var(--background-color); + padding: 0 1em; + font-family: var(--primary-font); + font-optical-sizing: auto; + font-size: var(--primary-font-size); +} + +/* stylelint-disable-next-line selector-class-pattern */ +:global(.language-rust_errors) { + & :global(.warning) { + color: var(--output-highlight-warning-color); + background-color: var(--output-highlight-warning-bg-color); + } + + & :global(.error) { + color: var(--output-highlight-error-color); + background-color: var(--output-highlight-error-bg-color); + } +} diff --git a/assets/module.css/loader.module.css b/assets/module.css/loader.module.css new file mode 100644 index 0000000..28ef51e --- /dev/null +++ b/assets/module.css/loader.module.css @@ -0,0 +1,23 @@ +@keyframes loader-fade { + 0% { + opacity: 0; + } + + 75% { + opacity: 1; + } +} + +.dot { + opacity: 0; + animation: loader-fade 1s; + animation-iteration-count: infinite; + + &:nth-child(2) { + animation-delay: 0.2s; + } + + &:nth-child(3) { + animation-delay: 0.4s; + } +} diff --git a/assets/module.css/menu_group.module.css b/assets/module.css/menu_group.module.css new file mode 100644 index 0000000..55bbc15 --- /dev/null +++ b/assets/module.css/menu_group.module.css @@ -0,0 +1,22 @@ +.container { + padding: 0.75em 1em 0; + width: 27em; + line-height: normal; + + &:last-child { + padding-bottom: 0.75em; + } +} + +.title { + margin: 0; + border-bottom: 1px solid var(--header-main-border); + padding-bottom: 10px; + font-weight: 700; + font-size: var(--secondary-font-size); + text-transform: uppercase; +} + +.content { + padding: 1em 0.25em; +} diff --git a/assets/module.css/menu_item.module.css b/assets/module.css/menu_item.module.css new file mode 100644 index 0000000..3878db3 --- /dev/null +++ b/assets/module.css/menu_item.module.css @@ -0,0 +1,7 @@ +.container { + margin-bottom: 1em; + + &:last-child { + margin-bottom: 0; + } +} diff --git a/assets/module.css/output.module.css b/assets/module.css/output.module.css new file mode 100644 index 0000000..3af9996 --- /dev/null +++ b/assets/module.css/output.module.css @@ -0,0 +1,53 @@ +.container { + display: flex; + flex-direction: column; + width: 100%; + height: 100%; +} + +.tabs { + display: flex; +} + +.tab { + color: var(--font-color); + flex: 1 1 auto; + cursor: pointer; + border: var(--border); + border-right: none; + background-color: var(--output-background-tab); + line-height: 1.5; + + &:last-of-type { + border-right: var(--border); + } +} + +.tabSelected { + composes: tab; + cursor: default; + border-bottom: none; + background-color: var(--output-current-tab); + + &:focus { + outline: none; + } +} + +.tabClose { + composes: tab; + flex: 0 0 auto; +} + +.body { + border: var(--border); + border-top: none; + background-color: var(--output-current-tab); + padding: 0.5em; + height: 100%; + overflow: scroll; +} + +.stdin { + margin-top: 0.25em; +} diff --git a/assets/module.css/output/execute.module.css b/assets/module.css/output/execute.module.css new file mode 100644 index 0000000..13ff0ed --- /dev/null +++ b/assets/module.css/output/execute.module.css @@ -0,0 +1,32 @@ +.-buttonReset { + color: var(--font-color); + border: none; + background: inherit; + background-color: transparent; /* IE 11 */ + padding: 0; + font: inherit; + line-height: inherit; + text-align: inherit; +} + +.-buttonAsLink { + composes: -buttonReset; + cursor: pointer; + color: var(--link-color); + user-select: text; + text-decoration: underline; +} + +.addMain { + composes: -buttonAsLink; +} + +.table { + border-collapse: collapse; +} + +.tdAndTh { + border: 1px solid #dddddd; + text-align: left; + padding: 8px; +} diff --git a/assets/module.css/output/header.module.css b/assets/module.css/output/header.module.css new file mode 100644 index 0000000..a172217 --- /dev/null +++ b/assets/module.css/output/header.module.css @@ -0,0 +1,21 @@ +.container { + display: flex; + color: var(--font-color); + white-space: nowrap; + + &::before, + &::after { + flex: 1 1 auto; + margin: auto; + border-top: var(--border); + content: ''; + } + + &::before { + margin-right: 2%; + } + + &::after { + margin-left: 2%; + } +} diff --git a/assets/module.css/output/section.module.css b/assets/module.css/output/section.module.css new file mode 100644 index 0000000..4530783 --- /dev/null +++ b/assets/module.css/output/section.module.css @@ -0,0 +1,14 @@ +.-bodyMonospace { + font-size: inherit; + line-height: 1.25; + + /* http://code.stephenmorley.org/html-and-css/fixing-browsers-broken-monospace-font-handling/ + * ACE uses Monaco, Menlo, "Ubuntu Mono", Consolas, source-code-pro, monospace; + */ + font-family: 'Source Code Pro', monospace; + font-optical-sizing: auto; +} + +.code { + composes: -bodyMonospace; +} diff --git a/assets/module.css/output/share.module.css b/assets/module.css/output/share.module.css new file mode 100644 index 0000000..8c5cad2 --- /dev/null +++ b/assets/module.css/output/share.module.css @@ -0,0 +1,51 @@ +.-buttonReset { + color: var(--font-color); + border: none; + background: inherit; + background-color: transparent; /* IE 11 */ + padding: 0; + font: inherit; + line-height: inherit; + text-align: inherit; +} + +.container { + display: flex; + + --copied-duration: 1s ease-in-out; +} + +.button { + composes: -buttonReset; + transition: color var(--copied-duration); + cursor: pointer; + margin: 0 0.25em 0 0.5em; +} + +.text { + visibility: hidden; + opacity: 0; + transition: + visibility var(--copied-duration), + opacity var(--copied-duration), + color var(--copied-duration); +} + +.active { + composes: container; + + & .button { + transition: color 0s; + color: green; + } + + & .text { + visibility: visible; + opacity: 1; + transition: + visibility 0s, + opacity 0s, + color 0s; + color: green; + } +} diff --git a/assets/module.css/playground.module.css b/assets/module.css/playground.module.css new file mode 100644 index 0000000..0938f50 --- /dev/null +++ b/assets/module.css/playground.module.css @@ -0,0 +1,69 @@ +.-autoSize { + width: 100%; + min-width: 0; + height: 100%; + min-height: 0; +} + +.container { + display: flex; + flex-direction: column; + padding-bottom: 1em; + height: 100vh; +} + +.-resizeableArea { + composes: -autoSize; + display: grid; +} + +.resizeableAreaRowOutputUnfocused { + composes: -resizeableArea; + grid-template-rows: 1fr auto; +} + +.resizeableAreaRowOutputFocused { + composes: -resizeableArea; + grid-template-rows: 1fr 12px 1fr; +} + +.resizeableAreaColumnOutputUnfocused { + composes: -resizeableArea; + grid-template-columns: 1fr auto; +} + +.resizeableAreaColumnOutputFocused { + composes: -resizeableArea; + grid-template-columns: 1fr 12px 1fr; +} + +.-gutter { + display: flex; + justify-content: center; + align-items: center; +} + +.splitRowsGutter { + composes: -gutter; + cursor: row-resize; +} + +.splitRowsGutterHandle { + transform: rotate(90deg); + pointer-events: none; +} + +.splitColumnsGutter { + composes: -gutter; + cursor: col-resize; +} + +.editor { + composes: -autoSize; + border: 4px solid var(--border-color); + border-radius: 4px; +} + +.output { + composes: -autoSize; +} diff --git a/assets/module.css/pop_button.module.css b/assets/module.css/pop_button.module.css new file mode 100644 index 0000000..cdea226 --- /dev/null +++ b/assets/module.css/pop_button.module.css @@ -0,0 +1,35 @@ +$arrow-height: 10px; +$arrow-width: 20px; + +.container { + z-index: 10; + font-size: var(--secondary-font-size); + + & button:enabled { + cursor: pointer; + } +} + +.arrow { + fill: var(--background-color-high-contrast); +} + +.-content { + margin: $arrow-height; + box-shadow: + 5px 5px 20px -3px rgb(0 0 0 / 25%), + 0 0 5px -2px rgb(0 0 0 / 90%); + border-radius: var(--header-border-radius); + background: var(--background-color-high-contrast); + color: var(--font-color); +} + +.contentBottom { + composes: -content; + margin-top: 0; +} + +.contentTop { + composes: -content; + margin-bottom: 0; +} diff --git a/assets/module.css/selectable_menu_item.module.css b/assets/module.css/selectable_menu_item.module.css new file mode 100644 index 0000000..4cb470e --- /dev/null +++ b/assets/module.css/selectable_menu_item.module.css @@ -0,0 +1,64 @@ +.-buttonReset { + color: var(--font-color); + border: none; + background: inherit; + background-color: transparent; /* IE 11 */ + padding: 0; + font: inherit; + line-height: inherit; + text-align: inherit; +} + +.-menuItemFullButton { + composes: -buttonReset; + transition: color var(--header-transition); + width: 100%; + user-select: text; +} + +.-menuItemTitle { + font-weight: 600; +} + +.container { + composes: -menuItemFullButton; + + &:hover { + color: var(--header-tint); + } +} + +.selected { + composes: container; + color: var(--header-tint); + font-weight: 600; +} + +.header { + display: flex; + align-items: center; +} + +.name { + composes: -menuItemTitle; +} + +.description { + padding-left: 2em; +} + +.checkmark { + opacity: 0; + transition: opacity 0.15s ease-in-out; + margin-right: 0.5em; +} + +.selected .checkmark, +.selected:hover .checkmark { + opacity: 1; +} + +.container:hover .checkmark { + opacity: 0.5; + color: var(--header-tint); +} diff --git a/assets/module.postcss/button_set.module.css b/assets/module.postcss/button_set.module.css new file mode 100644 index 0000000..2e4a27f --- /dev/null +++ b/assets/module.postcss/button_set.module.css @@ -0,0 +1,128 @@ +._-buttonReset_14uvt_4 { + color: var(--font-color); + border: none; + background: inherit; + background-color: transparent; /* IE 11 */ + padding: 0; + font: inherit; + line-height: inherit; + text-align: inherit; +} + +._set_14uvt_15 { + display: flex; +} + +._-border_14uvt_19 { + border-width: 1px 0; + border-style: solid; + + &:first-child { + border-top-left-radius: 4px; + border-bottom-left-radius: 4px; + border-left-width: 1px; + } + + &:last-child { + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; + border-right-width: 1px; + } +} + +._-button_14uvt_4 { + --button-gap: 0.5em; + --button-side-padding: 1.25em; + --button-height: 3em; + --button-side-icon-nudge: 0.25em; + display: grid; + grid-auto-flow: column; + gap: var(--button-gap); + align-content: center; + align-items: center; + padding: 0 var(--button-side-padding); + height: var(--button-height); + font-weight: 600; + text-decoration: none; + text-transform: uppercase; + white-space: nowrap; + + &:enabled { + cursor: pointer; + } +} + +._small_14uvt_60 { + --button-gap: 0.25em; + --button-side-padding: 0.75em; + --button-height: 2.5em; + --button-side-icon-nudge: 0.125em; +} + +._primary_14uvt_67 { + background-color: var(--button-primary-bg-color); + border-color: var(--button-primary-border-color); + color: var(--button-primary-color); + font-weight: 700; + + &:disabled { + background-color: var(--button-primary-bg-color-light); + border-color: var(--button-primary-border-color-light); + } + + &:hover:enabled { + background-color: var(--button-primary-border-color); + } + + &:active:enabled { + box-shadow: inset 0 0 5px var(--button-primary-active-color); + } +} + +._secondary_14uvt_88 { + background: var(--button-secondary-bg-color); + border-color: var(--button-secondary-border-color); + color: var(--button-secondary-color); + + &:disabled { + background: inherit; + background-color: var(--button-secondary-bg-color-light); + border-color: var(--button-secondary-border-color-light); + color: var(--button-secondary-color-light); + } + + &:visited { + color: var(--button-secondary-color); + } + + &:hover:enabled { + background: inherit; + background-color: var(--button-secondary-border-color); + } + + &:active:enabled { + box-shadow: inset 0 0 5px var(--button-secondary-active-color); + } +} + +._iconLeft_14uvt_115 { + transform: translate(calc(-1 * var(--button-side-icon-nudge)), 0); +} + +._iconRight_14uvt_119 { + transform: translate(var(--button-side-icon-nudge), 0); +} + +._rule_14uvt_123 { + background-color: var(--button-secondary-border-color); + width: 1px; + border-color: var(--button-secondary-border-color); +} + +._icon_14uvt_115 { + padding: 0; + aspect-ratio: 1/1; + justify-items: center; +} + +/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL21vZHVsZS5jc3MvYnV0dG9uX3NldC5tb2R1bGUuY3NzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUdBO0VBQ0Usd0JBQXdCO0VBQ3hCLFlBQVk7RUFDWixtQkFBbUI7RUFDbkIsNkJBQTZCLEVBQUUsVUFBVTtFQUN6QyxVQUFVO0VBQ1YsYUFBYTtFQUNiLG9CQUFvQjtFQUNwQixtQkFBbUI7QUFDckI7O0FBRUE7RUFDRSxhQUFhO0FBQ2Y7O0FBRUE7RUFDRSxtQkFBc0I7RUFDdEIsbUJBQW1COztFQUVuQjtJQUNFLDJCQUErQjtJQUMvQiw4QkFBa0M7SUFDbEMsc0JBQXlCO0VBQzNCOztFQUVBO0lBQ0UsNEJBQWdDO0lBQ2hDLCtCQUFtQztJQUNuQyx1QkFBMEI7RUFDNUI7QUFDRjs7QUFFQTtFQUNFLG1CQUFtQjtFQUNuQiw2QkFBNkI7RUFDN0Isb0JBQW9CO0VBQ3BCLGdDQUFnQztFQUdoQyxhQUFhO0VBQ2Isc0JBQXNCO0VBQ3RCLHNCQUFzQjtFQUN0QixxQkFBcUI7RUFDckIsbUJBQW1CO0VBQ25CLHFDQUFxQztFQUNyQyw0QkFBNEI7RUFDNUIsZ0JBQWdCO0VBQ2hCLHFCQUFxQjtFQUNyQix5QkFBeUI7RUFDekIsbUJBQW1COztFQUVuQjtJQUNFLGVBQWU7RUFDakI7QUFDRjs7QUFFQTtFQUNFLG9CQUFvQjtFQUNwQiw2QkFBNkI7RUFDN0Isc0JBQXNCO0VBQ3RCLGlDQUFpQztBQUNuQzs7QUFFQTtFQUVFLGdEQUFnRDtFQUNoRCxnREFBZ0Q7RUFDaEQsa0NBQWtDO0VBQ2xDLGdCQUFnQjs7RUFFaEI7SUFDRSxzREFBc0Q7SUFDdEQsc0RBQXNEO0VBQ3hEOztFQUVBO0lBQ0Usb0RBQW9EO0VBQ3REOztFQUVBO0lBQ0UsNERBQTREO0VBQzlEO0FBQ0Y7O0FBRUE7RUFFRSw0Q0FBNEM7RUFDNUMsa0RBQWtEO0VBQ2xELG9DQUFvQzs7RUFFcEM7SUFDRSxtQkFBbUI7SUFDbkIsd0RBQXdEO0lBQ3hELHdEQUF3RDtJQUN4RCwwQ0FBMEM7RUFDNUM7O0VBRUE7SUFDRSxvQ0FBb0M7RUFDdEM7O0VBRUE7SUFDRSxtQkFBbUI7SUFDbkIsc0RBQXNEO0VBQ3hEOztFQUVBO0lBQ0UsOERBQThEO0VBQ2hFO0FBQ0Y7O0FBRUE7RUFDRSxpRUFBaUU7QUFDbkU7O0FBRUE7RUFDRSxzREFBc0Q7QUFDeEQ7O0FBRUE7RUFFRSxzREFBc0Q7RUFDdEQsVUFBVTtFQUNWLGtEQUFrRDtBQUNwRDs7QUFFQTtFQUVFLFVBQVU7RUFDVixpQkFBaUI7RUFDakIscUJBQXFCO0FBQ3ZCIiwiZmlsZSI6ImJ1dHRvbl9zZXQubW9kdWxlLmNzcyIsInNvdXJjZXNDb250ZW50IjpbIiR3aWR0aDogMXB4O1xuJHJhZGl1czogNHB4O1xuXG4uLWJ1dHRvblJlc2V0IHtcbiAgY29sb3I6IHZhcigtLWZvbnQtY29sb3IpO1xuICBib3JkZXI6IG5vbmU7XG4gIGJhY2tncm91bmQ6IGluaGVyaXQ7XG4gIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50OyAvKiBJRSAxMSAqL1xuICBwYWRkaW5nOiAwO1xuICBmb250OiBpbmhlcml0O1xuICBsaW5lLWhlaWdodDogaW5oZXJpdDtcbiAgdGV4dC1hbGlnbjogaW5oZXJpdDtcbn1cblxuLnNldCB7XG4gIGRpc3BsYXk6IGZsZXg7XG59XG5cbi4tYm9yZGVyIHtcbiAgYm9yZGVyLXdpZHRoOiAkd2lkdGggMDtcbiAgYm9yZGVyLXN0eWxlOiBzb2xpZDtcblxuICAmOmZpcnN0LWNoaWxkIHtcbiAgICBib3JkZXItdG9wLWxlZnQtcmFkaXVzOiAkcmFkaXVzO1xuICAgIGJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6ICRyYWRpdXM7XG4gICAgYm9yZGVyLWxlZnQtd2lkdGg6ICR3aWR0aDtcbiAgfVxuXG4gICY6bGFzdC1jaGlsZCB7XG4gICAgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6ICRyYWRpdXM7XG4gICAgYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6ICRyYWRpdXM7XG4gICAgYm9yZGVyLXJpZ2h0LXdpZHRoOiAkd2lkdGg7XG4gIH1cbn1cblxuLi1idXR0b24ge1xuICAtLWJ1dHRvbi1nYXA6IDAuNWVtO1xuICAtLWJ1dHRvbi1zaWRlLXBhZGRpbmc6IDEuMjVlbTtcbiAgLS1idXR0b24taGVpZ2h0OiAzZW07XG4gIC0tYnV0dG9uLXNpZGUtaWNvbi1udWRnZTogMC4yNWVtO1xuXG4gIGNvbXBvc2VzOiAtYnV0dG9uUmVzZXQ7XG4gIGRpc3BsYXk6IGdyaWQ7XG4gIGdyaWQtYXV0by1mbG93OiBjb2x1bW47XG4gIGdhcDogdmFyKC0tYnV0dG9uLWdhcCk7XG4gIGFsaWduLWNvbnRlbnQ6IGNlbnRlcjtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgcGFkZGluZzogMCB2YXIoLS1idXR0b24tc2lkZS1wYWRkaW5nKTtcbiAgaGVpZ2h0OiB2YXIoLS1idXR0b24taGVpZ2h0KTtcbiAgZm9udC13ZWlnaHQ6IDYwMDtcbiAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xuICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlO1xuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuXG4gICY6ZW5hYmxlZCB7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xuICB9XG59XG5cbi5zbWFsbCB7XG4gIC0tYnV0dG9uLWdhcDogMC4yNWVtO1xuICAtLWJ1dHRvbi1zaWRlLXBhZGRpbmc6IDAuNzVlbTtcbiAgLS1idXR0b24taGVpZ2h0OiAyLjVlbTtcbiAgLS1idXR0b24tc2lkZS1pY29uLW51ZGdlOiAwLjEyNWVtO1xufVxuXG4ucHJpbWFyeSB7XG4gIGNvbXBvc2VzOiAtYm9yZGVyIC1idXR0b247XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWJ1dHRvbi1wcmltYXJ5LWJnLWNvbG9yKTtcbiAgYm9yZGVyLWNvbG9yOiB2YXIoLS1idXR0b24tcHJpbWFyeS1ib3JkZXItY29sb3IpO1xuICBjb2xvcjogdmFyKC0tYnV0dG9uLXByaW1hcnktY29sb3IpO1xuICBmb250LXdlaWdodDogNzAwO1xuXG4gICY6ZGlzYWJsZWQge1xuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWJ1dHRvbi1wcmltYXJ5LWJnLWNvbG9yLWxpZ2h0KTtcbiAgICBib3JkZXItY29sb3I6IHZhcigtLWJ1dHRvbi1wcmltYXJ5LWJvcmRlci1jb2xvci1saWdodCk7XG4gIH1cblxuICAmOmhvdmVyOmVuYWJsZWQge1xuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWJ1dHRvbi1wcmltYXJ5LWJvcmRlci1jb2xvcik7XG4gIH1cblxuICAmOmFjdGl2ZTplbmFibGVkIHtcbiAgICBib3gtc2hhZG93OiBpbnNldCAwIDAgNXB4IHZhcigtLWJ1dHRvbi1wcmltYXJ5LWFjdGl2ZS1jb2xvcik7XG4gIH1cbn1cblxuLnNlY29uZGFyeSB7XG4gIGNvbXBvc2VzOiAtYm9yZGVyIC1idXR0b247XG4gIGJhY2tncm91bmQ6IHZhcigtLWJ1dHRvbi1zZWNvbmRhcnktYmctY29sb3IpO1xuICBib3JkZXItY29sb3I6IHZhcigtLWJ1dHRvbi1zZWNvbmRhcnktYm9yZGVyLWNvbG9yKTtcbiAgY29sb3I6IHZhcigtLWJ1dHRvbi1zZWNvbmRhcnktY29sb3IpO1xuXG4gICY6ZGlzYWJsZWQge1xuICAgIGJhY2tncm91bmQ6IGluaGVyaXQ7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tYnV0dG9uLXNlY29uZGFyeS1iZy1jb2xvci1saWdodCk7XG4gICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1idXR0b24tc2Vjb25kYXJ5LWJvcmRlci1jb2xvci1saWdodCk7XG4gICAgY29sb3I6IHZhcigtLWJ1dHRvbi1zZWNvbmRhcnktY29sb3ItbGlnaHQpO1xuICB9XG5cbiAgJjp2aXNpdGVkIHtcbiAgICBjb2xvcjogdmFyKC0tYnV0dG9uLXNlY29uZGFyeS1jb2xvcik7XG4gIH1cblxuICAmOmhvdmVyOmVuYWJsZWQge1xuICAgIGJhY2tncm91bmQ6IGluaGVyaXQ7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tYnV0dG9uLXNlY29uZGFyeS1ib3JkZXItY29sb3IpO1xuICB9XG5cbiAgJjphY3RpdmU6ZW5hYmxlZCB7XG4gICAgYm94LXNoYWRvdzogaW5zZXQgMCAwIDVweCB2YXIoLS1idXR0b24tc2Vjb25kYXJ5LWFjdGl2ZS1jb2xvcik7XG4gIH1cbn1cblxuLmljb25MZWZ0IHtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoY2FsYygtMSAqIHZhcigtLWJ1dHRvbi1zaWRlLWljb24tbnVkZ2UpKSwgMCk7XG59XG5cbi5pY29uUmlnaHQge1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSh2YXIoLS1idXR0b24tc2lkZS1pY29uLW51ZGdlKSwgMCk7XG59XG5cbi5ydWxlIHtcbiAgY29tcG9zZXM6IC1ib3JkZXI7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWJ1dHRvbi1zZWNvbmRhcnktYm9yZGVyLWNvbG9yKTtcbiAgd2lkdGg6IDFweDtcbiAgYm9yZGVyLWNvbG9yOiB2YXIoLS1idXR0b24tc2Vjb25kYXJ5LWJvcmRlci1jb2xvcik7XG59XG5cbi5pY29uIHtcbiAgY29tcG9zZXM6IHNlY29uZGFyeTtcbiAgcGFkZGluZzogMDtcbiAgYXNwZWN0LXJhdGlvOiAxLzE7XG4gIGp1c3RpZnktaXRlbXM6IGNlbnRlcjtcbn1cbiJdfQ== */ \ No newline at end of file diff --git a/assets/module.postcss/button_set.module.css.map b/assets/module.postcss/button_set.module.css.map new file mode 100644 index 0000000..c3f7583 --- /dev/null +++ b/assets/module.postcss/button_set.module.css.map @@ -0,0 +1 @@ +{"-buttonReset":"_-buttonReset_14uvt_4","set":"_set_14uvt_15","-border":"_-border_14uvt_19","-button":"_-button_14uvt_4 _-buttonReset_14uvt_4","small":"_small_14uvt_60","primary":"_primary_14uvt_67 _-border_14uvt_19 _-button_14uvt_4 _-buttonReset_14uvt_4","secondary":"_secondary_14uvt_88 _-border_14uvt_19 _-button_14uvt_4 _-buttonReset_14uvt_4","iconLeft":"_iconLeft_14uvt_115","iconRight":"_iconRight_14uvt_119","rule":"_rule_14uvt_123 _-border_14uvt_19","icon":"_icon_14uvt_115 _secondary_14uvt_88 _-border_14uvt_19 _-button_14uvt_4 _-buttonReset_14uvt_4"} \ No newline at end of file diff --git a/assets/module.postcss/config_element.module.css b/assets/module.postcss/config_element.module.css new file mode 100644 index 0000000..cb85f8e --- /dev/null +++ b/assets/module.postcss/config_element.module.css @@ -0,0 +1,75 @@ +._container_e4oy5_1 { + display: flex; + align-items: center; +} + +._name_e4oy5_6 { + flex: 1; +} + +._notDefault_e4oy5_10 { + color: var(--header-tint); + font-weight: 600; +} + +._value_e4oy5_16 { + flex: 1; +} + +._select_e4oy5_20 { + width: 100%; + background: var(--button-secondary-bg-color); + border-color: var(--button-secondary-border-color); + color: var(--button-secondary-color); + + & option { + background-color: var(--button-secondary-bg-color-top); + border-color: var(--button-secondary-border-color); + color: var(--button-secondary-color); + } +} + +._toggle_e4oy5_33 { + display: flex; + + & label { + + flex: 1; + cursor: pointer; + border: 1px solid #bbb; + border-right-width: 0; + border-top-left-radius: var(--header-border-radius); + border-bottom-left-radius: var(--header-border-radius); + padding: 0 1em; + color: #777; + font-weight: 600; + text-align: center; + text-transform: uppercase; + + & ~ label { + border-left: 1px solid #bbb; + border-right-width: 1px; + border-radius: 0 var(--header-border-radius) var(--header-border-radius) 0; + } + + &:hover { + background: hsl(208deg 100% 43% / 10%); + } + } + + & input { + display: none; + + &:checked + label { + border-color: var(--header-tint); + background: var(--header-tint); + color: #fff; + + & ~ label { + border-left-width: 0; + } + } + } +} + +/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL21vZHVsZS5jc3MvY29uZmlnX2VsZW1lbnQubW9kdWxlLmNzcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtFQUNFLGFBQWE7RUFDYixtQkFBbUI7QUFDckI7O0FBRUE7RUFDRSxPQUFPO0FBQ1Q7O0FBRUE7RUFFRSx5QkFBeUI7RUFDekIsZ0JBQWdCO0FBQ2xCOztBQUVBO0VBQ0UsT0FBTztBQUNUOztBQUVBO0VBQ0UsV0FBVztFQUNYLDRDQUE0QztFQUM1QyxrREFBa0Q7RUFDbEQsb0NBQW9DOztFQUVwQztJQUNFLHNEQUFzRDtJQUN0RCxrREFBa0Q7SUFDbEQsb0NBQW9DO0VBQ3RDO0FBQ0Y7O0FBRUE7RUFDRSxhQUFhOztFQUViOztJQUdFLE9BQU87SUFDUCxlQUFlO0lBQ2Ysc0JBQWU7SUFDZixxQkFBcUI7SUFDckIsbURBQW1EO0lBQ25ELHNEQUFzRDtJQUN0RCxjQUFjO0lBQ2QsV0FBVztJQUNYLGdCQUFnQjtJQUNoQixrQkFBa0I7SUFDbEIseUJBQXlCOztJQUV6QjtNQUNFLDJCQUFvQjtNQUNwQix1QkFBdUI7TUFDdkIsMEVBQTBFO0lBQzVFOztJQUVBO01BQ0Usc0NBQXNDO0lBQ3hDO0VBQ0Y7O0VBRUE7SUFDRSxhQUFhOztJQUViO01BQ0UsZ0NBQWdDO01BQ2hDLDhCQUE4QjtNQUM5QixXQUFXOztNQUVYO1FBQ0Usb0JBQW9CO01BQ3RCO0lBQ0Y7RUFDRjtBQUNGIiwiZmlsZSI6ImNvbmZpZ19lbGVtZW50Lm1vZHVsZS5jc3MiLCJzb3VyY2VzQ29udGVudCI6WyIuY29udGFpbmVyIHtcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbn1cblxuLm5hbWUge1xuICBmbGV4OiAxO1xufVxuXG4ubm90RGVmYXVsdCB7XG4gIGNvbXBvc2VzOiBuYW1lO1xuICBjb2xvcjogdmFyKC0taGVhZGVyLXRpbnQpO1xuICBmb250LXdlaWdodDogNjAwO1xufVxuXG4udmFsdWUge1xuICBmbGV4OiAxO1xufVxuXG4uc2VsZWN0IHtcbiAgd2lkdGg6IDEwMCU7XG4gIGJhY2tncm91bmQ6IHZhcigtLWJ1dHRvbi1zZWNvbmRhcnktYmctY29sb3IpO1xuICBib3JkZXItY29sb3I6IHZhcigtLWJ1dHRvbi1zZWNvbmRhcnktYm9yZGVyLWNvbG9yKTtcbiAgY29sb3I6IHZhcigtLWJ1dHRvbi1zZWNvbmRhcnktY29sb3IpO1xuXG4gICYgb3B0aW9uIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1idXR0b24tc2Vjb25kYXJ5LWJnLWNvbG9yLXRvcCk7XG4gICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1idXR0b24tc2Vjb25kYXJ5LWJvcmRlci1jb2xvcik7XG4gICAgY29sb3I6IHZhcigtLWJ1dHRvbi1zZWNvbmRhcnktY29sb3IpO1xuICB9XG59XG5cbi50b2dnbGUge1xuICBkaXNwbGF5OiBmbGV4O1xuXG4gICYgbGFiZWwge1xuICAgICRib3JkZXI6IDFweCBzb2xpZCAjYmJiO1xuXG4gICAgZmxleDogMTtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgYm9yZGVyOiAkYm9yZGVyO1xuICAgIGJvcmRlci1yaWdodC13aWR0aDogMDtcbiAgICBib3JkZXItdG9wLWxlZnQtcmFkaXVzOiB2YXIoLS1oZWFkZXItYm9yZGVyLXJhZGl1cyk7XG4gICAgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogdmFyKC0taGVhZGVyLWJvcmRlci1yYWRpdXMpO1xuICAgIHBhZGRpbmc6IDAgMWVtO1xuICAgIGNvbG9yOiAjNzc3O1xuICAgIGZvbnQtd2VpZ2h0OiA2MDA7XG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7XG5cbiAgICAmIH4gbGFiZWwge1xuICAgICAgYm9yZGVyLWxlZnQ6ICRib3JkZXI7XG4gICAgICBib3JkZXItcmlnaHQtd2lkdGg6IDFweDtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDAgdmFyKC0taGVhZGVyLWJvcmRlci1yYWRpdXMpIHZhcigtLWhlYWRlci1ib3JkZXItcmFkaXVzKSAwO1xuICAgIH1cblxuICAgICY6aG92ZXIge1xuICAgICAgYmFja2dyb3VuZDogaHNsKDIwOGRlZyAxMDAlIDQzJSAvIDEwJSk7XG4gICAgfVxuICB9XG5cbiAgJiBpbnB1dCB7XG4gICAgZGlzcGxheTogbm9uZTtcblxuICAgICY6Y2hlY2tlZCArIGxhYmVsIHtcbiAgICAgIGJvcmRlci1jb2xvcjogdmFyKC0taGVhZGVyLXRpbnQpO1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0taGVhZGVyLXRpbnQpO1xuICAgICAgY29sb3I6ICNmZmY7XG5cbiAgICAgICYgfiBsYWJlbCB7XG4gICAgICAgIGJvcmRlci1sZWZ0LXdpZHRoOiAwO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIl19 */ \ No newline at end of file diff --git a/assets/module.postcss/config_element.module.css.map b/assets/module.postcss/config_element.module.css.map new file mode 100644 index 0000000..c6933e2 --- /dev/null +++ b/assets/module.postcss/config_element.module.css.map @@ -0,0 +1 @@ +{"container":"_container_e4oy5_1","name":"_name_e4oy5_6","notDefault":"_notDefault_e4oy5_10 _name_e4oy5_6","value":"_value_e4oy5_16","select":"_select_e4oy5_20","toggle":"_toggle_e4oy5_33"} \ No newline at end of file diff --git a/assets/module.postcss/editor.module.css b/assets/module.postcss/editor.module.css new file mode 100644 index 0000000..7436d6a --- /dev/null +++ b/assets/module.postcss/editor.module.css @@ -0,0 +1,39 @@ +._-autoSize_1m78w_1 { + width: 100%; + min-width: 0; + height: 100%; + min-height: 0; +} + +._-bodyMonospace_1m78w_8 { + font-size: inherit; + line-height: 1.25; + + /* http://code.stephenmorley.org/html-and-css/fixing-browsers-broken-monospace-font-handling/ + * ACE uses Monaco, Menlo, "Ubuntu Mono", Consolas, source-code-pro, monospace; + */ + font-family: 'Source Code Pro', monospace; + font-optical-sizing: auto; +} + +._container_1m78w_19 { + position: relative; +} + +._-advanced_1m78w_24 { + position: absolute; +} + +._ace_1m78w_29 { +} + +._monaco_1m78w_33 { +} + +._simple_1m78w_37 { + border: none; + color: inherit; + background-color: inherit; +} + +/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL21vZHVsZS5jc3MvZWRpdG9yLm1vZHVsZS5jc3MiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7RUFDRSxXQUFXO0VBQ1gsWUFBWTtFQUNaLFlBQVk7RUFDWixhQUFhO0FBQ2Y7O0FBRUE7RUFDRSxrQkFBa0I7RUFDbEIsaUJBQWlCOztFQUVqQjs7SUFFRTtFQUNGLHlDQUF5QztFQUN6Qyx5QkFBeUI7QUFDM0I7O0FBRUE7RUFFRSxrQkFBa0I7QUFDcEI7O0FBRUE7RUFFRSxrQkFBa0I7QUFDcEI7O0FBRUE7QUFFQTs7QUFFQTtBQUVBOztBQUVBO0VBRUUsWUFBWTtFQUNaLGNBQWM7RUFDZCx5QkFBeUI7QUFDM0IiLCJmaWxlIjoiZWRpdG9yLm1vZHVsZS5jc3MiLCJzb3VyY2VzQ29udGVudCI6WyIuLWF1dG9TaXplIHtcbiAgd2lkdGg6IDEwMCU7XG4gIG1pbi13aWR0aDogMDtcbiAgaGVpZ2h0OiAxMDAlO1xuICBtaW4taGVpZ2h0OiAwO1xufVxuXG4uLWJvZHlNb25vc3BhY2Uge1xuICBmb250LXNpemU6IGluaGVyaXQ7XG4gIGxpbmUtaGVpZ2h0OiAxLjI1O1xuXG4gIC8qIGh0dHA6Ly9jb2RlLnN0ZXBoZW5tb3JsZXkub3JnL2h0bWwtYW5kLWNzcy9maXhpbmctYnJvd3NlcnMtYnJva2VuLW1vbm9zcGFjZS1mb250LWhhbmRsaW5nL1xuICAgKiBBQ0UgdXNlcyBNb25hY28sIE1lbmxvLCBcIlVidW50dSBNb25vXCIsIENvbnNvbGFzLCBzb3VyY2UtY29kZS1wcm8sIG1vbm9zcGFjZTtcbiAgICovXG4gIGZvbnQtZmFtaWx5OiAnU291cmNlIENvZGUgUHJvJywgbW9ub3NwYWNlO1xuICBmb250LW9wdGljYWwtc2l6aW5nOiBhdXRvO1xufVxuXG4uY29udGFpbmVyIHtcbiAgY29tcG9zZXM6IC1hdXRvU2l6ZTtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xufVxuXG4uLWFkdmFuY2VkIHtcbiAgY29tcG9zZXM6IC1ib2R5TW9ub3NwYWNlIC1hdXRvU2l6ZTtcbiAgcG9zaXRpb246IGFic29sdXRlO1xufVxuXG4uYWNlIHtcbiAgY29tcG9zZXM6IC1hZHZhbmNlZDtcbn1cblxuLm1vbmFjbyB7XG4gIGNvbXBvc2VzOiAtYWR2YW5jZWQ7XG59XG5cbi5zaW1wbGUge1xuICBjb21wb3NlczogLWFkdmFuY2VkO1xuICBib3JkZXI6IG5vbmU7XG4gIGNvbG9yOiBpbmhlcml0O1xuICBiYWNrZ3JvdW5kLWNvbG9yOiBpbmhlcml0O1xufVxuIl19 */ \ No newline at end of file diff --git a/assets/module.postcss/editor.module.css.map b/assets/module.postcss/editor.module.css.map new file mode 100644 index 0000000..87f8f76 --- /dev/null +++ b/assets/module.postcss/editor.module.css.map @@ -0,0 +1 @@ +{"-autoSize":"_-autoSize_1m78w_1","-bodyMonospace":"_-bodyMonospace_1m78w_8","container":"_container_1m78w_19 _-autoSize_1m78w_1","-advanced":"_-advanced_1m78w_24 _-bodyMonospace_1m78w_8 _-autoSize_1m78w_1","ace":"_ace_1m78w_29 _-advanced_1m78w_24 _-bodyMonospace_1m78w_8 _-autoSize_1m78w_1","monaco":"_monaco_1m78w_33 _-advanced_1m78w_24 _-bodyMonospace_1m78w_8 _-autoSize_1m78w_1","simple":"_simple_1m78w_37 _-advanced_1m78w_24 _-bodyMonospace_1m78w_8 _-autoSize_1m78w_1"} \ No newline at end of file diff --git a/assets/module.postcss/header.module.css b/assets/module.postcss/header.module.css new file mode 100644 index 0000000..a35da7e --- /dev/null +++ b/assets/module.postcss/header.module.css @@ -0,0 +1,14 @@ +._container_qgdhb_1, +._left_qgdhb_2, +._right_qgdhb_3 { + display: flex; + gap: 0.5em; +} + +._container_qgdhb_1 { + font-size: var(--secondary-font-size); + padding: 1.25em 0; + justify-content: space-between; +} + +/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL21vZHVsZS5jc3MvaGVhZGVyLm1vZHVsZS5jc3MiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztFQUdFLGFBQWE7RUFDYixVQUFVO0FBQ1o7O0FBRUE7RUFDRSxxQ0FBcUM7RUFDckMsaUJBQWlCO0VBQ2pCLDhCQUE4QjtBQUNoQyIsImZpbGUiOiJoZWFkZXIubW9kdWxlLmNzcyIsInNvdXJjZXNDb250ZW50IjpbIi5jb250YWluZXIsXG4ubGVmdCxcbi5yaWdodCB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGdhcDogMC41ZW07XG59XG5cbi5jb250YWluZXIge1xuICBmb250LXNpemU6IHZhcigtLXNlY29uZGFyeS1mb250LXNpemUpO1xuICBwYWRkaW5nOiAxLjI1ZW0gMDtcbiAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xufVxuIl19 */ \ No newline at end of file diff --git a/assets/module.postcss/header.module.css.map b/assets/module.postcss/header.module.css.map new file mode 100644 index 0000000..4efc748 --- /dev/null +++ b/assets/module.postcss/header.module.css.map @@ -0,0 +1 @@ +{"container":"_container_qgdhb_1","left":"_left_qgdhb_2","right":"_right_qgdhb_3"} \ No newline at end of file diff --git a/assets/module.postcss/icon.module.css b/assets/module.postcss/icon.module.css new file mode 100644 index 0000000..60efe7c --- /dev/null +++ b/assets/module.postcss/icon.module.css @@ -0,0 +1,6 @@ +._icon_imjug_1 { + fill: currentcolor; + display: block; +} + +/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL21vZHVsZS5jc3MvaWNvbi5tb2R1bGUuY3NzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0VBQ0Usa0JBQWtCO0VBQ2xCLGNBQWM7QUFDaEIiLCJmaWxlIjoiaWNvbi5tb2R1bGUuY3NzIiwic291cmNlc0NvbnRlbnQiOlsiLmljb24ge1xuICBmaWxsOiBjdXJyZW50Y29sb3I7XG4gIGRpc3BsYXk6IGJsb2NrO1xufVxuIl19 */ \ No newline at end of file diff --git a/assets/module.postcss/icon.module.css.map b/assets/module.postcss/icon.module.css.map new file mode 100644 index 0000000..c8df564 --- /dev/null +++ b/assets/module.postcss/icon.module.css.map @@ -0,0 +1 @@ +{"icon":"_icon_imjug_1"} \ No newline at end of file diff --git a/assets/module.postcss/index.module.css b/assets/module.postcss/index.module.css new file mode 100644 index 0000000..b27922f --- /dev/null +++ b/assets/module.postcss/index.module.css @@ -0,0 +1,240 @@ +/* Non-theme variables */ +:root { + /* Fonts */ + --primary-font: 'Open Sans', sans-serif; + --primary-font-size: 18px; + --secondary-font-size: calc(0.75 * var(--primary-font-size)); + + /* Header */ + --header-transition: 0.2s ease-in-out; + --header-border-radius: 4px; + + /* Border */ + --border: 1px solid var(--border-color); +} + +:root, +[data-theme='light']:root { + --positive-luminance: white; + --negative-luminance: black; + /* Fonts */ + --font-color: #444; + --font-color-high-contrast: var(--negative-luminance); + /* Links */ + --link-color: #00e; + --link-color-visited: #551a8b; + /* Background */ + --background-color: #e1e1db; + --background-color-high-contrast: var(--positive-luminance); + /* Code */ + --code-background-color: #eee; + /* Border */ + --border-color: #bbb; + /* Header */ + --header-link-color: var(--negative-luminance); + --header-main-border: #dedede; + --header-tint: #428bca; + --header-accent-border: #bdbdbd; + /* The big red button */ + --button-primary-color: var(--positive-luminance); + --button-primary-bg-color: #a42; + --button-primary-border-color: #80331a; + --button-primary-bg-color-light: color-mix( + in hsl, + var(--button-primary-bg-color), + var(--positive-luminance) + ); + --button-primary-border-color-light: color-mix( + in hsl, + var(--button-primary-border-color), + var(--positive-luminance) + ); + /* Clicked */ + --button-primary-active-color: color-mix( + in hsl, + var(--positive-luminance), + var(--negative-luminance) 30% + ); + /* Not the big red button */ + --button-secondary-color: #444; + --button-secondary-bg-color-top: #fff; + --button-secondary-bg-color-bottom: #f9f9f9; + --button-secondary-bg-color: linear-gradient( + to bottom, + var(--button-secondary-bg-color-top), + var(--button-secondary-bg-color-bottom) + ); + --button-secondary-border-color: color-mix( + in hsl, + var(--button-secondary-bg-color-bottom), + var(--negative-luminance) 20% + ); + /* Disabled */ + --button-secondary-bg-color-light: color-mix( + in hsl, + var(--button-secondary-bg-color-bottom), + var(--positive-luminance) + ); + --button-secondary-border-color-light: color-mix( + in hsl, + var(--button-secondary-border-color), + var(--positive-luminance) + ); + --button-secondary-color-light: color-mix( + in hsl, + var(--button-secondary-color), + var(--positive-luminance) + ); + /* Clicked */ + --button-secondary-active-color: color-mix( + in hsl, + var(--negative-luminance), + var(--positive-luminance) 30% + ); + /* Output tabs */ + --output-background-tab: #fcfcfc; + --output-current-tab: #f9ffff; + /* Output compiler highlighting */ + --output-highlight-warning-color: #f79a06; + --output-highlight-warning-bg-color: inherit; + --output-highlight-error-color: #bf1b1b; + --output-highlight-error-bg-color: inherit; +} + +@media (prefers-color-scheme: dark) { + :root { + --positive-luminance: black; + --negative-luminance: white; + /* Fonts */ + --font-color: #dcdbd8; + --font-color-high-contrast: #dcdbd8; + /* Links */ + --link-color: #b2dcff; + --link-color-visited: #eecaff; + /* Background */ + --background-color: #444; + --background-color-high-contrast: #181818; + /* Code */ + --code-background-color: #3c3c3c; + /* Border */ + --border-color: #5e5e5e; + /* Header */ + --header-main-border: #363b3d; + --header-accent-border: #bdbdbd; + /* The big red button */ + --button-primary-color: #dcdbd8; + --button-primary-bg-color: #5d2310; + --button-primary-border-color: #612714; + /* Not the big red button */ + --button-secondary-color: #dcdbd8; + --button-secondary-bg-color-top: #17191a; + --button-secondary-bg-color-bottom: #1a1c1d; + --button-secondary-border-color: color-mix( + in hsl, + var(--button-secondary-bg-color-bottom), + var(--negative-luminance) 40% + ); + /* Output tabs */ + --output-background-tab: #343434; + --output-current-tab: #191b1c; + /* Output compiler highlighting */ + --output-highlight-warning-color: #ffe800; + --output-highlight-warning-bg-color: #330; + --output-highlight-error-color: #f5f5f5; + --output-highlight-error-bg-color: #820000; + } +} + +[data-theme='dark']:root { + --positive-luminance: black; + --negative-luminance: white; + /* Fonts */ + --font-color: #dcdbd8; + --font-color-high-contrast: #dcdbd8; + /* Links */ + --link-color: #b2dcff; + --link-color-visited: #eecaff; + /* Background */ + --background-color: #444; + --background-color-high-contrast: #181818; + /* Code */ + --code-background-color: #3c3c3c; + /* Border */ + --border-color: #5e5e5e; + /* Header */ + --header-main-border: #363b3d; + --header-accent-border: #bdbdbd; + /* The big red button */ + --button-primary-color: #dcdbd8; + --button-primary-bg-color: #5d2310; + --button-primary-border-color: #612714; + /* Not the big red button */ + --button-secondary-color: #dcdbd8; + --button-secondary-bg-color-top: #17191a; + --button-secondary-bg-color-bottom: #1a1c1d; + --button-secondary-border-color: color-mix( + in hsl, + var(--button-secondary-bg-color-bottom), + var(--negative-luminance) 40% + ); + /* Output tabs */ + --output-background-tab: #343434; + --output-current-tab: #191b1c; + /* Output compiler highlighting */ + --output-highlight-warning-color: #ffe800; + --output-highlight-warning-bg-color: #330; + --output-highlight-error-color: #f5f5f5; + --output-highlight-error-bg-color: #820000; +} + +/* Modify normalized styles */ +button, +input, +optgroup, +select, +textarea { + font-family: var(--primary-font); + font-optical-sizing: auto; +} + +html { + box-sizing: border-box; +} + +a { + color: var(--link-color); +} + +a:visited { + color: var(--link-color-visited); +} + +*, +*::before, +*::after { + box-sizing: inherit; +} + +body { + color: var(--font-color); + background-color: var(--background-color); + padding: 0 1em; + font-family: var(--primary-font); + font-optical-sizing: auto; + font-size: var(--primary-font-size); +} + +/* stylelint-disable-next-line selector-class-pattern */ +.language-rust_errors { + & .warning { + color: var(--output-highlight-warning-color); + background-color: var(--output-highlight-warning-bg-color); + } + + & .error { + color: var(--output-highlight-error-color); + background-color: var(--output-highlight-error-bg-color); + } +} + +/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL21vZHVsZS5jc3MvaW5kZXgubW9kdWxlLmNzcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSx3QkFBd0I7QUFDeEI7RUFDRSxVQUFVO0VBQ1YsdUNBQXVDO0VBQ3ZDLHlCQUF5QjtFQUN6Qiw0REFBNEQ7O0VBRTVELFdBQVc7RUFDWCxxQ0FBcUM7RUFDckMsMkJBQTJCOztFQUUzQixXQUFXO0VBQ1gsdUNBQXVDO0FBQ3pDOztBQTBKQTs7RUF2SkUsMkJBQTJCO0VBQzNCLDJCQUEyQjtFQUUzQixVQUFVO0VBQ1Ysa0JBQWtCO0VBQ2xCLHFEQUFxRDtFQUVyRCxVQUFVO0VBQ1Ysa0JBQWtCO0VBQ2xCLDZCQUE2QjtFQUU3QixlQUFlO0VBQ2YsMkJBQTJCO0VBQzNCLDJEQUEyRDtFQUUzRCxTQUFTO0VBQ1QsNkJBQTZCO0VBRTdCLFdBQVc7RUFDWCxvQkFBb0I7RUFFcEIsV0FBVztFQUNYLDhDQUE4QztFQUM5Qyw2QkFBNkI7RUFDN0Isc0JBQXNCO0VBQ3RCLCtCQUErQjtFQUUvQix1QkFBdUI7RUFDdkIsaURBQWlEO0VBQ2pELCtCQUErQjtFQUMvQixzQ0FBc0M7RUFDdEM7Ozs7R0FJQztFQUNEOzs7O0dBSUM7RUFFRCxZQUFZO0VBQ1o7Ozs7R0FJQztFQUVELDJCQUEyQjtFQUMzQiw4QkFBOEI7RUFDOUIscUNBQXFDO0VBQ3JDLDJDQUEyQztFQUMzQzs7OztHQUlDO0VBQ0Q7Ozs7R0FJQztFQUVELGFBQWE7RUFDYjs7OztHQUlDO0VBQ0Q7Ozs7R0FJQztFQUNEOzs7O0dBSUM7RUFFRCxZQUFZO0VBQ1o7Ozs7R0FJQztFQUVELGdCQUFnQjtFQUNoQixnQ0FBZ0M7RUFDaEMsNkJBQTZCO0VBRTdCLGlDQUFpQztFQUNqQyx5Q0FBeUM7RUFDekMsNENBQTRDO0VBQzVDLHVDQUF1QztFQUN2QywwQ0FBMEM7QUEwRDVDOztBQUVBO0VBQ0U7SUF6REEsMkJBQTJCO0lBQzNCLDJCQUEyQjtJQUUzQixVQUFVO0lBQ1YscUJBQXFCO0lBQ3JCLG1DQUFtQztJQUVuQyxVQUFVO0lBQ1YscUJBQXFCO0lBQ3JCLDZCQUE2QjtJQUU3QixlQUFlO0lBQ2Ysd0JBQXdCO0lBQ3hCLHlDQUF5QztJQUV6QyxTQUFTO0lBQ1QsZ0NBQWdDO0lBRWhDLFdBQVc7SUFDWCx1QkFBdUI7SUFFdkIsV0FBVztJQUNYLDZCQUE2QjtJQUM3QiwrQkFBK0I7SUFFL0IsdUJBQXVCO0lBQ3ZCLCtCQUErQjtJQUMvQixrQ0FBa0M7SUFDbEMsc0NBQXNDO0lBRXRDLDJCQUEyQjtJQUMzQixpQ0FBaUM7SUFDakMsd0NBQXdDO0lBQ3hDLDJDQUEyQztJQUMzQzs7OztHQUlDO0lBRUQsZ0JBQWdCO0lBQ2hCLGdDQUFnQztJQUNoQyw2QkFBNkI7SUFFN0IsaUNBQWlDO0lBQ2pDLHlDQUF5QztJQUN6Qyx5Q0FBeUM7SUFDekMsdUNBQXVDO0lBQ3ZDLDBDQUEwQztFQVcxQztBQUNGOztBQUVBO0VBOURFLDJCQUEyQjtFQUMzQiwyQkFBMkI7RUFFM0IsVUFBVTtFQUNWLHFCQUFxQjtFQUNyQixtQ0FBbUM7RUFFbkMsVUFBVTtFQUNWLHFCQUFxQjtFQUNyQiw2QkFBNkI7RUFFN0IsZUFBZTtFQUNmLHdCQUF3QjtFQUN4Qix5Q0FBeUM7RUFFekMsU0FBUztFQUNULGdDQUFnQztFQUVoQyxXQUFXO0VBQ1gsdUJBQXVCO0VBRXZCLFdBQVc7RUFDWCw2QkFBNkI7RUFDN0IsK0JBQStCO0VBRS9CLHVCQUF1QjtFQUN2QiwrQkFBK0I7RUFDL0Isa0NBQWtDO0VBQ2xDLHNDQUFzQztFQUV0QywyQkFBMkI7RUFDM0IsaUNBQWlDO0VBQ2pDLHdDQUF3QztFQUN4QywyQ0FBMkM7RUFDM0M7Ozs7R0FJQztFQUVELGdCQUFnQjtFQUNoQixnQ0FBZ0M7RUFDaEMsNkJBQTZCO0VBRTdCLGlDQUFpQztFQUNqQyx5Q0FBeUM7RUFDekMseUNBQXlDO0VBQ3pDLHVDQUF1QztFQUN2QywwQ0FBMEM7QUFnQjVDOztBQUVBLDZCQUE2QjtBQUM3Qjs7Ozs7RUFLRSxnQ0FBZ0M7RUFDaEMseUJBQXlCO0FBQzNCOztBQUVBO0VBQ0Usc0JBQXNCO0FBQ3hCOztBQUVBO0VBQ0Usd0JBQXdCO0FBQzFCOztBQUVBO0VBQ0UsZ0NBQWdDO0FBQ2xDOztBQUVBOzs7RUFHRSxtQkFBbUI7QUFDckI7O0FBRUE7RUFDRSx3QkFBd0I7RUFDeEIseUNBQXlDO0VBQ3pDLGNBQWM7RUFDZCxnQ0FBZ0M7RUFDaEMseUJBQXlCO0VBQ3pCLG1DQUFtQztBQUNyQzs7QUFFQSx1REFBdUQ7QUFDdkQ7RUFDRTtJQUNFLDRDQUE0QztJQUM1QywwREFBMEQ7RUFDNUQ7O0VBRUE7SUFDRSwwQ0FBMEM7SUFDMUMsd0RBQXdEO0VBQzFEO0FBQ0YiLCJmaWxlIjoiaW5kZXgubW9kdWxlLmNzcyIsInNvdXJjZXNDb250ZW50IjpbIi8qIE5vbi10aGVtZSB2YXJpYWJsZXMgKi9cbjpyb290IHtcbiAgLyogRm9udHMgKi9cbiAgLS1wcmltYXJ5LWZvbnQ6ICdPcGVuIFNhbnMnLCBzYW5zLXNlcmlmO1xuICAtLXByaW1hcnktZm9udC1zaXplOiAxOHB4O1xuICAtLXNlY29uZGFyeS1mb250LXNpemU6IGNhbGMoMC43NSAqIHZhcigtLXByaW1hcnktZm9udC1zaXplKSk7XG5cbiAgLyogSGVhZGVyICovXG4gIC0taGVhZGVyLXRyYW5zaXRpb246IDAuMnMgZWFzZS1pbi1vdXQ7XG4gIC0taGVhZGVyLWJvcmRlci1yYWRpdXM6IDRweDtcblxuICAvKiBCb3JkZXIgKi9cbiAgLS1ib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXItY29sb3IpO1xufVxuXG5AZGVmaW5lLW1peGluIGxpZ2h0LXRoZW1lLXZhcnMge1xuICAtLXBvc2l0aXZlLWx1bWluYW5jZTogd2hpdGU7XG4gIC0tbmVnYXRpdmUtbHVtaW5hbmNlOiBibGFjaztcblxuICAvKiBGb250cyAqL1xuICAtLWZvbnQtY29sb3I6ICM0NDQ7XG4gIC0tZm9udC1jb2xvci1oaWdoLWNvbnRyYXN0OiB2YXIoLS1uZWdhdGl2ZS1sdW1pbmFuY2UpO1xuXG4gIC8qIExpbmtzICovXG4gIC0tbGluay1jb2xvcjogIzAwZTtcbiAgLS1saW5rLWNvbG9yLXZpc2l0ZWQ6ICM1NTFhOGI7XG5cbiAgLyogQmFja2dyb3VuZCAqL1xuICAtLWJhY2tncm91bmQtY29sb3I6ICNlMWUxZGI7XG4gIC0tYmFja2dyb3VuZC1jb2xvci1oaWdoLWNvbnRyYXN0OiB2YXIoLS1wb3NpdGl2ZS1sdW1pbmFuY2UpO1xuXG4gIC8qIENvZGUgKi9cbiAgLS1jb2RlLWJhY2tncm91bmQtY29sb3I6ICNlZWU7XG5cbiAgLyogQm9yZGVyICovXG4gIC0tYm9yZGVyLWNvbG9yOiAjYmJiO1xuXG4gIC8qIEhlYWRlciAqL1xuICAtLWhlYWRlci1saW5rLWNvbG9yOiB2YXIoLS1uZWdhdGl2ZS1sdW1pbmFuY2UpO1xuICAtLWhlYWRlci1tYWluLWJvcmRlcjogI2RlZGVkZTtcbiAgLS1oZWFkZXItdGludDogIzQyOGJjYTtcbiAgLS1oZWFkZXItYWNjZW50LWJvcmRlcjogI2JkYmRiZDtcblxuICAvKiBUaGUgYmlnIHJlZCBidXR0b24gKi9cbiAgLS1idXR0b24tcHJpbWFyeS1jb2xvcjogdmFyKC0tcG9zaXRpdmUtbHVtaW5hbmNlKTtcbiAgLS1idXR0b24tcHJpbWFyeS1iZy1jb2xvcjogI2E0MjtcbiAgLS1idXR0b24tcHJpbWFyeS1ib3JkZXItY29sb3I6ICM4MDMzMWE7XG4gIC0tYnV0dG9uLXByaW1hcnktYmctY29sb3ItbGlnaHQ6IGNvbG9yLW1peChcbiAgICBpbiBoc2wsXG4gICAgdmFyKC0tYnV0dG9uLXByaW1hcnktYmctY29sb3IpLFxuICAgIHZhcigtLXBvc2l0aXZlLWx1bWluYW5jZSlcbiAgKTtcbiAgLS1idXR0b24tcHJpbWFyeS1ib3JkZXItY29sb3ItbGlnaHQ6IGNvbG9yLW1peChcbiAgICBpbiBoc2wsXG4gICAgdmFyKC0tYnV0dG9uLXByaW1hcnktYm9yZGVyLWNvbG9yKSxcbiAgICB2YXIoLS1wb3NpdGl2ZS1sdW1pbmFuY2UpXG4gICk7XG5cbiAgLyogQ2xpY2tlZCAqL1xuICAtLWJ1dHRvbi1wcmltYXJ5LWFjdGl2ZS1jb2xvcjogY29sb3ItbWl4KFxuICAgIGluIGhzbCxcbiAgICB2YXIoLS1wb3NpdGl2ZS1sdW1pbmFuY2UpLFxuICAgIHZhcigtLW5lZ2F0aXZlLWx1bWluYW5jZSkgMzAlXG4gICk7XG5cbiAgLyogTm90IHRoZSBiaWcgcmVkIGJ1dHRvbiAqL1xuICAtLWJ1dHRvbi1zZWNvbmRhcnktY29sb3I6ICM0NDQ7XG4gIC0tYnV0dG9uLXNlY29uZGFyeS1iZy1jb2xvci10b3A6ICNmZmY7XG4gIC0tYnV0dG9uLXNlY29uZGFyeS1iZy1jb2xvci1ib3R0b206ICNmOWY5Zjk7XG4gIC0tYnV0dG9uLXNlY29uZGFyeS1iZy1jb2xvcjogbGluZWFyLWdyYWRpZW50KFxuICAgIHRvIGJvdHRvbSxcbiAgICB2YXIoLS1idXR0b24tc2Vjb25kYXJ5LWJnLWNvbG9yLXRvcCksXG4gICAgdmFyKC0tYnV0dG9uLXNlY29uZGFyeS1iZy1jb2xvci1ib3R0b20pXG4gICk7XG4gIC0tYnV0dG9uLXNlY29uZGFyeS1ib3JkZXItY29sb3I6IGNvbG9yLW1peChcbiAgICBpbiBoc2wsXG4gICAgdmFyKC0tYnV0dG9uLXNlY29uZGFyeS1iZy1jb2xvci1ib3R0b20pLFxuICAgIHZhcigtLW5lZ2F0aXZlLWx1bWluYW5jZSkgMjAlXG4gICk7XG5cbiAgLyogRGlzYWJsZWQgKi9cbiAgLS1idXR0b24tc2Vjb25kYXJ5LWJnLWNvbG9yLWxpZ2h0OiBjb2xvci1taXgoXG4gICAgaW4gaHNsLFxuICAgIHZhcigtLWJ1dHRvbi1zZWNvbmRhcnktYmctY29sb3ItYm90dG9tKSxcbiAgICB2YXIoLS1wb3NpdGl2ZS1sdW1pbmFuY2UpXG4gICk7XG4gIC0tYnV0dG9uLXNlY29uZGFyeS1ib3JkZXItY29sb3ItbGlnaHQ6IGNvbG9yLW1peChcbiAgICBpbiBoc2wsXG4gICAgdmFyKC0tYnV0dG9uLXNlY29uZGFyeS1ib3JkZXItY29sb3IpLFxuICAgIHZhcigtLXBvc2l0aXZlLWx1bWluYW5jZSlcbiAgKTtcbiAgLS1idXR0b24tc2Vjb25kYXJ5LWNvbG9yLWxpZ2h0OiBjb2xvci1taXgoXG4gICAgaW4gaHNsLFxuICAgIHZhcigtLWJ1dHRvbi1zZWNvbmRhcnktY29sb3IpLFxuICAgIHZhcigtLXBvc2l0aXZlLWx1bWluYW5jZSlcbiAgKTtcblxuICAvKiBDbGlja2VkICovXG4gIC0tYnV0dG9uLXNlY29uZGFyeS1hY3RpdmUtY29sb3I6IGNvbG9yLW1peChcbiAgICBpbiBoc2wsXG4gICAgdmFyKC0tbmVnYXRpdmUtbHVtaW5hbmNlKSxcbiAgICB2YXIoLS1wb3NpdGl2ZS1sdW1pbmFuY2UpIDMwJVxuICApO1xuXG4gIC8qIE91dHB1dCB0YWJzICovXG4gIC0tb3V0cHV0LWJhY2tncm91bmQtdGFiOiAjZmNmY2ZjO1xuICAtLW91dHB1dC1jdXJyZW50LXRhYjogI2Y5ZmZmZjtcblxuICAvKiBPdXRwdXQgY29tcGlsZXIgaGlnaGxpZ2h0aW5nICovXG4gIC0tb3V0cHV0LWhpZ2hsaWdodC13YXJuaW5nLWNvbG9yOiAjZjc5YTA2O1xuICAtLW91dHB1dC1oaWdobGlnaHQtd2FybmluZy1iZy1jb2xvcjogaW5oZXJpdDtcbiAgLS1vdXRwdXQtaGlnaGxpZ2h0LWVycm9yLWNvbG9yOiAjYmYxYjFiO1xuICAtLW91dHB1dC1oaWdobGlnaHQtZXJyb3ItYmctY29sb3I6IGluaGVyaXQ7XG59XG5cbkBkZWZpbmUtbWl4aW4gZGFyay10aGVtZS12YXJzIHtcbiAgLS1wb3NpdGl2ZS1sdW1pbmFuY2U6IGJsYWNrO1xuICAtLW5lZ2F0aXZlLWx1bWluYW5jZTogd2hpdGU7XG5cbiAgLyogRm9udHMgKi9cbiAgLS1mb250LWNvbG9yOiAjZGNkYmQ4O1xuICAtLWZvbnQtY29sb3ItaGlnaC1jb250cmFzdDogI2RjZGJkODtcblxuICAvKiBMaW5rcyAqL1xuICAtLWxpbmstY29sb3I6ICNiMmRjZmY7XG4gIC0tbGluay1jb2xvci12aXNpdGVkOiAjZWVjYWZmO1xuXG4gIC8qIEJhY2tncm91bmQgKi9cbiAgLS1iYWNrZ3JvdW5kLWNvbG9yOiAjNDQ0O1xuICAtLWJhY2tncm91bmQtY29sb3ItaGlnaC1jb250cmFzdDogIzE4MTgxODtcblxuICAvKiBDb2RlICovXG4gIC0tY29kZS1iYWNrZ3JvdW5kLWNvbG9yOiAjM2MzYzNjO1xuXG4gIC8qIEJvcmRlciAqL1xuICAtLWJvcmRlci1jb2xvcjogIzVlNWU1ZTtcblxuICAvKiBIZWFkZXIgKi9cbiAgLS1oZWFkZXItbWFpbi1ib3JkZXI6ICMzNjNiM2Q7XG4gIC0taGVhZGVyLWFjY2VudC1ib3JkZXI6ICNiZGJkYmQ7XG5cbiAgLyogVGhlIGJpZyByZWQgYnV0dG9uICovXG4gIC0tYnV0dG9uLXByaW1hcnktY29sb3I6ICNkY2RiZDg7XG4gIC0tYnV0dG9uLXByaW1hcnktYmctY29sb3I6ICM1ZDIzMTA7XG4gIC0tYnV0dG9uLXByaW1hcnktYm9yZGVyLWNvbG9yOiAjNjEyNzE0O1xuXG4gIC8qIE5vdCB0aGUgYmlnIHJlZCBidXR0b24gKi9cbiAgLS1idXR0b24tc2Vjb25kYXJ5LWNvbG9yOiAjZGNkYmQ4O1xuICAtLWJ1dHRvbi1zZWNvbmRhcnktYmctY29sb3ItdG9wOiAjMTcxOTFhO1xuICAtLWJ1dHRvbi1zZWNvbmRhcnktYmctY29sb3ItYm90dG9tOiAjMWExYzFkO1xuICAtLWJ1dHRvbi1zZWNvbmRhcnktYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoXG4gICAgaW4gaHNsLFxuICAgIHZhcigtLWJ1dHRvbi1zZWNvbmRhcnktYmctY29sb3ItYm90dG9tKSxcbiAgICB2YXIoLS1uZWdhdGl2ZS1sdW1pbmFuY2UpIDQwJVxuICApO1xuXG4gIC8qIE91dHB1dCB0YWJzICovXG4gIC0tb3V0cHV0LWJhY2tncm91bmQtdGFiOiAjMzQzNDM0O1xuICAtLW91dHB1dC1jdXJyZW50LXRhYjogIzE5MWIxYztcblxuICAvKiBPdXRwdXQgY29tcGlsZXIgaGlnaGxpZ2h0aW5nICovXG4gIC0tb3V0cHV0LWhpZ2hsaWdodC13YXJuaW5nLWNvbG9yOiAjZmZlODAwO1xuICAtLW91dHB1dC1oaWdobGlnaHQtd2FybmluZy1iZy1jb2xvcjogIzMzMDtcbiAgLS1vdXRwdXQtaGlnaGxpZ2h0LWVycm9yLWNvbG9yOiAjZjVmNWY1O1xuICAtLW91dHB1dC1oaWdobGlnaHQtZXJyb3ItYmctY29sb3I6ICM4MjAwMDA7XG59XG5cbjpyb290LFxuW2RhdGEtdGhlbWU9J2xpZ2h0J106cm9vdCB7XG4gIEBtaXhpbiBsaWdodC10aGVtZS12YXJzO1xufVxuXG5AbWVkaWEgKHByZWZlcnMtY29sb3Itc2NoZW1lOiBkYXJrKSB7XG4gIDpyb290IHtcbiAgICBAbWl4aW4gZGFyay10aGVtZS12YXJzO1xuICB9XG59XG5cbltkYXRhLXRoZW1lPSdkYXJrJ106cm9vdCB7XG4gIEBtaXhpbiBkYXJrLXRoZW1lLXZhcnM7XG59XG5cbi8qIE1vZGlmeSBub3JtYWxpemVkIHN0eWxlcyAqL1xuYnV0dG9uLFxuaW5wdXQsXG5vcHRncm91cCxcbnNlbGVjdCxcbnRleHRhcmVhIHtcbiAgZm9udC1mYW1pbHk6IHZhcigtLXByaW1hcnktZm9udCk7XG4gIGZvbnQtb3B0aWNhbC1zaXppbmc6IGF1dG87XG59XG5cbmh0bWwge1xuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xufVxuXG5hIHtcbiAgY29sb3I6IHZhcigtLWxpbmstY29sb3IpO1xufVxuXG5hOnZpc2l0ZWQge1xuICBjb2xvcjogdmFyKC0tbGluay1jb2xvci12aXNpdGVkKTtcbn1cblxuKixcbio6OmJlZm9yZSxcbio6OmFmdGVyIHtcbiAgYm94LXNpemluZzogaW5oZXJpdDtcbn1cblxuYm9keSB7XG4gIGNvbG9yOiB2YXIoLS1mb250LWNvbG9yKTtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tYmFja2dyb3VuZC1jb2xvcik7XG4gIHBhZGRpbmc6IDAgMWVtO1xuICBmb250LWZhbWlseTogdmFyKC0tcHJpbWFyeS1mb250KTtcbiAgZm9udC1vcHRpY2FsLXNpemluZzogYXV0bztcbiAgZm9udC1zaXplOiB2YXIoLS1wcmltYXJ5LWZvbnQtc2l6ZSk7XG59XG5cbi8qIHN0eWxlbGludC1kaXNhYmxlLW5leHQtbGluZSBzZWxlY3Rvci1jbGFzcy1wYXR0ZXJuICovXG46Z2xvYmFsKC5sYW5ndWFnZS1ydXN0X2Vycm9ycykge1xuICAmIDpnbG9iYWwoLndhcm5pbmcpIHtcbiAgICBjb2xvcjogdmFyKC0tb3V0cHV0LWhpZ2hsaWdodC13YXJuaW5nLWNvbG9yKTtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1vdXRwdXQtaGlnaGxpZ2h0LXdhcm5pbmctYmctY29sb3IpO1xuICB9XG5cbiAgJiA6Z2xvYmFsKC5lcnJvcikge1xuICAgIGNvbG9yOiB2YXIoLS1vdXRwdXQtaGlnaGxpZ2h0LWVycm9yLWNvbG9yKTtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1vdXRwdXQtaGlnaGxpZ2h0LWVycm9yLWJnLWNvbG9yKTtcbiAgfVxufVxuIl19 */ \ No newline at end of file diff --git a/assets/module.postcss/index.module.css.map b/assets/module.postcss/index.module.css.map new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/assets/module.postcss/index.module.css.map @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/assets/module.postcss/loader.module.css b/assets/module.postcss/loader.module.css new file mode 100644 index 0000000..6a9ec37 --- /dev/null +++ b/assets/module.postcss/loader.module.css @@ -0,0 +1,25 @@ +@keyframes _loader-fade_jthdv_1 { + 0% { + opacity: 0; + } + + 75% { + opacity: 1; + } +} + +._dot_jthdv_11 { + opacity: 0; + animation: _loader-fade_jthdv_1 1s; + animation-iteration-count: infinite; + + &:nth-child(2) { + animation-delay: 0.2s; + } + + &:nth-child(3) { + animation-delay: 0.4s; + } +} + +/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL21vZHVsZS5jc3MvbG9hZGVyLm1vZHVsZS5jc3MiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7RUFDRTtJQUNFLFVBQVU7RUFDWjs7RUFFQTtJQUNFLFVBQVU7RUFDWjtBQUNGOztBQUVBO0VBQ0UsVUFBVTtFQUNWLGtDQUF5QjtFQUN6QixtQ0FBbUM7O0VBRW5DO0lBQ0UscUJBQXFCO0VBQ3ZCOztFQUVBO0lBQ0UscUJBQXFCO0VBQ3ZCO0FBQ0YiLCJmaWxlIjoibG9hZGVyLm1vZHVsZS5jc3MiLCJzb3VyY2VzQ29udGVudCI6WyJAa2V5ZnJhbWVzIGxvYWRlci1mYWRlIHtcbiAgMCUge1xuICAgIG9wYWNpdHk6IDA7XG4gIH1cblxuICA3NSUge1xuICAgIG9wYWNpdHk6IDE7XG4gIH1cbn1cblxuLmRvdCB7XG4gIG9wYWNpdHk6IDA7XG4gIGFuaW1hdGlvbjogbG9hZGVyLWZhZGUgMXM7XG4gIGFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6IGluZmluaXRlO1xuXG4gICY6bnRoLWNoaWxkKDIpIHtcbiAgICBhbmltYXRpb24tZGVsYXk6IDAuMnM7XG4gIH1cblxuICAmOm50aC1jaGlsZCgzKSB7XG4gICAgYW5pbWF0aW9uLWRlbGF5OiAwLjRzO1xuICB9XG59XG4iXX0= */ \ No newline at end of file diff --git a/assets/module.postcss/loader.module.css.map b/assets/module.postcss/loader.module.css.map new file mode 100644 index 0000000..a8178f6 --- /dev/null +++ b/assets/module.postcss/loader.module.css.map @@ -0,0 +1 @@ +{"dot":"_dot_jthdv_11","loader-fade":"_loader-fade_jthdv_1"} \ No newline at end of file diff --git a/assets/module.postcss/menu_group.module.css b/assets/module.postcss/menu_group.module.css new file mode 100644 index 0000000..1862dc4 --- /dev/null +++ b/assets/module.postcss/menu_group.module.css @@ -0,0 +1,24 @@ +._container_18py9_1 { + padding: 0.75em 1em 0; + width: 27em; + line-height: normal; + + &:last-child { + padding-bottom: 0.75em; + } +} + +._title_18py9_11 { + margin: 0; + border-bottom: 1px solid var(--header-main-border); + padding-bottom: 10px; + font-weight: 700; + font-size: var(--secondary-font-size); + text-transform: uppercase; +} + +._content_18py9_20 { + padding: 1em 0.25em; +} + +/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL21vZHVsZS5jc3MvbWVudV9ncm91cC5tb2R1bGUuY3NzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0VBQ0UscUJBQXFCO0VBQ3JCLFdBQVc7RUFDWCxtQkFBbUI7O0VBRW5CO0lBQ0Usc0JBQXNCO0VBQ3hCO0FBQ0Y7O0FBRUE7RUFDRSxTQUFTO0VBQ1Qsa0RBQWtEO0VBQ2xELG9CQUFvQjtFQUNwQixnQkFBZ0I7RUFDaEIscUNBQXFDO0VBQ3JDLHlCQUF5QjtBQUMzQjs7QUFFQTtFQUNFLG1CQUFtQjtBQUNyQiIsImZpbGUiOiJtZW51X2dyb3VwLm1vZHVsZS5jc3MiLCJzb3VyY2VzQ29udGVudCI6WyIuY29udGFpbmVyIHtcbiAgcGFkZGluZzogMC43NWVtIDFlbSAwO1xuICB3aWR0aDogMjdlbTtcbiAgbGluZS1oZWlnaHQ6IG5vcm1hbDtcblxuICAmOmxhc3QtY2hpbGQge1xuICAgIHBhZGRpbmctYm90dG9tOiAwLjc1ZW07XG4gIH1cbn1cblxuLnRpdGxlIHtcbiAgbWFyZ2luOiAwO1xuICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0taGVhZGVyLW1haW4tYm9yZGVyKTtcbiAgcGFkZGluZy1ib3R0b206IDEwcHg7XG4gIGZvbnQtd2VpZ2h0OiA3MDA7XG4gIGZvbnQtc2l6ZTogdmFyKC0tc2Vjb25kYXJ5LWZvbnQtc2l6ZSk7XG4gIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7XG59XG5cbi5jb250ZW50IHtcbiAgcGFkZGluZzogMWVtIDAuMjVlbTtcbn1cbiJdfQ== */ \ No newline at end of file diff --git a/assets/module.postcss/menu_group.module.css.map b/assets/module.postcss/menu_group.module.css.map new file mode 100644 index 0000000..d104378 --- /dev/null +++ b/assets/module.postcss/menu_group.module.css.map @@ -0,0 +1 @@ +{"container":"_container_18py9_1","title":"_title_18py9_11","content":"_content_18py9_20"} \ No newline at end of file diff --git a/assets/module.postcss/menu_item.module.css b/assets/module.postcss/menu_item.module.css new file mode 100644 index 0000000..5ab3286 --- /dev/null +++ b/assets/module.postcss/menu_item.module.css @@ -0,0 +1,9 @@ +._container_1i3fr_1 { + margin-bottom: 1em; + + &:last-child { + margin-bottom: 0; + } +} + +/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL21vZHVsZS5jc3MvbWVudV9pdGVtLm1vZHVsZS5jc3MiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7RUFDRSxrQkFBa0I7O0VBRWxCO0lBQ0UsZ0JBQWdCO0VBQ2xCO0FBQ0YiLCJmaWxlIjoibWVudV9pdGVtLm1vZHVsZS5jc3MiLCJzb3VyY2VzQ29udGVudCI6WyIuY29udGFpbmVyIHtcbiAgbWFyZ2luLWJvdHRvbTogMWVtO1xuXG4gICY6bGFzdC1jaGlsZCB7XG4gICAgbWFyZ2luLWJvdHRvbTogMDtcbiAgfVxufVxuIl19 */ \ No newline at end of file diff --git a/assets/module.postcss/menu_item.module.css.map b/assets/module.postcss/menu_item.module.css.map new file mode 100644 index 0000000..2b2d318 --- /dev/null +++ b/assets/module.postcss/menu_item.module.css.map @@ -0,0 +1 @@ +{"container":"_container_1i3fr_1"} \ No newline at end of file diff --git a/assets/module.postcss/output.module.css b/assets/module.postcss/output.module.css new file mode 100644 index 0000000..9628081 --- /dev/null +++ b/assets/module.postcss/output.module.css @@ -0,0 +1,53 @@ +._container_d1av0_1 { + display: flex; + flex-direction: column; + width: 100%; + height: 100%; +} + +._tabs_d1av0_8 { + display: flex; +} + +._tab_d1av0_8 { + color: var(--font-color); + flex: 1 1 auto; + cursor: pointer; + border: var(--border); + border-right: none; + background-color: var(--output-background-tab); + line-height: 1.5; + + &:last-of-type { + border-right: var(--border); + } +} + +._tabSelected_d1av0_26 { + cursor: default; + border-bottom: none; + background-color: var(--output-current-tab); + + &:focus { + outline: none; + } +} + +._tabClose_d1av0_37 { + flex: 0 0 auto; +} + +._body_d1av0_42 { + border: var(--border); + border-top: none; + background-color: var(--output-current-tab); + padding: 0.5em; + height: 100%; + overflow: scroll; +} + +._stdin_d1av0_51 { + margin-top: 0.25em; +} + +/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL21vZHVsZS5jc3Mvb3V0cHV0Lm1vZHVsZS5jc3MiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7RUFDRSxhQUFhO0VBQ2Isc0JBQXNCO0VBQ3RCLFdBQVc7RUFDWCxZQUFZO0FBQ2Q7O0FBRUE7RUFDRSxhQUFhO0FBQ2Y7O0FBRUE7RUFDRSx3QkFBd0I7RUFDeEIsY0FBYztFQUNkLGVBQWU7RUFDZixxQkFBcUI7RUFDckIsa0JBQWtCO0VBQ2xCLDhDQUE4QztFQUM5QyxnQkFBZ0I7O0VBRWhCO0lBQ0UsMkJBQTJCO0VBQzdCO0FBQ0Y7O0FBRUE7RUFFRSxlQUFlO0VBQ2YsbUJBQW1CO0VBQ25CLDJDQUEyQzs7RUFFM0M7SUFDRSxhQUFhO0VBQ2Y7QUFDRjs7QUFFQTtFQUVFLGNBQWM7QUFDaEI7O0FBRUE7RUFDRSxxQkFBcUI7RUFDckIsZ0JBQWdCO0VBQ2hCLDJDQUEyQztFQUMzQyxjQUFjO0VBQ2QsWUFBWTtFQUNaLGdCQUFnQjtBQUNsQjs7QUFFQTtFQUNFLGtCQUFrQjtBQUNwQiIsImZpbGUiOiJvdXRwdXQubW9kdWxlLmNzcyIsInNvdXJjZXNDb250ZW50IjpbIi5jb250YWluZXIge1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICB3aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiAxMDAlO1xufVxuXG4udGFicyB7XG4gIGRpc3BsYXk6IGZsZXg7XG59XG5cbi50YWIge1xuICBjb2xvcjogdmFyKC0tZm9udC1jb2xvcik7XG4gIGZsZXg6IDEgMSBhdXRvO1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIGJvcmRlcjogdmFyKC0tYm9yZGVyKTtcbiAgYm9yZGVyLXJpZ2h0OiBub25lO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1vdXRwdXQtYmFja2dyb3VuZC10YWIpO1xuICBsaW5lLWhlaWdodDogMS41O1xuXG4gICY6bGFzdC1vZi10eXBlIHtcbiAgICBib3JkZXItcmlnaHQ6IHZhcigtLWJvcmRlcik7XG4gIH1cbn1cblxuLnRhYlNlbGVjdGVkIHtcbiAgY29tcG9zZXM6IHRhYjtcbiAgY3Vyc29yOiBkZWZhdWx0O1xuICBib3JkZXItYm90dG9tOiBub25lO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1vdXRwdXQtY3VycmVudC10YWIpO1xuXG4gICY6Zm9jdXMge1xuICAgIG91dGxpbmU6IG5vbmU7XG4gIH1cbn1cblxuLnRhYkNsb3NlIHtcbiAgY29tcG9zZXM6IHRhYjtcbiAgZmxleDogMCAwIGF1dG87XG59XG5cbi5ib2R5IHtcbiAgYm9yZGVyOiB2YXIoLS1ib3JkZXIpO1xuICBib3JkZXItdG9wOiBub25lO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1vdXRwdXQtY3VycmVudC10YWIpO1xuICBwYWRkaW5nOiAwLjVlbTtcbiAgaGVpZ2h0OiAxMDAlO1xuICBvdmVyZmxvdzogc2Nyb2xsO1xufVxuXG4uc3RkaW4ge1xuICBtYXJnaW4tdG9wOiAwLjI1ZW07XG59XG4iXX0= */ \ No newline at end of file diff --git a/assets/module.postcss/output.module.css.map b/assets/module.postcss/output.module.css.map new file mode 100644 index 0000000..37077d7 --- /dev/null +++ b/assets/module.postcss/output.module.css.map @@ -0,0 +1 @@ +{"container":"_container_d1av0_1","tabs":"_tabs_d1av0_8","tab":"_tab_d1av0_8","tabSelected":"_tabSelected_d1av0_26 _tab_d1av0_8","tabClose":"_tabClose_d1av0_37 _tab_d1av0_8","body":"_body_d1av0_42","stdin":"_stdin_d1av0_51"} \ No newline at end of file diff --git a/assets/module.postcss/output/execute.module.css b/assets/module.postcss/output/execute.module.css new file mode 100644 index 0000000..368e1a3 --- /dev/null +++ b/assets/module.postcss/output/execute.module.css @@ -0,0 +1,32 @@ +._-buttonReset_16ln6_1 { + color: var(--font-color); + border: none; + background: inherit; + background-color: transparent; /* IE 11 */ + padding: 0; + font: inherit; + line-height: inherit; + text-align: inherit; +} + +._-buttonAsLink_16ln6_12 { + cursor: pointer; + color: var(--link-color); + user-select: text; + text-decoration: underline; +} + +._addMain_16ln6_20 { +} + +._table_16ln6_24 { + border-collapse: collapse; +} + +._tdAndTh_16ln6_28 { + border: 1px solid #dddddd; + text-align: left; + padding: 8px; +} + +/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL21vZHVsZS5jc3Mvb3V0cHV0L2V4ZWN1dGUubW9kdWxlLmNzcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtFQUNFLHdCQUF3QjtFQUN4QixZQUFZO0VBQ1osbUJBQW1CO0VBQ25CLDZCQUE2QixFQUFFLFVBQVU7RUFDekMsVUFBVTtFQUNWLGFBQWE7RUFDYixvQkFBb0I7RUFDcEIsbUJBQW1CO0FBQ3JCOztBQUVBO0VBRUUsZUFBZTtFQUNmLHdCQUF3QjtFQUN4QixpQkFBaUI7RUFDakIsMEJBQTBCO0FBQzVCOztBQUVBO0FBRUE7O0FBRUE7RUFDRSx5QkFBeUI7QUFDM0I7O0FBRUE7RUFDRSx5QkFBeUI7RUFDekIsZ0JBQWdCO0VBQ2hCLFlBQVk7QUFDZCIsImZpbGUiOiJleGVjdXRlLm1vZHVsZS5jc3MiLCJzb3VyY2VzQ29udGVudCI6WyIuLWJ1dHRvblJlc2V0IHtcbiAgY29sb3I6IHZhcigtLWZvbnQtY29sb3IpO1xuICBib3JkZXI6IG5vbmU7XG4gIGJhY2tncm91bmQ6IGluaGVyaXQ7XG4gIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50OyAvKiBJRSAxMSAqL1xuICBwYWRkaW5nOiAwO1xuICBmb250OiBpbmhlcml0O1xuICBsaW5lLWhlaWdodDogaW5oZXJpdDtcbiAgdGV4dC1hbGlnbjogaW5oZXJpdDtcbn1cblxuLi1idXR0b25Bc0xpbmsge1xuICBjb21wb3NlczogLWJ1dHRvblJlc2V0O1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIGNvbG9yOiB2YXIoLS1saW5rLWNvbG9yKTtcbiAgdXNlci1zZWxlY3Q6IHRleHQ7XG4gIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lO1xufVxuXG4uYWRkTWFpbiB7XG4gIGNvbXBvc2VzOiAtYnV0dG9uQXNMaW5rO1xufVxuXG4udGFibGUge1xuICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlO1xufVxuXG4udGRBbmRUaCB7XG4gIGJvcmRlcjogMXB4IHNvbGlkICNkZGRkZGQ7XG4gIHRleHQtYWxpZ246IGxlZnQ7XG4gIHBhZGRpbmc6IDhweDtcbn1cbiJdfQ== */ \ No newline at end of file diff --git a/assets/module.postcss/output/execute.module.css.map b/assets/module.postcss/output/execute.module.css.map new file mode 100644 index 0000000..c55559b --- /dev/null +++ b/assets/module.postcss/output/execute.module.css.map @@ -0,0 +1 @@ +{"-buttonReset":"_-buttonReset_16ln6_1","-buttonAsLink":"_-buttonAsLink_16ln6_12 _-buttonReset_16ln6_1","addMain":"_addMain_16ln6_20 _-buttonAsLink_16ln6_12 _-buttonReset_16ln6_1","table":"_table_16ln6_24","tdAndTh":"_tdAndTh_16ln6_28"} \ No newline at end of file diff --git a/assets/module.postcss/output/header.module.css b/assets/module.postcss/output/header.module.css new file mode 100644 index 0000000..6b53b0f --- /dev/null +++ b/assets/module.postcss/output/header.module.css @@ -0,0 +1,23 @@ +._container_knjdr_1 { + display: flex; + color: var(--font-color); + white-space: nowrap; + + &::before, + &::after { + flex: 1 1 auto; + margin: auto; + border-top: var(--border); + content: ''; + } + + &::before { + margin-right: 2%; + } + + &::after { + margin-left: 2%; + } +} + +/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL21vZHVsZS5jc3Mvb3V0cHV0L2hlYWRlci5tb2R1bGUuY3NzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0VBQ0UsYUFBYTtFQUNiLHdCQUF3QjtFQUN4QixtQkFBbUI7O0VBRW5COztJQUVFLGNBQWM7SUFDZCxZQUFZO0lBQ1oseUJBQXlCO0lBQ3pCLFdBQVc7RUFDYjs7RUFFQTtJQUNFLGdCQUFnQjtFQUNsQjs7RUFFQTtJQUNFLGVBQWU7RUFDakI7QUFDRiIsImZpbGUiOiJoZWFkZXIubW9kdWxlLmNzcyIsInNvdXJjZXNDb250ZW50IjpbIi5jb250YWluZXIge1xuICBkaXNwbGF5OiBmbGV4O1xuICBjb2xvcjogdmFyKC0tZm9udC1jb2xvcik7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG5cbiAgJjo6YmVmb3JlLFxuICAmOjphZnRlciB7XG4gICAgZmxleDogMSAxIGF1dG87XG4gICAgbWFyZ2luOiBhdXRvO1xuICAgIGJvcmRlci10b3A6IHZhcigtLWJvcmRlcik7XG4gICAgY29udGVudDogJyc7XG4gIH1cblxuICAmOjpiZWZvcmUge1xuICAgIG1hcmdpbi1yaWdodDogMiU7XG4gIH1cblxuICAmOjphZnRlciB7XG4gICAgbWFyZ2luLWxlZnQ6IDIlO1xuICB9XG59XG4iXX0= */ \ No newline at end of file diff --git a/assets/module.postcss/output/header.module.css.map b/assets/module.postcss/output/header.module.css.map new file mode 100644 index 0000000..10f1458 --- /dev/null +++ b/assets/module.postcss/output/header.module.css.map @@ -0,0 +1 @@ +{"container":"_container_knjdr_1"} \ No newline at end of file diff --git a/assets/module.postcss/output/section.module.css b/assets/module.postcss/output/section.module.css new file mode 100644 index 0000000..5653e47 --- /dev/null +++ b/assets/module.postcss/output/section.module.css @@ -0,0 +1,15 @@ +._-bodyMonospace_1qg95_1 { + font-size: inherit; + line-height: 1.25; + + /* http://code.stephenmorley.org/html-and-css/fixing-browsers-broken-monospace-font-handling/ + * ACE uses Monaco, Menlo, "Ubuntu Mono", Consolas, source-code-pro, monospace; + */ + font-family: 'Source Code Pro', monospace; + font-optical-sizing: auto; +} + +._code_1qg95_12 { +} + +/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL21vZHVsZS5jc3Mvb3V0cHV0L3NlY3Rpb24ubW9kdWxlLmNzcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtFQUNFLGtCQUFrQjtFQUNsQixpQkFBaUI7O0VBRWpCOztJQUVFO0VBQ0YseUNBQXlDO0VBQ3pDLHlCQUF5QjtBQUMzQjs7QUFFQTtBQUVBIiwiZmlsZSI6InNlY3Rpb24ubW9kdWxlLmNzcyIsInNvdXJjZXNDb250ZW50IjpbIi4tYm9keU1vbm9zcGFjZSB7XG4gIGZvbnQtc2l6ZTogaW5oZXJpdDtcbiAgbGluZS1oZWlnaHQ6IDEuMjU7XG5cbiAgLyogaHR0cDovL2NvZGUuc3RlcGhlbm1vcmxleS5vcmcvaHRtbC1hbmQtY3NzL2ZpeGluZy1icm93c2Vycy1icm9rZW4tbW9ub3NwYWNlLWZvbnQtaGFuZGxpbmcvXG4gICAqIEFDRSB1c2VzIE1vbmFjbywgTWVubG8sIFwiVWJ1bnR1IE1vbm9cIiwgQ29uc29sYXMsIHNvdXJjZS1jb2RlLXBybywgbW9ub3NwYWNlO1xuICAgKi9cbiAgZm9udC1mYW1pbHk6ICdTb3VyY2UgQ29kZSBQcm8nLCBtb25vc3BhY2U7XG4gIGZvbnQtb3B0aWNhbC1zaXppbmc6IGF1dG87XG59XG5cbi5jb2RlIHtcbiAgY29tcG9zZXM6IC1ib2R5TW9ub3NwYWNlO1xufVxuIl19 */ \ No newline at end of file diff --git a/assets/module.postcss/output/section.module.css.map b/assets/module.postcss/output/section.module.css.map new file mode 100644 index 0000000..75f74be --- /dev/null +++ b/assets/module.postcss/output/section.module.css.map @@ -0,0 +1 @@ +{"-bodyMonospace":"_-bodyMonospace_1qg95_1","code":"_code_1qg95_12 _-bodyMonospace_1qg95_1"} \ No newline at end of file diff --git a/assets/module.postcss/output/share.module.css b/assets/module.postcss/output/share.module.css new file mode 100644 index 0000000..5c37474 --- /dev/null +++ b/assets/module.postcss/output/share.module.css @@ -0,0 +1,51 @@ +._-buttonReset_ccgtz_1 { + color: var(--font-color); + border: none; + background: inherit; + background-color: transparent; /* IE 11 */ + padding: 0; + font: inherit; + line-height: inherit; + text-align: inherit; +} + +._container_ccgtz_12 { + display: flex; + + --copied-duration: 1s ease-in-out; +} + +._button_ccgtz_18 { + transition: color var(--copied-duration); + cursor: pointer; + margin: 0 0.25em 0 0.5em; +} + +._text_ccgtz_25 { + visibility: hidden; + opacity: 0; + transition: + visibility var(--copied-duration), + opacity var(--copied-duration), + color var(--copied-duration); +} + +._active_ccgtz_34 { + + & ._button_ccgtz_18 { + transition: color 0s; + color: green; + } + + & ._text_ccgtz_25 { + visibility: visible; + opacity: 1; + transition: + visibility 0s, + opacity 0s, + color 0s; + color: green; + } +} + +/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL21vZHVsZS5jc3Mvb3V0cHV0L3NoYXJlLm1vZHVsZS5jc3MiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7RUFDRSx3QkFBd0I7RUFDeEIsWUFBWTtFQUNaLG1CQUFtQjtFQUNuQiw2QkFBNkIsRUFBRSxVQUFVO0VBQ3pDLFVBQVU7RUFDVixhQUFhO0VBQ2Isb0JBQW9CO0VBQ3BCLG1CQUFtQjtBQUNyQjs7QUFFQTtFQUNFLGFBQWE7O0VBRWIsaUNBQWlDO0FBQ25DOztBQUVBO0VBRUUsd0NBQXdDO0VBQ3hDLGVBQWU7RUFDZix3QkFBd0I7QUFDMUI7O0FBRUE7RUFDRSxrQkFBa0I7RUFDbEIsVUFBVTtFQUNWOzs7Z0NBRzhCO0FBQ2hDOztBQUVBOztFQUdFO0lBQ0Usb0JBQW9CO0lBQ3BCLFlBQVk7RUFDZDs7RUFFQTtJQUNFLG1CQUFtQjtJQUNuQixVQUFVO0lBQ1Y7OztjQUdVO0lBQ1YsWUFBWTtFQUNkO0FBQ0YiLCJmaWxlIjoic2hhcmUubW9kdWxlLmNzcyIsInNvdXJjZXNDb250ZW50IjpbIi4tYnV0dG9uUmVzZXQge1xuICBjb2xvcjogdmFyKC0tZm9udC1jb2xvcik7XG4gIGJvcmRlcjogbm9uZTtcbiAgYmFja2dyb3VuZDogaW5oZXJpdDtcbiAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7IC8qIElFIDExICovXG4gIHBhZGRpbmc6IDA7XG4gIGZvbnQ6IGluaGVyaXQ7XG4gIGxpbmUtaGVpZ2h0OiBpbmhlcml0O1xuICB0ZXh0LWFsaWduOiBpbmhlcml0O1xufVxuXG4uY29udGFpbmVyIHtcbiAgZGlzcGxheTogZmxleDtcblxuICAtLWNvcGllZC1kdXJhdGlvbjogMXMgZWFzZS1pbi1vdXQ7XG59XG5cbi5idXR0b24ge1xuICBjb21wb3NlczogLWJ1dHRvblJlc2V0O1xuICB0cmFuc2l0aW9uOiBjb2xvciB2YXIoLS1jb3BpZWQtZHVyYXRpb24pO1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIG1hcmdpbjogMCAwLjI1ZW0gMCAwLjVlbTtcbn1cblxuLnRleHQge1xuICB2aXNpYmlsaXR5OiBoaWRkZW47XG4gIG9wYWNpdHk6IDA7XG4gIHRyYW5zaXRpb246XG4gICAgdmlzaWJpbGl0eSB2YXIoLS1jb3BpZWQtZHVyYXRpb24pLFxuICAgIG9wYWNpdHkgdmFyKC0tY29waWVkLWR1cmF0aW9uKSxcbiAgICBjb2xvciB2YXIoLS1jb3BpZWQtZHVyYXRpb24pO1xufVxuXG4uYWN0aXZlIHtcbiAgY29tcG9zZXM6IGNvbnRhaW5lcjtcblxuICAmIC5idXR0b24ge1xuICAgIHRyYW5zaXRpb246IGNvbG9yIDBzO1xuICAgIGNvbG9yOiBncmVlbjtcbiAgfVxuXG4gICYgLnRleHQge1xuICAgIHZpc2liaWxpdHk6IHZpc2libGU7XG4gICAgb3BhY2l0eTogMTtcbiAgICB0cmFuc2l0aW9uOlxuICAgICAgdmlzaWJpbGl0eSAwcyxcbiAgICAgIG9wYWNpdHkgMHMsXG4gICAgICBjb2xvciAwcztcbiAgICBjb2xvcjogZ3JlZW47XG4gIH1cbn1cbiJdfQ== */ \ No newline at end of file diff --git a/assets/module.postcss/output/share.module.css.map b/assets/module.postcss/output/share.module.css.map new file mode 100644 index 0000000..3e42e4e --- /dev/null +++ b/assets/module.postcss/output/share.module.css.map @@ -0,0 +1 @@ +{"-buttonReset":"_-buttonReset_ccgtz_1","container":"_container_ccgtz_12","button":"_button_ccgtz_18 _-buttonReset_ccgtz_1","text":"_text_ccgtz_25","active":"_active_ccgtz_34 _container_ccgtz_12"} \ No newline at end of file diff --git a/assets/module.postcss/playground.module.css b/assets/module.postcss/playground.module.css new file mode 100644 index 0000000..32cb006 --- /dev/null +++ b/assets/module.postcss/playground.module.css @@ -0,0 +1,62 @@ +._-autoSize_1uxa0_1 { + width: 100%; + min-width: 0; + height: 100%; + min-height: 0; +} + +._container_1uxa0_8 { + display: flex; + flex-direction: column; + padding-bottom: 1em; + height: 100vh; +} + +._-resizeableArea_1uxa0_15 { + display: grid; +} + +._resizeableAreaRowOutputUnfocused_1uxa0_20 { + grid-template-rows: 1fr auto; +} + +._resizeableAreaRowOutputFocused_1uxa0_25 { + grid-template-rows: 1fr 12px 1fr; +} + +._resizeableAreaColumnOutputUnfocused_1uxa0_30 { + grid-template-columns: 1fr auto; +} + +._resizeableAreaColumnOutputFocused_1uxa0_35 { + grid-template-columns: 1fr 12px 1fr; +} + +._-gutter_1uxa0_40 { + display: flex; + justify-content: center; + align-items: center; +} + +._splitRowsGutter_1uxa0_46 { + cursor: row-resize; +} + +._splitRowsGutterHandle_1uxa0_51 { + transform: rotate(90deg); + pointer-events: none; +} + +._splitColumnsGutter_1uxa0_56 { + cursor: col-resize; +} + +._editor_1uxa0_61 { + border: 4px solid var(--border-color); + border-radius: 4px; +} + +._output_1uxa0_67 { +} + +/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL21vZHVsZS5jc3MvcGxheWdyb3VuZC5tb2R1bGUuY3NzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0VBQ0UsV0FBVztFQUNYLFlBQVk7RUFDWixZQUFZO0VBQ1osYUFBYTtBQUNmOztBQUVBO0VBQ0UsYUFBYTtFQUNiLHNCQUFzQjtFQUN0QixtQkFBbUI7RUFDbkIsYUFBYTtBQUNmOztBQUVBO0VBRUUsYUFBYTtBQUNmOztBQUVBO0VBRUUsNEJBQTRCO0FBQzlCOztBQUVBO0VBRUUsZ0NBQWdDO0FBQ2xDOztBQUVBO0VBRUUsK0JBQStCO0FBQ2pDOztBQUVBO0VBRUUsbUNBQW1DO0FBQ3JDOztBQUVBO0VBQ0UsYUFBYTtFQUNiLHVCQUF1QjtFQUN2QixtQkFBbUI7QUFDckI7O0FBRUE7RUFFRSxrQkFBa0I7QUFDcEI7O0FBRUE7RUFDRSx3QkFBd0I7RUFDeEIsb0JBQW9CO0FBQ3RCOztBQUVBO0VBRUUsa0JBQWtCO0FBQ3BCOztBQUVBO0VBRUUscUNBQXFDO0VBQ3JDLGtCQUFrQjtBQUNwQjs7QUFFQTtBQUVBIiwiZmlsZSI6InBsYXlncm91bmQubW9kdWxlLmNzcyIsInNvdXJjZXNDb250ZW50IjpbIi4tYXV0b1NpemUge1xuICB3aWR0aDogMTAwJTtcbiAgbWluLXdpZHRoOiAwO1xuICBoZWlnaHQ6IDEwMCU7XG4gIG1pbi1oZWlnaHQ6IDA7XG59XG5cbi5jb250YWluZXIge1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICBwYWRkaW5nLWJvdHRvbTogMWVtO1xuICBoZWlnaHQ6IDEwMHZoO1xufVxuXG4uLXJlc2l6ZWFibGVBcmVhIHtcbiAgY29tcG9zZXM6IC1hdXRvU2l6ZTtcbiAgZGlzcGxheTogZ3JpZDtcbn1cblxuLnJlc2l6ZWFibGVBcmVhUm93T3V0cHV0VW5mb2N1c2VkIHtcbiAgY29tcG9zZXM6IC1yZXNpemVhYmxlQXJlYTtcbiAgZ3JpZC10ZW1wbGF0ZS1yb3dzOiAxZnIgYXV0bztcbn1cblxuLnJlc2l6ZWFibGVBcmVhUm93T3V0cHV0Rm9jdXNlZCB7XG4gIGNvbXBvc2VzOiAtcmVzaXplYWJsZUFyZWE7XG4gIGdyaWQtdGVtcGxhdGUtcm93czogMWZyIDEycHggMWZyO1xufVxuXG4ucmVzaXplYWJsZUFyZWFDb2x1bW5PdXRwdXRVbmZvY3VzZWQge1xuICBjb21wb3NlczogLXJlc2l6ZWFibGVBcmVhO1xuICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmciBhdXRvO1xufVxuXG4ucmVzaXplYWJsZUFyZWFDb2x1bW5PdXRwdXRGb2N1c2VkIHtcbiAgY29tcG9zZXM6IC1yZXNpemVhYmxlQXJlYTtcbiAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnIgMTJweCAxZnI7XG59XG5cbi4tZ3V0dGVyIHtcbiAgZGlzcGxheTogZmxleDtcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG59XG5cbi5zcGxpdFJvd3NHdXR0ZXIge1xuICBjb21wb3NlczogLWd1dHRlcjtcbiAgY3Vyc29yOiByb3ctcmVzaXplO1xufVxuXG4uc3BsaXRSb3dzR3V0dGVySGFuZGxlIHtcbiAgdHJhbnNmb3JtOiByb3RhdGUoOTBkZWcpO1xuICBwb2ludGVyLWV2ZW50czogbm9uZTtcbn1cblxuLnNwbGl0Q29sdW1uc0d1dHRlciB7XG4gIGNvbXBvc2VzOiAtZ3V0dGVyO1xuICBjdXJzb3I6IGNvbC1yZXNpemU7XG59XG5cbi5lZGl0b3Ige1xuICBjb21wb3NlczogLWF1dG9TaXplO1xuICBib3JkZXI6IDRweCBzb2xpZCB2YXIoLS1ib3JkZXItY29sb3IpO1xuICBib3JkZXItcmFkaXVzOiA0cHg7XG59XG5cbi5vdXRwdXQge1xuICBjb21wb3NlczogLWF1dG9TaXplO1xufVxuIl19 */ \ No newline at end of file diff --git a/assets/module.postcss/playground.module.css.map b/assets/module.postcss/playground.module.css.map new file mode 100644 index 0000000..87ac8db --- /dev/null +++ b/assets/module.postcss/playground.module.css.map @@ -0,0 +1 @@ +{"-autoSize":"_-autoSize_1uxa0_1","container":"_container_1uxa0_8","-resizeableArea":"_-resizeableArea_1uxa0_15 _-autoSize_1uxa0_1","resizeableAreaRowOutputUnfocused":"_resizeableAreaRowOutputUnfocused_1uxa0_20 _-resizeableArea_1uxa0_15 _-autoSize_1uxa0_1","resizeableAreaRowOutputFocused":"_resizeableAreaRowOutputFocused_1uxa0_25 _-resizeableArea_1uxa0_15 _-autoSize_1uxa0_1","resizeableAreaColumnOutputUnfocused":"_resizeableAreaColumnOutputUnfocused_1uxa0_30 _-resizeableArea_1uxa0_15 _-autoSize_1uxa0_1","resizeableAreaColumnOutputFocused":"_resizeableAreaColumnOutputFocused_1uxa0_35 _-resizeableArea_1uxa0_15 _-autoSize_1uxa0_1","-gutter":"_-gutter_1uxa0_40","splitRowsGutter":"_splitRowsGutter_1uxa0_46 _-gutter_1uxa0_40","splitRowsGutterHandle":"_splitRowsGutterHandle_1uxa0_51","splitColumnsGutter":"_splitColumnsGutter_1uxa0_56 _-gutter_1uxa0_40","editor":"_editor_1uxa0_61 _-autoSize_1uxa0_1","output":"_output_1uxa0_67 _-autoSize_1uxa0_1"} \ No newline at end of file diff --git a/assets/module.postcss/pop_button.module.css b/assets/module.postcss/pop_button.module.css new file mode 100644 index 0000000..268daea --- /dev/null +++ b/assets/module.postcss/pop_button.module.css @@ -0,0 +1,32 @@ +._container_1chxk_4 { + z-index: 10; + font-size: var(--secondary-font-size); + + & button:enabled { + cursor: pointer; + } +} + +._arrow_1chxk_13 { + fill: var(--background-color-high-contrast); +} + +._-content_1chxk_17 { + margin: 10px; + box-shadow: + 5px 5px 20px -3px rgb(0 0 0 / 25%), + 0 0 5px -2px rgb(0 0 0 / 90%); + border-radius: var(--header-border-radius); + background: var(--background-color-high-contrast); + color: var(--font-color); +} + +._contentBottom_1chxk_27 { + margin-top: 0; +} + +._contentTop_1chxk_32 { + margin-bottom: 0; +} + +/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL21vZHVsZS5jc3MvcG9wX2J1dHRvbi5tb2R1bGUuY3NzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUdBO0VBQ0UsV0FBVztFQUNYLHFDQUFxQzs7RUFFckM7SUFDRSxlQUFlO0VBQ2pCO0FBQ0Y7O0FBRUE7RUFDRSwyQ0FBMkM7QUFDN0M7O0FBRUE7RUFDRSxZQUFxQjtFQUNyQjs7aUNBRStCO0VBQy9CLDBDQUEwQztFQUMxQyxpREFBaUQ7RUFDakQsd0JBQXdCO0FBQzFCOztBQUVBO0VBRUUsYUFBYTtBQUNmOztBQUVBO0VBRUUsZ0JBQWdCO0FBQ2xCIiwiZmlsZSI6InBvcF9idXR0b24ubW9kdWxlLmNzcyIsInNvdXJjZXNDb250ZW50IjpbIiRhcnJvdy1oZWlnaHQ6IDEwcHg7XG4kYXJyb3ctd2lkdGg6IDIwcHg7XG5cbi5jb250YWluZXIge1xuICB6LWluZGV4OiAxMDtcbiAgZm9udC1zaXplOiB2YXIoLS1zZWNvbmRhcnktZm9udC1zaXplKTtcblxuICAmIGJ1dHRvbjplbmFibGVkIHtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gIH1cbn1cblxuLmFycm93IHtcbiAgZmlsbDogdmFyKC0tYmFja2dyb3VuZC1jb2xvci1oaWdoLWNvbnRyYXN0KTtcbn1cblxuLi1jb250ZW50IHtcbiAgbWFyZ2luOiAkYXJyb3ctaGVpZ2h0O1xuICBib3gtc2hhZG93OlxuICAgIDVweCA1cHggMjBweCAtM3B4IHJnYigwIDAgMCAvIDI1JSksXG4gICAgMCAwIDVweCAtMnB4IHJnYigwIDAgMCAvIDkwJSk7XG4gIGJvcmRlci1yYWRpdXM6IHZhcigtLWhlYWRlci1ib3JkZXItcmFkaXVzKTtcbiAgYmFja2dyb3VuZDogdmFyKC0tYmFja2dyb3VuZC1jb2xvci1oaWdoLWNvbnRyYXN0KTtcbiAgY29sb3I6IHZhcigtLWZvbnQtY29sb3IpO1xufVxuXG4uY29udGVudEJvdHRvbSB7XG4gIGNvbXBvc2VzOiAtY29udGVudDtcbiAgbWFyZ2luLXRvcDogMDtcbn1cblxuLmNvbnRlbnRUb3Age1xuICBjb21wb3NlczogLWNvbnRlbnQ7XG4gIG1hcmdpbi1ib3R0b206IDA7XG59XG4iXX0= */ \ No newline at end of file diff --git a/assets/module.postcss/pop_button.module.css.map b/assets/module.postcss/pop_button.module.css.map new file mode 100644 index 0000000..6963f82 --- /dev/null +++ b/assets/module.postcss/pop_button.module.css.map @@ -0,0 +1 @@ +{"container":"_container_1chxk_4","arrow":"_arrow_1chxk_13","-content":"_-content_1chxk_17","contentBottom":"_contentBottom_1chxk_27 _-content_1chxk_17","contentTop":"_contentTop_1chxk_32 _-content_1chxk_17"} \ No newline at end of file diff --git a/assets/module.postcss/selectable_menu_item.module.css b/assets/module.postcss/selectable_menu_item.module.css new file mode 100644 index 0000000..de93a3d --- /dev/null +++ b/assets/module.postcss/selectable_menu_item.module.css @@ -0,0 +1,62 @@ +._-buttonReset_11oz3_1 { + color: var(--font-color); + border: none; + background: inherit; + background-color: transparent; /* IE 11 */ + padding: 0; + font: inherit; + line-height: inherit; + text-align: inherit; +} + +._-menuItemFullButton_11oz3_12 { + transition: color var(--header-transition); + width: 100%; + user-select: text; +} + +._-menuItemTitle_11oz3_19 { + font-weight: 600; +} + +._container_11oz3_23 { + + &:hover { + color: var(--header-tint); + } +} + +._selected_11oz3_31 { + color: var(--header-tint); + font-weight: 600; +} + +._header_11oz3_37 { + display: flex; + align-items: center; +} + +._name_11oz3_42 { +} + +._description_11oz3_46 { + padding-left: 2em; +} + +._checkmark_11oz3_50 { + opacity: 0; + transition: opacity 0.15s ease-in-out; + margin-right: 0.5em; +} + +._selected_11oz3_31 ._checkmark_11oz3_50, +._selected_11oz3_31:hover ._checkmark_11oz3_50 { + opacity: 1; +} + +._container_11oz3_23:hover ._checkmark_11oz3_50 { + opacity: 0.5; + color: var(--header-tint); +} + +/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL21vZHVsZS5jc3Mvc2VsZWN0YWJsZV9tZW51X2l0ZW0ubW9kdWxlLmNzcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtFQUNFLHdCQUF3QjtFQUN4QixZQUFZO0VBQ1osbUJBQW1CO0VBQ25CLDZCQUE2QixFQUFFLFVBQVU7RUFDekMsVUFBVTtFQUNWLGFBQWE7RUFDYixvQkFBb0I7RUFDcEIsbUJBQW1CO0FBQ3JCOztBQUVBO0VBRUUsMENBQTBDO0VBQzFDLFdBQVc7RUFDWCxpQkFBaUI7QUFDbkI7O0FBRUE7RUFDRSxnQkFBZ0I7QUFDbEI7O0FBRUE7O0VBR0U7SUFDRSx5QkFBeUI7RUFDM0I7QUFDRjs7QUFFQTtFQUVFLHlCQUF5QjtFQUN6QixnQkFBZ0I7QUFDbEI7O0FBRUE7RUFDRSxhQUFhO0VBQ2IsbUJBQW1CO0FBQ3JCOztBQUVBO0FBRUE7O0FBRUE7RUFDRSxpQkFBaUI7QUFDbkI7O0FBRUE7RUFDRSxVQUFVO0VBQ1YscUNBQXFDO0VBQ3JDLG1CQUFtQjtBQUNyQjs7QUFFQTs7RUFFRSxVQUFVO0FBQ1o7O0FBRUE7RUFDRSxZQUFZO0VBQ1oseUJBQXlCO0FBQzNCIiwiZmlsZSI6InNlbGVjdGFibGVfbWVudV9pdGVtLm1vZHVsZS5jc3MiLCJzb3VyY2VzQ29udGVudCI6WyIuLWJ1dHRvblJlc2V0IHtcbiAgY29sb3I6IHZhcigtLWZvbnQtY29sb3IpO1xuICBib3JkZXI6IG5vbmU7XG4gIGJhY2tncm91bmQ6IGluaGVyaXQ7XG4gIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50OyAvKiBJRSAxMSAqL1xuICBwYWRkaW5nOiAwO1xuICBmb250OiBpbmhlcml0O1xuICBsaW5lLWhlaWdodDogaW5oZXJpdDtcbiAgdGV4dC1hbGlnbjogaW5oZXJpdDtcbn1cblxuLi1tZW51SXRlbUZ1bGxCdXR0b24ge1xuICBjb21wb3NlczogLWJ1dHRvblJlc2V0O1xuICB0cmFuc2l0aW9uOiBjb2xvciB2YXIoLS1oZWFkZXItdHJhbnNpdGlvbik7XG4gIHdpZHRoOiAxMDAlO1xuICB1c2VyLXNlbGVjdDogdGV4dDtcbn1cblxuLi1tZW51SXRlbVRpdGxlIHtcbiAgZm9udC13ZWlnaHQ6IDYwMDtcbn1cblxuLmNvbnRhaW5lciB7XG4gIGNvbXBvc2VzOiAtbWVudUl0ZW1GdWxsQnV0dG9uO1xuXG4gICY6aG92ZXIge1xuICAgIGNvbG9yOiB2YXIoLS1oZWFkZXItdGludCk7XG4gIH1cbn1cblxuLnNlbGVjdGVkIHtcbiAgY29tcG9zZXM6IGNvbnRhaW5lcjtcbiAgY29sb3I6IHZhcigtLWhlYWRlci10aW50KTtcbiAgZm9udC13ZWlnaHQ6IDYwMDtcbn1cblxuLmhlYWRlciB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG59XG5cbi5uYW1lIHtcbiAgY29tcG9zZXM6IC1tZW51SXRlbVRpdGxlO1xufVxuXG4uZGVzY3JpcHRpb24ge1xuICBwYWRkaW5nLWxlZnQ6IDJlbTtcbn1cblxuLmNoZWNrbWFyayB7XG4gIG9wYWNpdHk6IDA7XG4gIHRyYW5zaXRpb246IG9wYWNpdHkgMC4xNXMgZWFzZS1pbi1vdXQ7XG4gIG1hcmdpbi1yaWdodDogMC41ZW07XG59XG5cbi5zZWxlY3RlZCAuY2hlY2ttYXJrLFxuLnNlbGVjdGVkOmhvdmVyIC5jaGVja21hcmsge1xuICBvcGFjaXR5OiAxO1xufVxuXG4uY29udGFpbmVyOmhvdmVyIC5jaGVja21hcmsge1xuICBvcGFjaXR5OiAwLjU7XG4gIGNvbG9yOiB2YXIoLS1oZWFkZXItdGludCk7XG59XG4iXX0= */ \ No newline at end of file diff --git a/assets/module.postcss/selectable_menu_item.module.css.map b/assets/module.postcss/selectable_menu_item.module.css.map new file mode 100644 index 0000000..b77f291 --- /dev/null +++ b/assets/module.postcss/selectable_menu_item.module.css.map @@ -0,0 +1 @@ +{"-buttonReset":"_-buttonReset_11oz3_1","-menuItemFullButton":"_-menuItemFullButton_11oz3_12 _-buttonReset_11oz3_1","-menuItemTitle":"_-menuItemTitle_11oz3_19","container":"_container_11oz3_23 _-menuItemFullButton_11oz3_12 _-buttonReset_11oz3_1","selected":"_selected_11oz3_31 _container_11oz3_23 _-menuItemFullButton_11oz3_12 _-buttonReset_11oz3_1","header":"_header_11oz3_37","name":"_name_11oz3_42 _-menuItemTitle_11oz3_19","description":"_description_11oz3_46","checkmark":"_checkmark_11oz3_50"} \ No newline at end of file diff --git a/assets/shared.module.css b/assets/shared.module.css new file mode 100644 index 0000000..f7afb7a --- /dev/null +++ b/assets/shared.module.css @@ -0,0 +1,47 @@ +.-bodyMonospace { + font-size: inherit; + line-height: 1.25; + + /* http://code.stephenmorley.org/html-and-css/fixing-browsers-broken-monospace-font-handling/ + * ACE uses Monaco, Menlo, "Ubuntu Mono", Consolas, source-code-pro, monospace; + */ + font-family: 'Source Code Pro', monospace; + font-optical-sizing: auto; +} + +.-autoSize { + width: 100%; + min-width: 0; + height: 100%; + min-height: 0; +} + +.-buttonReset { + color: var(--font-color); + border: none; + background: inherit; + background-color: transparent; /* IE 11 */ + padding: 0; + font: inherit; + line-height: inherit; + text-align: inherit; +} + +.-buttonAsLink { + composes: -buttonReset; + cursor: pointer; + color: var(--link-color); + user-select: text; + text-decoration: underline; +} + +.-menuItemTitle { + font-weight: 600; +} + +.-menuItemFullButton { + composes: -buttonReset; + transition: color var(--header-transition); + width: 100%; + user-select: text; +} diff --git a/crates/aceditor/Cargo.toml b/crates/aceditor/Cargo.toml new file mode 100644 index 0000000..f50062b --- /dev/null +++ b/crates/aceditor/Cargo.toml @@ -0,0 +1,13 @@ +[package] +name = "aceditor" +version = "0.1.0" +edition = "2024" + +[dependencies] +js-sys = "0.3.77" +serde = { version = "1.0.219", features = ["derive"] } +serde-wasm-bindgen = "0.6.5" +thiserror = "2.0.12" +tokio = { version = "1.45.0", features = ["sync"] } +wasm-bindgen = "0.2.100" +web-sys = { version = "0.3.77", features = ["HtmlElement"] } diff --git a/crates/aceditor/src/lib.rs b/crates/aceditor/src/lib.rs new file mode 100644 index 0000000..70ade67 --- /dev/null +++ b/crates/aceditor/src/lib.rs @@ -0,0 +1,174 @@ +use std::sync::Arc; + +use js_sys::{Object, Reflect}; +use serde::{Deserialize, Serialize}; +use wasm_bindgen::{JsCast, JsValue, prelude::Closure}; + +// +mod bindgen { + use js_sys::Object; + use wasm_bindgen::{ + JsValue, + prelude::{Closure, wasm_bindgen}, + }; + + #[wasm_bindgen] + extern "C" { + #[wasm_bindgen(js_namespace = ace, js_name = edit, catch)] + pub fn edit(element: &str, options: Option) -> Result; + + #[wasm_bindgen(js_namespace = ["ace", "config"], js_name = loadModule)] + pub fn load_module(module: &str, callback: &Closure); + + #[wasm_bindgen(js_namespace = ace, js_name = require, catch)] + pub fn require(module: &str) -> Result; + } + + #[wasm_bindgen] + extern "C" { + pub type Editor; + + #[wasm_bindgen(method, js_name = setTheme, catch)] + pub fn set_theme(this: &Editor, theme: &str) -> Result<(), JsValue>; + + #[wasm_bindgen(method, js_name = setKeyboardHandler, catch)] + pub fn set_keyboard_handler(this: &Editor, handler: &str) -> Result<(), JsValue>; + + #[wasm_bindgen(method, js_name = getValue)] + pub fn get_value(this: &Editor) -> String; + } +} + +type Result = std::result::Result; + +#[derive(Default, Serialize, Deserialize)] +pub struct EditorOptionsBuilder(EditorOptions); + +impl EditorOptionsBuilder { + pub fn mode(mut self, value: &str) -> Self { + self.0.mode = value.into(); + self + } + + pub fn theme(mut self, value: &str) -> Self { + self.0.theme = value.into(); + self + } + + pub fn keyboard(mut self, value: &str) -> Self { + self.0.keyboard_handler = value.into(); + self + } + + pub fn value(mut self, value: &str) -> Self { + self.0.value = value.into(); + self + } + + pub fn build(self) -> EditorOptions { + self.0 + } +} + +#[derive(Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct EditorOptions { + pub mode: String, + pub theme: String, + pub keyboard_handler: String, + pub value: String, +} + +impl Default for EditorOptions { + fn default() -> Self { + EditorOptions { + mode: "ace/mode/text".into(), + theme: "ace/theme/textmate".into(), + keyboard_handler: "ace/keyboard/ace".into(), + value: String::new(), + } + } +} + +impl EditorOptions { + pub fn to_js(&self) -> Object { + serde_wasm_bindgen::to_value(self).unwrap().into() + } +} + +#[derive(thiserror::Error, Debug)] +pub enum EditorError { + #[error(transparent)] + Serde(#[from] serde_wasm_bindgen::Error), + #[error("Failed to open an editor")] + Open(JsValue), + #[error("Failed to set theme")] + SetTheme(JsValue), + #[error("Failed to set keyboard handler")] + SetKeyboardHandler(JsValue), + #[error("Failed to define extenstion")] + DefineEx(JsValue), +} + +pub struct Editor { + js: bindgen::Editor, +} + +unsafe impl Send for Editor {} + +unsafe impl Sync for Editor {} + +impl Editor { + /// ace.edit + pub fn open(element: &str, options: Option<&EditorOptions>) -> Result { + let editor = bindgen::edit(element, options.map(|options| options.to_js())) + .map_err(EditorError::Open)?; + Ok(Editor { js: editor }) + } + + pub fn set_theme(&self, theme: &str) -> Result<()> { + self.js.set_theme(theme).map_err(EditorError::SetTheme) + } + + pub fn set_keyboard_handler(&self, handler: &str) -> Result<()> { + self.js + .set_keyboard_handler(handler) + .map_err(EditorError::SetKeyboardHandler) + } + + pub async fn define_vim_w(callback: Box) -> Result<()> { + let notify = Arc::new(tokio::sync::Notify::new()); + let waiter = Arc::clone(¬ify); + + let load_module = Closure::once(move |_: JsValue| { + notify.notify_waiters(); + }); + + bindgen::load_module("ace/keyboard/vim", &load_module); + waiter.notified().await; + + let value = bindgen::require("ace/keyboard/vim").map_err(EditorError::DefineEx)?; + + let define_ex = Reflect::get(&value, &JsValue::from("CodeMirror")) + .and_then(|code_mirror| Reflect::get(&code_mirror, &JsValue::from("Vim"))) + .and_then(|vim| Reflect::get(&vim, &JsValue::from("defineEx"))) + .map_err(EditorError::DefineEx)?; + let callback = Closure::wrap(callback); + + js_sys::Function::from(define_ex) + .call3( + &JsValue::null(), + &JsValue::from("write"), + &JsValue::from("w"), + callback.as_ref().unchecked_ref(), + ) + .map_err(EditorError::DefineEx)?; + callback.forget(); + + Ok(()) + } + + pub fn get_value(&self) -> String { + self.js.get_value() + } +} diff --git a/crates/floating-ui/Cargo.toml b/crates/floating-ui/Cargo.toml new file mode 100644 index 0000000..907915f --- /dev/null +++ b/crates/floating-ui/Cargo.toml @@ -0,0 +1,12 @@ +[package] +name = "floating-ui" +version = "0.1.0" +edition = "2024" + +[dependencies] +serde = "1.0.219" +serde-wasm-bindgen = "0.6.5" +wasm-bindgen = "0.2.100" +wasm-bindgen-futures = "0.4.50" +web-sys = "0.3.77" + diff --git a/crates/floating-ui/src/lib.rs b/crates/floating-ui/src/lib.rs new file mode 100644 index 0000000..90b4766 --- /dev/null +++ b/crates/floating-ui/src/lib.rs @@ -0,0 +1,83 @@ +use wasm_bindgen::{ + JsValue, + prelude::{Closure, wasm_bindgen}, +}; +use web_sys::js_sys::{self, Array, Object, Reflect}; + +#[wasm_bindgen] +extern "C" { + #[wasm_bindgen(js_namespace = ["globalThis", "FloatingUIDOM"], js_name = computePosition)] + pub async fn compute_position( + reference: JsValue, + floating: JsValue, + options: JsValue, + ) -> JsValue; + #[wasm_bindgen(js_namespace = ["globalThis", "FloatingUIDOM"])] + pub fn offset(value: i32) -> JsValue; + #[wasm_bindgen(js_namespace = ["globalThis", "FloatingUIDOM"])] + pub fn flip() -> JsValue; + #[wasm_bindgen(js_namespace = ["globalThis", "FloatingUIDOM"])] + pub fn shift() -> JsValue; + #[wasm_bindgen(js_namespace = ["globalThis", "FloatingUIDOM"])] + pub fn arrow(options: JsValue) -> JsValue; + #[wasm_bindgen(js_namespace = ["globalThis", "FloatingUIDOM"], js_name = autoUpdate)] + pub fn auto_update( + reference: JsValue, + floating: JsValue, + callback: &Closure, + options: JsValue, + ) -> js_sys::Function; +} + +#[derive(serde::Serialize)] +pub struct ComputeOptions { + placement: String, + #[serde(with = "serde_wasm_bindgen::preserve")] + middleware: Array, +} + +#[derive(serde::Deserialize, Debug)] +#[serde(rename_all = "camelCase")] +pub struct ComputePosition { + pub x: f64, + pub y: f64, + pub placement: String, + pub strategy: String, + pub middleware_data: MiddlewareData, +} + +#[derive(serde::Deserialize, Debug)] +pub struct MiddlewareData { + pub arrow: ArrowPosition, +} + +#[derive(serde::Deserialize, Debug)] +pub struct ArrowPosition { + pub x: f64, +} + +pub fn compute_options(offset_value: i32, element: &JsValue) -> JsValue { + let middleware = Array::new(); + middleware.push(&offset(offset_value)); + middleware.push(&flip()); + middleware.push(&shift()); + let options = { + let options = Object::new(); + Reflect::set(&options, &JsValue::from("element"), element).unwrap(); + options + }; + middleware.push(&arrow(JsValue::from(options))); + + let options = { + let options = Object::new(); + Reflect::set( + &options, + &JsValue::from("middleware"), + &JsValue::from(middleware), + ) + .unwrap(); + options + }; + + JsValue::from(options) +} diff --git a/crates/istyles/Cargo.toml b/crates/istyles/Cargo.toml new file mode 100644 index 0000000..8e85b69 --- /dev/null +++ b/crates/istyles/Cargo.toml @@ -0,0 +1,13 @@ +[package] +name = "istyles" +version = "0.1.0" +edition = "2024" + +[lib] +proc-macro = true + +[dependencies] +syn = { version = "2.0", features = ["full"] } +quote = "1.0" +serde_json = "1.0" +proc-macro2 = "1.0.95" diff --git a/crates/istyles/src/lib.rs b/crates/istyles/src/lib.rs new file mode 100644 index 0000000..154d52a --- /dev/null +++ b/crates/istyles/src/lib.rs @@ -0,0 +1,55 @@ +use proc_macro::TokenStream; +use quote::quote; +use serde_json::Value; +use syn::{LitStr, parse_macro_input}; + +#[proc_macro] +pub fn istyles(input: TokenStream) -> TokenStream { + let (css_module_map, mod_name) = parse_macro_input!(input with parse_input); + + let value: Value = match serde_json::from_str(&css_module_map) { + Ok(v) => v, + Err(e) => { + return syn::Error::new_spanned(css_module_map, format!("Invalid JSON: {}", e)) + .to_compile_error() + .into(); + } + }; + + let consts = generate_consts(&value); + let expanded = quote! { + pub mod #mod_name { + #consts + } + }; + + TokenStream::from(expanded) +} + +fn parse_input(input: syn::parse::ParseStream) -> syn::Result<(String, syn::Ident)> { + let mod_name: syn::Ident = input.parse()?; + input.parse::()?; + let path: LitStr = input.parse()?; + let path = path.value(); + let json = std::fs::read_to_string(&path) + .map_err(|e| syn::Error::new_spanned(&path, format!("Failed to read JSON: {:?}", e)))?; + Ok((json, mod_name)) +} + +fn generate_consts(value: &Value) -> proc_macro2::TokenStream { + match value { + Value::Object(map) => { + let const_decls = map.iter().map(|(k, v)| { + let key = k.replace('-', "_"); + let key_ident = syn::Ident::new(&key, proc_macro2::Span::call_site()); + let value_str = v.as_str().unwrap_or_default(); + + quote! { + pub const #key_ident: &str = #value_str; + } + }); + quote! { #(#const_decls)* } + } + _ => quote! {}, + } +} diff --git a/crates/split-grid/Cargo.toml b/crates/split-grid/Cargo.toml new file mode 100644 index 0000000..19e9b6f --- /dev/null +++ b/crates/split-grid/Cargo.toml @@ -0,0 +1,10 @@ +[package] +name = "split-grid" +version = "0.1.0" +edition = "2024" + +[dependencies] +serde = "1.0.219" +serde-wasm-bindgen = "0.6.5" +wasm-bindgen = "0.2.100" +web-sys = "0.3.77" diff --git a/crates/split-grid/src/lib.rs b/crates/split-grid/src/lib.rs new file mode 100644 index 0000000..9da79c8 --- /dev/null +++ b/crates/split-grid/src/lib.rs @@ -0,0 +1,38 @@ +use wasm_bindgen::{JsValue, prelude::wasm_bindgen}; + +#[wasm_bindgen] +extern "C" { + pub type Grid; + + #[wasm_bindgen(js_namespace = ["globalThis"], js_name = Split)] + pub fn split(options: &JsValue) -> Grid; + + #[wasm_bindgen(method)] + pub fn destroy(this: &Grid); +} + +unsafe impl Send for Grid {} +unsafe impl Sync for Grid {} + +#[derive(serde::Serialize, serde::Deserialize)] +pub struct Gutter { + pub track: i32, + #[serde(with = "serde_wasm_bindgen::preserve")] + pub element: JsValue, +} + +#[derive(serde::Serialize, serde::Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct SplitOptions { + pub min_size: i32, + #[serde(skip_serializing_if = "Option::is_none")] + pub row_gutters: Option>, + #[serde(skip_serializing_if = "Option::is_none")] + pub column_gutters: Option>, +} + +impl From for JsValue { + fn from(value: SplitOptions) -> Self { + serde_wasm_bindgen::to_value(&value).unwrap() + } +} diff --git a/index.html b/index.html new file mode 100644 index 0000000..ff7a325 --- /dev/null +++ b/index.html @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..1061455 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,3930 @@ +{ + "name": "sqlight", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "dependencies": { + "@tailwindcss/cli": "^4.1.4", + "postcss-mixins": "^11.0.3", + "postcss-modules": "^6.0.1", + "postcss-plugin": "^1.0.0", + "postcss-preset-env": "^10.1.6", + "postcss-simple-vars": "^7.0.1", + "tailwindcss": "^4.1.4" + }, + "devDependencies": { + "postcss": "^8.5.3", + "postcss-cli": "^11.0.1" + } + }, + "node_modules/@csstools/cascade-layer-name-parser": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@csstools/cascade-layer-name-parser/-/cascade-layer-name-parser-2.0.4.tgz", + "integrity": "sha512-7DFHlPuIxviKYZrOiwVU/PiHLm3lLUR23OMuEEtfEOQTOp9hzQ2JjdY6X5H18RVuUPJqSCI+qNnD5iOLMVE0bA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3" + } + }, + "node_modules/@csstools/color-helpers": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.0.2.tgz", + "integrity": "sha512-JqWH1vsgdGcw2RR6VliXXdA0/59LttzlU8UlRT/iUUsEeWfYq8I+K0yhihEUTTHLRm1EXvpsCx3083EU15ecsA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + } + }, + "node_modules/@csstools/css-calc": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.3.tgz", + "integrity": "sha512-XBG3talrhid44BY1x3MHzUx/aTG8+x/Zi57M4aTKK9RFB4aLlF3TTSzfzn8nWVHWL3FgAXAxmupmDd6VWww+pw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3" + } + }, + "node_modules/@csstools/css-color-parser": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.0.9.tgz", + "integrity": "sha512-wILs5Zk7BU86UArYBJTPy/FMPPKVKHMj1ycCEyf3VUptol0JNRLFU/BZsJ4aiIHJEbSLiizzRrw8Pc1uAEDrXw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/color-helpers": "^5.0.2", + "@csstools/css-calc": "^2.1.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3" + } + }, + "node_modules/@csstools/css-parser-algorithms": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.4.tgz", + "integrity": "sha512-Up7rBoV77rv29d3uKHUIVubz1BTcgyUK72IvCQAbfbMv584xHcGKCKbWh7i8hPrRJ7qU4Y8IO3IY9m+iTB7P3A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-tokenizer": "^3.0.3" + } + }, + "node_modules/@csstools/css-tokenizer": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.3.tgz", + "integrity": "sha512-UJnjoFsmxfKUdNYdWgOB0mWUypuLvAfQPH1+pyvRJs6euowbFkFC6P13w1l8mJyi3vxYMxc9kld5jZEGRQs6bw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@csstools/media-query-list-parser": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-4.0.2.tgz", + "integrity": "sha512-EUos465uvVvMJehckATTlNqGj4UJWkTmdWuDMjqvSUkjGpmOyFZBVwb4knxCm/k2GMTXY+c/5RkdndzFYWeX5A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3" + } + }, + "node_modules/@csstools/postcss-cascade-layers": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-5.0.1.tgz", + "integrity": "sha512-XOfhI7GShVcKiKwmPAnWSqd2tBR0uxt+runAxttbSp/LY2U16yAVPmAf7e9q4JJ0d+xMNmpwNDLBXnmRCl3HMQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/selector-specificity": "^5.0.0", + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-color-function": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-4.0.9.tgz", + "integrity": "sha512-2UeQCGMO5+EeQsPQK2DqXp0dad+P6nIz6G2dI06APpBuYBKxZEq7CTH+UiztFQ8cB1f89dnO9+D/Kfr+JfI2hw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.0.9", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "@csstools/postcss-progressive-custom-properties": "^4.0.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-color-mix-function": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-mix-function/-/postcss-color-mix-function-3.0.9.tgz", + "integrity": "sha512-Enj7ZIIkLD7zkGCN31SZFx4H1gKiCs2Y4taBo/v/cqaHN7p1qGrf5UTMNSjQFZ7MgClGufHx4pddwFTGL+ipug==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.0.9", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "@csstools/postcss-progressive-custom-properties": "^4.0.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-content-alt-text": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@csstools/postcss-content-alt-text/-/postcss-content-alt-text-2.0.5.tgz", + "integrity": "sha512-9BOS535v6YmyOYk32jAHXeddRV+iyd4vRcbrEekpwxmueAXX5J8WgbceFnE4E4Pmw/ysnB9v+n/vSWoFmcLMcA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "@csstools/postcss-progressive-custom-properties": "^4.0.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-exponential-functions": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@csstools/postcss-exponential-functions/-/postcss-exponential-functions-2.0.8.tgz", + "integrity": "sha512-vHgDXtGIBPpFQnFNDftMQg4MOuXcWnK91L/7REjBNYzQ/p2Fa/6RcnehTqCRrNtQ46PNIolbRsiDdDuxiHolwQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-calc": "^2.1.3", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-font-format-keywords": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-font-format-keywords/-/postcss-font-format-keywords-4.0.0.tgz", + "integrity": "sha512-usBzw9aCRDvchpok6C+4TXC57btc4bJtmKQWOHQxOVKen1ZfVqBUuCZ/wuqdX5GHsD0NRSr9XTP+5ID1ZZQBXw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-gamut-mapping": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@csstools/postcss-gamut-mapping/-/postcss-gamut-mapping-2.0.9.tgz", + "integrity": "sha512-quksIsFm3DGsf8Qbr9KiSGBF2w3RwxSfOfma5wbORDB1AFF15r4EVW7sUuWw3s5IAEGMqzel/dE2rQsI7Yb8mA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.0.9", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-gradients-interpolation-method": { + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/@csstools/postcss-gradients-interpolation-method/-/postcss-gradients-interpolation-method-5.0.9.tgz", + "integrity": "sha512-duqTeUHF4ambUybAmhX9KonkicLM/WNp2JjMUbegRD4O8A/tb6fdZ7jUNdp/UUiO1FIdDkMwmNw6856bT0XF8Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.0.9", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "@csstools/postcss-progressive-custom-properties": "^4.0.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-hwb-function": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-4.0.9.tgz", + "integrity": "sha512-sDpdPsoGAhYl/PMSYfu5Ez82wXb2bVkg1Cb8vsRLhpXhAk4OSlsJN+GodAql6tqc1B2G/WToxsFU6G74vkhPvA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.0.9", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "@csstools/postcss-progressive-custom-properties": "^4.0.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-ic-unit": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-ic-unit/-/postcss-ic-unit-4.0.1.tgz", + "integrity": "sha512-lECc38i1w3qU9nhrUhP6F8y4BfcQJkR1cb8N6tZNf2llM6zPkxnqt04jRCwsUgNcB3UGKDy+zLenhOYGHqCV+Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/postcss-progressive-custom-properties": "^4.0.1", + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-initial": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-initial/-/postcss-initial-2.0.1.tgz", + "integrity": "sha512-L1wLVMSAZ4wovznquK0xmC7QSctzO4D0Is590bxpGqhqjboLXYA16dWZpfwImkdOgACdQ9PqXsuRroW6qPlEsg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-is-pseudo-class": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-5.0.1.tgz", + "integrity": "sha512-JLp3POui4S1auhDR0n8wHd/zTOWmMsmK3nQd3hhL6FhWPaox5W7j1se6zXOG/aP07wV2ww0lxbKYGwbBszOtfQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/selector-specificity": "^5.0.0", + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-light-dark-function": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@csstools/postcss-light-dark-function/-/postcss-light-dark-function-2.0.8.tgz", + "integrity": "sha512-v8VU5WtrZIyEtk88WB4fkG22TGd8HyAfSFfZZQ1uNN0+arMJdZc++H3KYTfbYDpJRGy8GwADYH8ySXiILn+OyA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "@csstools/postcss-progressive-custom-properties": "^4.0.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-logical-float-and-clear": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-float-and-clear/-/postcss-logical-float-and-clear-3.0.0.tgz", + "integrity": "sha512-SEmaHMszwakI2rqKRJgE+8rpotFfne1ZS6bZqBoQIicFyV+xT1UF42eORPxJkVJVrH9C0ctUgwMSn3BLOIZldQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-logical-overflow": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-overflow/-/postcss-logical-overflow-2.0.0.tgz", + "integrity": "sha512-spzR1MInxPuXKEX2csMamshR4LRaSZ3UXVaRGjeQxl70ySxOhMpP2252RAFsg8QyyBXBzuVOOdx1+bVO5bPIzA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-logical-overscroll-behavior": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-overscroll-behavior/-/postcss-logical-overscroll-behavior-2.0.0.tgz", + "integrity": "sha512-e/webMjoGOSYfqLunyzByZj5KKe5oyVg/YSbie99VEaSDE2kimFm0q1f6t/6Jo+VVCQ/jbe2Xy+uX+C4xzWs4w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-logical-resize": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-resize/-/postcss-logical-resize-3.0.0.tgz", + "integrity": "sha512-DFbHQOFW/+I+MY4Ycd/QN6Dg4Hcbb50elIJCfnwkRTCX05G11SwViI5BbBlg9iHRl4ytB7pmY5ieAFk3ws7yyg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-logical-viewport-units": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-viewport-units/-/postcss-logical-viewport-units-3.0.3.tgz", + "integrity": "sha512-OC1IlG/yoGJdi0Y+7duz/kU/beCwO+Gua01sD6GtOtLi7ByQUpcIqs7UE/xuRPay4cHgOMatWdnDdsIDjnWpPw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-tokenizer": "^3.0.3", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-media-minmax": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@csstools/postcss-media-minmax/-/postcss-media-minmax-2.0.8.tgz", + "integrity": "sha512-Skum5wIXw2+NyCQWUyfstN3c1mfSh39DRAo+Uh2zzXOglBG8xB9hnArhYFScuMZkzeM+THVa//mrByKAfumc7w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/css-calc": "^2.1.3", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "@csstools/media-query-list-parser": "^4.0.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-media-queries-aspect-ratio-number-values": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/postcss-media-queries-aspect-ratio-number-values/-/postcss-media-queries-aspect-ratio-number-values-3.0.4.tgz", + "integrity": "sha512-AnGjVslHMm5xw9keusQYvjVWvuS7KWK+OJagaG0+m9QnIjZsrysD2kJP/tr/UJIyYtMCtu8OkUd+Rajb4DqtIQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "@csstools/media-query-list-parser": "^4.0.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-nested-calc": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-nested-calc/-/postcss-nested-calc-4.0.0.tgz", + "integrity": "sha512-jMYDdqrQQxE7k9+KjstC3NbsmC063n1FTPLCgCRS2/qHUbHM0mNy9pIn4QIiQGs9I/Bg98vMqw7mJXBxa0N88A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-normalize-display-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.0.tgz", + "integrity": "sha512-HlEoG0IDRoHXzXnkV4in47dzsxdsjdz6+j7MLjaACABX2NfvjFS6XVAnpaDyGesz9gK2SC7MbNwdCHusObKJ9Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-oklab-function": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-4.0.9.tgz", + "integrity": "sha512-UHrnujimwtdDw8BYDcWJtBXuJ13uc/BjAddPdfMc/RsWxhg8gG8UbvTF0tnMtHrZ4i7lwy85fPEzK1AiykMyRA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.0.9", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "@csstools/postcss-progressive-custom-properties": "^4.0.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-progressive-custom-properties": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-4.0.1.tgz", + "integrity": "sha512-Ofz81HaY8mmbP8/Qr3PZlUzjsyV5WuxWmvtYn+jhYGvvjFazTmN9R2io5W5znY1tyk2CA9uM0IPWyY4ygDytCw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-random-function": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-random-function/-/postcss-random-function-2.0.0.tgz", + "integrity": "sha512-MYZKxSr4AKfjECL8vg49BbfNNzK+t3p2OWX+Xf7rXgMaTP44oy/e8VGWu4MLnJ3NUd9tFVkisLO/sg+5wMTNsg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-calc": "^2.1.3", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-relative-color-syntax": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@csstools/postcss-relative-color-syntax/-/postcss-relative-color-syntax-3.0.9.tgz", + "integrity": "sha512-+AGOcLF5PmMnTRPnOdCvY7AwvD5veIOhTWbJV6vC3hB1tt0ii/k6QOwhWfsGGg1ZPQ0JY15u+wqLR4ZTtB0luA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.0.9", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "@csstools/postcss-progressive-custom-properties": "^4.0.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-scope-pseudo-class": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-scope-pseudo-class/-/postcss-scope-pseudo-class-4.0.1.tgz", + "integrity": "sha512-IMi9FwtH6LMNuLea1bjVMQAsUhFxJnyLSgOp/cpv5hrzWmrUYU5fm0EguNDIIOHUqzXode8F/1qkC/tEo/qN8Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-sign-functions": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@csstools/postcss-sign-functions/-/postcss-sign-functions-1.1.3.tgz", + "integrity": "sha512-4F4GRhj8xNkBtLZ+3ycIhReaDfKJByXI+cQGIps3AzCO8/CJOeoDPxpMnL5vqZrWKOceSATHEQJUO/Q/r2y7OQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-calc": "^2.1.3", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-stepped-value-functions": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-4.0.8.tgz", + "integrity": "sha512-6Y4yhL4fNhgzbZ/wUMQ4EjFUfoNNMpEXZnDw1JrlcEBHUT15gplchtFsZGk7FNi8PhLHJfCUwVKrEHzhfhKK+g==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-calc": "^2.1.3", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-text-decoration-shorthand": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-4.0.2.tgz", + "integrity": "sha512-8XvCRrFNseBSAGxeaVTaNijAu+FzUvjwFXtcrynmazGb/9WUdsPCpBX+mHEHShVRq47Gy4peYAoxYs8ltUnmzA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/color-helpers": "^5.0.2", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-trigonometric-functions": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-4.0.8.tgz", + "integrity": "sha512-YcDvYTRu7f78/91B6bX+mE1WoAO91Su7/8KSRpuWbIGUB8hmaNSRu9wziaWSLJ1lOB1aQe+bvo9BIaLKqPOo/g==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-calc": "^2.1.3", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-unset-value": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-unset-value/-/postcss-unset-value-4.0.0.tgz", + "integrity": "sha512-cBz3tOCI5Fw6NIFEwU3RiwK6mn3nKegjpJuzCndoGq3BZPkUjnsq7uQmIeMNeMbMk7YD2MfKcgCpZwX5jyXqCA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/selector-resolve-nested": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-resolve-nested/-/selector-resolve-nested-3.0.0.tgz", + "integrity": "sha512-ZoK24Yku6VJU1gS79a5PFmC8yn3wIapiKmPgun0hZgEI5AOqgH2kiPRsPz1qkGv4HL+wuDLH83yQyk6inMYrJQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss-selector-parser": "^7.0.0" + } + }, + "node_modules/@csstools/selector-specificity": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz", + "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss-selector-parser": "^7.0.0" + } + }, + "node_modules/@csstools/utilities": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@csstools/utilities/-/utilities-2.0.0.tgz", + "integrity": "sha512-5VdOr0Z71u+Yp3ozOx8T11N703wIFGVRgOWbOZMKgglPJsWA54MRIoMNVMa7shUToIhx5J8vX4sOZgD2XiihiQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@parcel/watcher": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.1.tgz", + "integrity": "sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "detect-libc": "^1.0.3", + "is-glob": "^4.0.3", + "micromatch": "^4.0.5", + "node-addon-api": "^7.0.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "@parcel/watcher-android-arm64": "2.5.1", + "@parcel/watcher-darwin-arm64": "2.5.1", + "@parcel/watcher-darwin-x64": "2.5.1", + "@parcel/watcher-freebsd-x64": "2.5.1", + "@parcel/watcher-linux-arm-glibc": "2.5.1", + "@parcel/watcher-linux-arm-musl": "2.5.1", + "@parcel/watcher-linux-arm64-glibc": "2.5.1", + "@parcel/watcher-linux-arm64-musl": "2.5.1", + "@parcel/watcher-linux-x64-glibc": "2.5.1", + "@parcel/watcher-linux-x64-musl": "2.5.1", + "@parcel/watcher-win32-arm64": "2.5.1", + "@parcel/watcher-win32-ia32": "2.5.1", + "@parcel/watcher-win32-x64": "2.5.1" + } + }, + "node_modules/@parcel/watcher-android-arm64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.1.tgz", + "integrity": "sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-arm64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.1.tgz", + "integrity": "sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-x64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.1.tgz", + "integrity": "sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-freebsd-x64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.1.tgz", + "integrity": "sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-glibc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.1.tgz", + "integrity": "sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-musl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.1.tgz", + "integrity": "sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-glibc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.1.tgz", + "integrity": "sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-musl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.1.tgz", + "integrity": "sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-glibc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.1.tgz", + "integrity": "sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-musl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.1.tgz", + "integrity": "sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-arm64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.1.tgz", + "integrity": "sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-ia32": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.1.tgz", + "integrity": "sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-x64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.1.tgz", + "integrity": "sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@tailwindcss/cli": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@tailwindcss/cli/-/cli-4.1.5.tgz", + "integrity": "sha512-Kr567rDwDjY1VUnfqh5/+DCpRf4B8lPs5O9flP4kri7n4AM2aubrIxGSh5GN8s+awUKw/U4+6kNlEnZbBNfUeg==", + "license": "MIT", + "dependencies": { + "@parcel/watcher": "^2.5.1", + "@tailwindcss/node": "4.1.5", + "@tailwindcss/oxide": "4.1.5", + "enhanced-resolve": "^5.18.1", + "mri": "^1.2.0", + "picocolors": "^1.1.1", + "tailwindcss": "4.1.5" + }, + "bin": { + "tailwindcss": "dist/index.mjs" + } + }, + "node_modules/@tailwindcss/node": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.5.tgz", + "integrity": "sha512-CBhSWo0vLnWhXIvpD0qsPephiaUYfHUX3U9anwDaHZAeuGpTiB3XmsxPAN6qX7bFhipyGBqOa1QYQVVhkOUGxg==", + "license": "MIT", + "dependencies": { + "enhanced-resolve": "^5.18.1", + "jiti": "^2.4.2", + "lightningcss": "1.29.2", + "tailwindcss": "4.1.5" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.5.tgz", + "integrity": "sha512-1n4br1znquEvyW/QuqMKQZlBen+jxAbvyduU87RS8R3tUSvByAkcaMTkJepNIrTlYhD+U25K4iiCIxE6BGdRYA==", + "license": "MIT", + "engines": { + "node": ">= 10" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.1.5", + "@tailwindcss/oxide-darwin-arm64": "4.1.5", + "@tailwindcss/oxide-darwin-x64": "4.1.5", + "@tailwindcss/oxide-freebsd-x64": "4.1.5", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.5", + "@tailwindcss/oxide-linux-arm64-gnu": "4.1.5", + "@tailwindcss/oxide-linux-arm64-musl": "4.1.5", + "@tailwindcss/oxide-linux-x64-gnu": "4.1.5", + "@tailwindcss/oxide-linux-x64-musl": "4.1.5", + "@tailwindcss/oxide-wasm32-wasi": "4.1.5", + "@tailwindcss/oxide-win32-arm64-msvc": "4.1.5", + "@tailwindcss/oxide-win32-x64-msvc": "4.1.5" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.5.tgz", + "integrity": "sha512-LVvM0GirXHED02j7hSECm8l9GGJ1RfgpWCW+DRn5TvSaxVsv28gRtoL4aWKGnXqwvI3zu1GABeDNDVZeDPOQrw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.5.tgz", + "integrity": "sha512-//TfCA3pNrgnw4rRJOqavW7XUk8gsg9ddi8cwcsWXp99tzdBAZW0WXrD8wDyNbqjW316Pk2hiN/NJx/KWHl8oA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.5.tgz", + "integrity": "sha512-XQorp3Q6/WzRd9OalgHgaqgEbjP3qjHrlSUb5k1EuS1Z9NE9+BbzSORraO+ecW432cbCN7RVGGL/lSnHxcd+7Q==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.5.tgz", + "integrity": "sha512-bPrLWbxo8gAo97ZmrCbOdtlz/Dkuy8NK97aFbVpkJ2nJ2Jo/rsCbu0TlGx8joCuA3q6vMWTSn01JY46iwG+clg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.5.tgz", + "integrity": "sha512-1gtQJY9JzMAhgAfvd/ZaVOjh/Ju/nCoAsvOVJenWZfs05wb8zq+GOTnZALWGqKIYEtyNpCzvMk+ocGpxwdvaVg==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.5.tgz", + "integrity": "sha512-dtlaHU2v7MtdxBXoqhxwsWjav7oim7Whc6S9wq/i/uUMTWAzq/gijq1InSgn2yTnh43kR+SFvcSyEF0GCNu1PQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.5.tgz", + "integrity": "sha512-fg0F6nAeYcJ3CriqDT1iVrqALMwD37+sLzXs8Rjy8Z1ZHshJoYceodfyUwGJEsQoTyWbliFNRs2wMQNXtT7MVA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.5.tgz", + "integrity": "sha512-SO+F2YEIAHa1AITwc8oPwMOWhgorPzzcbhWEb+4oLi953h45FklDmM8dPSZ7hNHpIk9p/SCZKUYn35t5fjGtHA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.5.tgz", + "integrity": "sha512-6UbBBplywkk/R+PqqioskUeXfKcBht3KU7juTi1UszJLx0KPXUo10v2Ok04iBJIaDPkIFkUOVboXms5Yxvaz+g==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.5.tgz", + "integrity": "sha512-hwALf2K9FHuiXTPqmo1KeOb83fTRNbe9r/Ixv9ZNQ/R24yw8Ge1HOWDDgTdtzntIaIUJG5dfXCf4g9AD4RiyhQ==", + "bundleDependencies": [ + "@napi-rs/wasm-runtime", + "@emnapi/core", + "@emnapi/runtime", + "@tybys/wasm-util", + "@emnapi/wasi-threads", + "tslib" + ], + "cpu": [ + "wasm32" + ], + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.4.3", + "@emnapi/runtime": "^1.4.3", + "@emnapi/wasi-threads": "^1.0.2", + "@napi-rs/wasm-runtime": "^0.2.9", + "@tybys/wasm-util": "^0.9.0", + "tslib": "^2.8.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.5.tgz", + "integrity": "sha512-oDKncffWzaovJbkuR7/OTNFRJQVdiw/n8HnzaCItrNQUeQgjy7oUiYpsm9HUBgpmvmDpSSbGaCa2Evzvk3eFmA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.5.tgz", + "integrity": "sha512-WiR4dtyrFdbb+ov0LK+7XsFOsG+0xs0PKZKkt41KDn9jYpO7baE3bXiudPVkTqUEwNfiglCygQHl2jklvSBi7Q==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/autoprefixer": { + "version": "10.4.21", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.21.tgz", + "integrity": "sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "browserslist": "^4.24.4", + "caniuse-lite": "^1.0.30001702", + "fraction.js": "^4.3.7", + "normalize-range": "^0.1.2", + "picocolors": "^1.1.1", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.24.5", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.5.tgz", + "integrity": "sha512-FDToo4Wo82hIdgc1CQ+NQD0hEhmpPjrZ3hiUgwgOG6IuTdlpr8jdjyG24P6cNP1yJpTLzS5OcGgSw0xmDU1/Tw==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "caniuse-lite": "^1.0.30001716", + "electron-to-chromium": "^1.5.149", + "node-releases": "^2.0.19", + "update-browserslist-db": "^1.1.3" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001717", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001717.tgz", + "integrity": "sha512-auPpttCq6BDEG8ZAuHJIplGw6GODhjw+/11e7IjpnYCxZcW/ONgPs0KVBJ0d1bY3e2+7PRe5RCLyP+PfwVgkYw==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chalk/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chalk/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/chalk/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "license": "MIT" + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/css-blank-pseudo": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-7.0.1.tgz", + "integrity": "sha512-jf+twWGDf6LDoXDUode+nc7ZlrqfaNphrBIBrcmeP3D8yw1uPaix1gCC8LUQUGQ6CycuK2opkbFFWFuq/a94ag==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/css-has-pseudo": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-7.0.2.tgz", + "integrity": "sha512-nzol/h+E0bId46Kn2dQH5VElaknX2Sr0hFuB/1EomdC7j+OISt2ZzK7EHX9DZDY53WbIVAR7FYKSO2XnSf07MQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/selector-specificity": "^5.0.0", + "postcss-selector-parser": "^7.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/css-prefers-color-scheme": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-10.0.0.tgz", + "integrity": "sha512-VCtXZAWivRglTZditUfB4StnsWr6YVZ2PRtuxQLKTNRdtAf8tpzaVPE9zXIF3VaSc7O70iK/j1+NXxyQCqdPjQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/cssdb": { + "version": "8.2.5", + "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-8.2.5.tgz", + "integrity": "sha512-leAt8/hdTCtzql9ZZi86uYAmCLzVKpJMMdjbvOGVnXFXz/BWFpBmM1MHEHU/RqtPyRYmabVmEW1DtX3YGLuuLA==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + } + ], + "license": "MIT-0" + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/dependency-graph": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-1.0.0.tgz", + "integrity": "sha512-cW3gggJ28HZ/LExwxP2B++aiKxhJXMSIt9K48FOXQkm+vuG5gyatXnLsONRJdzO/7VfjDIiaOOa/bs4l464Lwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", + "license": "Apache-2.0", + "bin": { + "detect-libc": "bin/detect-libc.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.151", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.151.tgz", + "integrity": "sha512-Rl6uugut2l9sLojjS4H4SAr3A4IgACMLgpuEMPYCVcKydzfyPrn5absNRju38IhQOf/NwjJY8OGWjlteqYeBCA==", + "license": "ISC" + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/enhanced-resolve": { + "version": "5.18.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.1.tgz", + "integrity": "sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fraction.js": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", + "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", + "license": "MIT", + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/fs-extra": { + "version": "11.3.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.0.tgz", + "integrity": "sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/generic-names": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/generic-names/-/generic-names-4.0.0.tgz", + "integrity": "sha512-ySFolZQfw9FoDb3ed9d80Cm9f0+r7qj+HJkWjeD9RBfpxEVTlVhol+gvaQB/78WbwYfbnNh8nWHHBSlg072y6A==", + "license": "MIT", + "dependencies": { + "loader-utils": "^3.2.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "license": "ISC" + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "license": "ISC", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/jiti": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.4.2.tgz", + "integrity": "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==", + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/lightningcss": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.29.2.tgz", + "integrity": "sha512-6b6gd/RUXKaw5keVdSEtqFVdzWnU5jMxTUjA2bVcMNPLwSQ08Sv/UodBVtETLCn7k4S1Ibxwh7k68IwLZPgKaA==", + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-darwin-arm64": "1.29.2", + "lightningcss-darwin-x64": "1.29.2", + "lightningcss-freebsd-x64": "1.29.2", + "lightningcss-linux-arm-gnueabihf": "1.29.2", + "lightningcss-linux-arm64-gnu": "1.29.2", + "lightningcss-linux-arm64-musl": "1.29.2", + "lightningcss-linux-x64-gnu": "1.29.2", + "lightningcss-linux-x64-musl": "1.29.2", + "lightningcss-win32-arm64-msvc": "1.29.2", + "lightningcss-win32-x64-msvc": "1.29.2" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.29.2.tgz", + "integrity": "sha512-cK/eMabSViKn/PG8U/a7aCorpeKLMlK0bQeNHmdb7qUnBkNPnL+oV5DjJUo0kqWsJUapZsM4jCfYItbqBDvlcA==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.29.2.tgz", + "integrity": "sha512-j5qYxamyQw4kDXX5hnnCKMf3mLlHvG44f24Qyi2965/Ycz829MYqjrVg2H8BidybHBp9kom4D7DR5VqCKDXS0w==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.29.2.tgz", + "integrity": "sha512-wDk7M2tM78Ii8ek9YjnY8MjV5f5JN2qNVO+/0BAGZRvXKtQrBC4/cn4ssQIpKIPP44YXw6gFdpUF+Ps+RGsCwg==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.29.2.tgz", + "integrity": "sha512-IRUrOrAF2Z+KExdExe3Rz7NSTuuJ2HvCGlMKoquK5pjvo2JY4Rybr+NrKnq0U0hZnx5AnGsuFHjGnNT14w26sg==", + "cpu": [ + "arm" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.29.2.tgz", + "integrity": "sha512-KKCpOlmhdjvUTX/mBuaKemp0oeDIBBLFiU5Fnqxh1/DZ4JPZi4evEH7TKoSBFOSOV3J7iEmmBaw/8dpiUvRKlQ==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.29.2.tgz", + "integrity": "sha512-Q64eM1bPlOOUgxFmoPUefqzY1yV3ctFPE6d/Vt7WzLW4rKTv7MyYNky+FWxRpLkNASTnKQUaiMJ87zNODIrrKQ==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.29.2.tgz", + "integrity": "sha512-0v6idDCPG6epLXtBH/RPkHvYx74CVziHo6TMYga8O2EiQApnUPZsbR9nFNrg2cgBzk1AYqEd95TlrsL7nYABQg==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.29.2.tgz", + "integrity": "sha512-rMpz2yawkgGT8RULc5S4WiZopVMOFWjiItBT7aSfDX4NQav6M44rhn5hjtkKzB+wMTRlLLqxkeYEtQ3dd9696w==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.29.2.tgz", + "integrity": "sha512-nL7zRW6evGQqYVu/bKGK+zShyz8OVzsCotFgc7judbt6wnB2KbiKKJwBE4SGoDBQ1O94RjW4asrCjQL4i8Fhbw==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.29.2.tgz", + "integrity": "sha512-EdIUW3B2vLuHmv7urfzMI/h2fmlnOQBk1xlsDxkN1tCWKjNFjfLhGxYk8C8mzpSfr+A6jFFIi8fU6LbQGsRWjA==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss/node_modules/detect-libc": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz", + "integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==", + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/lilconfig": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/loader-utils": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.3.1.tgz", + "integrity": "sha512-FMJTLMXfCLMLfJxcX9PFqX5qD88Z5MRGaZCVzfuqeZSPsyiBzs+pahDQjbIWz2QIzPZz0NX9Zy4FX3lmK6YHIg==", + "license": "MIT", + "engines": { + "node": ">= 12.13.0" + } + }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", + "license": "MIT" + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", + "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/node-addon-api": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", + "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", + "license": "MIT" + }, + "node_modules/node-releases": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", + "license": "MIT" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss": { + "version": "8.5.3", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", + "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.8", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-attribute-case-insensitive": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-7.0.1.tgz", + "integrity": "sha512-Uai+SupNSqzlschRyNx3kbCTWgY/2hcwtHEI/ej2LJWc9JJ77qKgGptd8DHwY1mXtZ7Aoh4z4yxfwMBue9eNgw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-clamp": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-clamp/-/postcss-clamp-4.1.0.tgz", + "integrity": "sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=7.6.0" + }, + "peerDependencies": { + "postcss": "^8.4.6" + } + }, + "node_modules/postcss-cli": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/postcss-cli/-/postcss-cli-11.0.1.tgz", + "integrity": "sha512-0UnkNPSayHKRe/tc2YGW6XnSqqOA9eqpiRMgRlV1S6HdGi16vwJBx7lviARzbV1HpQHqLLRH3o8vTcB0cLc+5g==", + "dev": true, + "license": "MIT", + "dependencies": { + "chokidar": "^3.3.0", + "dependency-graph": "^1.0.0", + "fs-extra": "^11.0.0", + "picocolors": "^1.0.0", + "postcss-load-config": "^5.0.0", + "postcss-reporter": "^7.0.0", + "pretty-hrtime": "^1.0.3", + "read-cache": "^1.0.0", + "slash": "^5.0.0", + "tinyglobby": "^0.2.12", + "yargs": "^17.0.0" + }, + "bin": { + "postcss": "index.js" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-color-functional-notation": { + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-7.0.9.tgz", + "integrity": "sha512-WScwD3pSsIz+QP97sPkGCeJm7xUH0J18k6zV5o8O2a4cQJyv15vLUx/WFQajuJVgZhmJL5awDu8zHnqzAzm4lw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.0.9", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "@csstools/postcss-progressive-custom-properties": "^4.0.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-color-hex-alpha": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-10.0.0.tgz", + "integrity": "sha512-1kervM2cnlgPs2a8Vt/Qbe5cQ++N7rkYo/2rz2BkqJZIHQwaVuJgQH38REHrAi4uM0b1fqxMkWYmese94iMp3w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-color-rebeccapurple": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-10.0.0.tgz", + "integrity": "sha512-JFta737jSP+hdAIEhk1Vs0q0YF5P8fFcj+09pweS8ktuGuZ8pPlykHsk6mPxZ8awDl4TrcxUqJo9l1IhVr/OjQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-custom-media": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-11.0.5.tgz", + "integrity": "sha512-SQHhayVNgDvSAdX9NQ/ygcDQGEY+aSF4b/96z7QUX6mqL5yl/JgG/DywcF6fW9XbnCRE+aVYk+9/nqGuzOPWeQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/cascade-layer-name-parser": "^2.0.4", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "@csstools/media-query-list-parser": "^4.0.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-custom-properties": { + "version": "14.0.4", + "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-14.0.4.tgz", + "integrity": "sha512-QnW8FCCK6q+4ierwjnmXF9Y9KF8q0JkbgVfvQEMa93x1GT8FvOiUevWCN2YLaOWyByeDX8S6VFbZEeWoAoXs2A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/cascade-layer-name-parser": "^2.0.4", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-custom-selectors": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-8.0.4.tgz", + "integrity": "sha512-ASOXqNvDCE0dAJ/5qixxPeL1aOVGHGW2JwSy7HyjWNbnWTQCl+fDc968HY1jCmZI0+BaYT5CxsOiUhavpG/7eg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/cascade-layer-name-parser": "^2.0.4", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-dir-pseudo-class": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-9.0.1.tgz", + "integrity": "sha512-tRBEK0MHYvcMUrAuYMEOa0zg9APqirBcgzi6P21OhxtJyJADo/SWBwY1CAwEohQ/6HDaa9jCjLRG7K3PVQYHEA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-double-position-gradients": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-6.0.1.tgz", + "integrity": "sha512-ZitCwmvOR4JzXmKw6sZblTgwV1dcfLvClcyjADuqZ5hU0Uk4SVNpvSN9w8NcJ7XuxhRYxVA8m8AB3gy+HNBQOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/postcss-progressive-custom-properties": "^4.0.1", + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-focus-visible": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-10.0.1.tgz", + "integrity": "sha512-U58wyjS/I1GZgjRok33aE8juW9qQgQUNwTSdxQGuShHzwuYdcklnvK/+qOWX1Q9kr7ysbraQ6ht6r+udansalA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-focus-within": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-9.0.1.tgz", + "integrity": "sha512-fzNUyS1yOYa7mOjpci/bR+u+ESvdar6hk8XNK/TRR0fiGTp2QT5N+ducP0n3rfH/m9I7H/EQU6lsa2BrgxkEjw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-font-variant": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz", + "integrity": "sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==", + "license": "MIT", + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-gap-properties": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-6.0.0.tgz", + "integrity": "sha512-Om0WPjEwiM9Ru+VhfEDPZJAKWUd0mV1HmNXqp2C29z80aQ2uP9UVhLc7e3aYMIor/S5cVhoPgYQ7RtfeZpYTRw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-image-set-function": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-7.0.0.tgz", + "integrity": "sha512-QL7W7QNlZuzOwBTeXEmbVckNt1FSmhQtbMRvGGqqU4Nf4xk6KUEQhAoWuMzwbSv5jxiRiSZ5Tv7eiDB9U87znA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-js": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", + "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", + "license": "MIT", + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/postcss-lab-function": { + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-7.0.9.tgz", + "integrity": "sha512-IGbsIXbqMDusymJAKYX+f9oakPo89wL9Pzd/qRBQOVf3EIQWT9hgvqC4Me6Dkzxp3KPuIBf6LPkjrLHe/6ZMIQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.0.9", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "@csstools/postcss-progressive-custom-properties": "^4.0.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-load-config": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-5.1.0.tgz", + "integrity": "sha512-G5AJ+IX0aD0dygOE0yFZQ/huFFMSNneyfp0e3/bT05a8OfPC5FUoZRPfGijUdGOJNMewJiwzcHJXFafFzeKFVA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "lilconfig": "^3.1.1", + "yaml": "^2.4.2" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "jiti": ">=1.21.0", + "postcss": ">=8.0.9", + "tsx": "^4.8.1" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + }, + "postcss": { + "optional": true + }, + "tsx": { + "optional": true + } + } + }, + "node_modules/postcss-logical": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-8.1.0.tgz", + "integrity": "sha512-pL1hXFQ2fEXNKiNiAgtfA005T9FBxky5zkX6s4GZM2D8RkVgRqz3f4g1JUoq925zXv495qk8UNldDwh8uGEDoA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-mixins": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/postcss-mixins/-/postcss-mixins-11.0.3.tgz", + "integrity": "sha512-HZa6DHlN7uCkp7GTFNvhpyK/Gi9+vrVG7FPl2oQdj+sXUuYo4ri9OsWBseTnvnLfWxRWOq8/VwcHcixtZPrRRg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "postcss-js": "^4.0.1", + "postcss-simple-vars": "^7.0.1", + "sugarss": "^4.0.1", + "tinyglobby": "^0.2.7" + }, + "engines": { + "node": "^18.0 || ^ 20.0 || >= 22.0" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-modules": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-modules/-/postcss-modules-6.0.1.tgz", + "integrity": "sha512-zyo2sAkVvuZFFy0gc2+4O+xar5dYlaVy/ebO24KT0ftk/iJevSNyPyQellsBLlnccwh7f6V6Y4GvuKRYToNgpQ==", + "license": "MIT", + "dependencies": { + "generic-names": "^4.0.0", + "icss-utils": "^5.1.0", + "lodash.camelcase": "^4.3.0", + "postcss-modules-extract-imports": "^3.1.0", + "postcss-modules-local-by-default": "^4.0.5", + "postcss-modules-scope": "^3.2.0", + "postcss-modules-values": "^4.0.0", + "string-hash": "^1.1.3" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-modules-extract-imports": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", + "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==", + "license": "ISC", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-local-by-default": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.2.0.tgz", + "integrity": "sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==", + "license": "MIT", + "dependencies": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^7.0.0", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-scope": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.1.tgz", + "integrity": "sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==", + "license": "ISC", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "license": "ISC", + "dependencies": { + "icss-utils": "^5.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-nesting": { + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-13.0.1.tgz", + "integrity": "sha512-VbqqHkOBOt4Uu3G8Dm8n6lU5+9cJFxiuty9+4rcoyRPO9zZS1JIs6td49VIoix3qYqELHlJIn46Oih9SAKo+yQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/selector-resolve-nested": "^3.0.0", + "@csstools/selector-specificity": "^5.0.0", + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-opacity-percentage": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-opacity-percentage/-/postcss-opacity-percentage-3.0.0.tgz", + "integrity": "sha512-K6HGVzyxUxd/VgZdX04DCtdwWJ4NGLG212US4/LA1TLAbHgmAsTWVR86o+gGIbFtnTkfOpb9sCRBx8K7HO66qQ==", + "funding": [ + { + "type": "kofi", + "url": "https://ko-fi.com/mrcgrtz" + }, + { + "type": "liberapay", + "url": "https://liberapay.com/mrcgrtz" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-overflow-shorthand": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-6.0.0.tgz", + "integrity": "sha512-BdDl/AbVkDjoTofzDQnwDdm/Ym6oS9KgmO7Gr+LHYjNWJ6ExORe4+3pcLQsLA9gIROMkiGVjjwZNoL/mpXHd5Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-page-break": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-3.0.4.tgz", + "integrity": "sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==", + "license": "MIT", + "peerDependencies": { + "postcss": "^8" + } + }, + "node_modules/postcss-place": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-10.0.0.tgz", + "integrity": "sha512-5EBrMzat2pPAxQNWYavwAfoKfYcTADJ8AXGVPcUZ2UkNloUTWzJQExgrzrDkh3EKzmAx1evfTAzF9I8NGcc+qw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-plugin": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/postcss-plugin/-/postcss-plugin-1.0.0.tgz", + "integrity": "sha512-w0SKz9cKfp/wN8baHB/JXZUTBSrUP6/mqDiony+aAVlPXOhTkSXmJ8T5IuhZgHYdV4R/HA3P0N26rG1Sp0oP/A==", + "license": "ISC", + "dependencies": { + "postcss": "^6.0.8" + } + }, + "node_modules/postcss-plugin/node_modules/postcss": { + "version": "6.0.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "license": "MIT", + "dependencies": { + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.4.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/postcss-preset-env": { + "version": "10.1.6", + "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-10.1.6.tgz", + "integrity": "sha512-1jRD7vttKLJ7o0mcmmYWKRLm7W14rI8K1I7Y41OeXUPEVc/CAzfTssNUeJ0zKbR+zMk4boqct/gwS/poIFF5Lg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/postcss-cascade-layers": "^5.0.1", + "@csstools/postcss-color-function": "^4.0.9", + "@csstools/postcss-color-mix-function": "^3.0.9", + "@csstools/postcss-content-alt-text": "^2.0.5", + "@csstools/postcss-exponential-functions": "^2.0.8", + "@csstools/postcss-font-format-keywords": "^4.0.0", + "@csstools/postcss-gamut-mapping": "^2.0.9", + "@csstools/postcss-gradients-interpolation-method": "^5.0.9", + "@csstools/postcss-hwb-function": "^4.0.9", + "@csstools/postcss-ic-unit": "^4.0.1", + "@csstools/postcss-initial": "^2.0.1", + "@csstools/postcss-is-pseudo-class": "^5.0.1", + "@csstools/postcss-light-dark-function": "^2.0.8", + "@csstools/postcss-logical-float-and-clear": "^3.0.0", + "@csstools/postcss-logical-overflow": "^2.0.0", + "@csstools/postcss-logical-overscroll-behavior": "^2.0.0", + "@csstools/postcss-logical-resize": "^3.0.0", + "@csstools/postcss-logical-viewport-units": "^3.0.3", + "@csstools/postcss-media-minmax": "^2.0.8", + "@csstools/postcss-media-queries-aspect-ratio-number-values": "^3.0.4", + "@csstools/postcss-nested-calc": "^4.0.0", + "@csstools/postcss-normalize-display-values": "^4.0.0", + "@csstools/postcss-oklab-function": "^4.0.9", + "@csstools/postcss-progressive-custom-properties": "^4.0.1", + "@csstools/postcss-random-function": "^2.0.0", + "@csstools/postcss-relative-color-syntax": "^3.0.9", + "@csstools/postcss-scope-pseudo-class": "^4.0.1", + "@csstools/postcss-sign-functions": "^1.1.3", + "@csstools/postcss-stepped-value-functions": "^4.0.8", + "@csstools/postcss-text-decoration-shorthand": "^4.0.2", + "@csstools/postcss-trigonometric-functions": "^4.0.8", + "@csstools/postcss-unset-value": "^4.0.0", + "autoprefixer": "^10.4.21", + "browserslist": "^4.24.4", + "css-blank-pseudo": "^7.0.1", + "css-has-pseudo": "^7.0.2", + "css-prefers-color-scheme": "^10.0.0", + "cssdb": "^8.2.5", + "postcss-attribute-case-insensitive": "^7.0.1", + "postcss-clamp": "^4.1.0", + "postcss-color-functional-notation": "^7.0.9", + "postcss-color-hex-alpha": "^10.0.0", + "postcss-color-rebeccapurple": "^10.0.0", + "postcss-custom-media": "^11.0.5", + "postcss-custom-properties": "^14.0.4", + "postcss-custom-selectors": "^8.0.4", + "postcss-dir-pseudo-class": "^9.0.1", + "postcss-double-position-gradients": "^6.0.1", + "postcss-focus-visible": "^10.0.1", + "postcss-focus-within": "^9.0.1", + "postcss-font-variant": "^5.0.0", + "postcss-gap-properties": "^6.0.0", + "postcss-image-set-function": "^7.0.0", + "postcss-lab-function": "^7.0.9", + "postcss-logical": "^8.1.0", + "postcss-nesting": "^13.0.1", + "postcss-opacity-percentage": "^3.0.0", + "postcss-overflow-shorthand": "^6.0.0", + "postcss-page-break": "^3.0.4", + "postcss-place": "^10.0.0", + "postcss-pseudo-class-any-link": "^10.0.1", + "postcss-replace-overflow-wrap": "^4.0.0", + "postcss-selector-not": "^8.0.1" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-pseudo-class-any-link": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-10.0.1.tgz", + "integrity": "sha512-3el9rXlBOqTFaMFkWDOkHUTQekFIYnaQY55Rsp8As8QQkpiSgIYEcF/6Ond93oHiDsGb4kad8zjt+NPlOC1H0Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-replace-overflow-wrap": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz", + "integrity": "sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==", + "license": "MIT", + "peerDependencies": { + "postcss": "^8.0.3" + } + }, + "node_modules/postcss-reporter": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-reporter/-/postcss-reporter-7.1.0.tgz", + "integrity": "sha512-/eoEylGWyy6/DOiMP5lmFRdmDKThqgn7D6hP2dXKJI/0rJSO1ADFNngZfDzxL0YAxFvws+Rtpuji1YIHj4mySA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "picocolors": "^1.0.0", + "thenby": "^1.3.4" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-selector-not": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-8.0.1.tgz", + "integrity": "sha512-kmVy/5PYVb2UOhy0+LqUYAhKj7DUGDpSWa5LZqlkWJaaAV+dxxsOG3+St0yNLu6vsKD7Dmqx+nWQt0iil89+WA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-simple-vars": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-simple-vars/-/postcss-simple-vars-7.0.1.tgz", + "integrity": "sha512-5GLLXaS8qmzHMOjVxqkk1TZPf1jMqesiI7qLhnlyERalG0sMbHIbJqrcnrpmZdKCLglHnRHoEBB61RtGTsj++A==", + "license": "MIT", + "engines": { + "node": ">=14.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.2.1" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "license": "MIT" + }, + "node_modules/pretty-hrtime": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", + "integrity": "sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/slash": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", + "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/string-hash": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/string-hash/-/string-hash-1.1.3.tgz", + "integrity": "sha512-kJUvRUFK49aub+a7T1nNE66EJbZBMnBgoC1UbCZ5n6bsZKBRga4KgBRTMn/pFkeCZSYtNeSyMxPDM0AXWELk2A==", + "license": "CC0-1.0" + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/sugarss": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/sugarss/-/sugarss-4.0.1.tgz", + "integrity": "sha512-WCjS5NfuVJjkQzK10s8WOBY+hhDxxNt/N6ZaGwxFZ+wN3/lKKFSaaKUNecULcTTvE4urLcKaZFQD8vO0mOZujw==", + "license": "MIT", + "engines": { + "node": ">=12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.3.3" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/tailwindcss": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.5.tgz", + "integrity": "sha512-nYtSPfWGDiWgCkwQG/m+aX83XCwf62sBgg3bIlNiiOcggnS1x3uVRDAuyelBFL+vJdOPPCGElxv9DjHJjRHiVA==", + "license": "MIT" + }, + "node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/thenby": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/thenby/-/thenby-1.3.4.tgz", + "integrity": "sha512-89Gi5raiWA3QZ4b2ePcEwswC3me9JIg+ToSgtE0JWeCynLnLxNr/f9G+xfo9K+Oj4AFdom8YNJjibIARTJmapQ==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/tinyglobby": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.13.tgz", + "integrity": "sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==", + "license": "MIT", + "dependencies": { + "fdir": "^6.4.4", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.4.4", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.4.tgz", + "integrity": "sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==", + "license": "MIT", + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", + "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yaml": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.1.tgz", + "integrity": "sha512-10ULxpnOCQXxJvBgxsn9ptjq6uviG/htZKk9veJGhlqn3w/DxQ631zFF+nlQXLwmImeS5amR2dl2U8sg6U9jsQ==", + "dev": true, + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..ae7d940 --- /dev/null +++ b/package.json @@ -0,0 +1,13 @@ +{ + "dependencies": { + "postcss-mixins": "^11.0.3", + "postcss-modules": "^6.0.1", + "postcss-plugin": "^1.0.0", + "postcss-preset-env": "^10.1.6", + "postcss-simple-vars": "^7.0.1", + }, + "devDependencies": { + "postcss": "^8.5.3", + "postcss-cli": "^11.0.1" + } +} diff --git a/postcss.config.js b/postcss.config.js new file mode 100644 index 0000000..8ff57f8 --- /dev/null +++ b/postcss.config.js @@ -0,0 +1,15 @@ +module.exports = () => ({ + plugins: [ + require('postcss-simple-vars')(), + require('postcss-preset-env')(), + require('postcss-mixins')(), + require("postcss-modules")({ + getJSON: function(_, json, outputFileName) { + var path = require("path"); + var fs = require("fs"); + var jsonFileName = path.resolve(outputFileName + ".map"); + fs.writeFileSync(jsonFileName, JSON.stringify(json)); + }, + }), + ] +}); diff --git a/src/app/button_set.rs b/src/app/button_set.rs new file mode 100644 index 0000000..48a6c76 --- /dev/null +++ b/src/app/button_set.rs @@ -0,0 +1,68 @@ +use istyles::istyles; +use leptos::{prelude::*, tachys::html}; +use web_sys::MouseEvent; + +istyles!(styles, "assets/module.postcss/button_set.module.css.map"); + +#[component] +pub fn ButtonSet( + #[prop(default = String::new())] class_name: String, + children: Children, +) -> impl IntoView { + let class = format!("{} {}", styles::set, class_name); + + view! {
{children()}
} +} + +#[component] +pub fn Button( + #[prop(default = false)] is_primary: bool, + #[prop(default = false)] is_small: bool, + #[prop(optional)] icon_left: Option, + #[prop(optional)] icon_right: Option, + #[prop(optional)] node_ref: NodeRef, + on_click: C, + children: Children, +) -> impl IntoView +where + C: FnMut(MouseEvent) + Send + 'static, +{ + let class = format!( + "{} {}", + if is_primary { + styles::primary + } else { + styles::secondary + }, + if is_small { styles::small } else { "" } + ); + + let icon_left = move || { + if let Some(icon) = icon_left { + view! { {icon} }.into_any() + } else { + ().into_any() + } + }; + + let icon_right = move || { + if let Some(icon) = icon_right { + view! { {icon} }.into_any() + } else { + ().into_any() + } + }; + + view! { + + } +} + +#[component] +pub fn Rule() -> impl IntoView { + view! { } +} diff --git a/src/app/config_element.rs b/src/app/config_element.rs new file mode 100644 index 0000000..ff31545 --- /dev/null +++ b/src/app/config_element.rs @@ -0,0 +1,50 @@ +use istyles::istyles; +use leptos::prelude::*; +use web_sys::Event; + +use crate::app::menu_item::MenuItem; + +istyles!( + styles, + "assets/module.postcss/config_element.module.css.map" +); + +#[component] +pub fn Select( + on_change: E, + name: String, + #[prop(default = true)] is_default: bool, + children: Children, +) -> impl IntoView +where + E: FnMut(Event) + Send + 'static, +{ + view! { + + + + } +} + +#[component] +pub fn ConfigElement( + name: String, + #[prop(default = true)] is_default: bool, + children: Children, +) -> impl IntoView { + let style = if is_default { + styles::name + } else { + styles::notDefault + }; + view! { + +
+ {name} +
{children()}
+
+
+ } +} diff --git a/src/app/config_menu.rs b/src/app/config_menu.rs new file mode 100644 index 0000000..08bbfa9 --- /dev/null +++ b/src/app/config_menu.rs @@ -0,0 +1,118 @@ +use leptos::prelude::*; +use reactive_stores::Store; +use wasm_bindgen::JsValue; +use web_sys::{Event, HtmlSelectElement}; + +use crate::{ + SQLightError, + app::{ + GlobalState, GlobalStateStoreFields, Orientation, Theme, + config_element::Select as SelectConfig, menu_group::MenuGroup, + }, +}; + +const ACE_KEYBOARDS: [&str; 5] = ["ace", "emacs", "sublime", "vim", "vscode"]; +const ACE_THEMES: [&str; 3] = ["github", "github_dark", "gruvbox"]; + +fn selecet_view(s: &str, selected: &str) -> AnyView { + if s == selected { + view! { + + } + .into_any() + } else { + view! { }.into_any() + } +} + +#[component] +pub fn ConfigMenu() -> impl IntoView { + let state = expect_context::>(); + + let ace_keyboard_change = move |event: Event| { + if let Some(target) = event.target() { + let select = HtmlSelectElement::from(JsValue::from(target)); + state.editor_config().write().keyboard = select.value(); + if let Some(Err(err)) = state.editor().read().as_ref().map(|editor| { + editor.set_keyboard_handler(&format!("ace/keyboard/{}", select.value())) + }) { + state + .last_error() + .set(Some(SQLightError::new_ace_editor(err))); + } + } + }; + + let ace_theme_change = move |event: Event| { + if let Some(target) = event.target() { + let select = HtmlSelectElement::from(JsValue::from(target)); + state.editor_config().write().theme = select.value(); + if let Some(Err(err)) = state + .editor() + .read() + .as_ref() + .map(|editor| editor.set_theme(&format!("ace/theme/{}", select.value()))) + { + state + .last_error() + .set(Some(SQLightError::new_ace_editor(err))); + } + } + }; + + let theme_change = move |event: Event| { + if let Some(target) = event.target() { + let select = HtmlSelectElement::from(JsValue::from(target)); + *state.theme().write() = Theme::from_value(&select.value()); + } + }; + + let orientation_change = move |event: Event| { + if let Some(target) = event.target() { + let select = HtmlSelectElement::from(JsValue::from(target)); + *state.orientation().write() = Orientation::from_value(&select.value()); + } + }; + + view! { + + + {move || { + ACE_KEYBOARDS + .into_iter() + .map(|s| selecet_view(s, &state.editor_config().read().keyboard)) + .collect_view() + }} + + + {move || { + ACE_THEMES + .into_iter() + .map(|s| selecet_view(s, &state.editor_config().read().theme)) + .collect_view() + }} + + + + + + {move || { + ["System", "Light", "Dark"] + .into_iter() + .map(|s| selecet_view(s, &state.theme().read().to_value())) + .collect_view() + }} + + + {move || { + ["Automatic", "Horizontal", "Vertical"] + .into_iter() + .map(|s| selecet_view(s, &state.orientation().read().to_value())) + .collect_view() + }} + + + } +} diff --git a/src/app/context_menu.rs b/src/app/context_menu.rs new file mode 100644 index 0000000..c8fa858 --- /dev/null +++ b/src/app/context_menu.rs @@ -0,0 +1,36 @@ +use leptos::prelude::*; +use reactive_stores::Store; + +use crate::app::{ + GlobalState, GlobalStateStoreFields, menu_group::MenuGroup, select_one::SelectOne, +}; + +#[component] +pub fn ContextMenu() -> impl IntoView { + let state = expect_context::>(); + + view! { + + + "Each execution is in a new DB." + + + "Keep the results of each execution." + + + } +} diff --git a/src/app/editor.rs b/src/app/editor.rs new file mode 100644 index 0000000..6a46e66 --- /dev/null +++ b/src/app/editor.rs @@ -0,0 +1,60 @@ +use aceditor::EditorOptionsBuilder; +use istyles::istyles; +use leptos::prelude::*; +use reactive_stores::Store; +use wasm_bindgen_futures::spawn_local; +use web_sys::UrlSearchParams; + +use crate::{ + SQLightError, + app::{GlobalState, GlobalStateStoreFields, header::execute}, +}; + +istyles!(styles, "assets/module.postcss/editor.module.css.map"); + +#[component] +pub fn Editor() -> impl IntoView { + let state = expect_context::>(); + + let editor_ref = NodeRef::new(); + + editor_ref.on_load(move |_| { + let shared_code = || { + let search = window().location().search().ok()?; + let params = UrlSearchParams::new_with_str(&search).ok()?; + params.get("code") + }; + let opt = EditorOptionsBuilder::default() + .mode("ace/mode/sql") + .theme(&format!( + "ace/theme/{}", + state.editor_config().read_untracked().theme + )) + .keyboard(&format!( + "ace/keyboard/{}", + state.editor_config().read_untracked().keyboard + )) + .value(&shared_code().unwrap_or_else(|| state.code().get_untracked())) + .build(); + + match aceditor::Editor::open("ace_editor", Some(&opt)) { + Ok(editor) => state.editor().set(Some(editor)), + Err(err) => state + .last_error() + .set(Some(SQLightError::new_ace_editor(err))), + } + + spawn_local(async move { + if let Err(err) = aceditor::Editor::define_vim_w(execute(state)).await { + state + .last_error() + .set(Some(SQLightError::new_ace_editor(err))); + } + }); + }); + view! { +
+
+
+ } +} diff --git a/src/app/header.rs b/src/app/header.rs new file mode 100644 index 0000000..e330c19 --- /dev/null +++ b/src/app/header.rs @@ -0,0 +1,187 @@ +use istyles::istyles; +use leptos::{prelude::*, tachys::html}; +use reactive_stores::Store; +use web_sys::{Url, UrlSearchParams}; + +use crate::{ + PrepareOptions, WorkerRequest, + app::{ + button_set::{Button, ButtonSet, Rule}, + config_menu::ConfigMenu, + context_menu::ContextMenu, + icon::{build_icon, config_icon, expandable_icon}, + output::change_focus, + pop_button::PopButton, + state::{Focus, GlobalState, GlobalStateStoreFields}, + vfs_menu::VfsMenu, + }, +}; + +istyles!(styles, "assets/module.postcss/header.module.css.map"); + +#[component] +pub fn Header() -> impl IntoView { + let menu_container = NodeRef::new(); + + view! { + <> + +
+ + } +} + +pub fn execute(state: Store) -> Box { + Box::new(move || { + let Some(code) = state + .editor() + .read_untracked() + .as_ref() + .map(|editor| editor.get_value()) + else { + return; + }; + state.code().set(code.clone()); + change_focus(state, Some(Focus::Execute)); + std::mem::take(&mut *state.output().write()); + if let Some(worker) = &*state.worker().read_untracked() { + worker.send_task(WorkerRequest::Prepare(PrepareOptions { + id: String::new(), + sql: code, + clear_on_prepare: !*state.keep_ctx().read_untracked(), + })); + worker.send_task(WorkerRequest::Continue(String::new())); + } + }) +} + +#[component] +fn ExecuteButton() -> impl IntoView { + let state = expect_context::>(); + + let on_click = execute(state); + + view! { + + } +} + +#[component] +fn VfsMenuButton(menu_container: NodeRef) -> impl IntoView { + let state = expect_context::>(); + + let button = move |toggle, node_ref| { + view! { + + } + .into_any() + }; + + view! { + }.into_any() }) + menu_container=menu_container + > + } +} + +#[component] +fn ContextMenuButton(menu_container: NodeRef) -> impl IntoView { + let state = expect_context::>(); + + let button = move |toggle, node_ref| { + view! { + + } + .into_any() + }; + + view! { + }.into_any() }) + menu_container=menu_container + > + } +} + +#[component] +fn ConfigMenuButton(menu_container: NodeRef) -> impl IntoView { + let button = |toggle, node_ref| { + view! { + + } + .into_any() + }; + + view! { + }.into_any() }) + menu_container=menu_container + > + } +} + +#[component] +fn ShareButton() -> impl IntoView { + let state = expect_context::>(); + + let click = move |_| { + let Some(code) = state + .editor() + .read() + .as_ref() + .map(|editor| editor.get_value()) + else { + return; + }; + + if let Ok(href) = window().location().href().and_then(|href| { + let url = Url::new(&href)?; + let params = UrlSearchParams::new()?; + params.set("code", &code); + url.set_search(¶ms.to_string().as_string().unwrap()); + Ok(url.href()) + }) { + *state.share_href().write() = Some(href); + change_focus(state, Some(Focus::Share)); + } + }; + + view! { } +} diff --git a/src/app/icon.rs b/src/app/icon.rs new file mode 100644 index 0000000..8cd70c6 --- /dev/null +++ b/src/app/icon.rs @@ -0,0 +1,81 @@ +use istyles::istyles; +use leptos::prelude::*; + +istyles!(styles, "assets/module.postcss/icon.module.css.map"); + +pub fn build_icon() -> AnyView { + view! { + + + + } + .into_any() +} + +pub fn config_icon() -> AnyView { + view! { + + + + }.into_any() +} + +pub fn expandable_icon() -> AnyView { + view! { + + + + } + .into_any() +} + +pub fn checkmark_icon() -> AnyView { + view! { + + + + } + .into_any() +} + +pub fn clipboard_icon() -> AnyView { + view! { + + + + + + + }.into_any() +} diff --git a/src/app/loader.rs b/src/app/loader.rs new file mode 100644 index 0000000..8f74472 --- /dev/null +++ b/src/app/loader.rs @@ -0,0 +1,15 @@ +use istyles::istyles; +use leptos::prelude::*; + +istyles!(styles, "assets/module.postcss/loader.module.css.map"); + +#[component] +pub fn Loader() -> impl IntoView { + view! { +
+ "⬤" + "⬤" + "⬤" +
+ } +} diff --git a/src/app/menu_group.rs b/src/app/menu_group.rs new file mode 100644 index 0000000..d169786 --- /dev/null +++ b/src/app/menu_group.rs @@ -0,0 +1,14 @@ +use istyles::istyles; +use leptos::prelude::*; + +istyles!(styles, "assets/module.postcss/menu_group.module.css.map"); + +#[component] +pub fn MenuGroup(title: String, children: Children) -> impl IntoView { + view! { +
+

{title}

+
{children()}
+
+ } +} diff --git a/src/app/menu_item.rs b/src/app/menu_item.rs new file mode 100644 index 0000000..4dea4a2 --- /dev/null +++ b/src/app/menu_item.rs @@ -0,0 +1,9 @@ +use istyles::istyles; +use leptos::prelude::*; + +istyles!(styles, "assets/module.postcss/menu_item.module.css.map"); + +#[component] +pub fn MenuItem(children: Children) -> impl IntoView { + view! {
{children()}
} +} diff --git a/src/app/mod.rs b/src/app/mod.rs new file mode 100644 index 0000000..67f6da7 --- /dev/null +++ b/src/app/mod.rs @@ -0,0 +1,20 @@ +mod button_set; +mod config_element; +mod config_menu; +mod context_menu; +mod editor; +mod header; +mod icon; +mod loader; +mod menu_group; +mod menu_item; +mod output; +mod playground; +mod pop_button; +mod select_one; +mod selectable_menu_item; +mod state; +mod vfs_menu; + +pub use playground::playground; +pub use state::*; diff --git a/src/app/output.rs b/src/app/output.rs new file mode 100644 index 0000000..c3ea888 --- /dev/null +++ b/src/app/output.rs @@ -0,0 +1,141 @@ +mod execute; +mod header; +mod loader; +mod section; +mod share; +mod simple_pane; +mod status; + +use execute::Execute; +use istyles::istyles; +use leptos::prelude::*; +use reactive_stores::Store; +use share::Share; +use status::Status; + +use crate::app::state::{Focus, GlobalState, GlobalStateStoreFields}; + +istyles!(styles, "assets/module.postcss/output.module.css.map"); + +fn close() -> AnyView { + let state = expect_context::>(); + + if state.read().is_focus() { + view! { + + } + .into_any() + } else { + ().into_any() + } +} + +fn body() -> AnyView { + let state = expect_context::>(); + + if state.read().is_focus() { + view! { + <> +
+ + + + + + + + + + + +
+ + } + .into_any() + } else { + ().into_any() + } +} + +#[component] +pub fn Tab(kind: Focus, label: String) -> impl IntoView { + let state = expect_context::>(); + + let class = move || { + if matches!(*state.focus().read(), Some(focus) if focus == kind) { + styles::tabSelected + } else { + styles::tab + } + }; + + view! { + + + + } +} + +#[component] +pub fn Output() -> impl IntoView { + let state = expect_context::>(); + + view! { + +
+
+ + + + + + {close} +
+ {body} +
+
+ } +} + +pub fn change_focus(state: Store, focus: Option) { + if let Some(focus) = focus { + state.opened_focus().write().insert(focus); + state + .is_focused() + .maybe_update(|before| !std::mem::replace(before, true)); + } else { + state + .is_focused() + .maybe_update(|before| std::mem::replace(before, false)); + } + + state + .focus() + .maybe_update(|before| std::mem::replace(before, focus) != focus); + state + .show_something() + .maybe_update(|before| !std::mem::replace(before, true)); +} diff --git a/src/app/output/execute.rs b/src/app/output/execute.rs new file mode 100644 index 0000000..17bf53b --- /dev/null +++ b/src/app/output/execute.rs @@ -0,0 +1,110 @@ +use istyles::istyles; +use leptos::prelude::*; +use reactive_stores::{Store, StoreFieldIterator}; + +use crate::app::{ + output::{header::Header, loader::Loader, section::Section, simple_pane::SimplePane}, + state::{GlobalState, GlobalStateStoreFields}, +}; +use crate::{SQLiteStatementResult, SQLiteStatementTable}; + +istyles!( + styles, + "assets/module.postcss/output/execute.module.css.map" +); + +fn get_output(table: &SQLiteStatementTable) -> Option { + let Some(values) = &table.values else { + return None; + }; + Some( + view! { + + + {values + .columns + .iter() + .map(|s| { + view! { } + }) + .collect_view()} + + {values + .rows + .iter() + .map(|row| { + view! { + + + {row + .iter() + .map(|s| { + view! { } + }) + .collect_view()} + + } + }) + .collect_view()} +
{s.to_string()}
{s.to_string()}
+ } + .into_any(), + ) +} + +#[component] +fn Output() -> AnyView { + let state = expect_context::>(); + + view! { + <> + + + + + { + view! {
}.into_any() + } + SQLiteStatementResult::Step(table) => { + let label = format!("Statement #{}", idx + 1); + if let Some(output) = get_output(table) { + view! { +
+

{output}

+
+ } + .into_any() + } else { + ().into_any() + } + } + } + } + /> + + } + .into_any() +} + +#[component] +pub fn Execute() -> impl IntoView { + view! { + + + + } +} diff --git a/src/app/output/header.rs b/src/app/output/header.rs new file mode 100644 index 0000000..56d5c4a --- /dev/null +++ b/src/app/output/header.rs @@ -0,0 +1,9 @@ +use istyles::istyles; +use leptos::prelude::*; + +istyles!(styles, "assets/module.postcss/output/header.module.css.map"); + +#[component] +pub fn Header(label: String) -> impl IntoView { + view! { {label} } +} diff --git a/src/app/output/loader.rs b/src/app/output/loader.rs new file mode 100644 index 0000000..9368a98 --- /dev/null +++ b/src/app/output/loader.rs @@ -0,0 +1,13 @@ +use leptos::prelude::*; + +use crate::app::{loader::Loader as GenericLoader, output::header::Header}; + +#[component] +pub fn Loader() -> impl IntoView { + view! { +
+
+ +
+ } +} diff --git a/src/app/output/section.rs b/src/app/output/section.rs new file mode 100644 index 0000000..290f2f6 --- /dev/null +++ b/src/app/output/section.rs @@ -0,0 +1,21 @@ +use istyles::istyles; +use leptos::prelude::*; + +use crate::app::output::header::Header; + +istyles!( + styles, + "assets/module.postcss/output/section.module.css.map" +); + +#[component] +pub fn Section(label: String, children: Children) -> impl IntoView { + view! { +
+
+
+                {children()}
+            
+
+ } +} diff --git a/src/app/output/share.rs b/src/app/output/share.rs new file mode 100644 index 0000000..04dcd42 --- /dev/null +++ b/src/app/output/share.rs @@ -0,0 +1,55 @@ +use std::{sync::Arc, time::Duration}; + +use istyles::istyles; +use leptos::prelude::*; +use reactive_stores::Store; +use wasm_bindgen_futures::{JsFuture, spawn_local}; + +use crate::app::{GlobalState, GlobalStateStoreFields, icon::clipboard_icon}; + +istyles!(styles, "assets/module.postcss/output/share.module.css.map"); + +#[component] +fn Copied(href: H, children: Children) -> impl IntoView +where + H: Fn() -> String + Send + Sync + 'static, +{ + let (copied, set_copied) = signal(false); + let href = Arc::new(href); + let href1 = Arc::clone(&href); + + let copy = move |_| { + let href = Arc::clone(&href1); + spawn_local(async move { + set_copied.set(true); + if let Err(err) = + JsFuture::from(window().navigator().clipboard().write_text(&href())).await + { + log::error!("Failed to write href to clipboard: {err:?}"); + } + set_timeout(move || set_copied.set(false), Duration::from_millis(1000)); + }); + }; + + view! { +

+ {children()} + + "Copied!" +

+ } +} + +#[component] +fn Links() -> impl IntoView { + let state = expect_context::>(); + let code_url = move || state.share_href().get_untracked().unwrap_or_default(); + view! { Embedded code in link } +} + +#[component] +pub fn Share() -> impl IntoView { + view! { } +} diff --git a/src/app/output/simple_pane.rs b/src/app/output/simple_pane.rs new file mode 100644 index 0000000..b716dd4 --- /dev/null +++ b/src/app/output/simple_pane.rs @@ -0,0 +1,6 @@ +use leptos::prelude::*; + +#[component] +pub fn SimplePane(children: Children) -> impl IntoView { + view! {
{children()}
} +} diff --git a/src/app/output/status.rs b/src/app/output/status.rs new file mode 100644 index 0000000..b081811 --- /dev/null +++ b/src/app/output/status.rs @@ -0,0 +1,80 @@ +use std::ops::Deref; + +use leptos::prelude::*; +use reactive_stores::Store; + +use crate::{ + SQLightError, SQLitendError, WorkerError, + app::{ + GlobalState, GlobalStateStoreFields, + output::{section::Section, simple_pane::SimplePane}, + }, +}; + +const OPFS_SAH_POOL_OPENED_DETAILS: &str = "Due to OPFS SyncAccessHandle restrictions, \ +the db can only have one web tab access. + +Please close other tabs and refresh, or switch to Memory VFS."; + +#[component] +pub fn Status() -> impl IntoView { + let state = expect_context::>(); + + let show = move || match &*state.last_error().read() { + Some(error) => { + let summary = format!("{}", error.deref()); + let details = match error.deref() { + SQLightError::Worker(worker) => match worker { + WorkerError::SQLite(sqlitend_error) => match sqlitend_error { + SQLitendError::ToCStr + | SQLitendError::GetColumnName(_) + | SQLitendError::Utf8Text => { + "This shouldn't happen, please create an issue on github." + } + SQLitendError::OpenDb(_) => { + "If database disk image is malformed, please enable the discard context option and use it once." + } + SQLitendError::Prepare(_) => "Please check if the syntax is correct.", + SQLitendError::Step(_) => { + "If database disk image is malformed, please enable the discard context option and use it once." + } + SQLitendError::UnsupportColumnType(_) => { + "An unsupported type was encountered, please create an issue on github." + } + }, + WorkerError::NotFound | WorkerError::OpfsSAHError => { + "This shouldn't happen, please create an issue on github." + } + WorkerError::InvaildState => { + "SQLite is in an abnormal state when executing SQLite." + } + WorkerError::OpfsSAHPoolOpened => OPFS_SAH_POOL_OPENED_DETAILS, + }, + SQLightError::AceEditor(ace_editor) => match ace_editor { + aceditor::EditorError::Serde(_) + | aceditor::EditorError::SetTheme(_) + | aceditor::EditorError::SetKeyboardHandler(_) + | aceditor::EditorError::Open(_) + | aceditor::EditorError::DefineEx(_) => { + "This shouldn't happen, please create an issue on github." + } + }, + }; + + view! { +
+ {summary} +

{details}

+
+ } + .into_any() + } + None => view! { "No Error" }.into_any(), + }; + + view! { + +
{show}
+
+ } +} diff --git a/src/app/playground.rs b/src/app/playground.rs new file mode 100644 index 0000000..970389b --- /dev/null +++ b/src/app/playground.rs @@ -0,0 +1,250 @@ +use std::ops::Deref; + +use istyles::istyles; +use leptos::prelude::*; +use leptos::tachys::html; +use reactive_stores::Store; +use split_grid::{Gutter, SplitOptions}; +use tokio::sync::mpsc::UnboundedReceiver; +use wasm_bindgen::{JsCast, prelude::Closure}; +use wasm_bindgen_futures::spawn_local; +use web_sys::wasm_bindgen::JsValue; + +use crate::app::{ + Focus, + editor::Editor, + header::Header, + output::{Output, change_focus}, + state::{GlobalState, GlobalStateStoreFields, Orientation, Theme, Vfs}, +}; +use crate::{WorkerHandle, WorkerResponse, handle_state}; + +istyles!(styles, "assets/module.postcss/playground.module.css.map"); + +pub fn playground( + worker: (WorkerHandle, UnboundedReceiver), +) -> Box AnyView + 'static> { + Box::new(move || { + let (worker_handle, rx) = worker; + let state = GlobalState::load().unwrap_or_default(); + provide_context(Store::new(state)); + + let state = expect_context::>(); + state.worker().set(Some(worker_handle)); + + handle_last_error(state); + handle_system_theme(state); + handle_automic_orientation(state); + handle_connect_db(state); + hanlde_save_state(state); + + spawn_local(handle_state(state, rx)); + + view! { +
+
+ +
+ } + .into_any() + }) +} + +fn hanlde_save_state(state: Store) { + Effect::new(move || { + state.vfs().track(); + state.editor_config().track(); + state.orientation().track(); + state.theme().track(); + state.keep_ctx().track(); + state.code().track(); + + state.read_untracked().save(); + }); +} + +fn handle_connect_db(state: Store) { + Effect::new(move || { + if let Some(worker) = &*state.worker().read() { + worker.send_task(crate::WorkerRequest::Open(crate::OpenOptions { + filename: "test.db".into(), + persist: *state.vfs().read() == Vfs::OPFS, + })); + } + }); +} + +fn handle_system_theme(state: Store) { + Effect::new(move || { + let theme = match *state.theme().read() { + Theme::System => { + if let Ok(Some(query)) = window().match_media("(prefers-color-scheme: dark)") { + if query.matches() { "dark" } else { "light" } + } else { + "light" + } + } + Theme::SystemLight | Theme::Light => "light", + Theme::SystemDark | Theme::Dark => "dark", + }; + if let Some(element) = document().document_element() { + element.set_attribute("data-theme", theme).unwrap() + } + }); + + if let Ok(Some(query)) = window().match_media("(prefers-color-scheme: dark)") { + let f = move |query: web_sys::MediaQueryList| { + if state.theme().get_untracked().is_system() { + *state.theme().write() = if query.matches() { + Theme::SystemDark + } else { + Theme::SystemLight + }; + } + }; + f(query.clone()); + let callback = Closure::::new(f); + query + .add_event_listener_with_callback("change", callback.as_ref().unchecked_ref()) + .unwrap(); + callback.forget(); + } +} + +fn handle_last_error(state: Store) { + Effect::new(move || { + if state.last_error().read().is_some() { + change_focus(state, Some(Focus::Status)); + } + }); +} + +fn handle_automic_orientation(state: Store) { + if let Ok(Some(query)) = window().match_media("(max-width: 1600px)") { + let f = move |query: web_sys::MediaQueryList| { + if state.orientation().get_untracked().is_auto() { + *state.orientation().write() = if query.matches() { + Orientation::AutoHorizontal + } else { + Orientation::AutoVertical + }; + } + }; + f(query.clone()); + let callback = Closure::::new(f); + query + .add_event_listener_with_callback("change", callback.as_ref().unchecked_ref()) + .unwrap(); + callback.forget(); + } +} + +fn gird_style() -> String { + let state = expect_context::>(); + + let (focused_grid_style, unfocused_grid_style) = match *state.orientation().read() { + Orientation::Horizontal | Orientation::AutoHorizontal => ( + styles::resizeableAreaRowOutputFocused.to_string(), + styles::resizeableAreaRowOutputUnfocused.to_string(), + ), + Orientation::Automatic | Orientation::Vertical | Orientation::AutoVertical => ( + styles::resizeableAreaColumnOutputFocused.to_string(), + styles::resizeableAreaColumnOutputUnfocused.to_string(), + ), + }; + + if state.read().is_focus() { + focused_grid_style + } else { + unfocused_grid_style + } +} + +fn handle_outer_style() -> String { + let state = expect_context::>(); + + match *state.orientation().read() { + Orientation::Horizontal | Orientation::AutoHorizontal => { + styles::splitRowsGutter.to_string() + } + Orientation::Automatic | Orientation::Vertical | Orientation::AutoVertical => { + styles::splitColumnsGutter.to_string() + } + } +} + +fn handle_inner_style() -> String { + let state = expect_context::>(); + + match *state.orientation().read() { + Orientation::Horizontal | Orientation::AutoHorizontal => { + styles::splitRowsGutterHandle.to_string() + } + Orientation::Automatic | Orientation::Vertical | Orientation::AutoVertical => String::new(), + } +} + +#[component] +fn ResizableArea() -> impl IntoView { + let state = expect_context::>(); + + let node_ref = NodeRef::::new(); + let drag_handle = NodeRef::::new(); + + Effect::new(move || { + state.orientation().track(); + state.is_focused().track(); + + if let Some(div) = &*node_ref.read() { + let style = div.deref().style(); + let _ = style.remove_property("grid-template-columns"); + let _ = style.remove_property("grid-template-rows"); + } + }); + + Effect::new(move || { + state.show_something().track(); + + let element = if let Some(element) = &*drag_handle.read() { + JsValue::from(element) + } else { + JsValue::null() + }; + + let options = match *state.orientation().read() { + Orientation::Horizontal | Orientation::AutoHorizontal => SplitOptions { + min_size: 100, + row_gutters: Some(vec![Gutter { track: 1, element }]), + column_gutters: None, + }, + Orientation::Automatic | Orientation::Vertical | Orientation::AutoVertical => { + SplitOptions { + min_size: 100, + row_gutters: None, + column_gutters: Some(vec![Gutter { track: 1, element }]), + } + } + }; + let grid = split_grid::split(&options.into()); + on_cleanup(move || grid.destroy()); + }); + + view! { +
+
+ +
+ +
+ "⣿" +
+
+ +
+ +
+
+ +
+ } +} diff --git a/src/app/pop_button.rs b/src/app/pop_button.rs new file mode 100644 index 0000000..042b28c --- /dev/null +++ b/src/app/pop_button.rs @@ -0,0 +1,223 @@ +use std::{ops::Deref, sync::Arc}; + +use floating_ui::{ + ArrowPosition, ComputePosition, MiddlewareData, auto_update, compute_options, compute_position, +}; +use istyles::istyles; +use js_sys::Object; +use leptos::{portal::Portal, prelude::*, tachys::html}; +use wasm_bindgen::{JsCast, JsValue, prelude::Closure}; +use wasm_bindgen_futures::spawn_local; +use web_sys::{KeyboardEvent, MouseEvent}; + +use crate::FragileComfirmed; + +istyles!(styles, "assets/module.postcss/pop_button.module.css.map"); + +#[component] +pub fn PopButton( + button: B, + menu: M, + #[prop(optional)] menu_container: NodeRef, +) -> impl IntoView +where + B: FnOnce(Box, NodeRef) -> AnyView, + M: Fn(Box) -> AnyView + Send + Sync + 'static, +{ + let (is_open, set_open) = signal(false); + let toggle = move || set_open.set(!is_open.get()); + let close = move || set_open.set(false); + + let arrow_ref = NodeRef::::new(); + let reference_ref = NodeRef::::new(); + let floating_ref = NodeRef::::new(); + let menu_ref = NodeRef::::new(); + + Effect::new(move || { + let key_listener = move |event: KeyboardEvent| { + if !is_open.get_untracked() { + return; + } + + if event.key() == "Escape" { + set_open(false); + } + }; + + let callback = FragileComfirmed::new(Closure::::new(key_listener)); + + window() + .add_event_listener_with_callback("keydown", callback.as_ref().unchecked_ref()) + .unwrap(); + + on_cleanup(move || { + window() + .remove_event_listener_with_callback("keydown", callback.as_ref().unchecked_ref()) + .unwrap(); + drop(callback) + }); + }); + + Effect::new(move || { + let listener = move |event: MouseEvent| { + if !is_open.get_untracked() { + return; + } + + if let Some(target) = event.target() { + let node = target.dyn_into::().ok(); + if !reference_ref.with_untracked(|reference| { + reference + .as_ref() + .is_some_and(|reference| reference.deref().contains(node.as_ref())) + }) && !floating_ref.with_untracked(|floating| { + floating + .as_ref() + .is_some_and(|floating| floating.deref().contains(node.as_ref())) + }) { + set_open(false); + } + } + }; + + let callback = FragileComfirmed::new(Closure::::new(listener)); + + window() + .add_event_listener_with_callback("click", callback.as_ref().unchecked_ref()) + .unwrap(); + + on_cleanup(move || { + window() + .remove_event_listener_with_callback("click", callback.as_ref().unchecked_ref()) + .unwrap(); + drop(callback) + }); + }); + + Effect::new(move || { + let callback = Closure::new(move || { + let options = compute_options(10, &arrow_ref.get_untracked().into()); + + spawn_local(async move { + let value = compute_position( + reference_ref.get_untracked().into(), + floating_ref.get_untracked().into(), + options, + ) + .await; + + let ComputePosition { + x, + y, + placement, + strategy, + middleware_data, + } = serde_wasm_bindgen::from_value(value).unwrap(); + + if let Some(element) = floating_ref.get_untracked() { + let style = element.deref().style(); + #[derive(serde::Serialize)] + struct Style { + position: String, + left: String, + top: String, + } + + let pos = serde_wasm_bindgen::to_value(&Style { + position: strategy, + left: format!("{x}px"), + top: format!("{y}px"), + }) + .unwrap(); + Object::assign(&style, &pos.into()); + } + + if let Some(element) = arrow_ref.get_untracked() { + let MiddlewareData { + arrow: ArrowPosition { x }, + } = middleware_data; + let style = element.deref().style(); + #[derive(serde::Serialize)] + struct Style { + left: String, + } + + let pos = serde_wasm_bindgen::to_value(&Style { + left: format!("{x}px"), + }) + .unwrap(); + Object::assign(&style, &pos.into()); + } + + if let Some(menu_ref) = menu_ref.get_untracked() { + let class = if placement == "top" { + styles::contentTop + } else if placement == "bottom" { + styles::contentBottom + } else { + "" + }; + menu_ref.set_class_name(class); + } + }); + }); + + if let (Some(reference), Some(floating)) = (&*reference_ref.read(), &*floating_ref.read()) { + let func = auto_update( + reference.into(), + floating.into(), + &callback, + JsValue::default(), + ); + let func = FragileComfirmed::new(func); + let callback = FragileComfirmed::new(callback); + + on_cleanup(move || { + func.call0(&JsValue::null()).unwrap(); + drop(callback); + }); + } + }); + + let menu = Arc::new(menu); + let float = move || { + let menu_clone = Arc::clone(&menu); + view! { + +
+
+ + + + + + +
+
+
{menu_clone(Box::new(close))}
+
+
+
+ } + }; + + let float = Arc::new(float); + let total = move || { + let float_clone = Arc::clone(&float); + if let Some(container) = menu_container.get() { + view! { {float_clone()} }.into_any() + } else { + float_clone().into_any() + } + }; + + view! { <>{button(Box::new(move |_| toggle()), reference_ref)} {total} } +} diff --git a/src/app/select_one.rs b/src/app/select_one.rs new file mode 100644 index 0000000..970a79c --- /dev/null +++ b/src/app/select_one.rs @@ -0,0 +1,27 @@ +use leptos::prelude::*; + +use crate::app::selectable_menu_item::SelectableMenuItem; + +#[component] +pub fn SelectOne( + name: String, + current_value: C, + this_value: T, + mut change_value: CH, + children: Children, +) -> impl IntoView +where + C: Fn() -> T + Send + 'static, + CH: FnMut() + Send + 'static, + T: PartialEq + Eq + Send + 'static, +{ + view! { + + {children()} + + } +} diff --git a/src/app/selectable_menu_item.rs b/src/app/selectable_menu_item.rs new file mode 100644 index 0000000..5268947 --- /dev/null +++ b/src/app/selectable_menu_item.rs @@ -0,0 +1,37 @@ +use istyles::istyles; +use leptos::prelude::*; +use web_sys::MouseEvent; + +use crate::app::{icon::checkmark_icon, menu_item::MenuItem}; + +istyles!( + styles, + "assets/module.postcss/selectable_menu_item.module.css.map" +); + +#[component] +pub fn SelectableMenuItem( + name: String, + selected: S, + on_click: C, + children: Children, +) -> impl IntoView +where + S: Fn() -> bool + Send + 'static, + C: FnMut(MouseEvent) + Send + 'static, +{ + view! { + + + + } +} diff --git a/src/app/state.rs b/src/app/state.rs new file mode 100644 index 0000000..bc3029a --- /dev/null +++ b/src/app/state.rs @@ -0,0 +1,192 @@ +use std::collections::HashSet; + +use aceditor::Editor; +use leptos::tachys::dom::window; +use reactive_stores::Store; +use serde::{Deserialize, Serialize}; + +use crate::{FragileComfirmed, SQLightError, SQLiteStatementResult, WorkerHandle}; + +#[derive(Store, Serialize, Deserialize)] +pub struct GlobalState { + vfs: Vfs, + editor_config: EditorConfig, + orientation: Orientation, + theme: Theme, + keep_ctx: bool, + code: String, + // runtime state below + #[serde(skip)] + worker: Option, + #[serde(skip)] + pub editor: Option, + #[serde(skip)] + focus: Option, + #[serde(skip)] + is_focused: bool, + #[serde(skip)] + opened_focus: HashSet, + #[serde(skip)] + share_href: Option, + #[serde(skip)] + show_something: bool, + #[serde(skip)] + output: Vec, + #[serde(skip)] + last_error: Option>, +} + +impl Default for GlobalState { + fn default() -> Self { + Self { + editor_config: EditorConfig::default(), + code: String::new(), + focus: None, + show_something: false, + orientation: Orientation::Automatic, + theme: Theme::System, + output: Vec::new(), + vfs: Vfs::Memory, + keep_ctx: false, + share_href: None, + is_focused: false, + opened_focus: HashSet::new(), + worker: None, + editor: None, + last_error: None, + } + } +} + +impl GlobalState { + pub fn load() -> Option { + let storage = window().local_storage().ok()??; + let value = storage.get("config").ok()??; + serde_json::from_str(&value).ok() + } + + pub fn save(&self) { + if let Some(Err(e)) = window() + .local_storage() + .ok() + .flatten() + .map(|s| s.set_item("config", &serde_json::to_string(self).unwrap())) + { + log::error!("Faild to save config to localstorage: {e:?}"); + } + } +} + +#[derive(Serialize, Deserialize)] +pub struct EditorConfig { + pub keyboard: String, + pub theme: String, +} + +impl Default for EditorConfig { + fn default() -> Self { + EditorConfig { + keyboard: "ace".into(), + theme: "github".into(), + } + } +} + +impl GlobalState { + pub fn is_focus(&self) -> bool { + self.focus.is_some() + } +} + +#[derive(Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] +pub enum Vfs { + Memory, + OPFS, +} + +impl Vfs { + pub fn value(&self) -> String { + match self { + Vfs::Memory => "Memory".into(), + Vfs::OPFS => "OPFS".into(), + } + } +} + +#[derive(Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)] +pub enum Focus { + Execute, + Share, + Status, +} + +#[derive(Clone, Copy, Serialize, Deserialize)] +pub enum Theme { + System, + SystemLight, + SystemDark, + Light, + Dark, +} + +impl Theme { + pub fn is_system(&self) -> bool { + matches!(self, Theme::System | Theme::SystemLight | Theme::SystemDark) + } + + pub fn from_value(s: &str) -> Self { + match s { + "System" => Self::System, + "Light" => Self::Light, + "Dark" => Self::Dark, + _ => unreachable!(), + } + } + + pub fn to_value(&self) -> String { + match self { + Theme::System | Theme::SystemLight | Theme::SystemDark => "System", + Theme::Light => "Light", + Theme::Dark => "Dark", + } + .into() + } +} + +#[derive(Clone, Copy, Serialize, Deserialize)] +pub enum Orientation { + Automatic, + AutoHorizontal, + AutoVertical, + Horizontal, + Vertical, +} + +impl Orientation { + pub fn is_auto(&self) -> bool { + matches!( + self, + Orientation::Automatic | Orientation::AutoVertical | Orientation::AutoHorizontal + ) + } + + pub fn from_value(s: &str) -> Self { + match s { + "Automatic" => Self::Automatic, + "Horizontal" => Self::Horizontal, + "Vertical" => Self::Vertical, + _ => unreachable!(), + } + } + + pub fn to_value(&self) -> String { + match self { + Orientation::Automatic | Orientation::AutoVertical | Orientation::AutoHorizontal => { + "Automatic" + } + Orientation::Horizontal => "Horizontal", + Orientation::Vertical => "Vertical", + } + .into() + } +} diff --git a/src/app/vfs_menu.rs b/src/app/vfs_menu.rs new file mode 100644 index 0000000..e159926 --- /dev/null +++ b/src/app/vfs_menu.rs @@ -0,0 +1,36 @@ +use leptos::prelude::*; +use reactive_stores::Store; + +use crate::app::{ + GlobalState, GlobalStateStoreFields, Vfs, menu_group::MenuGroup, select_one::SelectOne, +}; + +#[component] +pub fn VfsMenu() -> impl IntoView { + let state = expect_context::>(); + + view! { + + + "Data will be lost after refreshing." + + + "Persistent Storage." + + + } +} diff --git a/src/bin/app.rs b/src/bin/app.rs new file mode 100644 index 0000000..0e32b37 --- /dev/null +++ b/src/bin/app.rs @@ -0,0 +1,11 @@ +use leptos::prelude::*; +use sqlight::{app::playground, setup_worker}; + +use wasm_bindgen::prelude::wasm_bindgen; + +#[wasm_bindgen(main)] +async fn main() { + console_error_panic_hook::set_once(); + console_log::init_with_level(log::Level::Debug).unwrap(); + mount_to_body(playground(setup_worker().await)); +} diff --git a/src/bin/worker.rs b/src/bin/worker.rs new file mode 100644 index 0000000..bb509de --- /dev/null +++ b/src/bin/worker.rs @@ -0,0 +1,42 @@ +use sqlight::{WorkerRequest, WorkerResponse, worker}; +use tokio::sync::mpsc::UnboundedReceiver; +use wasm_bindgen::{JsCast, JsValue, prelude::Closure}; +use wasm_bindgen_futures::spawn_local; +use web_sys::{DedicatedWorkerGlobalScope, MessageEvent}; + +fn main() { + console_error_panic_hook::set_once(); + console_log::init_with_level(log::Level::Warn).unwrap(); + + let (tx, rx) = tokio::sync::mpsc::unbounded_channel::(); + + let scope: DedicatedWorkerGlobalScope = JsValue::from(js_sys::global()).into(); + spawn_local(execute_task(scope.clone(), rx)); + + let on_message = Closure::::new(move |ev: MessageEvent| { + tx.send(ev.data()).unwrap(); + }); + + scope.set_onmessage(Some(on_message.as_ref().unchecked_ref())); + scope + .post_message(&serde_wasm_bindgen::to_value(&WorkerResponse::Ready).unwrap()) + .expect("Faild to send ready to window"); + on_message.forget(); +} + +async fn execute_task(scope: DedicatedWorkerGlobalScope, mut rx: UnboundedReceiver) { + while let Some(request) = rx.recv().await { + let request = serde_wasm_bindgen::from_value::(request).unwrap(); + let resp = match request { + WorkerRequest::Open(options) => WorkerResponse::Open(worker::open(options).await), + WorkerRequest::Prepare(options) => WorkerResponse::Prepare(worker::prepare(options)), + WorkerRequest::Continue(id) => WorkerResponse::Continue(worker::r#continue(&id)), + WorkerRequest::StepOver(id) => WorkerResponse::StepOver(worker::step_over(&id)), + WorkerRequest::StepIn(id) => WorkerResponse::StepIn(worker::step_in(&id)), + WorkerRequest::StepOut(id) => WorkerResponse::StepOut(worker::step_out(&id)), + }; + if let Err(err) = scope.post_message(&serde_wasm_bindgen::to_value(&resp).unwrap()) { + log::error!("Failed to send task to window: {resp:?}, {err:?}"); + } + } +} diff --git a/src/lib.rs b/src/lib.rs new file mode 100644 index 0000000..75049e8 --- /dev/null +++ b/src/lib.rs @@ -0,0 +1,245 @@ +pub mod app; +pub mod worker; + +use aceditor::EditorError; +use app::{GlobalState, GlobalStateStoreFields}; +use fragile::Fragile; +use leptos::prelude::*; +use reactive_stores::Store; +use serde_json::Value as JsonValue; +use std::{ + ops::{Deref, DerefMut}, + sync::Arc, +}; +use tokio::sync::mpsc::UnboundedReceiver; +use wasm_bindgen::{JsCast, prelude::Closure}; +use web_sys::{MessageEvent, Worker, WorkerOptions, WorkerType}; + +use serde::{Deserialize, Serialize}; + +type Result = std::result::Result; + +/// A [`FragileComfirmed`] wraps a non sendable `T` to be safely send to other threads. +/// +/// Once the value has been wrapped it can be sent to other threads but access +/// to the value on those threads will fail. +pub struct FragileComfirmed { + fragile: Fragile, +} + +unsafe impl Send for FragileComfirmed {} +unsafe impl Sync for FragileComfirmed {} + +impl FragileComfirmed { + pub fn new(t: T) -> Self { + FragileComfirmed { + fragile: Fragile::new(t), + } + } +} + +impl Deref for FragileComfirmed { + type Target = T; + fn deref(&self) -> &Self::Target { + self.fragile.get() + } +} + +impl DerefMut for FragileComfirmed { + fn deref_mut(&mut self) -> &mut Self::Target { + self.fragile.get_mut() + } +} + +pub const PERSIST_VFS: &str = "sqlight-sahpool"; + +#[derive(thiserror::Error, Debug)] +pub enum SQLightError { + #[error(transparent)] + Worker(#[from] WorkerError), + #[error(transparent)] + AceEditor(#[from] EditorError), +} + +impl SQLightError { + pub fn new_worker(err: WorkerError) -> FragileComfirmed { + FragileComfirmed::new(Self::Worker(err)) + } + + pub fn new_ace_editor(err: EditorError) -> FragileComfirmed { + FragileComfirmed::new(Self::AceEditor(err)) + } +} + +#[derive(thiserror::Error, Debug, Serialize, Deserialize)] +pub enum WorkerError { + #[error(transparent)] + SQLite(#[from] SQLitendError), + #[error("Not found database by id")] + NotFound, + #[error("Execute sqlite with invaild state")] + InvaildState, + #[error("OPFS already opened")] + OpfsSAHPoolOpened, + #[error("OPFS unexpected error")] + OpfsSAHError, +} + +#[derive(Debug, Serialize, Deserialize)] +pub enum WorkerRequest { + Open(OpenOptions), + Prepare(PrepareOptions), + Continue(String), + StepOver(String), + StepIn(String), + StepOut(String), +} + +#[derive(Debug, Serialize, Deserialize)] +pub enum WorkerResponse { + Ready, + Open(Result), + Prepare(Result<()>), + Continue(Result>), + StepOver(Result), + StepIn(Result<()>), + StepOut(Result), +} + +#[derive(Debug, Serialize, Deserialize)] +pub struct OpenOptions { + pub filename: String, + pub persist: bool, +} + +impl OpenOptions { + pub fn uri(&self) -> String { + format!( + "file:{}?vfs={}", + self.filename, + if self.persist { PERSIST_VFS } else { "memvfs" } + ) + } +} + +#[derive(Debug, Serialize, Deserialize)] +pub struct PrepareOptions { + pub id: String, + pub sql: String, + pub clear_on_prepare: bool, +} + +#[derive(Debug, Serialize, Deserialize)] +pub struct InnerError { + pub code: i32, + pub message: String, +} + +#[derive(Debug, Serialize, Deserialize)] +pub enum SQLiteStatementResult { + Finish, + Step(SQLiteStatementTable), +} + +#[derive(Clone, Debug, Serialize, Deserialize)] +pub struct SQLiteStatementTable { + pub sql: String, + pub position: [usize; 2], + pub values: Option, + pub done: bool, +} + +#[derive(Clone, Debug, Serialize, Deserialize)] +pub struct SQLiteStatementValues { + pub columns: Vec, + pub rows: Vec>, +} + +#[derive(thiserror::Error, Debug, Serialize, Deserialize)] +pub enum SQLitendError { + #[error("An error occurred while converting a string to a CString")] + ToCStr, + #[error("An error occurred while opening the DB: {0:?}")] + OpenDb(InnerError), + #[error("An error occurred while preparing stmt: {0:?}")] + Prepare(InnerError), + #[error("An error occurred while stepping to the next line")] + Step(InnerError), + #[error("An error occurred while getting column name: {0}")] + GetColumnName(String), + #[error("The text is not a utf8 string")] + Utf8Text, + #[error("The column type is not support: {0}")] + UnsupportColumnType(i32), +} + +pub struct WorkerHandle(Worker); + +impl WorkerHandle { + pub fn send_task(&self, req: WorkerRequest) { + if let Err(err) = self + .0 + .post_message(&serde_wasm_bindgen::to_value(&req).unwrap()) + { + log::error!("Failed to send task to worker: {req:?}, {err:?}"); + } + } +} + +unsafe impl Send for WorkerHandle {} +unsafe impl Sync for WorkerHandle {} + +pub async fn setup_worker() -> (WorkerHandle, UnboundedReceiver) { + let uri = "./worker_loader.js"; + + let opts = WorkerOptions::new(); + opts.set_type(WorkerType::Module); + + let worker = match Worker::new_with_options(uri, &opts) { + Ok(worker) => worker, + Err(err) => panic!("Failed to new setup worker: {err:?}"), + }; + + let notify = Arc::new(tokio::sync::Notify::new()); + let wait = Arc::clone(¬ify); + + let (tx, rx) = tokio::sync::mpsc::unbounded_channel(); + + let on_message = Closure::::new(move |ev: MessageEvent| { + match serde_wasm_bindgen::from_value(ev.data()) { + Ok(WorkerResponse::Ready) => notify.notify_one(), + Ok(resp) => tx.send(resp).unwrap(), + Err(err) => log::error!("Failed to parse message {:?}", err), + } + }); + + worker.set_onmessage(Some(on_message.as_ref().unchecked_ref())); + on_message.forget(); + wait.notified().await; + + (WorkerHandle(worker), rx) +} + +pub async fn handle_state(state: Store, mut rx: UnboundedReceiver) { + while let Some(resp) = rx.recv().await { + match resp { + WorkerResponse::Ready => unreachable!(), + WorkerResponse::Open(result) => match result { + Ok(_) => (), + Err(err) => state.last_error().set(Some(SQLightError::new_worker(err))), + }, + WorkerResponse::Prepare(result) => { + if let Err(err) = result { + state.last_error().set(Some(SQLightError::new_worker(err))); + } + } + WorkerResponse::Continue(result) => match result { + Ok(results) => state.output().set(results), + Err(err) => state.last_error().set(Some(SQLightError::new_worker(err))), + }, + WorkerResponse::StepOver(_) + | WorkerResponse::StepIn(_) + | WorkerResponse::StepOut(_) => unimplemented!(), + } + } +} diff --git a/src/worker/mod.rs b/src/worker/mod.rs new file mode 100644 index 0000000..7a99e2d --- /dev/null +++ b/src/worker/mod.rs @@ -0,0 +1,191 @@ +mod sqlitend; + +use crate::{OpenOptions, PERSIST_VFS, PrepareOptions, SQLiteStatementResult, WorkerError}; +use once_cell::sync::Lazy; +use parking_lot::Mutex; +use sqlite_wasm_rs::{ + export::{OpfsSAHPoolCfgBuilder, OpfsSAHPoolUtil}, + mem_vfs::MemVfsUtil, +}; +use sqlitend::{SQLiteDb, SQLitePreparedStatement, SQLiteStatements}; +use std::{collections::HashMap, sync::Arc}; +use tokio::sync::OnceCell; + +type Result = std::result::Result; + +static DB_POOL: Lazy>> = + Lazy::new(|| Mutex::new(HashMap::new())); + +static FS_UTIL: Lazy = Lazy::new(|| FSUtil { + mem: MemVfsUtil::new(), + opfs: OnceCell::new(), +}); + +struct FSUtil { + mem: MemVfsUtil, + opfs: OnceCell, +} + +struct SQLiteWorker { + id: String, + db: Option>, + open_options: OpenOptions, + state: SQLiteState, +} + +enum SQLiteState { + Idie, + Prepared(PreparedState), +} + +struct PreparedState { + stmts: SQLiteStatements, + prepared: Option, +} + +fn with_worker(id: &str, mut f: F) -> Result +where + F: FnMut(&mut SQLiteWorker) -> Result, +{ + f(DB_POOL.lock().get_mut(id).ok_or(WorkerError::NotFound)?) +} + +pub async fn open(options: OpenOptions) -> Result { + if let Some(worker) = DB_POOL.lock().get(&options.filename) { + return Ok(worker.id.clone()); + } + if options.persist { + let util = FS_UTIL + .opfs + .get_or_try_init(|| async { + sqlite_wasm_rs::sahpool_vfs::install( + Some( + &OpfsSAHPoolCfgBuilder::new() + .directory(PERSIST_VFS) + .vfs_name(PERSIST_VFS) + .build(), + ), + false, + ) + .await + .map_err(|_| WorkerError::OpfsSAHPoolOpened) + }) + .await?; + if util.get_capacity() - util.get_file_count() * 3 < 3 { + util.add_capacity(3) + .await + .map_err(|_| WorkerError::OpfsSAHError)?; + } + } + // FIXME: multi db support + let id = String::new(); + let db = SQLiteDb::open(&options.uri())?; + let worker = SQLiteWorker { + id: id.clone(), + db: Some(db), + open_options: options, + state: SQLiteState::Idie, + }; + DB_POOL.lock().insert(id.clone(), worker); + Ok(id) +} + +pub fn prepare(options: PrepareOptions) -> Result<()> { + with_worker(&options.id, |worker| { + if options.clear_on_prepare { + worker.db.take(); + + let filename = &worker.open_options.filename; + let FSUtil { mem, opfs } = &*FS_UTIL; + if worker.open_options.persist { + if let Some(opfs) = opfs.get() { + opfs.unlink(filename) + .map_err(|_| WorkerError::OpfsSAHError)?; + } + } else { + mem.delete_db(filename); + } + + worker.db = Some(SQLiteDb::open(&worker.open_options.uri())?); + } + + let stmts = worker.db.as_ref().unwrap().prepare(&options.sql)?; + worker.state = SQLiteState::Prepared(PreparedState { + stmts, + prepared: None, + }); + Ok(()) + }) +} + +pub fn r#continue(id: &str) -> Result> { + with_worker(id, |worker| { + let state = std::mem::replace(&mut worker.state, SQLiteState::Idie); + let mut result = match state { + SQLiteState::Idie => return Err(WorkerError::InvaildState), + SQLiteState::Prepared(prepared_state) => { + let mut result = vec![]; + if let Some(stmt) = prepared_state.prepared { + result.push(stmt.pack(stmt.get_all()?)); + } + result.extend(prepared_state.stmts.stmts_result()?); + result + } + }; + result.push(SQLiteStatementResult::Finish); + Ok(result) + }) +} + +pub fn step_over(id: &str) -> Result { + with_worker(id, |worker| match &mut worker.state { + SQLiteState::Idie => Err(WorkerError::InvaildState), + SQLiteState::Prepared(prepared_state) => { + if let Some(prepared) = &mut prepared_state.prepared { + if let Some(value) = prepared.get_one()? { + Ok(prepared.pack(Some(value))) + } else { + let done = prepared.pack(None); + prepared_state.prepared = None; + Ok(done) + } + } else if let Some(prepared) = prepared_state.stmts.prepare_next()? { + Ok(prepared.pack(prepared.get_all()?)) + } else { + Ok(SQLiteStatementResult::Finish) + } + } + }) +} + +pub fn step_in(id: &str) -> Result<()> { + with_worker(id, |worker| { + match &mut worker.state { + SQLiteState::Idie => return Err(WorkerError::InvaildState), + SQLiteState::Prepared(prepared_state) => { + if prepared_state.prepared.is_some() { + return Err(WorkerError::InvaildState); + } + let prepared = prepared_state + .stmts + .prepare_next()? + .ok_or(WorkerError::InvaildState)?; + prepared_state.prepared = Some(prepared); + } + }; + Ok(()) + }) +} + +pub fn step_out(id: &str) -> Result { + with_worker(id, |worker| match &mut worker.state { + SQLiteState::Idie => Err(WorkerError::InvaildState), + SQLiteState::Prepared(prepared_state) => { + if let Some(prepared) = prepared_state.prepared.take() { + Ok(prepared.pack(prepared.get_all()?)) + } else { + Err(WorkerError::InvaildState) + } + } + }) +} diff --git a/src/worker/sqlitend.rs b/src/worker/sqlitend.rs new file mode 100644 index 0000000..d8287c5 --- /dev/null +++ b/src/worker/sqlitend.rs @@ -0,0 +1,266 @@ +use serde_json::Value as JsonValue; +use sqlite_wasm_rs::*; +use std::ffi::{CStr, CString}; +use std::sync::Arc; +use std::sync::atomic::{self, AtomicBool}; + +use crate::{ + InnerError, SQLiteStatementResult, SQLiteStatementTable, SQLiteStatementValues, SQLitendError, +}; + +type Result = std::result::Result; + +fn cstr(s: &str) -> Result { + CString::new(s).map_err(|_| SQLitendError::ToCStr) +} + +fn sqlite_err(code: i32, db: *mut sqlite3) -> InnerError { + let message = unsafe { + let ptr = sqlite3_errmsg(db); + CStr::from_ptr(ptr).to_string_lossy().to_string() + }; + InnerError { code, message } +} + +pub struct SQLiteDb { + sqlite3: *mut sqlite3, +} + +unsafe impl Send for SQLiteDb {} +unsafe impl Sync for SQLiteDb {} + +impl SQLiteDb { + pub fn open(filename: &str) -> Result> { + let mut sqlite3 = std::ptr::null_mut(); + let ret = unsafe { + sqlite3_open_v2( + cstr(filename)?.as_ptr().cast(), + &mut sqlite3 as *mut _, + SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, + std::ptr::null(), + ) + }; + + if ret != SQLITE_OK { + return Err(SQLitendError::OpenDb(sqlite_err(ret, sqlite3))); + } + + Ok(Arc::new(Self { sqlite3 })) + } + + pub fn prepare(self: &Arc, sql: &str) -> Result { + let sql = cstr(sql)?; + let tail = sql.as_ptr(); + + Ok(SQLiteStatements { + sql, + db: Arc::clone(self), + tail, + }) + } +} + +impl Drop for SQLiteDb { + fn drop(&mut self) { + unsafe { + sqlite3_close(self.sqlite3); + } + } +} + +pub struct SQLiteStatements { + sql: CString, + db: Arc, + tail: *const i8, +} + +unsafe impl Send for SQLiteStatements {} +unsafe impl Sync for SQLiteStatements {} + +impl SQLiteStatements { + pub fn prepare_next(&mut self) -> Result> { + if self.tail.is_null() { + return Ok(None); + } + + let sqlite3 = self.db.sqlite3; + let mut stmt: *mut sqlite3_stmt = std::ptr::null_mut(); + let mut tail = std::ptr::null(); + + let ret = unsafe { + sqlite3_prepare_v3(sqlite3, self.tail, -1, 0, &mut stmt as _, &mut tail as _) + }; + + if ret != SQLITE_OK { + return Err(SQLitendError::Prepare(sqlite_err(ret, sqlite3))); + } + + let sql = unsafe { sqlite3_sql(stmt) }; + if sql.is_null() { + return Ok(None); + } + let sql = unsafe { CStr::from_ptr(sql).to_string_lossy().to_string() }; + + let start_offset = self.tail as usize - self.sql.as_ptr() as usize; + let end_offset = start_offset + sql.len(); + let position = [start_offset, end_offset]; + + self.tail = tail; + + Ok(Some(SQLitePreparedStatement { + sql, + done: AtomicBool::new(false), + position, + sqlite3, + stmt, + })) + } + + pub fn stmts_result(self) -> Result> { + let mut result = vec![]; + for stmt in self { + let stmt = stmt?; + result.push(stmt.pack(stmt.get_all()?)); + } + Ok(result) + } +} + +impl Iterator for SQLiteStatements { + type Item = Result; + + fn next(&mut self) -> Option { + self.prepare_next().transpose() + } +} + +pub struct SQLitePreparedStatement { + sql: String, + position: [usize; 2], + done: AtomicBool, + sqlite3: *mut sqlite3, + stmt: *mut sqlite3_stmt, +} + +unsafe impl Send for SQLitePreparedStatement {} +unsafe impl Sync for SQLitePreparedStatement {} + +impl SQLitePreparedStatement { + /// Stepping to the next line + fn step(&self) -> Result { + let ret = unsafe { sqlite3_step(self.stmt) }; + match ret { + SQLITE_DONE => { + self.done.store(true, atomic::Ordering::SeqCst); + Ok(false) + } + SQLITE_ROW => Ok(true), + code => Err(SQLitendError::Step(sqlite_err(code, self.sqlite3))), + } + } + + pub fn pack(&self, values: Option) -> SQLiteStatementResult { + let values = SQLiteStatementTable { + sql: self.sql.clone(), + position: self.position, + done: self.done.load(atomic::Ordering::SeqCst), + values, + }; + SQLiteStatementResult::Step(values) + } + + pub fn get_all(&self) -> Result> { + let mut values = match self.get_one()? { + Some(value) => value, + None => return Ok(None), + }; + + while let Some(value) = self.get_one()? { + for row in value.rows { + values.rows.push(row); + } + } + + Ok(Some(values)) + } + + /// Get data for all columns of the current row + pub fn get_one(&self) -> Result> { + if !self.step()? { + return Ok(None); + } + + let column_count = unsafe { sqlite3_column_count(self.stmt) }; + + let mut column = Vec::with_capacity(column_count as usize); + let mut row = Vec::with_capacity(column_count as usize); + + for col_ndx in 0..column_count { + // column_name as key + let (column_name, column_type) = unsafe { + let ptr = sqlite3_column_name(self.stmt, col_ndx); + if ptr.is_null() { + return Err(SQLitendError::GetColumnName( + "the column name is a null pointer, this shouldn't happen".into(), + )); + } + let Ok(column_name) = CStr::from_ptr(ptr).to_str() else { + return Err(SQLitendError::GetColumnName( + "the column name is not a string, this shouldn't happen".into(), + )); + }; + (column_name, sqlite3_column_type(self.stmt, col_ndx)) + }; + + // https://www.sqlite.org/c3ref/column_blob.html + let value = unsafe { + match column_type { + SQLITE_NULL => JsonValue::Null, + SQLITE_INTEGER => { + let number = sqlite3_column_int64(self.stmt, col_ndx); + JsonValue::from(number) + } + SQLITE_FLOAT => JsonValue::from(sqlite3_column_double(self.stmt, col_ndx)), + SQLITE_TEXT => { + let slice = { + let text = sqlite3_column_text(self.stmt, col_ndx); + // get text size, there may be problems if use as cstr + let len = sqlite3_column_bytes(self.stmt, col_ndx); + std::slice::from_raw_parts(text, len as usize) + }; + // must be UTF-8 TEXT result + let Ok(text) = std::str::from_utf8(slice) else { + return Err(SQLitendError::Utf8Text); + }; + JsonValue::from(text) + } + SQLITE_BLOB => { + let slice = { + let blob = sqlite3_column_blob(self.stmt, col_ndx); + let len = sqlite3_column_bytes(self.stmt, col_ndx); + std::slice::from_raw_parts(blob.cast::(), len as usize) + }; + JsonValue::from(slice) + } + _ => return Err(SQLitendError::UnsupportColumnType(column_type)), + } + }; + + column.push(column_name.into()); + row.push(value); + } + + Ok(Some(SQLiteStatementValues { + columns: column, + rows: vec![row], + })) + } +} + +impl Drop for SQLitePreparedStatement { + fn drop(&mut self) { + unsafe { + sqlite3_finalize(self.stmt); + }; + } +}