diff --git a/assets/claim.png b/assets/claim.png new file mode 100644 index 0000000..5095b60 Binary files /dev/null and b/assets/claim.png differ diff --git a/assets/proposal.png b/assets/proposal.png new file mode 100644 index 0000000..8340861 Binary files /dev/null and b/assets/proposal.png differ diff --git a/deployments/default.devnet-plan.yaml b/deployments/default.devnet-plan.yaml new file mode 100644 index 0000000..640f860 --- /dev/null +++ b/deployments/default.devnet-plan.yaml @@ -0,0 +1,95 @@ +--- +id: 0 +name: Devnet deployment +network: devnet +stacks-node: "http://localhost:20443" +bitcoin-node: "http://devnet:devnet@localhost:18443" +plan: + batches: + - id: 0 + transactions: + - contract-publish: + contract-name: extension-trait + expected-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + cost: 1670 + path: contracts/extension-trait.clar + anchor-block-only: true + clarity-version: 2 + - contract-publish: + contract-name: proposal-trait + expected-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + cost: 1680 + path: contracts/proposal-trait.clar + anchor-block-only: true + clarity-version: 2 + - contract-publish: + contract-name: core + expected-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + cost: 22660 + path: contracts/core.clar + anchor-block-only: true + clarity-version: 2 + - contract-publish: + contract-name: membership-token + expected-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + cost: 17200 + path: contracts/membership-token.clar + anchor-block-only: true + clarity-version: 2 + - contract-publish: + contract-name: bootstrap + expected-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + cost: 15470 + path: contracts/bootstrap.clar + anchor-block-only: true + clarity-version: 2 + - contract-publish: + contract-name: milestone-extension + expected-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + cost: 26090 + path: contracts/milestone-extension.clar + anchor-block-only: true + clarity-version: 2 + - contract-publish: + contract-name: grant-milestone-claim-proposal + expected-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + cost: 4540 + path: contracts/grant-milestone-claim-proposal.clar + anchor-block-only: true + clarity-version: 2 + - contract-publish: + contract-name: grant-proposal + expected-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + cost: 9270 + path: contracts/grant-proposal.clar + anchor-block-only: true + clarity-version: 2 + - contract-publish: + contract-name: hello-world + expected-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + cost: 12460 + path: contracts/hello-world.clar + anchor-block-only: true + clarity-version: 2 + - contract-publish: + contract-name: milestone-extension-proposal + expected-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + cost: 7600 + path: contracts/milestone-extension-proposal.clar + anchor-block-only: true + clarity-version: 2 + - contract-publish: + contract-name: proposal-voting + expected-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + cost: 37540 + path: contracts/proposal-voting.clar + anchor-block-only: true + clarity-version: 2 + - contract-publish: + contract-name: proposal-submission + expected-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + cost: 16350 + path: contracts/proposal-submission.clar + anchor-block-only: true + clarity-version: 2 + epoch: "2.1" diff --git a/history.txt b/history.txt index bb7c3c6..6f58a6f 100644 --- a/history.txt +++ b/history.txt @@ -1,27 +1,4 @@ #V2 -(stx-get-balance tx-sender) -(stx-transfer? u1000000000000 tx-sender .core) -::get_asset_map -::get_asset_maps -::get_assets_maps -(contract-call? .core construct .bootstrap) -(as-contract stx-get-balance .core) -(as-contract (stx-get-balance .core)) -(stx-get-balance .core) -(stx-transfer? u1000000000000 tx-sender .core) -(contract-call? .core construct .bootstrap) -::get_assets_maps -(contract-call? .proposal-submission propose .milestone-extension-proposal) -(contract-call? .proposal-submission propose .milestone-extension-proposal "extension for milestone based funding" "same as title") -(contract-call? .proposal-submission propose .milestone-extension-proposal "extension for milestone based funding" same as title) -(contract-call? .proposal-submission propose .milestone-extension-proposal u"extension for milestone based funding" u"same as title") -(contract-call? .proposal-submission propose .milestone-extension-proposal "extension for milestone based funding" u"same as title") -(contract-call? .proposal-voting vote u100 true .milestone-extension-proposal) -::get_assets_maps -(contract-call? .proposal-voting conclude .milestone-extension-proposal) -::advance_chain_tip 1440 -(contract-call? .proposal-voting conclude .milestone-extension-proposal) -(stx-transfer? u1000000000000 tx-sender .core) (contract-call? .core construct .bootstrap) (contract-call? .proposal-submission propose .milestone-extension-proposal "extension for milestone based funding" u"same as title") ::advance_chain_tip 1440 @@ -99,3 +76,26 @@ block_height (contract-call? .proposal-voting vote u100 true .grant-milestone-claim-proposal) ::advance_chain_tip 1440 (contract-call? .proposal-voting conclude .grant-milestone-claim-proposal) +(stx-transfer? u1000000000000 tx-sender .core) +(contract-call? .core construct .bootstrap) +(contract-call? .proposal-submission propose .milestone-extension-proposal) +(contract-call? .proposal-submission propose .milestone-extension-proposal "extension for milestone based funding" u"same as title") +(contract-call? .proposal-voting vote u100 true .milestone-extension-proposal) +::advance_chain_tip 1440 +(contract-call? .proposal-voting conclude .milestone-extension-proposal) +::get_assets_maps +(contract-call? .proposal-submission propose .grant-proposal "friend.tech grant" u"a clone social media app") +(contract-call? .proposal-voting vote u100 true .grant-proposal) +(contract-call? .grant-proposal get-milestones ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.grant-proposal)\n +(contract-call? .milestone-extension get-milestones ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.grant-proposal)\n +(contract-call? .milestone-extension get-milestones 'ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.grant-proposal)\n +::advance_chain_tip 1440 +(contract-call? .proposal-voting conclude .grant-proposal) +(contract-call? .milestone-extension get-milestones 'ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.grant-proposal)\n +(contract-call? .proposal-submission propose .grant-milestone-claim-proposal "test grant claim proposal" u"same as title")\n +::get_block_height +(contract-call? .milestone-extension get-milestones 'ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.grant-proposal)\n +::advance_chain_tip 14400 +(contract-call? .proposal-voting vote u100 true .grant-milestone-claim-proposal) +(contract-call? .proposal-voting conclude .grant-milestone-claim-proposal) +::get_assets_maps diff --git a/package.json b/package.json index 4b5f462..af8ac69 100644 --- a/package.json +++ b/package.json @@ -16,6 +16,8 @@ "license": "ISC", "dependencies": { "@hirosystems/clarinet-sdk": "^1.1.0", + "@micro-stacks/react": "^1.0.9", + "@monaco-editor/react": "^4.6.0", "@radix-ui/react-avatar": "^1.0.4", "@radix-ui/react-dropdown-menu": "^2.0.6", "@radix-ui/react-icons": "^1.3.0", @@ -26,14 +28,15 @@ "@stacks/encryption": "^6.9.0", "@stacks/network": "^6.8.1", "@stacks/transactions": "^6.9.0", + "chokidar-cli": "^3.0.0", "class-variance-authority": "^0.7.0", "clsx": "^2.0.0", "lucide-react": "^0.294.0", "react": "^18.2.0", "react-dom": "^18.2.0", + "sonner": "^1.2.4", "tailwind-merge": "^2.0.0", - "tailwindcss-animate": "^1.0.7", - "chokidar-cli": "^3.0.0" + "tailwindcss-animate": "^1.0.7" }, "devDependencies": { "@commitlint/cli": "^17.4.3", diff --git a/src/components/codeEditor.tsx b/src/components/codeEditor.tsx new file mode 100644 index 0000000..113817f --- /dev/null +++ b/src/components/codeEditor.tsx @@ -0,0 +1,76 @@ +import React, { useEffect } from 'react'; +import { Editor, loader } from '@monaco-editor/react'; + +const CodeEditor = ({ onCodeChange }: any) => { + function handleEditorChange(value, event) { + console.log('here is the current model value:', value); + if (onCodeChange) { + onCodeChange(value); // Call the passed callback function with the current code value + } + } + + // Function to define Clarity language + const defineClarityLanguage = (monaco) => { + monaco.languages.register({ id: 'clarity' }); + + monaco.languages.setMonarchTokensProvider('clarity', { + tokenizer: { + root: [ + // Comments + [/(;;.*$)/, 'comment'], + + // Strings + [/"/, { token: 'string.quote', bracket: '@open', next: '@string' }], + + // Keywords + [ + /\b(define-data-var|define-public|define-private|define-read-only|define-constant|begin|let|if|map-set|map-get\?|and|or|not|is-eq|unwrap-panic|unwrap-err-panic|unwrap-err!|unwrap!|asserts!|try!|ok|err)\b/, + 'keyword' + ], + + // Numbers - Clarity supports both signed and unsigned integers + [/\bu?[0-9]+/, 'number'], + + // Brackets and Parentheses + [/[{}()[\]]/, '@brackets'], + + // Operators + [/[=<>!+\-*/%]/, 'operator'] + ], + + string: [ + [/[^"]+/, 'string'], + [/"/, { token: 'string.quote', bracket: '@close', next: '@pop' }] + ] + } + }); + }; + + useEffect(() => { + loader.init().then((monaco) => { + defineClarityLanguage(monaco); + }); + }, []); + + return ( + + ); +}; + +export default CodeEditor; diff --git a/src/components/leftMenu.tsx b/src/components/leftMenu.tsx new file mode 100644 index 0000000..d355ac4 --- /dev/null +++ b/src/components/leftMenu.tsx @@ -0,0 +1,59 @@ +import React from 'react'; +import { NavLink, useParams } from 'react-router-dom'; +import { SVGComponent } from './stacksSvg'; + +import { WalletConnectButton } from './walletConnect'; +import { useAccount } from '@micro-stacks/react'; + +// eslint-disable-next-line @typescript-eslint/no-explicit-any + +const LeftMenu = () => { + const { stxAddress } = useAccount(); + const { slug } = useParams(); + const getNavLinkClass = ({ isActive }: any) => { + return isActive + ? 'flex items-center gap-5 bg-blue-500 rounded-xl font-bold text-md text-white py-3 px-4' + : 'flex items-center gap-5 bg-white hover:bg-blue-50 rounded-xl font-bold text-md text-gray-900 py-3 px-4'; + }; + return ( + + ); +}; + +export default LeftMenu; diff --git a/src/components/stacksSvg.tsx b/src/components/stacksSvg.tsx new file mode 100644 index 0000000..6ffa50c --- /dev/null +++ b/src/components/stacksSvg.tsx @@ -0,0 +1,34 @@ +import React from 'react'; + +export const SVGComponent = (props: any) => ( + + + + + +); diff --git a/src/components/walletConnect.tsx b/src/components/walletConnect.tsx new file mode 100644 index 0000000..1c3fba1 --- /dev/null +++ b/src/components/walletConnect.tsx @@ -0,0 +1,21 @@ +import { useAuth } from '@micro-stacks/react'; +import React from 'react'; + +export const WalletConnectButton = () => { + const { openAuthRequest, isRequestPending, signOut, isSignedIn } = useAuth(); + const label = isRequestPending + ? 'Loading...' + : isSignedIn + ? 'Sign out' + : 'Connect Stacks wallet'; + return ( + + ); +}; diff --git a/src/main.tsx b/src/main.tsx index 7c72bd5..a427a4e 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -2,15 +2,31 @@ import React from 'react'; import App from './App'; import { BrowserRouter, Link, Route, Routes } from 'react-router-dom'; import { createRoot } from 'react-dom/client'; +import * as MicroStacks from '@micro-stacks/react'; import './index.css'; +import NewGrantProposal from './pages/newGrantProposal'; +import NewClaimProposal from './pages/newClaimProposal'; +import { StacksMocknet } from 'micro-stacks/network'; +import { Toaster } from 'sonner'; + +const devnet = new StacksMocknet({ coreApiUrl: 'http://localhost:3999' }); createRoot(document.getElementById('root') as HTMLElement).render( - - - - } /> - - - + + + + + + } /> + }> + }> + + + + ); diff --git a/src/pages/newClaimProposal.tsx b/src/pages/newClaimProposal.tsx new file mode 100644 index 0000000..4e8285a --- /dev/null +++ b/src/pages/newClaimProposal.tsx @@ -0,0 +1,193 @@ +import React from 'react'; +import LeftMenu from '../components/leftMenu'; +import CodeEditor from '../components/codeEditor'; + +const NewClaimProposal = () => { + return ( + + + +
+
+
+
+

