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
+
+
+
+
+
+
+
+
+
+
+
+ Your daily plan
+
+
5 of 8 completed
+
+
+
+
+
+
*/}
+
+
+
+
+
+ );
+};
+
+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
+
+
+
+
+
+
+
+
+
+
+ );
+};
+
+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"