diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000..1995f8b Binary files /dev/null and b/.DS_Store differ diff --git a/web-interface/package-lock.json b/web-interface/package-lock.json index a2ade6f..c0a237c 100644 --- a/web-interface/package-lock.json +++ b/web-interface/package-lock.json @@ -10,11 +10,13 @@ "dependencies": { "@emotion/react": "^11.13.3", "@emotion/styled": "^11.13.0", + "@hookform/resolvers": "^3.9.0", "@mui/icons-material": "^6.1.1", "@mui/material": "^6.1.1", "@mui/x-date-pickers": "7.18.0", "@mui/x-tree-view": "^7.18.0", "@tanstack/react-query": "^5.56.2", + "@uiw/react-color-colorful": "^2.3.2", "@xyflow/react": "^12.3.0", "axios": "^1.7.7", "idb-keyval": "^6.2.1", @@ -22,10 +24,12 @@ "lodash": "^4.17.21", "react": "^18.2.0", "react-cmdk": "^1.3.9", + "react-colorful": "^5.6.1", "react-dom": "^18.2.0", "react-hook-form": "^7.53.0", "react-modal-promise": "^1.0.2", "uuid": "^9.0.1", + "yup": "^1.4.0", "zustand": "^4.5.5" }, "devDependencies": { @@ -1055,6 +1059,15 @@ "react": ">= 16" } }, + "node_modules/@hookform/resolvers": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/@hookform/resolvers/-/resolvers-3.9.0.tgz", + "integrity": "sha512-bU0Gr4EepJ/EQsH/IwEzYLsT/PEj5C0ynLQ4m+GSHS+xKH4TfSelhluTgOaoc4kA5s7eCsQbM4wvZLzELmWzUg==", + "license": "MIT", + "peerDependencies": { + "react-hook-form": "^7.0.0" + } + }, "node_modules/@humanwhocodes/config-array": { "version": "0.13.0", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", @@ -2478,6 +2491,106 @@ "url": "https://opencollective.com/typescript-eslint" } }, + "node_modules/@uiw/color-convert": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@uiw/color-convert/-/color-convert-2.3.2.tgz", + "integrity": "sha512-Txs0oAcOGhvM15yi7NqDJSws6htpuGx75EblFlZmh4h4AyUYXaeN2HNcOAUt835M3SN1j7rqMC+XERIE4r776Q==", + "license": "MIT", + "funding": { + "url": "https://jaywcjlove.github.io/#/sponsor" + }, + "peerDependencies": { + "@babel/runtime": ">=7.19.0" + } + }, + "node_modules/@uiw/react-color-alpha": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@uiw/react-color-alpha/-/react-color-alpha-2.3.2.tgz", + "integrity": "sha512-+yh+KEpNKjxNFFODQrB3Lki2hu6kznoSCngHgptlWBUtAC3e/e7tIiTTedSpCGr7fwIpC0CWrKwxENA3tyY/2Q==", + "license": "MIT", + "dependencies": { + "@uiw/color-convert": "2.3.2", + "@uiw/react-drag-event-interactive": "2.3.2" + }, + "funding": { + "url": "https://jaywcjlove.github.io/#/sponsor" + }, + "peerDependencies": { + "@babel/runtime": ">=7.19.0", + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@uiw/react-color-colorful": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@uiw/react-color-colorful/-/react-color-colorful-2.3.2.tgz", + "integrity": "sha512-Rr1qa4Uo588CZjOx6OZIXjo7+CNcnqogU0Nel6L5zzwL+3CNBC3GfS4Or4db/ZxFhN49qt6NqsQa/ykA2/ixpg==", + "license": "MIT", + "dependencies": { + "@uiw/color-convert": "2.3.2", + "@uiw/react-color-alpha": "2.3.2", + "@uiw/react-color-hue": "2.3.2", + "@uiw/react-color-saturation": "2.3.2" + }, + "funding": { + "url": "https://jaywcjlove.github.io/#/sponsor" + }, + "peerDependencies": { + "@babel/runtime": ">=7.19.0", + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@uiw/react-color-hue": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@uiw/react-color-hue/-/react-color-hue-2.3.2.tgz", + "integrity": "sha512-aAveo++GAghw09Ngc8Zzwxhj9mGaJfw8q40fDGFrVNxdrwrAjySIKHzlOSg5kw6WnEp4tUjhkMXDfCZWUhqmPA==", + "license": "MIT", + "dependencies": { + "@uiw/color-convert": "2.3.2", + "@uiw/react-color-alpha": "2.3.2" + }, + "funding": { + "url": "https://jaywcjlove.github.io/#/sponsor" + }, + "peerDependencies": { + "@babel/runtime": ">=7.19.0", + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@uiw/react-color-saturation": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@uiw/react-color-saturation/-/react-color-saturation-2.3.2.tgz", + "integrity": "sha512-aDKMhjylBUb4dH4oTQYz+U4mhpOebbQ2J0Y8y5aX1tfZ3fZuBqnXtWzu7Ffj3ksdKwkQHPddxT5IDTbAChF/og==", + "license": "MIT", + "dependencies": { + "@uiw/color-convert": "2.3.2", + "@uiw/react-drag-event-interactive": "2.3.2" + }, + "funding": { + "url": "https://jaywcjlove.github.io/#/sponsor" + }, + "peerDependencies": { + "@babel/runtime": ">=7.19.0", + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@uiw/react-drag-event-interactive": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@uiw/react-drag-event-interactive/-/react-drag-event-interactive-2.3.2.tgz", + "integrity": "sha512-lG5pJCtqbYBv7Dj0r12PE9q9yg7P2CzlQodw5ZHPY9GCSZVXHJc0g4lGvCbe/4Y8HYqM8aU4CYS8LplpX+mIQw==", + "license": "MIT", + "funding": { + "url": "https://jaywcjlove.github.io/#/sponsor" + }, + "peerDependencies": { + "@babel/runtime": ">=7.19.0", + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, "node_modules/@ungap/structured-clone": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", @@ -5865,6 +5978,12 @@ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", "license": "MIT" }, + "node_modules/property-expr": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/property-expr/-/property-expr-2.0.6.tgz", + "integrity": "sha512-SVtmxhRE/CGkn3eZY1T6pC8Nln6Fr/lu1mKSgRud0eC73whjGfoAogbn78LkD8aFL0zz3bAFerKSnOl7NlErBA==", + "license": "MIT" + }, "node_modules/proxy-from-env": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", @@ -5929,6 +6048,16 @@ "react-dom": "^16.x || ^17.x || ^18.x" } }, + "node_modules/react-colorful": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/react-colorful/-/react-colorful-5.6.1.tgz", + "integrity": "sha512-1exovf0uGTGyq5mXQT0zgQ80uvj2PCwvF8zY1RN9/vbJVSjSo3fsB/4L3ObbF7u70NduSiK4xu4Y6q1MHoUGEw==", + "license": "MIT", + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, "node_modules/react-dom": { "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", @@ -6583,6 +6712,12 @@ "dev": true, "license": "MIT" }, + "node_modules/tiny-case": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tiny-case/-/tiny-case-1.0.3.tgz", + "integrity": "sha512-Eet/eeMhkO6TX8mnUteS9zgPbUMQa4I6Kkp5ORiBD5476/m+PIRiumP5tmh5ioJpH7k51Kehawy2UDfsnxxY8Q==", + "license": "MIT" + }, "node_modules/to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", @@ -6605,6 +6740,12 @@ "node": ">=8.0" } }, + "node_modules/toposort": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/toposort/-/toposort-2.0.2.tgz", + "integrity": "sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg==", + "license": "MIT" + }, "node_modules/ts-api-utils": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", @@ -7031,6 +7172,30 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/yup": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/yup/-/yup-1.4.0.tgz", + "integrity": "sha512-wPbgkJRCqIf+OHyiTBQoJiP5PFuAXaWiJK6AmYkzQAh5/c2K9hzSApBZG5wV9KoKSePF7sAxmNSvh/13YHkFDg==", + "license": "MIT", + "dependencies": { + "property-expr": "^2.0.5", + "tiny-case": "^1.0.3", + "toposort": "^2.0.2", + "type-fest": "^2.19.0" + } + }, + "node_modules/yup/node_modules/type-fest": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/zustand": { "version": "4.5.5", "resolved": "https://registry.npmjs.org/zustand/-/zustand-4.5.5.tgz", diff --git a/web-interface/package.json b/web-interface/package.json index bd6d96f..2bf2027 100644 --- a/web-interface/package.json +++ b/web-interface/package.json @@ -12,22 +12,29 @@ "dependencies": { "@emotion/react": "^11.13.3", "@emotion/styled": "^11.13.0", + "@favware/syntax-highlighter-react": "^1.1.2", + "@hookform/resolvers": "^3.9.0", "@mui/icons-material": "^6.1.1", "@mui/material": "^6.1.1", "@mui/x-date-pickers": "7.18.0", "@mui/x-tree-view": "^7.18.0", "@tanstack/react-query": "^5.56.2", + "@uiw/react-codemirror": "^4.23.5", + "@uiw/react-color-colorful": "^2.3.2", "@xyflow/react": "^12.3.0", "axios": "^1.7.7", "idb-keyval": "^6.2.1", "immer": "^10.1.1", "lodash": "^4.17.21", + "prismjs": "^1.29.0", "react": "^18.2.0", "react-cmdk": "^1.3.9", + "react-colorful": "^5.6.1", "react-dom": "^18.2.0", "react-hook-form": "^7.53.0", "react-modal-promise": "^1.0.2", "uuid": "^9.0.1", + "yup": "^1.4.0", "zustand": "^4.5.5" }, "devDependencies": { diff --git a/web-interface/src/components/constants/behavior.json b/web-interface/src/components/constants/behavior.json new file mode 100644 index 0000000..ba0dc55 --- /dev/null +++ b/web-interface/src/components/constants/behavior.json @@ -0,0 +1,1077 @@ +{ + "AELIF": { + "type": "neurons", + "parameters": { + "tau": { + "type": "float", + "description": "time constant of voltage decay.", + "default": null + }, + "R": { + "type": "float", + "description": "the resistance of the membrane potential.", + "default": null + }, + "threshold": { + "type": "float", + "description": "the threshold of neurons to initiate spike.", + "default": null + }, + "v_reset": { + "type": "float", + "description": "immediate membrane potential after a spike.", + "default": null + }, + "v_rest": { + "type": "float", + "description": "neuron membrane potential in absent of input.", + "default": null + }, + "delta": { + "type": "float", + "description": "the constant defining the sharpness of exponential curve.", + "default": null + }, + "theta_rh": { + "type": "float", + "description": "The boosting threshold.", + "default": null + }, + "alpha": { + "type": "float", + "description": "subthreshold adaptation parameter.", + "default": null + }, + "beta": { + "type": "float", + "description": "spike-triggered adaptation parameter.", + "default": null + }, + "w_tau": { + "type": "float", + "description": "time constant of adaptation decay.", + "default": null + }, + "init_v": null, + "init_s": null, + "omega": null + } + }, + "ActivityBaseHomeostasis": { + "type": "neurons", + "parameters": { + "window_size": { + "type": "int", + "description": "The simulation steps to accumulate spikes.", + "default": null + }, + "activity_rate": { + "type": "int", + "description": " The expected number of spikes in a window.", + "default": null + }, + "updating_rate": { + "type": "float", + "description": "A scaler to change update effect with.", + "default": null + }, + "decay_rate": { + "type": "float", + "description": "A scaler to change updating_rate after each applied homeostasis. The default is 1.0", + "default": 1.0 + } + } + }, + "AveragePool2D": { + "type": "synapses", + "parameters": { + "current_coef": { + "type": "float", + "description": "Scalar coefficient that multiplies weights.", + "default": 1 + } + } + }, + "BaseDendriticInput": { + "type": "synapses", + "parameters": { + "current_coef": { + "type": "float", + "description": "Scalar coefficient that multiplies weights.", + "default": 1 + } + } + }, + "Conv2dDendriticInput": { + "type": "synapses", + "parameters": { + "current_coef": { + "type": "float", + "description": "Scalar coefficient that multiplies weights.", + "default": 1 + }, + "stride": { + "type": "int", + "description": "Stride of the convolution. The default is 1.", + "default": 1 + }, + "padding": { + "type": "int", + "description": "Padding added to both sides of the input. The default is 0.", + "default": 0 + } + } + }, + "Conv2dRSTDP": { + "type": "synapses", + "parameters": { + "a_plus": { + "type": "float", + "description": "Coefficient for the positive weight change. The default is None.", + "default": null + }, + "a_minus": { + "type": "float", + "description": "Coefficient for the negative weight change. The default is None.", + "default": null + }, + "tau_c": { + "type": "float", + "description": "Time constant for the eligibility trace. The default is None.", + "default": null + }, + "init_c_mode": { + "type": "int", + "description": "Initialization mode for the eligibility trace. The default is 0.", + "default": 0 + }, + "w_min": { + "type": "float", + "description": "Minimum for weights. The default is 0.0.", + "default": 0.0 + }, + "w_max": { + "type": "float", + "description": "Maximum for weights. The default is 1.0.", + "default": 1.0 + }, + "positive_bound": { + "type": "str or function", + "description": "Bounding mechanism for positive learning. Accepting \"no_bound\", \"hard_bound\" and \"soft_bound\". The default is \"no_bound\". \"weights\", \"w_min\" and \"w_max\" pass as arguments for a bounding function.", + "default": null + }, + "negative_bound": { + "type": "str or function", + "description": "Bounding mechanism for negative learning. Accepting \"no_bound\", \"hard_bound\" and \"soft_bound\". The default is \"no_bound\". \"weights\", \"w_min\" and \"w_max\" pass as arguments for a bounding function.", + "default": null + } + } + }, + "Conv2dSTDP": { + "type": "synapses", + "parameters": { + "a_plus": { + "type": "float", + "description": "Coefficient for the positive weight change. The default is None.", + "default": null + }, + "a_minus": { + "type": "float", + "description": "Coefficient for the negative weight change. The default is None.", + "default": null + }, + "w_min": { + "type": "float", + "description": "Minimum for weights. The default is 0.0.", + "default": 0.0 + }, + "w_max": { + "type": "float", + "description": "Maximum for weights. The default is 1.0.", + "default": 1.0 + }, + "positive_bound": { + "type": "str or function", + "description": "Bounding mechanism for positive learning. Accepting \"no_bound\", \"hard_bound\" and \"soft_bound\". The default is \"no_bound\". \"weights\", \"w_min\" and \"w_max\" pass as arguments for a bounding function.", + "default": null + }, + "negative_bound": { + "type": "str or function", + "description": "Bounding mechanism for negative learning. Accepting \"no_bound\", \"hard_bound\" and \"soft_bound\". The default is \"no_bound\". \"weights\", \"w_min\" and \"w_max\" pass as arguments for a bounding function.", + "default": null + } + } + }, + "CurrentNormalization": { + "type": "synapses", + "parameters": { + "norm": { + "type": "int", + "description": "Desired maximum of current for each neuron.", + "default": 1 + } + } + }, + "DelayInitializer": { + "type": "synapses", + "parameters": { + "mode": { + "type": "str or number", + "description": "string should be torch functions that fills a tensor like:", + "default": null + }, + "offset": { + "type": "int", + "description": "delay added to the all delays.", + "default": 0 + }, + "scale": { "type": "int", "description": "scales delay.", "default": 1 }, + "weights": { + "type": "tensor", + "description": "giving the delays directly.", + "default": null + }, + "destination": { + "type": "boolean", + "description": "True for destination neurons. defaults to False.", + "default": false + }, + "delays": null + } + }, + "Dopamine": { + "type": "network", + "parameters": { + "tau_dopamine": { + "type": "float", + "description": "Dopamine decay time constant.", + "default": 0.0 + }, + "initial_dopamine_concentration": { + "type": "float, optional", + "description": "Initial dopamine concentration", + "default": null + } + } + }, + "ELIF": { + "type": "neurons", + "parameters": { + "tau": { + "type": "float", + "description": "time constant of voltage decay.", + "default": null + }, + "R": { + "type": "float", + "description": "the resistance of the membrane potential.", + "default": null + }, + "threshold": { + "type": "float", + "description": "the threshold of neurons to initiate spike.", + "default": null + }, + "v_reset": { + "type": "float", + "description": "immediate membrane potential after a spike.", + "default": null + }, + "v_rest": { + "type": "float", + "description": "neuron membrane potential in absent of input.", + "default": null + }, + "delta": { + "type": "float", + "description": "the constant defining the sharpness of exponential curve.", + "default": null + }, + "theta_rh": { + "type": "float", + "description": "The boosting threshold. (rheobase)", + "default": null + }, + "init_v": null, + "init_s": null + } + }, + "Fire": { "type": "neurons", "parameters": {} }, + "InherentNoise": { + "type": "neurons", + "parameters": { + "mode": { + "type": "str", + "description": "Mode to be used in initialize the tensor. Accepts similar values to Pymonntorch's ", + "default": "rand" + }, + "scale": { + "type": "float", + "description": "Scale factor to multiply to the tensor. Default is 1.0.", + "default": 1 + }, + "offset": { + "type": "function", + "description": "An offset value to be added to the tensor. Default is 0.0.", + "default": 0 + } + } + }, + "KWTA": { + "type": "neurons", + "parameters": { + "k": { + "type": "int", + "description": "number of winners.", + "default": null + }, + "dimension": { + "type": "int", + "optional": true, + "description": "K-WTA on specific dimension. defaults to None.", + "default": null + } + } + }, + "LIF": { + "type": "neurons", + "parameters": { + "tau": { + "type": "float", + "description": "time constant of voltage decay.", + "default": null + }, + "R": { + "type": "float", + "description": "the resistance of the membrane potential.", + "default": null + }, + "threshold": { + "type": "float", + "description": "the threshold of neurons to initiate spike.", + "default": null + }, + "v_reset": { + "type": "float", + "description": "immediate membrane potential after a spike.", + "default": null + }, + "v_rest": { + "type": "float", + "description": "neuron membrane potential in absent of input.", + "default": null + }, + "init_v": null, + "init_s": null + } + }, + "LateralDendriticInput": { + "type": "synapses", + "parameters": { + "current_coef": { + "type": "float", + "description": "Scalar coefficient that multiplies weights.", + "default": 1 + }, + "inhibitory": { + "type": "bool or None", + "description": "If None, connection type respect the NeuronGroup type. if True, the effect in inhibitory and False is excitatory.", + "default": null + } + } + }, + "Local2dDendriticInput": { + "type": "synapses", + "parameters": { + "current_coef": { + "type": "float", + "description": "Scalar coefficient that multiplies weights.", + "default": 1 + }, + "stride": { + "type": "int", + "description": "Stride of the convolution. The default is 1.", + "default": 1 + }, + "padding": { + "type": "int", + "description": "Padding added to both sides of the input. The default is 0.", + "default": 0 + } + } + }, + "Local2dRSTDP": { + "type": "synapses", + "parameters": { + "a_plus": { + "type": "float", + "description": "Coefficient for the positive weight change. The default is None.", + "default": null + }, + "a_minus": { + "type": "float", + "description": "Coefficient for the negative weight change. The default is None.", + "default": null + }, + "tau_c": { + "type": "float", + "description": "Time constant for the eligibility trace. The default is None.", + "default": null + }, + "init_c_mode": { + "type": "int", + "description": "Initialization mode for the eligibility trace. The default is 0.", + "default": 0 + }, + "w_min": { + "type": "float", + "description": "Minimum for weights. The default is 0.0.", + "default": 0.0 + }, + "w_max": { + "type": "float", + "description": "Maximum for weights. The default is 1.0.", + "default": 1.0 + }, + "positive_bound": { + "type": "str or function", + "description": "Bounding mechanism for positive learning. Accepting \"no_bound\", \"hard_bound\" and \"soft_bound\". The default is \"no_bound\". \"weights\", \"w_min\" and \"w_max\" pass as arguments for a bounding function.", + "default": null + }, + "negative_bound": { + "type": "str or function", + "description": "Bounding mechanism for negative learning. Accepting \"no_bound\", \"hard_bound\" and \"soft_bound\". The default is \"no_bound\". \"weights\", \"w_min\" and \"w_max\" pass as arguments for a bounding function.", + "default": null + } + } + }, + "Local2dSTDP": { + "type": "synapses", + "parameters": { + "w_min": { + "type": "float", + "description": "Minimum for weights. The default is 0.0.", + "default": 0.0 + }, + "w_max": { + "type": "float", + "description": "Maximum for weights. The default is 1.0.", + "default": 1.0 + }, + "positive_bound": { + "type": "str or function", + "description": "Bounding mechanism for positive learning. Accepting \"no_bound\", \"hard_bound\" and \"soft_bound\". The default is \"no_bound\". \"weights\", \"w_min\" and \"w_max\" pass as arguments for a bounding function.", + "default": null + }, + "negative_bound": { + "type": "str or function", + "description": "Bounding mechanism for negative learning. Accepting \"no_bound\", \"hard_bound\" and \"soft_bound\". The default is \"no_bound\". \"weights\", \"w_min\" and \"w_max\" pass as arguments for a bounding function.", + "default": null + } + } + }, + "LocationSetter": { "type": "neurons", "parameters": {} }, + "NeuronAxon": { + "type": "neurons", + "parameters": { + "max_delay": { + "type": "int", + "description": "Maximum delay of all dendrites connected to the neurons. This value determines the delay buffer size.", + "default": 1 + }, + "proximal_min_delay": { + "type": "int", + "description": "Minimum delay of proximal dendrites. The default is 0.", + "default": 0 + }, + "distal_min_delay": { + "type": "int", + "description": "Minimum delay of distal dendrites. The default is 0.", + "default": 0 + }, + "apical_min_delay": { + "type": "int", + "description": "Minimum delay of apical dendrites. The default is 0.", + "default": 0 + }, + "have_trace": { + "type": "boolean", + "description": "whether to calculate trace or not. None checks if trace is available.", + "default": null + } + } + }, + "One2OneDendriticInput": { + "type": "synapses", + "parameters": { + "current_coef": { + "type": "float", + "description": "Scalar coefficient that multiplies weights.", + "default": 1 + } + } + }, + "One2OneRSTDP": { + "type": "synapses", + "parameters": { + "a_plus": { + "type": "float", + "description": "Coefficient for the positive weight change. The default is None.", + "default": null + }, + "a_minus": { + "type": "float", + "description": "Coefficient for the negative weight change. The default is None.", + "default": null + }, + "tau_c": { + "type": "float", + "description": "Time constant for the eligibility trace. The default is None.", + "default": null + }, + "init_c_mode": { + "type": "int", + "description": "Initialization mode for the eligibility trace. The default is 0.", + "default": 0 + }, + "w_min": { + "type": "float", + "description": "Minimum for weights. The default is 0.0.", + "default": 0.0 + }, + "w_max": { + "type": "float", + "description": "Maximum for weights. The default is 1.0.", + "default": 1.0 + }, + "positive_bound": { + "type": "str or function", + "description": "Bounding mechanism for positive learning. Accepting \"no_bound\", \"hard_bound\" and \"soft_bound\". The default is \"no_bound\". \"weights\", \"w_min\" and \"w_max\" pass as arguments for a bounding function.", + "default": null + }, + "negative_bound": { + "type": "str or function", + "description": "Bounding mechanism for negative learning. Accepting \"no_bound\", \"hard_bound\" and \"soft_bound\". The default is \"no_bound\". \"weights\", \"w_min\" and \"w_max\" pass as arguments for a bounding function.", + "default": null + } + } + }, + "One2OneSTDP": { + "type": "synapses", + "parameters": { + "w_min": { + "type": "float", + "description": "Minimum for weights. The default is 0.0.", + "default": 0.0 + }, + "w_max": { + "type": "float", + "description": "Maximum for weights. The default is 1.0.", + "default": 1.0 + }, + "a_plus": { + "type": "float", + "description": "Coefficient for the positive weight change. The default is None.", + "default": null + }, + "a_minus": { + "type": "float", + "description": "Coefficient for the negative weight change. The default is None.", + "default": null + }, + "positive_bound": { + "type": "str or function", + "description": "Bounding mechanism for positive learning. Accepting \"no_bound\", \"hard_bound\" and \"soft_bound\". The default is \"no_bound\". \"weights\", \"w_min\" and \"w_max\" pass as arguments for a bounding function.", + "default": null + }, + "negative_bound": { + "type": "str or function", + "description": "Bounding mechanism for negative learning. Accepting \"no_bound\", \"hard_bound\" and \"soft_bound\". The default is \"no_bound\". \"weights\", \"w_min\" and \"w_max\" pass as arguments for a bounding function.", + "default": null + } + } + }, + "One2OneiSTDP": { + "type": "synapses", + "parameters": { + "lr": { + "type": "float", + "description": "Learning rate. The Default is 1e-5.", + "default": 1e-5 + }, + "rho": { + "type": "float", + "description": "Constant that determines the fire rate of target neurons.", + "default": null + }, + "alpha": { + "type": "float", + "description": "Manual constant for target trace, which replace rho value.", + "default": null + }, + "is_inhibitory": null + } + }, + "Payoff": { + "type": "network", + "parameters": { + "initial_payoff": { + "type": "float", + "description": "Initial reward/punishment value. Default is 0.0.", + "default": 0.0 + } + } + }, + "SensorySetter": { "type": "neurons", "parameters": {} }, + "SimpleDendriteComputation": { + "type": "neurons", + "parameters": { + "apical_provocativeness": { + "type": "float", + "description": "The strength of the apical dendrites. The default is None.", + "default": null + }, + "distal_provocativeness": { + "type": "float", + "description": "The strength of the distal dendrites. The default is None.", + "default": null + }, + "I_tau": { + "type": "float", + "description": "Decaying factor to current. If None, at each step, current falls to zero.", + "default": null + } + } + }, + "SimpleDendriteStructure": { + "type": "neurons", + "parameters": { + "proximal_max_delay": { + "type": "int", + "description": "Maximum delay of proximal dendrites. The default is 1. Set this to 0 to discard Proximal dendrite.", + "default": null + }, + "distal_max_delay": { + "type": "int", + "description": "Maximum delay of distal dendrites. The default is 1. Set this to 0 to discard Distal dendrite.", + "default": null + }, + "apical_max_delay": { + "type": "int", + "description": "Maximum delay of distal dendrites. The default is ", + "default": null + }, + "proximal_min_delay": { + "type": "int", + "description": "Minimum delay of proximal dendrites. The default is 0.", + "default": 0 + }, + "distal_min_delay": { + "type": "int", + "description": "Minimum delay of distal dendrites. The default is 0.", + "default": 0 + }, + "apical_min_delay": { + "type": "int", + "description": "Minimum delay of apical dendrites. The default is ", + "default": null + }, + "Proximal_max_delay": null, + "Distal_max_delay": null, + "Apical_max_delay": null + } + }, + "SimpleDendriticInput": { + "type": "synapses", + "parameters": { + "current_coef": { + "type": "float", + "description": "Scalar coefficient that multiplies weights.", + "default": 1 + } + } + }, + "SimpleRSTDP": { + "type": "synapses", + "parameters": { + "a_plus": { + "type": "float", + "description": "Coefficient for the positive weight change. The default is None.", + "default": null + }, + "a_minus": { + "type": "float", + "description": "Coefficient for the negative weight change. The default is None.", + "default": null + }, + "tau_c": { + "type": "float", + "description": "Time constant for the eligibility trace. The default is None.", + "default": null + }, + "init_c_mode": { + "type": "int", + "description": "Initialization mode for the eligibility trace. The default is 0.", + "default": 0 + }, + "w_min": { + "type": "float", + "description": "Minimum for weights. The default is 0.0.", + "default": 0.0 + }, + "w_max": { + "type": "float", + "description": "Maximum for weights. The default is 1.0.", + "default": 1.0 + }, + "positive_bound": { + "type": "str or function", + "description": "Bounding mechanism for positive learning. Accepting \"no_bound\", \"hard_bound\" and \"soft_bound\". The default is \"no_bound\". \"weights\", \"w_min\" and \"w_max\" pass as arguments for a bounding function.", + "default": null + }, + "negative_bound": { + "type": "str or function", + "description": "Bounding mechanism for negative learning. Accepting \"no_bound\", \"hard_bound\" and \"soft_bound\". The default is \"no_bound\". \"weights\", \"w_min\" and \"w_max\" pass as arguments for a bounding function.", + "default": null + } + } + }, + "SimpleSTDP": { + "type": "synapses", + "parameters": { + "w_min": { + "type": "float", + "description": "Minimum for weights. The default is 0.0.", + "default": 0.0 + }, + "w_max": { + "type": "float", + "description": "Maximum for weights. The default is 1.0.", + "default": 1.0 + }, + "a_plus": { + "type": "float", + "description": "Coefficient for the positive weight change. The default is None.", + "default": null + }, + "a_minus": { + "type": "float", + "description": "Coefficient for the negative weight change. The default is None.", + "default": null + }, + "positive_bound": { + "type": "str or function", + "description": "Bounding mechanism for positive learning. Accepting \"no_bound\", \"hard_bound\" and \"soft_bound\". The default is \"no_bound\". \"weights\", \"w_min\" and \"w_max\" pass as arguments for a bounding function.", + "default": null + }, + "negative_bound": { + "type": "str or function", + "description": "Bounding mechanism for negative learning. Accepting \"no_bound\", \"hard_bound\" and \"soft_bound\". The default is \"no_bound\". \"weights\", \"w_min\" and \"w_max\" pass as arguments for a bounding function.", + "default": null + } + } + }, + "SimpleiSTDP": { + "type": "synapses", + "parameters": { + "lr": { + "type": "float", + "description": "Learning rate. The Default is 1e-5.", + "default": 1e-5 + }, + "rho": { + "type": "float", + "description": "Constant that determines the fire rate of target neurons.", + "default": null + }, + "alpha": { + "type": "float", + "description": "Manual constant for target trace, which replace rho value.", + "default": null + }, + "is_inhibitory": null + } + }, + "SparseDendriticInput": { + "type": "synapses", + "parameters": { + "current_coef": { + "type": "float", + "description": "Scalar coefficient that multiplies weights.", + "default": 1 + } + } + }, + "SparseRSTDP": { + "type": "synapses", + "parameters": { + "a_plus": { + "type": "float", + "description": "Coefficient for the positive weight change. The default is None.", + "default": null + }, + "a_minus": { + "type": "float", + "description": "Coefficient for the negative weight change. The default is None.", + "default": null + }, + "tau_c": { + "type": "float", + "description": "Time constant for the eligibility trace. The default is None.", + "default": null + }, + "init_c_mode": { + "type": "int", + "description": "Initialization mode for the eligibility trace. The default is 0.", + "default": 0 + }, + "w_min": { + "type": "float", + "description": "Minimum for weights. The default is 0.0.", + "default": 0.0 + }, + "w_max": { + "type": "float", + "description": "Maximum for weights. The default is 1.0.", + "default": 1.0 + }, + "positive_bound": { + "type": "str or function", + "description": "Bounding mechanism for positive learning. Accepting \"no_bound\", \"hard_bound\" and \"soft_bound\". The default is \"no_bound\". \"weights\", \"w_min\" and \"w_max\" pass as arguments for a bounding function.", + "default": null + }, + "negative_bound": { + "type": "str or function", + "description": "Bounding mechanism for negative learning. Accepting \"no_bound\", \"hard_bound\" and \"soft_bound\". The default is \"no_bound\". \"weights\", \"w_min\" and \"w_max\" pass as arguments for a bounding function.", + "default": null + } + } + }, + "SparseSTDP": { + "type": "synapses", + "parameters": { + "w_min": { + "type": "float", + "description": "Minimum for weights. The default is 0.0.", + "default": 0.0 + }, + "w_max": { + "type": "float", + "description": "Maximum for weights. The default is 1.0.", + "default": 1.0 + }, + "a_plus": { + "type": "float", + "description": "Coefficient for the positive weight change. The default is None.", + "default": null + }, + "a_minus": { + "type": "float", + "description": "Coefficient for the negative weight change. The default is None.", + "default": null + }, + "positive_bound": { + "type": "str or function", + "description": "Bounding mechanism for positive learning. Accepting \"no_bound\", \"hard_bound\" and \"soft_bound\". The default is \"no_bound\". \"weights\", \"w_min\" and \"w_max\" pass as arguments for a bounding function.", + "default": null + }, + "negative_bound": { + "type": "str or function", + "description": "Bounding mechanism for negative learning. Accepting \"no_bound\", \"hard_bound\" and \"soft_bound\". The default is \"no_bound\". \"weights\", \"w_min\" and \"w_max\" pass as arguments for a bounding function.", + "default": null + } + } + }, + "SparseiSTDP": { + "type": "synapses", + "parameters": { + "lr": { + "type": "float", + "description": "Learning rate. The Default is 1e-5.", + "default": 1e-5 + }, + "rho": { + "type": "float", + "description": "Constant that determines the fire rate of target neurons.", + "default": null + }, + "alpha": { + "type": "float", + "description": "Manual constant for target trace, which replace rho value.", + "default": null + }, + "is_inhibitory": null + } + }, + "SpikeNdDataset": { + "type": "layer", + "parameters": { + "dataloader": { + "type": "Dataloader", + "description": "A pytorch dataloader kind returning up to a triole of (sensory, location, label).", + "default": null + }, + "ndim_sensory": { + "type": "int", + "description": "Sensory's number of dimension refering to a single instance.", + "default": 2 + }, + "ndim_location": { + "type": "int", + "description": "Location's number of dimension refering to a single instance.", + "default": 2 + }, + "have_location": { + "type": "bool", + "description": "Whether dataloader returns location input.", + "default": false + }, + "have_sensory": { + "type": "bool", + "description": "Whether dataloader returns sensory input.", + "default": true + }, + "have_label": { + "type": "bool", + "description": "Whether dataloader returns label of input.", + "default": true + }, + "silent_interval": { + "type": "int", + "description": "The interval of silent activity between two different input.", + "default": 0 + }, + "instance_duration": { + "type": "int", + "description": "The duration of each instance of input with same target value.", + "default": null + }, + "loop": { + "type": "bool", + "description": "If True, dataloader repeats.", + "default": true + } + } + }, + "SpikeTrace": { + "type": "neurons", + "parameters": { + "tau_s": { + "type": "float", + "description": "decay term for spike trace. The default is None.", + "default": null + } + } + }, + "SynapseInit": { "type": "synapses", "parameters": {} }, + "TimeResolution": { + "type": "network", + "parameters": { + "dt": { + "type": "float", + "description": "Initial iteration time resolution. Default is 1", + "default": 1 + } + } + }, + "VoltageBaseHomeostasis": { + "type": "neurons", + "parameters": { + "target_voltage": { + "type": "float", + "description": "The expected voltage of neuron. Defaults to None.", + "default": null + }, + "max_ta": { + "type": "float", + "description": "The desired maximum voltage for a neuron. If not provided, the value of target_voltage is used.", + "default": null + }, + "min_ta": { + "type": "float", + "description": "The desired minimum voltage for a neuron. If not provided, the value of target_voltage is used.", + "default": null + }, + "eta_ip": { + "type": "flaot", + "description": "The updating speed of the homeostasis process. The default is 0.001.", + "default": 0.001 + } + } + }, + "WeightClip": { + "type": "synapses", + "parameters": { + "w_min": { + "type": "float", + "description": "Minimum weight constraint.", + "default": 0 + }, + "w_max": { + "type": "float", + "description": "Maximum weight constraint.", + "default": 1 + } + } + }, + "WeightInitializer": { + "type": "synapses", + "parameters": { + "mode": { + "type": "str or number", + "description": "string should be torch functions that fills a tensor like:", + "default": null + }, + "scale": { + "type": "float", + "description": "Scaling factor to apply on the weight.", + "default": 1 + }, + "offset": { + "type": "float", + "description": "An offset to add to the weight.", + "default": 0 + }, + "function": { + "type": "callable", + "description": "A function to apply on weight.", + "default": null + }, + "density": { + "type": "flaot", + "description": "The sparsity of weights. default is one.", + "default": 1 + }, + "true_sparsity": { + "type": "bool", + "description": "If false, weights are created but have zero value. Defaults to True.", + "default": true + }, + "weights": { + "type": "tensor", + "description": "Optional parameter to specify the weights matrix directly.", + "default": null + }, + "weight_shape": { + "type": "tuple", + "description": "Optional parameter to specify the shape of the weights tensor.", + "default": null + }, + "kernel_shape": { + "type": "tuple", + "description": "Optional parameter to specify the shape of the kernel.", + "default": null + } + } + }, + "WeightNormalization": { + "type": "synapses", + "parameters": { + "norm": { + "type": "int", + "description": "Desired sum of weights for each neuron.", + "default": 1 + } + } + } +} diff --git a/web-interface/src/components/constants/export.ts b/web-interface/src/components/constants/export.ts new file mode 100644 index 0000000..3616802 --- /dev/null +++ b/web-interface/src/components/constants/export.ts @@ -0,0 +1,31 @@ +const currentDate = () => { + const currentdate = new Date(); + const datetime = + 'Last_export: ' + + currentdate.getDate() + + '/' + + (currentdate.getMonth() + 1) + + '/' + + currentdate.getFullYear() + + '_@_' + + currentdate.getHours() + + ':' + + currentdate.getMinutes() + + ':' + + currentdate.getSeconds(); + + return datetime; +}; + +const exportData = data => { + const jsonString = `data:text/json;chatset=utf-8,${encodeURIComponent(JSON.stringify(data))}`; + const link = document.createElement('a'); + link.href = jsonString; + link.download = `${currentDate()}.json`; + + link.click(); + + document.body.removeChild(link); +}; + +export default exportData; diff --git a/web-interface/src/components/hookForm/codeHighlighter.tsx b/web-interface/src/components/hookForm/codeHighlighter.tsx new file mode 100644 index 0000000..a55d718 --- /dev/null +++ b/web-interface/src/components/hookForm/codeHighlighter.tsx @@ -0,0 +1,56 @@ +import React, { useEffect, useState } from 'react'; +import { TextField, Box, ClickAwayListener } from '@mui/material'; +import Prism from 'prismjs'; // Import Prism.js +import 'prismjs/themes/prism.css'; // Import Prism.js CSS for styling +import 'prismjs/components/prism-javascript.min.js'; // Import necessary languages + +const CodeHighlighter = ({ item, register, errors, getValues }) => { + const [code, setCode] = useState('// Write your code here'); + const [editing, setEditing] = useState(false); + + useEffect(() => { + if (!editing) { + Prism.highlightAll(); // Highlight the code only when not editing + } + }, [code, editing]); + + return ( + + {editing && ( + setEditing(false)}> + + + )} + {!editing && ( + setEditing(true)} + > + {getValues(item.id) || item.value} + + )} + + ); +}; + +export default CodeHighlighter; diff --git a/web-interface/src/components/hookForm/form.tsx b/web-interface/src/components/hookForm/form.tsx new file mode 100644 index 0000000..cd4791f --- /dev/null +++ b/web-interface/src/components/hookForm/form.tsx @@ -0,0 +1,106 @@ +import { Box, Button, IconButton, Stack, styled, TextField } from '@mui/material'; +import { fullSizeStyle } from '../../styles/BaseComponents'; +import { useEffect, useState } from 'react'; +import { yupResolver } from '@hookform/resolvers/yup'; +import BackspaceTwoToneIcon from '@mui/icons-material/BackspaceTwoTone'; + +import * as yup from 'yup'; +import { createYupSchema } from './yupSchemaCreator'; +import { formData } from './formData'; +import { useForm } from 'react-hook-form'; +import RenderItem from './renderItem'; + +const Container = styled(Box)(() => ({ + ...fullSizeStyle, + display: 'grid', + gridTemplateColumns: '100%', + gridTemplateRows: '50px calc(100% - 132px) 50px', + gap: '16px', + padding: '4px', +})); + +const CustomForm = ({ fields = formData.ng, onSubmit, id = '0' }) => { + const [searchText, setSearchText] = useState(''); + + const yupSchema = fields.reduce(createYupSchema, {}); + const validateSchema = yup.object().shape(yupSchema); + + const { + register, + handleSubmit, + getValues, + setValue, + watch, + reset, + formState: { errors }, + } = useForm({ + resolver: yupResolver(validateSchema), + defaultValues: fields.reduce((acc, field) => { + acc[field.id] = field.value; + + return acc; + }, {}), + }); + + useEffect(() => { + const defaultValues = fields.reduce((acc, field) => { + acc[field.id] = field.value; + return acc; + }, {}); + + reset(defaultValues); // Reset the form with new default values + }, [id, fields, reset]); + + const search = (items, key) => { + if (!key) return [...items]; // Return original items if searchText is empty + return items.filter(item => { + return item.label.toLowerCase().includes(key.toLowerCase()); + }); + }; + + return ( + + + setSearchText('')}> + + + ), + }, + }} + onChange={e => { + setSearchText(e.target.value); + }} + /> + + + {search(fields, searchText).map(item => ( + + ))} + + + + + + ); +}; + +export default CustomForm; diff --git a/web-interface/src/components/hookForm/formData.ts b/web-interface/src/components/hookForm/formData.ts new file mode 100644 index 0000000..2b39b70 --- /dev/null +++ b/web-interface/src/components/hookForm/formData.ts @@ -0,0 +1,74 @@ +export const formData = { + ng: { + Number: { + id: 'Number', + label: 'Number', + placeholder: 'Float/int', + type: 'number', + validationType: 'number', + value: '2.56', + + validations: [ + // { + // type: 'required', + // params: ['this field is required'], + // }, + // { + // type: 'min', + // params: [5, 'name cannot be less than 5 characters'], + // }, + // { + // type: 'max', + // params: [10, 'name cannot be more than 10 characters'], + // }, + ], + }, + String: { + id: 'String', + label: 'String', + placeholder: 'String', + type: 'string', + validationType: 'string', + value: 'something', + validations: [ + // { + // type: 'required', + // params: ['this field is required'], + // }, + ], + }, + Code: { + id: 'Code', + label: 'Code', + placeholder: 'Float/int', + type: 'code', + validationType: 'string', + value: 'text = "Hello world!"\nprint(text)', + validations: [ + // { + // type: 'required', + // params: ['this field is required'], + // }, + ], + }, + Selectable: { + id: 'Selectable', + label: 'Selectable', + placeholder: 'Select', + type: 'selectable', + validationType: 'string', + value: '', + options: [ + { value: 1, label: '1' }, + { value: 2, label: '2' }, + { value: 3, label: '3' }, + ], + validations: [ + { + type: 'required', + params: ['this field is required'], + }, + ], + }, + }, +}; diff --git a/web-interface/src/components/hookForm/renderItem.tsx b/web-interface/src/components/hookForm/renderItem.tsx new file mode 100644 index 0000000..756fc9f --- /dev/null +++ b/web-interface/src/components/hookForm/renderItem.tsx @@ -0,0 +1,56 @@ +import { FormControl, FormHelperText, InputLabel, MenuItem, Select, TextField } from '@mui/material'; +import CodeHighlighter from './codeHighlighter'; +const textFieldTypes = ['number', 'text', 'password', 'string']; +const codeFieldTypes = ['code']; +const selectFieldTypes = ['selectable']; + +const RenderItem = ({ item, register, errors, getValues, setValue, watch }) => { + if (textFieldTypes.includes(item.type)) + return ( + <> + + + ); + if (codeFieldTypes.includes(item.type)) + return ; + + if (selectFieldTypes.includes(item.type)) + return ( + + + {item.label} + + + {errors[item.id]?.message && {errors[item.id]?.message}} + + ); +}; + +export default RenderItem; diff --git a/web-interface/src/components/hookForm/yupSchemaCreator.tsx b/web-interface/src/components/hookForm/yupSchemaCreator.tsx new file mode 100644 index 0000000..c3fc0a9 --- /dev/null +++ b/web-interface/src/components/hookForm/yupSchemaCreator.tsx @@ -0,0 +1,19 @@ +import * as yup from 'yup'; + +export function createYupSchema(schema, config) { + const { id, validationType, validations = [] } = config; + if (!yup[validationType]) { + return schema; + } + let validator = yup[validationType](); + validations.forEach(validation => { + const { params, type } = validation; + if (!validator[type]) { + return; + } + // console.log(type, params); + validator = validator[type](...params); + }); + schema[id] = validator; + return schema; +} diff --git a/web-interface/src/components/react-flow/nodes/input-port.tsx b/web-interface/src/components/react-flow/nodes/input-port.tsx index b3c883b..0430d17 100644 --- a/web-interface/src/components/react-flow/nodes/input-port.tsx +++ b/web-interface/src/components/react-flow/nodes/input-port.tsx @@ -2,11 +2,20 @@ import LastPageRoundedIcon from '@mui/icons-material/LastPageRounded'; import { Stack, SvgIcon } from '@mui/material'; import { Handle, NodeProps, Position } from '@xyflow/react'; import type { ReactFlowAppNode } from '../../../stores/types'; +import useReactFlowStore from '../../../stores/react-flow'; +import { useShallow } from 'zustand/react/shallow'; +import { drawer, infoDrawer } from '../../../stores/app-states'; +const selector = (state: ReactFlowAppStoreState) => ({ + selectedNodeID: state.selectedNodeID, + setSelectedNodeID: state.setSelectedNodeID, +}); export const NODE_TYPE = 'i'; export const DEFAULT_COLOR = '#7cb342'; export const CustomNode = ({ id, data }: NodeProps) => { + const { selectedNodeID, setSelectedNodeID } = useReactFlowStore(useShallow(selector)); + return ( <> ) => { alignItems: 'center', fontSize: '0.6rem', color: '#fff', + boxShadow: selectedNodeID == id ? '10px 5px 5px gray' : null, + }} + onClick={() => setSelectedNodeID(id)} + onDoubleClick={() => { + drawer.setOpen(false); + infoDrawer.setID(id); }} > diff --git a/web-interface/src/components/react-flow/nodes/neuron-group.tsx b/web-interface/src/components/react-flow/nodes/neuron-group.tsx index e08a520..a4e396a 100644 --- a/web-interface/src/components/react-flow/nodes/neuron-group.tsx +++ b/web-interface/src/components/react-flow/nodes/neuron-group.tsx @@ -2,11 +2,16 @@ import { Stack } from '@mui/material'; import { Handle, NodeProps, NodeToolbar, Position } from '@xyflow/react'; import { useMemo } from 'react'; import useReactFlowStore from '../../../stores/react-flow'; -import { ReactFlowAppNode } from '../../../stores/types'; +import { ReactFlowAppNode, ReactFlowAppStoreState } from '../../../stores/types'; +import { useShallow } from 'zustand/react/shallow'; +import { drawer, infoDrawer } from '../../../stores/app-states'; +const selector = (state: ReactFlowAppStoreState) => ({ + selectedNodeID: state.selectedNodeID, + setSelectedNodeID: state.setSelectedNodeID, +}); export const NODE_TYPE = 'ng'; export const DEFAULT_COLOR = '#ff0072'; - export const CustomNode = ({ id, data }: NodeProps) => { // TODO: increase by 10 // TODO: update relative height of the box to its node indexes @@ -22,6 +27,7 @@ export const CustomNode = ({ id, data }: NodeProps) => { b: { top: 20 }, }; }, []); + const { selectedNodeID, setSelectedNodeID } = useReactFlowStore(useShallow(selector)); return ( <> @@ -47,6 +53,12 @@ export const CustomNode = ({ id, data }: NodeProps) => { alignItems: 'center', fontSize: '0.6rem', color: '#fff', + boxShadow: selectedNodeID == id ? '10px 5px 5px gray' : null, + }} + onClick={() => setSelectedNodeID(id)} + onDoubleClick={() => { + drawer.setOpen(false); + infoDrawer.setID(id); }} > {data.label} diff --git a/web-interface/src/components/react-flow/nodes/output-port.tsx b/web-interface/src/components/react-flow/nodes/output-port.tsx index 9cf3176..4c131d5 100644 --- a/web-interface/src/components/react-flow/nodes/output-port.tsx +++ b/web-interface/src/components/react-flow/nodes/output-port.tsx @@ -1,12 +1,22 @@ import FirstPageRoundedIcon from '@mui/icons-material/FirstPageRounded'; import { Stack, SvgIcon } from '@mui/material'; import { Handle, NodeProps, Position } from '@xyflow/react'; -import { ReactFlowAppNode } from '../../../stores/types'; +import { ReactFlowAppNode, ReactFlowAppStoreState } from '../../../stores/types'; +import useReactFlowStore from '../../../stores/react-flow'; +import { useShallow } from 'zustand/react/shallow'; +import { drawer, infoDrawer } from '../../../stores/app-states'; export const NODE_TYPE = 'o'; export const DEFAULT_COLOR = '#f4511e'; +const selector = (state: ReactFlowAppStoreState) => ({ + selectedNodeID: state.selectedNodeID, + setSelectedNodeID: state.setSelectedNodeID, +}); + export const CustomNode = ({ id, data }: NodeProps) => { + const { selectedNodeID, setSelectedNodeID } = useReactFlowStore(useShallow(selector)); + return ( <> ) => { alignItems: 'center', fontSize: '0.6rem', color: '#fff', + boxShadow: selectedNodeID == id ? '10px 5px 5px gray' : null, + }} + onClick={() => setSelectedNodeID(id)} + onDoubleClick={() => { + drawer.setOpen(false); + infoDrawer.setID(id); }} > diff --git a/web-interface/src/components/settings/resizable-drawer.tsx b/web-interface/src/components/settings/resizable-drawer.tsx index d92dce2..51ca319 100644 --- a/web-interface/src/components/settings/resizable-drawer.tsx +++ b/web-interface/src/components/settings/resizable-drawer.tsx @@ -1,8 +1,10 @@ -import { Box, DrawerProps } from '@mui/material'; +import { alpha, Box, DrawerProps } from '@mui/material'; import Drawer from '@mui/material/Drawer'; import { useCallback, useState } from 'react'; +import { DRAWER_WIDTH } from './constants'; +import { treeItemClasses } from '@mui/x-tree-view/TreeItem'; -export const defaultDrawerWidth = 240; +export const defaultDrawerWidth = DRAWER_WIDTH; const minDrawerWidth = 300; const maxDrawerWidth = 500; @@ -15,7 +17,7 @@ export default function ResizableDrawer({ children, sx, ...props }: DrawerProps) }; const handleMouseMove = useCallback((e: MouseEvent) => { - const newWidth = document.body.clientWidth - e.clientX - document.body.clientLeft; + const newWidth = document.body.clientWidth - e.clientX - document.body.clientLeft + 20; if (newWidth > minDrawerWidth && newWidth < maxDrawerWidth) { setDrawerWidth(newWidth); } @@ -24,8 +26,18 @@ export default function ResizableDrawer({ children, sx, ...props }: DrawerProps) return ( (({ threerows = false }) => ({ + display: 'grid', + gridTemplateRows: threerows ? '40px calc(100% - 100px) 40px' : '40px calc(100% - 50px)', + gridTemplateColumns: '100%', + gap: '10px', + height: '100%', +})); export const Settings = () => { useStateToggleShortcutOn(shortcuts.drawer, drawer.setOpen); + const nodes = useReactFlowStore(useShallow(state => state.nodes)); + const updateNode = useReactFlowStore(useShallow(state => state.updateNode)); + const id = infoDrawer.useStore().ID; + const [nodeFields, setNodeFields] = useState([]); + + const handleExport = nodes => { + exportData(nodes); + }; + + const onSubmit = data => { + if (id) updateNode(id, { ...nodes.filter(item => item.id == id)[0]?.data, ...data }); + }; + + useEffect(() => { + const newForm = JSON.parse(JSON.stringify(formData.ng)); + + if (id) { + const nodeData = nodes.filter(item => item.id == id)[0]?.data; + for (const item in nodeData) { + if (newForm[item]) { + newForm[item].value = nodeData[item]; + } + } + setNodeFields(Object.values(newForm)); + } + }, [id, nodes]); return ( - - - + <> + + + + + + + + + + + + + + + + {infoDrawer.useStore().ID}: + + + + + + + + ); }; diff --git a/web-interface/src/components/settings/tree-view/color-picker.tsx b/web-interface/src/components/settings/tree-view/color-picker.tsx new file mode 100644 index 0000000..6ae1c1d --- /dev/null +++ b/web-interface/src/components/settings/tree-view/color-picker.tsx @@ -0,0 +1,94 @@ +import { BoxProps, styled, Button, Popover, Typography, Tooltip } from '@mui/material'; +import React from 'react'; +import { HexColorPicker } from 'react-colorful'; + +interface ColorPickerProps extends BoxProps { + color?: string; + width?: number; +} + +const ColorPickerButton = styled(Button)(({ theme, color, width }) => ({ + borderRadius: `${(width || 10) / 2}px`, + height: width, + padding: 0, + minWidth: 0, + aspectRatio: 1, + backgroundColor: color || 'yellow', + marginRight: '8px', + boxSizing: 'border-box', + + '&:hover': { + cursor: 'pointer', + }, +})); + +export const ColorPicker = ({ color, width = 14, onChangeColor }) => { + const [anchorEl, setAnchorEl] = React.useState(null); + + const handleClick = (event: React.MouseEvent) => { + setAnchorEl(event.currentTarget); + }; + + const handleClose = () => { + setAnchorEl(null); + }; + + const open = Boolean(anchorEl); + const id = open ? 'simple-popover' : undefined; + + return ( + <> + + + + + { + onChangeColor && onChangeColor(color); + }} + /> + + + ); +}; +export default ColorPicker; diff --git a/web-interface/src/components/settings/tree-view/node-tree-view.tsx b/web-interface/src/components/settings/tree-view/node-tree-view.tsx index 5ce06b8..2d73926 100644 --- a/web-interface/src/components/settings/tree-view/node-tree-view.tsx +++ b/web-interface/src/components/settings/tree-view/node-tree-view.tsx @@ -1,15 +1,41 @@ import { useShallow } from 'zustand/react/shallow'; import useReactFlowStore from '../../../stores/react-flow'; import { TreeItem } from './tree-item'; +import { infoDrawer, drawer } from '../../../stores/app-states'; +import { ReactFlowAppNode } from '../../../stores/types.ts'; export const NodeTreeView = () => { const nodes = useReactFlowStore(useShallow(state => state.nodes)); - console.log(nodes); + const updateNode = useReactFlowStore(useShallow(state => state.updateNode)); + const selectedNodeID = useReactFlowStore(useShallow(state => state.selectedNodeID)); + const setSelectedNodeID = useReactFlowStore(useShallow(state => state.setSelectedNodeID)); + // console.log(nodes); + const handleChangeColor = (item: ReactFlowAppNode, color: string) => { + updateNode(item.id, { ...item.data, color }); + }; + const handleChangeLabel = (item: ReactFlowAppNode, label: string) => { + updateNode(item.id, { ...item.data, label }); + }; + const handleEdit = (id: string | null) => { + setSelectedNodeID(id); + drawer.setOpen(false); + infoDrawer.setID(id); + }; return ( {nodes.map(item => ( - + handleChangeColor(item, color)} + onChangeLabel={label => handleChangeLabel(item, label)} + onClick={() => setSelectedNodeID(item.id)} + onEditClick={() => handleEdit(item.id)} + /> ))} ); diff --git a/web-interface/src/components/settings/tree-view/tree-item.tsx b/web-interface/src/components/settings/tree-view/tree-item.tsx index 7324f96..118b83a 100644 --- a/web-interface/src/components/settings/tree-view/tree-item.tsx +++ b/web-interface/src/components/settings/tree-view/tree-item.tsx @@ -9,11 +9,18 @@ import clsx from 'clsx'; import { omit, pick } from 'lodash/fp'; import * as React from 'react'; import { RESET_STYLE_TREE_VIEW } from './constants'; -import { MoreSettings } from './more-settings'; +// import { MoreSettings } from './more-settings'; import * as components from './styled-components'; +import ColorPicker from './color-picker'; +import { Checkbox, ClickAwayListener, IconButton, Tooltip } from '@mui/material'; +import EditNoteIcon from '@mui/icons-material/EditNote'; interface StyledTreeItemProps extends Omit, React.HTMLAttributes { moreSettingProps?: any; // for more setting menu function calls + onChangeColor?: (color: string) => void; + onChangeLabel?: (newName: string) => void; + onEditClick?: () => void; + selected?: boolean; } export const TreeItem = React.forwardRef(function TreeItem( @@ -21,11 +28,23 @@ export const TreeItem = React.forwardRef(function TreeItem( rootRef: React.Ref, ) { // NOTE: Select out all child StyledTreeItemProps from props - const { itemId, children, moreSettingProps, ...other } = props; + const [isEditing, setIsEditing] = React.useState(false); + + const { itemId, children, moreSettingProps, color, onChangeColor, onChangeLabel, onEditClick, selected, ...other } = + props; const logicProps = ['id', 'itemId', 'children', 'label', 'disabled'] as const; const bypassedProps = omit(logicProps, other); const { status, ...treeItem } = useTreeItem({ ...pick(logicProps, props), rootRef }); + const stopPropagation = (event: React.MouseEvent) => { + event.stopPropagation(); + }; + + const handleEdit = (event: React.MouseEvent) => { + event.stopPropagation(); + onChangeLabel && setIsEditing(true); + }; + return ( @@ -38,17 +57,62 @@ export const TreeItem = React.forwardRef(function TreeItem( }), })} > - - - - - - {!moreSettingProps && } + + + + + + {color && ( + { + onChangeColor && onChangeColor(color); + }} + /> + )} + {isEditing && onChangeLabel ? ( + setIsEditing(false)}> + { + e.stopPropagation(); + onChangeLabel && onChangeLabel(e.target.value); + }} + onKeyDown={e => { + e.stopPropagation(); + if (e.key == 'Enter') { + setIsEditing(false); + } + }} + /> + + ) : ( + + + + )} + + {/* {!moreSettingProps && } */} + {onEditClick && ( + onEditClick()}> + + + )} {children && } diff --git a/web-interface/src/components/settings/tree-view/tree-view.tsx b/web-interface/src/components/settings/tree-view/tree-view.tsx index 8f6aa5d..6a511bb 100644 --- a/web-interface/src/components/settings/tree-view/tree-view.tsx +++ b/web-interface/src/components/settings/tree-view/tree-view.tsx @@ -3,42 +3,28 @@ import DisabledByDefaultRoundedIcon from '@mui/icons-material/DisabledByDefaultR import IndeterminateCheckBoxIcon from '@mui/icons-material/IndeterminateCheckBox'; import Box from '@mui/material/Box'; import { SimpleTreeView } from '@mui/x-tree-view/SimpleTreeView'; -import { TreeItem as MuiTreeItem } from '@mui/x-tree-view/TreeItem'; import { NodeTreeView } from './node-tree-view'; -import { TreeItem } from './tree-item'; +import useReactFlowStore from '../../../stores/react-flow'; +import { useShallow } from 'zustand/react/shallow'; export default function TreeView() { + const selectedNodeID = useReactFlowStore(useShallow(state => state.selectedNodeID)); return ( - - - - - - - - - - - - - - - - {/* TODO: setting more action must be added */} {/* TODO: nodes color changer must be added, beside node types */} {/* TODO: custom style must be added for the NODEs TreeITem */} - ); diff --git a/web-interface/src/stores/app-states.ts b/web-interface/src/stores/app-states.ts index 85ca800..5cc655b 100644 --- a/web-interface/src/stores/app-states.ts +++ b/web-interface/src/stores/app-states.ts @@ -35,3 +35,17 @@ export const mainCmdk = { useStore: useMainCmdkStore, setOpen: setMainCmdkOpenState, }; + +type InfoDrawer = { ID: string | null }; +const useInfoDrawerStore = create(() => ({ ID: null })); +const setInfoDrawerIDState: React.Dispatch> = ID => { + if (typeof ID === 'function') { + return useInfoDrawerStore.setState({ ID: ID(useInfoDrawerStore.getState().ID) }); + } + useInfoDrawerStore.setState({ ID }); +}; + +export const infoDrawer = { + useStore: useInfoDrawerStore, + setID: setInfoDrawerIDState, +}; diff --git a/web-interface/src/stores/react-flow.ts b/web-interface/src/stores/react-flow.ts index 0c45828..547a762 100644 --- a/web-interface/src/stores/react-flow.ts +++ b/web-interface/src/stores/react-flow.ts @@ -30,6 +30,7 @@ const useReactFlowStore = create()((set, get) => ({ { id: 'e1-2', source: '1', target: '2' }, { id: 'e2-3', source: '2', target: '3' }, ], + selectedNodeID: null, onNodesChange: changes => { set({ nodes: applyNodeChanges(changes, get().nodes), @@ -77,6 +78,11 @@ const useReactFlowStore = create()((set, get) => ({ }), }); }, + setSelectedNodeID: ID => { + set({ + selectedNodeID: ID, + }); + }, })); export default useReactFlowStore; diff --git a/web-interface/src/stores/types.ts b/web-interface/src/stores/types.ts index b64bf98..5fcc79b 100644 --- a/web-interface/src/stores/types.ts +++ b/web-interface/src/stores/types.ts @@ -1,10 +1,9 @@ import type { Edge, Node, OnConnect, OnEdgesChange, OnNodesChange } from '@xyflow/react'; - type NodeData = { - label: string; - color: string; -} + label: string; + color: string; +}; type AppNode = Node; type AppState = { nodes: AppNode[]; @@ -12,12 +11,15 @@ type AppState = { onNodesChange: OnNodesChange; onEdgesChange: OnEdgesChange; onConnect: OnConnect; + selectedNodeID: string | null; + setNodes: (nodes: AppNode[]) => void; setEdges: (edges: Edge[]) => void; // custom logics, for store managements addNode: (nodeType: string, data: NodeData) => void; updateNode: (id: AppNode['id'], data: Partial) => void; + setSelectedNodeID: (id: string | null) => void; }; -export type ReactFlowAppStoreState = AppState -export type ReactFlowAppNode = AppNode \ No newline at end of file +export type ReactFlowAppStoreState = AppState; +export type ReactFlowAppNode = AppNode; diff --git a/web-interface/src/styles/BaseComponents.ts b/web-interface/src/styles/BaseComponents.ts new file mode 100644 index 0000000..6211d37 --- /dev/null +++ b/web-interface/src/styles/BaseComponents.ts @@ -0,0 +1,44 @@ +import { Box, Button, styled } from '@mui/material'; + +export const AllCenterBoxComponent = styled(Box)(() => ({ + justifyContent: 'center', + alignItems: 'center', + display: 'flex', +})); +export const JustifyCenterBoxComponent = styled(Box)(() => ({ + justifyContent: 'center', + display: 'flex', +})); +export const AllCenterButtonComponent = styled(Button)(() => ({ + justifyContent: 'center', + alignItems: 'center', + display: 'flex', +})); +export const JustifyCenterButtonComponent = styled(Button)(() => ({ + justifyContent: 'center', + display: 'flex', +})); + +export const AllCenterStyle = { + justifyContent: 'center', + alignItems: 'center', + display: 'flex', +}; +export const JustifyCenterStyle = { + justifyContent: 'center', + display: 'flex', +}; +export const alignItemsCenterStyle = { + alignItems: 'center', + display: 'flex', +}; +export const fullSizeStyle = { + height: '100%', + width: '100%', + boxSizing: 'border-box', +}; + +export const ProtoTypeStyle = { + border: '1px solid gray', + ...fullSizeStyle, +}; diff --git a/web-interface/yarn.lock b/web-interface/yarn.lock index 6f5a605..d21db09 100644 --- a/web-interface/yarn.lock +++ b/web-interface/yarn.lock @@ -23,7 +23,7 @@ resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.4.tgz" integrity sha512-+LGRog6RAsCJrrrg/IO6LGmpphNe5DiK30dGjCoxxeGv49B10/3XYGxPsAwrDlMFcFEvdAUavDT8r9k/hSyQqQ== -"@babel/core@^7.0.0", "@babel/core@^7.0.0-0", "@babel/core@^7.24.5": +"@babel/core@^7.24.5": version "7.25.2" resolved "https://registry.npmjs.org/@babel/core/-/core-7.25.2.tgz" integrity sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA== @@ -157,6 +157,13 @@ dependencies: regenerator-runtime "^0.14.0" +"@babel/runtime@^7.18.6": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.25.7.tgz#7ffb53c37a8f247c8c4d335e89cdf16a2e0d0fb6" + integrity sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w== + dependencies: + regenerator-runtime "^0.14.0" + "@babel/template@^7.25.0": version "7.25.0" resolved "https://registry.npmjs.org/@babel/template/-/template-7.25.0.tgz" @@ -188,6 +195,80 @@ "@babel/helper-validator-identifier" "^7.24.7" to-fast-properties "^2.0.0" +"@codemirror/autocomplete@^6.0.0": + version "6.18.1" + resolved "https://registry.yarnpkg.com/@codemirror/autocomplete/-/autocomplete-6.18.1.tgz#3bd8d62c9c9a14d0706ab0a8adac139eaf1a41f1" + integrity sha512-iWHdj/B1ethnHRTwZj+C1obmmuCzquH29EbcKr0qIjA9NfDeBDJ7vs+WOHsFeLeflE4o+dHfYndJloMKHUkWUA== + dependencies: + "@codemirror/language" "^6.0.0" + "@codemirror/state" "^6.0.0" + "@codemirror/view" "^6.17.0" + "@lezer/common" "^1.0.0" + +"@codemirror/commands@^6.0.0", "@codemirror/commands@^6.1.0": + version "6.7.0" + resolved "https://registry.yarnpkg.com/@codemirror/commands/-/commands-6.7.0.tgz#a06595c0bd2966951640319a6abd953885d22bab" + integrity sha512-+cduIZ2KbesDhbykV02K25A5xIVrquSPz4UxxYBemRlAT2aW8dhwUgLDwej7q/RJUHKk4nALYcR1puecDvbdqw== + dependencies: + "@codemirror/language" "^6.0.0" + "@codemirror/state" "^6.4.0" + "@codemirror/view" "^6.27.0" + "@lezer/common" "^1.1.0" + +"@codemirror/language@^6.0.0": + version "6.10.3" + resolved "https://registry.yarnpkg.com/@codemirror/language/-/language-6.10.3.tgz#eb25fc5ade19032e7bf1dcaa957804e5f1660585" + integrity sha512-kDqEU5sCP55Oabl6E7m5N+vZRoc0iWqgDVhEKifcHzPzjqCegcO4amfrYVL9PmPZpl4G0yjkpTpUO/Ui8CzO8A== + dependencies: + "@codemirror/state" "^6.0.0" + "@codemirror/view" "^6.23.0" + "@lezer/common" "^1.1.0" + "@lezer/highlight" "^1.0.0" + "@lezer/lr" "^1.0.0" + style-mod "^4.0.0" + +"@codemirror/lint@^6.0.0": + version "6.8.2" + resolved "https://registry.yarnpkg.com/@codemirror/lint/-/lint-6.8.2.tgz#7864b03583e9efd18554cff1dd4504da10338ab1" + integrity sha512-PDFG5DjHxSEjOXk9TQYYVjZDqlZTFaDBfhQixHnQOEVDDNHUbEh/hstAjcQJaA6FQdZTD1hquXTK0rVBLADR1g== + dependencies: + "@codemirror/state" "^6.0.0" + "@codemirror/view" "^6.0.0" + crelt "^1.0.5" + +"@codemirror/search@^6.0.0": + version "6.5.6" + resolved "https://registry.yarnpkg.com/@codemirror/search/-/search-6.5.6.tgz#8f858b9e678d675869112e475f082d1e8488db93" + integrity sha512-rpMgcsh7o0GuCDUXKPvww+muLA1pDJaFrpq/CCHtpQJYz8xopu4D1hPcKRoDD0YlF8gZaqTNIRa4VRBWyhyy7Q== + dependencies: + "@codemirror/state" "^6.0.0" + "@codemirror/view" "^6.0.0" + crelt "^1.0.5" + +"@codemirror/state@^6.0.0", "@codemirror/state@^6.1.1", "@codemirror/state@^6.4.0": + version "6.4.1" + resolved "https://registry.yarnpkg.com/@codemirror/state/-/state-6.4.1.tgz#da57143695c056d9a3c38705ed34136e2b68171b" + integrity sha512-QkEyUiLhsJoZkbumGZlswmAhA7CBU02Wrz7zvH4SrcifbsqwlXShVXg65f3v/ts57W3dqyamEriMhij1Z3Zz4A== + +"@codemirror/theme-one-dark@^6.0.0": + version "6.1.2" + resolved "https://registry.yarnpkg.com/@codemirror/theme-one-dark/-/theme-one-dark-6.1.2.tgz#fcef9f9cfc17a07836cb7da17c9f6d7231064df8" + integrity sha512-F+sH0X16j/qFLMAfbciKTxVOwkdAS336b7AXTKOZhy8BR3eH/RelsnLgLFINrpST63mmN2OuwUt0W2ndUgYwUA== + dependencies: + "@codemirror/language" "^6.0.0" + "@codemirror/state" "^6.0.0" + "@codemirror/view" "^6.0.0" + "@lezer/highlight" "^1.0.0" + +"@codemirror/view@^6.0.0", "@codemirror/view@^6.17.0", "@codemirror/view@^6.23.0", "@codemirror/view@^6.27.0": + version "6.34.1" + resolved "https://registry.yarnpkg.com/@codemirror/view/-/view-6.34.1.tgz#b17ed29c563e4adc60086233f2d3e7197e2dc33e" + integrity sha512-t1zK/l9UiRqwUNPm+pdIT0qzJlzuVckbTEMVNFhfWkGiBQClstzg+78vedCvLSX0xJEZ6lwZbPpnljL7L6iwMQ== + dependencies: + "@codemirror/state" "^6.4.0" + style-mod "^4.1.0" + w3c-keyname "^2.2.4" + "@emotion/babel-plugin@^11.12.0": version "11.12.0" resolved "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.12.0.tgz" @@ -233,7 +314,7 @@ resolved "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.9.0.tgz" integrity sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ== -"@emotion/react@^11.0.0-rc.0", "@emotion/react@^11.13.3", "@emotion/react@^11.4.1", "@emotion/react@^11.5.0", "@emotion/react@^11.9.0": +"@emotion/react@^11.13.3": version "11.13.3" resolved "https://registry.npmjs.org/@emotion/react/-/react-11.13.3.tgz" integrity sha512-lIsdU6JNrmYfJ5EbUCf4xW1ovy5wKQ2CkPRM4xogziOxH1nXxBSjpC9YqbFAP7circxMfYp+6x676BqWcEiixg== @@ -263,7 +344,7 @@ resolved "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.4.0.tgz" integrity sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg== -"@emotion/styled@^11.13.0", "@emotion/styled@^11.3.0", "@emotion/styled@^11.8.1": +"@emotion/styled@^11.13.0": version "11.13.0" resolved "https://registry.npmjs.org/@emotion/styled/-/styled-11.13.0.tgz" integrity sha512-tkzkY7nQhW/zC4hztlwucpT8QEZ6eUzpXDRhww/Eej4tFfO0FxQYWRyg/c5CCXa4d/f174kqeXYjuQRnhzf6dA== @@ -295,11 +376,121 @@ resolved "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.4.0.tgz" integrity sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg== +"@esbuild/aix-ppc64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz#c7184a326533fcdf1b8ee0733e21c713b975575f" + integrity sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ== + +"@esbuild/android-arm64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz#09d9b4357780da9ea3a7dfb833a1f1ff439b4052" + integrity sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A== + +"@esbuild/android-arm@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.21.5.tgz#9b04384fb771926dfa6d7ad04324ecb2ab9b2e28" + integrity sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg== + +"@esbuild/android-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.21.5.tgz#29918ec2db754cedcb6c1b04de8cd6547af6461e" + integrity sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA== + "@esbuild/darwin-arm64@0.21.5": version "0.21.5" resolved "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz" integrity sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ== +"@esbuild/darwin-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz#c13838fa57372839abdddc91d71542ceea2e1e22" + integrity sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw== + +"@esbuild/freebsd-arm64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz#646b989aa20bf89fd071dd5dbfad69a3542e550e" + integrity sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g== + +"@esbuild/freebsd-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz#aa615cfc80af954d3458906e38ca22c18cf5c261" + integrity sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ== + +"@esbuild/linux-arm64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz#70ac6fa14f5cb7e1f7f887bcffb680ad09922b5b" + integrity sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q== + +"@esbuild/linux-arm@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz#fc6fd11a8aca56c1f6f3894f2bea0479f8f626b9" + integrity sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA== + +"@esbuild/linux-ia32@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz#3271f53b3f93e3d093d518d1649d6d68d346ede2" + integrity sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg== + +"@esbuild/linux-loong64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz#ed62e04238c57026aea831c5a130b73c0f9f26df" + integrity sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg== + +"@esbuild/linux-mips64el@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz#e79b8eb48bf3b106fadec1ac8240fb97b4e64cbe" + integrity sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg== + +"@esbuild/linux-ppc64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz#5f2203860a143b9919d383ef7573521fb154c3e4" + integrity sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w== + +"@esbuild/linux-riscv64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz#07bcafd99322d5af62f618cb9e6a9b7f4bb825dc" + integrity sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA== + +"@esbuild/linux-s390x@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz#b7ccf686751d6a3e44b8627ababc8be3ef62d8de" + integrity sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A== + +"@esbuild/linux-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz#6d8f0c768e070e64309af8004bb94e68ab2bb3b0" + integrity sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ== + +"@esbuild/netbsd-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz#bbe430f60d378ecb88decb219c602667387a6047" + integrity sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg== + +"@esbuild/openbsd-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz#99d1cf2937279560d2104821f5ccce220cb2af70" + integrity sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow== + +"@esbuild/sunos-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz#08741512c10d529566baba837b4fe052c8f3487b" + integrity sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg== + +"@esbuild/win32-arm64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz#675b7385398411240735016144ab2e99a60fc75d" + integrity sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A== + +"@esbuild/win32-ia32@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz#1bfc3ce98aa6ca9a0969e4d2af72144c59c1193b" + integrity sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA== + +"@esbuild/win32-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz#acad351d582d157bb145535db2a6ff53dd514b5c" + integrity sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw== + "@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": version "4.4.0" resolved "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz" @@ -332,6 +523,22 @@ resolved "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz" integrity sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q== +"@favware/syntax-highlighter-core@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@favware/syntax-highlighter-core/-/syntax-highlighter-core-1.1.2.tgz#f2ecb1dfef746480223bfc6feda2cde66b61f37b" + integrity sha512-htglQVflYp7N89n02XhH7L2v+cIa/h2vCt/oZpI5XmnVhL9fzkrHttmul7UTs0OCIkF4xOmEzTl2qGafSEJNKg== + dependencies: + "@stencil/core" "2.5.2" + clipboard "^2.0.8" + prismjs "^1.23.0" + +"@favware/syntax-highlighter-react@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@favware/syntax-highlighter-react/-/syntax-highlighter-react-1.1.2.tgz#5180fd3c2444213e3cd37045883dd3245ecb7901" + integrity sha512-f/Bksn2HMwwUkeDUstWllkTqrBnSstUGV2Bd0PxGXTJjFTTDNIEvohhv8XhfDWm1QuAqiIR4SDCnagzRBQRFBg== + dependencies: + "@favware/syntax-highlighter-core" "^1.1.2" + "@headlessui/react@^1.6.4": version "1.7.19" resolved "https://registry.npmjs.org/@headlessui/react/-/react-1.7.19.tgz" @@ -345,6 +552,11 @@ resolved "https://registry.npmjs.org/@heroicons/react/-/react-2.1.5.tgz" integrity sha512-FuzFN+BsHa+7OxbvAERtgBTNeZpUjgM/MIizfVkSCL2/edriN0Hx/DWRCR//aPYwO5QX/YlgLGXk+E3PcfZwjA== +"@hookform/resolvers@^3.9.0": + version "3.9.0" + resolved "https://registry.npmjs.org/@hookform/resolvers/-/resolvers-3.9.0.tgz" + integrity sha512-bU0Gr4EepJ/EQsH/IwEzYLsT/PEj5C0ynLQ4m+GSHS+xKH4TfSelhluTgOaoc4kA5s7eCsQbM4wvZLzELmWzUg== + "@humanwhocodes/config-array@^0.13.0": version "0.13.0" resolved "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz" @@ -404,6 +616,25 @@ "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" +"@lezer/common@^1.0.0", "@lezer/common@^1.1.0": + version "1.2.2" + resolved "https://registry.yarnpkg.com/@lezer/common/-/common-1.2.2.tgz#33cb2de75d72602d3ca905cdf7e32049fbe7402c" + integrity sha512-Z+R3hN6kXbgBWAuejUNPihylAL1Z5CaFqnIe0nTX8Ej+XlIy3EGtXxn6WtLMO+os2hRkQvm2yvaGMYliUzlJaw== + +"@lezer/highlight@^1.0.0": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@lezer/highlight/-/highlight-1.2.1.tgz#596fa8f9aeb58a608be0a563e960c373cbf23f8b" + integrity sha512-Z5duk4RN/3zuVO7Jq0pGLJ3qynpxUVsh7IbUbGj88+uV2ApSAn6kWg2au3iJb+0Zi7kKtqffIESgNcRXWZWmSA== + dependencies: + "@lezer/common" "^1.0.0" + +"@lezer/lr@^1.0.0": + version "1.4.2" + resolved "https://registry.yarnpkg.com/@lezer/lr/-/lr-1.4.2.tgz#931ea3dea8e9de84e90781001dae30dea9ff1727" + integrity sha512-pu0K1jCIdnQ12aWNaAVU5bzi7Bd1w54J3ECgANPmYLtQKP0HBj2cE/5coBD66MT10xbtIuUr7tg0Shbsvk0mDA== + dependencies: + "@lezer/common" "^1.0.0" + "@mui/core-downloads-tracker@^6.1.1": version "6.1.1" resolved "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-6.1.1.tgz" @@ -416,7 +647,7 @@ dependencies: "@babel/runtime" "^7.25.6" -"@mui/material@^5.15.14 || ^6.0.0", "@mui/material@^6.1.1": +"@mui/material@^6.1.1": version "6.1.1" resolved "https://registry.npmjs.org/@mui/material/-/material-6.1.1.tgz" integrity sha512-b+eULldTqtqTCbN++2BtBWCir/1LwEYw+2mIlOt2GiEUh1EBBw4/wIukGKKNt3xrCZqRA80yLLkV6tF61Lq3cA== @@ -454,7 +685,7 @@ csstype "^3.1.3" prop-types "^15.8.1" -"@mui/system@^5.15.14 || ^6.0.0", "@mui/system@^6.1.1": +"@mui/system@^6.1.1": version "6.1.1" resolved "https://registry.npmjs.org/@mui/system/-/system-6.1.1.tgz" integrity sha512-PaYsCz2tUOcpu3T0okDEsSuP/yCDIj9JZ4Tox1JovRSKIjltHpXPsXZSGr3RiWdtM1MTQMFMCZzu0+CKbyy+Kw== @@ -539,7 +770,7 @@ "@nodelib/fs.stat" "2.0.5" run-parallel "^1.1.9" -"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5": +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": version "2.0.5" resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== @@ -557,11 +788,91 @@ resolved "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz" integrity sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A== +"@rollup/rollup-android-arm-eabi@4.22.2": + version "4.22.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.22.2.tgz#4e0c4c462692ecb7ae2b008f25af4cced05ac4f9" + integrity sha512-8Ao+EDmTPjZ1ZBABc1ohN7Ylx7UIYcjReZinigedTOnGFhIctyGPxY2II+hJ6gD2/vkDKZTyQ0e7++kwv6wDrw== + +"@rollup/rollup-android-arm64@4.22.2": + version "4.22.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.22.2.tgz#d97ed02a950061adc2056d6d2d6df8f05d877ae9" + integrity sha512-I+B1v0a4iqdS9DvYt1RJZ3W+Oh9EVWjbY6gp79aAYipIbxSLEoQtFQlZEnUuwhDXCqMxJ3hluxKAdPD+GiluFQ== + "@rollup/rollup-darwin-arm64@4.22.2": version "4.22.2" resolved "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.22.2.tgz" integrity sha512-BTHO7rR+LC67OP7I8N8GvdvnQqzFujJYWo7qCQ8fGdQcb8Gn6EQY+K1P+daQLnDCuWKbZ+gHAQZuKiQkXkqIYg== +"@rollup/rollup-darwin-x64@4.22.2": + version "4.22.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.22.2.tgz#22ee27a0ccfdc045c2a37f6980351329516ce119" + integrity sha512-1esGwDNFe2lov4I6GsEeYaAMHwkqk0IbuGH7gXGdBmd/EP9QddJJvTtTF/jv+7R8ZTYPqwcdLpMTxK8ytP6k6Q== + +"@rollup/rollup-linux-arm-gnueabihf@4.22.2": + version "4.22.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.22.2.tgz#d86df2d8c600ebdd7251110a3357c53e0a583ace" + integrity sha512-GBHuY07x96OTEM3OQLNaUSUwrOhdMea/LDmlFHi/HMonrgF6jcFrrFFwJhhe84XtA1oK/Qh4yFS+VMREf6dobg== + +"@rollup/rollup-linux-arm-musleabihf@4.22.2": + version "4.22.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.22.2.tgz#a8b7b6a805356c8bd0409e4c5f56664d80a50aaa" + integrity sha512-Dbfa9Sc1G1lWxop0gNguXOfGhaXQWAGhZUcqA0Vs6CnJq8JW/YOw/KvyGtQFmz4yDr0H4v9X248SM7bizYj4yQ== + +"@rollup/rollup-linux-arm64-gnu@4.22.2": + version "4.22.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.22.2.tgz#766064021d2bfc42f13f4653f8870a9b8bbdc31d" + integrity sha512-Z1YpgBvFYhZIyBW5BoopwSg+t7yqEhs5HCei4JbsaXnhz/eZehT18DaXl957aaE9QK7TRGFryCAtStZywcQe1A== + +"@rollup/rollup-linux-arm64-musl@4.22.2": + version "4.22.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.22.2.tgz#490f49236102b97738d9406eaf5cd8d9dad35c15" + integrity sha512-66Zszr7i/JaQ0u/lefcfaAw16wh3oT72vSqubIMQqWzOg85bGCPhoeykG/cC5uvMzH80DQa2L539IqKht6twVA== + +"@rollup/rollup-linux-powerpc64le-gnu@4.22.2": + version "4.22.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.22.2.tgz#03a67f1476dd80f115ce35bc9b0d03c50c16679d" + integrity sha512-HpJCMnlMTfEhwo19bajvdraQMcAq3FX08QDx3OfQgb+414xZhKNf3jNvLFYKbbDSGBBrQh5yNwWZrdK0g0pokg== + +"@rollup/rollup-linux-riscv64-gnu@4.22.2": + version "4.22.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.22.2.tgz#d86e9b7b5b242652cd691c46d1939130c35cb68d" + integrity sha512-/egzQzbOSRef2vYCINKITGrlwkzP7uXRnL+xU2j75kDVp3iPdcF0TIlfwTRF8woBZllhk3QaxNOEj2Ogh3t9hg== + +"@rollup/rollup-linux-s390x-gnu@4.22.2": + version "4.22.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.22.2.tgz#c8fca373bec6df8550b31b3dbb56e2b241bc8718" + integrity sha512-qgYbOEbrPfEkH/OnUJd1/q4s89FvNJQIUldx8X2F/UM5sEbtkqZpf2s0yly2jSCKr1zUUOY1hnTP2J1WOzMAdA== + +"@rollup/rollup-linux-x64-gnu@4.22.2": + version "4.22.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.22.2.tgz#be182ef761c9b0147496e647ace44fd1b912344f" + integrity sha512-a0lkvNhFLhf+w7A95XeBqGQaG0KfS3hPFJnz1uraSdUe/XImkp/Psq0Ca0/UdD5IEAGoENVmnYrzSC9Y2a2uKQ== + +"@rollup/rollup-linux-x64-musl@4.22.2": + version "4.22.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.22.2.tgz#c280202d5b54d04f1e2b810359fe73c4973e8b72" + integrity sha512-sSWBVZgzwtsuG9Dxi9kjYOUu/wKW+jrbzj4Cclabqnfkot8Z3VEHcIgyenA3lLn/Fu11uDviWjhctulkhEO60g== + +"@rollup/rollup-win32-arm64-msvc@4.22.2": + version "4.22.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.22.2.tgz#8ae561401b92acb8ca7a842ffadececb22a2247e" + integrity sha512-t/YgCbZ638R/r7IKb9yCM6nAek1RUvyNdfU0SHMDLOf6GFe/VG1wdiUAsxTWHKqjyzkRGg897ZfCpdo1bsCSsA== + +"@rollup/rollup-win32-ia32-msvc@4.22.2": + version "4.22.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.22.2.tgz#c3a8b081595026eab9fccfe581624cb31af0d6f8" + integrity sha512-kTmX5uGs3WYOA+gYDgI6ITkZng9SP71FEMoHNkn+cnmb9Zuyyay8pf0oO5twtTwSjNGy1jlaWooTIr+Dw4tIbw== + +"@rollup/rollup-win32-x64-msvc@4.22.2": + version "4.22.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.22.2.tgz#c770006ccc780b2de7b2151fc7f37b49121a21c1" + integrity sha512-Yy8So+SoRz8I3NS4Bjh91BICPOSVgdompTIPYTByUqU66AXSIOgmW3Lv1ke3NORPqxdF+RdrZET+8vYai6f4aA== + +"@stencil/core@2.5.2": + version "2.5.2" + resolved "https://registry.yarnpkg.com/@stencil/core/-/core-2.5.2.tgz#ad00d495ee37bbed4044524d59c7f22de15ab4a7" + integrity sha512-bgjPXkSzzg1WnTgVUm6m5ZzpKt602WmA/QljODAW1xVN40OHJdbGblzF/F6MFzqv2c5Cy30CB41arc8qADIdcQ== + "@tanstack/eslint-plugin-query@^5.20.1": version "5.56.1" resolved "https://registry.npmjs.org/@tanstack/eslint-plugin-query/-/eslint-plugin-query-5.56.1.tgz" @@ -709,7 +1020,7 @@ dependencies: "@types/react" "*" -"@types/react@*", "@types/react@^17.0.0 || ^18.0.0", "@types/react@^17.0.0 || ^18.0.0 || ^19.0.0", "@types/react@^18.2.43", "@types/react@>=16.8": +"@types/react@*", "@types/react@^18.2.43": version "18.3.8" resolved "https://registry.npmjs.org/@types/react/-/react-18.3.8.tgz" integrity sha512-syBUrW3/XpnW4WJ41Pft+I+aPoDVbrBVQGEnbD7NijDGlVC+8gV/XKRY+7vMDlfPpbwYt0l1vd/Sj8bJGMbs9Q== @@ -744,7 +1055,7 @@ semver "^7.5.4" ts-api-utils "^1.0.1" -"@typescript-eslint/parser@^6.0.0 || ^6.0.0-alpha", "@typescript-eslint/parser@^6.14.0": +"@typescript-eslint/parser@^6.14.0": version "6.21.0" resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.21.0.tgz" integrity sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ== @@ -819,16 +1130,6 @@ semver "^7.6.0" ts-api-utils "^1.3.0" -"@typescript-eslint/utils@^8.3.0": - version "8.6.0" - resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.6.0.tgz" - integrity sha512-eNp9cWnYf36NaOVjkEUznf6fEgVy1TWpE0o52e4wtojjBx7D1UV2WAWGzR+8Y5lVFtpMLPwNbC67T83DWSph4A== - dependencies: - "@eslint-community/eslint-utils" "^4.4.0" - "@typescript-eslint/scope-manager" "8.6.0" - "@typescript-eslint/types" "8.6.0" - "@typescript-eslint/typescript-estree" "8.6.0" - "@typescript-eslint/utils@6.21.0": version "6.21.0" resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.21.0.tgz" @@ -842,6 +1143,16 @@ "@typescript-eslint/typescript-estree" "6.21.0" semver "^7.5.4" +"@typescript-eslint/utils@^8.3.0": + version "8.6.0" + resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.6.0.tgz" + integrity sha512-eNp9cWnYf36NaOVjkEUznf6fEgVy1TWpE0o52e4wtojjBx7D1UV2WAWGzR+8Y5lVFtpMLPwNbC67T83DWSph4A== + dependencies: + "@eslint-community/eslint-utils" "^4.4.0" + "@typescript-eslint/scope-manager" "8.6.0" + "@typescript-eslint/types" "8.6.0" + "@typescript-eslint/typescript-estree" "8.6.0" + "@typescript-eslint/visitor-keys@6.21.0": version "6.21.0" resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz" @@ -858,6 +1169,75 @@ "@typescript-eslint/types" "8.6.0" eslint-visitor-keys "^3.4.3" +"@uiw/codemirror-extensions-basic-setup@4.23.5": + version "4.23.5" + resolved "https://registry.yarnpkg.com/@uiw/codemirror-extensions-basic-setup/-/codemirror-extensions-basic-setup-4.23.5.tgz#02ebe9c44f76609f15295e1ff9c83e770140c369" + integrity sha512-eTMfT8TejVN/D5vvuz9Lab+MIoRYdtqa2ftZZmU3JpcDIXf9KaExPo+G2Rl9HqySzaasgGXOOG164MAnj3MSIw== + dependencies: + "@codemirror/autocomplete" "^6.0.0" + "@codemirror/commands" "^6.0.0" + "@codemirror/language" "^6.0.0" + "@codemirror/lint" "^6.0.0" + "@codemirror/search" "^6.0.0" + "@codemirror/state" "^6.0.0" + "@codemirror/view" "^6.0.0" + +"@uiw/color-convert@2.3.2": + version "2.3.2" + resolved "https://registry.npmjs.org/@uiw/color-convert/-/color-convert-2.3.2.tgz" + integrity sha512-Txs0oAcOGhvM15yi7NqDJSws6htpuGx75EblFlZmh4h4AyUYXaeN2HNcOAUt835M3SN1j7rqMC+XERIE4r776Q== + +"@uiw/react-codemirror@^4.23.5": + version "4.23.5" + resolved "https://registry.yarnpkg.com/@uiw/react-codemirror/-/react-codemirror-4.23.5.tgz#6a16c23062067732cba105ac33ad69cf8e5c2111" + integrity sha512-2zzGpx61L4mq9zDG/hfsO4wAH209TBE8VVsoj/qrccRe6KfcneCwKgRxtQjxBCCnO0Q5S+IP+uwCx5bXRzgQFQ== + dependencies: + "@babel/runtime" "^7.18.6" + "@codemirror/commands" "^6.1.0" + "@codemirror/state" "^6.1.1" + "@codemirror/theme-one-dark" "^6.0.0" + "@uiw/codemirror-extensions-basic-setup" "4.23.5" + codemirror "^6.0.0" + +"@uiw/react-color-alpha@2.3.2": + version "2.3.2" + resolved "https://registry.npmjs.org/@uiw/react-color-alpha/-/react-color-alpha-2.3.2.tgz" + integrity sha512-+yh+KEpNKjxNFFODQrB3Lki2hu6kznoSCngHgptlWBUtAC3e/e7tIiTTedSpCGr7fwIpC0CWrKwxENA3tyY/2Q== + dependencies: + "@uiw/color-convert" "2.3.2" + "@uiw/react-drag-event-interactive" "2.3.2" + +"@uiw/react-color-colorful@^2.3.2": + version "2.3.2" + resolved "https://registry.npmjs.org/@uiw/react-color-colorful/-/react-color-colorful-2.3.2.tgz" + integrity sha512-Rr1qa4Uo588CZjOx6OZIXjo7+CNcnqogU0Nel6L5zzwL+3CNBC3GfS4Or4db/ZxFhN49qt6NqsQa/ykA2/ixpg== + dependencies: + "@uiw/color-convert" "2.3.2" + "@uiw/react-color-alpha" "2.3.2" + "@uiw/react-color-hue" "2.3.2" + "@uiw/react-color-saturation" "2.3.2" + +"@uiw/react-color-hue@2.3.2": + version "2.3.2" + resolved "https://registry.npmjs.org/@uiw/react-color-hue/-/react-color-hue-2.3.2.tgz" + integrity sha512-aAveo++GAghw09Ngc8Zzwxhj9mGaJfw8q40fDGFrVNxdrwrAjySIKHzlOSg5kw6WnEp4tUjhkMXDfCZWUhqmPA== + dependencies: + "@uiw/color-convert" "2.3.2" + "@uiw/react-color-alpha" "2.3.2" + +"@uiw/react-color-saturation@2.3.2": + version "2.3.2" + resolved "https://registry.npmjs.org/@uiw/react-color-saturation/-/react-color-saturation-2.3.2.tgz" + integrity sha512-aDKMhjylBUb4dH4oTQYz+U4mhpOebbQ2J0Y8y5aX1tfZ3fZuBqnXtWzu7Ffj3ksdKwkQHPddxT5IDTbAChF/og== + dependencies: + "@uiw/color-convert" "2.3.2" + "@uiw/react-drag-event-interactive" "2.3.2" + +"@uiw/react-drag-event-interactive@2.3.2": + version "2.3.2" + resolved "https://registry.npmjs.org/@uiw/react-drag-event-interactive/-/react-drag-event-interactive-2.3.2.tgz" + integrity sha512-lG5pJCtqbYBv7Dj0r12PE9q9yg7P2CzlQodw5ZHPY9GCSZVXHJc0g4lGvCbe/4Y8HYqM8aU4CYS8LplpX+mIQw== + "@ungap/structured-clone@^1.2.0": version "1.2.0" resolved "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz" @@ -901,7 +1281,7 @@ acorn-jsx@^5.3.2: resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== -"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", acorn@^8.8.2, acorn@^8.9.0: +acorn@^8.8.2, acorn@^8.9.0: version "8.12.1" resolved "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz" integrity sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg== @@ -1084,7 +1464,7 @@ braces@^3.0.3: dependencies: fill-range "^7.1.1" -browserslist@^4.23.1, "browserslist@>= 4.21.0": +browserslist@^4.23.1: version "4.23.3" resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.23.3.tgz" integrity sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA== @@ -1169,11 +1549,33 @@ client-only@^0.0.1: resolved "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz" integrity sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA== +clipboard@^2.0.8: + version "2.0.11" + resolved "https://registry.yarnpkg.com/clipboard/-/clipboard-2.0.11.tgz#62180360b97dd668b6b3a84ec226975762a70be5" + integrity sha512-C+0bbOqkezLIsmWSvlsXS0Q0bmkugu7jcfMIACB+RDEntIzQIkdr148we28AfSloQLRdZlYL/QYyrq05j/3Faw== + dependencies: + good-listener "^1.2.2" + select "^1.1.2" + tiny-emitter "^2.0.0" + clsx@^2.1.1: version "2.1.1" resolved "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz" integrity sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA== +codemirror@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/codemirror/-/codemirror-6.0.1.tgz#62b91142d45904547ee3e0e0e4c1a79158035a29" + integrity sha512-J8j+nZ+CdWmIeFIGXEFbFPtpiYacFMDR8GlHK3IyHQJMCaVRfGx9NT+Hxivv1ckLWPvNdZqndbr/7lVhrf/Svg== + dependencies: + "@codemirror/autocomplete" "^6.0.0" + "@codemirror/commands" "^6.0.0" + "@codemirror/language" "^6.0.0" + "@codemirror/lint" "^6.0.0" + "@codemirror/search" "^6.0.0" + "@codemirror/state" "^6.0.0" + "@codemirror/view" "^6.0.0" + color-convert@^1.9.0: version "1.9.3" resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" @@ -1188,16 +1590,16 @@ color-convert@^2.0.1: dependencies: color-name "~1.1.4" -color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - color-name@1.1.3: version "1.1.3" resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + combined-stream@^1.0.8: version "1.0.8" resolved "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz" @@ -1241,6 +1643,11 @@ cosmiconfig@^7.0.0: path-type "^4.0.0" yaml "^1.10.0" +crelt@^1.0.5: + version "1.0.6" + resolved "https://registry.yarnpkg.com/crelt/-/crelt-1.0.6.tgz#7cc898ea74e190fb6ef9dae57f8f81cf7302df72" + integrity sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g== + cross-spawn@^7.0.2: version "7.0.3" resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz" @@ -1281,7 +1688,7 @@ csstype@^3.0.2, csstype@^3.1.3: resolved "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz" integrity sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg== -d3-drag@^3.0.0, "d3-drag@2 - 3": +"d3-drag@2 - 3", d3-drag@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz" integrity sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg== @@ -1301,7 +1708,7 @@ d3-drag@^3.0.0, "d3-drag@2 - 3": dependencies: d3-color "1 - 3" -d3-selection@^3.0.0, "d3-selection@2 - 3", d3-selection@3: +"d3-selection@2 - 3", d3-selection@3, d3-selection@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz" integrity sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ== @@ -1395,6 +1802,11 @@ delayed-stream@~1.0.0: resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== +delegate@^3.1.2: + version "3.2.0" + resolved "https://registry.yarnpkg.com/delegate/-/delegate-3.2.0.tgz#b66b71c3158522e8ab5744f720d8ca0c2af59166" + integrity sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw== + dir-glob@^3.0.1: version "3.0.1" resolved "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz" @@ -1693,7 +2105,7 @@ eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4 resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz" integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== -"eslint@^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7", "eslint@^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0", "eslint@^6.0.0 || ^7.0.0 || >=8.0.0", "eslint@^7.0.0 || ^8.0.0", eslint@^8.55.0, "eslint@^8.57.0 || ^9.0.0", eslint@>=7: +eslint@^8.55.0: version "8.57.1" resolved "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz" integrity sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA== @@ -1978,6 +2390,13 @@ globby@^11.1.0: merge2 "^1.4.1" slash "^3.0.0" +good-listener@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/good-listener/-/good-listener-1.2.2.tgz#d53b30cdf9313dffb7dc9a0d477096aa6d145c50" + integrity sha512-goW1b+d9q/HIwbVYZzZ6SsTr4IgE+WA44A0GmPIQstuOrgsFcT7VEJ48nmr9GaRtNu0XTKacFLGnBPAM6Afouw== + dependencies: + delegate "^3.1.2" + gopd@^1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz" @@ -2092,7 +2511,7 @@ ignore@^5.2.0, ignore@^5.2.4: resolved "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz" integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== -immer@^10.1.1, immer@>=9.0.6: +immer@^10.1.1: version "10.1.1" resolved "https://registry.npmjs.org/immer/-/immer-10.1.1.tgz" integrity sha512-s2MPrmjovJcoMaHtx6K11Ra7oD05NT97w1IC5zpMkT6Atjr7H8LjaDd81iIxUYpMKSRRNMJE703M1Fhr/TctHw== @@ -2468,21 +2887,14 @@ mime-types@^2.1.12: dependencies: mime-db "1.52.0" -minimatch@^3.0.5: - version "3.1.2" - resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" - integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== - dependencies: - brace-expansion "^1.1.7" - -minimatch@^3.1.1: - version "3.1.2" - resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" - integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== +minimatch@9.0.3: + version "9.0.3" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz" + integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== dependencies: - brace-expansion "^1.1.7" + brace-expansion "^2.0.1" -minimatch@^3.1.2: +minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: version "3.1.2" resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== @@ -2496,13 +2908,6 @@ minimatch@^9.0.4: dependencies: brace-expansion "^2.0.1" -minimatch@9.0.3: - version "9.0.3" - resolved "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz" - integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== - dependencies: - brace-expansion "^2.0.1" - ms@^2.1.3: version "2.1.3" resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" @@ -2724,6 +3129,11 @@ pretty-error@^4.0.0: lodash "^4.17.20" renderkid "^3.0.0" +prismjs@^1.23.0, prismjs@^1.29.0: + version "1.29.0" + resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.29.0.tgz#f113555a8fa9b57c35e637bba27509dcf802dd12" + integrity sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q== + prop-types@^15.6.2, prop-types@^15.8.1: version "15.8.1" resolved "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz" @@ -2733,6 +3143,11 @@ prop-types@^15.6.2, prop-types@^15.8.1: object-assign "^4.1.1" react-is "^16.13.1" +property-expr@^2.0.5: + version "2.0.6" + resolved "https://registry.npmjs.org/property-expr/-/property-expr-2.0.6.tgz" + integrity sha512-SVtmxhRE/CGkn3eZY1T6pC8Nln6Fr/lu1mKSgRud0eC73whjGfoAogbn78LkD8aFL0zz3bAFerKSnOl7NlErBA== + proxy-from-env@^1.1.0: version "1.1.0" resolved "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz" @@ -2757,7 +3172,12 @@ react-cmdk@^1.3.9: "@heroicons/react" "^2.0.13" html-webpack-plugin "^5.5.0" -"react-dom@^16 || ^17 || ^18", "react-dom@^16.8.0 || ^17.0.0 || ^18.0.0", "react-dom@^16.x || ^17.x || ^18.x", "react-dom@^17.0.0 || ^18.0.0", "react-dom@^17.0.0 || ^18.0.0 || ^19.0.0", react-dom@^18.2.0, react-dom@>=16.6.0, react-dom@>=16.8.0, react-dom@>=17: +react-colorful@^5.6.1: + version "5.6.1" + resolved "https://registry.npmjs.org/react-colorful/-/react-colorful-5.6.1.tgz" + integrity sha512-1exovf0uGTGyq5mXQT0zgQ80uvj2PCwvF8zY1RN9/vbJVSjSo3fsB/4L3ObbF7u70NduSiK4xu4Y6q1MHoUGEw== + +react-dom@^18.2.0: version "18.3.1" resolved "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz" integrity sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw== @@ -2767,15 +3187,10 @@ react-cmdk@^1.3.9: react-hook-form@^7.53.0: version "7.53.0" - resolved "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.53.0.tgz" + resolved "https://registry.yarnpkg.com/react-hook-form/-/react-hook-form-7.53.0.tgz#3cf70951bf41fa95207b34486203ebefbd3a05ab" integrity sha512-M1n3HhqCww6S2hxLxciEXy2oISPnAzxY7gvwVPrtlczTM/1dDadXgUxDpHMrMTblDOcm/AXtXxHwZ3jpg1mqKQ== -react-is@^16.13.1: - version "16.13.1" - resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz" - integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== - -react-is@^16.7.0: +react-is@^16.13.1, react-is@^16.7.0: version "16.13.1" resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== @@ -2805,7 +3220,7 @@ react-transition-group@^4.4.5: loose-envify "^1.4.0" prop-types "^15.6.2" -"react@^16 || ^17 || ^18", "react@^16.8.0 || ^17 || ^18 || ^19", "react@^16.8.0 || ^17.0.0 || ^18.0.0", "react@^16.x || ^17.x || ^18.x", "react@^17.0.0 || ^18.0.0", "react@^17.0.0 || ^18.0.0 || ^19.0.0", "react@^18 || ^19", react@^18.2.0, react@^18.3.1, "react@>= 16", react@>=16.6.0, react@>=16.8, react@>=16.8.0, react@>=17: +react@^18.2.0: version "18.3.1" resolved "https://registry.npmjs.org/react/-/react-18.3.1.tgz" integrity sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ== @@ -2947,7 +3362,7 @@ safe-regex-test@^1.0.3: es-errors "^1.3.0" is-regex "^1.1.4" -sass@*, sass@^1.70.0: +sass@^1.70.0: version "1.79.2" resolved "https://registry.npmjs.org/sass/-/sass-1.79.2.tgz" integrity sha512-YmT1aoF1MwHsZEu/eXhbAJNsPGAhNP4UixW9ckEwWCvPcVdVF0/C104OGDVEqtoctKq0N+wM20O/rj+sSPsWeg== @@ -2963,6 +3378,11 @@ scheduler@^0.23.2: dependencies: loose-envify "^1.1.0" +select@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/select/-/select-1.1.2.tgz#0e7350acdec80b1108528786ec1d4418d11b396d" + integrity sha512-OwpTSOfy6xSs1+pwcNrv0RBMOzI39Lp3qQKUTPVVPRjCdNa5JH/oPRiqsesIskK8TVgmRiHwO4KXlV2Li9dANA== + semver@^6.3.1: version "6.3.1" resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz" @@ -3022,7 +3442,7 @@ slash@^3.0.0: resolved "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== -source-map-js@^1.2.1, "source-map-js@>=0.6.2 <2.0.0": +"source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.2.1: version "1.2.1" resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz" integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== @@ -3040,12 +3460,7 @@ source-map@^0.5.7: resolved "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz" integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== -source-map@^0.6.0: - version "0.6.1" - resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== - -source-map@~0.6.0: +source-map@^0.6.0, source-map@~0.6.0: version "0.6.1" resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== @@ -3116,6 +3531,11 @@ strip-json-comments@^3.1.1: resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== +style-mod@^4.0.0, style-mod@^4.1.0: + version "4.1.2" + resolved "https://registry.yarnpkg.com/style-mod/-/style-mod-4.1.2.tgz#ca238a1ad4786520f7515a8539d5a63691d7bf67" + integrity sha512-wnD1HyVqpJUI2+eKZ+eo1UwghftP6yuFheBqqe+bWCotBjC2K1YnteJILRMs3SM4V/0dLEW1SC27MWP5y+mwmw== + stylis@4.2.0: version "4.2.0" resolved "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz" @@ -3145,7 +3565,7 @@ tapable@^2.0.0: resolved "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz" integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== -terser@^5.10.0, terser@^5.4.0: +terser@^5.10.0: version "5.33.0" resolved "https://registry.npmjs.org/terser/-/terser-5.33.0.tgz" integrity sha512-JuPVaB7s1gdFKPKTelwUyRq5Sid2A3Gko2S0PncwdBq7kN9Ti9HPWDQ06MPsEDGsZeVESjKEnyGy68quBk1w6g== @@ -3160,6 +3580,16 @@ text-table@^0.2.0: resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== +tiny-case@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/tiny-case/-/tiny-case-1.0.3.tgz" + integrity sha512-Eet/eeMhkO6TX8mnUteS9zgPbUMQa4I6Kkp5ORiBD5476/m+PIRiumP5tmh5ioJpH7k51Kehawy2UDfsnxxY8Q== + +tiny-emitter@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/tiny-emitter/-/tiny-emitter-2.1.0.tgz#1d1a56edfc51c43e863cbb5382a72330e3555423" + integrity sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q== + to-fast-properties@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz" @@ -3172,6 +3602,11 @@ to-regex-range@^5.0.1: dependencies: is-number "^7.0.0" +toposort@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/toposort/-/toposort-2.0.2.tgz" + integrity sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg== + ts-api-utils@^1.0.1, ts-api-utils@^1.3.0: version "1.3.0" resolved "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz" @@ -3194,6 +3629,11 @@ type-fest@^0.20.2: resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz" integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== +type-fest@^2.19.0: + version "2.19.0" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz" + integrity sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA== + typed-array-buffer@^1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz" @@ -3238,7 +3678,7 @@ typed-array-length@^1.0.6: is-typed-array "^1.1.13" possible-typed-array-names "^1.0.0" -typescript@^5.2.2, typescript@>=4.2.0: +typescript@^5.2.2: version "5.6.2" resolved "https://registry.npmjs.org/typescript/-/typescript-5.6.2.tgz" integrity sha512-NW8ByodCSNCwZeghjN3o+JX5OFH0Ojg6sadjEKY4huZ52TqbJTJnDo5+Tw98lSy63NZvi4n+ez5m2u5d4PkZyw== @@ -3283,7 +3723,7 @@ uuid@^9.0.1: resolved "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz" integrity sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA== -"vite@^4.2.0 || ^5.0.0", vite@^5.0.8: +vite@^5.0.8: version "5.4.6" resolved "https://registry.npmjs.org/vite/-/vite-5.4.6.tgz" integrity sha512-IeL5f8OO5nylsgzd9tq4qD2QqI0k2CQLGrWD0rCN0EQJZpBK5vJAx0I+GDkMOXxQX/OfFHMuLIx6ddAxGX/k+Q== @@ -3294,6 +3734,11 @@ uuid@^9.0.1: optionalDependencies: fsevents "~2.3.3" +w3c-keyname@^2.2.4: + version "2.2.8" + resolved "https://registry.yarnpkg.com/w3c-keyname/-/w3c-keyname-2.2.8.tgz#7b17c8c6883d4e8b86ac8aba79d39e880f8869c5" + integrity sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ== + which-boxed-primitive@^1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz" @@ -3376,6 +3821,16 @@ yocto-queue@^0.1.0: resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== +yup@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/yup/-/yup-1.4.0.tgz" + integrity sha512-wPbgkJRCqIf+OHyiTBQoJiP5PFuAXaWiJK6AmYkzQAh5/c2K9hzSApBZG5wV9KoKSePF7sAxmNSvh/13YHkFDg== + dependencies: + property-expr "^2.0.5" + tiny-case "^1.0.3" + toposort "^2.0.2" + type-fest "^2.19.0" + zustand@^4.4.0, zustand@^4.5.5: version "4.5.5" resolved "https://registry.npmjs.org/zustand/-/zustand-4.5.5.tgz"