Claim

+
+

+ In order to claim milestone funds you have to submit a + proposal giving the proposal principal and milestone ID +

+ +

+ Additionally you can include any proof of work in the smart + contract so the voters can verify your progress +

+
+ + + {/*
+
+
+ Members +
+ connected +
+
+
+
+ +
+
+ +
+
+
+
+ + +
+
+ +
+ +
+
+

Stats

+ +
+
+
+
+ Good day,

Kristin +
+
+ +
+
+
+
+
20
+
Tasks finished
+
+
+
5,5
+
Tracked hours
+
+
+
+
+ Your daily plan +
+
5 of 8 completed
+
+
+
+
+
+

Your tasks today

+ +
+
+
+
Number 10
+
4h
+
+ + Blog and social posts + +
+ + + + Deadline is today +
+
+
+
+
Grace Aroma
+
7d
+
+ + New campaign review + +
+ + + + New feedback +
+
+
+
+
Petz App
+
2h
+
+ + Cross-platform and browser QA + +
+
+
+
*/} +
+
+
+
+ + ); +}; + +export default NewClaimProposal; diff --git a/src/pages/newGrantProposal.tsx b/src/pages/newGrantProposal.tsx new file mode 100644 index 0000000..86c2707 --- /dev/null +++ b/src/pages/newGrantProposal.tsx @@ -0,0 +1,109 @@ +import React, { useEffect } from 'react'; +import LeftMenu from '../components/leftMenu'; +import CodeEditor from '../components/codeEditor'; +import { loader, Editor } from '@monaco-editor/react'; +import { useOpenContractDeploy } from '@micro-stacks/react'; +import { toast } from 'sonner'; + +const NewGrantProposal = () => { + const [code, setCode] = React.useState(''); + const [contractName, setContractName] = React.useState(''); + const [response, setResponse] = React.useState(''); + const { openContractDeploy, isRequestPending } = useOpenContractDeploy(); + const handleCodeChange = (code) => { + console.log('Code in parent component:', code); + setCode(code); + // Do something with the code here + }; + + const onDeploy = async () => { + await openContractDeploy({ + contractName: contractName, + // the clarity contract above + codeBody: code, + onFinish: async (data: any) => { + console.log('finished contract deploy!', data); + setResponse(data); + toast(`contract ${contractName} deployed!`); + }, + onCancel: () => { + console.log('popup closed!'); + } + }); + }; + + return ( +
+ + +
+
+
+
+

Propose grant

+
+

+ You can propose a new grant by deploying a contract containing + your grant details. You can write and deploy a contract from + here. +

+ +

You can list the milestones when you apply for a grant

+
+ + + +
{ + e.preventDefault(); + onDeploy(); + }} + className="flex flex-row items-center justify-end gap-10 mt-5 p-2" + > +
+ setContractName(e.target.value)} + id="default-input" + placeholder="Grant name" + className="bg-gray-50 border border-gray-300 text-gray-900 text-sm rounded-lg focus:ring-blue-500 focus:border-blue-500 block w-full p-2.5 dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400 dark:text-white dark:focus:ring-blue-500 dark:focus:border-blue-500" + /> +
+
+ +
+
+
+
+
+
+
+ ); +}; + +export default NewGrantProposal; diff --git a/yarn.lock b/yarn.lock index 645c7e6..42ca1d1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -760,6 +760,45 @@ "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" +"@micro-stacks/client@1.2.1": + version "1.2.1" + resolved "https://registry.npmjs.org/@micro-stacks/client/-/client-1.2.1.tgz#9c1d71d9c03bdfc9a4e8df0079630944c2c76f93" + integrity sha512-/A8h6XPEPqF+Fo2ljYhH2i9I5BnnjrBIK8/xWF09Jr88vKn+mBK7kXCOSlO3qCU/RSZiB9w3zX6KGnv0SRoKDQ== + dependencies: + fast-deep-equal "3.1.3" + micro-stacks "1.2.1" + tiny-invariant ">=1.2.0" + zustand "4.1.1" + +"@micro-stacks/react@^1.0.9": + version "1.0.9" + resolved "https://registry.npmjs.org/@micro-stacks/react/-/react-1.0.9.tgz#ca6340f2efdd8f61eb42df77d856c0f343a15668" + integrity sha512-K9Xm6r5JIX1J1ijYJv/AaaiC2EgtNjeKkXhl7D0YM9lk0J9haN2Sxav9pI5nR7r6KYKcqUeAx71d9vBW9VxXsA== + dependencies: + "@micro-stacks/client" "1.2.1" + micro-stacks "1.2.1" + react-async-hook "^4.0.0" + use-sync-external-store "^1.2.0" + +"@monaco-editor/loader@^1.4.0": + version "1.4.0" + resolved "https://registry.npmjs.org/@monaco-editor/loader/-/loader-1.4.0.tgz#f08227057331ec890fa1e903912a5b711a2ad558" + integrity sha512-00ioBig0x642hytVspPl7DbQyaSWRaolYie/UFNjoTdvoKPzo6xrXLhTk9ixgIKcLH5b5vDOjVNiGyY+uDCUlg== + dependencies: + state-local "^1.0.6" + +"@monaco-editor/react@^4.6.0": + version "4.6.0" + resolved "https://registry.npmjs.org/@monaco-editor/react/-/react-4.6.0.tgz#bcc68671e358a21c3814566b865a54b191e24119" + integrity sha512-RFkU9/i7cN2bsq/iTkurMWOEErmYcY6JiQI3Jn+WeR/FGISH8JbHERjpS9oRuSOPvDMJI0Z8nJeKkbOs9sBYQw== + dependencies: + "@monaco-editor/loader" "^1.4.0" + +"@noble/hashes@1.1.2": + version "1.1.2" + resolved "https://registry.npmjs.org/@noble/hashes/-/hashes-1.1.2.tgz#e9e035b9b166ca0af657a7848eb2718f0f22f183" + integrity sha512-KYRCASVTv6aeUi1tsF8/vpyR7zpfs3FUzy2Jqm+MU+LmUKhQ0y2FpfwqkCcxSg2ua4GALJd8k2R76WxwZGbQpA== + "@noble/hashes@1.1.5", "@noble/hashes@~1.1.1": version "1.1.5" resolved "https://registry.npmjs.org/@noble/hashes/-/hashes-1.1.5.tgz#1a0377f3b9020efe2fae03290bd2a12140c95c11" @@ -770,6 +809,11 @@ resolved "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.2.tgz#6f26dbc8fbc7205873ce3cee2f690eba0d421b39" integrity sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ== +"@noble/secp256k1@1.6.3": + version "1.6.3" + resolved "https://registry.npmjs.org/@noble/secp256k1/-/secp256k1-1.6.3.tgz#7eed12d9f4404b416999d0c87686836c4c5c9b94" + integrity sha512-T04e4iTurVy7I8Sw4+c5OSN9/RkPlo1uKxAomtxQNLq8j1uPAqnsqG1bqvY3Jv7c13gyr6dui0zmh/I3+f/JaQ== + "@noble/secp256k1@1.7.1", "@noble/secp256k1@^1.6.3": version "1.7.1" resolved "https://registry.npmjs.org/@noble/secp256k1/-/secp256k1-1.7.1.tgz#b251c70f824ce3ca7f8dc3df08d58f005cc0507c" @@ -2539,7 +2583,7 @@ execa@^5.0.0, execa@^5.1.1: signal-exit "^3.0.3" strip-final-newline "^2.0.0" -fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: +fast-deep-equal@3.1.3, fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== @@ -3463,6 +3507,14 @@ merge2@^1.3.0, merge2@^1.4.1: resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== +micro-stacks@1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/micro-stacks/-/micro-stacks-1.2.1.tgz#58ef75728635c77bf9522353b47f39aaf03896ce" + integrity sha512-CmFAH34GfgW9vMwnINflxH1COUWUg2kSYnPVfToZXPEJwHMGo8b3syte7s5zJ2rR/RSjpquQduiDNRAgF2Hh0w== + dependencies: + "@noble/hashes" "1.1.2" + "@noble/secp256k1" "1.6.3" + micromatch@^4.0.4, micromatch@^4.0.5: version "4.0.5" resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" @@ -3919,6 +3971,11 @@ quick-lru@^4.0.1: resolved "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz#5b8878f113a58217848c6482026c73e1ba57727f" integrity sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g== +react-async-hook@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/react-async-hook/-/react-async-hook-4.0.0.tgz#1f0467586654e1f33b7433bd98c300a0c5f9b3d0" + integrity sha512-97lgjFkOcHCTYSrsKBpsXg3iVWM0LnzedB749iP76sb3/8Ouu4nHIkCLEOrQWHVYqrYxjF05NN6GHoXWFkB3Kw== + react-dom@^18.2.0: version "18.2.0" resolved "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz#22aaf38708db2674ed9ada224ca4aa708d821e3d" @@ -4262,6 +4319,11 @@ slash@^3.0.0: resolved "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== +sonner@^1.2.4: + version "1.2.4" + resolved "https://registry.npmjs.org/sonner/-/sonner-1.2.4.tgz#c13b079a79fabef72135537aeb0164ad0671d044" + integrity sha512-WGLP2QQnomgewaCTsK7YWiLcy5n1Yj83vsL5cP4zHMmpSkmFsCYTpQKhlXJrPE5kzjwbqCkCFXcOpbKc4vaUaA== + source-map-js@^1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" @@ -4305,6 +4367,11 @@ stackback@0.0.2: resolved "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz#1ac8a0d9483848d1695e418b6d031a3c3ce68e3b" integrity sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw== +state-local@^1.0.6: + version "1.0.7" + resolved "https://registry.npmjs.org/state-local/-/state-local-1.0.7.tgz#da50211d07f05748d53009bee46307a37db386d5" + integrity sha512-HTEHMNieakEnoe33shBYcZ7NX83ACUjCu8c40iOGEZsngj9zRnkqS9j1pqQPXwobB0ZcVTk27REb7COQ0UR59w== + std-env@^3.3.3: version "3.6.0" resolved "https://registry.npmjs.org/std-env/-/std-env-3.6.0.tgz#94807562bddc68fa90f2e02c5fd5b6865bb4e98e" @@ -4513,6 +4580,11 @@ through2@^4.0.0: resolved "https://registry.npmjs.org/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== +tiny-invariant@>=1.2.0: + version "1.3.1" + resolved "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.1.tgz#8560808c916ef02ecfd55e66090df23a4b7aa642" + integrity sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw== + tinybench@^2.5.0: version "2.5.1" resolved "https://registry.npmjs.org/tinybench/-/tinybench-2.5.1.tgz#3408f6552125e53a5a48adee31261686fd71587e" @@ -4732,6 +4804,11 @@ use-sidecar@^1.1.2: detect-node-es "^1.1.0" tslib "^2.0.0" +use-sync-external-store@1.2.0, use-sync-external-store@^1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz#7dbefd6ef3fe4e767a0cf5d7287aacfb5846928a" + integrity sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA== + util-deprecate@^1.0.1, util-deprecate@^1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" @@ -4995,3 +5072,10 @@ zone-file@^2.0.0-beta.3: version "2.0.0-beta.3" resolved "https://registry.npmjs.org/zone-file/-/zone-file-2.0.0-beta.3.tgz#fad3eb8c624ad8ae746b4547e9947804283048a1" integrity sha512-6tE3PSRcpN5lbTTLlkLez40WkNPc9vw/u1J2j6DBiy0jcVX48nCkWrx2EC+bWHqC2SLp069Xw4AdnYn/qp/W5g== + +zustand@4.1.1: + version "4.1.1" + resolved "https://registry.npmjs.org/zustand/-/zustand-4.1.1.tgz#5a61cc755a002df5f041840a414ae6e9a99ee22b" + integrity sha512-h4F3WMqsZgvvaE0n3lThx4MM81Ls9xebjvrABNzf5+jb3/03YjNTSgZXeyrvXDArMeV9untvWXRw1tY+ntPYbA== + dependencies: + use-sync-external-store "1.2.0"