From 6bb9a127a051848c7af914bfa302dab59e12b4fe Mon Sep 17 00:00:00 2001 From: Alexey Date: Thu, 23 Apr 2026 23:34:39 +0500 Subject: [PATCH] mantra v0.1: book-grade reader for design-dna corpus + margin drawer (notes + claude-ask) --- .gitignore | 4 + Cargo.lock | 3529 +++++++++++++++++++ Cargo.toml | 58 + crates/mantra-server/Cargo.toml | 28 + crates/mantra-server/src/corpus_loader.rs | 331 ++ crates/mantra-server/src/main.rs | 119 + crates/mantra-ui/Cargo.toml | 51 + crates/mantra-ui/src/api/mod.rs | 460 +++ crates/mantra-ui/src/api/types.rs | 46 + crates/mantra-ui/src/app.rs | 47 + crates/mantra-ui/src/corpus.rs | 125 + crates/mantra-ui/src/lib.rs | 22 + crates/mantra-ui/src/pages/landing.rs | 146 + crates/mantra-ui/src/pages/margin.rs | 355 ++ crates/mantra-ui/src/pages/mod.rs | 5 + crates/mantra-ui/src/pages/shared.rs | 37 + crates/mantra-ui/src/pages/source.rs | 194 + crates/mantra-ui/src/pages/theme.rs | 117 + sass/main.scss | 756 ++++ static/fonts/fraunces-italic-variable.woff2 | Bin 0 -> 45656 bytes static/fonts/fraunces-variable.woff2 | Bin 0 -> 36620 bytes static/fonts/plex-mono-variable.woff2 | Bin 0 -> 14708 bytes static/fonts/plex-sans-variable.woff2 | Bin 0 -> 45712 bytes 23 files changed, 6430 insertions(+) create mode 100644 .gitignore create mode 100644 Cargo.lock create mode 100644 Cargo.toml create mode 100644 crates/mantra-server/Cargo.toml create mode 100644 crates/mantra-server/src/corpus_loader.rs create mode 100644 crates/mantra-server/src/main.rs create mode 100644 crates/mantra-ui/Cargo.toml create mode 100644 crates/mantra-ui/src/api/mod.rs create mode 100644 crates/mantra-ui/src/api/types.rs create mode 100644 crates/mantra-ui/src/app.rs create mode 100644 crates/mantra-ui/src/corpus.rs create mode 100644 crates/mantra-ui/src/lib.rs create mode 100644 crates/mantra-ui/src/pages/landing.rs create mode 100644 crates/mantra-ui/src/pages/margin.rs create mode 100644 crates/mantra-ui/src/pages/mod.rs create mode 100644 crates/mantra-ui/src/pages/shared.rs create mode 100644 crates/mantra-ui/src/pages/source.rs create mode 100644 crates/mantra-ui/src/pages/theme.rs create mode 100644 sass/main.scss create mode 100644 static/fonts/fraunces-italic-variable.woff2 create mode 100644 static/fonts/fraunces-variable.woff2 create mode 100644 static/fonts/plex-mono-variable.woff2 create mode 100644 static/fonts/plex-sans-variable.woff2 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..11b99a8 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +/target +/content +.DS_Store +.env diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..20b9281 --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,3529 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "ahash" +version = "0.8.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" +dependencies = [ + "cfg-if", + "once_cell", + "version_check", + "zerocopy", +] + +[[package]] +name = "aho-corasick" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" +dependencies = [ + "memchr", +] + +[[package]] +name = "allocator-api2" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + +[[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.18", + "tokio", + "wasm-bindgen-futures", +] + +[[package]] +name = "anyhow" +version = "1.0.102" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c" + +[[package]] +name = "arraydeque" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d902e3d592a523def97af8f317b08ce16b7ab854c1985a0c671e6f15cebc236" + +[[package]] +name = "async-lock" +version = "3.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "290f7f2596bd5b78a9fec8088ccd89180d7f9f55b94b0576823bbbdc72ee8311" +dependencies = [ + "event-listener", + "event-listener-strategy", + "pin-project-lite", +] + +[[package]] +name = "async-once-cell" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4288f83726785267c6f2ef073a3d83dc3f9b81464e9f99898240cced85fce35a" + +[[package]] +name = "async-trait" +version = "0.1.89" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + +[[package]] +name = "attribute-derive" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05832cdddc8f2650cc2cc187cc2e952b8c133a48eb055f35211f61ee81502d77" +dependencies = [ + "attribute-derive-macro", + "derive-where", + "manyhow", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "attribute-derive-macro" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a7cdbbd4bd005c5d3e2e9c885e6fa575db4f4a3572335b974d8db853b6beb61" +dependencies = [ + "collection_literals", + "interpolator", + "manyhow", + "proc-macro-utils", + "proc-macro2", + "quote", + "quote-use", + "syn", +] + +[[package]] +name = "autocfg" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" + +[[package]] +name = "axum" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31b698c5f9a010f6573133b09e0de5408834d0c82f8d7475a89fc1867a71cd90" +dependencies = [ + "axum-core", + "base64", + "bytes", + "form_urlencoded", + "futures-util", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-util", + "itoa", + "matchit", + "memchr", + "mime", + "multer", + "percent-encoding", + "pin-project-lite", + "serde_core", + "serde_json", + "serde_path_to_error", + "serde_urlencoded", + "sha1", + "sync_wrapper", + "tokio", + "tokio-tungstenite", + "tower", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "axum-core" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08c78f31d7b1291f7ee735c1c6780ccde7785daae9a9206026862dab7d8792d1" +dependencies = [ + "bytes", + "futures-core", + "http", + "http-body", + "http-body-util", + "mime", + "pin-project-lite", + "sync_wrapper", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "base16" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d27c3610c36aee21ce8ac510e6224498de4228ad772a171ed65643a24693a5a8" + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "bitflags" +version = "2.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4512299f36f043ab09a583e57bceb5a5aab7a73db1805848e8fef3c9e8c78b3" + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "bumpalo" +version = "3.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d20789868f4b01b2f2caec9f5c4e0213b41e3e5702a50157d699ae31ced2fcb" + +[[package]] +name = "bytes" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33" + +[[package]] +name = "camino" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e629a66d692cb9ff1a1c664e41771b3dcaf961985a9774c0eb0bd1b51cf60a48" + +[[package]] +name = "cc" +version = "1.2.60" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43c5703da9466b66a946814e1adf53ea2c90f10063b86290cc9eb67ce3478a20" +dependencies = [ + "find-msvc-tools", + "shlex", +] + +[[package]] +name = "cfg-if" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" + +[[package]] +name = "cfg_aliases" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" + +[[package]] +name = "chrono" +version = "0.4.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c673075a2e0e5f4a1dde27ce9dee1ea4558c7ffe648f576438a20ca1d2acc4b0" +dependencies = [ + "iana-time-zone", + "num-traits", + "serde", + "windows-link", +] + +[[package]] +name = "codee" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9dbbdc4b4d349732bc6690de10a9de952bd39ba6a065c586e26600b6b0b91f5" +dependencies = [ + "serde", + "serde_json", + "thiserror 2.0.18", +] + +[[package]] +name = "collection_literals" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2550f75b8cfac212855f6b1885455df8eaee8fe8e246b647d69146142e016084" + +[[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.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e68cfe19cd7d23ffde002c24ffa5cda73931913ef394d5eaaa32037dc940c0c" +dependencies = [ + "convert_case 0.6.0", + "pathdiff", + "serde_core", + "toml 1.1.2+spec-1.1.0", + "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 = "const-str" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18f12cc9948ed9604230cdddc7c86e270f9401ccbe3c2e98a4378c5e7632212f" + +[[package]] +name = "const_format" +version = "0.2.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4481a617ad9a412be3b97c5d403fef8ed023103368908b9c50af598ff467cc1e" +dependencies = [ + "const_format_proc_macros", + "konst", +] + +[[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.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "affbf0190ed2caf063e3def54ff444b449371d55c58e513a95ab98eca50adb49" +dependencies = [ + "unicode-segmentation", +] + +[[package]] +name = "convert_case_extras" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589c70f0faf8aa9d17787557d5eae854d7755cac50f5c3d12c81d3d57661cebb" +dependencies = [ + "convert_case 0.11.0", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" + +[[package]] +name = "crypto-common" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "data-encoding" +version = "2.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7a1e2f27636f116493b8b860f5546edb47c8d8f8ea73e1d2a20be88e28d1fea" + +[[package]] +name = "derive-where" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d08b3a0bcc0d079199cd476b2cae8435016ec11d1c0986c6901c5ac223041534" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", +] + +[[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.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5060e0a4cbf26a87550792688ade88e6b8aec9208613631a7a363bda7bc2d4cd" +dependencies = [ + "paste", + "pin-project-lite", +] + +[[package]] +name = "encoding_rs" +version = "0.8.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" +dependencies = [ + "cfg-if", +] + +[[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 = "errno" +version = "0.3.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" +dependencies = [ + "libc", + "windows-sys 0.61.2", +] + +[[package]] +name = "event-listener" +version = "5.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13b66accf52311f30a0db42147dadea9850cb48cd070028831ae5f5d4b856ab" +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 = "find-msvc-tools" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" + +[[package]] +name = "foldhash" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" + +[[package]] +name = "form_urlencoded" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "futures" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b147ee9d1f6d097cef9ce628cd2ee62288d963e16fb287bd9286455b241382d" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07bbe89c50d7a535e539b8c17bc0b49bdb77747034daa8087407d655f3f7cc1d" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d" + +[[package]] +name = "futures-executor" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf29c38818342a3b26b5b923639e7b1f4a61fc5e76102d4b1981c6dc7a7579d" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cecba35d7ad927e23624b22ad55235f2239cfa44fd10428eecbeba6d6a717718" + +[[package]] +name = "futures-macro" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e835b70203e41293343137df5c0664546da5745f82ec9b84d40be8336958447b" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "futures-sink" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c39754e157331b013978ec91992bde1ac089843443c49cbc7f46150b0fad0893" + +[[package]] +name = "futures-task" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393" + +[[package]] +name = "futures-util" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "slab", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "wasi", + "wasm-bindgen", +] + +[[package]] +name = "getrandom" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "r-efi 5.3.0", + "wasip2", + "wasm-bindgen", +] + +[[package]] +name = "getrandom" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0de51e6874e94e7bf76d726fc5d13ba782deca734ff60d5bb2fb2607c7406555" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "r-efi 6.0.0", + "wasip2", + "wasip3", + "wasm-bindgen", +] + +[[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 = "gray_matter" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8666976c40b8633f918783969b6681a3ddb205f29150348617de425d85a3e3bd" +dependencies = [ + "serde", + "serde_json", + "toml 0.5.11", + "yaml-rust2", +] + +[[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" +dependencies = [ + "ahash", + "allocator-api2", +] + +[[package]] +name = "hashbrown" +version = "0.15.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" +dependencies = [ + "foldhash", +] + +[[package]] +name = "hashbrown" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f467dd6dccf739c208452f8014c75c18bb8301b050ad1cfb27153803edb0f51" + +[[package]] +name = "hashlink" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8094feaf31ff591f651a2664fb9cfd92bba7a60ce3197265e9482ebe753c8f7" +dependencies = [ + "hashbrown 0.14.5", +] + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[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.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3ba2a386d7f85a81f119ad7498ebe444d2e22c2af0b86b069416ace48b3311a" +dependencies = [ + "bytes", + "itoa", +] + +[[package]] +name = "http-body" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" +dependencies = [ + "bytes", + "http", +] + +[[package]] +name = "http-body-util" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" +dependencies = [ + "bytes", + "futures-core", + "http", + "http-body", + "pin-project-lite", +] + +[[package]] +name = "http-range-header" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9171a2ea8a68358193d15dd5d70c1c10a2afc3e7e4c5bc92bc9f025cebd7359c" + +[[package]] +name = "httparse" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" + +[[package]] +name = "httpdate" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" + +[[package]] +name = "hydration_context" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8714ae4adeaa846d838f380fbd72f049197de629948f91bf045329e0cf0a283" +dependencies = [ + "futures", + "js-sys", + "once_cell", + "or_poisoned", + "pin-project-lite", + "serde", + "throw_error", + "wasm-bindgen", +] + +[[package]] +name = "hyper" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6299f016b246a94207e63da54dbe807655bf9e00044f73ded42c3ac5305fbcca" +dependencies = [ + "atomic-waker", + "bytes", + "futures-channel", + "futures-core", + "http", + "http-body", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "smallvec", + "tokio", + "want", +] + +[[package]] +name = "hyper-rustls" +version = "0.27.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33ca68d021ef39cf6463ab54c1d0f5daf03377b70561305bb89a8f83aab66e0f" +dependencies = [ + "http", + "hyper", + "hyper-util", + "rustls", + "tokio", + "tokio-rustls", + "tower-service", + "webpki-roots", +] + +[[package]] +name = "hyper-util" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96547c2556ec9d12fb1578c4eaf448b04993e7fb79cbaad930a656880a6bdfa0" +dependencies = [ + "base64", + "bytes", + "futures-channel", + "futures-util", + "http", + "http-body", + "hyper", + "ipnet", + "libc", + "percent-encoding", + "pin-project-lite", + "socket2", + "tokio", + "tower-service", + "tracing", +] + +[[package]] +name = "iana-time-zone" +version = "0.1.65" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e31bc9ad994ba00e440a8aa5c9ef0ec67d5cb5e5cb0cc7f8b744a35b389cc470" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "log", + "wasm-bindgen", + "windows-core", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + +[[package]] +name = "icu_collections" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2984d1cd16c883d7935b9e07e44071dca8d917fd52ecc02c04d5fa0b5a3f191c" +dependencies = [ + "displaydoc", + "potential_utf", + "utf8_iter", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locale_core" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92219b62b3e2b4d88ac5119f8904c10f8f61bf7e95b640d25ba3075e6cac2c29" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_normalizer" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c56e5ee99d6e3d33bd91c5d85458b6005a22140021cc324cea84dd0e72cff3b4" +dependencies = [ + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da3be0ae77ea334f4da67c12f149704f19f81d1adf7c51cf482943e84a2bad38" + +[[package]] +name = "icu_properties" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bee3b67d0ea5c2cca5003417989af8996f8604e34fb9ddf96208a033901e70de" +dependencies = [ + "icu_collections", + "icu_locale_core", + "icu_properties_data", + "icu_provider", + "zerotrie", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e2bbb201e0c04f7b4b3e14382af113e17ba4f63e2c9d2ee626b720cbce54a14" + +[[package]] +name = "icu_provider" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "139c4cf31c8b5f33d7e199446eff9c1e02decfc2f0eec2c8d71f65befa45b421" +dependencies = [ + "displaydoc", + "icu_locale_core", + "writeable", + "yoke", + "zerofrom", + "zerotrie", + "zerovec", +] + +[[package]] +name = "id-arena" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954" + +[[package]] +name = "idna" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" +dependencies = [ + "icu_normalizer", + "icu_properties", +] + +[[package]] +name = "indexmap" +version = "2.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9" +dependencies = [ + "equivalent", + "hashbrown 0.17.0", + "serde", + "serde_core", +] + +[[package]] +name = "interpolator" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71dd52191aae121e8611f1e8dc3e324dd0dd1dee1e6dd91d10ee07a3cfb4d9d8" + +[[package]] +name = "inventory" +version = "0.3.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4f0c30c76f2f4ccee3fe55a2435f691ca00c0e4bd87abe4f4a851b1d4dac39b" +dependencies = [ + "rustversion", +] + +[[package]] +name = "ipnet" +version = "2.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d98f6fed1fde3f8c21bc40a1abb88dd75e67924f9cffc3ef95607bad8017f8e2" + +[[package]] +name = "iri-string" +version = "0.7.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25e659a4bb38e810ebc252e53b5814ff908a8c58c2a9ce2fae1bbec24cbf4e20" +dependencies = [ + "memchr", + "serde", +] + +[[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.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" + +[[package]] +name = "js-sys" +version = "0.3.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2964e92d1d9dc3364cae4d718d93f227e3abb088e747d92e0395bfdedf1c12ca" +dependencies = [ + "cfg-if", + "futures-util", + "once_cell", + "wasm-bindgen", +] + +[[package]] +name = "konst" +version = "0.2.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "128133ed7824fcd73d6e7b17957c5eb7bacb885649bd8c69708b2331a10bcefb" +dependencies = [ + "konst_macro_rules", +] + +[[package]] +name = "konst_macro_rules" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4933f3f57a8e9d9da04db23fb153356ecaf00cbd14aee46279c33dc80925c37" + +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" + +[[package]] +name = "leb128fmt" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" + +[[package]] +name = "leptos" +version = "0.8.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "efa3982e7fe36c1de68f91f3c9083124f389a975523881f3d7e3363362feda41" +dependencies = [ + "any_spawner", + "base64", + "cfg-if", + "either_of", + "futures", + "getrandom 0.4.2", + "hydration_context", + "leptos_config", + "leptos_dom", + "leptos_hot_reload", + "leptos_macro", + "leptos_server", + "oco_ref", + "or_poisoned", + "paste", + "rand", + "reactive_graph", + "rustc-hash", + "rustc_version", + "send_wrapper", + "serde", + "serde_json", + "serde_qs", + "server_fn", + "slotmap", + "tachys", + "thiserror 2.0.18", + "throw_error", + "typed-builder", + "typed-builder-macro", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm_split_helpers", + "web-sys", +] + +[[package]] +name = "leptos_axum" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2ac7734eed700b0170dffbfc93b03491ed1f306622d79625323a21ed0eedac0" +dependencies = [ + "any_spawner", + "axum", + "futures", + "hydration_context", + "leptos", + "leptos_integration_utils", + "leptos_macro", + "leptos_meta", + "leptos_router", + "or_poisoned", + "server_fn", + "tachys", + "tokio", + "tower", + "tower-http", +] + +[[package]] +name = "leptos_config" +version = "0.8.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c06f751315bccc0d193fab302ac01d25bcfcd97474d4676440e7e3250dc3fc3" +dependencies = [ + "config", + "regex", + "serde", + "thiserror 2.0.18", + "typed-builder", +] + +[[package]] +name = "leptos_dom" +version = "0.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35742e9ed8f8aaf9e549b454c68a7ac0992536e06856365639b111f72ab07884" +dependencies = [ + "js-sys", + "or_poisoned", + "reactive_graph", + "send_wrapper", + "tachys", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "leptos_hot_reload" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d2a0f220c8a5ef3c51199dfb9cdd702bc0eb80d52fbe70c7890adfaaae8a4b1" +dependencies = [ + "anyhow", + "camino", + "indexmap", + "or_poisoned", + "proc-macro2", + "quote", + "rstml", + "serde", + "syn", + "walkdir", +] + +[[package]] +name = "leptos_integration_utils" +version = "0.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c097f89cd9aa606297672f56fa5bdda09f01609a9f4eefaccdbb5ab5afea4279" +dependencies = [ + "futures", + "hydration_context", + "leptos", + "leptos_config", + "leptos_meta", + "leptos_router", + "reactive_graph", +] + +[[package]] +name = "leptos_macro" +version = "0.8.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9360df573fb57582384a8b7640a3de94ce6501d49be3b69f637cf11a42da484b" +dependencies = [ + "attribute-derive", + "cfg-if", + "convert_case 0.11.0", + "convert_case_extras", + "html-escape", + "itertools", + "leptos_hot_reload", + "prettyplease", + "proc-macro-error2", + "proc-macro2", + "quote", + "rstml", + "rustc_version", + "server_fn_macro", + "syn", + "uuid", +] + +[[package]] +name = "leptos_meta" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c3efe657b4c55ed2e078922786ffe20acfb71767c3dd913767b09a35c75c890" +dependencies = [ + "futures", + "indexmap", + "leptos", + "or_poisoned", + "send_wrapper", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "leptos_router" +version = "0.8.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c15158449162e099e2273442f7fd9b924f5cefd935d52af5755ec62aa819fa52" +dependencies = [ + "any_spawner", + "either_of", + "futures", + "gloo-net", + "js-sys", + "leptos", + "leptos_router_macro", + "or_poisoned", + "percent-encoding", + "reactive_graph", + "rustc_version", + "send_wrapper", + "tachys", + "thiserror 2.0.18", + "url", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "leptos_router_macro" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "409c0bd99f986c3cfa1a4db2443c835bc602ded1a12784e22ecb28c3ed5a2ae2" +dependencies = [ + "proc-macro-error2", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "leptos_server" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da974775c5ccbb6bd64be7f53f75e8321542e28f21563a416574dbe4d5447eae" +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.185" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52ff2c0fe9bc6cb6b14a0592c2ff4fa9ceb83eea9db979b0487cd054946a2b8f" + +[[package]] +name = "litemap" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92daf443525c4cce67b150400bc2316076100ce0b3686209eb8cf3c31612e6f0" + +[[package]] +name = "lock_api" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" +dependencies = [ + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" + +[[package]] +name = "lru-slab" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" + +[[package]] +name = "mantra-server" +version = "0.1.0" +dependencies = [ + "anyhow", + "axum", + "gray_matter", + "leptos", + "leptos_axum", + "leptos_meta", + "leptos_router", + "mantra-ui", + "pulldown-cmark", + "serde", + "tokio", + "tower-http", + "tracing", + "tracing-subscriber", +] + +[[package]] +name = "mantra-ui" +version = "0.1.0" +dependencies = [ + "chrono", + "console_error_panic_hook", + "leptos", + "leptos_meta", + "leptos_router", + "reqwest", + "serde", + "serde_json", + "tokio", + "wasm-bindgen", + "web-sys", +] + +[[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 = "matchers" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1525a2a28c7f4fa0fc98bb91ae755d1e2d1505079e05539e35bc876b5d65ae9" +dependencies = [ + "regex-automata", +] + +[[package]] +name = "matchit" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47e1ffaa40ddd1f3ed91f717a33c8c0ee23fff369e3aa8772b9605cc1d22f4c3" + +[[package]] +name = "memchr" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" + +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "mime_guess" +version = "2.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7c44f8e672c00fe5308fa235f821cb4198414e1c77935c1ab6948d3fd78550e" +dependencies = [ + "mime", + "unicase", +] + +[[package]] +name = "mio" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50b7e5b27aa02a74bac8c3f23f448f8d87ff11f92d3aac1a6ed369ee08cc56c1" +dependencies = [ + "libc", + "wasi", + "windows-sys 0.61.2", +] + +[[package]] +name = "multer" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83e87776546dc87511aa5ee218730c92b666d7264ab6ed41f9d215af9cd5224b" +dependencies = [ + "bytes", + "encoding_rs", + "futures-util", + "http", + "httparse", + "memchr", + "mime", + "spin", + "version_check", +] + +[[package]] +name = "next_tuple" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60993920e071b0c9b66f14e2b32740a4e27ffc82854dcd72035887f336a09a28" + +[[package]] +name = "nu-ansi-term" +version = "0.50.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + +[[package]] +name = "oco_ref" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed0423ff9973dea4d6bd075934fdda86ebb8c05bdf9d6b0507067d4a1226371d" +dependencies = [ + "serde", + "thiserror 2.0.18", +] + +[[package]] +name = "once_cell" +version = "1.21.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" + +[[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.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-link", +] + +[[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.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" + +[[package]] +name = "pin-project" +version = "1.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1749c7ed4bcaf4c3d0a3efc28538844fb29bcdd7d2b67b2be7e20ba861ff517" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9b20ed30f105399776b9c883e68e536ef602a16ae6f596d2c473591d6ad64c6" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" + +[[package]] +name = "potential_utf" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0103b1cef7ec0cf76490e969665504990193874ea05c85ff9bab8b911d0a0564" +dependencies = [ + "zerovec", +] + +[[package]] +name = "ppv-lite86" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "prettyplease" +version = "0.2.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" +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.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" +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 = "pulldown-cmark" +version = "0.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f86ba2052aebccc42cbbb3ed234b8b13ce76f75c3551a303cb2bcffcff12bb14" +dependencies = [ + "bitflags", + "memchr", + "pulldown-cmark-escape", + "unicase", +] + +[[package]] +name = "pulldown-cmark-escape" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "007d8adb5ddab6f8e3f491ac63566a7d5002cc7ed73901f72057943fa71ae1ae" + +[[package]] +name = "quinn" +version = "0.11.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e20a958963c291dc322d98411f541009df2ced7b5a4f2bd52337638cfccf20" +dependencies = [ + "bytes", + "cfg_aliases", + "pin-project-lite", + "quinn-proto", + "quinn-udp", + "rustc-hash", + "rustls", + "socket2", + "thiserror 2.0.18", + "tokio", + "tracing", + "web-time", +] + +[[package]] +name = "quinn-proto" +version = "0.11.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "434b42fec591c96ef50e21e886936e66d3cc3f737104fdb9b737c40ffb94c098" +dependencies = [ + "bytes", + "getrandom 0.3.4", + "lru-slab", + "rand", + "ring", + "rustc-hash", + "rustls", + "rustls-pki-types", + "slab", + "thiserror 2.0.18", + "tinyvec", + "tracing", + "web-time", +] + +[[package]] +name = "quinn-udp" +version = "0.5.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "addec6a0dcad8a8d96a771f815f0eaf55f9d1805756410b39f5fa81332574cbd" +dependencies = [ + "cfg_aliases", + "libc", + "once_cell", + "socket2", + "tracing", + "windows-sys 0.60.2", +] + +[[package]] +name = "quote" +version = "1.0.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924" +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.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" + +[[package]] +name = "r-efi" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" + +[[package]] +name = "rand" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44c5af06bb1b7d3216d91932aed5265164bf384dc89cd6ba05cf59a35f5f76ea" +dependencies = [ + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c" +dependencies = [ + "getrandom 0.3.4", +] + +[[package]] +name = "reactive_graph" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00c5a025366836190c7030e883cc2bcd9e384ff555336e3c7954741ca411b177" +dependencies = [ + "any_spawner", + "async-lock", + "futures", + "guardian", + "hydration_context", + "indexmap", + "or_poisoned", + "paste", + "pin-project-lite", + "rustc-hash", + "rustc_version", + "send_wrapper", + "serde", + "slotmap", + "thiserror 2.0.18", + "web-sys", +] + +[[package]] +name = "reactive_stores" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c30fd35b7d299c591293bb69fed47a703eb2703b1cff0493e78b16ed007e5382" +dependencies = [ + "guardian", + "indexmap", + "itertools", + "or_poisoned", + "paste", + "reactive_graph", + "reactive_stores_macro", + "rustc-hash", + "send_wrapper", +] + +[[package]] +name = "reactive_stores_macro" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5d8e790a5ae5ddf9b7fa380c728375b06858e0cca7d063a73b3408320c523e1" +dependencies = [ + "convert_case 0.11.0", + "proc-macro-error2", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "redox_syscall" +version = "0.5.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" +dependencies = [ + "bitflags", +] + +[[package]] +name = "regex" +version = "1.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e10754a14b9137dd7b1e3e5b0493cc9171fdd105e0ab477f51b72e7f3ac0e276" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a" + +[[package]] +name = "reqwest" +version = "0.12.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eddd3ca559203180a307f12d114c268abf583f59b03cb906fd0b3ff8646c1147" +dependencies = [ + "base64", + "bytes", + "futures-core", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-rustls", + "hyper-util", + "js-sys", + "log", + "percent-encoding", + "pin-project-lite", + "quinn", + "rustls", + "rustls-pki-types", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper", + "tokio", + "tokio-rustls", + "tower", + "tower-http", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "webpki-roots", +] + +[[package]] +name = "ring" +version = "0.17.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" +dependencies = [ + "cc", + "cfg-if", + "getrandom 0.2.17", + "libc", + "untrusted", + "windows-sys 0.52.0", +] + +[[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.18", +] + +[[package]] +name = "rustc-hash" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94300abf3f1ae2e2b8ffb7b58043de3d399c73fa6f4b73826402a5c457614dbe" + +[[package]] +name = "rustc_version" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver", +] + +[[package]] +name = "rustls" +version = "0.23.39" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c2c118cb077cca2822033836dfb1b975355dfb784b5e8da48f7b6c5db74e60e" +dependencies = [ + "once_cell", + "ring", + "rustls-pki-types", + "rustls-webpki", + "subtle", + "zeroize", +] + +[[package]] +name = "rustls-pki-types" +version = "1.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be040f8b0a225e40375822a563fa9524378b9d63112f53e19ffff34df5d33fdd" +dependencies = [ + "web-time", + "zeroize", +] + +[[package]] +name = "rustls-webpki" +version = "0.103.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61c429a8649f110dddef65e2a5ad240f747e85f7758a6bccc7e5777bd33f756e" +dependencies = [ + "ring", + "rustls-pki-types", + "untrusted", +] + +[[package]] +name = "rustversion" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" + +[[package]] +name = "ryu" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f" + +[[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 = "semver" +version = "1.0.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd" + +[[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.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_core" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.149" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86" +dependencies = [ + "itoa", + "memchr", + "serde", + "serde_core", + "zmij", +] + +[[package]] +name = "serde_path_to_error" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10a9ff822e371bb5403e391ecd83e182e0e77ba7f6fe0160b795797109d1b457" +dependencies = [ + "itoa", + "serde", + "serde_core", +] + +[[package]] +name = "serde_qs" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3faaf9e727533a19351a43cc5a8de957372163c7d35cc48c90b75cdda13c352" +dependencies = [ + "percent-encoding", + "serde", + "thiserror 2.0.18", +] + +[[package]] +name = "serde_spanned" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6662b5879511e06e8999a8a235d848113e942c9124f211511b16466ee2995f26" +dependencies = [ + "serde_core", +] + +[[package]] +name = "serde_urlencoded" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "server_fn" +version = "0.8.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d60e4c1dfccd91fe0990141f69f1d5cf5679797ad53aa1b45e5bd658eb119f0" +dependencies = [ + "axum", + "base64", + "bytes", + "const-str", + "const_format", + "futures", + "gloo-net", + "http", + "http-body-util", + "hyper", + "inventory", + "js-sys", + "or_poisoned", + "pin-project-lite", + "rustc_version", + "rustversion", + "send_wrapper", + "serde", + "serde_json", + "serde_qs", + "server_fn_macro_default", + "thiserror 2.0.18", + "throw_error", + "tokio", + "tower", + "tower-layer", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm-streams", + "web-sys", + "xxhash-rust", +] + +[[package]] +name = "server_fn_macro" +version = "0.8.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1295b54815397d30d986b63f93cfd515fa86d5e528e0bb589ce9d530502f9e0f" +dependencies = [ + "const_format", + "convert_case 0.11.0", + "proc-macro2", + "quote", + "rustc_version", + "syn", + "xxhash-rust", +] + +[[package]] +name = "server_fn_macro_default" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63eb08f80db903d3c42f64e60ebb3875e0305be502bdc064ec0a0eab42207f00" +dependencies = [ + "server_fn_macro", + "syn", +] + +[[package]] +name = "sha1" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "sha2" +version = "0.10.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "sharded-slab" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "signal-hook-registry" +version = "1.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b" +dependencies = [ + "errno", + "libc", +] + +[[package]] +name = "slab" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" + +[[package]] +name = "slotmap" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bdd58c3c93c3d278ca835519292445cb4b0d4dc59ccfdf7ceadaab3f8aeb4038" +dependencies = [ + "version_check", +] + +[[package]] +name = "smallvec" +version = "1.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" + +[[package]] +name = "socket2" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a766e1110788c36f4fa1c2b71b387a7815aa65f88ce0229841826633d93723e" +dependencies = [ + "libc", + "windows-sys 0.61.2", +] + +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" + +[[package]] +name = "stable_deref_trait" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" + +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + +[[package]] +name = "syn" +version = "2.0.117" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99" +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 = "sync_wrapper" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" +dependencies = [ + "futures-core", +] + +[[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.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2989c94c59db8497727875aa561d4d0daa3cc79b5774d5ced48263f7091beff1" +dependencies = [ + "any_spawner", + "async-trait", + "const_str_slice_concat", + "drain_filter_polyfill", + "either_of", + "erased", + "futures", + "html-escape", + "indexmap", + "itertools", + "js-sys", + "next_tuple", + "oco_ref", + "or_poisoned", + "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.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4" +dependencies = [ + "thiserror-impl 2.0.18", +] + +[[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.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "thread_local" +version = "1.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "throw_error" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc0ed6038fcbc0795aca7c92963ddda636573b956679204e044492d2b13c8f64" +dependencies = [ + "pin-project-lite", +] + +[[package]] +name = "tinystr" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8323304221c2a851516f22236c5722a72eaa19749016521d6dff0824447d96d" +dependencies = [ + "displaydoc", + "zerovec", +] + +[[package]] +name = "tinyvec" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e61e67053d25a4e82c844e8424039d9745781b3fc4f32b8d55ed50f5f667ef3" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "tokio" +version = "1.52.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b67dee974fe86fd92cc45b7a95fdd2f99a36a6d7b0d431a231178d3d670bbcc6" +dependencies = [ + "bytes", + "libc", + "mio", + "parking_lot", + "pin-project-lite", + "signal-hook-registry", + "socket2", + "tokio-macros", + "windows-sys 0.61.2", +] + +[[package]] +name = "tokio-macros" +version = "2.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "385a6cb71ab9ab790c5fe8d67f1645e6c450a7ce006a33de03daa956cf70a496" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tokio-rustls" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" +dependencies = [ + "rustls", + "tokio", +] + +[[package]] +name = "tokio-tungstenite" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f72a05e828585856dacd553fba484c242c46e391fb0e58917c942ee9202915c" +dependencies = [ + "futures-util", + "log", + "tokio", + "tungstenite", +] + +[[package]] +name = "tokio-util" +version = "0.7.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ae9cec805b01e8fc3fd2fe289f89149a9b66dd16786abd8b19cfa7b48cb0098" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "toml" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" +dependencies = [ + "serde", +] + +[[package]] +name = "toml" +version = "1.1.2+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81f3d15e84cbcd896376e6730314d59fb5a87f31e4b038454184435cd57defee" +dependencies = [ + "serde_core", + "serde_spanned", + "toml_datetime", + "toml_parser", + "winnow", +] + +[[package]] +name = "toml_datetime" +version = "1.1.1+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3165f65f62e28e0115a00b2ebdd37eb6f3b641855f9d636d3cd4103767159ad7" +dependencies = [ + "serde_core", +] + +[[package]] +name = "toml_parser" +version = "1.1.2+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2abe9b86193656635d2411dc43050282ca48aa31c2451210f4202550afb7526" +dependencies = [ + "winnow", +] + +[[package]] +name = "tower" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebe5ef63511595f1344e2d5cfa636d973292adc0eec1f0ad45fae9f0851ab1d4" +dependencies = [ + "futures-core", + "futures-util", + "pin-project-lite", + "sync_wrapper", + "tokio", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tower-http" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4e6559d53cc268e5031cd8429d05415bc4cb4aefc4aa5d6cc35fbf5b924a1f8" +dependencies = [ + "bitflags", + "bytes", + "futures-core", + "futures-util", + "http", + "http-body", + "http-body-util", + "http-range-header", + "httpdate", + "iri-string", + "mime", + "mime_guess", + "percent-encoding", + "pin-project-lite", + "tokio", + "tokio-util", + "tower", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tower-layer" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" + +[[package]] +name = "tower-service" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" + +[[package]] +name = "tracing" +version = "0.1.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" +dependencies = [ + "log", + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tracing-core" +version = "0.1.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" +dependencies = [ + "once_cell", + "valuable", +] + +[[package]] +name = "tracing-log" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" +dependencies = [ + "log", + "once_cell", + "tracing-core", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb7f578e5945fb242538965c2d0b04418d38ec25c79d160cd279bf0731c8d319" +dependencies = [ + "matchers", + "nu-ansi-term", + "once_cell", + "regex-automata", + "sharded-slab", + "smallvec", + "thread_local", + "tracing", + "tracing-core", + "tracing-log", +] + +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + +[[package]] +name = "tungstenite" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c01152af293afb9c7c2a57e4b559c5620b421f6d133261c60dd2d0cdb38e6b8" +dependencies = [ + "bytes", + "data-encoding", + "http", + "httparse", + "log", + "rand", + "sha1", + "thiserror 2.0.18", +] + +[[package]] +name = "typed-builder" +version = "0.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31aa81521b70f94402501d848ccc0ecaa8f93c8eb6999eb9747e72287757ffda" +dependencies = [ + "typed-builder-macro", +] + +[[package]] +name = "typed-builder-macro" +version = "0.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "076a02dc54dd46795c2e9c8282ed40bcfb1e22747e955de9389a1de28190fb26" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "typenum" +version = "1.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40ce102ab67701b8526c123c1bab5cbe42d7040ccfd0f64af1a385808d2f43de" + +[[package]] +name = "unicase" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbc4bc3a9f746d862c45cb89d705aa10f187bb96c76001afab07a0d35ce60142" + +[[package]] +name = "unicode-ident" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" + +[[package]] +name = "unicode-segmentation" +version = "1.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9629274872b2bfaf8d66f5f15725007f635594914870f65218920345aa11aa8c" + +[[package]] +name = "unicode-xid" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" + +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + +[[package]] +name = "url" +version = "2.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", + "serde", +] + +[[package]] +name = "utf8-width" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1292c0d970b54115d14f2492fe0170adf21d68a1de108eebc51c1df4f346a091" + +[[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.23.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddd74a9687298c6858e9b88ec8935ec45d22e8fd5e6394fa1bd4e99a87789c76" +dependencies = [ + "getrandom 0.4.2", + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "valuable" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" + +[[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 = "want" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +dependencies = [ + "try-lock", +] + +[[package]] +name = "wasi" +version = "0.11.1+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" + +[[package]] +name = "wasip2" +version = "1.0.3+wasi-0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20064672db26d7cdc89c7798c48a0fdfac8213434a1186e5ef29fd560ae223d6" +dependencies = [ + "wit-bindgen 0.57.1", +] + +[[package]] +name = "wasip3" +version = "0.4.0+wasi-0.3.0-rc-2026-01-06" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5428f8bf88ea5ddc08faddef2ac4a67e390b88186c703ce6dbd955e1c145aca5" +dependencies = [ + "wit-bindgen 0.51.0", +] + +[[package]] +name = "wasm-bindgen" +version = "0.2.118" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf938a0bacb0469e83c1e148908bd7d5a6010354cf4fb73279b7447422e3a89" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.68" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f371d383f2fb139252e0bfac3b81b265689bf45b6874af544ffa4c975ac1ebf8" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.118" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eeff24f84126c0ec2db7a449f0c2ec963c6a49efe0698c4242929da037ca28ed" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.118" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d08065faf983b2b80a79fd87d8254c409281cf7de75fc4b773019824196c904" +dependencies = [ + "bumpalo", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.118" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5fd04d9e306f1907bd13c6361b5c6bfc7b3b3c095ed3f8a9246390f8dbdee129" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "wasm-encoder" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "990065f2fe63003fe337b932cfb5e3b80e0b4d0f5ff650e6985b1048f62c8319" +dependencies = [ + "leb128fmt", + "wasmparser", +] + +[[package]] +name = "wasm-metadata" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb0e353e6a2fbdc176932bbaab493762eb1255a7900fe0fea1a2f96c296cc909" +dependencies = [ + "anyhow", + "indexmap", + "wasm-encoder", + "wasmparser", +] + +[[package]] +name = "wasm-streams" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d1ec4f6517c9e11ae630e200b2b65d193279042e28edd4a2cda233e46670bbb" +dependencies = [ + "futures-util", + "js-sys", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "wasm_split_helpers" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0cb6d1008be3c4c5abc31a407bfb8c8449ae14efc8561c1db821f79b9614b0a" +dependencies = [ + "async-once-cell", + "wasm_split_macros", +] + +[[package]] +name = "wasm_split_macros" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0a659ffe5c7f4538aa6357c07e3d73221cc61eba03bd9a081e14bc91ed09b8c" +dependencies = [ + "base16", + "quote", + "sha2", + "syn", +] + +[[package]] +name = "wasmparser" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe" +dependencies = [ + "bitflags", + "hashbrown 0.15.5", + "indexmap", + "semver", +] + +[[package]] +name = "web-sys" +version = "0.3.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f2dfbb17949fa2088e5d39408c48368947b86f7834484e87b73de55bc14d97d" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "web-time" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "webpki-roots" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52f5ee44c96cf55f1b349600768e3ece3a8f26010c05265ab73f945bb1a2eb9d" +dependencies = [ + "rustls-pki-types", +] + +[[package]] +name = "winapi-util" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "windows-core" +version = "0.62.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link", + "windows-result", + "windows-strings", +] + +[[package]] +name = "windows-implement" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "windows-interface" +version = "0.59.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + +[[package]] +name = "windows-result" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-strings" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" +dependencies = [ + "windows-targets 0.53.5", +] + +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm 0.52.6", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", +] + +[[package]] +name = "windows-targets" +version = "0.53.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" +dependencies = [ + "windows-link", + "windows_aarch64_gnullvm 0.53.1", + "windows_aarch64_msvc 0.53.1", + "windows_i686_gnu 0.53.1", + "windows_i686_gnullvm 0.53.1", + "windows_i686_msvc 0.53.1", + "windows_x86_64_gnu 0.53.1", + "windows_x86_64_gnullvm 0.53.1", + "windows_x86_64_msvc 0.53.1", +] + +[[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_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" + +[[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_gnu" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" + +[[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_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_i686_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" + +[[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_gnu" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" + +[[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_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" + +[[package]] +name = "winnow" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ee1708bef14716a11bae175f579062d4554d95be2c6829f518df847b7b3fdd0" +dependencies = [ + "memchr", +] + +[[package]] +name = "wit-bindgen" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5" +dependencies = [ + "wit-bindgen-rust-macro", +] + +[[package]] +name = "wit-bindgen" +version = "0.57.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e" + +[[package]] +name = "wit-bindgen-core" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea61de684c3ea68cb082b7a88508a8b27fcc8b797d738bfc99a82facf1d752dc" +dependencies = [ + "anyhow", + "heck", + "wit-parser", +] + +[[package]] +name = "wit-bindgen-rust" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7c566e0f4b284dd6561c786d9cb0142da491f46a9fbed79ea69cdad5db17f21" +dependencies = [ + "anyhow", + "heck", + "indexmap", + "prettyplease", + "syn", + "wasm-metadata", + "wit-bindgen-core", + "wit-component", +] + +[[package]] +name = "wit-bindgen-rust-macro" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c0f9bfd77e6a48eccf51359e3ae77140a7f50b1e2ebfe62422d8afdaffab17a" +dependencies = [ + "anyhow", + "prettyplease", + "proc-macro2", + "quote", + "syn", + "wit-bindgen-core", + "wit-bindgen-rust", +] + +[[package]] +name = "wit-component" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2" +dependencies = [ + "anyhow", + "bitflags", + "indexmap", + "log", + "serde", + "serde_derive", + "serde_json", + "wasm-encoder", + "wasm-metadata", + "wasmparser", + "wit-parser", +] + +[[package]] +name = "wit-parser" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecc8ac4bc1dc3381b7f59c34f00b67e18f910c2c0f50015669dde7def656a736" +dependencies = [ + "anyhow", + "id-arena", + "indexmap", + "log", + "semver", + "serde", + "serde_derive", + "serde_json", + "unicode-xid", + "wasmparser", +] + +[[package]] +name = "writeable" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ffae5123b2d3fc086436f8834ae3ab053a283cfac8fe0a0b8eaae044768a4c4" + +[[package]] +name = "xxhash-rust" +version = "0.8.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdd20c5420375476fbd4394763288da7eb0cc0b8c11deed431a91562af7335d3" + +[[package]] +name = "yaml-rust2" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8902160c4e6f2fb145dbe9d6760a75e3c9522d8bf796ed7047c85919ac7115f8" +dependencies = [ + "arraydeque", + "encoding_rs", + "hashlink", +] + +[[package]] +name = "yansi" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049" + +[[package]] +name = "yoke" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "abe8c5fda708d9ca3df187cae8bfb9ceda00dd96231bed36e445a1a48e66f9ca" +dependencies = [ + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de844c262c8848816172cef550288e7dc6c7b7814b4ee56b3e1553f275f1858e" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + +[[package]] +name = "zerocopy" +version = "0.8.48" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eed437bf9d6692032087e337407a86f04cd8d6a16a37199ed57949d415bd68e9" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.48" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70e3cd084b1788766f53af483dd21f93881ff30d7320490ec3ef7526d203bad4" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "zerofrom" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69faa1f2a1ea75661980b013019ed6687ed0e83d069bc1114e2cc74c6c04c4df" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11532158c46691caf0f2593ea8358fed6bbf68a0315e80aae9bd41fbade684a1" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + +[[package]] +name = "zeroize" +version = "1.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" + +[[package]] +name = "zerotrie" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f9152d31db0792fa83f70fb2f83148effb5c1f5b8c7686c3459e361d9bc20bf" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", +] + +[[package]] +name = "zerovec" +version = "0.11.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90f911cbc359ab6af17377d242225f4d75119aec87ea711a880987b18cd7b239" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "625dc425cab0dca6dc3c3319506e6593dcb08a9f387ea3b284dbd52a92c40555" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "zmij" +version = "1.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..0fcbd14 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,58 @@ +[workspace] +resolver = "2" +members = ["crates/mantra-server", "crates/mantra-ui"] + +[workspace.dependencies] +leptos = { version = "0.8" } +leptos_axum = "0.8" +leptos_router = { version = "0.8" } +leptos_meta = "0.8" +serde = { version = "1", features = ["derive"] } +serde_json = "1" +tokio = { version = "1", features = ["full"] } +axum = "0.8" +tower-http = { version = "0.6", features = ["trace", "fs"] } +tracing = "0.1" +tracing-subscriber = "0.3" +anyhow = "1" +pulldown-cmark = { version = "0.12", default-features = false, features = ["html"] } +gray_matter = "0.2" +reqwest = { version = "0.12", default-features = false, features = ["json", "rustls-tls"] } +chrono = { version = "0.4", default-features = false, features = ["clock", "serde"] } + +[profile.release] +opt-level = "z" +lto = "fat" +codegen-units = 1 + +[profile.dev.package.leptos_macro] +opt-level = 3 + +# cargo-leptos workspace config +[[workspace.metadata.leptos]] +name = "mantra" +bin-package = "mantra-server" +bin-exe-name = "mantra-server" +bin-features = ["ssr"] +bin-default-features = false +lib-package = "mantra-ui" +lib-features = ["hydrate"] +lib-default-features = false +output-name = "mantra" +site-root = "target/site" +site-pkg-dir = "pkg" +style-file = "sass/main.scss" +assets-dir = "static" +site-addr = "127.0.0.1:9920" +reload-port = 3040 +env = "DEV" +browserquery = "defaults" +lib-profile-release = "wasm-release" + +[profile.wasm-release] +inherits = "release" +opt-level = "z" +lto = "fat" +codegen-units = 1 +panic = "abort" +strip = "symbols" diff --git a/crates/mantra-server/Cargo.toml b/crates/mantra-server/Cargo.toml new file mode 100644 index 0000000..e229972 --- /dev/null +++ b/crates/mantra-server/Cargo.toml @@ -0,0 +1,28 @@ +[package] +name = "mantra-server" +version = "0.1.0" +edition = "2021" + +[[bin]] +name = "mantra-server" +path = "src/main.rs" + +[dependencies] +mantra-ui = { path = "../mantra-ui", features = ["ssr"] } +leptos = { workspace = true, features = ["ssr"] } +leptos_axum = { workspace = true } +leptos_router = { workspace = true, features = ["ssr"] } +leptos_meta = { workspace = true, features = ["ssr"] } +axum = { workspace = true } +tokio = { workspace = true } +tower-http = { workspace = true } +tracing = { workspace = true } +tracing-subscriber = { workspace = true, features = ["env-filter"] } +anyhow = { workspace = true } +pulldown-cmark = { workspace = true } +gray_matter = { workspace = true } +serde = { workspace = true } + +[features] +default = [] +ssr = [] diff --git a/crates/mantra-server/src/corpus_loader.rs b/crates/mantra-server/src/corpus_loader.rs new file mode 100644 index 0000000..0b35c93 --- /dev/null +++ b/crates/mantra-server/src/corpus_loader.rs @@ -0,0 +1,331 @@ +//! Loads the design-dna corpus from a directory of markdown files. +//! +//! Layout expected (relative to MANTRA_CONTENT_DIR): +//! cycle-1-philosophy/ +//! _index.md ← corpus-level index with themes +//! .md × N ← one distillation per source +//! +//! The loader returns an in-memory `Corpus` ready for SSR renders. + +use std::collections::HashMap; +use std::fs; +use std::path::{Path, PathBuf}; + +use anyhow::{anyhow, Context, Result}; +use gray_matter::engine::YAML; +use gray_matter::Matter; +use pulldown_cmark::{html, Event, Options, Parser, Tag, TagEnd}; +use std::collections::hash_map::DefaultHasher; +use std::hash::{Hash, Hasher}; +use serde::Deserialize; + +use mantra_ui::corpus::{Corpus, Source, Theme}; + +#[derive(Deserialize, Debug, Default)] +struct SourceFrontmatter { + #[serde(default)] + source: String, + #[serde(default)] + tags: Vec, + #[serde(default)] + confidence: String, + #[serde(default, rename = "type")] + _kind: String, +} + +pub fn load_corpus(root: &Path) -> Result { + load_corpus_alt_cycle_dir(root, "cycle-1-philosophy") +} + +pub fn load_corpus_alt_cycle_dir(root: &Path, cycle_subdir: &str) -> Result { + let cycle_dir = root.join(cycle_subdir); + if !cycle_dir.is_dir() { + return Err(anyhow!( + "content dir missing {} subdir: {}", + cycle_subdir, + cycle_dir.display() + )); + } + + // First pass: gather all source files (exclude _index.md). + let mut source_paths: Vec = Vec::new(); + for entry in fs::read_dir(&cycle_dir)? { + let path = entry?.path(); + let Some(name) = path.file_name().and_then(|n| n.to_str()) else { + continue; + }; + if !name.ends_with(".md") { + continue; + } + if name.starts_with('_') { + continue; + } + source_paths.push(path); + } + source_paths.sort(); + + let mut sources: HashMap = HashMap::new(); + let mut order: Vec = Vec::new(); + for path in &source_paths { + let src = parse_source(path).with_context(|| { + format!("parsing source {}", path.display()) + })?; + order.push(src.slug.clone()); + sources.insert(src.slug.clone(), src); + } + + // Themes come from the _index.md if present; skip gracefully otherwise. + let themes = parse_themes(&cycle_dir.join("_index.md")) + .unwrap_or_else(|e| { + tracing::warn!("no themes loaded: {e}"); + Vec::new() + }); + + Ok(Corpus { order, sources, themes }) +} + +fn parse_source(path: &Path) -> Result { + let raw = fs::read_to_string(path)?; + let matter = Matter::::new(); + let parsed = matter.parse(&raw); + let fm: SourceFrontmatter = parsed + .data + .as_ref() + .and_then(|p| p.deserialize().ok()) + .unwrap_or_default(); + + let body_md = parsed.content; + let slug = path + .file_stem() + .and_then(|s| s.to_str()) + .ok_or_else(|| anyhow!("bad filename: {}", path.display()))? + .to_string(); + + // Extract H1 (### replaces some files — just grab the first #-line). + let title = body_md + .lines() + .find(|l| l.starts_with("# ")) + .map(|l| l.trim_start_matches("# ").trim().to_string()) + .unwrap_or_else(|| slug.clone()); + + let core_claim = extract_section(&body_md, "## Core claim") + .unwrap_or_default() + .trim() + .replace('\n', " "); + + let author = fm + .source + .split(',') + .next() + .unwrap_or(&slug) + .trim() + .to_string(); + + let body_html = md_to_html(&body_md); + + Ok(Source { + slug, + title, + author, + core_claim, + tags: fm.tags, + confidence: if fm.confidence.is_empty() { + "medium".into() + } else { + fm.confidence + }, + body_html, + }) +} + +/// Extract text content between a given heading and the next `## ` heading. +fn extract_section(md: &str, heading: &str) -> Option { + let mut out = String::new(); + let mut capturing = false; + for line in md.lines() { + if line.trim_start().starts_with(heading) { + capturing = true; + continue; + } + if capturing && line.trim_start().starts_with("## ") { + break; + } + if capturing { + out.push_str(line); + out.push('\n'); + } + } + if out.trim().is_empty() { None } else { Some(out) } +} + +/// Render markdown to HTML and inject stable `data-para-id` attributes +/// on every `

` element. The id is a short content-hash: stable +/// across minor edits of the surrounding text, unique enough within a +/// single source document. The margin-layer UI uses these ids to +/// anchor notes and Claude-asks to specific paragraphs. +fn md_to_html(md: &str) -> String { + let mut opts = Options::empty(); + opts.insert(Options::ENABLE_TABLES); + opts.insert(Options::ENABLE_FOOTNOTES); + opts.insert(Options::ENABLE_STRIKETHROUGH); + opts.insert(Options::ENABLE_TASKLISTS); + opts.insert(Options::ENABLE_SMART_PUNCTUATION); + + // First pass: render plain HTML. + let parser = Parser::new_ext(md, opts); + let mut raw = String::new(); + html::push_html(&mut raw, parser); + + // Second pass: re-parse to capture paragraph text for hashing, and + // inject data-para-id. pulldown-cmark emits events in order, so we + // can walk the source again, track paragraphs, compute hashes, and + // then do a simple textual rewrite on the output. + let parser2 = Parser::new_ext(md, opts); + let mut current_para_text = String::new(); + let mut in_para = false; + let mut para_hashes: Vec = Vec::new(); + for ev in parser2 { + match ev { + Event::Start(Tag::Paragraph) => { + in_para = true; + current_para_text.clear(); + } + Event::End(TagEnd::Paragraph) => { + let id = short_hash(current_para_text.trim()); + para_hashes.push(id); + in_para = false; + } + Event::Text(t) if in_para => current_para_text.push_str(&t), + Event::Code(t) if in_para => current_para_text.push_str(&t), + _ => {} + } + } + + // Inject attributes: replace each `

` (in order) with + // `

`. We walk the byte buffer to find the + // ASCII literal `

`, but copy UTF-8 slices (not byte-by-byte) + // to preserve non-ASCII correctly — the earlier `push(u8 as char)` + // approach silently decoded multibyte UTF-8 as Latin-1 and turned + // em-dashes / smart-quotes / Cyrillic / Greek into mojibake. + let mut out = String::with_capacity(raw.len() + para_hashes.len() * 24); + let mut pending = para_hashes.into_iter(); + let bytes = raw.as_bytes(); + let mut last_copied = 0usize; + let mut i = 0usize; + while i + 3 <= bytes.len() { + if &bytes[i..i + 3] == b"

" { + // flush everything from last_copied..i as a proper str slice + out.push_str(&raw[last_copied..i]); + if let Some(id) = pending.next() { + out.push_str(&format!(r#"

"#)); + } else { + out.push_str("

"); + } + i += 3; + last_copied = i; + } else { + i += 1; + } + } + out.push_str(&raw[last_copied..]); + out +} + +fn short_hash(s: &str) -> String { + let mut h = DefaultHasher::new(); + s.hash(&mut h); + format!("{:08x}", h.finish() & 0xFFFF_FFFF) +} + +/// Parse `_index.md` for the 12 running themes + their contributing sources. +/// +/// Format assumption: each theme is introduced by `### {n}. {title}` +/// with the following paragraph carrying a comma-separated list of +/// author names. We map author names back to slugs by substring-match +/// on the source files' author field. Fallback if pattern doesn't +/// match: empty themes list, landing shows empty themes column. +fn parse_themes(index_path: &Path) -> Result> { + let raw = fs::read_to_string(index_path)?; + let mut themes: Vec = Vec::new(); + let mut current: Option<(String, String, String)> = None; // (slug, title, desc_md) + + for line in raw.lines() { + if let Some(rest) = line.strip_prefix("### ") { + if let Some((slug, title, desc)) = current.take() { + themes.push(finalize_theme(slug, title, desc)); + } + // e.g. "### 1. Emptiness / absence как носитель формы" + let rest = rest.trim(); + let after_num = rest + .split_once('.') + .map(|(_, r)| r.trim().to_string()) + .unwrap_or_else(|| rest.to_string()); + let slug = slugify(&after_num); + current = Some((slug, after_num, String::new())); + } else if line.starts_with("## ") { + // exit "running themes" section — fallthrough to push last theme + if let Some((slug, title, desc)) = current.take() { + themes.push(finalize_theme(slug, title, desc)); + } + } else if let Some((_, _, desc)) = current.as_mut() { + desc.push_str(line); + desc.push('\n'); + } + } + if let Some((slug, title, desc)) = current.take() { + themes.push(finalize_theme(slug, title, desc)); + } + Ok(themes) +} + +fn finalize_theme(slug: String, title: String, desc_md: String) -> Theme { + let contributing = parse_theme_contributors(&desc_md); + let description_html = md_to_html(desc_md.trim()); + Theme { + slug, + title, + description_html, + contributing, + } +} + +/// Very loose extraction: pull parenthesis-grouped author names out of +/// the theme description and attempt to match them to known sources. +/// Since we don't yet have the corpus at this point, we just return a +/// best-guess list of tokens — the landing component can filter by +/// membership later if desired. +fn parse_theme_contributors(desc: &str) -> Vec { + // Heuristic: grab author names from the first parenthetical group. + let Some(start) = desc.find('(') else { + return Vec::new(); + }; + let Some(end) = desc[start..].find(')') else { + return Vec::new(); + }; + let inside = &desc[start + 1..start + end]; + inside + .split([',', '·']) + .map(|s| s.trim()) + .filter(|s| !s.is_empty()) + .map(|s| { + // Strip parenthetical hints like "Laozi (ch. 11)" → "Laozi" + s.split_whitespace() + .next() + .unwrap_or(s) + .to_string() + }) + .map(|s| slugify(&s)) + .filter(|s| !s.is_empty()) + .collect() +} + +fn slugify(s: &str) -> String { + s.to_lowercase() + .chars() + .map(|c| if c.is_alphanumeric() { c } else { '-' }) + .collect::() + .split('-') + .filter(|p| !p.is_empty()) + .collect::>() + .join("-") +} diff --git a/crates/mantra-server/src/main.rs b/crates/mantra-server/src/main.rs new file mode 100644 index 0000000..c8c3585 --- /dev/null +++ b/crates/mantra-server/src/main.rs @@ -0,0 +1,119 @@ +//! mantra server — axum + leptos_axum SSR. +//! +//! Loads the corpus from disk once at startup (env `MANTRA_CONTENT_DIR`), +//! hands a shared `Arc` to every render pass via Leptos context. + +#![recursion_limit = "256"] + +mod corpus_loader; + +use std::net::SocketAddr; +use std::path::PathBuf; +use std::sync::Arc; + +use anyhow::Result; +use axum::routing::any; +use axum::Router; +use leptos::config::get_configuration; +use leptos::prelude::provide_context; +use leptos_axum::{generate_route_list, handle_server_fns_with_context, LeptosRoutes}; +use tower_http::services::ServeDir; +use tower_http::trace::TraceLayer; +use tracing::info; + +use mantra_ui::app::{shell, App}; +use mantra_ui::corpus::{BilingualCorpus, BilingualHandle}; + +#[tokio::main] +async fn main() -> Result<()> { + tracing_subscriber::fmt() + .with_env_filter( + tracing_subscriber::EnvFilter::try_from_env("MANTRA_LOG") + .unwrap_or_else(|_| tracing_subscriber::EnvFilter::new("info")), + ) + .without_time() + .init(); + + let content_dir = PathBuf::from( + std::env::var("MANTRA_CONTENT_DIR") + .unwrap_or_else(|_| "content".to_string()), + ); + info!("loading bilingual corpus from {}", content_dir.display()); + + // The loader expects a language-specific subdir; we call it twice + // against the two sibling directories. + let en = corpus_loader::load_corpus(&content_dir)?; + // ru lives under ../-ru relative path — or env-overridden. + let ru_dir = std::env::var("MANTRA_CONTENT_DIR_RU") + .map(PathBuf::from) + .unwrap_or_else(|_| { + // derive from content_dir by replacing trailing component + let mut p = content_dir.clone(); + let last = p + .file_name() + .map(|n| n.to_string_lossy().into_owned()) + .unwrap_or_else(|| String::from("content")); + p.pop(); + p.push(format!("{last}-ru")); + p + }); + // Hack for symlinked content: our Mac dev uses `content` symlink to + // design-dna/, so content-ru doesn't exist at peer — fall back to the + // sibling `cycle-1-philosophy-ru` under the DESIGN-DNA root instead. + let ru = if ru_dir.is_dir() { + corpus_loader::load_corpus(&ru_dir)? + } else { + // if MANTRA_CONTENT_DIR is design-dna root, then ru lives under + // /cycle-1-philosophy-ru — but that's a file layout + // difference, handled inside load_corpus_ru. + corpus_loader::load_corpus_alt_cycle_dir(&content_dir, "cycle-1-philosophy-ru")? + }; + + let bilingual: BilingualHandle = Arc::new(BilingualCorpus { + ru: Arc::new(ru), + en: Arc::new(en), + }); + info!( + "loaded: ru={} sources / en={} sources, themes={}", + bilingual.ru.sources.len(), + bilingual.en.sources.len(), + bilingual.ru.themes.len() + ); + + let conf = get_configuration(None) + .map_err(|e| anyhow::anyhow!("leptos config: {e}"))?; + let leptos_options = conf.leptos_options; + let addr: SocketAddr = leptos_options.site_addr; + let routes = generate_route_list(App); + + let bilingual_ctx = bilingual.clone(); + let bilingual_for_sfn = bilingual.clone(); + let app = Router::new() + .route( + "/api/{*fn_name}", + any(move |req| { + let ctx = bilingual_for_sfn.clone(); + handle_server_fns_with_context( + move || provide_context(ctx.clone()), + req, + ) + }), + ) + .leptos_routes_with_context( + &leptos_options, + routes, + move || provide_context(bilingual_ctx.clone()), + { + let opts = leptos_options.clone(); + move || shell(opts.clone()) + }, + ) + .fallback_service(ServeDir::new("target/site")) + .layer(TraceLayer::new_for_http()) + .with_state(leptos_options); + + info!("mantra listening on {addr}"); + let listener = tokio::net::TcpListener::bind(&addr).await?; + axum::serve(listener, app.into_make_service()).await?; + Ok(()) +} diff --git a/crates/mantra-ui/Cargo.toml b/crates/mantra-ui/Cargo.toml new file mode 100644 index 0000000..fa80baa --- /dev/null +++ b/crates/mantra-ui/Cargo.toml @@ -0,0 +1,51 @@ +[package] +name = "mantra-ui" +version = "0.1.0" +edition = "2021" + +[lib] +crate-type = ["cdylib", "rlib"] + +[dependencies] +leptos.workspace = true +leptos_router.workspace = true +leptos_meta.workspace = true +serde.workspace = true +chrono = { workspace = true } +console_error_panic_hook = { version = "0.1", optional = true } +wasm-bindgen = { version = "0.2.118", optional = true } +web-sys = { version = "0.3", optional = true, features = [ + "Window", + "Storage", + "Document", + "Element", + "HtmlElement", + "HtmlTextAreaElement", + "HtmlCollection", + "NodeList", + "DomTokenList", + "Event", + "EventTarget", + "console", +] } +# Server-only — pulled in under ssr feature for notes I/O + Claude HTTP. +tokio = { workspace = true, optional = true } +reqwest = { workspace = true, optional = true } +serde_json = { workspace = true, optional = true } + +[features] +default = [] +hydrate = [ + "leptos/hydrate", + "dep:console_error_panic_hook", + "dep:wasm-bindgen", + "dep:web-sys", +] +ssr = [ + "leptos/ssr", + "leptos_router/ssr", + "leptos_meta/ssr", + "dep:tokio", + "dep:reqwest", + "dep:serde_json", +] diff --git a/crates/mantra-ui/src/api/mod.rs b/crates/mantra-ui/src/api/mod.rs new file mode 100644 index 0000000..766228f --- /dev/null +++ b/crates/mantra-ui/src/api/mod.rs @@ -0,0 +1,460 @@ +//! Server functions for the margin layer: notes and Claude-ask. +//! +//! Notes live as markdown files in `$MANTRA_NOTES_DIR/.md`. +//! Each file is append-oriented: a note is a dated entry anchored to +//! a paragraph-id. Subsequent reads parse the file and return +//! structured entries. + +pub mod types; + +use leptos::prelude::*; + +pub use types::{LandingData, NoteEntry, NoteKind, SourcePageData, ThemePageData}; + +// --- fetch_source_page ------------------------------------------------- +// +// Snapshot for `/source/:slug`. Moves corpus access into a server fn +// so SSR and hydrate render from the same Resource payload and the +// client doesn't need the full `Arc` in context. + +#[server(endpoint = "source_page")] +pub async fn fetch_source_page( + slug: String, + lang: String, +) -> Result, ServerFnError> { + #[cfg(feature = "ssr")] + { + use crate::corpus::{BilingualHandle, Lang}; + let bilingual = use_context::() + .ok_or_else(|| ServerFnError::new("no corpus in context"))?; + let lang = Lang::from_query(Some(&lang)); + let corpus = bilingual.for_lang(lang); + let Some(src) = corpus.get(&slug).cloned() else { + return Ok(None); + }; + let (prev, next) = corpus.neighbors(&slug); + Ok(Some(SourcePageData { + source: src, + prev: prev.map(|s| s.to_string()), + next: next.map(|s| s.to_string()), + })) + } + #[cfg(not(feature = "ssr"))] + { + let _ = (slug, lang); + unreachable!() + } +} + +// --- fetch_landing ----------------------------------------------------- + +#[server(endpoint = "landing")] +pub async fn fetch_landing(lang: String) -> Result { + #[cfg(feature = "ssr")] + { + use crate::corpus::{BilingualHandle, Lang}; + let bilingual = use_context::() + .ok_or_else(|| ServerFnError::new("no corpus in context"))?; + let lang = Lang::from_query(Some(&lang)); + let corpus = bilingual.for_lang(lang); + let sources = corpus + .order + .iter() + .filter_map(|slug| corpus.get(slug).cloned()) + .collect(); + Ok(LandingData { + order: corpus.order.clone(), + sources, + themes: corpus.themes.clone(), + }) + } + #[cfg(not(feature = "ssr"))] + { + let _ = lang; + unreachable!() + } +} + +// --- fetch_theme_page -------------------------------------------------- + +#[server(endpoint = "theme_page")] +pub async fn fetch_theme_page( + slug: String, + lang: String, +) -> Result, ServerFnError> { + #[cfg(feature = "ssr")] + { + use crate::corpus::{BilingualHandle, Lang}; + let bilingual = use_context::() + .ok_or_else(|| ServerFnError::new("no corpus in context"))?; + let lang = Lang::from_query(Some(&lang)); + let corpus = bilingual.for_lang(lang); + let Some(theme) = corpus.themes.iter().find(|t| t.slug == slug).cloned() else { + return Ok(None); + }; + let contributing = theme + .contributing + .iter() + .filter_map(|s| corpus.get(s).cloned()) + .collect(); + Ok(Some(ThemePageData { theme, contributing })) + } + #[cfg(not(feature = "ssr"))] + { + let _ = (slug, lang); + unreachable!() + } +} + +// --- fetch_notes ------------------------------------------------------- + +#[server(endpoint = "notes_fetch")] +pub async fn fetch_notes(source_slug: String) -> Result, ServerFnError> { + #[cfg(feature = "ssr")] + { + let dir = std::env::var("MANTRA_NOTES_DIR").map_err(|_| { + ServerFnError::new("MANTRA_NOTES_DIR not set on server") + })?; + let path = std::path::PathBuf::from(&dir).join(format!("{source_slug}.md")); + if !path.exists() { + return Ok(Vec::new()); + } + let raw = tokio::fs::read_to_string(&path) + .await + .map_err(|e| ServerFnError::new(format!("read notes: {e}")))?; + Ok(parse_marginalia(&raw)) + } + #[cfg(not(feature = "ssr"))] + { + unreachable!() + } +} + +// --- save_note --------------------------------------------------------- + +#[server(endpoint = "notes_save")] +pub async fn save_note( + source_slug: String, + para_id: String, + para_excerpt: String, + note_text: String, + author: String, +) -> Result<(), ServerFnError> { + #[cfg(feature = "ssr")] + { + if note_text.trim().is_empty() { + return Err(ServerFnError::new("note text is empty")); + } + append_marginalia_entry( + &source_slug, + ¶_id, + ¶_excerpt, + MarginaliaPayload::Note(note_text), + &author, + ) + .await?; + spawn_git_autocommit(&source_slug, ¶_id).await; + Ok(()) + } + #[cfg(not(feature = "ssr"))] + { + unreachable!() + } +} + +// --- ask_claude -------------------------------------------------------- + +#[server(endpoint = "claude_ask")] +pub async fn ask_claude( + source_slug: String, + para_id: String, + para_excerpt: String, + question: String, + author: String, +) -> Result { + #[cfg(feature = "ssr")] + { + let q = question.trim(); + if q.is_empty() { + return Err(ServerFnError::new("question is empty")); + } + let api_key = std::env::var("ANTHROPIC_API_KEY").map_err(|_| { + ServerFnError::new("ANTHROPIC_API_KEY not set on server") + })?; + + let system = format!( + "You are a reading companion for a philosophical substance called \ + design-dna. A reader is studying the distillation of {source_slug} \ + and has highlighted a passage. Answer their question grounded in the \ + passage and its tradition. Be concise (≤300 words), direct, \ + substance over summary. Same register as the distillation itself: \ + living note, not academic report. Answer in the same language the \ + user asked in. If you don't know, say so." + ); + let user_msg = format!( + "Context passage:\n\n{para_excerpt}\n\n---\n\nQuestion: {q}" + ); + + let answer = call_anthropic(&api_key, &system, &user_msg) + .await + .map_err(|e| ServerFnError::new(format!("claude: {e}")))?; + + // Persist Q+A to marginalia too — reading is a dialogue, and the + // dialogue is the record. + append_marginalia_entry( + &source_slug, + ¶_id, + ¶_excerpt, + MarginaliaPayload::Ask { + question: q.to_string(), + answer: answer.clone(), + }, + &author, + ) + .await?; + spawn_git_autocommit(&source_slug, ¶_id).await; + Ok(answer) + } + #[cfg(not(feature = "ssr"))] + { + unreachable!() + } +} + +// ===================================================================== +// server-only implementations +// ===================================================================== + +#[cfg(feature = "ssr")] +enum MarginaliaPayload { + Note(String), + Ask { question: String, answer: String }, +} + +#[cfg(feature = "ssr")] +async fn append_marginalia_entry( + source_slug: &str, + para_id: &str, + para_excerpt: &str, + payload: MarginaliaPayload, + author: &str, +) -> Result<(), ServerFnError> { + let dir = std::env::var("MANTRA_NOTES_DIR").map_err(|_| { + ServerFnError::new("MANTRA_NOTES_DIR not set on server") + })?; + let dir = std::path::PathBuf::from(&dir); + tokio::fs::create_dir_all(&dir) + .await + .map_err(|e| ServerFnError::new(format!("mkdir: {e}")))?; + let path = dir.join(format!("{source_slug}.md")); + + let existed = path.exists(); + let header_needed = !existed; + let ts = chrono::Utc::now().format("%Y-%m-%d %H:%M UTC").to_string(); + + let mut out = String::new(); + if header_needed { + out.push_str(&format!( + "---\ntype: marginalia\nsource: {source_slug}\nproject: design-dna\n---\n\n# Marginalia · {source_slug}\n\n" + )); + } + + // We always append a fresh block. Simple, no merge logic v0.1. + out.push_str(&format!("## {{#{para_id}}}\n\n")); + let excerpt = para_excerpt.trim(); + if !excerpt.is_empty() { + // Store the first 180 chars of excerpt as a blockquote anchor. + let cut: String = excerpt.chars().take(180).collect(); + out.push_str("> "); + out.push_str(&cut.replace('\n', " ")); + if excerpt.chars().count() > 180 { + out.push_str(" …"); + } + out.push_str("\n\n"); + } + + match payload { + MarginaliaPayload::Note(text) => { + out.push_str(&format!("### {author} · {ts}\n\n{text}\n\n")); + } + MarginaliaPayload::Ask { question, answer } => { + out.push_str(&format!( + "### {author} · {ts} (asked)\n\n**Q:** {question}\n\n**A (Claude):** {answer}\n\n" + )); + } + } + + use tokio::io::AsyncWriteExt; + let mut f = tokio::fs::OpenOptions::new() + .create(true) + .append(true) + .open(&path) + .await + .map_err(|e| ServerFnError::new(format!("open notes: {e}")))?; + f.write_all(out.as_bytes()) + .await + .map_err(|e| ServerFnError::new(format!("write notes: {e}")))?; + Ok(()) +} + +#[cfg(feature = "ssr")] +fn parse_marginalia(raw: &str) -> Vec { + // Structure we parse: + // ## {#} + // > excerpt + // + // ### Alexey · 2026-04-23 12:34 + // Note body. + // + // ### Alexey · 2026-04-23 13:00 (asked) + // **Q:** ... + // + // **A (Claude):** ... + + let mut entries: Vec = Vec::new(); + let mut current_para: Option = None; + let mut current_excerpt: String = String::new(); + let mut current_author_ts: Option = None; + let mut current_kind: NoteKind = NoteKind::Note; + let mut current_body: String = String::new(); + + fn flush( + entries: &mut Vec, + current_para: &Option, + current_excerpt: &str, + current_author_ts: &Option, + current_kind: NoteKind, + current_body: &str, + ) { + if let (Some(para), Some(ats)) = (current_para.clone(), current_author_ts.clone()) { + let body = current_body.trim(); + if !body.is_empty() { + entries.push(NoteEntry { + para_id: para, + excerpt: current_excerpt.trim().to_string(), + author_ts: ats, + kind: current_kind, + body: body.to_string(), + }); + } + } + } + + for line in raw.lines() { + if let Some(rest) = line.strip_prefix("## {#") { + // Flush previous entry. + flush( + &mut entries, + ¤t_para, + ¤t_excerpt, + ¤t_author_ts, + current_kind, + ¤t_body, + ); + current_body.clear(); + current_author_ts = None; + current_kind = NoteKind::Note; + current_excerpt.clear(); + let id = rest.trim_end_matches('}').trim(); + current_para = Some(id.to_string()); + } else if line.starts_with("> ") { + if !current_excerpt.is_empty() { + current_excerpt.push(' '); + } + current_excerpt.push_str(line.trim_start_matches("> ").trim()); + } else if let Some(rest) = line.strip_prefix("### ") { + flush( + &mut entries, + ¤t_para, + ¤t_excerpt, + ¤t_author_ts, + current_kind, + ¤t_body, + ); + current_body.clear(); + let asked = rest.ends_with("(asked)"); + current_kind = if asked { NoteKind::Ask } else { NoteKind::Note }; + let head = rest.trim_end_matches("(asked)").trim(); + current_author_ts = Some(head.to_string()); + } else { + current_body.push_str(line); + current_body.push('\n'); + } + } + flush( + &mut entries, + ¤t_para, + ¤t_excerpt, + ¤t_author_ts, + current_kind, + ¤t_body, + ); + + entries +} + +#[cfg(feature = "ssr")] +async fn call_anthropic( + api_key: &str, + system: &str, + user: &str, +) -> Result { + let body = serde_json::json!({ + "model": "claude-sonnet-4-6", + "max_tokens": 1024, + "system": system, + "messages": [{ "role": "user", "content": user }], + }); + let resp = reqwest::Client::new() + .post("https://api.anthropic.com/v1/messages") + .header("x-api-key", api_key) + .header("anthropic-version", "2023-06-01") + .header("content-type", "application/json") + .json(&body) + .send() + .await + .map_err(|e| format!("request: {e}"))?; + if !resp.status().is_success() { + let st = resp.status(); + let body = resp.text().await.unwrap_or_default(); + return Err(format!("anthropic {st}: {body}")); + } + let v: serde_json::Value = resp.json().await.map_err(|e| format!("decode: {e}"))?; + let text = v["content"][0]["text"] + .as_str() + .ok_or_else(|| "anthropic response missing content[0].text".to_string())?; + Ok(text.to_string()) +} + +#[cfg(feature = "ssr")] +async fn spawn_git_autocommit(source_slug: &str, para_id: &str) { + // Fire-and-forget: we don't want to block the user on git push. + // Only runs if MANTRA_NOTES_GIT_AUTO_PUSH is set (opt-in). + if std::env::var("MANTRA_NOTES_GIT_AUTO_PUSH").is_err() { + return; + } + let dir = match std::env::var("MANTRA_NOTES_DIR") { + Ok(d) => d, + Err(_) => return, + }; + let slug = source_slug.to_string(); + let pid = para_id.to_string(); + tokio::spawn(async move { + let _ = tokio::process::Command::new("sh") + .arg("-c") + .arg(format!( + "cd {dir} && git add -A && git commit -m 'note: {slug} {pid}' && git push 2>&1", + dir = shell_escape(&dir), + slug = shell_escape(&slug), + pid = shell_escape(&pid), + )) + .output() + .await; + }); +} + +#[cfg(feature = "ssr")] +fn shell_escape(s: &str) -> String { + // Good enough for slugs (alphanumeric + dash) and ordinary paths. + s.replace('\'', "'\\''") +} diff --git a/crates/mantra-ui/src/api/types.rs b/crates/mantra-ui/src/api/types.rs new file mode 100644 index 0000000..a4344e5 --- /dev/null +++ b/crates/mantra-ui/src/api/types.rs @@ -0,0 +1,46 @@ +//! Wire types for the margin-layer server fns. + +use serde::{Deserialize, Serialize}; + +use crate::corpus::{Source, Theme}; + +#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)] +pub enum NoteKind { + Note, + Ask, +} + +/// One note OR Q+A entry attached to a specific paragraph. +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +pub struct NoteEntry { + pub para_id: String, + pub excerpt: String, + pub author_ts: String, + pub kind: NoteKind, + pub body: String, +} + +/// Snapshot of a single source + its neighbors for the source page. +/// Carries everything the page needs so SSR and hydrate render +/// identically from the same payload. +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +pub struct SourcePageData { + pub source: Source, + pub prev: Option, + pub next: Option, +} + +/// Snapshot for the landing page — works in reading order + themes. +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +pub struct LandingData { + pub order: Vec, + pub sources: Vec, + pub themes: Vec, +} + +/// Snapshot for the theme page — one theme + contributing sources. +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +pub struct ThemePageData { + pub theme: Theme, + pub contributing: Vec, +} diff --git a/crates/mantra-ui/src/app.rs b/crates/mantra-ui/src/app.rs new file mode 100644 index 0000000..7a6e324 --- /dev/null +++ b/crates/mantra-ui/src/app.rs @@ -0,0 +1,47 @@ +//! Root Leptos component and HTML shell. + +use leptos::config::LeptosOptions; +use leptos::prelude::*; +use leptos_meta::{provide_meta_context, MetaTags, Title}; +use leptos_router::components::*; +use leptos_router::*; + +use crate::pages; + +/// HTML skeleton wrapping the root app. Called by +/// `leptos_axum::LeptosRoutes` to generate the full page SSR. +pub fn shell(options: LeptosOptions) -> impl IntoView { + view! { + + + + + + + + + + + + + + + } +} + +/// Application root — provides meta context, declares routes. +#[component] +pub fn App() -> impl IntoView { + provide_meta_context(); + + view! { + + <Router> + <Routes fallback=|| view! { <p class="err">"404"</p> }> + <Route path=path!("/") view=pages::landing::Landing /> + <Route path=path!("/source/:slug") view=pages::source::SourcePage /> + <Route path=path!("/theme/:slug") view=pages::theme::ThemePage /> + </Routes> + </Router> + } +} diff --git a/crates/mantra-ui/src/corpus.rs b/crates/mantra-ui/src/corpus.rs new file mode 100644 index 0000000..c8f1d4d --- /dev/null +++ b/crates/mantra-ui/src/corpus.rs @@ -0,0 +1,125 @@ +//! Corpus data types — shared between SSR render pass and UI components. +//! +//! The server crate owns `load_corpus` and populates the structures +//! from disk; the UI crate only reads them. Everything here is +//! `Serialize + Deserialize + Clone` so it survives Leptos Resources +//! and possible future hydration round-trips. + +use serde::{Deserialize, Serialize}; +use std::collections::HashMap; +use std::sync::Arc; + +/// The entire loaded corpus. Shared via Leptos context as `Arc<Corpus>`. +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct Corpus { + /// Ordered list of source slugs (reading order — chronological or + /// thematic; driven by `_index.md`'s table of works). + pub order: Vec<String>, + /// Slug → Source lookup. + pub sources: HashMap<String, Source>, + /// Running themes extracted from `_index.md`. + pub themes: Vec<Theme>, +} + +impl Corpus { + pub fn get(&self, slug: &str) -> Option<&Source> { + self.sources.get(slug) + } + + /// Index-in-reading-order of `slug`, if present. + pub fn index_of(&self, slug: &str) -> Option<usize> { + self.order.iter().position(|s| s == slug) + } + + /// Neighbor (prev, next) by reading order — wrap-around. + pub fn neighbors(&self, slug: &str) -> (Option<&str>, Option<&str>) { + let Some(i) = self.index_of(slug) else { return (None, None) }; + let n = self.order.len(); + let prev = if n > 1 { + Some(self.order[(i + n - 1) % n].as_str()) + } else { + None + }; + let next = if n > 1 { + Some(self.order[(i + 1) % n].as_str()) + } else { + None + }; + (prev, next) + } +} + +/// One distillation. Body is pre-rendered HTML (pulldown-cmark output). +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +pub struct Source { + pub slug: String, + /// Display title — "Symposium (Plato)" etc. + pub title: String, + /// Short author label — "Plato", "Ibn ʿArabī" etc. + pub author: String, + /// The core-claim one-liner (extracted from `## Core claim` section). + pub core_claim: String, + /// Tags from YAML frontmatter. + pub tags: Vec<String>, + /// Confidence level (high / medium / low) from frontmatter. + pub confidence: String, + /// The full markdown body rendered to HTML. + pub body_html: String, +} + +/// A running theme — pattern that proustep across multiple sources. +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +pub struct Theme { + pub slug: String, + pub title: String, + /// Short pitch (one paragraph). + pub description_html: String, + /// Sources that contribute to this theme (by slug). + pub contributing: Vec<String>, +} + +/// Convenience alias — we always thread the corpus through context as +/// an `Arc` so multiple concurrent requests share one in-memory copy. +pub type CorpusHandle = Arc<Corpus>; + +/// Reading language. +#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] +pub enum Lang { + Ru, + En, +} + +impl Lang { + pub fn as_str(&self) -> &'static str { + match self { Lang::Ru => "ru", Lang::En => "en" } + } + pub fn from_query(s: Option<&str>) -> Self { + match s { + Some("en") => Lang::En, + _ => Lang::Ru, + } + } + pub fn other(&self) -> Lang { + match self { Lang::Ru => Lang::En, Lang::En => Lang::Ru } + } +} + +/// Bilingual container — same slugs in both languages. Each language +/// is held as an `Arc<Corpus>` so `for_lang` is cheap and callers can +/// keep their own handle without deep-cloning a 60kw corpus. +#[derive(Debug, Clone)] +pub struct BilingualCorpus { + pub ru: Arc<Corpus>, + pub en: Arc<Corpus>, +} + +impl BilingualCorpus { + pub fn for_lang(&self, lang: Lang) -> Arc<Corpus> { + match lang { + Lang::Ru => self.ru.clone(), + Lang::En => self.en.clone(), + } + } +} + +pub type BilingualHandle = Arc<BilingualCorpus>; diff --git a/crates/mantra-ui/src/lib.rs b/crates/mantra-ui/src/lib.rs new file mode 100644 index 0000000..43679f1 --- /dev/null +++ b/crates/mantra-ui/src/lib.rs @@ -0,0 +1,22 @@ +//! mantra — Leptos UI. +//! +//! Reader for dense markdown distillate corpora. First consumer: the +//! design-dna philosophy corpus (20 sources, ~61k words). The server +//! crate loads the corpus into `Arc<Corpus>` at startup and provides +//! it via context; UI components read from that context. + +#![recursion_limit = "256"] + +pub mod api; +pub mod app; +pub mod corpus; +pub mod pages; + +/// WASM entry point. Called by the cargo-leptos-injected bootstrap +/// script once the bundle has downloaded in the browser. +#[cfg(feature = "hydrate")] +#[wasm_bindgen::prelude::wasm_bindgen] +pub fn hydrate() { + console_error_panic_hook::set_once(); + leptos::mount::hydrate_body(app::App); +} diff --git a/crates/mantra-ui/src/pages/landing.rs b/crates/mantra-ui/src/pages/landing.rs new file mode 100644 index 0000000..c85679c --- /dev/null +++ b/crates/mantra-ui/src/pages/landing.rs @@ -0,0 +1,146 @@ +//! `/` — two-door entry into the corpus: works (20) and themes. + +use leptos::prelude::*; +use leptos_router::hooks::use_query_map; + +use crate::api::{fetch_landing, LandingData}; +use crate::corpus::{Lang, Source, Theme}; +use crate::pages::shared::LangToggle; + +#[component] +pub fn Landing() -> impl IntoView { + let query = use_query_map(); + let lang = Memo::new(move |_| { + Lang::from_query(query.read().get("lang").as_deref()) + }); + + let data = Resource::new( + move || lang.get().as_str().to_string(), + |l| fetch_landing(l), + ); + + let hero_title = move || match lang.get() { + Lang::Ru => "дизайн днк", + Lang::En => "design dna", + }; + let hero_subtitle = move || match lang.get() { + Lang::Ru => "цикл 1 · философия · 20 источников", + Lang::En => "cycle 1 · philosophy · 20 sources", + }; + let hero_question = move || match lang.get() { + Lang::Ru => "почему форма трогает человеческое сердце?", + Lang::En => "why does form move the human heart?", + }; + let works_label = move || match lang.get() { + Lang::Ru => "работы", + Lang::En => "works", + }; + let themes_label = move || match lang.get() { + Lang::Ru => "темы", + Lang::En => "themes", + }; + let sources_suffix = move |n: usize| match lang.get() { + Lang::Ru => format!(" · {n} источников"), + Lang::En => format!(" · {n} sources"), + }; + + view! { + <main class="landing"> + <LangToggle current=lang/> + <header class="landing-head"> + <h1 class="landing-title">{hero_title}</h1> + <p class="landing-subtitle">{hero_subtitle}</p> + <p class="landing-question">{hero_question}</p> + </header> + + <Suspense fallback=move || view! { <p class="landing-loading">"…"</p> }> + {move || { + data.get().map(|res| { + let lang_val = lang.get(); + let suffix_for_themes = sources_suffix.clone(); + match res { + Ok(LandingData { order, sources, themes }) => { + // Build slug -> Source map for cheap lookup in the For body + let mut by_slug: std::collections::HashMap<String, Source> = + std::collections::HashMap::with_capacity(sources.len()); + for s in sources { by_slug.insert(s.slug.clone(), s); } + view! { + <section class="landing-grid"> + <div class="landing-col"> + <h2 class="landing-col-label">{works_label}</h2> + <ul class="works-list"> + <For + each=move || order.clone() + key=|slug| slug.clone() + let:slug + > + <WorkLine + source=by_slug.get(&slug).cloned() + lang=lang_val + slug=slug + /> + </For> + </ul> + </div> + <div class="landing-col"> + <h2 class="landing-col-label">{themes_label}</h2> + <ul class="themes-list"> + <For + each=move || themes.clone() + key=|t| t.slug.clone() + let:theme + > + <ThemeLine + theme=theme + lang=lang_val + suffix=suffix_for_themes.clone() + /> + </For> + </ul> + </div> + </section> + }.into_any() + } + Err(e) => view! { <p class="err">{format!("{e}")}</p> }.into_any(), + } + }) + }} + </Suspense> + </main> + } +} + +#[component] +fn WorkLine(source: Option<Source>, slug: String, lang: Lang) -> impl IntoView { + let href = format!("/source/{slug}?lang={}", lang.as_str()); + match source { + None => view! { <li></li> }.into_any(), + Some(s) => view! { + <li class="work-line"> + <a href=href> + <span class="work-author">{s.author}</span> + <span class="work-sep">" · "</span> + <span class="work-title">{s.title}</span> + <div class="work-claim">{s.core_claim}</div> + </a> + </li> + }.into_any(), + } +} + +#[component] +fn ThemeLine<F>(theme: Theme, lang: Lang, suffix: F) -> impl IntoView +where + F: Fn(usize) -> String + 'static + Send + Sync + Clone, +{ + let href = format!("/theme/{}?lang={}", theme.slug, lang.as_str()); + let count = theme.contributing.len(); + view! { + <li class="theme-line"> + <a href=href> + <span class="theme-title">{theme.title}</span> + <span class="theme-count">{suffix(count)}</span> + </a> + </li> + } +} diff --git a/crates/mantra-ui/src/pages/margin.rs b/crates/mantra-ui/src/pages/margin.rs new file mode 100644 index 0000000..9f889d2 --- /dev/null +++ b/crates/mantra-ui/src/pages/margin.rs @@ -0,0 +1,355 @@ +//! Margin layer — the drawer that opens when a paragraph is clicked. +//! +//! Holds: a Notes tab (write a thought, permanent record in vault) and +//! an Ask tab (ask Claude about the passage; Q+A is also saved to the +//! vault — the dialogue IS the record). +//! +//! Author identity for v0.1: an inline input pinned at the bottom of +//! the drawer, prefilled from `localStorage` under `mantra.author`. +//! No modal prompts. + +use leptos::html; +use leptos::prelude::*; +use leptos::task::spawn_local; + +use crate::api::{ask_claude, fetch_notes, save_note, NoteEntry, NoteKind}; +use crate::corpus::Lang; + +/// A paragraph the user opened the drawer on. +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct ActivePara { + pub id: String, + pub excerpt: String, +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +enum Tab { + Note, + Ask, +} + +#[component] +pub fn MarginDrawer( + slug: Signal<String>, + lang: Signal<Lang>, + active: ReadSignal<Option<ActivePara>>, + set_active: WriteSignal<Option<ActivePara>>, + /// Bumped whenever the set of notes for this slug changes, so the + /// source page can re-annotate paragraph dots. + notes_tick: RwSignal<u32>, +) -> impl IntoView { + let (notes, set_notes) = signal::<Vec<NoteEntry>>(Vec::new()); + let (tab, set_tab) = signal(Tab::Note); + let (draft, set_draft) = signal(String::new()); + let (pending, set_pending) = signal(false); + let (error, set_error) = signal::<Option<String>>(None); + let (author, set_author) = signal(initial_author()); + + let textarea_ref: NodeRef<html::Textarea> = NodeRef::new(); + + // Refetch all notes for the current slug. Happens on: mount, + // slug change, after save, after ask. + let reload = move |slug_s: String| { + spawn_local(async move { + match fetch_notes(slug_s).await { + Ok(v) => { + set_notes.set(v); + notes_tick.update(|n| *n = n.wrapping_add(1)); + } + Err(e) => { + log(&format!("fetch_notes error: {e}")); + } + } + }); + }; + + // Track slug changes — reload notes. + Effect::new(move |_| { + let s = slug.get(); + if !s.is_empty() { + reload(s); + } + }); + + // Clear draft/error/tab when switching paragraphs. + Effect::new(move |_| { + let _ = active.get(); + set_draft.set(String::new()); + set_error.set(None); + set_tab.set(Tab::Note); + clear_textarea(&textarea_ref); + }); + + let filtered = Memo::new(move |_| { + let Some(a) = active.get() else { return Vec::new() }; + notes.with(|all| { + all.iter().filter(|e| e.para_id == a.id).cloned().collect::<Vec<_>>() + }) + }); + + let close = move |_| set_active.set(None); + + let submit = move || { + log("submit clicked"); + let Some(a) = active.get_untracked() else { + log("submit: no active paragraph"); + return; + }; + let text = draft.get_untracked().trim().to_string(); + if text.is_empty() { + log("submit: empty draft"); + return; + } + let author_name = { + let a = author.get_untracked(); + if a.trim().is_empty() { "anon".to_string() } else { a } + }; + let slug_s = slug.get_untracked(); + let para_id = a.id.clone(); + let excerpt = a.excerpt.clone(); + let current_tab = tab.get_untracked(); + log(&format!( + "submit: tab={:?} slug={} para_id={} text_len={} author={}", + current_tab, slug_s, para_id, text.len(), author_name, + )); + set_pending.set(true); + set_error.set(None); + spawn_local(async move { + let res = match current_tab { + Tab::Note => save_note( + slug_s.clone(), + para_id, + excerpt, + text, + author_name, + ).await.map(|_| ()), + Tab::Ask => ask_claude( + slug_s.clone(), + para_id, + excerpt, + text, + author_name, + ).await.map(|_| ()), + }; + set_pending.set(false); + match res { + Ok(()) => { + log("submit: ok"); + set_draft.set(String::new()); + clear_textarea(&textarea_ref); + reload(slug_s); + } + Err(e) => { + log(&format!("submit: error {e}")); + set_error.set(Some(format!("{e}"))); + } + } + }); + }; + + let label_close = move || match lang.get() { Lang::Ru => "закрыть", Lang::En => "close" }; + let label_note = move || match lang.get() { Lang::Ru => "заметка", Lang::En => "note" }; + let label_ask = move || match lang.get() { Lang::Ru => "спросить", Lang::En => "ask" }; + let placeholder_note = move || match lang.get() { + Lang::Ru => "запишите мысль…", + Lang::En => "write a thought…", + }; + let placeholder_ask = move || match lang.get() { + Lang::Ru => "спросите Клода о пассаже…", + Lang::En => "ask Claude about the passage…", + }; + let label_save = move || match lang.get() { Lang::Ru => "сохранить", Lang::En => "save" }; + let label_ask_go = move || match lang.get() { Lang::Ru => "спросить", Lang::En => "ask" }; + let label_pending_note = move || match lang.get() { + Lang::Ru => "сохраняю…", + Lang::En => "saving…", + }; + let label_pending_ask = move || match lang.get() { + Lang::Ru => "думаю…", + Lang::En => "thinking…", + }; + let label_you = move || match lang.get() { Lang::Ru => "вы:", Lang::En => "you:" }; + + view! { + <Show + when=move || active.get().is_some() + fallback=|| ().into_any() + > + <aside class="margin-drawer"> + <header class="margin-drawer-head"> + <div class="margin-drawer-tabs"> + <button + class="tab" + class:tab-active=move || tab.get() == Tab::Note + on:click=move |_| set_tab.set(Tab::Note) + >{label_note}</button> + <button + class="tab" + class:tab-active=move || tab.get() == Tab::Ask + on:click=move |_| set_tab.set(Tab::Ask) + >{label_ask}</button> + </div> + <button class="margin-drawer-close" on:click=close aria-label=label_close>"×"</button> + </header> + + <div class="margin-drawer-excerpt"> + {move || active.get().map(|a| a.excerpt)} + </div> + + <div class="margin-drawer-form"> + <textarea + class="margin-drawer-input" + node_ref=textarea_ref + placeholder=move || match tab.get() { + Tab::Note => placeholder_note(), + Tab::Ask => placeholder_ask(), + } + on:input=move |ev| set_draft.set(event_target_value(&ev)) + rows="4" + /> + {move || error.get().map(|e| view! { + <p class="margin-drawer-error">{e}</p> + })} + <div class="margin-drawer-actions"> + <label class="margin-drawer-author"> + <span class="margin-drawer-author-label">{label_you}</span> + <input + type="text" + class="margin-drawer-author-input" + prop:value=move || author.get() + on:input=move |ev| { + let v = event_target_value(&ev); + persist_author(&v); + set_author.set(v); + } + placeholder="anon" + /> + </label> + <button + type="button" + class="margin-drawer-submit" + disabled=move || pending.get() || draft.get().trim().is_empty() + on:click=move |_| submit() + > + {move || { + if pending.get() { + match tab.get() { + Tab::Note => label_pending_note(), + Tab::Ask => label_pending_ask(), + } + } else { + match tab.get() { + Tab::Note => label_save(), + Tab::Ask => label_ask_go(), + } + } + }} + </button> + </div> + </div> + + <div class="margin-drawer-entries"> + {move || { + let list = filtered.get(); + list.into_iter().map(|e| view! { + <NoteCard entry=e/> + }).collect_view() + }} + </div> + </aside> + </Show> + } +} + +#[component] +fn NoteCard(entry: NoteEntry) -> impl IntoView { + let is_ask = entry.kind == NoteKind::Ask; + let cls = if is_ask { "note-card note-card-ask" } else { "note-card" }; + + // For Ask entries the body is `**Q:** ...\n\n**A (Claude):** ...`; + // split so we can style them distinctly. + let (q, a) = if is_ask { + split_ask_body(&entry.body) + } else { + (None, Some(entry.body.clone())) + }; + + view! { + <article class=cls> + <header class="note-card-meta">{entry.author_ts}</header> + {q.map(|s| view! { <p class="note-q">{s}</p> })} + {a.map(|s| view! { <p class="note-a">{s}</p> })} + </article> + } +} + +fn split_ask_body(body: &str) -> (Option<String>, Option<String>) { + let mut q = None; + let mut a = None; + if let Some(q_rest) = body.strip_prefix("**Q:**") { + if let Some((q_part, a_part)) = q_rest.split_once("**A (Claude):**") { + q = Some(q_part.trim().to_string()); + a = Some(a_part.trim().to_string()); + } else { + q = Some(q_rest.trim().to_string()); + } + } else { + a = Some(body.trim().to_string()); + } + (q, a) +} + +// --- Author (inline, no modal prompt) --------------------------------- + +fn initial_author() -> String { + #[cfg(target_arch = "wasm32")] + { + if let Some(win) = web_sys::window() { + if let Ok(Some(storage)) = win.local_storage() { + if let Ok(Some(name)) = storage.get_item("mantra.author") { + if !name.trim().is_empty() { + return name; + } + } + } + } + } + String::new() +} + +fn persist_author(name: &str) { + #[cfg(target_arch = "wasm32")] + { + if let Some(win) = web_sys::window() { + if let Ok(Some(storage)) = win.local_storage() { + let _ = storage.set_item("mantra.author", name); + } + } + } + #[cfg(not(target_arch = "wasm32"))] + { let _ = name; } +} + +// --- Textarea helpers ------------------------------------------------- + +fn clear_textarea(node: &NodeRef<html::Textarea>) { + #[cfg(target_arch = "wasm32")] + { + if let Some(el) = node.get_untracked() { + el.set_value(""); + } + } + #[cfg(not(target_arch = "wasm32"))] + { let _ = node; } +} + +// --- Debug log -------------------------------------------------------- + +fn log(msg: &str) { + #[cfg(target_arch = "wasm32")] + { + web_sys::console::log_1(&format!("[mantra] {msg}").into()); + } + #[cfg(not(target_arch = "wasm32"))] + { let _ = msg; } +} diff --git a/crates/mantra-ui/src/pages/mod.rs b/crates/mantra-ui/src/pages/mod.rs new file mode 100644 index 0000000..026aad8 --- /dev/null +++ b/crates/mantra-ui/src/pages/mod.rs @@ -0,0 +1,5 @@ +pub mod landing; +pub mod margin; +pub mod shared; +pub mod source; +pub mod theme; diff --git a/crates/mantra-ui/src/pages/shared.rs b/crates/mantra-ui/src/pages/shared.rs new file mode 100644 index 0000000..c70c85f --- /dev/null +++ b/crates/mantra-ui/src/pages/shared.rs @@ -0,0 +1,37 @@ +//! Shared UI atoms. + +use leptos::prelude::*; +use leptos_router::hooks::{use_location, use_query_map}; + +use crate::corpus::Lang; + +/// Minimal top-right language toggle. Two links; current is dimmed, +/// the other is hot. Preserves the rest of the URL (path + remaining +/// query params) so toggling on a deep page keeps you there. +#[component] +pub fn LangToggle(current: Memo<Lang>) -> impl IntoView { + let location = use_location(); + let query = use_query_map(); + + let make_href = move |target: Lang| { + let path = location.pathname.get(); + let mut params = query.get(); + params.replace("lang", target.as_str().to_string()); + let qs = params.to_query_string(); + if qs.is_empty() { path } else { format!("{path}{qs}") } + }; + + view! { + <nav class="lang-toggle"> + <a + href=move || make_href(Lang::Ru) + class:lang-active=move || current.get() == Lang::Ru + >"ru"</a> + <span class="lang-dot">"·"</span> + <a + href=move || make_href(Lang::En) + class:lang-active=move || current.get() == Lang::En + >"en"</a> + </nav> + } +} diff --git a/crates/mantra-ui/src/pages/source.rs b/crates/mantra-ui/src/pages/source.rs new file mode 100644 index 0000000..3b04a82 --- /dev/null +++ b/crates/mantra-ui/src/pages/source.rs @@ -0,0 +1,194 @@ +//! `/source/:slug` — one distillation, book-page typography. +//! +//! Reads its data via the `source_page` server fn wrapped in a +//! `Resource` so SSR and hydrate render from the same payload. +//! This avoids needing the corpus `Arc<Corpus>` context on the +//! client (where it isn't available). + +use leptos::prelude::*; +use leptos_router::hooks::{use_params, use_query_map}; +use leptos_router::params::Params; + +use crate::api::{fetch_source_page, SourcePageData}; +use crate::corpus::Lang; +use crate::pages::margin::{ActivePara, MarginDrawer}; +use crate::pages::shared::LangToggle; + +#[derive(Params, PartialEq, Clone, Debug)] +struct SlugParam { + slug: Option<String>, +} + +#[component] +pub fn SourcePage() -> impl IntoView { + let params = use_params::<SlugParam>(); + let slug = Memo::new(move |_| { + params.get().ok().and_then(|p| p.slug).unwrap_or_default() + }); + + let query = use_query_map(); + let lang = Memo::new(move |_| { + Lang::from_query(query.read().get("lang").as_deref()) + }); + + let (active, set_active) = signal::<Option<ActivePara>>(None); + let notes_tick = RwSignal::new(0u32); + + let slug_sig: Signal<String> = Signal::derive(move || slug.get()); + let lang_sig: Signal<Lang> = Signal::derive(move || lang.get()); + + // Resource key = (slug, lang). Re-fetches when either changes. + let data = Resource::new( + move || (slug.get(), lang.get().as_str().to_string()), + |(s, l)| fetch_source_page(s, l), + ); + + // After hydration + notes load: annotate paragraphs that have + // marginalia so a dot appears in the left gutter. + #[cfg(feature = "hydrate")] + { + let slug_for_fx = slug_sig; + Effect::new(move |_| { + let _ = notes_tick.get(); + let current_slug = slug_for_fx.get(); + if current_slug.is_empty() { return; } + leptos::task::spawn_local(async move { + if let Ok(entries) = crate::api::fetch_notes(current_slug).await { + let ids: std::collections::HashSet<String> = + entries.into_iter().map(|e| e.para_id).collect(); + annotate_notes(&ids); + } + }); + }); + } + + view! { + <LangToggle current=lang/> + <Suspense fallback=move || view! { <p class="source-loading">"…"</p> }> + {move || { + data.get().map(|res| { + let lang_val = lang.get(); + let home_href = format!("/?lang={}", lang_val.as_str()); + let breadcrumb_cycle = match lang_val { + Lang::Ru => "цикл 1", + Lang::En => "cycle 1", + }; + let label_all = match lang_val { + Lang::Ru => "все источники", + Lang::En => "all sources", + }; + let label_prev = match lang_val { + Lang::Ru => "← предыдущий", + Lang::En => "← prev", + }; + let label_next = match lang_val { + Lang::Ru => "следующий →", + Lang::En => "next →", + }; + + match res { + Ok(Some(d)) => { + let SourcePageData { source: src, prev, next } = d; + let prev_href = prev.map(|p| format!("/source/{p}?lang={}", lang_val.as_str())); + let next_href = next.map(|n| format!("/source/{n}?lang={}", lang_val.as_str())); + view! { + <main class="source"> + <nav class="source-breadcrumb"> + <a href=home_href.clone()>"design dna"</a> + <span class="sep">" · "</span> + <span>{breadcrumb_cycle}</span> + <span class="sep">" · "</span> + <span class="source-author">{src.author}</span> + </nav> + + <article + class="source-body" + inner_html=src.body_html + on:click=move |ev| { + if let Some(p) = paragraph_from_event(&ev) { + set_active.set(Some(p)); + } + } + ></article> + + <footer class="source-foot"> + {prev_href.map(|h| view! { + <a class="nav-prev" href=h>{label_prev}</a> + })} + <a class="nav-home" href=home_href>{label_all}</a> + {next_href.map(|h| view! { + <a class="nav-next" href=h>{label_next}</a> + })} + </footer> + </main> + }.into_any() + } + Ok(None) => view! { + <main class="source not-found"> + <p>"source not found"</p> + <a class="back-link" href=home_href>"← back"</a> + </main> + }.into_any(), + Err(e) => view! { + <main class="source not-found"> + <p class="err">{format!("{e}")}</p> + </main> + }.into_any(), + } + }) + }} + </Suspense> + + <MarginDrawer + slug=slug_sig + lang=lang_sig + active=active + set_active=set_active + notes_tick=notes_tick + /> + } +} + +/// Climb up from the click target to find the nearest `[data-para-id]` +/// element; return its id + plain-text content to seed the drawer. +#[cfg(feature = "hydrate")] +fn paragraph_from_event(ev: &leptos::ev::MouseEvent) -> Option<ActivePara> { + use wasm_bindgen::JsCast; + let target = ev.target()?; + let mut el = target.dyn_into::<web_sys::Element>().ok()?; + loop { + if el.has_attribute("data-para-id") { + let id = el.get_attribute("data-para-id")?; + let text = el.text_content().unwrap_or_default(); + let excerpt = text.trim().to_string(); + return Some(ActivePara { id, excerpt }); + } + el = el.parent_element()?; + } +} + +#[cfg(not(feature = "hydrate"))] +fn paragraph_from_event(_ev: &leptos::ev::MouseEvent) -> Option<ActivePara> { + None +} + +/// Add `class="has-notes"` to every paragraph that has at least one +/// marginalia entry. Called after notes fetch. +#[cfg(feature = "hydrate")] +fn annotate_notes(ids: &std::collections::HashSet<String>) { + use wasm_bindgen::JsCast; + let Some(win) = web_sys::window() else { return }; + let Some(doc) = win.document() else { return }; + let Ok(nodes) = doc.query_selector_all("[data-para-id]") else { return }; + for i in 0..nodes.length() { + let Some(node) = nodes.item(i) else { continue }; + let Ok(el) = node.dyn_into::<web_sys::Element>() else { continue }; + let id = el.get_attribute("data-para-id").unwrap_or_default(); + let classes = el.class_list(); + if ids.contains(&id) { + let _ = classes.add_1("has-notes"); + } else { + let _ = classes.remove_1("has-notes"); + } + } +} diff --git a/crates/mantra-ui/src/pages/theme.rs b/crates/mantra-ui/src/pages/theme.rs new file mode 100644 index 0000000..4c53e80 --- /dev/null +++ b/crates/mantra-ui/src/pages/theme.rs @@ -0,0 +1,117 @@ +//! `/theme/:slug` — one running theme, with contributing sources. + +use leptos::prelude::*; +use leptos_router::hooks::{use_params, use_query_map}; +use leptos_router::params::Params; + +use crate::api::{fetch_theme_page, ThemePageData}; +use crate::corpus::{Lang, Source}; +use crate::pages::shared::LangToggle; + +#[derive(Params, PartialEq, Clone, Debug)] +struct SlugParam { + slug: Option<String>, +} + +#[component] +pub fn ThemePage() -> impl IntoView { + let params = use_params::<SlugParam>(); + let slug = Memo::new(move |_| { + params.get().ok().and_then(|p| p.slug).unwrap_or_default() + }); + + let query = use_query_map(); + let lang = Memo::new(move |_| { + Lang::from_query(query.read().get("lang").as_deref()) + }); + + let data = Resource::new( + move || (slug.get(), lang.get().as_str().to_string()), + |(s, l)| fetch_theme_page(s, l), + ); + + view! { + <LangToggle current=lang/> + <Suspense fallback=move || view! { <p class="source-loading">"…"</p> }> + {move || { + data.get().map(|res| { + let lang_val = lang.get(); + let home_href = format!("/?lang={}", lang_val.as_str()); + let label_back = match lang_val { + Lang::Ru => "← все темы", + Lang::En => "← all themes", + }; + let label_sources = match lang_val { + Lang::Ru => "источники", + Lang::En => "sources", + }; + let theme_label = match lang_val { + Lang::Ru => "тема", + Lang::En => "theme", + }; + + match res { + Ok(Some(ThemePageData { theme, contributing })) => view! { + <main class="theme"> + <nav class="source-breadcrumb"> + <a href=home_href.clone()>"design dna"</a> + <span class="sep">" · "</span> + <span>{theme_label}</span> + </nav> + <h1 class="theme-h1">{theme.title}</h1> + <div + class="theme-desc" + inner_html=theme.description_html + ></div> + <section class="theme-contributing"> + <h3 class="landing-col-label">{label_sources}</h3> + <ul class="works-list"> + <For + each=move || contributing.clone() + key=|s| s.slug.clone() + let:source + > + <ContributingLine + source=source + lang=lang_val + /> + </For> + </ul> + </section> + <footer class="source-foot"> + <a class="nav-home" href=home_href>{label_back}</a> + </footer> + </main> + }.into_any(), + Ok(None) => view! { + <main class="theme not-found"> + <p>"theme not found"</p> + <a class="back-link" href=home_href>"← back"</a> + </main> + }.into_any(), + Err(e) => view! { + <main class="theme not-found"> + <p class="err">{format!("{e}")}</p> + </main> + }.into_any(), + } + }) + }} + </Suspense> + } +} + +#[component] +fn ContributingLine(source: Source, lang: Lang) -> impl IntoView { + let href = format!("/source/{}?lang={}", source.slug, lang.as_str()); + view! { + <li class="work-line"> + <a href=href> + <span class="work-author">{source.author}</span> + <span class="work-sep">" · "</span> + <span class="work-title">{source.title}</span> + <div class="work-claim">{source.core_claim}</div> + </a> + </li> + } +} diff --git a/sass/main.scss b/sass/main.scss new file mode 100644 index 0000000..9edb808 --- /dev/null +++ b/sass/main.scss @@ -0,0 +1,756 @@ +// mantra · book-grade reader typography +// Fraunces (variable) body + IBM Plex Sans (labels) + IBM Plex Mono (non-Latin) +// Pergament-ink light · deep-ink dark · 62ch measure +// Headings H2 as margin-labels on wide, inline-before on mobile + +// --- Fonts (self-hosted) --------------------------------------------- + +@font-face { + font-family: "Fraunces"; + src: url("/fonts/fraunces-variable.woff2") format("woff2-variations"); + font-weight: 100 900; + font-style: normal; + font-display: swap; +} +@font-face { + font-family: "Fraunces"; + src: url("/fonts/fraunces-italic-variable.woff2") format("woff2-variations"); + font-weight: 100 900; + font-style: italic; + font-display: swap; +} +@font-face { + font-family: "IBM Plex Sans"; + src: url("/fonts/plex-sans-variable.woff2") format("woff2-variations"); + font-weight: 100 900; + font-style: normal; + font-display: swap; +} +@font-face { + font-family: "IBM Plex Mono"; + src: url("/fonts/plex-mono-variable.woff2") format("woff2"); + font-weight: 400; + font-style: normal; + font-display: swap; +} + +// --- Color tokens ---------------------------------------------------- + +:root { + // Pergament (light) + --mantra-bg: #fdfbf5; + --mantra-fg: #1c1917; + --mantra-muted: #78716c; + --mantra-faint: #d6d3d0; + --mantra-accent: #5e4b3a; + --mantra-hairline: rgba(28, 25, 23, 0.08); + + --mantra-measure: 62ch; + --mantra-serif: "Fraunces", Georgia, "Times New Roman", serif; + --mantra-sans: "IBM Plex Sans", -apple-system, BlinkMacSystemFont, system-ui, sans-serif; + --mantra-mono: "IBM Plex Mono", ui-monospace, "SF Mono", Menlo, monospace; +} +@media (prefers-color-scheme: dark) { + :root { + --mantra-bg: #0f1012; + --mantra-fg: #e7e3dd; + --mantra-muted: #8a857d; + --mantra-faint: #2a2826; + --mantra-accent: #c9b999; + --mantra-hairline: rgba(231, 227, 221, 0.10); + } +} + +// --- Reset + base ---------------------------------------------------- + +* { box-sizing: border-box; } + +::selection { + background: var(--mantra-accent); + color: var(--mantra-bg); +} + +html, body { + margin: 0; + padding: 0; + background: var(--mantra-bg); + color: var(--mantra-fg); + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + text-rendering: optimizeLegibility; +} + +body { + font-family: var(--mantra-serif); + font-size: 19px; + line-height: 1.68; + letter-spacing: 0.002em; + // Variable-axis tuning: a warmer serif without eccentricity + font-variation-settings: "opsz" 18, "SOFT" 30, "WONK" 0, "wght" 400; + font-feature-settings: "kern" 1, "liga" 1, "calt" 1, "onum" 1; +} + +a { + color: inherit; + text-decoration: none; + border-bottom: 1px solid var(--mantra-hairline); + transition: border-color 0.2s, color 0.2s; +} +a:hover { border-bottom-color: var(--mantra-accent); color: var(--mantra-accent); } + +main { + max-width: var(--mantra-measure); + margin: 0 auto; + padding: 6rem 1.5rem 8rem; +} +@media (max-width: 640px) { + main { padding: 3rem 1.25rem 5rem; } + body { font-size: 18px; line-height: 1.65; } +} + +// --- Landing -------------------------------------------------------- + +.landing { + max-width: 72ch; +} + +.landing-head { margin-bottom: 4rem; } + +.landing-title { + font-family: var(--mantra-serif); + font-variation-settings: "opsz" 144, "SOFT" 50, "WONK" 0, "wght" 350; + font-size: clamp(3rem, 7vw, 4.5rem); + font-weight: 350; + line-height: 1.02; + letter-spacing: -0.02em; + margin: 0; + color: var(--mantra-fg); +} + +.landing-subtitle { + font-family: var(--mantra-sans); + font-variation-settings: "wght" 400; + font-size: 0.78rem; + color: var(--mantra-muted); + text-transform: uppercase; + letter-spacing: 0.22em; + margin: 1rem 0 3rem; +} + +.landing-question { + font-family: var(--mantra-serif); + font-style: italic; + font-variation-settings: "opsz" 36, "SOFT" 50, "WONK" 0, "wght" 380; + font-size: 1.4rem; + line-height: 1.4; + color: var(--mantra-fg); + margin: 0 0 4rem; + max-width: 34ch; +} + +.landing-grid { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 3.5rem; +} +@media (max-width: 760px) { + .landing-grid { grid-template-columns: 1fr; gap: 3rem; } +} + +.landing-col-label { + font-family: var(--mantra-sans); + font-variation-settings: "wght" 500; + font-size: 0.72rem; + text-transform: uppercase; + letter-spacing: 0.28em; + color: var(--mantra-muted); + margin: 0 0 1.75rem; +} + +.works-list, .themes-list { + list-style: none; + margin: 0; + padding: 0; + display: flex; + flex-direction: column; + gap: 1.5rem; +} + +.work-line { + a { + display: block; + border-bottom: none; + line-height: 1.35; + } + a:hover { color: var(--mantra-fg); } + a:hover .work-author { color: var(--mantra-accent); } +} +.work-author { + font-family: var(--mantra-serif); + font-variation-settings: "opsz" 18, "SOFT" 30, "WONK" 0, "wght" 500; + color: var(--mantra-fg); +} +.work-sep { color: var(--mantra-faint); } +.work-title { + font-style: italic; + color: var(--mantra-muted); +} +.work-claim { + font-family: var(--mantra-serif); + font-variation-settings: "opsz" 14, "SOFT" 30, "WONK" 0, "wght" 380; + font-size: 0.88rem; + color: var(--mantra-muted); + line-height: 1.5; + margin-top: 0.3rem; +} + +.theme-line a { + display: block; + border-bottom: none; +} +.theme-title { + font-family: var(--mantra-serif); + font-variation-settings: "opsz" 18, "SOFT" 30, "WONK" 0, "wght" 500; +} +.theme-count { + font-family: var(--mantra-sans); + color: var(--mantra-muted); + font-size: 0.82rem; + letter-spacing: 0.02em; +} + +// --- Source page ---------------------------------------------------- + +.source-breadcrumb { + font-family: var(--mantra-sans); + font-variation-settings: "wght" 450; + font-size: 0.72rem; + text-transform: uppercase; + letter-spacing: 0.22em; + color: var(--mantra-muted); + margin-bottom: 3rem; + .sep { margin: 0 0.5em; color: var(--mantra-faint); } + a { color: var(--mantra-muted); border-bottom: none; } + a:hover { color: var(--mantra-fg); } +} + +.source-body { + // Positioning anchor for H2 margin-labels below. + position: relative; + + // H1 is the work title + h1 { + font-family: var(--mantra-serif); + font-variation-settings: "opsz" 96, "SOFT" 50, "WONK" 0, "wght" 380; + font-size: clamp(2rem, 5vw, 2.75rem); + line-height: 1.1; + letter-spacing: -0.012em; + margin: 0 0 2.5rem; + color: var(--mantra-fg); + } + + // H2 as margin-label on wide screens (pulled into left margin) + h2 { + font-family: var(--mantra-sans); + font-variation-settings: "wght" 500; + font-size: 0.72rem; + text-transform: uppercase; + letter-spacing: 0.24em; + color: var(--mantra-muted); + font-weight: 500; + margin: 3.5rem 0 1.25rem; + position: relative; + } + @media (min-width: 1100px) { + h2 { + position: absolute; + // Pull the label into the left gutter, outside the article box. + // 16ch for the label + 2.5rem breathing room before the text + // column (which starts at the article's padding-left, i.e. 0). + left: calc(-16ch - 2.5rem); + margin: 0; + padding-top: 0.5rem; + width: 16ch; + text-align: right; + } + // Insert spacing where H2 would have been inline + h2 + * { margin-top: 3rem; } + } + + h3 { + font-family: var(--mantra-serif); + font-variation-settings: "opsz" 24, "SOFT" 40, "WONK" 0, "wght" 520; + font-size: 1.12rem; + letter-spacing: -0.005em; + margin: 2.2rem 0 0.8rem; + color: var(--mantra-fg); + } + + p { + margin: 0 0 1.35rem; + hyphens: auto; + -webkit-hyphens: auto; + } + + em, i { + font-style: italic; + font-variation-settings: "opsz" 18, "SOFT" 40, "WONK" 0, "wght" 400; + } + strong, b { + font-variation-settings: "opsz" 18, "SOFT" 30, "WONK" 0, "wght" 600; + } + + a { + border-bottom: 1px solid var(--mantra-muted); + } + a:hover { border-bottom-color: var(--mantra-accent); } + + blockquote { + border-left: 2px solid var(--mantra-accent); + margin: 2rem 0 2rem -0.5rem; + padding: 0.3rem 0 0.3rem 1.5rem; + font-style: italic; + font-variation-settings: "opsz" 17, "SOFT" 50, "WONK" 0, "wght" 400; + color: var(--mantra-fg); + font-size: 0.98rem; + p { margin-bottom: 0.6rem; &:last-child { margin-bottom: 0; } } + } + + code { + font-family: var(--mantra-mono); + font-size: 0.85em; + background: var(--mantra-faint); + padding: 0.1rem 0.35rem; + border-radius: 3px; + } + + pre { + font-family: var(--mantra-mono); + font-size: 0.82rem; + background: var(--mantra-faint); + padding: 1rem 1.25rem; + border-radius: 6px; + overflow-x: auto; + margin: 1.75rem 0; + line-height: 1.5; + code { background: none; padding: 0; font-size: inherit; } + } + + ul, ol { + margin: 0 0 1.35rem; + padding-left: 1.5rem; + } + li { margin: 0.3rem 0; } + + hr { + border: none; + border-top: 1px solid var(--mantra-hairline); + margin: 3rem auto; + width: 12ch; + } + + table { + width: 100%; + border-collapse: collapse; + font-size: 0.9rem; + margin: 1.5rem 0; + th, td { + padding: 0.5rem 0.8rem; + border-bottom: 1px solid var(--mantra-hairline); + text-align: left; + vertical-align: top; + } + th { + font-family: var(--mantra-sans); + font-variation-settings: "wght" 500; + font-size: 0.75rem; + text-transform: uppercase; + letter-spacing: 0.15em; + color: var(--mantra-muted); + } + } + + // Paragraph click-target + margin dot (M.3 margin-layer). + // - Empty paragraphs: faint dot appears only on hover (affordance). + // - Annotated paragraphs (.has-notes): dot is always visible in the + // accent colour, so readers see at a glance where the marginalia is. + p[data-para-id] { + position: relative; + cursor: pointer; + } + @media (min-width: 900px) { + p[data-para-id]::before { + content: ""; + position: absolute; + left: -1.25rem; + top: 0.75em; + width: 5px; + height: 5px; + border-radius: 50%; + background: var(--mantra-faint); + opacity: 0; + transition: opacity 0.2s, background 0.2s, transform 0.2s; + } + p[data-para-id]:hover::before { + opacity: 1; + background: var(--mantra-muted); + } + p[data-para-id].has-notes::before { + opacity: 1; + background: var(--mantra-accent); + } + p[data-para-id].has-notes:hover::before { + transform: scale(1.3); + } + } +} + +.source-foot { + display: grid; + grid-template-columns: 1fr auto 1fr; + align-items: center; + gap: 1rem; + margin-top: 5rem; + padding-top: 2rem; + border-top: 1px solid var(--mantra-hairline); + font-family: var(--mantra-sans); + font-size: 0.78rem; + letter-spacing: 0.08em; + text-transform: uppercase; + color: var(--mantra-muted); + + a { border-bottom: none; color: var(--mantra-muted); } + a:hover { color: var(--mantra-fg); } + + .nav-prev { justify-self: start; } + .nav-home { justify-self: center; } + .nav-next { justify-self: end; } +} + +// --- Theme page ----------------------------------------------------- + +.theme-h1 { + font-family: var(--mantra-serif); + font-variation-settings: "opsz" 72, "SOFT" 50, "WONK" 0, "wght" 380; + font-size: clamp(2rem, 4.5vw, 2.75rem); + line-height: 1.1; + letter-spacing: -0.01em; + margin: 0 0 2rem; + color: var(--mantra-fg); +} + +.theme-desc { + margin-bottom: 3rem; + p { color: var(--mantra-fg); margin-bottom: 1.2rem; } +} + +.theme-contributing { margin-top: 3rem; } + +// --- Misc ----------------------------------------------------------- + +// --- Language toggle (top-right) --- +.lang-toggle { + position: fixed; + top: 1.25rem; + right: 1.5rem; + z-index: 10; + display: flex; + align-items: center; + gap: 0.4rem; + font-family: var(--mantra-sans); + font-variation-settings: "wght" 450; + font-size: 0.78rem; + letter-spacing: 0.1em; + + a { + color: var(--mantra-faint); + text-decoration: none; + border-bottom: none; + padding: 0.1rem 0.1rem; + transition: color 0.15s; + } + a:hover { color: var(--mantra-fg); } + a.lang-active { + color: var(--mantra-fg); + font-variation-settings: "wght" 600; + } + .lang-dot { + color: var(--mantra-faint); + } +} +@media (max-width: 640px) { + .lang-toggle { top: 1rem; right: 1rem; font-size: 0.72rem; } +} + +.err { + color: #b45309; + font-family: var(--mantra-mono); + font-size: 0.88rem; +} +.not-found { padding: 2rem 0; } +.back-link { + color: var(--mantra-muted); + font-family: var(--mantra-sans); + font-size: 0.85rem; + border-bottom: none; +} + +// --- Margin drawer (M.3) -------------------------------------------- + +.margin-drawer { + position: fixed; + top: 0; + right: 0; + max-height: 100vh; + width: min(420px, 90vw); + background: var(--mantra-bg); + border-left: 1px solid var(--mantra-hairline); + box-shadow: -12px 0 32px rgba(0, 0, 0, 0.04); + z-index: 20; + display: flex; + flex-direction: column; + font-family: var(--mantra-sans); + font-size: 0.92rem; + color: var(--mantra-fg); + animation: drawer-in 0.22s ease-out; + overflow: hidden; +} + +@keyframes drawer-in { + from { transform: translateX(16px); opacity: 0; } + to { transform: translateX(0); opacity: 1; } +} + +.margin-drawer-head { + position: relative; + padding: 0.9rem 1.1rem 0.7rem; + border-bottom: 1px solid var(--mantra-hairline); + text-align: center; +} + +.margin-drawer-tabs { + display: inline-flex; + gap: 0.2rem; + + .tab { + background: transparent; + border: none; + cursor: pointer; + font-family: var(--mantra-sans); + font-size: 0.8rem; + font-variation-settings: "wght" 450; + letter-spacing: 0.08em; + text-transform: lowercase; + color: var(--mantra-muted); + padding: 0.3rem 0.9rem; + border-radius: 14px; + transition: color 0.15s, background 0.15s; + + &:hover { color: var(--mantra-fg); } + &.tab-active { + color: var(--mantra-bg); + background: var(--mantra-accent); + font-variation-settings: "wght" 600; + } + } +} + +.margin-drawer-close { + position: absolute; + top: 0.55rem; + right: 0.9rem; + background: transparent; + border: none; + cursor: pointer; + font-family: var(--mantra-serif); + font-size: 1.5rem; + line-height: 1; + color: var(--mantra-muted); + padding: 0.2rem 0.45rem; + transition: color 0.15s; + &:hover { color: var(--mantra-fg); } +} + +.margin-drawer-excerpt { + padding: 0.8rem 1.1rem; + font-family: var(--mantra-serif); + font-style: italic; + font-size: 0.88rem; + line-height: 1.5; + color: var(--mantra-muted); + border-bottom: 1px solid var(--mantra-hairline); + max-height: 6.5em; + overflow: hidden; + text-overflow: ellipsis; + display: -webkit-box; + -webkit-line-clamp: 4; + -webkit-box-orient: vertical; +} + +// Entries sit below the form (reading flows downward: write → record). +// They scroll within their own area when long; when empty, they add +// minimal height so the drawer collapses to just head+excerpt+form. +.margin-drawer-entries { + flex: 0 1 auto; + max-height: 42vh; + overflow-y: auto; + padding: 0.6rem 1.1rem 1rem; + display: flex; + flex-direction: column; + gap: 0.9rem; + border-top: 1px solid var(--mantra-hairline); + + &:empty { display: none; } +} + +.margin-empty { + color: var(--mantra-muted); + font-style: italic; + font-family: var(--mantra-serif); + font-size: 0.9rem; + margin: 1.2rem 0; + text-align: center; +} + +.note-card { + border-left: 2px solid var(--mantra-hairline); + padding: 0.1rem 0 0.1rem 0.8rem; + + &.note-card-ask { border-left-color: var(--mantra-accent); } + + .note-card-meta { + font-size: 0.72rem; + letter-spacing: 0.08em; + color: var(--mantra-muted); + margin-bottom: 0.3rem; + font-variation-settings: "wght" 500; + } + .note-q { + font-family: var(--mantra-serif); + font-style: italic; + font-size: 0.94rem; + line-height: 1.5; + margin: 0 0 0.5rem; + color: var(--mantra-fg); + } + .note-a { + font-family: var(--mantra-serif); + font-size: 0.94rem; + line-height: 1.55; + margin: 0; + color: var(--mantra-fg); + white-space: pre-wrap; + } +} + +.margin-drawer-form { + padding: 0.9rem 1.1rem 1rem; + display: flex; + flex-direction: column; + gap: 0.6rem; +} + +.margin-drawer-input { + width: 100%; + resize: vertical; + min-height: 4.5rem; + background: var(--mantra-bg); + color: var(--mantra-fg); + border: 1px solid var(--mantra-hairline); + border-radius: 4px; + padding: 0.55rem 0.7rem; + font-family: var(--mantra-serif); + font-size: 0.95rem; + line-height: 1.45; + transition: border-color 0.15s; + &:focus { + outline: none; + border-color: var(--mantra-accent); + } +} + +.margin-drawer-actions { + display: flex; + align-items: center; + gap: 0.8rem; +} + +.margin-drawer-author { + display: inline-flex; + align-items: center; + gap: 0.35rem; + flex: 1; + min-width: 0; + + .margin-drawer-author-label { + font-size: 0.72rem; + color: var(--mantra-muted); + letter-spacing: 0.06em; + text-transform: lowercase; + font-variation-settings: "wght" 500; + } + .margin-drawer-author-input { + flex: 1; + min-width: 0; + background: transparent; + border: none; + border-bottom: 1px dashed var(--mantra-faint); + font-family: var(--mantra-sans); + font-size: 0.82rem; + color: var(--mantra-fg); + padding: 0.1rem 0 0.15rem; + outline: none; + transition: border-color 0.15s; + &:focus { border-bottom-color: var(--mantra-accent); } + &::placeholder { color: var(--mantra-faint); } + } +} + +.margin-drawer-submit { + background: var(--mantra-accent); + color: var(--mantra-bg); + border: none; + border-radius: 14px; + padding: 0.45rem 1.1rem; + font-family: var(--mantra-sans); + font-size: 0.82rem; + font-variation-settings: "wght" 600; + letter-spacing: 0.06em; + text-transform: lowercase; + cursor: pointer; + transition: opacity 0.15s, transform 0.12s; + + &:hover:not(:disabled) { transform: translateY(-1px); } + &:disabled { + opacity: 0.4; + cursor: not-allowed; + } +} + +.margin-drawer-error { + color: #b45309; + font-family: var(--mantra-mono); + font-size: 0.78rem; + margin: 0; + word-break: break-word; +} + +// Mobile: drawer becomes a bottom sheet +@media (max-width: 720px) { + .margin-drawer { + top: auto; + right: 0; + left: 0; + bottom: 0; + width: 100vw; + max-height: 75vh; + border-left: none; + border-top: 1px solid var(--mantra-hairline); + box-shadow: 0 -8px 24px rgba(0, 0, 0, 0.08); + animation: drawer-up 0.22s ease-out; + } + @keyframes drawer-up { + from { transform: translateY(16px); opacity: 0; } + to { transform: translateY(0); opacity: 1; } + } +} diff --git a/static/fonts/fraunces-italic-variable.woff2 b/static/fonts/fraunces-italic-variable.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..1898b02129d4f8c1e0d3f95034afec8bf8b16a51 GIT binary patch literal 45656 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 UpaPH_6))Fi|KOe-{R0310EX#+c>n+a literal 0 HcmV?d00001 diff --git a/static/fonts/fraunces-variable.woff2 b/static/fonts/fraunces-variable.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..32e1ccc852fdd25f4aaf8822584fe643c1cbf667 GIT binary patch literal 36620 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 literal 0 HcmV?d00001 diff --git a/static/fonts/plex-mono-variable.woff2 b/static/fonts/plex-mono-variable.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..0804aaff92260b5359330f63e05b9ac25ccabeee GIT binary patch literal 14708 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 CRdxsf literal 0 HcmV?d00001 diff --git a/static/fonts/plex-sans-variable.woff2 b/static/fonts/plex-sans-variable.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..b757bc5ca2d8845a5b8d5349c860553f1772dd69 GIT binary patch literal 45712 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%0Ax=|Hbx}Nw3IaMz0<m^(*T%F+ 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 W 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 literal 0 HcmV?d00001