diff --git a/package-lock.json b/package-lock.json
index 54d51ea..57855b2 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -13,8 +13,6 @@
"@hyvor/hyvor-talk-react": "^1.0.2",
"@mui/icons-material": "^7.3.1",
"@mui/material": "^7.3.1",
- "@yaffle/expression": "^0.0.47",
- "algebrite": "^1.4.0",
"bootstrap": "^5.3.8",
"echarts": "^5.6.0",
"echarts-for-react": "^3.0.2",
@@ -23,7 +21,7 @@
"pyodide": "^0.28.2",
"react": "^19.1.1",
"react-dom": "^19.1.1",
- "visiojs": "^0.0.7"
+ "visiojs": "file:/Users/will-personal/Documents/visiojs/package"
},
"devDependencies": {
"@eslint/js": "^9.34.0",
@@ -44,6 +42,31 @@
"vitest": "^3.2.4"
}
},
+ "../visiojs": {
+ "name": "@28raining/visiojs-monorepo",
+ "version": "1.0.0",
+ "workspaces": [
+ "package",
+ "examples/*"
+ ],
+ "devDependencies": {}
+ },
+ "../visiojs/package": {
+ "name": "visiojs",
+ "version": "0.0.8",
+ "license": "MIT",
+ "dependencies": {
+ "d3": "^7.9.0"
+ },
+ "devDependencies": {
+ "@eslint/js": "^9.22.0",
+ "eslint": "^9.26.0",
+ "jsdom": "^26.0.0",
+ "prettier": "^3.6.2",
+ "vite": "^6.3.5",
+ "vitest": "^3.1.1"
+ }
+ },
"node_modules/@ampproject/remapping": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz",
@@ -2363,26 +2386,6 @@
"node": ">=10.0.0"
}
},
- "node_modules/@yaffle/bigdecimal": {
- "version": "1.0.36",
- "resolved": "https://registry.npmjs.org/@yaffle/bigdecimal/-/bigdecimal-1.0.36.tgz",
- "integrity": "sha512-ADLt8lRsO1OH45/nhuT8CQfJCGKOCgkxo1udoPz2K976DOpK2pzaTq/lIgSlVwQRnH7v+agqZYnYQFt7RX33Og==",
- "license": "ISC"
- },
- "node_modules/@yaffle/expression": {
- "version": "0.0.47",
- "resolved": "https://registry.npmjs.org/@yaffle/expression/-/expression-0.0.47.tgz",
- "integrity": "sha512-VRrNERm+NmP/MNDkieRsY7j82w0gcLp3gNk/W3cymzdpmCDQxoBXjG9C3cKgY9ix4uhaW/vOMV1qdD8lEfceeA==",
- "hasInstallScript": true,
- "license": "ISC",
- "dependencies": {
- "@yaffle/bigdecimal": "^1.0.27",
- "bigint-gcd": "^1.0.28",
- "js-big-integer": "^3.0.25",
- "quadraticsievefactorization": "^1.0.72",
- "seedrandom": "^3.0.5"
- }
- },
"node_modules/acorn": {
"version": "8.15.0",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz",
@@ -2423,15 +2426,6 @@
"url": "https://github.com/sponsors/epoberezkin"
}
},
- "node_modules/algebrite": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/algebrite/-/algebrite-1.4.0.tgz",
- "integrity": "sha512-YPqD1baZOjuRnvR6xwyGYDJ9OvcqkPLLuxFAxnTGYVnKadzA5PyoMXm8mA1pYCE2xloMSgcZkTL1cXkK5C87cg==",
- "license": "MIT",
- "dependencies": {
- "big-integer": "^1.6.32"
- }
- },
"node_modules/ansi-regex": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
@@ -2507,21 +2501,6 @@
"dev": true,
"license": "MIT"
},
- "node_modules/big-integer": {
- "version": "1.6.52",
- "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz",
- "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==",
- "license": "Unlicense",
- "engines": {
- "node": ">=0.6"
- }
- },
- "node_modules/bigint-gcd": {
- "version": "1.0.46",
- "resolved": "https://registry.npmjs.org/bigint-gcd/-/bigint-gcd-1.0.46.tgz",
- "integrity": "sha512-LS+5iwYDi5kHu4antUAYaM0uqVN3dA9bNzZvbZlsRofuB4TclaL93LYxF/dDxFmaVcmw5twkWE9aykMb0IVWsA==",
- "license": "SEE LICENSE IN LICENSE"
- },
"node_modules/bootstrap": {
"version": "5.3.8",
"resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.3.8.tgz",
@@ -2726,15 +2705,6 @@
"dev": true,
"license": "MIT"
},
- "node_modules/commander": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz",
- "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==",
- "license": "MIT",
- "engines": {
- "node": ">= 10"
- }
- },
"node_modules/concat-map": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
@@ -2794,407 +2764,6 @@
"integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==",
"license": "MIT"
},
- "node_modules/d3": {
- "version": "7.9.0",
- "resolved": "https://registry.npmjs.org/d3/-/d3-7.9.0.tgz",
- "integrity": "sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==",
- "license": "ISC",
- "dependencies": {
- "d3-array": "3",
- "d3-axis": "3",
- "d3-brush": "3",
- "d3-chord": "3",
- "d3-color": "3",
- "d3-contour": "4",
- "d3-delaunay": "6",
- "d3-dispatch": "3",
- "d3-drag": "3",
- "d3-dsv": "3",
- "d3-ease": "3",
- "d3-fetch": "3",
- "d3-force": "3",
- "d3-format": "3",
- "d3-geo": "3",
- "d3-hierarchy": "3",
- "d3-interpolate": "3",
- "d3-path": "3",
- "d3-polygon": "3",
- "d3-quadtree": "3",
- "d3-random": "3",
- "d3-scale": "4",
- "d3-scale-chromatic": "3",
- "d3-selection": "3",
- "d3-shape": "3",
- "d3-time": "3",
- "d3-time-format": "4",
- "d3-timer": "3",
- "d3-transition": "3",
- "d3-zoom": "3"
- },
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/d3-array": {
- "version": "3.2.4",
- "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz",
- "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==",
- "license": "ISC",
- "dependencies": {
- "internmap": "1 - 2"
- },
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/d3-axis": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz",
- "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==",
- "license": "ISC",
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/d3-brush": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz",
- "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==",
- "license": "ISC",
- "dependencies": {
- "d3-dispatch": "1 - 3",
- "d3-drag": "2 - 3",
- "d3-interpolate": "1 - 3",
- "d3-selection": "3",
- "d3-transition": "3"
- },
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/d3-chord": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz",
- "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==",
- "license": "ISC",
- "dependencies": {
- "d3-path": "1 - 3"
- },
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/d3-color": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz",
- "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==",
- "license": "ISC",
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/d3-contour": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-4.0.2.tgz",
- "integrity": "sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==",
- "license": "ISC",
- "dependencies": {
- "d3-array": "^3.2.0"
- },
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/d3-delaunay": {
- "version": "6.0.4",
- "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.4.tgz",
- "integrity": "sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==",
- "license": "ISC",
- "dependencies": {
- "delaunator": "5"
- },
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/d3-dispatch": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz",
- "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==",
- "license": "ISC",
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/d3-drag": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz",
- "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==",
- "license": "ISC",
- "dependencies": {
- "d3-dispatch": "1 - 3",
- "d3-selection": "3"
- },
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/d3-dsv": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz",
- "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==",
- "license": "ISC",
- "dependencies": {
- "commander": "7",
- "iconv-lite": "0.6",
- "rw": "1"
- },
- "bin": {
- "csv2json": "bin/dsv2json.js",
- "csv2tsv": "bin/dsv2dsv.js",
- "dsv2dsv": "bin/dsv2dsv.js",
- "dsv2json": "bin/dsv2json.js",
- "json2csv": "bin/json2dsv.js",
- "json2dsv": "bin/json2dsv.js",
- "json2tsv": "bin/json2dsv.js",
- "tsv2csv": "bin/dsv2dsv.js",
- "tsv2json": "bin/dsv2json.js"
- },
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/d3-ease": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz",
- "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==",
- "license": "BSD-3-Clause",
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/d3-fetch": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz",
- "integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==",
- "license": "ISC",
- "dependencies": {
- "d3-dsv": "1 - 3"
- },
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/d3-force": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz",
- "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==",
- "license": "ISC",
- "dependencies": {
- "d3-dispatch": "1 - 3",
- "d3-quadtree": "1 - 3",
- "d3-timer": "1 - 3"
- },
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/d3-format": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz",
- "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==",
- "license": "ISC",
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/d3-geo": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.1.tgz",
- "integrity": "sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==",
- "license": "ISC",
- "dependencies": {
- "d3-array": "2.5.0 - 3"
- },
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/d3-hierarchy": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz",
- "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==",
- "license": "ISC",
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/d3-interpolate": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz",
- "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==",
- "license": "ISC",
- "dependencies": {
- "d3-color": "1 - 3"
- },
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/d3-path": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz",
- "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==",
- "license": "ISC",
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/d3-polygon": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz",
- "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==",
- "license": "ISC",
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/d3-quadtree": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz",
- "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==",
- "license": "ISC",
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/d3-random": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz",
- "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==",
- "license": "ISC",
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/d3-scale": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz",
- "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==",
- "license": "ISC",
- "dependencies": {
- "d3-array": "2.10.0 - 3",
- "d3-format": "1 - 3",
- "d3-interpolate": "1.2.0 - 3",
- "d3-time": "2.1.1 - 3",
- "d3-time-format": "2 - 4"
- },
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/d3-scale-chromatic": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz",
- "integrity": "sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==",
- "license": "ISC",
- "dependencies": {
- "d3-color": "1 - 3",
- "d3-interpolate": "1 - 3"
- },
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/d3-selection": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz",
- "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==",
- "license": "ISC",
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/d3-shape": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz",
- "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==",
- "license": "ISC",
- "dependencies": {
- "d3-path": "^3.1.0"
- },
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/d3-time": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz",
- "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==",
- "license": "ISC",
- "dependencies": {
- "d3-array": "2 - 3"
- },
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/d3-time-format": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz",
- "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==",
- "license": "ISC",
- "dependencies": {
- "d3-time": "1 - 3"
- },
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/d3-timer": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz",
- "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==",
- "license": "ISC",
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/d3-transition": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz",
- "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==",
- "license": "ISC",
- "dependencies": {
- "d3-color": "1 - 3",
- "d3-dispatch": "1 - 3",
- "d3-ease": "1 - 3",
- "d3-interpolate": "1 - 3",
- "d3-timer": "1 - 3"
- },
- "engines": {
- "node": ">=12"
- },
- "peerDependencies": {
- "d3-selection": "2 - 3"
- }
- },
- "node_modules/d3-zoom": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz",
- "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==",
- "license": "ISC",
- "dependencies": {
- "d3-dispatch": "1 - 3",
- "d3-drag": "2 - 3",
- "d3-interpolate": "1 - 3",
- "d3-selection": "2 - 3",
- "d3-transition": "2 - 3"
- },
- "engines": {
- "node": ">=12"
- }
- },
"node_modules/debug": {
"version": "4.4.1",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz",
@@ -3239,15 +2808,6 @@
"node": ">=8"
}
},
- "node_modules/delaunator": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.0.1.tgz",
- "integrity": "sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==",
- "license": "ISC",
- "dependencies": {
- "robust-predicates": "^3.0.2"
- }
- },
"node_modules/dequal": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz",
@@ -3817,18 +3377,6 @@
"integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==",
"license": "MIT"
},
- "node_modules/iconv-lite": {
- "version": "0.6.3",
- "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
- "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
- "license": "MIT",
- "dependencies": {
- "safer-buffer": ">= 2.1.2 < 3.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
"node_modules/ignore": {
"version": "5.3.2",
"resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
@@ -3865,15 +3413,6 @@
"node": ">=0.8.19"
}
},
- "node_modules/internmap": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz",
- "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==",
- "license": "ISC",
- "engines": {
- "node": ">=12"
- }
- },
"node_modules/is-arrayish": {
"version": "0.2.1",
"resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
@@ -3964,11 +3503,6 @@
"dev": true,
"license": "ISC"
},
- "node_modules/js-big-integer": {
- "version": "3.0.26",
- "resolved": "https://registry.npmjs.org/js-big-integer/-/js-big-integer-3.0.26.tgz",
- "integrity": "sha512-+UhYeZAZYehN52VNRL0p7LNm/WKA3jKoXfDqRSTU931HxPM7U32jqq5URGD/3b4hHk+N3ZDdnbSwGr3CPBBEyQ=="
- },
"node_modules/js-tokens": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
@@ -4450,11 +3984,6 @@
"node": ">=18"
}
},
- "node_modules/pollardsrho": {
- "version": "1.0.9",
- "resolved": "https://registry.npmjs.org/pollardsrho/-/pollardsrho-1.0.9.tgz",
- "integrity": "sha512-+I2kgzhZM59J+yWft/5aDT0JHkr+h6i1LeXsOluCal9bI4Ke9pdH/r+nvZeBK3JTSPFvv7fw6XU37NkKkF7HOw=="
- },
"node_modules/postcss": {
"version": "8.5.6",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz",
@@ -4584,14 +4113,6 @@
"node": ">=18.0.0"
}
},
- "node_modules/quadraticsievefactorization": {
- "version": "1.0.78",
- "resolved": "https://registry.npmjs.org/quadraticsievefactorization/-/quadraticsievefactorization-1.0.78.tgz",
- "integrity": "sha512-L0nLnLg4zGFGuZyy4lAyw+WPUFFaN3ttuBDqw1NuCP8av/q84M2fdPBExOszXxc3Yr+SmbvmcgWHxGo8NKPGzw==",
- "dependencies": {
- "pollardsrho": "^1.0.5"
- }
- },
"node_modules/react": {
"version": "19.1.1",
"resolved": "https://registry.npmjs.org/react/-/react-19.1.1.tgz",
@@ -4684,12 +4205,6 @@
"node": ">=4"
}
},
- "node_modules/robust-predicates": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.2.tgz",
- "integrity": "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==",
- "license": "Unlicense"
- },
"node_modules/rollup": {
"version": "4.48.1",
"resolved": "https://registry.npmjs.org/rollup/-/rollup-4.48.1.tgz",
@@ -4771,30 +4286,12 @@
"node": ">= 12"
}
},
- "node_modules/rw": {
- "version": "1.3.3",
- "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz",
- "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==",
- "license": "BSD-3-Clause"
- },
- "node_modules/safer-buffer": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
- "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
- "license": "MIT"
- },
"node_modules/scheduler": {
"version": "0.26.0",
"resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz",
"integrity": "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==",
"license": "MIT"
},
- "node_modules/seedrandom": {
- "version": "3.0.5",
- "resolved": "https://registry.npmjs.org/seedrandom/-/seedrandom-3.0.5.tgz",
- "integrity": "sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg==",
- "license": "MIT"
- },
"node_modules/semver": {
"version": "6.3.1",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
@@ -5153,13 +4650,8 @@
}
},
"node_modules/visiojs": {
- "version": "0.0.7",
- "resolved": "https://registry.npmjs.org/visiojs/-/visiojs-0.0.7.tgz",
- "integrity": "sha512-h/bk6bs0UWmCszTqt+5UjlQnJcTkj84AJNfqgk5xoAg6SlwGBcCh3PU/jA7hYsmhBD676EzPRepljeMkVkLxvQ==",
- "license": "MIT",
- "dependencies": {
- "d3": "^7.9.0"
- }
+ "resolved": "../visiojs/package",
+ "link": true
},
"node_modules/vite": {
"version": "7.1.12",
diff --git a/package.json b/package.json
index 5a05983..94d83d9 100644
--- a/package.json
+++ b/package.json
@@ -25,7 +25,7 @@
"pyodide": "^0.28.2",
"react": "^19.1.1",
"react-dom": "^19.1.1",
- "visiojs": "^0.0.7"
+ "visiojs": "file:/Users/will-personal/Documents/visiojs/package"
},
"devDependencies": {
"@eslint/js": "^9.34.0",
diff --git a/src/App.jsx b/src/App.jsx
index ca7f1fb..ea6dc81 100644
--- a/src/App.jsx
+++ b/src/App.jsx
@@ -10,6 +10,7 @@ import { FreqAdjusters } from "./FreqAdjusters.jsx";
// import Grid from "@mui/material/Grid";
import { units, formatMathML } from "./common.js";
import { calcBilinear, new_calculate_tf } from "./new_solveMNA.js";
+import { buildComponentValuesForSympy } from "./sympyValues.js";
import { NavBar } from "./NavBar.jsx";
import { ChoseTF } from "./ChoseTF.jsx";
@@ -25,18 +26,19 @@ import SnackbarContent from "@mui/material/SnackbarContent";
import Button from "@mui/material/Button";
import Grid from "@mui/material/Grid";
+/** Shape indices in initialSchematic: inductor 3, resistor 4, capacitor 5 */
const initialComponents = {
- L0: {
+ 3: {
type: "inductor",
value: 1,
unit: "uH",
},
- R0: {
+ 4: {
type: "resistor",
value: 10,
unit: "KΩ",
},
- C0: {
+ 5: {
type: "capacitor",
value: 10,
unit: "fF",
@@ -66,8 +68,13 @@ function stateFromURL() {
if (componentsParam) {
urlContainsState = true; // Set the flag if components are present in the URL
modifiedComponents = componentsParam.split("__").reduce((acc, comp) => {
- const [key, type, value, unit] = comp.split("_");
- acc[key] = { type, value: parseFloat(value), unit };
+ const parts = comp.split("_");
+ if (parts.length < 4) return acc;
+ const id = parts[0];
+ const type = parts[1];
+ const value = parts[2];
+ const unit = parts.slice(3).join("_");
+ acc[id] = { type, value: parseFloat(value), unit };
return acc;
}, {});
// setComponentValues(componentsArray);
@@ -98,9 +105,12 @@ function compToURL(key, value) {
}
function App() {
+ const schematicRef = useRef(null);
const [nodes, setNodes] = useState([]);
const [fullyConnectedComponents, setFullyConnectedComponents] = useState({});
+ /** All placed shapes with connectors (from createNodeMap), including off the vin subgraph — used for names & duplicate-value UI */
+ const [schematicComponents, setSchematicComponents] = useState({});
const [results, setResults] = useState({ text: "", mathML: "", complexResponse: "", solver: null, probeName: "", drivers: [] });
const [numericResults, setNumericResults] = useState({ numericML: "", numericText: "" });
const [bilinearResults, setBilinearResults] = useState({ bilinearML: "", bilinearText: "" });
@@ -191,8 +201,8 @@ function App() {
);
}
- const componentValuesSolved = {};
- for (const key in componentValues) componentValuesSolved[key] = componentValues[key].value * units[componentValues[key].type][componentValues[key].unit];
+ // Numeric values keyed by SymPy symbol name for algebraic/numeric TF (canonical row per shared name)
+ const componentValuesSolved = buildComponentValuesForSympy(componentValues, schematicComponents);
const [freq_new, setFreqNew] = useState(null);
const [mag_new, setMagNew] = useState(null);
@@ -217,8 +227,7 @@ function App() {
return;
}
const fRange = { fmin: settings.fmin * units.frequency[settings.fminUnit], fmax: settings.fmax * units.frequency[settings.fmaxUnit] };
- const componentValuesSolved2 = {};
- for (const key in componentValues) componentValuesSolved2[key] = componentValues[key].value * units[componentValues[key].type][componentValues[key].unit];
+ const componentValuesSolved2 = buildComponentValuesForSympy(componentValues, schematicComponents);
const { freq_new, mag_new, phase_new, numericML, numericText } = await new_calculate_tf(
results.solver,
fRange,
@@ -243,7 +252,7 @@ function App() {
clearTimeout(debounceTimerRef.current);
}
};
- }, [results, settings, componentValues]);
+ }, [results, settings, componentValues, schematicComponents]);
function stateToURL() {
const url = new URL(window.location.href);
@@ -302,16 +311,18 @@ function App() {
diff --git a/src/ChoseTF.jsx b/src/ChoseTF.jsx
index cf89da2..6fc4132 100644
--- a/src/ChoseTF.jsx
+++ b/src/ChoseTF.jsx
@@ -7,6 +7,12 @@ import CircularProgress from "@mui/material/CircularProgress";
import { initPyodideAndSympy } from "./pyodideLoader";
import { emptyResults, formatMathML } from "./common.js"; // Import the emptyResults object
+function probeFractionLabel(fcc, p) {
+ if (!p.includes("-")) return fcc[p]?.sympyName ?? p;
+ const [a, b] = p.split("-");
+ return `${fcc[a]?.sympyName ?? a}-${fcc[b]?.sympyName ?? b}`;
+}
+
export function ChoseTF({ setResults, nodes, fullyConnectedComponents, componentValuesSolved, setUnsolveSnackbar }) {
const [loading, setLoading] = useState(false);
const [calculating, setCalculating] = useState(false);
@@ -47,13 +53,8 @@ export function ChoseTF({ setResults, nodes, fullyConnectedComponents, component
probes.push(`${vprobes[1]}-${vprobes[0]}`);
}
- // add a value field based on if user chose algebraic or numeric
- const valueForAlgebra = {};
- for (const c in fullyConnectedComponents) {
- if (c in componentValuesSolved) valueForAlgebra[c] = componentValuesSolved[c];
- // else valueForAlgebra[c] = c;
- }
- // console.log("componentValuesSolved", componentValuesSolved, fullyConnectedComponents, algebraic);
+ // componentValuesSolved is keyed by SymPy symbol; passed through to build_and_solve_mna / subs
+ // console.log("componentValuesSolved", componentValuesSolved, fullyConnectedComponents);
return (
{drivers.length == 0 || probes.length == 0 ? (
@@ -68,6 +69,7 @@ export function ChoseTF({ setResults, nodes, fullyConnectedComponents, component
{probes.map((p) => {
const int_probes = p.includes("-") ? p.split("-") : [p];
+ const label = probeFractionLabel(fullyConnectedComponents, p);
return (
@@ -80,23 +82,21 @@ export function ChoseTF({ setResults, nodes, fullyConnectedComponents, component
sx={{ py: 1, justifyContent: "center", fontSize: "1.4em" }}
onClick={async () => {
setCalculating(true);
- setResults({ ...emptyResults }); // Reset results to empty
- //this console log is for collecting data for testing
- // console.log(nodes.length, int_probes, fullyConnectedComponents, valueForAlgebra, loadedPyo);
- const [textResult, mathml] = await build_and_solve_mna(nodes.length, int_probes, fullyConnectedComponents, valueForAlgebra, loadedPyo);
+ setResults({ ...emptyResults });
+ const [textResult, mathml] = await build_and_solve_mna(nodes.length, int_probes, fullyConnectedComponents, componentValuesSolved, loadedPyo);
if (textResult === "" && mathml === "") {
setUnsolveSnackbar((x) => {
if (!x) return true;
else return x;
});
}
- const editedMathMl = formatMathML(mathml, p, drivers);
+ const editedMathMl = formatMathML(mathml, label, drivers);
setResults({
text: textResult,
mathML: editedMathMl,
complexResponse: "",
solver: loadedPyo,
- probeName: p,
+ probeName: label,
drivers: drivers,
});
setCalculating(false);
@@ -110,7 +110,7 @@ export function ChoseTF({ setResults, nodes, fullyConnectedComponents, component
) : (